mirror of https://github.com/morpheus65535/bazarr
Subf2m Provider: add user-agent header configuration
This change fixes empty queries.
This commit is contained in:
parent
1c1caeb78b
commit
e3c4def89a
|
@ -169,7 +169,8 @@ defaults = {
|
||||||
'verify_ssl': 'True'
|
'verify_ssl': 'True'
|
||||||
},
|
},
|
||||||
'subf2m': {
|
'subf2m': {
|
||||||
'verify_ssl': 'True'
|
'verify_ssl': 'True',
|
||||||
|
'user_agent': ''
|
||||||
},
|
},
|
||||||
'whisperai': {
|
'whisperai': {
|
||||||
'endpoint': 'http://127.0.0.1:9000',
|
'endpoint': 'http://127.0.0.1:9000',
|
||||||
|
|
|
@ -294,7 +294,8 @@ def get_providers_auth():
|
||||||
'f_password': settings.karagarga.f_password,
|
'f_password': settings.karagarga.f_password,
|
||||||
},
|
},
|
||||||
'subf2m': {
|
'subf2m': {
|
||||||
'verify_ssl': settings.subf2m.getboolean('verify_ssl')
|
'verify_ssl': settings.subf2m.getboolean('verify_ssl'),
|
||||||
|
'user_agent': settings.subf2m.user_agent,
|
||||||
},
|
},
|
||||||
'whisperai': {
|
'whisperai': {
|
||||||
'endpoint': settings.whisperai.endpoint,
|
'endpoint': settings.whisperai.endpoint,
|
||||||
|
|
|
@ -329,7 +329,13 @@ export const ProviderList: Readonly<ProviderInfo[]> = [
|
||||||
name: "Verify SSL",
|
name: "Verify SSL",
|
||||||
defaultValue: true,
|
defaultValue: true,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
type: "text",
|
||||||
|
key: "user_agent",
|
||||||
|
name: "User-agent header",
|
||||||
|
},
|
||||||
],
|
],
|
||||||
|
message: "Make sure to use a unique and credible user agent.",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
key: "subs4free",
|
key: "subs4free",
|
||||||
|
|
|
@ -115,6 +115,21 @@ _LANGUAGE_MAP = {
|
||||||
"turkish": "tur",
|
"turkish": "tur",
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_DEFAULT_HEADERS = {
|
||||||
|
"authority": "subf2m.co",
|
||||||
|
"accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7",
|
||||||
|
"accept-language": "en-US,en;q=0.9",
|
||||||
|
"referer": "https://subf2m.co",
|
||||||
|
"sec-ch-ua": '"Chromium";v="111", "Not(A:Brand";v="8"',
|
||||||
|
"sec-ch-ua-mobile": "?0",
|
||||||
|
"sec-ch-ua-platform": '"Unknown"',
|
||||||
|
"sec-fetch-dest": "document",
|
||||||
|
"sec-fetch-mode": "navigate",
|
||||||
|
"sec-fetch-site": "same-origin",
|
||||||
|
"sec-fetch-user": "?1",
|
||||||
|
"upgrade-insecure-requests": "1",
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
class Subf2mProvider(Provider):
|
class Subf2mProvider(Provider):
|
||||||
provider_name = "subf2m"
|
provider_name = "subf2m"
|
||||||
|
@ -138,15 +153,25 @@ class Subf2mProvider(Provider):
|
||||||
video_types = (Episode, Movie)
|
video_types = (Episode, Movie)
|
||||||
subtitle_class = Subf2mSubtitle
|
subtitle_class = Subf2mSubtitle
|
||||||
|
|
||||||
def __init__(self, verify_ssl=True):
|
def __init__(self, verify_ssl=True, user_agent=None, session_factory=None):
|
||||||
super().__init__()
|
super().__init__()
|
||||||
|
if not user_agent:
|
||||||
|
raise ValueError("User-agent config missing")
|
||||||
|
|
||||||
|
self._user_agent = user_agent
|
||||||
self._verify_ssl = verify_ssl
|
self._verify_ssl = verify_ssl
|
||||||
|
self._session_factory = session_factory
|
||||||
|
|
||||||
def initialize(self):
|
def initialize(self):
|
||||||
self._session = Session()
|
if self._session_factory is not None:
|
||||||
self._session.verify = self._verify_ssl
|
self._session = self._session_factory()
|
||||||
|
else:
|
||||||
|
logger.debug("No session factory set. Using default requests.Session.")
|
||||||
|
self._session = Session()
|
||||||
|
|
||||||
self._session.headers.update({"user-agent": "Bazarr"})
|
self._session.verify = self._verify_ssl
|
||||||
|
self._session.headers.update(_DEFAULT_HEADERS)
|
||||||
|
self._session.headers.update({"user-agent": self._user_agent})
|
||||||
|
|
||||||
def terminate(self):
|
def terminate(self):
|
||||||
self._session.close()
|
self._session.close()
|
||||||
|
|
|
@ -5,6 +5,15 @@ from subliminal_patch.providers.subf2m import Subf2mSubtitle
|
||||||
from subzero.language import Language
|
from subzero.language import Language
|
||||||
|
|
||||||
|
|
||||||
|
_U_A = "Mozilla/5.0 (Linux; Android 10; SM-G996U Build/QP1A.190711.020; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Mobile Safari/537.36"
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture
|
||||||
|
def provider():
|
||||||
|
with Subf2mProvider(user_agent=_U_A) as provider:
|
||||||
|
yield provider
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.parametrize(
|
@pytest.mark.parametrize(
|
||||||
"title,year,expected_url",
|
"title,year,expected_url",
|
||||||
[
|
[
|
||||||
|
@ -17,14 +26,13 @@ from subzero.language import Language
|
||||||
("Cure", 1997, "/subtitles/cure-kyua"),
|
("Cure", 1997, "/subtitles/cure-kyua"),
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
def test_search_movie(movies, title, year, expected_url):
|
def test_search_movie(provider, movies, title, year, expected_url):
|
||||||
movie = list(movies.values())[0]
|
movie = list(movies.values())[0]
|
||||||
movie.title = title
|
movie.title = title
|
||||||
movie.year = year
|
movie.year = year
|
||||||
|
|
||||||
with Subf2mProvider() as provider:
|
result = provider._search_movie(movie.title, movie.year)
|
||||||
result = provider._search_movie(movie.title, movie.year)
|
assert result == expected_url
|
||||||
assert result == expected_url
|
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.parametrize(
|
@pytest.mark.parametrize(
|
||||||
|
@ -42,39 +50,33 @@ def test_search_movie(movies, title, year, expected_url):
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
def test_search_tv_show_season(series_title, season, year, expected_url):
|
def test_search_tv_show_season(provider, series_title, season, year, expected_url):
|
||||||
with Subf2mProvider() as provider:
|
result = provider._search_tv_show_season(series_title, season, year)
|
||||||
result = provider._search_tv_show_season(series_title, season, year)
|
assert result == expected_url
|
||||||
assert result == expected_url
|
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.parametrize("language", [Language.fromalpha2("en"), Language("por", "BR")])
|
@pytest.mark.parametrize("language", [Language.fromalpha2("en"), Language("por", "BR")])
|
||||||
def test_find_movie_subtitles(language):
|
def test_find_movie_subtitles(provider, language):
|
||||||
path = "/subtitles/dune-2021"
|
path = "/subtitles/dune-2021"
|
||||||
with Subf2mProvider() as provider:
|
for sub in provider._find_movie_subtitles(path, language):
|
||||||
for sub in provider._find_movie_subtitles(path, language):
|
assert sub.language == language
|
||||||
assert sub.language == language
|
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.parametrize("language", [Language.fromalpha2("en"), Language("por", "BR")])
|
@pytest.mark.parametrize("language", [Language.fromalpha2("en"), Language("por", "BR")])
|
||||||
def test_find_episode_subtitles(language):
|
def test_find_episode_subtitles(provider, language):
|
||||||
path = "/subtitles/breaking-bad-first-season"
|
path = "/subtitles/breaking-bad-first-season"
|
||||||
with Subf2mProvider() as provider:
|
for sub in provider._find_episode_subtitles(path, 1, 1, language):
|
||||||
for sub in provider._find_episode_subtitles(path, 1, 1, language):
|
assert sub.language == language
|
||||||
assert sub.language == language
|
|
||||||
|
|
||||||
|
|
||||||
def test_find_episode_subtitles_from_complete_series_path():
|
def test_find_episode_subtitles_from_complete_series_path(provider):
|
||||||
path = "/subtitles/courage-the-cowardly-dog"
|
path = "/subtitles/courage-the-cowardly-dog"
|
||||||
|
|
||||||
with Subf2mProvider() as provider:
|
for sub in provider._find_episode_subtitles(path, 1, 1, Language.fromalpha2("en")):
|
||||||
for sub in provider._find_episode_subtitles(
|
assert sub.language == Language.fromalpha2("en")
|
||||||
path, 1, 1, Language.fromalpha2("en")
|
|
||||||
):
|
|
||||||
assert sub.language == Language.fromalpha2("en")
|
|
||||||
|
|
||||||
|
|
||||||
def test_list_and_download_subtitles_complete_series_pack(episodes):
|
def test_list_and_download_subtitles_complete_series_pack(provider, episodes):
|
||||||
episode = list(episodes.values())[0]
|
episode = list(episodes.values())[0]
|
||||||
|
|
||||||
episode.series = "Sam & Max: Freelance Police"
|
episode.series = "Sam & Max: Freelance Police"
|
||||||
|
@ -83,14 +85,13 @@ def test_list_and_download_subtitles_complete_series_pack(episodes):
|
||||||
episode.season = 1
|
episode.season = 1
|
||||||
episode.episode = 21
|
episode.episode = 21
|
||||||
|
|
||||||
with Subf2mProvider() as provider:
|
subtitles = provider.list_subtitles(episode, {Language.fromalpha2("en")})
|
||||||
subtitles = provider.list_subtitles(episode, {Language.fromalpha2("en")})
|
assert subtitles
|
||||||
assert subtitles
|
|
||||||
|
|
||||||
subtitle = subtitles[0]
|
subtitle = subtitles[0]
|
||||||
provider.download_subtitle(subtitle)
|
provider.download_subtitle(subtitle)
|
||||||
|
|
||||||
assert subtitle.is_valid()
|
assert subtitle.is_valid()
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture
|
@pytest.fixture
|
||||||
|
@ -136,47 +137,40 @@ def test_subtitle_get_matches_episode(subtitle_episode, episodes):
|
||||||
assert "source" not in matches
|
assert "source" not in matches
|
||||||
|
|
||||||
|
|
||||||
def test_list_subtitles_movie(movies):
|
def test_list_subtitles_movie(provider, movies):
|
||||||
with Subf2mProvider() as provider:
|
assert provider.list_subtitles(movies["dune"], {Language.fromalpha2("en")})
|
||||||
assert provider.list_subtitles(movies["dune"], {Language.fromalpha2("en")})
|
|
||||||
|
|
||||||
|
|
||||||
def test_list_subtitles_inexistent_movie(movies):
|
def test_list_subtitles_inexistent_movie(provider, movies):
|
||||||
with Subf2mProvider() as provider:
|
assert (
|
||||||
assert (
|
provider.list_subtitles(movies["inexistent"], {Language.fromalpha2("en")}) == []
|
||||||
provider.list_subtitles(movies["inexistent"], {Language.fromalpha2("en")})
|
)
|
||||||
== []
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
def test_list_subtitles_episode(episodes):
|
def test_list_subtitles_episode(provider, episodes):
|
||||||
with Subf2mProvider() as provider:
|
assert provider.list_subtitles(
|
||||||
assert provider.list_subtitles(
|
episodes["breaking_bad_s01e01"], {Language.fromalpha2("en")}
|
||||||
episodes["breaking_bad_s01e01"], {Language.fromalpha2("en")}
|
)
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
def test_list_subtitles_inexistent_episode(episodes):
|
def test_list_subtitles_inexistent_episode(provider, episodes):
|
||||||
with Subf2mProvider() as provider:
|
assert (
|
||||||
assert (
|
provider.list_subtitles(episodes["inexistent"], {Language.fromalpha2("en")})
|
||||||
provider.list_subtitles(episodes["inexistent"], {Language.fromalpha2("en")})
|
== []
|
||||||
== []
|
)
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
def test_download_subtitle(subtitle):
|
def test_download_subtitle(provider, subtitle):
|
||||||
with Subf2mProvider() as provider:
|
provider.download_subtitle(subtitle)
|
||||||
provider.download_subtitle(subtitle)
|
assert subtitle.is_valid()
|
||||||
assert subtitle.is_valid()
|
|
||||||
|
|
||||||
|
|
||||||
def test_download_subtitle_episode(subtitle_episode):
|
def test_download_subtitle_episode(provider, subtitle_episode):
|
||||||
with Subf2mProvider() as provider:
|
provider.download_subtitle(subtitle_episode)
|
||||||
provider.download_subtitle(subtitle_episode)
|
assert subtitle_episode.is_valid()
|
||||||
assert subtitle_episode.is_valid()
|
|
||||||
|
|
||||||
|
|
||||||
def test_download_subtitle_episode_with_title():
|
def test_download_subtitle_episode_with_title(provider):
|
||||||
sub = Subf2mSubtitle(
|
sub = Subf2mSubtitle(
|
||||||
Language.fromalpha2("en"),
|
Language.fromalpha2("en"),
|
||||||
"https://subf2m.co/subtitles/courage-the-cowardly-dog/english/2232402",
|
"https://subf2m.co/subtitles/courage-the-cowardly-dog/english/2232402",
|
||||||
|
@ -185,9 +179,8 @@ def test_download_subtitle_episode_with_title():
|
||||||
)
|
)
|
||||||
|
|
||||||
sub.episode_title = "Feast of the Bullfrogs"
|
sub.episode_title = "Feast of the Bullfrogs"
|
||||||
with Subf2mProvider() as provider:
|
provider.download_subtitle(sub)
|
||||||
provider.download_subtitle(sub)
|
assert sub.is_valid()
|
||||||
assert sub.is_valid()
|
|
||||||
|
|
||||||
|
|
||||||
def test_get_episode_from_release():
|
def test_get_episode_from_release():
|
||||||
|
|
Loading…
Reference in New Issue