Files
eh-downloader/tasks/export_zip.ts
2023-05-25 10:15:01 +08:00

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;
}