This commit is contained in:
juyua9 2026-05-20 23:39:52 +01:00 committed by GitHub
commit 0364c88b5e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 17 additions and 5 deletions

View File

@ -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 = '<?xml version="1.0" encoding="UTF-8"?>\n'
async function loadArchiveClass(): Promise<typeof import('@openzim/libzim').Archive> {
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 {

View File

@ -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<typeof import('@openzim/libzim').Archive> {
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)