mirror of
https://github.com/knightcrawler-stremio/knightcrawler.git
synced 2024-12-20 03:29:51 +00:00
236 lines
5.1 KiB
JavaScript
236 lines
5.1 KiB
JavaScript
import { extractProvider, parseSize, extractSize } from './titleHelper.js';
|
|
import { Type } from './types.js';
|
|
export const Providers = {
|
|
key: 'providers',
|
|
options: [
|
|
{
|
|
key: 'yts',
|
|
label: 'YTS'
|
|
},
|
|
{
|
|
key: 'eztv',
|
|
label: 'EZTV'
|
|
},
|
|
{
|
|
key: 'rarbg',
|
|
label: 'RARBG'
|
|
},
|
|
{
|
|
key: '1337x',
|
|
label: '1337x'
|
|
},
|
|
{
|
|
key: 'thepiratebay',
|
|
label: 'ThePirateBay'
|
|
},
|
|
{
|
|
key: 'kickasstorrents',
|
|
label: 'KickassTorrents'
|
|
},
|
|
{
|
|
key: 'torrentgalaxy',
|
|
label: 'TorrentGalaxy'
|
|
},
|
|
{
|
|
key: 'magnetdl',
|
|
label: 'MagnetDL'
|
|
},
|
|
{
|
|
key: 'horriblesubs',
|
|
label: 'HorribleSubs',
|
|
anime: true
|
|
},
|
|
{
|
|
key: 'nyaasi',
|
|
label: 'NyaaSi',
|
|
anime: true
|
|
},
|
|
{
|
|
key: 'tokyotosho',
|
|
label: 'TokyoTosho',
|
|
anime: true
|
|
},
|
|
{
|
|
key: 'anidex',
|
|
label: 'AniDex',
|
|
anime: true
|
|
},
|
|
{
|
|
key: 'rutor',
|
|
label: 'Rutor',
|
|
foreign: '🇷🇺'
|
|
},
|
|
{
|
|
key: 'rutracker',
|
|
label: 'Rutracker',
|
|
foreign: '🇷🇺'
|
|
},
|
|
{
|
|
key: 'comando',
|
|
label: 'Comando',
|
|
foreign: '🇵🇹'
|
|
},
|
|
{
|
|
key: 'bludv',
|
|
label: 'BluDV',
|
|
foreign: '🇵🇹'
|
|
},
|
|
{
|
|
key: 'torrent9',
|
|
label: 'Torrent9',
|
|
foreign: '🇫🇷'
|
|
},
|
|
{
|
|
key: 'mejortorrent',
|
|
label: 'MejorTorrent',
|
|
foreign: '🇪🇸'
|
|
},
|
|
{
|
|
key: 'cinecalidad',
|
|
label: 'Cinecalidad',
|
|
foreign: '🇲🇽'
|
|
},
|
|
]
|
|
};
|
|
export const QualityFilter = {
|
|
key: 'qualityfilter',
|
|
options: [
|
|
{
|
|
key: 'brremux',
|
|
label: 'BluRay REMUX',
|
|
test(quality, bingeGroup) {
|
|
return bingeGroup?.includes(this.label);
|
|
}
|
|
},
|
|
{
|
|
key: 'hdrall',
|
|
label: 'HDR/HDR10+/Dolby Vision',
|
|
items: ['HDR', 'HDR10+', 'DV'],
|
|
test(quality) {
|
|
const hdrProfiles = quality?.split(' ')?.slice(1)?.join() || '';
|
|
return this.items.some(hdrType => hdrProfiles.includes(hdrType));
|
|
}
|
|
},
|
|
{
|
|
key: 'dolbyvision',
|
|
label: 'Dolby Vision',
|
|
test(quality) {
|
|
const hdrProfiles = quality?.split(' ')?.slice(1)?.join() || '';
|
|
return hdrProfiles === 'DV';
|
|
}
|
|
},
|
|
{
|
|
key: '4k',
|
|
label: '4k',
|
|
items: ['4k'],
|
|
test(quality) {
|
|
return quality && this.items.includes(quality.split(' ')[0]);
|
|
}
|
|
},
|
|
{
|
|
key: '1080p',
|
|
label: '1080p',
|
|
items: ['1080p'],
|
|
test(quality) {
|
|
return this.items.includes(quality)
|
|
}
|
|
},
|
|
{
|
|
key: '720p',
|
|
label: '720p',
|
|
items: ['720p'],
|
|
test(quality) {
|
|
return this.items.includes(quality)
|
|
}
|
|
},
|
|
{
|
|
key: '480p',
|
|
label: '480p',
|
|
items: ['480p'],
|
|
test(quality) {
|
|
return this.items.includes(quality)
|
|
}
|
|
},
|
|
{
|
|
key: 'other',
|
|
label: 'Other (DVDRip/HDRip/BDRip...)',
|
|
// could be ['DVDRip', 'HDRip', 'BDRip', 'BRRip', 'BluRay', 'WEB-DL', 'WEBRip', 'HDTV', 'DivX', 'XviD']
|
|
items: ['4k', '1080p', '720p', '480p', 'SCR', 'CAM', 'TeleSync', 'TeleCine'],
|
|
test(quality) {
|
|
return quality && !this.items.includes(quality.split(' ')[0]);
|
|
}
|
|
},
|
|
{
|
|
key: 'scr',
|
|
label: 'Screener',
|
|
items: ['SCR'],
|
|
test(quality) {
|
|
return this.items.includes(quality)
|
|
}
|
|
},
|
|
{
|
|
key: 'cam',
|
|
label: 'Cam',
|
|
items: ['CAM', 'TeleSync', 'TeleCine'],
|
|
test(quality) {
|
|
return this.items.includes(quality)
|
|
}
|
|
},
|
|
{
|
|
key: 'unknown',
|
|
label: 'Unknown',
|
|
test(quality) {
|
|
return !quality
|
|
}
|
|
}
|
|
]
|
|
};
|
|
export const SizeFilter = {
|
|
key: 'sizefilter'
|
|
}
|
|
const defaultProviderKeys = Providers.options.map(provider => provider.key);
|
|
|
|
export default function applyFilters(streams, config) {
|
|
return [
|
|
filterByProvider,
|
|
filterByQuality,
|
|
filterBySize
|
|
].reduce((filteredStreams, filter) => filter(filteredStreams, config), streams);
|
|
}
|
|
|
|
function filterByProvider(streams, config) {
|
|
const providers = config.providers || defaultProviderKeys;
|
|
if (!providers?.length) {
|
|
return streams;
|
|
}
|
|
return streams.filter(stream => {
|
|
const provider = extractProvider(stream.title)
|
|
return providers.includes(provider);
|
|
})
|
|
}
|
|
|
|
function filterByQuality(streams, config) {
|
|
const filters = config[QualityFilter.key];
|
|
if (!filters) {
|
|
return streams;
|
|
}
|
|
const filterOptions = QualityFilter.options.filter(option => filters.includes(option.key));
|
|
return streams.filter(stream => {
|
|
const streamQuality = stream.name.split('\n')[1];
|
|
const bingeGroup = stream.behaviorHints?.bingeGroup;
|
|
return !filterOptions.some(option => option.test(streamQuality, bingeGroup));
|
|
});
|
|
}
|
|
|
|
function filterBySize(streams, config) {
|
|
const sizeFilters = config[SizeFilter.key];
|
|
if (!sizeFilters?.length) {
|
|
return streams;
|
|
}
|
|
const sizeLimit = parseSize(config.type === Type.MOVIE ? sizeFilters.shift() : sizeFilters.pop());
|
|
return streams.filter(stream => {
|
|
const size = extractSize(stream.title)
|
|
return size <= sizeLimit;
|
|
})
|
|
}
|