|
|
|
from pathlib import Path
|
|
|
|
|
|
|
|
import pytest
|
|
|
|
|
|
|
|
from subliminal_patch import core
|
|
|
|
|
|
|
|
|
|
|
|
def test_scan_video_movie(tmpdir):
|
|
|
|
video_path = Path(tmpdir, "Taxi Driver 1976 Bluray 720p x264.mkv")
|
|
|
|
video_path.touch()
|
|
|
|
|
|
|
|
result = core.scan_video(str(video_path))
|
|
|
|
assert isinstance(result, core.Movie)
|
|
|
|
|
|
|
|
|
|
|
|
def test_scan_video_episode(tmpdir):
|
|
|
|
video_path = Path(tmpdir, "The Wire S01E01 Bluray 720p x264.mkv")
|
|
|
|
video_path.touch()
|
|
|
|
|
|
|
|
result = core.scan_video(str(video_path))
|
|
|
|
assert isinstance(result, core.Episode)
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.fixture
|
|
|
|
def pool_instance():
|
|
|
|
yield core.SZProviderPool({"subdivx"}, {})
|
|
|
|
|
|
|
|
|
|
|
|
def test_pool_update_w_nothing(pool_instance):
|
|
|
|
pool_instance.update({}, {}, [], {})
|
|
|
|
assert pool_instance.providers == set()
|
|
|
|
assert pool_instance.discarded_providers == set()
|
|
|
|
|
|
|
|
|
|
|
|
def test_pool_update_w_multiple_providers(pool_instance):
|
|
|
|
assert pool_instance.providers == {"subdivx"}
|
|
|
|
pool_instance.update({"subdivx", "subf2m"}, {}, [], {})
|
|
|
|
assert pool_instance.providers == {"subdivx", "subf2m"}
|
|
|
|
|
|
|
|
|
|
|
|
def test_pool_update_discarded_providers(pool_instance):
|
|
|
|
assert pool_instance.providers == {"subdivx"}
|
|
|
|
|
|
|
|
# Provider was discarded internally
|
|
|
|
pool_instance.discarded_providers = {"subdivx"}
|
|
|
|
|
|
|
|
assert pool_instance.discarded_providers == {"subdivx"}
|
|
|
|
|
|
|
|
# Provider is set to be used again
|
|
|
|
pool_instance.update({"subdivx", "subf2m"}, {}, [], {})
|
|
|
|
|
|
|
|
assert pool_instance.providers == {"subf2m", "subdivx"}
|
|
|
|
|
|
|
|
# Provider should disappear from discarded providers
|
|
|
|
assert pool_instance.discarded_providers == set()
|
|
|
|
|
|
|
|
|
|
|
|
def test_pool_update_discarded_providers_2(pool_instance):
|
|
|
|
assert pool_instance.providers == {"subdivx"}
|
|
|
|
|
|
|
|
# Provider was discarded internally
|
|
|
|
pool_instance.discarded_providers = {"subdivx"}
|
|
|
|
|
|
|
|
assert pool_instance.discarded_providers == {"subdivx"}
|
|
|
|
|
|
|
|
# Provider is not set to be used again
|
|
|
|
pool_instance.update({"subf2m"}, {}, [], {})
|
|
|
|
|
|
|
|
assert pool_instance.providers == {"subf2m"}
|
|
|
|
|
|
|
|
# Provider should not disappear from discarded providers
|
|
|
|
assert pool_instance.discarded_providers == {"subdivx"}
|
|
|
|
|
|
|
|
|
|
|
|
def test_language_equals_init():
|
|
|
|
assert core._LanguageEquals([(core.Language("spa"), core.Language("spa", "MX"))])
|
|
|
|
|
|
|
|
|
|
|
|
def test_language_equals_init_invalid():
|
|
|
|
with pytest.raises(ValueError):
|
|
|
|
assert core._LanguageEquals([(core.Language("spa", "MX"),)])
|
|
|
|
|
|
|
|
|
|
|
|
def test_language_equals_init_empty_list_gracefully():
|
|
|
|
assert core._LanguageEquals([]) == []
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
|
|
"langs",
|
|
|
|
[
|
|
|
|
[(core.Language("spa"), core.Language("spa", "MX"))],
|
|
|
|
[(core.Language("por"), core.Language("por", "BR"))],
|
|
|
|
[(core.Language("zho"), core.Language("zho", "TW"))],
|
|
|
|
],
|
|
|
|
)
|
|
|
|
def test_language_equals_check_set(langs):
|
|
|
|
equals = core._LanguageEquals(langs)
|
|
|
|
lang_set = {langs[0]}
|
|
|
|
assert equals.check_set(lang_set) == set(langs)
|
|
|
|
|
|
|
|
|
|
|
|
def test_language_equals_check_set_do_nothing():
|
|
|
|
equals = core._LanguageEquals([(core.Language("eng"), core.Language("spa"))])
|
|
|
|
lang_set = {core.Language("spa")}
|
|
|
|
assert equals.check_set(lang_set) == {core.Language("spa")}
|
|
|
|
|
|
|
|
|
|
|
|
def test_language_equals_check_set_do_nothing_w_forced():
|
|
|
|
equals = core._LanguageEquals(
|
|
|
|
[(core.Language("spa", forced=True), core.Language("spa", "MX"))]
|
|
|
|
)
|
|
|
|
lang_set = {core.Language("spa")}
|
|
|
|
assert equals.check_set(lang_set) == {core.Language("spa")}
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.fixture
|
|
|
|
def language_equals_pool_intance():
|
|
|
|
equals = [(core.Language("spa"), core.Language("spa", "MX"))]
|
|
|
|
yield core.SZProviderPool({"subdivx"}, language_equals=equals)
|
|
|
|
|
|
|
|
|
|
|
|
def test_language_equals_pool_intance_list_subtitles(
|
|
|
|
language_equals_pool_intance, movies
|
|
|
|
):
|
|
|
|
subs = language_equals_pool_intance.list_subtitles(
|
|
|
|
movies["dune"], {core.Language("spa")}
|
|
|
|
)
|
|
|
|
assert subs
|
|
|
|
assert all(sub.language == core.Language("spa", "MX") for sub in subs)
|
|
|
|
|
|
|
|
|
|
|
|
def test_language_equals_pool_intance_list_subtitles_reversed(movies):
|
|
|
|
equals = [(core.Language("spa", "MX"), core.Language("spa"))]
|
|
|
|
language_equals_pool_intance = core.SZProviderPool(
|
|
|
|
{"subdivx"}, language_equals=equals
|
|
|
|
)
|
|
|
|
subs = language_equals_pool_intance.list_subtitles(
|
|
|
|
movies["dune"], {core.Language("spa")}
|
|
|
|
)
|
|
|
|
assert subs
|
|
|
|
assert all(sub.language == core.Language("spa") for sub in subs)
|
|
|
|
|
|
|
|
|
|
|
|
def test_language_equals_pool_intance_list_subtitles_empty_lang_equals(movies):
|
|
|
|
language_equals_pool_intance = core.SZProviderPool(
|
|
|
|
{"subdivx"}, language_equals=None
|
|
|
|
)
|
|
|
|
subs = language_equals_pool_intance.list_subtitles(
|
|
|
|
movies["dune"], {core.Language("spa")}
|
|
|
|
)
|
|
|
|
assert subs
|
|
|
|
assert not all(sub.language == core.Language("spa", "MX") for sub in subs)
|
|
|
|
|
|
|
|
|
|
|
|
def test_language_equals_pool_intance_list_subtitles_return_nothing(movies):
|
|
|
|
equals = [
|
|
|
|
(core.Language("spa", "MX"), core.Language("eng")),
|
|
|
|
(core.Language("spa"), core.Language("eng")),
|
|
|
|
]
|
|
|
|
language_equals_pool_intance = core.SZProviderPool(
|
|
|
|
{"subdivx"}, language_equals=equals
|
|
|
|
)
|
|
|
|
subs = language_equals_pool_intance.list_subtitles(
|
|
|
|
movies["dune"], {core.Language("spa")}
|
|
|
|
)
|
|
|
|
assert not language_equals_pool_intance.download_best_subtitles(
|
|
|
|
subs, movies["dune"], {core.Language("spa")}
|
|
|
|
)
|