movie-renamer/tests/test_parsing.py

327 lines
11 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import unittest
from renamer import parse_title
class TestParserParts(unittest.TestCase):
def test_episode_name(self):
title = "The.Walking.Dead.S04E06.Live.Bait.1080p.WEB-DL.Rus.Eng.HDCLUB"
res = parse_title(title)
self.assertEqual(["Live", "Bait"], res.get("episode_name"))
self.assertEqual(
res,
{
"episode": ["S04E06"],
"resolution": ["1080p"],
"quality": ["WEB-DL"],
"episode_name": ["Live", "Bait"],
"language": ["Rus", "Eng"],
"name": ["The", "Walking", "Dead"],
"unknown": ["HDCLUB"],
},
)
def test_episode_number(self):
title = "Vikings.S01E01.720p.BluRay.4xRus.Eng.HDCLUB"
res = parse_title(title)
self.assertIn("S01E01", res.get("episode", []))
self.assertEqual(
res,
{
"episode": ["S01E01"],
"resolution": ["720p"],
"quality": ["BluRay"],
"language": ["4xRus", "Eng"],
"name": ["Vikings"],
"unknown": ["HDCLUB"],
},
)
def test_subtitles(self):
title = "Lives.of.Others.Blu-RayRip.720p.RusDTS.GerAC3.EngSub"
res = parse_title(title)
self.assertIn("EngSub", res.get("subtitles", []))
self.assertEqual(
res,
{
"quality": ["Blu-RayRip"],
"resolution": ["720p"],
"audio": ["RusDTS", "GerAC3"],
"subtitles": ["EngSub"],
"name": ["Lives", "of", "Others"],
},
)
def test_file_extension(self):
title = "The Guild s04e06 Weird Respawn (by Swich).mkv"
res = parse_title(title)
self.assertIn("mkv", res.get("file_extension", []))
self.assertEqual(
res,
{
"name": ["The", "Guild"],
"episode": ["s04e06"],
"episode_name": ["Weird", "Respawn", "by", "Swich"],
"file_extension": ["mkv"],
},
)
class TestCornerCases(unittest.TestCase):
def test_misc_separators(self):
title = "V tumane 2012 1080p BluRay DD5.1 x264-EA"
res = parse_title(title)
self.assertIn("DD5.1", res.get("audio", []))
self.assertIn("x264", res.get("codec", []))
self.assertIn("EA", res.get("unknown", []))
self.assertEqual(
res,
{
"year": ["2012"],
"resolution": ["1080p"],
"quality": ["BluRay"],
"audio": ["DD5.1"],
"codec": ["x264"],
"name": ["V", "tumane"],
"unknown": ["EA"],
},
)
def test_misc_separators_and_combine(self):
title = "The.Dawn.Patrol.1938.1080p.WEB-DL.AAC2.0.H.264-alinto"
res = parse_title(title)
self.assertIn("H.264", res.get("codec", []))
self.assertIn("alinto", res.get("unknown", []))
self.assertEqual(
res,
{
"year": ["1938"],
"resolution": ["1080p"],
"quality": ["WEB-DL"],
"audio": ["AAC2.0"],
"codec": ["H.264"],
"name": ["The", "Dawn", "Patrol"],
"unknown": ["alinto"],
},
)
@unittest.expectedFailure
def test_russian_char_in_resolution(self):
title = "Trouble.with.the.Curve.2012.1080р.BluRay.Rus.Eng.HDCLUB"
res = parse_title(title)
self.assertIn("1080p", res.get("resolution", []))
self.assertEqual(
res,
{
"year": ["2012"],
"quality": ["BluRay"],
"language": ["Rus", "Eng"],
"resolution": ["1080p"],
"name": ["Trouble", "with", "the", "Curve"],
"unknown": ["HDCLUB"],
},
)
def test_russian_name(self):
title = "Убийство (1956. The Killing)"
res = parse_title(title)
self.assertEqual(
res,
{
"year": ["1956"],
"name": ["Убийство"],
"unknown": ["The", "Killing"],
},
)
def test_only_name_goes_to_unknown(self):
title = "Белое солнце пустыни"
res = parse_title(title)
self.assertEqual(res, {"unknown": ["Белое", "солнце", "пустыни"]})
def test_hyphen_as_separated_chunk(self):
title = "Miss Pettigrew Lives for a Day. 2007. BDRip (1080p) - ylnian"
self.assertEqual(
parse_title(title),
{
"year": ["2007"],
"quality": ["BDRip"],
"resolution": ["1080p"],
"name": ["Miss", "Pettigrew", "Lives", "for", "a", "Day"],
"unknown": ["ylnian"],
},
)
def test_file_extension_does_not_go_to_unknown(self):
title = "Monsters,Inc.2001.BDRip.1080p.3xRus.Ukr.Eng.HDCLUB.mkv"
res = parse_title(title)
self.assertNotIn("mkv", res.get("unknown", []))
self.assertEqual(
res,
{
"year": ["2001"],
"quality": ["BDRip"],
"resolution": ["1080p"],
"language": ["3xRus", "Ukr", "Eng"],
"name": ["Monsters", "Inc"],
"unknown": ["HDCLUB"],
"file_extension": ["mkv"],
},
)
def test_edition_after_name(self):
title = "Logan.2017.noir.edition.BDRip.1080p.HEVC"
res = parse_title(title)
self.assertIn("noir.edition", res.get("edition", []))
self.assertIn("Logan", res.get("name", []))
self.assertEqual(
res,
{
"year": ["2017"],
"quality": ["BDRip"],
"resolution": ["1080p"],
"codec": ["HEVC"],
"edition": ["noir.edition"],
"name": ["Logan"],
},
)
def test_chunk_from_three_parts(self):
title = "Mad.Max.Road.of.Fury.Black.Chrome.edition.BDRip.1080p"
self.assertEqual(
parse_title(title),
{
"quality": ["BDRip"],
"resolution": ["1080p"],
"edition": ["Black.Chrome.edition"],
"name": ["Mad", "Max", "Road", "of", "Fury"],
},
)
@unittest.expectedFailure
def test_ampersand_in_title(self):
title = "Me.Myself.&.Irene.2000.720p.BluRay.4xRus.Ukr.Eng"
res = parse_title(title)
self.assertIn("&", res.get("name", []))
self.assertEqual(
res,
{
"year": ["2000"],
"resolution": ["720p"],
"quality": ["BluRay"],
"language": ["4xRus", "Ukr", "Eng"],
"name": ["Me", "Myself", "&", "Irene"],
},
)
def test_brackets_and_parenthesis(self):
title = "Leon.(1994).BDRip.1080p.(DVD9).[NoLimits-Team]"
res = parse_title(title)
self.assertEqual(
res,
{
"year": ["1994"],
"quality": ["BDRip", "DVD9"],
"resolution": ["1080p"],
"name": ["Leon"],
"unknown": ["NoLimits-Team"],
},
)
def test_multiple_languages(self):
title = "The.Theory.of.Everything.2014.720p.BluRay.2xRus.2xEng.HDCLUB"
res = parse_title(title)
self.assertIn("2xRus", res.get("language", []))
self.assertIn("2xEng", res.get("language", []))
self.assertEqual(
res,
{
"year": ["2014"],
"resolution": ["720p"],
"quality": ["BluRay"],
"language": ["2xRus", "2xEng"],
"name": ["The", "Theory", "of", "Everything"],
"unknown": ["HDCLUB"],
},
)
def test_strange_dot_in_name(self):
title = "WALL·E.2008.1080p.BluRay.3xRus.Ukr.Eng.HDCLUB-Skazhutin"
res = parse_title(title)
self.assertIn("WALL·E", res.get("name", []))
self.assertEqual(
res,
{
"year": ["2008"],
"resolution": ["1080p"],
"quality": ["BluRay"],
"language": ["3xRus", "Ukr", "Eng"],
"name": ["WALL·E"],
"unknown": ["HDCLUB-Skazhutin"],
},
)
def test_splitted_by_hyphens_chunk_ends_with_empty_part(self):
title = "The.IT.Crowd.S01E04.The.Red.Door.HR.DVDRip.HQ.Edition.x264-N-(Rus.Eng)"
res = parse_title(title)
self.assertEqual(
res,
{
"name": ["The", "IT", "Crowd"],
"episode": ["S01E04"],
"episode_name": ["The", "Red", "Door", "HR"],
"quality": ["DVDRip"],
"edition": ["HQ.Edition"],
"codec": ["x264"],
"unknown": ["N"],
"language": ["Rus", "Eng"],
},
)
def test_year_before_episode_number_and_name(self):
title = "The.Big.Bang.Theory.2019.S12E20.The.Decision.Reverberation.1080p.AMZN.WEB-DL.DD5.1.x264-NTb_EniaHD.mkv"
res = parse_title(title)
self.assertEqual(
res,
{
"name": ["The", "Big", "Bang", "Theory"],
"year": ["2019"],
"episode": ["S12E20"],
"episode_name": ["The", "Decision", "Reverberation"],
"unknown": ["NTb", "EniaHD"],
"resolution": ["1080p"],
"quality": ["AMZN", "WEB-DL"],
"audio": ["DD5.1"],
"codec": ["x264"],
"file_extension": ["mkv"],
},
)
def test_unknown_stripped_from_hyphens(self):
title = "The.Big.Bang.Theory.S04E06.720p.WEB-DL.eng.rus.[Kuraj-Bambey.Ru]-jhonny2.mkv"
res = parse_title(title)
self.assertIn("jhonny2", res.get("unknown", []))
self.assertEqual(
res,
{
"name": ["The", "Big", "Bang", "Theory"],
"episode": ["S04E06"],
"resolution": ["720p"],
"quality": ["WEB-DL"],
"language": ["eng", "rus"],
"unknown": ["Kuraj-Bambey", "Ru", "jhonny2"],
"file_extension": ["mkv"],
},
)
def test_episode_name_without_series_name(self):
title = "S27E01.Every Man's Dream.mkv"
res = parse_title(title)
self.assertEqual(
res,
{
"episode": ["S27E01"],
"episode_name": ["Every", "Man's", "Dream"],
"file_extension": ["mkv"],
},
)