diff --git a/package.json b/package.json index 73a655f..77949bc 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "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", "author": "Zak Timson", "license": "MIT", @@ -21,4 +21,4 @@ "zstd-codec": "^0.1.5", "adm-zip": "^0.5.16" } -} \ No newline at end of file +} diff --git a/src/manager.js b/src/manager.js index 988dff5..08386b6 100644 --- a/src/manager.js +++ b/src/manager.js @@ -24,6 +24,10 @@ export class ZimManager { 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. */ get server() { return this.#server; } @@ -93,11 +97,12 @@ export class ZimManager { const {url: finalUrl} = await this.#resolveUrl(href); const filename = path.basename(new URL(finalUrl).pathname).replace(/\.meta4$/i, ''); 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 localMatch = local.find(l => l.name === name) ?? null; - const catalogEntry = await zimCatalogInfo(name, this.#catalogUrl) || {name, updated: null, href: href}; + const exact = local.find(l => l.file === filename); + 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); }