165 lines
5.9 KiB
Python
165 lines
5.9 KiB
Python
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
|
||
|
||
|
||
|