From 01d4ecf76d96935e531cd2f9e33ac2e78e01d83b Mon Sep 17 00:00:00 2001 From: Viren070 Date: Thu, 14 Aug 2025 17:58:09 +0100 Subject: [PATCH] feat: add 'DV Only' and 'HDR Only' visual tags --- packages/core/src/main.ts | 29 +++++++------ packages/core/src/parser/regex.ts | 32 ++++----------- packages/core/src/streams/filterer.ts | 59 ++++++++++++++++----------- packages/core/src/utils/constants.ts | 5 ++- 4 files changed, 63 insertions(+), 62 deletions(-) diff --git a/packages/core/src/main.ts b/packages/core/src/main.ts index cb42aafe..129f5906 100644 --- a/packages/core/src/main.ts +++ b/packages/core/src/main.ts @@ -1189,27 +1189,26 @@ export class AIOStreams { await this.precomputer.precompute(processedStreams); } - let sortedStreams = await this.sorter.sort( - processedStreams, - id.startsWith('kitsu') ? 'anime' : type - ); - sortedStreams = sortedStreams.map((stream) => { - if (stream.parsedFile?.visualTags?.includes('HDR+DV')) { + let finalStreams = this.applyModifications( + await this.proxifier.proxify( + await this.filterer.applyStreamExpressionFilters( + await this.limiter.limit( + await this.sorter.sort( + processedStreams, + id.startsWith('kitsu') ? 'anime' : type + ) + ) + ) + ) + ).map((stream) => { + if (stream.parsedFile) { stream.parsedFile.visualTags = stream.parsedFile.visualTags.filter( - (tag) => tag !== 'HDR+DV' + (tag) => !constants.FAKE_VISUAL_TAGS.includes(tag as any) ); } return stream; }); - let finalStreams = this.applyModifications( - await this.proxifier.proxify( - await this.filterer.applyStreamExpressionFilters( - await this.limiter.limit(sortedStreams) - ) - ) - ); - if (this.userData.externalDownloads) { const streamsWithExternalDownloads: ParsedStream[] = []; for (const stream of finalStreams) { diff --git a/packages/core/src/parser/regex.ts b/packages/core/src/parser/regex.ts index 36bbab01..93c6d312 100644 --- a/packages/core/src/parser/regex.ts +++ b/packages/core/src/parser/regex.ts @@ -3,6 +3,7 @@ import { VISUAL_TAGS } from '../utils/constants'; import { ENCODES } from '../utils/constants'; import { LANGUAGES } from '../utils/constants'; import { AUDIO_CHANNELS } from '../utils/constants'; +import { FakeVisualTag } from '../utils/constants'; const createRegex = (pattern: string): RegExp => new RegExp(`(? createRegex(`${pattern}(?![ .\\-_]?sub(title)?s?)`); type PARSE_REGEX = { - resolutions: Omit, 'Unknown'> & { - Unknown?: RegExp; - }; - qualities: Omit, 'Unknown'> & { - Unknown?: RegExp; - }; + resolutions: Omit, 'Unknown'>; + qualities: Omit, 'Unknown'>; visualTags: Omit< Record<(typeof VISUAL_TAGS)[number], RegExp>, - 'Unknown' | 'HDR+DV' - > & { - Unknown?: RegExp; - 'HDR+DV'?: RegExp; - }; - audioTags: Omit, 'Unknown'> & { - Unknown?: RegExp; - }; + 'Unknown' | FakeVisualTag + >; + audioTags: Omit, 'Unknown'>; audioChannels: Omit< Record<(typeof AUDIO_CHANNELS)[number], RegExp>, 'Unknown' - > & { - Unknown?: RegExp; - }; - languages: Omit, 'Unknown'> & { - Unknown?: RegExp; - }; - encodes: Omit, 'Unknown'> & { - Unknown?: RegExp; - }; + >; + languages: Omit, 'Unknown'>; + encodes: Omit, 'Unknown'>; releaseGroup: RegExp; }; diff --git a/packages/core/src/streams/filterer.ts b/packages/core/src/streams/filterer.ts index 365fc366..130f570b 100644 --- a/packages/core/src/streams/filterer.ts +++ b/packages/core/src/streams/filterer.ts @@ -411,6 +411,36 @@ class StreamFilterer { return true; } + // Temporarily add in our fake visual tags used for sorting/filtering + // HDR+DV + if ( + file?.visualTags?.some((tag) => tag.startsWith('HDR')) && + file?.visualTags?.some((tag) => tag.startsWith('DV')) + ) { + const hdrIndex = file?.visualTags?.findIndex((tag) => + tag.startsWith('HDR') + ); + const dvIndex = file?.visualTags?.findIndex((tag) => + tag.startsWith('DV') + ); + const insertIndex = Math.min(hdrIndex, dvIndex); + file?.visualTags?.splice(insertIndex, 0, 'HDR+DV'); + } + // DV Only + if ( + file?.visualTags?.some((tag) => tag.startsWith('DV')) && + !file?.visualTags?.some((tag) => tag.startsWith('HDR')) + ) { + file?.visualTags?.push('DV Only'); + } + // HDR Only + if ( + file?.visualTags?.some((tag) => tag.startsWith('HDR')) && + !file?.visualTags?.some((tag) => tag.startsWith('DV')) + ) { + file?.visualTags?.push('HDR Only'); + } + // carry out include checks first if (this.userData.includedStreamTypes?.includes(stream.type)) { includedReasons.streamType.total++; @@ -700,22 +730,6 @@ class StreamFilterer { return false; } - // temporarily add HDR+DV to visual tags list if both HDR and DV are present - // to allow HDR+DV option in userData to work - if ( - file?.visualTags?.some((tag) => tag.startsWith('HDR')) && - file?.visualTags?.some((tag) => tag.startsWith('DV')) - ) { - const hdrIndex = file?.visualTags?.findIndex((tag) => - tag.startsWith('HDR') - ); - const dvIndex = file?.visualTags?.findIndex((tag) => - tag.startsWith('DV') - ); - const insertIndex = Math.min(hdrIndex, dvIndex); - file?.visualTags?.splice(insertIndex, 0, 'HDR+DV'); - } - if ( this.userData.excludedVisualTags?.some((tag) => (file?.visualTags.length ? file.visualTags : ['Unknown']).includes( @@ -743,14 +757,13 @@ class StreamFilterer { ) ) ) { - const tag = this.userData.requiredVisualTags.find((tag) => - (file?.visualTags.length ? file.visualTags : ['Unknown']).includes( - tag - ) - ); skipReasons.requiredVisualTag.total++; - skipReasons.requiredVisualTag.details[tag!] = - (skipReasons.requiredVisualTag.details[tag!] || 0) + 1; + skipReasons.requiredVisualTag.details[ + `${this.userData.requiredVisualTags.join(', ')}` + ] = + (skipReasons.requiredVisualTag.details[ + `${this.userData.requiredVisualTags.join(', ')}` + ] || 0) + 1; return false; } diff --git a/packages/core/src/utils/constants.ts b/packages/core/src/utils/constants.ts index b8bccb98..633fa960 100644 --- a/packages/core/src/utils/constants.ts +++ b/packages/core/src/utils/constants.ts @@ -509,8 +509,11 @@ const QUALITIES = [ 'Unknown', ] as const; +export const FAKE_VISUAL_TAGS = ['HDR+DV', 'DV Only', 'HDR Only'] as const; +export type FakeVisualTag = (typeof FAKE_VISUAL_TAGS)[number]; + const VISUAL_TAGS = [ - 'HDR+DV', + ...FAKE_VISUAL_TAGS, 'HDR10+', 'HDR10', 'DV',