using Flaro.Core.Library; namespace Flaro.Core.Tests; public class FilmNamenTests { [TestCase("The Matrix (1999).mkv", "The Matrix", 1999)] [TestCase("The.Matrix.1999.1080p.BluRay.x264-GROUP.mkv", "The Matrix", 1999)] [TestCase("The Matrix 1999 2160p UHD BluRay REMUX HDR.mkv", "The Matrix", 1999)] [TestCase("Der.Untergang.2004.German.1080p.BluRay.x264-ENCOUNTERS.mkv", "Der Untergang", 2004)] [TestCase("Das Boot (1981) [1080p].mp4", "Das Boot", 1981)] [TestCase("Inception.2010.EXTENDED.1080p.BluRay.DTS-HD.MA.5.1.x264.mkv", "Inception", 2010)] [TestCase("Spirited Away.m4v", "Spirited Away", null)] [TestCase("Männer.die.auf.Ziegen.starren.2009.German.DL.1080p.mkv", "Männer die auf Ziegen starren", 2009)] public void Titel_und_Jahr_werden_erkannt(string datei, string titel, int? jahr) { var name = FileNames.ParseMovie(datei); Assert.That(name.Title, Is.EqualTo(titel)); Assert.That(name.Year, Is.EqualTo(jahr)); } /// Eine Zahl im Titel ist kein Jahr. /// /// /// Der Fall, an dem sich die Regel entscheidet. „2049" sähe wie ein /// Jahr aus; es liegt nur weit in der Zukunft. Ohne diese Grenze hiesse der /// Film „Blade Runner", erschienen 2049 — und keine Metadatenquelle der /// Welt findet ihn so. /// [TestCase("Blade Runner 2049 (2017).mkv", "Blade Runner 2049", 2017)] [TestCase("Blade.Runner.2049.2017.1080p.mkv", "Blade Runner 2049", 2017)] [TestCase("2012 (2009).mkv", "2012", 2009)] [TestCase("1917 (2019).mkv", "1917", 2019)] [TestCase("300 (2006).mkv", "300", 2006)] public void Zahlen_im_Titel_werden_nicht_fuer_Jahre_gehalten(string datei, string titel, int jahr) { var name = FileNames.ParseMovie(datei); Assert.That(name.Title, Is.EqualTo(titel)); Assert.That(name.Year, Is.EqualTo(jahr)); } /// Wer von Hand benennt, meint seine Punkte so. [Test] public void Punkte_in_einem_von_Hand_benannten_Titel_bleiben_stehen() { Assert.That(FileNames.ParseMovie("S.W.A.T. (2003).mkv").Title, Is.EqualTo("S.W.A.T.")); Assert.That(FileNames.ParseMovie("Wall-E (2008).mkv").Title, Is.EqualTo("Wall-E")); } [Test] public void Ohne_erkennbares_Muster_bleibt_der_Dateiname_stehen() { // Lieber ein unschöner Titel als ein leerer: so ist der Film wenigstens // zu finden und von Hand zu berichtigen. Assert.That(FileNames.ParseMovie("irgendwas.mkv").Title, Is.EqualTo("irgendwas")); Assert.That(FileNames.ParseMovie("1080p.mkv").Title, Is.EqualTo("1080p")); } } public class FolgenNamenTests { [TestCase("Notruf.Hafenkante.S01E01.German.1080p.WEB-DL.x264-GRP.mkv", "Notruf Hafenkante", 1, 1)] [TestCase("Notruf Hafenkante - S01E01 - Der Fall.mkv", "Notruf Hafenkante", 1, 1)] [TestCase("Breaking Bad S05E14 Ozymandias.mkv", "Breaking Bad", 5, 14)] [TestCase("The.Wire.s02e05.1080p.mkv", "The Wire", 2, 5)] [TestCase("Dark - 1x03 - Gestern und heute.mkv", "Dark", 1, 3)] [TestCase("Tatort.01x09.mkv", "Tatort", 1, 9)] [TestCase("Show S1E2.mkv", "Show", 1, 2)] [TestCase("Serie.S01.E07.1080p.mkv", "Serie", 1, 7)] public void Serie_Staffel_und_Folge_werden_erkannt(string datei, string serie, int staffel, int folge) { var name = FileNames.ParseEpisode(datei); Assert.That(name, Is.Not.Null, $"„{datei}“ wurde gar nicht als Folge erkannt"); Assert.That(name!.SeriesTitle, Is.EqualTo(serie)); Assert.That(name.Season, Is.EqualTo(staffel)); Assert.That(name.Episode, Is.EqualTo(folge)); } [Test] public void Der_Folgentitel_wird_mitgenommen_wenn_einer_dasteht() { var name = FileNames.ParseEpisode("Notruf Hafenkante - S01E01 - Der Fall.mkv"); Assert.That(name!.EpisodeTitle, Is.EqualTo("Der Fall")); } [Test] public void Technik_hinter_der_Nummer_ist_kein_Folgentitel() { var name = FileNames.ParseEpisode("Breaking.Bad.S05E14.1080p.BluRay.x264-GRP.mkv"); Assert.That(name!.EpisodeTitle, Is.Null); } /// Doppelfolgen zählen ab der ersten. [Test] public void Eine_Doppelfolge_wird_der_ersten_Nummer_zugeordnet() { var name = FileNames.ParseEpisode("Serie.S02E05E06.mkv"); Assert.That(name!.Season, Is.EqualTo(2)); Assert.That(name.Episode, Is.EqualTo(5)); } /// Ohne Nummer wird nichts geraten. /// /// /// Eine erfundene Staffel 1 wäre schlimmer als gar keine Angabe: der Titel /// landete unter einer Serie, zu der er nicht gehört, und niemand fände ihn /// dort je wieder. /// [TestCase("The Matrix (1999).mkv")] [TestCase("Irgendein Film.mkv")] [TestCase("Dokumentation ueber 1999.mkv")] public void Ohne_Folgennummer_gibt_es_keine_Folge(string datei) { Assert.That(FileNames.ParseEpisode(datei), Is.Null); } /// Eine Auflösung ist keine Folgennummer. [Test] public void Die_Aufloesung_wird_nicht_fuer_eine_Folge_gehalten() { // „1920x1080" sähe in der Kreuzschreibweise wie Staffel 1920 aus. Assert.That(FileNames.ParseEpisode("Film.1920x1080.mkv"), Is.Null); } } public class MedienDateienTests { [TestCase("film.mkv", true)] [TestCase("film.MP4", true)] [TestCase("film.m2ts", true)] [TestCase("film.nfo", false)] [TestCase("film.srt", false)] [TestCase("poster.jpg", false)] [TestCase("Thumbs.db", false)] [TestCase(".DS_Store", false)] [TestCase(".versteckt.mkv", false)] public void Nur_Videodateien_zaehlen(string name, bool erwartet) { Assert.That(MediaExtensions.IsVideo(name), Is.EqualTo(erwartet)); } /// Ein laufender Download ist noch kein Film. /// /// /// Ihn aufzunehmen hiesse: ein Titel erscheint, verschwindet wieder, und /// wer ihn dazwischen antippt, sieht einen Film, der mittendrin abbricht. /// [TestCase("film.mkv.part")] [TestCase("film.mkv.!qb")] [TestCase("film.mkv.crdownload")] public void Unfertige_Dateien_zaehlen_nicht(string name) { Assert.That(MediaExtensions.IsVideo(name), Is.False); } /// @eaDir enthält Kopien jeder Datei — mitscannen verdoppelt die Mediathek. [TestCase("@eaDir", true)] [TestCase("#recycle", true)] [TestCase(".git", true)] [TestCase("Extras", true)] [TestCase("Season 01", false)] [TestCase("Filme", false)] public void Bestimmte_Ordner_werden_uebersprungen(string name, bool erwartet) { Assert.That(MediaExtensions.IsSkippedDirectory(name), Is.EqualTo(erwartet)); } } /// Woher der Serienname kommt, wenn der Dateiname ihn nicht nennt. /// /// /// Der Fall, der aus einer Serie siebenhundert machte. Heisst eine /// Datei nur „S01E01.mkv", steht vor der Folgennummer nichts — und bis dahin /// wurde der ganze Dateiname zum Serientitel. Zwanzig Folgen ergaben zwanzig /// Serien namens „S01E01", „S01E02", und so weiter. /// public class SerieAusOrdnerTests { [TestCase("Dark/Staffel 1/S01E01.mkv", "Dark")] [TestCase("Dark/Season 2/S02E05.mkv", "Dark")] [TestCase("Doctor Who (2005)/Staffel 12/S12E04.mkv", "Doctor Who")] [TestCase("Serien/Dark/S01E01.mkv", "Dark")] [TestCase("Dark/Specials/S00E01.mkv", "Dark")] public void Ohne_Namen_in_der_Datei_gilt_der_Ordner(string pfad, string erwartet) => Assert.That(FileNames.ParseEpisode(pfad)?.SeriesTitle, Is.EqualTo(erwartet)); /// Steht er im Dateinamen, hat er Vorrang — er ist genauer. [Test] public void Der_Dateiname_sticht_den_Ordner() => Assert.That(FileNames.ParseEpisode("Irgendwas/Staffel 1/Dark - S01E01 - Geheimnisse.mkv")?.SeriesTitle, Is.EqualTo("Dark")); [Test] public void Staffel_und_Folge_bleiben_richtig() { var name = FileNames.ParseEpisode("Dark/Staffel 2/S02E05.mkv"); Assert.That(name!.Season, Is.EqualTo(2)); Assert.That(name.Episode, Is.EqualTo(5)); } }