feat: add 'DV Only' and 'HDR Only' visual tags

This commit is contained in:
Viren070
2025-08-14 17:58:09 +01:00
parent a564e02d19
commit 01d4ecf76d
4 changed files with 63 additions and 62 deletions
+14 -15
View File
@@ -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) {
+9 -23
View File
@@ -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(`(?<![^\\s\\[(_\\-.,])(${pattern})(?=[\\s\\)\\]_.\\-,]|$)`, 'i');
@@ -10,34 +11,19 @@ const createLanguageRegex = (pattern: string): RegExp =>
createRegex(`${pattern}(?![ .\\-_]?sub(title)?s?)`);
type PARSE_REGEX = {
resolutions: Omit<Record<(typeof RESOLUTIONS)[number], RegExp>, 'Unknown'> & {
Unknown?: RegExp;
};
qualities: Omit<Record<(typeof QUALITIES)[number], RegExp>, 'Unknown'> & {
Unknown?: RegExp;
};
resolutions: Omit<Record<(typeof RESOLUTIONS)[number], RegExp>, 'Unknown'>;
qualities: Omit<Record<(typeof QUALITIES)[number], RegExp>, 'Unknown'>;
visualTags: Omit<
Record<(typeof VISUAL_TAGS)[number], RegExp>,
'Unknown' | 'HDR+DV'
> & {
Unknown?: RegExp;
'HDR+DV'?: RegExp;
};
audioTags: Omit<Record<(typeof AUDIO_TAGS)[number], RegExp>, 'Unknown'> & {
Unknown?: RegExp;
};
'Unknown' | FakeVisualTag
>;
audioTags: Omit<Record<(typeof AUDIO_TAGS)[number], RegExp>, 'Unknown'>;
audioChannels: Omit<
Record<(typeof AUDIO_CHANNELS)[number], RegExp>,
'Unknown'
> & {
Unknown?: RegExp;
};
languages: Omit<Record<(typeof LANGUAGES)[number], RegExp>, 'Unknown'> & {
Unknown?: RegExp;
};
encodes: Omit<Record<(typeof ENCODES)[number], RegExp>, 'Unknown'> & {
Unknown?: RegExp;
};
>;
languages: Omit<Record<(typeof LANGUAGES)[number], RegExp>, 'Unknown'>;
encodes: Omit<Record<(typeof ENCODES)[number], RegExp>, 'Unknown'>;
releaseGroup: RegExp;
};
+36 -23
View File
@@ -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;
}
+4 -1
View File
@@ -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',