Compare commits

..

5 commits

Author SHA1 Message Date
22f8e0e767
bump version 2023-12-02 15:57:20 +09:00
16eb73bfdb
fixed error: ENAMETOOLONG: name too long 2023-12-02 15:56:24 +09:00
bbcd9edb49
remove unused import 2023-12-02 15:47:41 +09:00
f6d411e996
fixed mem leak 2023-12-02 15:42:53 +09:00
e1da7c92d7
update deps 2023-12-02 15:40:14 +09:00
5 changed files with 50 additions and 59 deletions

View file

@ -3,7 +3,7 @@
## Usage ## Usage
``` ```
$ npx playwright install --with-deps chromium $ npx playwright@1.40.1 install --with-deps chromium
$ npx https://git.fogtype.com/nebel/gadl/archive/main.tar.gz --help $ npx https://git.fogtype.com/nebel/gadl/archive/main.tar.gz --help
``` ```

View file

@ -72,19 +72,25 @@ on conflict(reader_url)
return books; return books;
}, },
async archive(path: string, outDir: string, book: Book) { async archive(
path: string,
book: Book,
opts: {
outDir: string;
outAuthorsLimit: number;
},
) {
const bookDir = await fs.stat(path); const bookDir = await fs.stat(path);
if (!bookDir.isDirectory()) { if (!bookDir.isDirectory()) {
throw new Error(`Not found: ${path}`); throw new Error(`Not found: ${path}`);
} }
const title = `${book.authors.join("、")}${book.title}`.replace( const title = `${book.authors
/[/]/g, .slice(0, opts.outAuthorsLimit)
"%2F", .join("、")}${book.title}`.replace(/[/]/g, "%2F");
);
const out = createWriteStream(`${outDir}/${title}.cbz`); const out = createWriteStream(`${opts.outDir}/${title}.cbz`);
const zip = new Zip(function cb(err, data, final) { const zip = new Zip(function cb(err, data, final) {
if (err) { if (err) {

17
main.ts
View file

@ -1,4 +1,3 @@
import fs from "node:fs/promises";
import util from "node:util"; import util from "node:util";
import { chromium } from "./browser"; import { chromium } from "./browser";
import { createDatabase } from "./database"; import { createDatabase } from "./database";
@ -14,6 +13,10 @@ const options = {
type: "string", type: "string",
default: "dist", default: "dist",
}, },
"out-authors-limit": {
type: "string",
default: "3",
},
login: { login: {
type: "boolean", type: "boolean",
async run() { async run() {
@ -103,8 +106,6 @@ const options = {
async run() { async run() {
const db = await createDatabase(args.values.db!); const db = await createDatabase(args.values.db!);
const library = createLibrary(db); const library = createLibrary(db);
const browser = await chromium.launch();
const platform = createPlatform({ db, browser });
const books: Array<Book> = []; const books: Array<Book> = [];
if (args.values.download === "all") { if (args.values.download === "all") {
@ -124,12 +125,16 @@ const options = {
} }
for (const book of books) { for (const book of books) {
const browser = await chromium.launch();
const platform = createPlatform({ db, browser });
const dir = `${args.values["out-dir"]!}/${book.id}`; const dir = `${args.values["out-dir"]!}/${book.id}`;
await platform.download(dir, book); await platform.download(dir, book);
await library.archive(dir, args.values["out-dir"]!, book); await library.archive(dir, book, {
} outDir: args.values["out-dir"]!,
outAuthorsLimit: Number(args.values["out-authors-limit"]!),
});
await browser.close(); await browser.close();
}
}, },
}, },
json: { json: {

64
package-lock.json generated
View file

@ -1,25 +1,25 @@
{ {
"name": "@fogtype/gadl", "name": "@fogtype/gadl",
"version": "0.0.0", "version": "0.1.0",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "@fogtype/gadl", "name": "@fogtype/gadl",
"version": "0.0.0", "version": "0.1.0",
"license": "AGPL-3.0", "license": "AGPL-3.0",
"dependencies": { "dependencies": {
"fflate": "^0.8.1", "fflate": "^0.8.1",
"playwright": "^1.39.0", "playwright": "^1.40.1",
"sqlite": "^5.1.1", "sqlite": "^5.1.1",
"sqlite3": "^5.1.6", "sqlite3": "^5.1.6",
"tsx": "^3.14.0" "tsx": "^4.6.1"
}, },
"bin": { "bin": {
"gadl": "bin/run.js" "gadl": "bin/run.js"
}, },
"devDependencies": { "devDependencies": {
"@types/node": "^20.8.10" "@types/node": "^20.10.2"
} }
}, },
"node_modules/@esbuild/android-arm": { "node_modules/@esbuild/android-arm": {
@ -411,9 +411,9 @@
} }
}, },
"node_modules/@types/node": { "node_modules/@types/node": {
"version": "20.8.10", "version": "20.10.2",
"resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.10.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.2.tgz",
"integrity": "sha512-TlgT8JntpcbmKUFzjhsyhGfP2fsiz1Mv56im6enJ905xG1DAYesxJaeSbGqQmAw8OWPdhyJGhGSQGKRNJ45u9w==", "integrity": "sha512-37MXfxkb0vuIlRKHNxwCkb60PNBpR94u4efQuN4JgIAm66zfCDXGSAFCef9XUWFovX2R1ok6Z7MHhtdVXXkkIw==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"undici-types": "~5.26.4" "undici-types": "~5.26.4"
@ -499,11 +499,6 @@
"concat-map": "0.0.1" "concat-map": "0.0.1"
} }
}, },
"node_modules/buffer-from": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
"integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="
},
"node_modules/cacache": { "node_modules/cacache": {
"version": "15.3.0", "version": "15.3.0",
"resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz",
@ -1217,11 +1212,11 @@
} }
}, },
"node_modules/playwright": { "node_modules/playwright": {
"version": "1.39.0", "version": "1.40.1",
"resolved": "https://registry.npmjs.org/playwright/-/playwright-1.39.0.tgz", "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.40.1.tgz",
"integrity": "sha512-naE5QT11uC/Oiq0BwZ50gDmy8c8WLPRTEWuSSFVG2egBka/1qMoSqYQcROMT9zLwJ86oPofcTH2jBY/5wWOgIw==", "integrity": "sha512-2eHI7IioIpQ0bS1Ovg/HszsN/XKNwEG1kbzSDDmADpclKc7CyqkHw7Mg2JCz/bbCxg25QUPcjksoMW7JcIFQmw==",
"dependencies": { "dependencies": {
"playwright-core": "1.39.0" "playwright-core": "1.40.1"
}, },
"bin": { "bin": {
"playwright": "cli.js" "playwright": "cli.js"
@ -1234,9 +1229,9 @@
} }
}, },
"node_modules/playwright-core": { "node_modules/playwright-core": {
"version": "1.39.0", "version": "1.40.1",
"resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.39.0.tgz", "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.40.1.tgz",
"integrity": "sha512-+k4pdZgs1qiM+OUkSjx96YiKsXsmb59evFoqv8SKO067qBA+Z2s/dCzJij/ZhdQcs2zlTAgRKfeiiLm8PQ2qvw==", "integrity": "sha512-+hkOycxPiV534c4HhpfX6yrlawqVUzITRKwHAmYfmsVreltEl6fAZJ3DPfLMOODw0H3s1Itd6MDCWmP1fl/QvQ==",
"bin": { "bin": {
"playwright-core": "cli.js" "playwright-core": "cli.js"
}, },
@ -1394,23 +1389,6 @@
"node": ">= 10" "node": ">= 10"
} }
}, },
"node_modules/source-map": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/source-map-support": {
"version": "0.5.21",
"resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
"integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
"dependencies": {
"buffer-from": "^1.0.0",
"source-map": "^0.6.0"
}
},
"node_modules/sqlite": { "node_modules/sqlite": {
"version": "5.1.1", "version": "5.1.1",
"resolved": "https://registry.npmjs.org/sqlite/-/sqlite-5.1.1.tgz", "resolved": "https://registry.npmjs.org/sqlite/-/sqlite-5.1.1.tgz",
@ -1512,17 +1490,19 @@
"integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="
}, },
"node_modules/tsx": { "node_modules/tsx": {
"version": "3.14.0", "version": "4.6.1",
"resolved": "https://registry.npmjs.org/tsx/-/tsx-3.14.0.tgz", "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.6.1.tgz",
"integrity": "sha512-xHtFaKtHxM9LOklMmJdI3BEnQq/D5F73Of2E1GDrITi9sgoVkvIsrQUTY1G8FlmGtA+awCI4EBlTRRYxkL2sRg==", "integrity": "sha512-OQ4TAPHXAPUo/NZAmmIybl0o8LFOTlycQxFepLBAp6EV87U88fOKYGCQI2viGAEOVU9UW/cgQcxcOMnfEKVY3Q==",
"dependencies": { "dependencies": {
"esbuild": "~0.18.20", "esbuild": "~0.18.20",
"get-tsconfig": "^4.7.2", "get-tsconfig": "^4.7.2"
"source-map-support": "^0.5.21"
}, },
"bin": { "bin": {
"tsx": "dist/cli.mjs" "tsx": "dist/cli.mjs"
}, },
"engines": {
"node": ">=18.0.0"
},
"optionalDependencies": { "optionalDependencies": {
"fsevents": "~2.3.3" "fsevents": "~2.3.3"
} }

View file

@ -1,17 +1,17 @@
{ {
"name": "@fogtype/gadl", "name": "@fogtype/gadl",
"version": "0.0.1", "version": "0.1.0",
"license": "AGPL-3.0", "license": "AGPL-3.0",
"type": "module", "type": "module",
"bin": "bin/run.js", "bin": "bin/run.js",
"dependencies": { "dependencies": {
"fflate": "^0.8.1", "fflate": "^0.8.1",
"playwright": "^1.39.0", "playwright": "^1.40.1",
"sqlite": "^5.1.1", "sqlite": "^5.1.1",
"sqlite3": "^5.1.6", "sqlite3": "^5.1.6",
"tsx": "^3.14.0" "tsx": "^4.6.1"
}, },
"devDependencies": { "devDependencies": {
"@types/node": "^20.8.10" "@types/node": "^20.10.2"
} }
} }