Compare commits

...
8 Commits
2 changed files with 49 additions and 13 deletions

No files matched your search

+14
View File
@@ -1,5 +1,19 @@
# Changelog
## [2.3.3](https://github.com/Masutayunikon/FanKarr/compare/v2.3.2...v2.3.3) (2026-03-24)
### Bug Fixes
* recuperation des episodes avec un delai ([dfc6c13](https://github.com/Masutayunikon/FanKarr/commit/dfc6c1300e3dd8323e422ce3e71465bac77f94cf))
## [2.3.2](https://github.com/Masutayunikon/FanKarr/compare/v2.3.1...v2.3.2) (2026-03-24)
### Bug Fixes
* badge catalogue sur les series importé ([f070f17](https://github.com/Masutayunikon/FanKarr/commit/f070f1754ef616874cfb081eb2fefadad602c221))
## [2.3.1](https://github.com/Masutayunikon/FanKarr/compare/v2.3.0...v2.3.1) (2026-03-24)
+35 -13
View File
@@ -279,16 +279,36 @@ function normalizeEpisode(ep: any): any {
// Fetche /seasons/{id}/episodes pour chaque saison et injecte original_filename
// dans chaque épisode du serieData, indexé par episode_id
async function enrichSeriesDataWithOriginalFilenames(seriesData: any[]): Promise<any[]> {
return Promise.all(seriesData.map(async (sd) => {
if (!sd) return sd
const enrichedSeasons = await Promise.all((sd.seasons ?? []).map(async (season: any) => {
const results: any[] = []
for (const sd of seriesData) {
if (!sd) { results.push(sd); continue }
const enrichedSeasons: any[] = []
for (const season of sd.seasons ?? []) {
let epsData: any[] = []
try {
const res = await fankaiGet(`/seasons/${season.id}/episodes`)
epsData = Array.isArray(res) ? res : (res.episodes ?? [])
} catch { return season }
// 2 tentatives en cas d'erreur réseau ponctuelle
let lastErr: any
for (let attempt = 0; attempt < 2; attempt++) {
try {
const res = await fankaiGet(`/seasons/${season.id}/episodes`)
epsData = Array.isArray(res) ? res : (res.episodes ?? [])
break
} catch (e) {
lastErr = e
if (attempt === 0) await new Promise(r => setTimeout(r, 500))
}
}
if (epsData.length === 0 && lastErr) throw lastErr
} catch {
enrichedSeasons.push(season)
continue
}
// Petit délai pour ne pas saturer l'API
await new Promise(r => setTimeout(r, 50))
// Index episode_id → original_filename + formatted_name
const origMap = new Map<number, { original_filename: string; formatted_name: string }>()
for (const ep of epsData) {
if (ep.id) origMap.set(ep.id, {
@@ -297,17 +317,19 @@ async function enrichSeriesDataWithOriginalFilenames(seriesData: any[]): Promise
})
}
// Injecter dans les épisodes du serieData
const enrichedEpisodes = (season.episodes ?? []).map((ep: any) => ({
...ep,
original_filename: origMap.get(ep.id)?.original_filename ?? null,
formatted_name : origMap.get(ep.id)?.formatted_name ?? null,
}))
return { ...season, episodes: enrichedEpisodes }
}))
return { ...sd, seasons: enrichedSeasons }
}))
enrichedSeasons.push({ ...season, episodes: enrichedEpisodes })
}
results.push({ ...sd, seasons: enrichedSeasons })
}
return results
}
// Helper réutilisable : charge + enrichit toutes les seriesData du cache
@@ -383,7 +405,7 @@ app.get('/api/series', requireAuth, async (_req, res) => {
const { category } = readSettings()
const active = await dispatchList(category ?? 'fankai')
for (const t of active) {
if (t.hash) activeTorrents.add(t.hash.toLowerCase())
if (t.hash && t.state === 'downloading') activeTorrents.add(t.hash.toLowerCase())
}
} catch {}