Recortes de paneles desde el lector, reescalados aparte, con galería y acceso directo a la página

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-31 15:38:12 -06:00
co-authored by Claude Opus 5.5
parent d48378aa49
commit 5d82a5e020
8 changed files with 466 additions and 12 deletions
+5 -5
View File
@@ -7,15 +7,15 @@ import path from 'node:path'
import { spawn } from 'node:child_process'
import { writeCbz, readCbzIndex, readCbzEntry } from './cbz.js'
const BIN = process.env.UPSCALER_BIN || '/opt/realesrgan/realesrgan-ncnn-vulkan'
const MODELS = process.env.UPSCALER_MODELS || path.join(path.dirname(BIN), 'models')
const MODEL = process.env.UPSCALER_MODEL || 'realesr-animevideov3'
export const BIN = process.env.UPSCALER_BIN || '/opt/realesrgan/realesrgan-ncnn-vulkan'
export const MODELS = process.env.UPSCALER_MODELS || path.join(path.dirname(BIN), 'models')
export const MODEL = process.env.UPSCALER_MODEL || 'realesr-animevideov3'
const SCALE = Number(process.env.UPSCALER_SCALE || 2)
const WEBP_QUALITY = Number(process.env.UPSCALER_QUALITY || 85)
const HD_DIR = '.hd'
const UPSCALABLE = /\.(jpe?g|png|webp)$/i // lo demás (gif, avif) se copia tal cual
function run(cmd, args, onSpawn) {
export function run(cmd, args, onSpawn) {
return new Promise((resolve, reject) => {
const p = spawn(cmd, args, { stdio: ['ignore', 'ignore', 'pipe'] })
onSpawn?.(p)
@@ -224,5 +224,5 @@ export function setupUpscale({ db, MANGA_DIR, HttpError, json, readBody, MANGA_I
if (!fs.existsSync(BIN)) console.log('HD: Real-ESRGAN no instalado, reescalado desactivado')
else if (!fs.existsSync('/dev/dri')) console.log('HD: sin /dev/dri en el contenedor, reescalado desactivado')
return { info, hdFileOf, onChapterDownloaded, cancel, route, pump }
return { info, hdFileOf, onChapterDownloaded, cancel, route, pump, available }
}