adds episode decomposing based on date

This commit is contained in:
TheBeastLT
2020-02-17 09:49:24 +01:00
parent 42ac44d1d9
commit 0125fc6fe5
5 changed files with 74 additions and 22 deletions

View File

@@ -7,10 +7,12 @@ const METADATA_PREFIX = `${GLOBAL_KEY_PREFIX}|metadata`;
const TORRENT_FILES_KEY_PREFIX = `stremio-tpb|files`;
const GLOBAL_TTL = process.env.METADATA_TTL || 7 * 24 * 60 * 60; // 7 days
const MEMORY_TTL = process.env.METADATA_TTL || 2 * 60 * 60; // 2 hours
const MONGO_URI = process.env.MONGODB_URI;
const cache = initiateCache();
const memoryCache = initiateMemoryCache();
const remoteCache = initiateRemoteCache();
const torrentFilesCache = initiateTorrentFilesCache();
function initiateTorrentFilesCache() {
@@ -27,7 +29,7 @@ function initiateTorrentFilesCache() {
}
}
function initiateCache() {
function initiateRemoteCache() {
if (MONGO_URI) {
return cacheManager.caching({
store: mangodbStore,
@@ -46,6 +48,13 @@ function initiateCache() {
}
}
function initiateMemoryCache() {
return cacheManager.caching({
store: 'memory',
ttl: MEMORY_TTL
});
}
function retrieveTorrentFiles(infoHash) {
return torrentFilesCache.get(`${TORRENT_FILES_KEY_PREFIX}:${infoHash}`)
.then((results) => {
@@ -56,16 +65,16 @@ function retrieveTorrentFiles(infoHash) {
});
}
function cacheWrap(key, method, options) {
function cacheWrap(cache, key, method, options) {
return cache.wrap(key, method, options);
}
function cacheWrapImdbId(key, method) {
return cacheWrap(`${IMDB_ID_PREFIX}:${key}`, method, { ttl: GLOBAL_TTL });
return cacheWrap(remoteCache, `${IMDB_ID_PREFIX}:${key}`, method, { ttl: GLOBAL_TTL });
}
function cacheWrapMetadata(id, method) {
return cacheWrap(`${METADATA_PREFIX}:${id}`, method, { ttl: GLOBAL_TTL });
return cacheWrap(memoryCache, `${METADATA_PREFIX}:${id}`, method, { ttl: GLOBAL_TTL });
}
module.exports = { cacheWrapImdbId, cacheWrapMetadata, retrieveTorrentFiles };

View File

@@ -20,6 +20,7 @@ function getMetadata(id, type = Type.SERIES) {
imdbId: body.meta.imdb_id,
title: body.meta.name,
year: body.meta.year,
country: body.meta.country,
genres: body.meta.genres,
videos: (body.meta.videos || [])
.map((video) => video.imdbSeason

View File

@@ -1,6 +1,7 @@
const moment = require('moment');
const { parse } = require('parse-torrent-title');
const { torrentFiles } = require('../lib/torrent');
const { escapeTitle, getMetadata, getImdbId } = require('../lib/metadata');
const { parse } = require('parse-torrent-title');
const { Type } = require('./types');
const MIN_SIZE = 20 * 1024 * 1024; // 20 MB
@@ -116,7 +117,7 @@ function parseSeriesFile(file, parsedTorrentName) {
}
async function decomposeEpisodes(torrent, files, metadata = { episodeCount: {} }) {
if (files.every(file => !file.episodes)) {
if (files.every(file => !file.episodes && !file.date)) {
return files;
}
// for anime type episodes are always absolute and for a single season
@@ -137,12 +138,12 @@ 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);
}
if ((files.every(file => !file.season) || files.some(file => file.season && file.episodes
} 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)))
&& (sortedEpisodes.length <= 1 || sortedEpisodes.slice(1).every((ep, i) => ep - sortedEpisodes[i] <= 2))) {
decomposeAbsoluteEpisodeFiles(torrent, files, metadata);
} else if (files.every(file => !file.season && file.date)) {
decomposeDateEpisodeFiles(torrent, files, metadata);
}
return files;
@@ -179,6 +180,39 @@ function decomposeAbsoluteEpisodeFiles(torrent, files, metadata) {
});
}
function decomposeDateEpisodeFiles(torrent, files, metadata) {
if (!metadata || !metadata.videos || !metadata.videos.length) {
return;
}
const timeZoneOffset = getTimeZoneOffset(metadata.country);
const offsetVideos = metadata.videos
.reduce((map, video) => {
const releaseDate = moment(video.released).utcOffset(timeZoneOffset).format('YYYY-MM-DD');
map[releaseDate] = video;
return map;
}, {});
files
.filter(file => file.date)
.forEach(file => {
const video = offsetVideos[file.date];
if (video) {
file.season = video.season;
file.episodes = [video.episode];
}
});
}
function getTimeZoneOffset(country) {
switch (country) {
case 'USA':
return '-08:00';
default:
return '00:00';
}
}
function assignKitsuOrImdbEpisodes(files, metadata) {
if (!metadata || !metadata.videos || !metadata.videos.length) {
return files;