diff --git a/packages/meta-sort-core/src/config/RenamingRule.ts b/packages/meta-sort-core/src/config/RenamingRule.ts index 902e5a7..5b92c13 100644 --- a/packages/meta-sort-core/src/config/RenamingRule.ts +++ b/packages/meta-sort-core/src/config/RenamingRule.ts @@ -26,7 +26,8 @@ export function renamingRule(metamesh: Local, filepath?: string): string | null throw new Error(`No extension found for file: ${filepath}`); } - const title = metamesh?.titles?.eng || metamesh.originalTitle; + // The display name — never the `titles/*` name set, which has no preferred member (METADATA_KEYS.md §3). + const title = metamesh.title || metamesh.originalTitle; if (!title) { if (metamesh.fileType !== "torrent") { //don't warn for torrent files because they don't always have a title (eg representing a folder of files) diff --git a/packages/meta-sort-core/src/logic/MetadataFormatRegistry.ts b/packages/meta-sort-core/src/logic/MetadataFormatRegistry.ts index fe3af31..182c5ef 100644 --- a/packages/meta-sort-core/src/logic/MetadataFormatRegistry.ts +++ b/packages/meta-sort-core/src/logic/MetadataFormatRegistry.ts @@ -85,13 +85,10 @@ export class JellyfinFormatHandler implements IMetadataFormatHandler { if (metadata.originalTitle) jellyfinFields.originalTitle = metadata.originalTitle; if (metadata.movieYear) jellyfinFields.year = metadata.movieYear; - // Titles (first title or original title) - if (metadata.titles) { - const titleEntries = Object.entries(metadata.titles); - if (titleEntries.length > 0) { - jellyfinFields.title = titleEntries[0][1]; - } - } + // Title: the display name. `titles/*` is an unordered name set with no + // preferred member, so it is never the NFO title (METADATA_KEYS.md §3). + const title = metadata.title || metadata.originalTitle; + if (title) jellyfinFields.title = title; // IDs if (metadata.imdbid) jellyfinFields.imdbid = metadata.imdbid; diff --git a/packages/meta-sort-editor/src/types/index.ts b/packages/meta-sort-editor/src/types/index.ts index e9aa260..bdc9dfb 100644 --- a/packages/meta-sort-editor/src/types/index.ts +++ b/packages/meta-sort-editor/src/types/index.ts @@ -9,7 +9,7 @@ export interface FileMetadata { // Filename parsing title?: string; - titles?: string[]; + titles?: Record>; // key-set: lang3 → {name: "true"} originaltitle?: string; showtitle?: string; season?: number; diff --git a/packages/shared/meta-interface/src/lib/MetaData.test.ts b/packages/shared/meta-interface/src/lib/MetaData.test.ts index be04ea1..10ad413 100644 --- a/packages/shared/meta-interface/src/lib/MetaData.test.ts +++ b/packages/shared/meta-interface/src/lib/MetaData.test.ts @@ -22,13 +22,13 @@ describe('MetaData', () => { }); it('should set and get nested metadata using nested keys', () => { - root.at('titles').at('eng').set("Star Wars"); - root.at('titles').at('jpn').set("Staru Warsu"); - expect(root.at('titles').at('eng').get()).to.equal("Star Wars"); - expect(root.at('titles').at('jpn').get()).to.equal("Staru Warsu"); - expect(root.at('titles').get()).to.deep.equal({eng: "Star Wars", jpn: "Staru Warsu"}); + root.at('titles').at('eng').at('Star Wars').set(true); + root.at('titles').at('jpn').at('Staru Warsu').set(true); + expect(root.at('titles').at('eng').at('Star Wars').get()).to.equal(true); + expect(root.at('titles').at('jpn').at('Staru Warsu').get()).to.equal(true); + expect(root.at('titles').get()).to.deep.equal({eng: {"Star Wars": true}, jpn: {"Staru Warsu": true}}); expect(root.get()).to.deep.equal({ - titles: {eng: "Star Wars", jpn: "Staru Warsu"} + titles: {eng: {"Star Wars": true}, jpn: {"Staru Warsu": true}} }); }); diff --git a/packages/shared/meta-interface/src/lib/metadata-type/VideoMeta.ts b/packages/shared/meta-interface/src/lib/metadata-type/VideoMeta.ts index cb58130..d92405c 100644 --- a/packages/shared/meta-interface/src/lib/metadata-type/VideoMeta.ts +++ b/packages/shared/meta-interface/src/lib/metadata-type/VideoMeta.ts @@ -8,8 +8,9 @@ export interface VideoMeta { increment?: string; movieYear?: string; videoType?: VideoType; + title?: string;//display title (localized); the one name to show originalTitle?: string;//title in original language - titles?: LanguageData;// + titles?: LanguageData>;// key-set: — every clean name incl. AKAs (METADATA_KEYS.md §3) } export const VideoMetaFields = [