38 lines
1.4 KiB
JavaScript
38 lines
1.4 KiB
JavaScript
const QUALITY_MIN = { any: 0, '480': 480, '720': 720, '1080': 1080, '2160': 2160 };
|
|
const AUDIO_OPTIONS = ['any', 'aac', 'ac3', 'dts', 'opus', 'mp3', 'flac', 'multi'];
|
|
const SUBTITLE_OPTIONS = ['any', 'required', 'lang'];
|
|
|
|
function langCode(lang) {
|
|
return String(lang || '').toLowerCase().replace(/[^a-z]/g, '').slice(0, 2);
|
|
}
|
|
|
|
function hasSubtitleLang(streams_subtitles, wanted) {
|
|
const want = langCode(wanted);
|
|
if (!want) return true;
|
|
return streams_subtitles.some((s) => {
|
|
const code = langCode(s.language) || langCode(s.name);
|
|
return code === want;
|
|
});
|
|
}
|
|
|
|
function applyFilters(streams, filters) {
|
|
const minPixels = QUALITY_MIN[filters.minQuality] ?? 0;
|
|
return streams.filter((s) => {
|
|
if (minPixels > 0 && (s.pixels == null || s.pixels < minPixels)) return false;
|
|
if (filters.audioCodec && filters.audioCodec !== 'any' && s.audio !== filters.audioCodec) return false;
|
|
if (filters.subtitles && filters.subtitles !== 'any') {
|
|
if (s.subtitles.length === 0) return false;
|
|
if (filters.subtitles === 'lang' && filters.subtitleLang && !hasSubtitleLang(s.subtitles, filters.subtitleLang)) return false;
|
|
}
|
|
return true;
|
|
});
|
|
}
|
|
|
|
function rankStreams(streams) {
|
|
return streams
|
|
.slice()
|
|
.sort((a, b) => (b.pixels || 0) - (a.pixels || 0) || a.provider.localeCompare(b.provider));
|
|
}
|
|
|
|
module.exports = { applyFilters, rankStreams, QUALITY_MIN, AUDIO_OPTIONS, SUBTITLE_OPTIONS };
|