Skip to content

Commit

Permalink
compile more regexes beforehand
Browse files Browse the repository at this point in the history
fix wrong tests
  • Loading branch information
davidemarcoli committed Aug 2, 2024
1 parent 643ef01 commit f5758aa
Show file tree
Hide file tree
Showing 8 changed files with 81 additions and 44 deletions.
21 changes: 11 additions & 10 deletions PTT/handlers.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import regex

from PTT.parse import Parser
from PTT.transformers import array, boolean, date, integer, lowercase, none, range_func, uniq_concat, uppercase, value
from PTT.transformers import array, boolean, date, integer, lowercase, none, range_func, transform_resolution, uniq_concat, uppercase, value


def add_defaults(parser: Parser):
Expand All @@ -28,17 +28,17 @@ def add_defaults(parser: Parser):
parser.add_handler("episode_code", regex.compile(r"\[([A-Z0-9]{8})]"), uppercase, {"remove": True})

# Resolution
parser.add_handler("resolution", regex.compile(r"\[?\]?3840x\d{4}[\])?]?", regex.IGNORECASE), value("4k"), {"remove": True})
parser.add_handler("resolution", regex.compile(r"\[?\]?3840x\d{4}[\])?]?", regex.IGNORECASE), value("2160p"), {"remove": True})
parser.add_handler("resolution", regex.compile(r"\[?\]?1920x\d{3,4}[\])?]?", regex.IGNORECASE), value("1080p"), {"remove": True})
parser.add_handler("resolution", regex.compile(r"\[?\]?1280x\d{3}[\])?]?", regex.IGNORECASE), value("720p"), {"remove": True})
parser.add_handler("resolution", regex.compile(r"\[?\]?(\d{3,4}x\d{3,4})[\])?]?p?", regex.IGNORECASE), value("$1p"), {"remove": True})
parser.add_handler("resolution", regex.compile(r"(480|720|1080)0[pi]", regex.IGNORECASE), value("$1p"), {"remove": True})
parser.add_handler("resolution", regex.compile(r"(?:BD|HD|M)(2160p?|4k)"), value("4k"), {"remove": True})
parser.add_handler("resolution", regex.compile(r"(?:BD|HD|M)(2160p?|4k)"), value("2160p"), {"remove": True})
parser.add_handler("resolution", regex.compile(r"(?:BD|HD|M)1080p?"), value("1080p"), {"remove": True})
parser.add_handler("resolution", regex.compile(r"(?:BD|HD|M)720p?"), value("720p"), {"remove": True})
parser.add_handler("resolution", regex.compile(r"(?:BD|HD|M)480p?"), value("480p"), {"remove": True})
parser.add_handler("resolution", regex.compile(r"\b(?:(4k|2160p|1080p|720p|480p))4k|2160p|1080p|720p|480p\b", regex.IGNORECASE), lowercase, {"remove": True})
parser.add_handler("resolution", regex.compile(r"\b4k|21600?[pi]\b", regex.IGNORECASE), value("4k"), {"remove": True})
parser.add_handler("resolution", regex.compile(r"\b(?:(4k|2160p|1080p|720p|480p))4k|2160p|1080p|720p|480p\b", regex.IGNORECASE), transform_resolution, {"remove": True})
parser.add_handler("resolution", regex.compile(r"\b4k|21600?[pi]\b", regex.IGNORECASE), value("2160p"), {"remove": True})
# parser.add_handler("resolution", regex.compile(r"21600?[pi]", regex.IGNORECASE), value("4k"), {"skipIfAlreadyFound": False, "remove": True})
parser.add_handler("resolution", regex.compile(r"(?:^|\D)(\d{3,4})[pi]", regex.IGNORECASE), value("$1p"), {"remove": True})
parser.add_handler("resolution", regex.compile(r"(240|360|480|576|720|1080|2160|3840)[pi]", regex.IGNORECASE), lowercase, {"remove": True})
Expand Down Expand Up @@ -169,7 +169,7 @@ def handle_bit_depth(context):
parser.add_handler("codec", regex.compile(r"\b[xh][\. \-]?264\b", regex.IGNORECASE), lowercase, {"remove": True})
parser.add_handler("codec", regex.compile(r"\bHEVC10(bit)?\b|\b[xh][\. \-]?265\b", regex.IGNORECASE), value("x265"), {"remove": True})
parser.add_handler("codec", regex.compile(r"\bhevc(?:\s?10)?\b", regex.IGNORECASE), value("x265"), {"remove": True, "skipIfAlreadyFound": False})
parser.add_handler("codec", regex.compile(r"\b(?:mpe?g(\d+)?|divx|xvid|avc|av1)\b", regex.IGNORECASE), lowercase, {"remove": True, "skipIfAlreadyFound": False})
parser.add_handler("codec", regex.compile(r"\b(?:mpe?g\d*|divx|xvid|avc|av1)\b", regex.IGNORECASE), lowercase, {"remove": True, "skipIfAlreadyFound": False})

