diff --git a/packages/meta-fuse-core/src/vfs/RenamingRule.ts b/packages/meta-fuse-core/src/vfs/RenamingRule.ts index c4a73ce..37acfc4 100644 --- a/packages/meta-fuse-core/src/vfs/RenamingRule.ts +++ b/packages/meta-fuse-core/src/vfs/RenamingRule.ts @@ -62,7 +62,8 @@ export function renamingRule(metadata: Partial, filepath?: string): s // Get title - try various fields // The display name — never the `titles/*` name set (METADATA_KEYS.md §3). - const title = metadata.title || metadata.originalTitle; + // `parsedTitle` is filename-parser's guess (claims model, D12): last resort. + const title = metadata.title || metadata.originalTitle || (metadata as { parsedTitle?: string }).parsedTitle; if (!title) { if (metadata.fileType !== 'torrent') { // Don't warn for torrent files because they don't always have a title diff --git a/packages/meta-fuse-core/src/vfs/VirtualFileSystem.ts b/packages/meta-fuse-core/src/vfs/VirtualFileSystem.ts index bc414a0..92a40d1 100644 --- a/packages/meta-fuse-core/src/vfs/VirtualFileSystem.ts +++ b/packages/meta-fuse-core/src/vfs/VirtualFileSystem.ts @@ -436,6 +436,7 @@ export class VirtualFileSystem implements VFSUpdateCallback { * Compute virtual path for a file using template rules */ private computeVirtualPath(metadata: FileMetadata, sourcePath: string): string { + metadata = withParsedTitleFallback(metadata); if (!this.rulesConfig) { // Fallback to old behavior return this.metaDataToFolderStruct.generateSingleVirtualPath(sourcePath, metadata); @@ -1105,6 +1106,7 @@ export class VirtualFileSystem implements VFSUpdateCallback { rules: RenamingRule[], defaultRule?: RenamingRule ): string { + metadata = withParsedTitleFallback(metadata); // Sort rules by priority (descending) const sortedRules = [...rules] .filter(r => r.enabled) @@ -1304,3 +1306,15 @@ export class VirtualFileSystem implements VFSUpdateCallback { this.onFileComplete(hashId, metadata); } } + +/** + * filename-parser's guessed title lives under `parsedTitle` since the claims + * model (it no longer writes `originalTitle`, which tmdb also writes). The + * rules and templates fall back `title` → `originalTitle`; fill a missing + * `originalTitle` from `parsedTitle` on a copy so a file with only a parsed + * title still gets a path. The record itself is never changed. + */ +function withParsedTitleFallback(metadata: T): T { + if (metadata.originalTitle || !metadata.parsedTitle) return metadata; + return { ...metadata, originalTitle: metadata.parsedTitle }; +}