import 'dotenv/config'; import { getDb } from '../lib/database.js'; import { create } from 'xmlbuilder2'; import fs from 'fs/promises'; import log4js from '../lib/logger.js'; const logger = log4js.getLogger('nzb'); async function createNzb(fileId) { const db = await getDb(); const file = await db.get('SELECT * FROM files WHERE id = ?', fileId); if (!file) { logger.error(`File with ID ${fileId} not found.`); return; } logger.info(`Creating NZB for file: ${file.filename}`); const messageIds = JSON.parse(file.message_ids); const root = create({ version: '1.0', encoding: 'UTF-8' }) .dtd({ pubID: '-//newzBin//DTD NZB 1.1//EN', sysID: 'http://www.newzbin.com/DTD/nzb/nzb-1.1.dtd' }) .ele('nzb', { xmlns: 'http://www.newzbin.com/DTD/2003/nzb' }); const nzbFile = root.ele('file', { poster: file.poster, date: file.date, subject: file.filename, }); const groups = nzbFile.ele('groups'); // This should be dynamic in a real application groups.ele('group').txt('alt.binaries.test'); const segments = nzbFile.ele('segments'); for (let i = 1; i <= file.parts; i++) { const segment = messageIds[i]; segments.ele('segment', { 'bytes': segment.size.toString(), 'number': i.toString() }).txt(segment.id); } const xml = root.end({ prettyPrint: true }); const nzbFilename = `${file.filename}.nzb`; await fs.writeFile(nzbFilename, xml); logger.info(`NZB file created: ${nzbFilename}`); } const fileId = parseInt(process.argv[2], 10); if (isNaN(fileId)) { logger.error('Please provide a valid file ID as a command-line argument.'); process.exit(1); } createNzb(fileId);