Compare commits

1 Commits
Author SHA1 Message Date
ztimson 4b86fe8051 Removed outdated zims automatically
Publish Library / Build NPM Project (push) Successful in 5m35s
Publish Library / Tag Version (push) Successful in 32s
2026-09-20 10:55:02 -04:00
2 changed files with 11 additions and 6 deletions
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "@ztimson/zim-utils", "name": "@ztimson/zim-utils",
"version": "0.3.6", "version": "0.3.7",
"description": "Native, dependency-light ZIM archive reader/searcher and Kiwix catalog downloader for Node.js", "description": "Native, dependency-light ZIM archive reader/searcher and Kiwix catalog downloader for Node.js",
"author": "Zak Timson", "author": "Zak Timson",
"license": "MIT", "license": "MIT",
+9 -4
View File
@@ -24,6 +24,10 @@ export class ZimManager {
this.#server = server ?? new KiwixServer(dir, {port, host, binDir, url}); this.#server = server ?? new KiwixServer(dir, {port, host, binDir, url});
} }
#stripDate(filename) {
return filename.replace(/\.zim$/i, '').replace(/_\d{4}-\d{2}(?:_\d+)?$/, '');
}
/** The KiwixServer backing this manager - reuse it directly for content/search access, or pass into another ZimManager. */ /** The KiwixServer backing this manager - reuse it directly for content/search access, or pass into another ZimManager. */
get server() { return this.#server; } get server() { return this.#server; }
@@ -93,11 +97,12 @@ export class ZimManager {
const {url: finalUrl} = await this.#resolveUrl(href); const {url: finalUrl} = await this.#resolveUrl(href);
const filename = path.basename(new URL(finalUrl).pathname).replace(/\.meta4$/i, ''); const filename = path.basename(new URL(finalUrl).pathname).replace(/\.meta4$/i, '');
await fs.promises.mkdir(this.#dir, {recursive: true}); await fs.promises.mkdir(this.#dir, {recursive: true});
const name = filename.replace(/\.zim$/i, '').replace(/_\d{4}-\d{2}(?:_\d+)?$/, '');
const local = await this.list(); const local = await this.list();
const localMatch = local.find(l => l.name === name) ?? null; const exact = local.find(l => l.file === filename);
const catalogEntry = await zimCatalogInfo(name, this.#catalogUrl) || {name, updated: null, href: href}; if (exact && !force) return {name: exact.name ?? this.#stripDate(filename), status: 'skipped', reason: 'already downloaded', file: filename};
const name = this.#stripDate(filename);
const localMatch = local.find(l => this.#stripDate(l.file) === name) ?? null;
const catalogEntry = await zimCatalogInfo(name, this.#catalogUrl) || {name, updated: null, href};
return this.#update(name, catalogEntry, localMatch, force); return this.#update(name, catalogEntry, localMatch, force);
} }