def handle_space_in_codec(context):
if context["result"].get("codec"):
Expand All @@ -188,14 +188,15 @@ def handle_space_in_codec(context):
parser.add_handler("channels", regex.compile(r"\b2\.0(?:x[2-4])\b", regex.IGNORECASE), uniq_concat(value("2.0")), {"remove": True})

# Audio
parser.add_handler("audio", regex.compile(r"\b(Dolby.?)?Atmos\b", regex.IGNORECASE), uniq_concat(lowercase), {"remove": True})
parser.add_handler("audio", regex.compile(r"\b(?:mp3|DTS(?:-HD)?|True(HD)?)\b", regex.IGNORECASE), uniq_concat(lowercase), {"remove": True})
parser.add_handler("audio", regex.compile(r"\b(Dolby.?)?Atmos\b", regex.IGNORECASE), uniq_concat(value("atmos")), {"remove": True})
parser.add_handler("audio", regex.compile(r"\b(?:DTS(?:-HD)?|True(HD)?)\b", regex.IGNORECASE), uniq_concat(value("truehd")), {"remove": True})
parser.add_handler("audio", regex.compile(r"\bFLAC(?:\+?2\.0)?(?:x[2-4])?\b", regex.IGNORECASE), uniq_concat(value("flac")), {"remove": True})
parser.add_handler("audio", regex.compile(r"\bEAC-?3(?:[. -]?[256]\.[01])?", regex.IGNORECASE), uniq_concat(value("eac3")), {"remove": True})
parser.add_handler("audio", regex.compile(r"\bAC-?3(?:[.-]5\.1|x2\.?0?)?\b", regex.IGNORECASE), uniq_concat(value("ac3")), {"remove": True})
#parser.add_handler("audio", regex.compile(r"\bAC-?3(?:[.-]5\.1|[x ]2\.?0?)?\b", regex.IGNORECASE), uniq_concat(value("ac3")), {"remove": True, "skipIfAlreadyFound": False})
parser.add_handler("audio", regex.compile(r"\bAC-?3(x2)?(?:[ .-](5\.1)?[x+]2\.?0?x?3?)?\b", regex.IGNORECASE), uniq_concat(value("ac3")), {"remove": True, "skipIfAlreadyFound": False})
parser.add_handler("audio", regex.compile(r"\b5\.1ch\b", regex.IGNORECASE), uniq_concat(value("ac3")), {"remove": True})
parser.add_handler("audio", regex.compile(r"\bDD[\+P]?5.?1\b", regex.IGNORECASE), uniq_concat(value("dd5.1")), {"remove": True})
parser.add_handler("audio", regex.compile(r"\bQ?AAC\b", regex.IGNORECASE), uniq_concat(value("aac")), {"remove": True})
parser.add_handler("audio", regex.compile(r"\bQ?Q?AAC(x?2)?\b", regex.IGNORECASE), uniq_concat(value("aac")), {"remove": True})
parser.add_handler("audio", regex.compile(r"\bHQ.?(Clean)?.?(Aud(io)?)?\b", regex.IGNORECASE), uniq_concat(value("hq audio")), {"remove": True})

