From 854839b16a995c6bb30f17f6045dbd46bb97cf25 Mon Sep 17 00:00:00 2001 From: MasutaYunikon Date: Sat, 11 Apr 2026 11:43:31 +0200 Subject: [PATCH] fix: ajout des series non disponible pour pouvoir les add manuellement --- server/gitlab-map.ts | 22 ++++++++++++++++++++ server/index.ts | 43 ++++++++++++++++++++++++++------------- server/organize-worker.ts | 20 ++---------------- 3 files changed, 53 insertions(+), 32 deletions(-) create mode 100644 server/gitlab-map.ts diff --git a/server/gitlab-map.ts b/server/gitlab-map.ts new file mode 100644 index 0000000..e1bfb1c --- /dev/null +++ b/server/gitlab-map.ts @@ -0,0 +1,22 @@ +/** + * gitlab-map.ts + * ============= + * Map des titres API → titres GitLab pour le téléchargement des NFO. + * Partagé entre organize-worker.ts et index.ts. + */ + +export const SERIE_TITLE_GITLAB_MAP: Record = { + 'Enfer Et Paradis Henshū' : 'Enfer et Paradis Henshū', + 'Hajime No Ippo Henshū' : 'Hajime no Ippo Henshū', + 'Hikaru No Go Henshū' : 'Hikaru no Go Henshū', + 'Hokuto No Ken Kaï' : 'Hokuto no Ken Kaï', + 'Kaguya-sama : Love is War Henshū' : 'Kaguya-sama - Love is War Henshū', + 'Kenshin le Vagabond Henshū' : 'Kenshin le vagabond Henshū', + 'Kuroko No Basket Henshū' : 'Kuroko no Basket Henshū', + 'Shingeki No Kyojin Henshū' : 'Shingeki no Kyojin Henshū', + 'Tower Of God Henshū' : 'Tower of God Henshū', +} + +export function getGitlabTitle(title: string): string { + return SERIE_TITLE_GITLAB_MAP[title] ?? title +} \ No newline at end of file diff --git a/server/index.ts b/server/index.ts index 6680408..33e5dca 100644 --- a/server/index.ts +++ b/server/index.ts @@ -19,6 +19,7 @@ import { organizeTorrent, autoOrganizeAll, scanMediaPath, workerRunning } from ' import { logger, readLogs, clearLogs, logsFileSize } from './logger.js' import { DATA_DIR, BASE_DIR } from './config.js' import { systemInfo } from './system.js' +import { getGitlabTitle } from './gitlab-map.js' registerDriver(qbittorrentDriver) registerDriver(transmissionDriver) @@ -635,6 +636,34 @@ app.post('/api/manual-import', requireAuth, async (req, res) => { } } fs.writeFileSync(ORGANIZED_PATH, JSON.stringify(organized, null, 2), 'utf-8') + + // Télécharger les NFO en arrière-plan si activé + if (nfoSupport && done.length > 0) { + const gitlabTitle = getGitlabTitle(serieTitle) + ;(async () => { + try { + let files: any[] = [], page = 1 + while (true) { + const batch = await fetch(`${GITLAB_API_NFO}/tree?path=${encodeURIComponent('pack/' + gitlabTitle)}&recursive=true&per_page=100&page=${page}&ref=main`, { headers: { 'User-Agent': 'fankarr' } }).then(r => r.ok ? r.json() : []) + if (!Array.isArray(batch) || batch.length === 0) break + files.push(...batch); if (batch.length < 100) break; page++ + } + for (const entry of files.filter((f: any) => f.type === 'blob')) { + const rel = entry.path.replace(`pack/${gitlabTitle}/`, '') + const dest = path.join(mediaPath, serieTitle, rel) + if (fs.existsSync(dest)) continue + const raw = await fetch(`${GITLAB_RAW_NFO}/${encodeURIComponent(gitlabTitle)}/${rel.split('/').map(encodeURIComponent).join('/')}`, { headers: { 'User-Agent': 'fankarr' } }) + if (!raw.ok) continue + fs.mkdirSync(path.dirname(dest), { recursive: true }) + fs.writeFileSync(dest, Buffer.from(await raw.arrayBuffer())) + } + logger.info('api', `NFO téléchargés pour "${gitlabTitle}" (import manuel)`) + } catch (err) { + logger.warn('api', `Échec téléchargement NFO pour "${gitlabTitle}" : ${err instanceof Error ? err.message : err}`) + } + })() + } + res.json({ ok: true, done: done.length, errors }) }) @@ -704,20 +733,6 @@ const NFO_COMMITS_PATH = path.join(DATA_DIR, 'nfo_commits.json') const GITLAB_API_NFO = 'https://gitlab.com/api/v4/projects/ElPouki%2Ffankai_pack/repository' const GITLAB_RAW_NFO = 'https://gitlab.com/ElPouki/fankai_pack/-/raw/main/pack' -const SERIE_TITLE_GITLAB_MAP: Record = { - 'Enfer Et Paradis Henshū' : 'Enfer et Paradis Henshū', - 'Hajime No Ippo Henshū' : 'Hajime no Ippo Henshū', - 'Hikaru No Go Henshū' : 'Hikaru no Go Henshū', - 'Hokuto No Ken Kaï' : 'Hokuto no Ken Kaï', - 'Kaguya-sama : Love is War Henshū' : 'Kaguya-sama - Love is War Henshū', - 'Kenshin le Vagabond Henshū' : 'Kenshin le vagabond Henshū', - 'Kuroko No Basket Henshū' : 'Kuroko no Basket Henshū', - 'Shingeki No Kyojin Henshū' : 'Shingeki no Kyojin Henshū', - 'Tower Of God Henshū' : 'Tower of God Henshū', -} - -function getGitlabTitle(title: string): string { return SERIE_TITLE_GITLAB_MAP[title] ?? title } - function loadNfoCommits(): Record { try { if (!fs.existsSync(NFO_COMMITS_PATH)) return {}; return JSON.parse(fs.readFileSync(NFO_COMMITS_PATH, 'utf-8')) } catch { return {} } diff --git a/server/organize-worker.ts b/server/organize-worker.ts index 24bf475..3e93ced 100644 --- a/server/organize-worker.ts +++ b/server/organize-worker.ts @@ -9,6 +9,7 @@ import fsp from 'fs/promises' import path from 'path' import { parentPort } from 'worker_threads' import { DATA_DIR } from './config.js' +import { getGitlabTitle } from './gitlab-map.js' const ORGANIZED_PATH = path.join(DATA_DIR, 'organized.json') @@ -170,23 +171,6 @@ function isInExcludedFolder(filePath: string[]): boolean { return false } -// ─── Map titres API → GitLab ────────────────────────────────── -const SERIE_TITLE_GITLAB_MAP: Record = { - 'Enfer Et Paradis Henshū' : 'Enfer et Paradis Henshū', - 'Hajime No Ippo Henshū' : 'Hajime no Ippo Henshū', - 'Hikaru No Go Henshū' : 'Hikaru no Go Henshū', - 'Hokuto No Ken Kaï' : 'Hokuto no Ken Kaï', - 'Kaguya-sama : Love is War Henshū' : 'Kaguya-sama - Love is War Henshū', - 'Kenshin le Vagabond Henshū' : 'Kenshin le vagabond Henshū', - 'Kuroko No Basket Henshū' : 'Kuroko no Basket Henshū', - 'Shingeki No Kyojin Henshū' : 'Shingeki no Kyojin Henshū', - 'Tower Of God Henshū' : 'Tower of God Henshū', -} - -function getGitlabSerieTitle(serieTitle: string): string { - return SERIE_TITLE_GITLAB_MAP[serieTitle] ?? serieTitle -} - // ─── GitLab NFO downloader ──────────────────────────────────── const GITLAB_API = 'https://gitlab.com/api/v4/projects/ElPouki%2Ffankai_pack/repository' const GITLAB_RAW_BASE = 'https://gitlab.com/ElPouki/fankai_pack/-/raw/main/pack' @@ -206,7 +190,7 @@ async function fetchBinary(url: string): Promise { } async function downloadGitlabFolder(serieTitle: string, destRoot: string): Promise { - const gitlabTitle = getGitlabSerieTitle(serieTitle) + const gitlabTitle = getGitlabTitle(serieTitle) const folderPath = `pack/${gitlabTitle}` log(`Téléchargement NFO/images depuis GitLab pour "${gitlabTitle}"`)