WAS: - episodenUmbenennen bekommt die Dateien DIESER Disc (nurDiese) statt den ganzen Season-Ordner zu zählen. Vorher hieß es bei Disc 2 „über- sprungen: 4 Dateien, 2 Zuordnungen", sobald Disc 1 dort schon S01E01/ S01E02 abgelegt hatte — Serien-Merker und „ab Folge" liefen ins Leere. - freierName: eine vorhandene Datei gleichen Namens im Ziel wird nie ersetzt („title_t00 (2).mkv") — außer beim Wiederholen, wo die alte Fassung ausdrücklich weicht (auftrag.ersetzt). - komprimieren() lässt HandBrake auf „<name>.teil.mkv" schreiben und benennt erst die fertige Datei um; nach Abbruch oder Fehler werden die Reste (auch eine Datei daneben) entfernt. Vorher blieb eine halbe Datei unter dem endgültigen Namen liegen — ohne Arbeitsordner direkt in der Ablage, wo Jellyfin sie als kaputten Film zeigte. WARUM: Durchsicht 12.09.2026, Funde F3 und F9 — mit Tests (Season-Ordner mit Bestand, Kollision, Zwischenname, Reste). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
57 lines
3.0 KiB
TypeScript
57 lines
3.0 KiB
TypeScript
// Tests der Dateinamen in der Ablage (kern/ablage/dateinamen.ts, 5.6.0).
|
|
import { describe, expect, it } from 'vitest'
|
|
import { rollenNummern, zielDateiname } from '../src/kern/ablage/dateinamen'
|
|
|
|
describe('zielDateiname', () => {
|
|
const film = { titel: 'Akira', jahr: 1988, alsSerie: false }
|
|
it('ein Hauptfilm heißt wie der Film', () => {
|
|
expect(zielDateiname({ ...film, rolle: 'hauptfilm', nummer: 1, anzahl: 1, original: 'title_t00.mkv' })).toBe('Akira (1988).mkv')
|
|
})
|
|
it('zwei Hauptfilme werden Fassungen', () => {
|
|
expect(zielDateiname({ ...film, rolle: 'hauptfilm', nummer: 1, anzahl: 2, original: 'title_t00.mkv' })).toBe('Akira (1988) - Fassung 1.mkv')
|
|
expect(zielDateiname({ ...film, rolle: 'hauptfilm', nummer: 2, anzahl: 2, original: 'title_t01.mkv' })).toBe('Akira (1988) - Fassung 2.mkv')
|
|
})
|
|
it('Extras werden nummeriert', () => {
|
|
expect(zielDateiname({ ...film, rolle: 'extra', nummer: 3, anzahl: 5, original: 'title_t07.mkv' })).toBe('Akira (1988) - Extra 03.mkv')
|
|
})
|
|
it('die Endung bleibt, was MakeMKV schrieb', () => {
|
|
expect(zielDateiname({ ...film, rolle: 'hauptfilm', nummer: 1, anzahl: 1, original: 'x.mp4' })).toBe('Akira (1988).mp4')
|
|
})
|
|
it('ohne Jahr ohne Klammer', () => {
|
|
expect(zielDateiname({ ...film, jahr: null, rolle: 'hauptfilm', nummer: 1, anzahl: 1, original: 'a.mkv' })).toBe('Akira.mkv')
|
|
})
|
|
it('Serie: Folgen behalten den Namen (die Episoden-Zuordnung benennt später), Extras heißen nach der Serie', () => {
|
|
const serie = { titel: 'Spartacus', jahr: 2010, alsSerie: true }
|
|
expect(zielDateiname({ ...serie, rolle: 'folge', nummer: 1, anzahl: 4, original: 'title_t02.mkv' })).toBe('title_t02.mkv')
|
|
expect(zielDateiname({ ...serie, rolle: 'extra', nummer: 1, anzahl: 1, original: 'title_t09.mkv' })).toBe('Spartacus - Extra 01.mkv')
|
|
})
|
|
it('ohne erkannten Titel bleibt der MakeMKV-Name', () => {
|
|
expect(zielDateiname({ titel: '', jahr: null, alsSerie: false, rolle: 'hauptfilm', nummer: 1, anzahl: 1, original: 'title_t00.mkv' })).toBe('title_t00.mkv')
|
|
})
|
|
})
|
|
|
|
describe('rollenNummern', () => {
|
|
it('zählt je Rolle in Reihenfolge und kennt die Gesamtzahl', () => {
|
|
expect(rollenNummern(['hauptfilm', 'extra', 'extra', 'hauptfilm'])).toEqual([
|
|
[1, 2],
|
|
[1, 2],
|
|
[2, 2],
|
|
[2, 2],
|
|
])
|
|
})
|
|
})
|
|
|
|
// 5.7.0 (Durchsicht F3): nie überschreiben — ein freier Name, wo einer
|
|
// nötig ist.
|
|
describe('freierName', () => {
|
|
it('frei bleibt frei, belegt bekommt (2), (3) …', async () => {
|
|
const { freierName } = await import('../src/kern/ablage/dateinamen')
|
|
const belegt = new Set(['E:\\S\\x.mkv', 'E:\\S\\x (2).mkv'])
|
|
expect(freierName('E:\\S\\y.mkv', (p) => belegt.has(p))).toBe('E:\\S\\y.mkv')
|
|
expect(freierName('E:\\S\\x.mkv', (p) => belegt.has(p))).toBe('E:\\S\\x (3).mkv')
|
|
expect(freierName('/a/b/x.mkv', () => true).startsWith('/a/b/x (')).toBe(true)
|
|
// Ein Punkt im Ordnernamen ist keine Endung.
|
|
expect(freierName('E:\\Akira (1988)\\ohne-endung', (p) => p === 'E:\\Akira (1988)\\ohne-endung')).toBe('E:\\Akira (1988)\\ohne-endung (2)')
|
|
})
|
|
})
|