# Group
Expand Down
25 changes: 17 additions & 8 deletions PTT/parse.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,13 @@
REMAINING_NOT_ALLOWED_SYMBOLS_AT_START_AND_END = regex.compile(rf"^[^\w{NON_ENGLISH_CHARS}#]+|]$")
REDUNDANT_SYMBOLS_AT_END = regex.compile(r"[ \-:./\\]+$")
EMPTY_BRACKETS_REGEX = regex.compile(r"\(\s*\)|\[\s*\]|\{\s*\}")
MOVIE_REGEX = regex.compile(r"[[(]movie[)\]]", flags=regex.IGNORECASE)
STAR_REGEX_1 = regex.compile(r"^[[【★].*[\]】★][ .]?(.+)")
STAR_REGEX_2 = regex.compile(r"(.+)[ .]?[[【★].*[\]】★]$")
MP3_REGEX = regex.compile(r"\bmp3$")
SPACING_REGEX = regex.compile(r"\s+")

BEFORE_TITLE_MATCH_REGEX = regex.compile(r"^\[([^[\]]+)]")

DEBUG_HANDLER = False

Expand Down Expand Up @@ -85,7 +92,7 @@ def handler(context: Dict[str, Any]) -> Union[Dict[str, Any], None]:
if type(transformed) is str:
transformed = transformed.strip()

before_title_match = regex.match(r"^\[([^[\]]+)]", title)
before_title_match = BEFORE_TITLE_MATCH_REGEX.match(title)
is_before_title = before_title_match is not None and raw_match in before_title_match.group(1)

other_matches = {k: v for k, v in matched.items() if k != name}
Expand All @@ -112,28 +119,30 @@ def clean_title(raw_title: str) -> str:
cleaned_title = raw_title

if " " not in cleaned_title and "." in cleaned_title:
cleaned_title = regex.sub(r"\.", " ", cleaned_title)
cleaned_title = cleaned_title.replace(".", " ")

cleaned_title = regex.sub(r"_", " ", cleaned_title)
cleaned_title = regex.sub(r"[[(]movie[)\]]", "", cleaned_title, flags=regex.IGNORECASE)
cleaned_title = cleaned_title.replace("_", " ")
cleaned_title = MOVIE_REGEX.sub("", cleaned_title)
cleaned_title = NOT_ALLOWED_SYMBOLS_AT_START_AND_END.sub("", cleaned_title)
cleaned_title = RUSSIAN_CAST_REGEX.sub("", cleaned_title)
cleaned_title = regex.sub(r"^[[【★].*[\]】★][ .]?(.+)", r"\1", cleaned_title)
cleaned_title = regex.sub(r"(.+)[ .]?[[【★].*[\]】★]$", r"\1", cleaned_title)
cleaned_title = STAR_REGEX_1.sub(r"\1", cleaned_title)
cleaned_title = STAR_REGEX_2.sub(r"\1", cleaned_title)
cleaned_title = ALT_TITLES_REGEX.sub("", cleaned_title)
cleaned_title = NOT_ONLY_NON_ENGLISH_REGEX.sub("", cleaned_title)
cleaned_title = REMAINING_NOT_ALLOWED_SYMBOLS_AT_START_AND_END.sub("", cleaned_title)
cleaned_title = EMPTY_BRACKETS_REGEX.sub("", cleaned_title)
cleaned_title = MP3_REGEX.sub("", cleaned_title)

# Remove brackets if only one is present
for open_bracket, close_bracket in BRACKETS:
if cleaned_title.count(open_bracket) != cleaned_title.count(close_bracket):
cleaned_title = cleaned_title.replace(open_bracket, "").replace(close_bracket, "")

if " " not in cleaned_title and "." in cleaned_title:
cleaned_title = regex.sub(r"\.", " ", cleaned_title)
#if " " not in cleaned_title and "." in cleaned_title:
# cleaned_title = regex.sub(r"\.", " ", cleaned_title)

cleaned_title = REDUNDANT_SYMBOLS_AT_END.sub("", cleaned_title)
cleaned_title = SPACING_REGEX.sub(" ", cleaned_title)
cleaned_title = cleaned_title.strip()
return cleaned_title

Expand Down
27 changes: 27 additions & 0 deletions PTT/transformers.py
Original file line number Diff line number Diff line change
Expand Up @@ -203,3 +203,30 @@ def inner(input_value: str, result: Optional[List[Union[str, int]]] = None) -> L
return result

return inner

def transform_resolution(input_value: str) -> str:
"""
Transform the resolution string to a standardized format.
:param input_value: The input resolution string.
:return: The standardized resolution string.
"""

input_value = lowercase(input_value)
print(input_value)

