diff --git a/lib/torrent.js b/lib/torrent.js index e0bf46b..b9a82aa 100644 --- a/lib/torrent.js +++ b/lib/torrent.js @@ -35,7 +35,8 @@ module.exports.updateCurrentSeeders = function (torrent) { }; module.exports.torrentFiles = function (torrent) { - return filesFromTorrentFile(torrent) + return getFilesFromObject(torrent) + .catch(() => filesFromTorrentFile(torrent)) .catch(() => filesFromTorrentStream(torrent)) .catch(() => filesFromCache(torrent.infoHash)) .then((files) => filterVideos(files)) @@ -43,6 +44,13 @@ module.exports.torrentFiles = function (torrent) { .then((files) => filterExtras(files)); }; +function getFilesFromObject(torrent) { + if (torrent.files && torrent.files.length) { + return Promise.resolve(torrent.files); + } + return Promise.reject("No files in the object"); +} + function filesFromCache(infoHash) { return retrieveTorrentFiles(infoHash) .then((files) => files.map((file) => ({ diff --git a/lib/torrentFiles.js b/lib/torrentFiles.js index deb3eb0..a8b08e9 100644 --- a/lib/torrentFiles.js +++ b/lib/torrentFiles.js @@ -138,8 +138,9 @@ async function decomposeEpisodes(torrent, files, metadata = { episodeCount: [] } && sortedEpisodes.every(ep => metadata.episodeCount[div100(ep) - 1] >= mod100(ep)) && files.every(file => !file.season || file.episodes.every(ep => div100(ep) === file.season))) { decomposeConcatSeasonAndEpisodeFiles(torrent, files, metadata); - } else if ((files.every(file => !file.season && file.episodes) || files.some(file => file.season && file.episodes - && file.episodes.every(ep => metadata.episodeCount[file.season - 1] < ep))) + } else if ((files.filter(file => !file.isMovie && file.episodes).every(file => !file.season && file.episodes) || + files.some(file => file.season && file.episodes && file.episodes + .every(ep => metadata.episodeCount[file.season - 1] < ep))) && (sortedEpisodes.length <= 1 || sortedEpisodes.slice(1).every((ep, i) => ep - sortedEpisodes[i] <= 2))) { decomposeAbsoluteEpisodeFiles(torrent, files, metadata); } else if (files.every(file => (!file.season || !metadata.episodeCount[file.season - 1]) && file.date)) { diff --git a/manual/manual.js b/manual/manual.js index d5a9220..e505687 100644 --- a/manual/manual.js +++ b/manual/manual.js @@ -48,6 +48,30 @@ async function updateMovieCollections() { })); } +async function reapplyEpisodeDecomposing() { + const infoHash = '84fadd061f0d0bc356235b7fa6495a0f51fff311'; + const imdbId = 'tt0988824'; + const torrent = await repository.getTorrent({ infoHash }); + const storedFiles = await repository.getFiles({ infoHash }); + const fileIndexMap = storedFiles + .reduce((map, next) => (map[next.fileIndex] = (map[next.fileIndex] || []).concat(next), map), {}); + const files = Object.values(fileIndexMap) + .map(sameIndexFiles => sameIndexFiles[0]) + .map(file => ({ fileIndex: file.fileIndex, name: file.title, path: file.title, size: file.size })); + + return parseTorrentFiles({ ...torrent, imdbId, files }) + .then(newFiles => newFiles.map(file => { + const originalFile = fileIndexMap[file.fileIndex].shift(); + originalFile.imdbSeason = file.imdbSeason; + originalFile.imdbEpisode = file.imdbEpisode; + originalFile.kitsuId = file.kitsuId; + originalFile.kitsuEpisode = file.kitsuEpisode; + return originalFile; + })) + .then(updatedFiles => Promise.all(updatedFiles.map(file => file.save()))) + .then(() => console.log(`Updated files for ${torrent.title}`)); +} + async function findAllFiles() { /* Test cases */ /* Anime Season and absolute episodes */ @@ -122,5 +146,6 @@ async function findAllFiles() { } //addMissingEpisodes().then(() => console.log('Finished')); -findAllFiles().then(() => console.log('Finished')); -//updateMovieCollections().then(() => console.log('Finished')); \ No newline at end of file +//findAllFiles().then(() => console.log('Finished')); +//updateMovieCollections().then(() => console.log('Finished')); +reapplyEpisodeDecomposing().then(() => console.log('Finished')); \ No newline at end of file