1 Commits
Author SHA1 Message Date
Worph 985b000c24 align with metadata standard
Build and Push Docker Image / build (push) Failing after 14s
2026-09-13 15:56:54 +02:00
5 changed files with 15 additions and 16 deletions
@@ -26,7 +26,8 @@ export function renamingRule(metamesh: Local, filepath?: string): string | null
throw new Error(`No extension found for file: ${filepath}`); 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 (!title) {
if (metamesh.fileType !== "torrent") { if (metamesh.fileType !== "torrent") {
//don't warn for torrent files because they don't always have a title (eg representing a folder of files) //don't warn for torrent files because they don't always have a title (eg representing a folder of files)
@@ -85,13 +85,10 @@ export class JellyfinFormatHandler implements IMetadataFormatHandler {
if (metadata.originalTitle) jellyfinFields.originalTitle = metadata.originalTitle; if (metadata.originalTitle) jellyfinFields.originalTitle = metadata.originalTitle;
if (metadata.movieYear) jellyfinFields.year = metadata.movieYear; if (metadata.movieYear) jellyfinFields.year = metadata.movieYear;
// Titles (first title or original title) // Title: the display name. `titles/*` is an unordered name set with no
if (metadata.titles) { // preferred member, so it is never the NFO title (METADATA_KEYS.md §3).
const titleEntries = Object.entries(metadata.titles); const title = metadata.title || metadata.originalTitle;
if (titleEntries.length > 0) { if (title) jellyfinFields.title = title;
jellyfinFields.title = titleEntries[0][1];
}
}
// IDs // IDs
if (metadata.imdbid) jellyfinFields.imdbid = metadata.imdbid; if (metadata.imdbid) jellyfinFields.imdbid = metadata.imdbid;
+1 -1
View File
@@ -9,7 +9,7 @@ export interface FileMetadata {
// Filename parsing // Filename parsing
title?: string; title?: string;
titles?: string[]; titles?: Record<string, Record<string, true | string>>; // key-set: lang3 → {name: "true"}
originaltitle?: string; originaltitle?: string;
showtitle?: string; showtitle?: string;
season?: number; season?: number;
@@ -22,13 +22,13 @@ describe('MetaData', () => {
}); });
it('should set and get nested metadata using nested keys', () => { it('should set and get nested metadata using nested keys', () => {
root.at('titles').at('eng').set("Star Wars"); root.at('titles').at('eng').at('Star Wars').set(true);
root.at('titles').at('jpn').set("Staru Warsu"); root.at('titles').at('jpn').at('Staru Warsu').set(true);
expect(root.at('titles').at('eng').get()).to.equal("Star Wars"); expect(root.at('titles').at('eng').at('Star Wars').get()).to.equal(true);
expect(root.at('titles').at('jpn').get()).to.equal("Staru Warsu"); expect(root.at('titles').at('jpn').at('Staru Warsu').get()).to.equal(true);
expect(root.at('titles').get()).to.deep.equal({eng: "Star Wars", jpn: "Staru Warsu"}); expect(root.at('titles').get()).to.deep.equal({eng: {"Star Wars": true}, jpn: {"Staru Warsu": true}});
expect(root.get()).to.deep.equal({ expect(root.get()).to.deep.equal({
titles: {eng: "Star Wars", jpn: "Staru Warsu"} titles: {eng: {"Star Wars": true}, jpn: {"Staru Warsu": true}}
}); });
}); });
@@ -8,8 +8,9 @@ export interface VideoMeta {
increment?: string; increment?: string;
movieYear?: string; movieYear?: string;
videoType?: VideoType; videoType?: VideoType;
title?: string;//display title (localized); the one name to show
originalTitle?: string;//title in original language originalTitle?: string;//title in original language
titles?: LanguageData<string>;// <ISO 639-3 lang codes, title> titles?: LanguageData<Record<string, true>>;// key-set: <ISO 639-3 lang code, {name: true}> — every clean name incl. AKAs (METADATA_KEYS.md §3)
} }
export const VideoMetaFields = [ export const VideoMetaFields = [