if "2160" in input_value or "4k" in input_value:
return "2160p"
if "1440" in input_value or "2k" in input_value:
return "1440p"
if "1080" in input_value:
return "1080p"
if "720" in input_value:
return "720p"
if "480" in input_value:
return "480p"
if "360" in input_value:
return "360p"
if "240" in input_value:
return "240p"
return input_value
2 changes: 1 addition & 1 deletion tests/test_anime.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

@pytest.mark.parametrize("release_name, expected", [
("Sword.Art.Online.Alternative.S01.v2.1080p.Blu-Ray.10-Bit.Dual-Audio.LPCM.x265-iAHD", {
"title": "Sword Art Online Alternative: Gun Gale Online",
"title": "Sword Art Online Alternative",
"seasons": [1],
"episodes": [],
"languages": ["dual audio"],
Expand Down
10 changes: 5 additions & 5 deletions tests/test_audio.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,14 +12,14 @@ def parser():


@pytest.mark.parametrize("release_name, expected_audio", [
("Nocturnal Animals 2016 VFF 1080p BluRay DTS HEVC-HD2", ["dts"]),
("Gold 2016 1080p BluRay DTS-HD MA 5 1 x264-HDH", ["dts-hd"]),
("Nocturnal Animals 2016 VFF 1080p BluRay DTS HEVC-HD2", ["truehd"]),
("Gold 2016 1080p BluRay DTS-HD MA 5 1 x264-HDH", ["truehd"]),
("Rain Man 1988 REMASTERED 1080p BRRip x264 AAC-m2g", ["aac"]),
("The Vet Life S02E01 Dunk-A-Doctor 1080p ANPL WEB-DL AAC2 0 H 264-RTN", ["aac"]),
("Jimmy Kimmel 2017 05 03 720p HDTV DD5 1 MPEG2-CTL", ["dd5.1"]),
("A Dog's Purpose 2016 BDRip 720p X265 Ac3-GANJAMAN", ["ac3"]),
("Retroactive 1997 BluRay 1080p AC-3 HEVC-d3g", ["ac3"]),
("Tempete 2016-TrueFRENCH-TVrip-H264-mp3", ["mp3"]),
("Tempete 2016-TrueFRENCH-TVrip-H264-mp3", None),
("Detroit.2017.BDRip.MD.GERMAN.x264-SPECTRE", None),
("The Blacklist S07E04 (1080p AMZN WEB-DL x265 HEVC 10bit EAC-3 5.1)[Bandi]", ["eac3"]),
("Condor.S01E03.1080p.WEB-DL.x265.10bit.EAC3.6.0-Qman[UTR].mkv", ["eac3"]),
Expand All @@ -28,7 +28,7 @@ def parser():
("Buttobi!! CPU - 02 (DVDRip 720x480p x265 HEVC AC3x2 2.0x2)(Dual Audio)[sxales].mkv", ["ac3"]),
("[naiyas] Fate Stay Night - Unlimited Blade Works Movie [BD 1080P HEVC10 QAACx2 Dual Audio]", ["aac"]),
("Sakura Wars the Movie (2001) (BDRip 1920x1036p x265 HEVC FLACx2, AC3 2.0+5.1x2)(Dual Audio)[sxales].mkv", ["flac", "ac3"]),
("Spider-Man.No.Way.Home.2021.2160p.BluRay.REMUX.HEVC.TrueHD.7.1.Atmos-FraMeSToR", ["Dolby Atmos"]),
("Spider-Man.No.Way.Home.2021.2160p.BluRay.REMUX.HEVC.TrueHD.7.1.Atmos-FraMeSToR", ["atmos"]),
])
def test_audio_detection(parser, release_name, expected_audio):
Expand All @@ -40,7 +40,7 @@ def test_audio_detection(parser, release_name, expected_audio):
assert "audio" not in result, f"Unexpected audio detection for {release_name}"

@pytest.mark.parametrize("release_name, expected_audio", [
("Macross ~ Do You Remember Love (1984) (BDRip 1920x1036p x265 HEVC DTS-HD MA, FLAC, AC3x2 5.1+2.0x3)(Dual Audio)[sxales].mkv", ["dts-hd", "ac3"]),
("Macross ~ Do You Remember Love (1984) (BDRip 1920x1036p x265 HEVC DTS-HD MA, FLAC, AC3x2 5.1+2.0x3)(Dual Audio)[sxales].mkv", ["truehd", "ac3"]),
("Escaflowne (2000) (BDRip 1896x1048p x265 HEVC TrueHD, FLACx3, AC3 5.1x2+2.0x3)(Triple Audio)[sxales].mkv", ["truehd", "ac3"]),
("[SAD] Inuyasha - The Movie 4 - Fire on the Mystic Island [BD 1920x1036 HEVC10 FLAC2.0x2] [84E9A4A1].mkv", ["flac"]),
])
Expand Down
32 changes: 16 additions & 16 deletions tests/test_main.py
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ def parser():
"languages": ["multi audio"],
"dubbed": True,
"codec": "x264",
"audio": "ac3",
"audio": ["ac3"],
"group": "gismo65",
"seasons": [],
"episodes": []
Expand All @@ -76,7 +76,7 @@ def parser():
"year": 2017,
"resolution": "720p",
"codec": "x264",
"audio": "ac3",
"audio": ["ac3"],
"group": "EVO",
"languages": [],
"seasons": [],
Expand Down Expand Up @@ -108,7 +108,7 @@ def parser():
"title": "Maman, j'ai raté l'avion",
"quality": "BluRay",
"year": 1990,
"audio": "dts",
"audio": ["truehd"],
"resolution": "1080p",
"languages": ["french"],
"codec": "x265",
Expand Down Expand Up @@ -188,7 +188,7 @@ def parser():
"episodes": [4],
"resolution": "1080p",
"codec": "avc",
"audio": "aac",
"audio": ["aac"],
"languages": [],
"seasons": [],
}),
Expand Down Expand Up @@ -217,7 +217,7 @@ def parser():
"seasons": [1],
"resolution": "1080p",
"quality": "BDRip",
"audio": "aac",
"audio": ["aac"],
"codec": "x265",
"group": "neoHEVC",
"languages": [],
Expand All @@ -228,7 +228,7 @@ def parser():
"episodes": [21],
"resolution": "720p",
"quality": "BDRip",
"audio": "aac",
"audio": ["aac"],
"container": "mkv",
"extension": "mkv",
"episode_code": "5F1911ED",
Expand All @@ -248,7 +248,7 @@ def parser():
"year": 2005,
"resolution": "720p",
"quality": "BRRip",
"audio": "ac3",
"audio": ["ac3"],
"languages": ["english", "italian"],
"group": "LIFE",
"seasons": [],
Expand Down Expand Up @@ -303,7 +303,7 @@ def parser():
"title": "Madame Web",
"year": 2024,
"quality": "BluRay REMUX",
"resolution": "4k",
"resolution": "2160p",
"audio": ["hd"],
"codec": "x265",
"languages": [],
Expand All @@ -329,7 +329,7 @@ def parser():
"languages": ["english"],
"quality": "BluRay REMUX",
"resolution": "1080p",
"audio": "dd5.1",
"audio": ["dd5.1"],
"channels": ["5.1"],
"codec": "avc",
"group": "NOGRP"
Expand All @@ -352,7 +352,7 @@ def parser():
"quality": "WEBRip",
"resolution": "1080p",
"bit_depth": "10bit",
"audio": "dd5.1",
"audio": ["dd5.1"],
"channels": ["5.1"],
"codec": "x265",
"seasons": [],
Expand All @@ -368,7 +368,7 @@ def parser():
"quality": "BluRay",
"codec": "x265",
"bit_depth": "10bit",
"audio": "aac",
"audio": ["aac"],
"channels": ["5.1"]
}),
("[DB]_Bleach_264_[012073FE].avi", {
Expand Down Expand Up @@ -401,7 +401,7 @@ def parser():
"resolution": "1080p",
"quality": "WEB-DL",
"codec": "x264",
"audio": "aac",
"audio": ["aac"],
}),
("Mary.Poppins.1964.50th.ANNIVERSARY.EDITION.REMUX.1080p.Bluray.AVC.DTS-HD.MA.5.1-LEGi0N", {
"title": "Mary Poppins",
Expand All @@ -412,15 +412,15 @@ def parser():
"edition": "Anniversary Edition",
"quality": "BluRay REMUX",
"resolution": "1080p",
"audio": "dts-hd",
"audio": ["truehd"],
"channels": ["5.1"],
"codec": "avc",
"group": "LEGi0N"
}),
("The.Lord.of.the.Rings.The.Fellowship.of.the.Ring.2001.EXTENDED.2160p.UHD.BluRay.x265.10bit.HDR.TrueHD.7.1.Atmos-BOREDOR", {
"title": "The Lord of the Rings The Fellowship of the Ring",
"year": 2001,
"resolution": "4k",
"resolution": "2160p",
"edition": "Extended Edition",
"languages": [],
"seasons": [],
Expand All @@ -442,7 +442,7 @@ def parser():
"quality": "BDRip",
"codec": "x265",
"resolution": "1896x1048p", # this needs to be 1080p instead probably
"audio": ["truehd"],
"audio": ["truehd", "ac3"],
"channels": ["5.1"],
"group": "sxales",
"dubbed": True,
Expand All @@ -455,7 +455,7 @@ def parser():
"seasons": [],
"episodes": [],
"quality": "WEB-DL",
"resolution": "4k",
"resolution": "2160p",
"hdr": ["SDR"],
"codec": "x265",
"site": "www.1TamilMV.pics",
Expand Down
6 changes: 3 additions & 3 deletions tests/test_resolution.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,9 @@ def parser():
("Annabelle.2014.1080p.PROPER.HC.WEBRip.x264.AAC.2.0-RARBG", "1080p"),
("doctor_who_2005.8x12.death_in_heaven.720p_hdtv_x264-fov", "720p"),
("UFC 187 PPV 720P HDTV X264-KYR", "720p"),
("The Smurfs 2 2013 COMPLETE FULL BLURAY UHD (4K) - IPT EXCLUSIVE", "4k"),
("Joker.2019.2160p.4K.BluRay.x265.10bit.HDR.AAC5.1", "4k"),
("[Beatrice-Raws] Evangelion 3.333 You Can (Not) Redo [BDRip 3840x1632 HEVC TrueHD]", "4k"),
("The Smurfs 2 2013 COMPLETE FULL BLURAY UHD (4K) - IPT EXCLUSIVE", "2160p"),
("Joker.2019.2160p.4K.BluRay.x265.10bit.HDR.AAC5.1", "2160p"),
("[Beatrice-Raws] Evangelion 3.333 You Can (Not) Redo [BDRip 3840x1632 HEVC TrueHD]", "2160p"),
("[Erai-raws] Evangelion 3.0 You Can (Not) Redo - Movie [1920x960][Multiple Subtitle].mkv", "1080p"),
("[JacobSwaggedUp] Kizumonogatari I: Tekketsu-hen (BD 1280x544) [MP4 Movie]", "720p"),
("UFC 187 PPV 720i HDTV X264-KYR", "720p"),
Expand Down
2 changes: 1 addition & 1 deletion tests/test_title.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ def parser():
("ww.Tamilblasters.sbs - 8 Bit Christmas (2021) HQ HDRip - x264 - Telugu (Fan Dub) - 400MB].mkv", "8 Bit Christmas"),
("www.1TamilMV.pics - 777 Charlie (2022) Tamil HDRip - 720p - x264 - HQ Clean Aud - 1.4GB.mkv", "777 Charlie"),
("Despicable.Me.4.2024.D.TELESYNC_14OOMB.avi", "Despicable Me 4"),
("UFC.247.PPV.Jones.vs.Reyes.HDTV.x264-PUNCH[TGx]", "UFC 247 PPV Jones vs Reyes"),
("UFC.247.PPV.Jones.vs.Reyes.HDTV.x264-PUNCH[TGx]", "UFC 247 Jones vs Reyes"),
("[www.1TamilMV.pics]_The.Great.Indian.Suicide.2023.Tamil.TRUE.WEB-DL.4K.SDR.HEVC.(DD+5.1.384Kbps.&.AAC).3.2GB.ESub.mkv", "The Great Indian Suicide"),
("Game of Thrones - S02E07 - A Man Without Honor [2160p] [HDR] [5.1, 7.1, 5.1] [ger, eng, eng] [Vio].mkv", "Game of Thrones"),
("Pawn.Stars.S09E13.1080p.HEVC.x265-MeGusta", "Pawn Stars"),
Expand Down

0 comments on commit f5758aa

Please sign in to comment.