mirror of
https://github.com/lifegpc/eh-downloader.git
synced 2026-06-09 07:08:47 +08:00
62 lines
1.7 KiB
TypeScript
62 lines
1.7 KiB
TypeScript
import { join } from "std/path/mod.ts";
|
|
import { Uint8ArrayReader, ZipWriter } from "zipjs/index.js";
|
|
import { EhDb } from "../db.ts";
|
|
import { addZero, asyncForEach } from "../utils.ts";
|
|
import { Config } from "../config.ts";
|
|
import { Task } from "../task.ts";
|
|
|
|
export type ExportZipConfig = {
|
|
output?: string;
|
|
};
|
|
|
|
export const DEFAULT_EXPORT_ZIP_CONFIG: ExportZipConfig = {};
|
|
|
|
export async function export_zip(
|
|
task: Task,
|
|
db: EhDb,
|
|
cfg: Config,
|
|
signal: AbortSignal,
|
|
ecfg: ExportZipConfig,
|
|
) {
|
|
const gid = task.gid;
|
|
const g = db.get_gmeta_by_gid(gid);
|
|
if (!g) throw Error("Gallery not found in database.");
|
|
const output = ecfg.output === undefined
|
|
? join(cfg.base, g.title + ".zip")
|
|
: ecfg.output;
|
|
const f = await Deno.open(output, {
|
|
create: true,
|
|
write: true,
|
|
truncate: true,
|
|
});
|
|
try {
|
|
const z = new ZipWriter(f.writable, {
|
|
signal,
|
|
level: 0,
|
|
});
|
|
const l = g.filecount.toString().length;
|
|
await asyncForEach(
|
|
db.get_pmeta(gid).sort((a, b) => a.index - b.index),
|
|
async (p) => {
|
|
const f = db.get_files(gid, p.token);
|
|
if (f.length) {
|
|
const r = await Deno.readFile(f[0].path, { signal });
|
|
await z.add(
|
|
`${addZero(p.index, l)}_${p.name}`,
|
|
new Uint8ArrayReader(r),
|
|
{ signal },
|
|
);
|
|
}
|
|
},
|
|
);
|
|
await z.close();
|
|
} finally {
|
|
try {
|
|
f.close();
|
|
} catch (_) {
|
|
null;
|
|
}
|
|
}
|
|
return task;
|
|
}
|