from pathlib import Path import pytest from media_sorter.tokenizer import FilenameTokenizer @pytest.fixture def tokenizer(): return FilenameTokenizer() def test_tv_show_tokenization(tokenizer): tokens = tokenizer.tokenize(Path("Breaking.Bad.S05E14.Ozymandias.1080p.BluRay.x264-ROVERS.mkv")) assert tokens.is_episodic is True assert tokens.title == "Breaking Bad" assert tokens.season == 5 assert tokens.episode == 14 assert tokens.episode_title == "Ozymandias" assert tokens.resolution == "1080p" assert tokens.source == "BLURAY" assert tokens.video_codec == "x264" assert tokens.group == "ROVERS" def test_tv_multi_episode(tokenizer): tokens = tokenizer.tokenize(Path("Stranger.Things.S04E01-E02.Chapter.One.720p.WEB-DL.mkv")) assert tokens.is_episodic is True assert tokens.season == 4 assert tokens.episode == 1 assert tokens.multi_episodes == [1, 2] assert tokens.resolution == "720p" def test_anime_fansub_tokenization(tokenizer): tokens = tokenizer.tokenize(Path("[SubsPlease] Frieren - Beyond Journey's End - 01 (1080p) [ABCD1234].mkv")) assert tokens.is_anime is True assert tokens.is_episodic is True assert tokens.group == "SubsPlease" assert "Frieren" in tokens.title assert tokens.episode == 1 assert tokens.season == 1 def test_movie_tokenization(tokenizer): tokens = tokenizer.tokenize(Path("Inception.2010.2160p.UHD.Remux.HEVC.TrueHD.Atmos-FraMeSToR.mkv")) assert tokens.is_episodic is False assert tokens.title == "Inception" assert tokens.year == 2010 assert tokens.resolution == "2160p" assert tokens.video_codec == "hevc" assert tokens.audio_codec == "TRUEHD" def test_music_track_tokenization(tokenizer): tokens = tokenizer.tokenize(Path("/Music/Daft Punk - Discovery/02 - One More Time.flac")) assert tokens.is_music is True assert tokens.track == 2 assert tokens.title == "One More Time" assert tokens.artist == "Daft Punk" assert tokens.album == "Discovery" def test_camera_and_date_tokenization(tokenizer): tokens = tokenizer.tokenize(Path("IMG_20240815_142301.jpg")) assert tokens.is_photo_or_home_video is True assert tokens.date_stamp == "2024-08-15" assert tokens.year == 2024 def test_podcast_tokenization(tokenizer): tokens = tokenizer.tokenize(Path("The Daily - 2026-03-12 - The Sunday Read.mp3")) assert tokens.artist == "The Daily" assert tokens.year == 2026 assert tokens.date_stamp == "2026-03-12" assert tokens.title == "The Sunday Read" def test_movie_with_dimensions_not_episodic(tokenizer): tokens = tokenizer.tokenize(Path("Interstellar.1920x1080.mkv")) assert tokens.is_episodic is False assert tokens.season is None assert tokens.episode is None assert tokens.resolution == "1080p" assert "Interstellar" in tokens.title tokens4k = tokenizer.tokenize(Path("Dune.Part.Two.3840x2160.mkv")) assert tokens4k.is_episodic is False assert tokens4k.season is None assert tokens4k.episode is None assert tokens4k.resolution == "2160p" def test_movie_bracket_group_year_not_anime(tokenizer): tokens = tokenizer.tokenize(Path("[YTS.MX] Movie Title - 2024 [1080p].mkv")) assert tokens.is_anime is False assert tokens.is_episodic is False assert tokens.year == 2024 assert tokens.title == "Movie Title" def test_standalone_episode_tokenization(tokenizer): tokens = tokenizer.tokenize(Path("Naruto Episode 207 The Supposed Sealed Ability.mkv")) assert tokens.is_episodic is True assert tokens.title == "Naruto" assert tokens.season == 1 assert tokens.episode == 207 assert tokens.episode_title == "The Supposed Sealed Ability" def test_anime_fansub_without_group_tokenization(tokenizer): tokens = tokenizer.tokenize(Path("BLEACH꞉ Sennen Kessen-hen - 27 E89717B7].mkv")) assert tokens.is_anime is True assert tokens.is_episodic is True assert "BLEACH" in tokens.title assert tokens.episode == 27 assert tokens.season == 1 def test_anime_ending_opening_tokenization(tokenizer): tokens = tokenizer.tokenize(Path("[A&C] Sword Art Online Alicization S03ED01 [BDrip 1080p] [09F0EA6C].mkv")) assert tokens.is_episodic is True assert "Sword Art Online" in tokens.title assert tokens.season == 3 assert tokens.episode == 1 def test_one_piece_tokenization_varieties(tokenizer): # 1. Anime Time release with episode title and ancestor season folder p1 = Path("One Piece (0001-1071+Movies+Specials)/Season 08 - Water Seven (229-263)/[Anime Time] One Piece - 0233 - Pirate Abduction Incident! A Pirate Ship That Can Only Await Its End! [1080p][HEVC 10bit x265][AAC].mkv") t1 = tokenizer.tokenize(p1) assert t1.title == "One Piece" assert t1.season == 8 assert t1.episode == 233 assert "Pirate Abduction" in t1.episode_title assert t1.group == "Anime Time" # 2. Adjacent episode in same folder to ensure natural order p2 = Path("One Piece (0001-1071+Movies+Specials)/Season 08 - Water Seven (229-263)/[Anime Time] One Piece - 0232 - Galley-La Company! A Grand Sight Dock 1!.mkv") t2 = tokenizer.tokenize(p2) assert t2.title == "One Piece" assert t2.season == 8 assert t2.episode == 232 # 3. 4-digit episode S01E1171 WEB-DL p3 = Path("One.Piece.S01E1171.1080p.CR.WEB-DL.AAC2.0.H.264.mkv") t3 = tokenizer.tokenize(p3) assert t3.title == "One Piece" assert t3.season == 1 assert t3.episode == 1171 # 4. HatSubs release with 4-digit episode and CRC p4 = Path("[HatSubs] One Piece 1073 (BD 1080p 10-bit Opus) v2 [194B3FBA].mkv") t4 = tokenizer.tokenize(p4) assert t4.title == "One Piece" assert t4.episode == 1073 assert t4.crc32 == "194B3FBA" # 5. Kaerizaki-Fansub underscore release p5 = Path("[Kaerizaki-Fansub]_One_Piece_1076_[VOSTFR][FHD_1920x1080].mp4") t5 = tokenizer.tokenize(p5) assert t5.title == "One Piece" assert t5.episode == 1076