diff --git a/admin/app/services/kiwix_library_service.ts b/admin/app/services/kiwix_library_service.ts index c7aeabd..4b6de99 100644 --- a/admin/app/services/kiwix_library_service.ts +++ b/admin/app/services/kiwix_library_service.ts @@ -1,7 +1,7 @@ import { XMLBuilder, XMLParser } from 'fast-xml-parser' import { readFile, writeFile, rename, readdir } from 'fs/promises' import { join } from 'path' -import { Archive } from '@openzim/libzim' +import type { Archive as ZimArchive } from '@openzim/libzim' import { KIWIX_LIBRARY_XML_PATH, ZIM_STORAGE_PATH, ensureDirectoryExists, isValidZimFile } from '../utils/fs.js' import logger from '@adonisjs/core/services/logger' import { randomUUID } from 'node:crypto' @@ -9,6 +9,11 @@ import { randomUUID } from 'node:crypto' const CONTAINER_DATA_PATH = '/data' const XML_DECLARATION = '\n' +async function loadArchiveClass(): Promise { + const { Archive } = await import('@openzim/libzim') + return Archive +} + interface KiwixBook { id: string path: string @@ -60,7 +65,8 @@ export class KiwixLibraryService { logger.warn(`[KiwixLibraryService] Skipping invalid/corrupted ZIM file: ${zimFilePath}`) return null } - const archive = new Archive(zimFilePath) + const Archive = await loadArchiveClass() + const archive: ZimArchive = new Archive(zimFilePath) const getMeta = (key: string): string | undefined => { try { diff --git a/admin/app/services/zim_extraction_service.ts b/admin/app/services/zim_extraction_service.ts index 196add9..dc7eaab 100644 --- a/admin/app/services/zim_extraction_service.ts +++ b/admin/app/services/zim_extraction_service.ts @@ -1,4 +1,4 @@ -import { Archive, Entry } from '@openzim/libzim' +import type { Archive as ZimArchive, Entry } from '@openzim/libzim' import * as cheerio from 'cheerio' import { HTML_SELECTORS_TO_REMOVE, NON_CONTENT_HEADING_PATTERNS } from '../../constants/zim_extraction.js' import logger from '@adonisjs/core/services/logger' @@ -7,9 +7,14 @@ import { randomUUID } from 'node:crypto' import { access } from 'node:fs/promises' import { isValidZimFile } from '../utils/fs.js' +async function loadArchiveClass(): Promise { + const { Archive } = await import('@openzim/libzim') + return Archive +} + export class ZIMExtractionService { - private extractArchiveMetadata(archive: Archive): ZIMArchiveMetadata { + private extractArchiveMetadata(archive: ZimArchive): ZIMArchiveMetadata { try { return { title: archive.getMetadata('Title') || archive.getMetadata('Name') || 'Unknown', @@ -62,7 +67,8 @@ export class ZIMExtractionService { throw new Error(`ZIM file is invalid or corrupted: ${filePath}`) } - const archive = new Archive(filePath) + const Archive = await loadArchiveClass() + const archive: ZimArchive = new Archive(filePath) // Extract archive-level metadata once const archiveMetadata = this.extractArchiveMetadata(archive)