diff --git a/packages/core/src/db/schemas.ts b/packages/core/src/db/schemas.ts index c2411a62..d20dab5c 100644 --- a/packages/core/src/db/schemas.ts +++ b/packages/core/src/db/schemas.ts @@ -662,6 +662,7 @@ export const ParsedFileSchema = z.object({ upscaled: z.boolean().optional(), network: z.string().optional(), container: z.string().optional(), + extension: z.string().optional(), }); export const ParsedStreamSchema = z.object({ diff --git a/packages/core/src/formatters/base.ts b/packages/core/src/formatters/base.ts index 6db0e663..c5f782af 100644 --- a/packages/core/src/formatters/base.ts +++ b/packages/core/src/formatters/base.ts @@ -82,6 +82,7 @@ export interface ParseValue { upscaled: boolean | null; network: string | null; container: string | null; + extension: string | null; indexer: string | null; year: string | null; title: string | null; @@ -314,6 +315,7 @@ export abstract class BaseFormatter { upscaled: stream.parsedFile?.upscaled || null, network: stream.parsedFile?.network || null, container: stream.parsedFile?.container || null, + extension: stream.parsedFile?.extension || null, }, addon: { name: stream.addon?.name || null, diff --git a/packages/core/src/parser/file.ts b/packages/core/src/parser/file.ts index 6f96dd51..91f42aa2 100644 --- a/packages/core/src/parser/file.ts +++ b/packages/core/src/parser/file.ts @@ -80,6 +80,7 @@ class FileParser { upscaled: parsed.upscaled ?? false, network: parsed.network, container: parsed.container, + extension: parsed.extension, seasons: parsed.seasons, episodes: parsed.episodes, }; diff --git a/packages/core/src/parser/streams.ts b/packages/core/src/parser/streams.ts index bef5db55..0ba3cdbc 100644 --- a/packages/core/src/parser/streams.ts +++ b/packages/core/src/parser/streams.ts @@ -426,12 +426,20 @@ class StreamParser { const fileParsed = parsedStream.filename ? FileParser.parse(parsedStream.filename) : undefined; - + function arrayFallback( + arr1: T[] | undefined, + arr2: T[] | undefined + ): T[] | undefined { + return arr1?.length ? arr1 : arr2?.length ? arr2 : undefined; + } + function arrayMerge(arr1: T[] | undefined, arr2: T[] | undefined): T[] { + return Array.from(new Set([...(arr1 ?? []), ...(arr2 ?? [])])); + } return { title: folderParsed?.title || fileParsed?.title, year: fileParsed?.year || folderParsed?.year, - seasons: fileParsed?.seasons || folderParsed?.seasons, - episodes: fileParsed?.episodes || folderParsed?.episodes, + seasons: arrayFallback(fileParsed?.seasons, folderParsed?.seasons), + episodes: arrayFallback(fileParsed?.episodes, folderParsed?.episodes), resolution: fileParsed?.resolution || folderParsed?.resolution, quality: fileParsed?.quality || folderParsed?.quality, encode: fileParsed?.encode || folderParsed?.encode, @@ -444,37 +452,16 @@ class StreamParser { upscaled: fileParsed?.upscaled || folderParsed?.upscaled, network: fileParsed?.network || folderParsed?.network, container: fileParsed?.container || folderParsed?.container, - // seasonEpisode: - // fileParsed?.seasonEpisode && fileParsed?.seasonEpisode.length > 0 - // ? fileParsed?.seasonEpisode - // : folderParsed?.seasonEpisode && - // folderParsed?.seasonEpisode.length > 0 - // ? folderParsed?.seasonEpisode - // : undefined, - visualTags: Array.from( - new Set([ - ...(folderParsed?.visualTags ?? []), - ...(fileParsed?.visualTags ?? []), - ]) + extension: fileParsed?.extension || folderParsed?.extension, + visualTags: arrayMerge(folderParsed?.visualTags, fileParsed?.visualTags), + audioTags: arrayMerge(folderParsed?.audioTags, fileParsed?.audioTags), + audioChannels: arrayMerge( + folderParsed?.audioChannels, + fileParsed?.audioChannels ), - audioTags: Array.from( - new Set([ - ...(folderParsed?.audioTags ?? []), - ...(fileParsed?.audioTags ?? []), - ]) - ), - audioChannels: Array.from( - new Set([ - ...(folderParsed?.audioChannels ?? []), - ...(fileParsed?.audioChannels ?? []), - ]) - ), - languages: Array.from( - new Set([ - ...(folderParsed?.languages ?? []), - ...(fileParsed?.languages ?? []), - ...this.getLanguages(stream, parsedStream), - ]) + languages: arrayMerge( + arrayMerge(folderParsed?.languages, fileParsed?.languages), + this.getLanguages(stream, parsedStream) ), }; }