Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6f21b0a5cd | ||
|
|
1c36bb7688 | ||
|
|
82a9d51731 | ||
|
|
ac03aa3c11 | ||
|
|
d8173a6d72 | ||
|
|
60c9ffa14c | ||
|
|
0751c2edcc | ||
|
|
7e050a699d |
No files matched your search
@@ -1,5 +1,19 @@
|
|||||||
# Changelog
|
# 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)
|
## [2.3.1](https://github.com/Masutayunikon/FanKarr/compare/v2.3.0...v2.3.1) (2026-03-24)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+35
-13
@@ -279,16 +279,36 @@ function normalizeEpisode(ep: any): any {
|
|||||||
// Fetche /seasons/{id}/episodes pour chaque saison et injecte original_filename
|
// Fetche /seasons/{id}/episodes pour chaque saison et injecte original_filename
|
||||||
// dans chaque épisode du serieData, indexé par episode_id
|
// dans chaque épisode du serieData, indexé par episode_id
|
||||||
async function enrichSeriesDataWithOriginalFilenames(seriesData: any[]): Promise<any[]> {
|
async function enrichSeriesDataWithOriginalFilenames(seriesData: any[]): Promise<any[]> {
|
||||||
return Promise.all(seriesData.map(async (sd) => {
|
const results: any[] = []
|
||||||
if (!sd) return sd
|
|
||||||
const enrichedSeasons = await Promise.all((sd.seasons ?? []).map(async (season: any) => {
|
for (const sd of seriesData) {
|
||||||
|
if (!sd) { results.push(sd); continue }
|
||||||
|
|
||||||
|
const enrichedSeasons: any[] = []
|
||||||
|
for (const season of sd.seasons ?? []) {
|
||||||
let epsData: any[] = []
|
let epsData: any[] = []
|
||||||
try {
|
try {
|
||||||
const res = await fankaiGet(`/seasons/${season.id}/episodes`)
|
// 2 tentatives en cas d'erreur réseau ponctuelle
|
||||||
epsData = Array.isArray(res) ? res : (res.episodes ?? [])
|
let lastErr: any
|
||||||
} catch { return season }
|
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 }>()
|
const origMap = new Map<number, { original_filename: string; formatted_name: string }>()
|
||||||
for (const ep of epsData) {
|
for (const ep of epsData) {
|
||||||
if (ep.id) origMap.set(ep.id, {
|
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) => ({
|
const enrichedEpisodes = (season.episodes ?? []).map((ep: any) => ({
|
||||||
...ep,
|
...ep,
|
||||||
original_filename: origMap.get(ep.id)?.original_filename ?? null,
|
original_filename: origMap.get(ep.id)?.original_filename ?? null,
|
||||||
formatted_name : origMap.get(ep.id)?.formatted_name ?? null,
|
formatted_name : origMap.get(ep.id)?.formatted_name ?? null,
|
||||||
}))
|
}))
|
||||||
|
|
||||||
return { ...season, episodes: enrichedEpisodes }
|
enrichedSeasons.push({ ...season, episodes: enrichedEpisodes })
|
||||||
}))
|
}
|
||||||
return { ...sd, seasons: enrichedSeasons }
|
|
||||||
}))
|
results.push({ ...sd, seasons: enrichedSeasons })
|
||||||
|
}
|
||||||
|
|
||||||
|
return results
|
||||||
}
|
}
|
||||||
|
|
||||||
// Helper réutilisable : charge + enrichit toutes les seriesData du cache
|
// 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 { category } = readSettings()
|
||||||
const active = await dispatchList(category ?? 'fankai')
|
const active = await dispatchList(category ?? 'fankai')
|
||||||
for (const t of active) {
|
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 {}
|
} catch {}
|
||||||
|
|
||||||
|
|||||||
Reference in new issue
Block a user