From c7fa8e9c50f23fce5b9e63a48555b46993dca240 Mon Sep 17 00:00:00 2001 From: TheBeastLT Date: Tue, 31 Oct 2023 13:29:57 +0200 Subject: [PATCH] add video size filter to configuration options, closes #131 --- addon/lib/configuration.js | 8 +++++--- addon/lib/filter.js | 35 ++++++++++++++++++++++++++------- addon/lib/landingTemplate.js | 11 ++++++++++- addon/lib/sort.js | 38 ++++++------------------------------ addon/lib/titleHelper.js | 33 +++++++++++++++++++++++++++++++ addon/serverless.js | 2 +- 6 files changed, 83 insertions(+), 44 deletions(-) create mode 100644 addon/lib/titleHelper.js diff --git a/addon/lib/configuration.js b/addon/lib/configuration.js index 6c6f691..c9f741e 100644 --- a/addon/lib/configuration.js +++ b/addon/lib/configuration.js @@ -1,5 +1,5 @@ const { DebridOptions } = require('../moch/options'); -const { QualityFilter, Providers } = require('./filter'); +const { QualityFilter, Providers, SizeFilter } = require('./filter'); const { LanguageOptions } = require('./languages'); const PRE_CONFIGURATIONS = { @@ -26,7 +26,8 @@ const PRE_CONFIGURATIONS = { } } -const keysToSplit = [Providers.key, LanguageOptions.key, QualityFilter.key, DebridOptions.key]; +const keysToSplit = [Providers.key, LanguageOptions.key, QualityFilter.key, SizeFilter.key, DebridOptions.key]; +const keyToUppercase = [SizeFilter.key]; function parseConfiguration(configuration) { if (PRE_CONFIGURATIONS[configuration]) { @@ -42,7 +43,8 @@ function parseConfiguration(configuration) { }, {}); keysToSplit .filter(key => configValues[key]) - .filter(key => configValues[key] = configValues[key].split(',').map(provider => provider.toLowerCase())) + .forEach(key => configValues[key] = configValues[key].split(',') + .map(value => keyToUppercase.includes(key) ? value.toUpperCase() : value.toLowerCase())) return configValues; } diff --git a/addon/lib/filter.js b/addon/lib/filter.js index 159f3f7..ec67fa9 100644 --- a/addon/lib/filter.js +++ b/addon/lib/filter.js @@ -1,3 +1,5 @@ +const { extractProvider, parseSize, extractSize } = require("./titleHelper"); +const { Type } = require("./types"); const Providers = { key: 'providers', options: [ @@ -87,7 +89,7 @@ const QualityFilter = { key: 'brremux', label: 'BluRay REMUX', test(quality, bingeGroup) { - return bingeGroup && bingeGroup.includes(this.label); + return bingeGroup?.includes(this.label); } }, { @@ -95,7 +97,7 @@ const QualityFilter = { label: 'HDR/HDR10+/Dolby Vision', items: ['HDR', 'HDR10+', 'DV'], test(quality) { - const hdrProfiles = quality && quality.split(' ').slice(1).join() || ''; + const hdrProfiles = quality?.split(' ')?.slice(1)?.join() || ''; return this.items.some(hdrType => hdrProfiles.includes(hdrType)); } }, @@ -103,7 +105,7 @@ const QualityFilter = { key: 'dolbyvision', label: 'Dolby Vision', test(quality) { - const hdrProfiles = quality && quality.split(' ').slice(1).join() || ''; + const hdrProfiles = quality?.split(' ')?.slice(1)?.join() || ''; return hdrProfiles === 'DV'; } }, @@ -173,20 +175,26 @@ const QualityFilter = { } ] }; +const SizeFilter = { + key: 'sizefilter' +} const defaultProviderKeys = Providers.options.map(provider => provider.key); function applyFilters(streams, config) { - return filterByQuality(filterByProvider(streams, config), config); + return [ + filterByProvider, + filterByQuality, + filterBySize + ].reduce((filteredStreams, filter) => filter(filteredStreams, config), streams); } function filterByProvider(streams, config) { const providers = config.providers || defaultProviderKeys; - if (!providers || !providers.length) { + if (!providers?.length) { return streams; } return streams.filter(stream => { - const match = stream.title.match(/⚙.* ([^ \n]+)/); - const provider = match && match[1].toLowerCase(); + const provider = extractProvider(stream.title) return providers.includes(provider); }) } @@ -204,6 +212,19 @@ function filterByQuality(streams, config) { }); } +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; + }) +} + module.exports = applyFilters; module.exports.Providers = Providers; module.exports.QualityFilter = QualityFilter; +module.exports.SizeFilter = SizeFilter; diff --git a/addon/lib/landingTemplate.js b/addon/lib/landingTemplate.js index 2486a75..264bcdc 100644 --- a/addon/lib/landingTemplate.js +++ b/addon/lib/landingTemplate.js @@ -187,7 +187,7 @@ a.install-link { const { Providers } = require('./filter'); const { SortOptions } = require('./sort'); const { LanguageOptions } = require('./languages'); -const { QualityFilter } = require('./filter'); +const { QualityFilter, SizeFilter } = require('./filter'); const { DebridOptions } = require('../moch/options'); const { MochOptions } = require('../moch/moch'); const { PreConfigurations } = require('../lib/configuration'); @@ -197,6 +197,7 @@ function landingTemplate(manifest, config = {}) { const sort = config[SortOptions.key] || SortOptions.options.qualitySeeders.key; const languages = config[LanguageOptions.key] || []; const qualityFilters = config[QualityFilter.key] || []; + const sizeFilter = (config[SizeFilter.key] || []).join(','); const limit = config.limit || ''; const debridProvider = Object.keys(MochOptions).find(mochKey => config[mochKey]); @@ -295,6 +296,10 @@ function landingTemplate(manifest, config = {}) { + + + +