Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
894a621e85 | ||
|
|
23dbf86e70 | ||
|
|
d86138ef1c | ||
|
|
4aa6f99676 |
No files matched your search
@@ -1,5 +1,12 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
|
## [2.1.2](https://github.com/Masutayunikon/FanKarr/compare/v2.1.1...v2.1.2) (2026-03-23)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* path now work on every device ([cfc3440](https://github.com/Masutayunikon/FanKarr/commit/cfc3440a95cb73802778e01d5f256f473e0cc952))
|
||||||
|
|
||||||
## [2.1.1](https://github.com/Masutayunikon/FanKarr/compare/v2.1.0...v2.1.1) (2026-03-23)
|
## [2.1.1](https://github.com/Masutayunikon/FanKarr/compare/v2.1.0...v2.1.1) (2026-03-23)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+2
-2
@@ -206,9 +206,9 @@ function buildResolvedEpisodes(sd: any, hash: string, seasonFilter?: number): an
|
|||||||
let filePath: string | null = null
|
let filePath: string | null = null
|
||||||
for (const p of paths) {
|
for (const p of paths) {
|
||||||
if (typeof p === 'string') {
|
if (typeof p === 'string') {
|
||||||
if (!filePath) filePath = p // legacy fallback
|
if (!filePath) filePath = p.replace(/\\/g, '/') // legacy fallback
|
||||||
} else if (p?.infohash?.toLowerCase() === h) {
|
} else if (p?.infohash?.toLowerCase() === h) {
|
||||||
filePath = p.path
|
filePath = p.path.replace(/\\/g, '/')
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -80,7 +80,7 @@ function findTorrentByHash(hash: string, seriesData: any[]): { torrent: any; ser
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Construit la map filename → { season_number, original_filename, fullPath }
|
// Construit la map filename → { season_number, original_filename, fullPath }
|
||||||
// en matchant par infohash dans ep.paths[]
|
// Supporte les deux formats : { infohash, path } et string (legacy)
|
||||||
function buildFileMap(
|
function buildFileMap(
|
||||||
serieData : any,
|
serieData : any,
|
||||||
hash : string,
|
hash : string,
|
||||||
@@ -92,14 +92,25 @@ function buildFileMap(
|
|||||||
for (const season of serieData.seasons ?? []) {
|
for (const season of serieData.seasons ?? []) {
|
||||||
if (seasonFilter !== undefined && season.season_number !== seasonFilter) continue
|
if (seasonFilter !== undefined && season.season_number !== seasonFilter) continue
|
||||||
for (const ep of season.episodes ?? []) {
|
for (const ep of season.episodes ?? []) {
|
||||||
const match = (ep.paths ?? []).find((p: any) => p.infohash?.toLowerCase() === h)
|
const paths: any[] = ep.paths ?? []
|
||||||
if (!match) continue
|
let matchedPath: string | null = null
|
||||||
const filename = match.path.split('/').pop() ?? match.path
|
|
||||||
|
for (const p of paths) {
|
||||||
|
if (typeof p === 'string') {
|
||||||
|
if (!matchedPath) matchedPath = p.replace(/\\/g, '/')
|
||||||
|
} else if (p?.infohash?.toLowerCase() === h) {
|
||||||
|
matchedPath = p.path.replace(/\\/g, '/')
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!matchedPath) continue
|
||||||
|
const filename = matchedPath.split('/').pop() ?? matchedPath
|
||||||
const original = ep.original_filename ?? filename
|
const original = ep.original_filename ?? filename
|
||||||
map.set(filename, {
|
map.set(filename, {
|
||||||
season_number : season.season_number,
|
season_number : season.season_number,
|
||||||
original_filename: original,
|
original_filename: original,
|
||||||
fullPath : match.path,
|
fullPath : matchedPath,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -224,8 +235,12 @@ async function organizeTorrent(hash: string, name: string, savePath: string, ser
|
|||||||
if (torrent._episode) {
|
if (torrent._episode) {
|
||||||
const ep = torrent._episode
|
const ep = torrent._episode
|
||||||
const season = torrent._season
|
const season = torrent._season
|
||||||
const match = (ep.paths ?? []).find((p: any) => p.infohash?.toLowerCase() === hash.toLowerCase())
|
const paths: any[] = ep.paths ?? []
|
||||||
const filePath = match?.path ?? null
|
let filePath: string | null = null
|
||||||
|
for (const p of paths) {
|
||||||
|
if (typeof p === 'string') { if (!filePath) filePath = p.replace(/\\/g, '/') }
|
||||||
|
else if (p?.infohash?.toLowerCase() === hash.toLowerCase()) { filePath = p.path.replace(/\\/g, '/'); break }
|
||||||
|
}
|
||||||
const filename = filePath?.split('/').pop() ?? name
|
const filename = filePath?.split('/').pop() ?? name
|
||||||
const original = ep.original_filename ?? filename
|
const original = ep.original_filename ?? filename
|
||||||
const destDir = path.join(mediaPath, serieTitle, seasonFolder(season.season_number ?? 1))
|
const destDir = path.join(mediaPath, serieTitle, seasonFolder(season.season_number ?? 1))
|
||||||
|
|||||||
+5
-1
@@ -54,9 +54,13 @@ export async function scanMediaPath(
|
|||||||
for (const season of sd.seasons ?? []) {
|
for (const season of sd.seasons ?? []) {
|
||||||
for (const ep of season.episodes ?? []) {
|
for (const ep of season.episodes ?? []) {
|
||||||
for (const p of ep.paths ?? []) {
|
for (const p of ep.paths ?? []) {
|
||||||
|
if (typeof p === 'string') {
|
||||||
|
// Legacy : pas d'infohash disponible, on skip pour le scan
|
||||||
|
continue
|
||||||
|
}
|
||||||
const hash = p.infohash?.toLowerCase()
|
const hash = p.infohash?.toLowerCase()
|
||||||
if (!hash || !p.path) continue
|
if (!hash || !p.path) continue
|
||||||
const filename = p.path.split('/').pop()
|
const filename = p.path.replace(/\\/g, '/').split('/').pop()
|
||||||
if (filename) filenameIndex.set(filename, hash)
|
if (filename) filenameIndex.set(filename, hash)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in new issue
Block a user