From 5f7a3e8b1f09b19ae2c92fd746275c4c5e5cc976 Mon Sep 17 00:00:00 2001 From: Luis <1042532+Nyaran@users.noreply.github.com> Date: Mon, 16 Sep 2024 22:54:19 +0200 Subject: [PATCH] Support BSPlayer Subtitles provider (#996) * feat: Support BSPlayer Subtitles * feat: Add reference to changelog * feat: BSPlayer tests - Enable decode_compressed_response * feat: BSPlayer tests - Fix mypy warnings * fix: BSPlayer extension path * correct BSPlayerSubtitle attributes types * simplify code --------- Co-authored-by: getzze --- changelog.d/996.provider.rst | 1 + docs/api/providers.rst | 6 + docs/user/how_it_works.rst | 1 + pyproject.toml | 2 + subliminal/extensions.py | 1 + subliminal/providers/bsplayer.py | 324 ++++ subliminal/refiners/hash.py | 35 + .../bsplayer/test_download_subtitle.yaml | 1362 +++++++++++++++++ .../bsplayer/test_list_subtitles_hash.yaml | 203 +++ tests/cassettes/bsplayer/test_login.yaml | 57 + tests/cassettes/bsplayer/test_logout.yaml | 111 ++ .../bsplayer/test_query_hash_size.yaml | 359 +++++ tests/conftest.py | 3 + tests/providers/test_bsplayer.py | 121 ++ tests/refiners/test_hash.py | 11 +- tests/test_core.py | 42 +- tests/test_extensions.py | 10 +- 17 files changed, 2635 insertions(+), 14 deletions(-) create mode 100644 changelog.d/996.provider.rst create mode 100644 subliminal/providers/bsplayer.py create mode 100644 tests/cassettes/bsplayer/test_download_subtitle.yaml create mode 100644 tests/cassettes/bsplayer/test_list_subtitles_hash.yaml create mode 100644 tests/cassettes/bsplayer/test_login.yaml create mode 100644 tests/cassettes/bsplayer/test_logout.yaml create mode 100644 tests/cassettes/bsplayer/test_query_hash_size.yaml create mode 100644 tests/providers/test_bsplayer.py diff --git a/changelog.d/996.provider.rst b/changelog.d/996.provider.rst new file mode 100644 index 00000000..9be8d644 --- /dev/null +++ b/changelog.d/996.provider.rst @@ -0,0 +1 @@ +Added BSPlayer provider diff --git a/docs/api/providers.rst b/docs/api/providers.rst index 6ef90a5f..c05ece8d 100644 --- a/docs/api/providers.rst +++ b/docs/api/providers.rst @@ -9,6 +9,12 @@ Addic7ed :members: :private-members: +BSPlayer +-------- +.. automodule:: subliminal.providers.bsplayer + :members: + :private-members: + Gestdown -------- .. automodule:: subliminal.providers.gestdown diff --git a/docs/user/how_it_works.rst b/docs/user/how_it_works.rst index c73bfa75..48762cd5 100644 --- a/docs/user/how_it_works.rst +++ b/docs/user/how_it_works.rst @@ -7,6 +7,7 @@ Subliminal uses multiple providers to give users a vast choice and have a better subtitles. Current supported providers are: * Addic7ed +* BSPlayer * Gestdown * NapiProjekt * OpenSubtitles diff --git a/pyproject.toml b/pyproject.toml index 76c900ee..34bbb323 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -35,6 +35,7 @@ dynamic = ["version", "readme"] dependencies = [ "babelfish>=0.6.1", "beautifulsoup4>=4.4.0", + "defusedxml>=0.7.1", "chardet>=5.0", "click>=8.0", "click-option-group>=0.5.6", @@ -89,6 +90,7 @@ subliminal = "subliminal.cli:subliminal" [project.entry-points."subliminal.providers"] addic7ed = "subliminal.providers.addic7ed:Addic7edProvider" +bsplayer = "subliminal.providers.bsplayer:BSPlayerProvider" gestdown = "subliminal.providers.gestdown:GestdownProvider" napiprojekt = "subliminal.providers.napiprojekt:NapiProjektProvider" opensubtitles = "subliminal.providers.opensubtitles:OpenSubtitlesProvider" diff --git a/subliminal/extensions.py b/subliminal/extensions.py index 03d6e1a5..9ea34f30 100644 --- a/subliminal/extensions.py +++ b/subliminal/extensions.py @@ -125,6 +125,7 @@ def parse_entry_point(src: str, group: str) -> EntryPoint: 'subliminal.providers', [ 'addic7ed = subliminal.providers.addic7ed:Addic7edProvider', + 'bsplayer = subliminal.providers.bsplayer:BSPlayerProvider', 'gestdown = subliminal.providers.gestdown:GestdownProvider', 'napiprojekt = subliminal.providers.napiprojekt:NapiProjektProvider', 'opensubtitles = subliminal.providers.opensubtitles:OpenSubtitlesProvider', diff --git a/subliminal/providers/bsplayer.py b/subliminal/providers/bsplayer.py new file mode 100644 index 00000000..18deb3b2 --- /dev/null +++ b/subliminal/providers/bsplayer.py @@ -0,0 +1,324 @@ +"""Based on https://github.com/realgam3/service.subtitles.bsplayer.""" + +from __future__ import annotations + +import logging +import re +import secrets +import zlib +from time import sleep +from typing import TYPE_CHECKING, ClassVar, cast, overload + +from babelfish import Language, language_converters # type: ignore[import-untyped] +from defusedxml import ElementTree # type: ignore[import-untyped] +from requests import Session + +from subliminal.exceptions import AuthenticationError, NotInitializedProviderError +from subliminal.subtitle import Subtitle, fix_line_ending + +from . import Provider + +if TYPE_CHECKING: + from collections.abc import Set + from xml.etree.ElementTree import Element + + from subliminal.video import Video + +logger = logging.getLogger(__name__) + +# s1-9, s101-109 +SUB_DOMAINS = [ + 's1', + 's2', + 's3', + 's4', + 's5', + 's6', + 's7', + 's8', + 's9', + 's101', + 's102', + 's103', + 's104', + 's105', + 's106', + 's107', + 's108', + 's109', +] +API_URL_TEMPLATE = 'http://{sub_domain}.api.bsplayer-subtitles.com/v1.php' + + +def get_sub_domain() -> str: + """Get a random subdomain.""" + return API_URL_TEMPLATE.format(sub_domain=SUB_DOMAINS[secrets.randbelow(len(SUB_DOMAINS))]) + + +@overload +def find_text(xml: Element | None, tag: str, default: str) -> str: ... + + +@overload +def find_text(xml: Element | None, tag: str, default: None = None) -> str | None: ... + + +def find_text(xml: Element | None, tag: str, default: str | None = None) -> str | None: + """Find tag in XML and return text or None.""" + if xml is None: + return default + res = xml.find(tag) + if res is None: + return default + return res.text if res.text is not None else default + + +def find_int(xml: Element, tag: str, default: int | None = None) -> int | None: + """Find tag in XML and return text converted to int or None.""" + value = find_text(xml, tag, default=None) + if value is None: + return default + + try: + return int(value) + except ValueError: + logger.exception('Error parsing value.') + return default + + +def find_float(xml: Element, tag: str, default: float | None = None) -> float | None: + """Find tag in XML and return text converted to float or None.""" + value = find_text(xml, tag) + if value is None: + return default + + try: + return float(value) + except ValueError: + logger.exception('Error parsing value.') + return default + + +class BSPlayerSubtitle(Subtitle): + """BSPlayer Subtitle.""" + + provider_name: ClassVar[str] = 'bsplayer' + series_re = re.compile(r'^"(?P.*)" (?P.*)$') + + def __init__( + self, + language: Language, + subtitle_id: str, + *, + size: int | None = None, + page_link: str | None = None, + filename: str = '', + subtitle_format: str | None = None, + subtitle_hash: str | None = None, + rating: str | None = None, + season: int | None = None, + episode: int | None = None, + encoding: str | None = None, + imdb_id: str | None = None, + imdb_rating: str | None = None, + movie_year: int | None = None, + movie_name: str | None = None, + movie_hash: str | None = None, + movie_size: int | None = None, + movie_fps: float | None = None, + ) -> None: + super().__init__(language, subtitle_id, page_link=page_link, encoding=encoding) + self.size = size + self.page_link = page_link + self.language = language + self.filename = filename + self.format = subtitle_format + self.hash = subtitle_hash + self.rating = rating + self.season = season + self.episode = episode + self.encoding = encoding + self.imdb_id = imdb_id + self.imdb_rating = imdb_rating + self.movie_year = movie_year + self.movie_name = movie_name + self.movie_hash = movie_hash + self.movie_size = movie_size + self.movie_fps = movie_fps + + @property + def info(self) -> str: + """Information about the subtitle.""" + if not self.filename and not self.movie_name: + return self.subtitle_id + if self.movie_name and len(self.movie_name) > len(self.filename): + return self.movie_name + return self.filename + + @property + def series_name(self) -> str | None: + """The series name matched from `movie_name`.""" + if self.movie_name: + matches = self.series_re.match(self.movie_name) + if matches: + return matches.group('series_name') + return None + + @property + def series_title(self) -> str | None: + """The series title matched from `movie_name`.""" + if self.movie_name: + matches = self.series_re.match(self.movie_name) + if matches: + return matches.group('series_title') + return None + + def get_matches(self, video: Video) -> set[str]: + """Get the matches against the `video`.""" + return {'hash'} + + +class BSPlayerProvider(Provider): + """BSPlayer Provider.""" + + languages: ClassVar[Set[Language]] = {Language.fromalpha3b(lang) for lang in language_converters['alpha3b'].codes} + + timeout: int + token: str | None + session: Session + search_url: str + + def __init__(self, search_url: str | None = None, timeout: int = 10) -> None: + self.timeout = timeout + self.token = None + self.session = Session() + self.search_url = search_url or get_sub_domain() + + def _api_request(self, func_name: str = 'logIn', params: str = '', tries: int = 5) -> Element: + """Request data from search url. + + :param str func_name: the type of request. + :param str params: xml string of parameters to send with the request. + :return: the root XML element from the response. + :rtype: `xml.etree.ElementTree.Element`. + """ + headers = { + 'User-Agent': 'BSPlayer/2.x (1022.12360)', + 'Content-Type': 'text/xml; charset=utf-8', + 'Connection': 'close', + 'SOAPAction': f'"http://api.bsplayer-subtitles.com/v1.php#{func_name}"', + 'Accept-Encoding': 'gzip, deflate', + } + data = ( + '\n' + '' + '' + f'{params}' + ) + + for _ in range(tries): + try: + res = self.session.post(self.search_url, data=data, headers=headers, timeout=self.timeout) + return cast('Element', ElementTree.fromstring(res.content)) + except Exception: + logger.exception('[BSPlayer] ERROR:.') + if func_name == 'logIn': + self.search_url = get_sub_domain() + sleep(1) + msg = f'[BSPlayer] ERROR: Too many tries ({tries})...' + raise AuthenticationError(msg) + + def initialize(self) -> None: + """Initialize the provider.""" + root = self._api_request( + func_name='logIn', + params='BSPlayer v2.67', + ) + res = root.find('.//return') + if res is None or find_text(res, 'status') != 'OK': + msg = '[BSPlayer] ERROR: Unable to login.' + raise AuthenticationError(msg) + self.token = find_text(res, 'data') + + def terminate(self) -> None: + """Terminate the provider.""" + if self.token is None: + raise NotInitializedProviderError + root = self._api_request(func_name='logOut', params=f'{self.token}') + res = root.find('.//return') + if res is None or find_text(res, 'status') != 'OK': + msg = '[BSPlayer] ERROR: Unable to close session.' + logger.error(msg) + self.token = None + + def query( + self, + languages: Set[Language], + file_hash: str | None = None, + size: int | None = None, + ) -> list[BSPlayerSubtitle]: + """Query the provider for subtitles.""" + if self.token is None: + raise NotInitializedProviderError + # fill the search criteria + language_ids = ','.join(sorted(lang.alpha3 for lang in languages)) + root = self._api_request( + func_name='searchSubtitles', + params=( + f'{self.token}' + f'{file_hash}' + f'{size}' + f'{language_ids}' + '*' + ), + ) + res = root.find('.//return/result') + if res is None or find_text(res, 'status') != 'OK': + return [] + + items = root.findall('.//return/data/item') + subtitles = [] + if items: + for item in items: + language = Language.fromalpha3b(find_text(item, 'subLang')) + subtitle = BSPlayerSubtitle( + language=language, + subtitle_id=find_text(item, 'subID', default=''), + page_link=find_text(item, 'subDownloadLink', default=''), + filename=find_text(item, 'subName', default=''), + size=find_int(item, 'subSize'), + subtitle_format=find_text(item, 'subFormat'), + subtitle_hash=find_text(item, 'subHash'), + rating=find_text(item, 'subRating'), + season=find_int(item, 'season'), + episode=find_int(item, 'episode'), + encoding=find_text(item, 'encsubtitle'), + imdb_id=find_text(item, 'movieIMBDID'), + imdb_rating=find_text(item, 'movieIMBDRating'), + movie_year=find_int(item, 'movieYear'), + movie_name=find_text(item, 'movieName'), + movie_hash=find_text(item, 'movieHash'), + movie_size=find_int(item, 'movieSize'), + movie_fps=find_float(item, 'movieFPS'), + ) + logger.debug('Found subtitle %s', subtitle) + subtitles.append(subtitle) + + return subtitles + + def list_subtitles(self, video: Video, languages: Set[Language]) -> list[BSPlayerSubtitle]: + """List all the subtitles for the video.""" + return self.query(languages, file_hash=video.hashes.get('bsplayer'), size=video.size) + + def download_subtitle(self, subtitle: BSPlayerSubtitle) -> None: + """Download the content of the subtitle.""" + logger.info('Downloading subtitle %r', subtitle) + headers = { + 'User-Agent': 'BSPlayer/2.x (1022.12360)', + 'Content-Length': '0', + } + r = self.session.get(subtitle.page_link or '', headers=headers, timeout=self.timeout) + subtitle.content = fix_line_ending(zlib.decompress(r.content, 47)) diff --git a/subliminal/refiners/hash.py b/subliminal/refiners/hash.py index a992b559..b14826cb 100644 --- a/subliminal/refiners/hash.py +++ b/subliminal/refiners/hash.py @@ -24,6 +24,40 @@ logger = logging.getLogger(__name__) +def hash_bsplayer(video_path: str | os.PathLike) -> str | None: + """Compute a hash using BSPlayer's algorithm. + + :param str video_path: path of the video. + :return: the hash. + :rtype: str. + """ + little_endian_long_long = ' str | None: """Compute a hash using OpenSubtitles' algorithm. @@ -108,6 +142,7 @@ def hash_shooter(video_path: str | os.PathLike) -> str | None: # pragma: no cov hash_functions: dict[str, HashFunc] = { + 'bsplayer': hash_bsplayer, 'napiprojekt': hash_napiprojekt, 'opensubtitles': hash_opensubtitles, 'opensubtitlesvip': hash_opensubtitles, diff --git a/tests/cassettes/bsplayer/test_download_subtitle.yaml b/tests/cassettes/bsplayer/test_download_subtitle.yaml new file mode 100644 index 00000000..5bc68cd6 --- /dev/null +++ b/tests/cassettes/bsplayer/test_download_subtitle.yaml @@ -0,0 +1,1362 @@ +interactions: +- request: + body: ' + + BSPlayer + v2.67' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - close + Content-Length: + - '543' + Content-Type: + - text/xml; charset=utf-8 + SOAPAction: + - '"http://api.bsplayer-subtitles.com/v1.php#logIn"' + User-Agent: + - BSPlayer/2.x (1022.12360) + method: POST + uri: http://s1.api.bsplayer-subtitles.com/v1.php + response: + body: + string: ' + + 200OK0e3ea29da442c64f175a2bd68986f874 + + ' + headers: + Connection: + - close + Content-Encoding: + - gzip + Content-Length: + - '343' + Content-Type: + - text/xml; charset=utf-8 + Date: + - Tue, 30 Jul 2024 22:26:24 GMT + Server: + - Apache/2.4.59 (Debian) + Vary: + - Accept-Encoding + status: + code: 200 + message: OK +- request: + body: ' + + 0e3ea29da442c64f175a2bd68986f8746878b3ef7c1bd19e501910737eng,spa*' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - close + Content-Length: + - '662' + Content-Type: + - text/xml; charset=utf-8 + SOAPAction: + - '"http://api.bsplayer-subtitles.com/v1.php#searchSubtitles"' + User-Agent: + - BSPlayer/2.x (1022.12360) + method: POST + uri: http://s1.api.bsplayer-subtitles.com/v1.php + response: + body: + string: "\n200OK01644252012185http://download.bsplayer-subtitles.com/download/file/16442520/d0e3ea29da442c64f175a2bd68986f874spaThe.Big.Bang.Theory.S07E05.720p.HDTV.X264-DIMENSION.srtsrtdbaf71fc665f83a716ae3f5daa62b7a0525574906878b3ef7c1bd19e001644375512244http://download.bsplayer-subtitles.com/download/file/16443755/d0e3ea29da442c64f175a2bd68986f874engThe.Big.Bang.Theory.S07E05.720p.HDTV.x264-DIMENSION.srtsrt7c75c37e81420b602e73cd06fde917aa525574906878b3ef7c1bd19e001644314512475http://download.bsplayer-subtitles.com/download/file/16443145/d0e3ea29da442c64f175a2bd68986f874engThe.Big.Bang.Theory.S07E05.720p.HDTV.X264-DIMENSION.srtsrtba3a83e914fdda6516a214bcf35f7a4f425574906878b3ef7c1bd19e001647975212239http://download.bsplayer-subtitles.com/download/file/16479752/d0e3ea29da442c64f175a2bd68986f874spaThe.Big.Bang.Theory.S07E05.The.Workplace.Proximity.720p.HDTV.x264-DIMENSION-spa.srtsrtac7c01853374ca44ea558e8435f3e13825574906878b3ef7c1bd19e001648221411598http://download.bsplayer-subtitles.com/download/file/16482214/d0e3ea29da442c64f175a2bd68986f874spaThe.Big.Bang.Theory.S07E05.720p.HDTV.X264-DIMENSION-spa.srtsrt7d8edad101ca5a41820fc82608abbd2a25574906878b3ef7c1bd19e001649186212550http://download.bsplayer-subtitles.com/download/file/16491862/d0e3ea29da442c64f175a2bd68986f874engThe.Big.Bang.Theory.S07E05.720p.HDTV.X264-DIMENSION.srtsrt62d28bd06d22e37845c691d150cc37e225574906878b3ef7c1bd19e001650146112165http://download.bsplayer-subtitles.com/download/file/16501461/d0e3ea29da442c64f175a2bd68986f874spaThe + Big Bang Theory 7x05 - The Workplace Proximity.srtsrt5527025d719909ca98d71edac6c8338325574906878b3ef7c1bd19e001650236412290http://download.bsplayer-subtitles.com/download/file/16502364/d0e3ea29da442c64f175a2bd68986f874spaThe.Big.Bang.Theory.S07E05.720p.HDTV.X264-DIMENSION-spa.srtsrt14ec9d6fa31f2002422b80343bf56cbf25574906878b3ef7c1bd19e001651464512172http://download.bsplayer-subtitles.com/download/file/16514645/d0e3ea29da442c64f175a2bd68986f874spaThe + Big Bang Theory 7x05 - The Workplace Proximity (Espa\xF1ol (Espa\xF1a)).srtsrtcfe9d844cbaa6aa82df0dc74f13ef79b25574906878b3ef7c1bd19e001651858512233http://download.bsplayer-subtitles.com/download/file/16518585/d0e3ea29da442c64f175a2bd68986f874spaThe + Big Bang Theory 7x05 - The Workplace Proximity (Espa\xF1ol (Latinoam\xE9rica)).srtsrt7218c8c7c1789d4f799e188cd393949425574906878b3ef7c1bd19e001653456812173http://download.bsplayer-subtitles.com/download/file/16534568/d0e3ea29da442c64f175a2bd68986f874spaThe + Big Bang Theory 7x05 - The Workplace Proximity.srtsrt0a5364c1b978dece17d483f24ffa188425574906878b3ef7c1bd19e001653746312450http://download.bsplayer-subtitles.com/download/file/16537463/d0e3ea29da442c64f175a2bd68986f874engThe.Big.Bang.Theory.S07E05.The.Workplace.Proximity.srtsrt6f2235e71ee46798ce71727121e6861325574906878b3ef7c1bd19e001657076211597http://download.bsplayer-subtitles.com/download/file/16570762/d0e3ea29da442c64f175a2bd68986f874spaThe.Big.Bang.Theory.S07E05.720p.HDTV.X264-DIMENSION-spa.srtsrtca7aec9a6cf6d79098e8694c6e1f077025574906878b3ef7c1bd19e001647955412192http://download.bsplayer-subtitles.com/download/file/16479554/d0e3ea29da442c64f175a2bd68986f874spaThe + Big Bang Theory 7x05 - The Workplace Proximity.srtsrta6104e970eb83294ffc8689693aabdbd25574906878b3ef7c1bd19e001647767712320http://download.bsplayer-subtitles.com/download/file/16477677/d0e3ea29da442c64f175a2bd68986f874spaThe + Big Bang Theory.S07E05 - The Workplace Proximity.720p.DIMENSION.srtsrt1813ce3cd5024e19b6588388655b565a25574906878b3ef7c1bd19e001644901812230http://download.bsplayer-subtitles.com/download/file/16449018/d0e3ea29da442c64f175a2bd68986f874engThe.Big.Bang.Theory.S07E05.720p.HDTV.X264-DIMENSION-eng.srtsrt6728f18661ee98512965262b2f904cdd25574906878b3ef7c1bd19e001645198212247http://download.bsplayer-subtitles.com/download/file/16451982/d0e3ea29da442c64f175a2bd68986f874spaThe + Big Bang Theory 7x05 - The Workplace Proximity (Espa\xF1ol (Latinoam\xE9rica)).srtsrtceca0ed2bf0127374c75cf1efc8173c225574906878b3ef7c1bd19e001645221212171http://download.bsplayer-subtitles.com/download/file/16452212/d0e3ea29da442c64f175a2bd68986f874spaThe + Big Bang Theory 7x05 - The Workplace Proximity (Espa\xF1ol (Espa\xF1a)).srtsrt7fd3450834f544fae8f723a56b52dfc725574906878b3ef7c1bd19e001645253112165http://download.bsplayer-subtitles.com/download/file/16452531/d0e3ea29da442c64f175a2bd68986f874spaThe + Big Bang Theory 7x05 - The Workplace Proximity (Espa\xF1ol (Espa\xF1a)).srtsrte7e0a81247826b1a87ab0422946227c925574906878b3ef7c1bd19e001645327212241http://download.bsplayer-subtitles.com/download/file/16453272/d0e3ea29da442c64f175a2bd68986f874spaThe + Big Bang Theory - S07E05 - The Workplace Proximity.srtsrt396de815d223e047cc7c208593d7b9fc25574906878b3ef7c1bd19e001645493910938http://download.bsplayer-subtitles.com/download/file/16454939/d0e3ea29da442c64f175a2bd68986f874spaThe.Big.Bang.Theory.S07E05.HDTV-LOL.ESP.wWw.SubsTeam.Net.srtsrtbf399980c3d4a072240b0b055338edae25574906878b3ef7c1bd19e001645777012220http://download.bsplayer-subtitles.com/download/file/16457770/d0e3ea29da442c64f175a2bd68986f874spaThe + Big Bang Theory 7x05 - The Workplace Proximity (Espa\xF1ol (Latinoam\xE9rica)).srtsrt6e7d372e70b0713e43d074621529fdfc25574906878b3ef7c1bd19e001645977212237http://download.bsplayer-subtitles.com/download/file/16459772/d0e3ea29da442c64f175a2bd68986f874spaThe + Big Bang Theory 7x05 - The Workplace Proximity (Espa\xF1ol (Latinoam\xE9rica)).srtsrtf911800ff0da35e4ec92b5b85da5bbba25574906878b3ef7c1bd19e001646023312237http://download.bsplayer-subtitles.com/download/file/16460233/d0e3ea29da442c64f175a2bd68986f874spaThe.Big.Bang.Theory.S07E05.720p.wWw.Darkville.Com.Mx.srtsrtc2d3eb7f5a56ab6f43119d3bbc7b785a25574906878b3ef7c1bd19e001646306510873http://download.bsplayer-subtitles.com/download/file/16463065/d0e3ea29da442c64f175a2bd68986f874engThe.Big.Bang.Theory.S07E05.720p.HDTV.X264-DIMENSION-eng(1)(2).srtsrt77b6dcc1febde6e09a380cd056c0493b25574906878b3ef7c1bd19e001647710211546http://download.bsplayer-subtitles.com/download/file/16477102/d0e3ea29da442c64f175a2bd68986f874spaThe.Big.Bang.Theory.S07E05.The.Workplace.Proximity.HDTV.x264-LOL.srtsrt35249930e80b30ec0b968b7a90b2b80f25574906878b3ef7c1bd19e001658889411414http://download.bsplayer-subtitles.com/download/file/16588894/d0e3ea29da442c64f175a2bd68986f874spaThe.Big.Bang.Theory.S07E05.720p.HDTV.X264-DIMENSION-spa.srtsrte6c73dc4d8a4cf7ad989467657e12db625574906878b3ef7c1bd19e001661133512451http://download.bsplayer-subtitles.com/download/file/16611335/d0e3ea29da442c64f175a2bd68986f874engThe.Big.Bang.Theory.S07E05.HDTV.x264-LOL.srtsrt5be4209ed8a43db8824ff36b141c932c25574906878b3ef7c1bd19e001661814135144http://download.bsplayer-subtitles.com/download/file/16618141/d0e3ea29da442c64f175a2bd68986f874spaThe.Big.Bang.Theory.S07E05.720p.HDTV.X264-DIMENSION-heb.srtsrtb72b97ca6bec967c75c4aafcf424255b25574906878b3ef7c1bd19e002368877712375http://download.bsplayer-subtitles.com/download/file/23688777/d0e3ea29da442c64f175a2bd68986f874engThe + Big Bang Theory - 7x05 - The Workplace Proximity-eng.srtsrt450e6827a279a43227ebe9b39160521125574906878b3ef7c1bd19e002520232212365http://download.bsplayer-subtitles.com/download/file/25202322/d0e3ea29da442c64f175a2bd68986f874engThe.Big.Bang.Theory.S07E05.720p.HDTV.X264-DIMENSION-eng.srtsrte1817f67ec65ab57f7d79eb42ced38ad25574906878b3ef7c1bd19e002587285112274http://download.bsplayer-subtitles.com/download/file/25872851/d0e3ea29da442c64f175a2bd68986f874spaThe.Big.Bang.Theory.S07E05.720p.HDTV.X264-DIMENSION-spa.srtsrtac1f7ebe854c9ad254d024918b609def25574906878b3ef7c1bd19e002675790112385http://download.bsplayer-subtitles.com/download/file/26757901/d0e3ea29da442c64f175a2bd68986f874engThe.Big.Bang.Theory.S07E05.720p.HDTV.X264-DIMENSION-eng.srtsrt06d18ee0e3b63d01245c631a7d7edbd625574906878b3ef7c1bd19e002728724212455http://download.bsplayer-subtitles.com/download/file/27287242/d0e3ea29da442c64f175a2bd68986f874engThe.Big.Bang.Theory.S07E05.720p.HDTV.X264-DIMENSION.assasse14e1039f598469569e1840e51eb20e025574906878b3ef7c1bd19e002764269012381http://download.bsplayer-subtitles.com/download/file/27642690/d0e3ea29da442c64f175a2bd68986f874engThe.Big.Bang.Theory.S07E05.720p.HDTV.X264-DIMENSION-eng.srtsrt3a07a4eece3e22c286a8764c15984b5525574906878b3ef7c1bd19e002765248212395http://download.bsplayer-subtitles.com/download/file/27652482/d0e3ea29da442c64f175a2bd68986f874engThe.Big.Bang.Theory.S07E05.720p.HDTV.X264-DIMENSION-eng.srtsrt8b21205a48067b0e6d86c727826ff45e25574906878b3ef7c1bd19e002807672312273http://download.bsplayer-subtitles.com/download/file/28076723/d0e3ea29da442c64f175a2bd68986f874spaThe.Big.Bang.Theory.S07E05.720p.HDTV.X264-DIMENSION-spa.srtsrtec1c2fe9da4c6cd684e937b38690fafe25574906878b3ef7c1bd19e002983389512367http://download.bsplayer-subtitles.com/download/file/29833895/d0e3ea29da442c64f175a2bd68986f874engThe.Big.Bang.Theory.S07E05.720p.HDTV.X264-DIMENSION-eng.srtsrt272731ae19b4adda04d7d3decdcad82825574906878b3ef7c1bd19e003017276612307http://download.bsplayer-subtitles.com/download/file/30172766/d0e3ea29da442c64f175a2bd68986f874engThe.Big.Bang.Theory.S07E05.720p.HDTV.X264-DIMENSION-eng.srtsrtdaa43cd209b2861fd07fb3f91d18971325574906878b3ef7c1bd19e002342693712341http://download.bsplayer-subtitles.com/download/file/23426937/d0e3ea29da442c64f175a2bd68986f874engThe.Big.Bang.Theory.S07E05.720p.HDTV.X264-DIMENSION-eng.srtsrt9db63d1206e31bddbd06858f32ac612825574906878b3ef7c1bd19e002289071412354http://download.bsplayer-subtitles.com/download/file/22890714/d0e3ea29da442c64f175a2bd68986f874engThe.Big.Bang.Theory.S07E05.720p.HDTV.X264-DIMENSION-eng.srtsrt49cc1331f90dde6e48f6246b526e203825574906878b3ef7c1bd19e001673283011479http://download.bsplayer-subtitles.com/download/file/16732830/d0e3ea29da442c64f175a2bd68986f874spaThe.Big.Bang.Theory.S07E05.720p.HDTV.X264-DIMENSION@TheSubFactory.srtsrtbfd1670b014df5235c93bb9d09a22c6425574906878b3ef7c1bd19e001786764312569http://download.bsplayer-subtitles.com/download/file/17867643/d0e3ea29da442c64f175a2bd68986f874engThe.Big.Bang.Theory.S07E05.720p.HDTV.X264-DIMENSION.srtsrt37844d7fef947e133edd3be91418457a25574906878b3ef7c1bd19e001787462512231http://download.bsplayer-subtitles.com/download/file/17874625/d0e3ea29da442c64f175a2bd68986f874engThe + Big Bang Theory - S07E05 - The Workplace Proximity.en.srtsrtebae3848ef42c0ccfac52557a4f047b125574906878b3ef7c1bd19e001809999710664http://download.bsplayer-subtitles.com/download/file/18099997/d0e3ea29da442c64f175a2bd68986f874spaTBBT_07x05_(Sub_Spanish).srtsrt174f34a0911af4ef7e2e258787bf655425574906878b3ef7c1bd19e001852580612174http://download.bsplayer-subtitles.com/download/file/18525806/d0e3ea29da442c64f175a2bd68986f874spa705.srtsrtb7bdd466b3e8056574e2546526c8d4be25574906878b3ef7c1bd19e001972000712166http://download.bsplayer-subtitles.com/download/file/19720007/d0e3ea29da442c64f175a2bd68986f874spaThe.Big.Bang.Theory.S07E05.720p.HDTV.X264-DIMENSION-spa.srtsrt38fd2d9fd3fba19b62486675b417124e25574906878b3ef7c1bd19e002013544812337http://download.bsplayer-subtitles.com/download/file/20135448/d0e3ea29da442c64f175a2bd68986f874engThe.Big.Bang.Theory.S07E05.720p.HDTV.X264-DIMENSION-eng.srtsrt01bcbdd8ea9a72e6fef250718cfe61ac25574906878b3ef7c1bd19e002111108112244http://download.bsplayer-subtitles.com/download/file/21111081/d0e3ea29da442c64f175a2bd68986f874spaThe.Big.Bang.Theory.S07E05.720p.HDTV.X264-DIMENSION-spa.srtsrt1ecdad6c681f35528246aac50c9b5aa425574906878b3ef7c1bd19e002216389012367http://download.bsplayer-subtitles.com/download/file/22163890/d0e3ea29da442c64f175a2bd68986f874engThe.Big.Bang.Theory.S07E05.720p.HDTV.X264-DIMENSION-eng.srtsrtb18c9bcbb866027be5d77a9f11b9e55e25574906878b3ef7c1bd19e002229674111517http://download.bsplayer-subtitles.com/download/file/22296741/d0e3ea29da442c64f175a2bd68986f874spa05.srtsrt5ad305833b7e50cfd8d894699bf70a2a25574906878b3ef7c1bd19e003036302312588http://download.bsplayer-subtitles.com/download/file/30363023/d0e3ea29da442c64f175a2bd68986f874engThe.Big.Bang.Theory.S07E05.720p.HDTV.X264-DIMENSION-eng.srtsrt159260fb0d57e369e5f066df8224749225574906878b3ef7c1bd19e001644204012329http://download.bsplayer-subtitles.com/download/file/16442040/d0e3ea29da442c64f175a2bd68986f874engThe.Big.Bang.Theory.S07E05.HDTV.x264-LOL.srtsrt616e8aef0190581171f67679ac5244d425574906878b3ef7c1bd19e001644328511517http://download.bsplayer-subtitles.com/download/file/16443285/d0e3ea29da442c64f175a2bd68986f874spaThe.Big.Bang.Theory.S07E05.720p.HDTV.X264-DIMENSION@TheSubFactory.srtsrt5ad305833b7e50cfd8d894699bf70a2a25574906878b3ef7c1bd19e001644328912463http://download.bsplayer-subtitles.com/download/file/16443289/d0e3ea29da442c64f175a2bd68986f874engThe + Big Bang Theory - 07x05 - The Workplace Proximity.DIMENSION.English.HI.C.orig.srtsrt47c16fb6a06de849075ad433dad0c2b425574906878b3ef7c1bd19e001644330112218http://download.bsplayer-subtitles.com/download/file/16443301/d0e3ea29da442c64f175a2bd68986f874spaThe + Big Bang Theory 7x05 - The Workplace Proximity (Espa\xF1ol (Latinoam\xE9rica)).srtsrtb0ef6be4c4d6c555f7e8e2eebbf29ccf25574906878b3ef7c1bd19e001644330712217http://download.bsplayer-subtitles.com/download/file/16443307/d0e3ea29da442c64f175a2bd68986f874spaThe + Big Bang Theory 7x05 - The Workplace Proximity (Espa\xF1ol (Latinoam\xE9rica)).srtsrt57e1d2dc4796ecef5d248841e74fd66c25574906878b3ef7c1bd19e001644330912220http://download.bsplayer-subtitles.com/download/file/16443309/d0e3ea29da442c64f175a2bd68986f874spaThe + Big Bang Theory 7x05 - The Workplace Proximity (Espa\xF1ol (Latinoam\xE9rica)).srtsrt8a9b488101048ab9aa236951506c38ed25574906878b3ef7c1bd19e001644331212224http://download.bsplayer-subtitles.com/download/file/16443312/d0e3ea29da442c64f175a2bd68986f874spaThe + Big Bang Theory 7x05 - The Workplace Proximity (Espa\xF1ol (Latinoam\xE9rica)) + (1).srtsrt8262fee4c49b31bfcf78d628f62d70e125574906878b3ef7c1bd19e001644352012230http://download.bsplayer-subtitles.com/download/file/16443520/d0e3ea29da442c64f175a2bd68986f874spaThe.Big.Bang.Theory.S07E05.720p.HDTV.X264-DIMENSION.srtsrt7aa480288438a857fe518c12e416749725574906878b3ef7c1bd19e001644360212219http://download.bsplayer-subtitles.com/download/file/16443602/d0e3ea29da442c64f175a2bd68986f874spaThe + Big Bang Theory 7x05 - The Workplace Proximity (Espa\xF1ol (Latinoam\xE9rica)).srtsrt785f84688d572f0d78ad0a80733bfdef25574906878b3ef7c1bd19e001644378412473http://download.bsplayer-subtitles.com/download/file/16443784/d0e3ea29da442c64f175a2bd68986f874engThe.Big.Bang.Theory.S07E05.720p.HDTV.X264-DIMENSION.srtsrt054fb7b0d83971c12baedb651693da0f25574906878b3ef7c1bd19e001644382612218http://download.bsplayer-subtitles.com/download/file/16443826/d0e3ea29da442c64f175a2bd68986f874spaThe + Big Bang Theory 7x05 - The Workplace Proximity (Espa\xF1ol (Latinoam\xE9rica)).srtsrtbc4b3412b10da87017a95910a22d1f0125574906878b3ef7c1bd19e001644319812219http://download.bsplayer-subtitles.com/download/file/16443198/d0e3ea29da442c64f175a2bd68986f874spaThe.Big.Bang.Theory.S07E05.720p.HDTV.X264-DIMENSION.srtsrt14337ef0288db1dd2ec94ca4400be5ae25574906878b3ef7c1bd19e001644315212162http://download.bsplayer-subtitles.com/download/file/16443152/d0e3ea29da442c64f175a2bd68986f874spaThe + Big Bang Theory 7x05 - The Workplace Proximity (Espa\xF1ol (Espa\xF1a)).srtsrt50f0a4393e9bd9a84504e17d1137a5c725574906878b3ef7c1bd19e001644251212192http://download.bsplayer-subtitles.com/download/file/16442512/d0e3ea29da442c64f175a2bd68986f874spaThe.Big.Bang.Theory.S07E05.720p.HDTV.X264-DIMENSION.srtsrt69af19354403687bd0e7c6ac32f198a925574906878b3ef7c1bd19e001644254012254http://download.bsplayer-subtitles.com/download/file/16442540/d0e3ea29da442c64f175a2bd68986f874engThe + Big Bang Theory - 07x05 - The Workplace Proximity.DIMENSION.English.C.orig.Addic7ed.com.srtsrtf18de9888230bcd71be8bc7be3add16725574906878b3ef7c1bd19e001644255612193http://download.bsplayer-subtitles.com/download/file/16442556/d0e3ea29da442c64f175a2bd68986f874spaThe.Big.Bang.Theory.S07E05.720p.HDTV.X264-DIMENSION.srtsrtc774d31d9f3831f8be40275782a658e425574906878b3ef7c1bd19e001644271712184http://download.bsplayer-subtitles.com/download/file/16442717/d0e3ea29da442c64f175a2bd68986f874spaThe + Big Bang Theory 7x05 - The Workplace Proximity (Espa\xF1ol (Espa\xF1a)).srtsrte163b88c265f001e31235af07e8285f525574906878b3ef7c1bd19e001644283912216http://download.bsplayer-subtitles.com/download/file/16442839/d0e3ea29da442c64f175a2bd68986f874spaThe + Big Bang Theory 7x05 - The Workplace Proximity.srtsrtceebbe4653f63cd4ee90e68a194b3f7c25574906878b3ef7c1bd19e001644295212227http://download.bsplayer-subtitles.com/download/file/16442952/d0e3ea29da442c64f175a2bd68986f874spaThe + Big Bang Theory 7x05 - The Workplace Proximity (Espa\xF1ol (Latinoam\xE9rica)).srtsrta42de13ae275401d61a0fe5381b8bbfd25574906878b3ef7c1bd19e001644299412220http://download.bsplayer-subtitles.com/download/file/16442994/d0e3ea29da442c64f175a2bd68986f874spaThe + Big Bang Theory 7x05 - The Workplace Proximity (Espa\xF1ol (Latinoam\xE9rica)).srtsrt085bf756b85477ab39de29bc96d5412625574906878b3ef7c1bd19e001644303112222http://download.bsplayer-subtitles.com/download/file/16443031/d0e3ea29da442c64f175a2bd68986f874spaThe + Big Bang Theory 7x05 - The Workplace Proximity (Espa\xF1ol (Latinoam\xE9rica)).srtsrt9eac6b79d6a088d31a8c1f721e63d54a25574906878b3ef7c1bd19e001644310512223http://download.bsplayer-subtitles.com/download/file/16443105/d0e3ea29da442c64f175a2bd68986f874spaThe + Big Bang Theory 7x05 - The Workplace Proximity.srtsrt9147c8353976d9ccb1a3a575b231189225574906878b3ef7c1bd19e004828357611635http://download.bsplayer-subtitles.com/download/file/48283576/d0e3ea29da442c64f175a2bd68986f874spaThe.Big.Bang.Theory.S07E05.720p.HDTV.X264-DIMENSION.srtsrt26e5dd43c12e53ba6bbd9562c47e42c225574906878b3ef7c1bd19e001644388212180http://download.bsplayer-subtitles.com/download/file/16443882/d0e3ea29da442c64f175a2bd68986f874engThe + Big Bang Theory 7x05 - The Workplace Proximity.srtsrtdfeb5fc37248be3c90cac3dbbe99d4cc25574906878b3ef7c1bd19e001644388612254http://download.bsplayer-subtitles.com/download/file/16443886/d0e3ea29da442c64f175a2bd68986f874engThe.Big.Bang.Theory.S07E05.720p.HDTV.X264-DIMENSION.srtsrt5d7c46b9ef264b47b556125cd3736c1225574906878b3ef7c1bd19e001644389312217http://download.bsplayer-subtitles.com/download/file/16443893/d0e3ea29da442c64f175a2bd68986f874spaThe + Big Bang Theory 7x05 - The Workplace Proximity (Espa\xF1ol (Latinoam\xE9rica)).srtsrt391df8bdd13a3f8a44036576b886f18e25574906878b3ef7c1bd19e001644651712256http://download.bsplayer-subtitles.com/download/file/16446517/d0e3ea29da442c64f175a2bd68986f874engThe.Big.Bang.Theory.S07E05.The.Workplace.Proximity.HD.TV-DIMENSION.srtsrt5b66fa465a48bb15bc10c8c2bb8df5ee25574906878b3ef7c1bd19e001644682511943http://download.bsplayer-subtitles.com/download/file/16446825/d0e3ea29da442c64f175a2bd68986f874spaThe.Big.Bang.Theory.S07E05.720p.HDTV.X264-DIMENSION.srtsrtf58c13b59c1a7b4ce1b9ee40fe7bfb3625574906878b3ef7c1bd19e001644728912563http://download.bsplayer-subtitles.com/download/file/16447289/d0e3ea29da442c64f175a2bd68986f874engThe.Big.Bang.Theory.S07E05.HDTV.x264-LOL.HI.srtsrtdfb48033b21d4876dc9a40d62702e61525574906878b3ef7c1bd19e001644742112246http://download.bsplayer-subtitles.com/download/file/16447421/d0e3ea29da442c64f175a2bd68986f874engThe.Big.Bang.Theory.S07E05.720p.HDTV.X264-DIMENSION.srtsrt804b027637467cb5d809ef72ea76ff8525574906878b3ef7c1bd19e001644780612221http://download.bsplayer-subtitles.com/download/file/16447806/d0e3ea29da442c64f175a2bd68986f874spaThe + Big Bang Theory 7x05 - The Workplace Proximity (Espa\xF1ol (Latinoam\xE9rica)).srtsrt44304e11132cb6e14dc13057ccc90e3725574906878b3ef7c1bd19e001644794212242http://download.bsplayer-subtitles.com/download/file/16447942/d0e3ea29da442c64f175a2bd68986f874spaThe + Big Bang Theory 7x05 - The Workplace Proximity (Espa\xF1ol (Latinoam\xE9rica)).srtsrt862202bb9172b0b79452b228e21b719725574906878b3ef7c1bd19e001644799512245http://download.bsplayer-subtitles.com/download/file/16447995/d0e3ea29da442c64f175a2bd68986f874spaThe + Big Bang Theory 7x05 - The Workplace Proximity (Espa\xF1ol (Latinoam\xE9rica)).srtsrt9115139c9ddd8ab7c97957c501a4861725574906878b3ef7c1bd19e001644829410770http://download.bsplayer-subtitles.com/download/file/16448294/d0e3ea29da442c64f175a2bd68986f874engThe.Big.Bang.Theory.S05E07.720p.HDTV.x264-IMMERSE.srtsrt65408e35de4b50a87c1fb3d6306104d225574906878b3ef7c1bd19e001644866012326http://download.bsplayer-subtitles.com/download/file/16448660/d0e3ea29da442c64f175a2bd68986f874engThe.Big.Bang.Theory.S07E05.480p.HDTV.x264-mSD.srtsrt2f99daeb24d4ae4f69b310d003952e5825574906878b3ef7c1bd19e001644881611574http://download.bsplayer-subtitles.com/download/file/16448816/d0e3ea29da442c64f175a2bd68986f874spaTBBT0705.264LOL.wWw.Darkville.Com.Mx.srtsrtd7465e8768e8796ed86d4ffd82bc63b425574906878b3ef7c1bd19e001644625212317http://download.bsplayer-subtitles.com/download/file/16446252/d0e3ea29da442c64f175a2bd68986f874engThe.Big.Bang.Theory.S07E05.HDTV.XviD-AFG-eng(1).srtsrt46c99c3a3fbdd93a043f0934ec898a3325574906878b3ef7c1bd19e001644602212255http://download.bsplayer-subtitles.com/download/file/16446022/d0e3ea29da442c64f175a2bd68986f874engThe.Big.Bang.Theory.S07E05.HDTV.x264-LOL.srtsrt33950b79178e868c826f53bcd3bb3dfb25574906878b3ef7c1bd19e001644411212280http://download.bsplayer-subtitles.com/download/file/16444112/d0e3ea29da442c64f175a2bd68986f874engThe + Big Bang Theory - 7x05 - Episode 5.HDTV.LOL.en.srtsrte0b2c19d20e21a048c4f873b311822b325574906878b3ef7c1bd19e001644431511816http://download.bsplayer-subtitles.com/download/file/16444315/d0e3ea29da442c64f175a2bd68986f874engThe + Big Bang Theory - 07x05 - The Workplace Proximity.srtsrta4356dbf8286bd6c1aa428fd26c1e3fa25574906878b3ef7c1bd19e001644472012163http://download.bsplayer-subtitles.com/download/file/16444720/d0e3ea29da442c64f175a2bd68986f874spaThe + Big Bang Theory 7x05 - The Workplace Proximity (Espa\xF1ol (Espa\xF1a)) (1).srtsrt8d5f773a6ae6d9b450ab3a6bcb59c4ab25574906878b3ef7c1bd19e001644493812167http://download.bsplayer-subtitles.com/download/file/16444938/d0e3ea29da442c64f175a2bd68986f874spaThe + Big Bang Theory 7x05 - The Workplace Proximity (Espa\xF1ol (Espa\xF1a)).srtsrt8396ed52e585038ba08de939b163c42625574906878b3ef7c1bd19e001644497412562http://download.bsplayer-subtitles.com/download/file/16444974/d0e3ea29da442c64f175a2bd68986f874engThe + Big Bang Theory Season 7 Episode 5 -The Workplace Proximity-eng.srtsrt834610079869b1cdce55f91877af9c5c25574906878b3ef7c1bd19e001644529712174http://download.bsplayer-subtitles.com/download/file/16445297/d0e3ea29da442c64f175a2bd68986f874spaThe + Big Bang Theory 7x05 - The Workplace Proximity (Espa\xF1ol (Espa\xF1a)).srtsrtb7bdd466b3e8056574e2546526c8d4be25574906878b3ef7c1bd19e001644530912165http://download.bsplayer-subtitles.com/download/file/16445309/d0e3ea29da442c64f175a2bd68986f874spaThe.Big.Bang.Theory.S07E05.720p.HDTV.X264-DIMENSION.srtsrtb34290118f4f0b37640bb092db989d6325574906878b3ef7c1bd19e001644552112213http://download.bsplayer-subtitles.com/download/file/16445521/d0e3ea29da442c64f175a2bd68986f874spaThe + Big Bang Theory - S07 - 05 - The Workplace Proximity.srtsrt7504c17187c04639933648f3565e651925574906878b3ef7c1bd19e001644569512347http://download.bsplayer-subtitles.com/download/file/16445695/d0e3ea29da442c64f175a2bd68986f874engThe.Big.Bang.Theory.S07E05.Episode.5.HDTV.LOL.en.srtsrtbd64c6d80cd498a73a5df1359c40c65a25574906878b3ef7c1bd19e001644596212210http://download.bsplayer-subtitles.com/download/file/16445962/d0e3ea29da442c64f175a2bd68986f874spaThe + Big Bang Theory 7x05 - The Workplace Proximity (Espa\xF1ol (Latinoam\xE9rica)).srtsrt5b96b85aed251dbfd81e55fafef41e7a25574906878b3ef7c1bd19e00\n" + headers: + Connection: + - close + Content-Encoding: + - gzip + Content-Length: + - '5288' + Content-Type: + - text/xml; charset=utf-8 + Date: + - Tue, 30 Jul 2024 22:26:24 GMT + Server: + - Apache/2.4.59 (Debian) + Vary: + - Accept-Encoding + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - BSPlayer/2.x (1022.12360) + method: GET + uri: http://download.bsplayer-subtitles.com/download/file/16442520/d0e3ea29da442c64f175a2bd68986f874 + response: + body: + string: !!binary | + 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 + headers: + Access-Control-Allow-Methods: + - '*' + Access-Control-Allow-Orgin: + - '*' + Connection: + - Keep-Alive + Content-Description: + - File Transfer + Content-Disposition: + - attachment; filename="39accdcb8a252d91b4af297c430db2ea.gz" + Content-Length: + - '12185' + Content-Type: + - application/octet-stream + Date: + - Tue, 30 Jul 2024 22:26:24 GMT + Keep-Alive: + - timeout=5, max=100 + Server: + - Apache/2.4.59 (Debian) + status: + code: 200 + message: OK +- request: + body: ' + + 0e3ea29da442c64f175a2bd68986f874' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - close + Content-Length: + - '523' + Content-Type: + - text/xml; charset=utf-8 + SOAPAction: + - '"http://api.bsplayer-subtitles.com/v1.php#logOut"' + User-Agent: + - BSPlayer/2.x (1022.12360) + method: POST + uri: http://s1.api.bsplayer-subtitles.com/v1.php + response: + body: + string: ' + + 200OK0 + + ' + headers: + Connection: + - close + Content-Encoding: + - gzip + Content-Length: + - '315' + Content-Type: + - text/xml; charset=utf-8 + Date: + - Tue, 30 Jul 2024 22:26:25 GMT + Server: + - Apache/2.4.59 (Debian) + Vary: + - Accept-Encoding + status: + code: 200 + message: OK +version: 1 diff --git a/tests/cassettes/bsplayer/test_list_subtitles_hash.yaml b/tests/cassettes/bsplayer/test_list_subtitles_hash.yaml new file mode 100644 index 00000000..2bfa32cc --- /dev/null +++ b/tests/cassettes/bsplayer/test_list_subtitles_hash.yaml @@ -0,0 +1,203 @@ +interactions: +- request: + body: ' + + BSPlayer + v2.67' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - close + Content-Length: + - '543' + Content-Type: + - text/xml; charset=utf-8 + SOAPAction: + - '"http://api.bsplayer-subtitles.com/v1.php#logIn"' + User-Agent: + - BSPlayer/2.x (1022.12360) + method: POST + uri: http://s1.api.bsplayer-subtitles.com/v1.php + response: + body: + string: ' + + 200OK6a81a6dba49ad9217bd0ec3834915f43 + + ' + headers: + Connection: + - close + Content-Encoding: + - gzip + Content-Length: + - '344' + Content-Type: + - text/xml; charset=utf-8 + Date: + - Tue, 30 Jul 2024 22:26:24 GMT + Server: + - Apache/2.4.59 (Debian) + Vary: + - Accept-Encoding + status: + code: 200 + message: OK +- request: + body: ' + + 6a81a6dba49ad9217bd0ec3834915f435b8f8f4e41ccb21e7033732714deu,fra*' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - close + Content-Length: + - '663' + Content-Type: + - text/xml; charset=utf-8 + SOAPAction: + - '"http://api.bsplayer-subtitles.com/v1.php#searchSubtitles"' + User-Agent: + - BSPlayer/2.x (1022.12360) + method: POST + uri: http://s1.api.bsplayer-subtitles.com/v1.php + response: + body: + string: ' + + 200OK01644828432914http://download2.bsplayer-subtitles.com/download/file/16448284/d6a81a6dba49ad9217bd0ec3834915f43freMan.Of.Steel.2013.1080p.BluRay.AVC.DTS-HD.MA.7.1-TRUEDEF.Fr.srtsrt7054beaba53a11728a66cf4ddf17e99907708285b8f8f4e41ccb21e001645664637758http://download2.bsplayer-subtitles.com/download/file/16456646/d6a81a6dba49ad9217bd0ec3834915f43gerMan.of.Steel.German.720p.BluRay.x264-EXQUiSiTE.srtsrt987cc67a38e2c0838fa47344325026c307708285b8f8f4e41ccb21e001645670232585http://download2.bsplayer-subtitles.com/download/file/16456702/d6a81a6dba49ad9217bd0ec3834915f43freman.of.steel.2013.720p.bluray.x264-felony.srtsrt2400948861b6f74da73fb2b720f776f807708285b8f8f4e41ccb21e002123027832582http://download2.bsplayer-subtitles.com/download/file/21230278/d6a81a6dba49ad9217bd0ec3834915f43freGinie-ManOfSteal-fre.srtsrt19a5e0f72e40eb953c2ea3d1195ce10f07708285b8f8f4e41ccb21e00 + + ' + headers: + Connection: + - close + Content-Encoding: + - gzip + Content-Length: + - '919' + Content-Type: + - text/xml; charset=utf-8 + Date: + - Tue, 30 Jul 2024 22:26:24 GMT + Server: + - Apache/2.4.59 (Debian) + Vary: + - Accept-Encoding + status: + code: 200 + message: OK +- request: + body: ' + + 6a81a6dba49ad9217bd0ec3834915f43' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - close + Content-Length: + - '523' + Content-Type: + - text/xml; charset=utf-8 + SOAPAction: + - '"http://api.bsplayer-subtitles.com/v1.php#logOut"' + User-Agent: + - BSPlayer/2.x (1022.12360) + method: POST + uri: http://s1.api.bsplayer-subtitles.com/v1.php + response: + body: + string: ' + + 200OK0 + + ' + headers: + Connection: + - close + Content-Encoding: + - gzip + Content-Length: + - '317' + Content-Type: + - text/xml; charset=utf-8 + Date: + - Tue, 30 Jul 2024 22:26:24 GMT + Server: + - Apache/2.4.59 (Debian) + Vary: + - Accept-Encoding + status: + code: 200 + message: OK +version: 1 diff --git a/tests/cassettes/bsplayer/test_login.yaml b/tests/cassettes/bsplayer/test_login.yaml new file mode 100644 index 00000000..bcdf1158 --- /dev/null +++ b/tests/cassettes/bsplayer/test_login.yaml @@ -0,0 +1,57 @@ +interactions: +- request: + body: ' + + BSPlayer + v2.67' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - close + Content-Length: + - '543' + Content-Type: + - text/xml; charset=utf-8 + SOAPAction: + - '"http://api.bsplayer-subtitles.com/v1.php#logIn"' + User-Agent: + - BSPlayer/2.x (1022.12360) + method: POST + uri: http://s1.api.bsplayer-subtitles.com/v1.php + response: + body: + string: ' + + 200OKef31f9a83288e0f7ab4e17a1a91c9e50 + + ' + headers: + Connection: + - close + Content-Encoding: + - gzip + Content-Length: + - '340' + Content-Type: + - text/xml; charset=utf-8 + Date: + - Tue, 30 Jul 2024 22:26:24 GMT + Server: + - Apache/2.4.59 (Debian) + Vary: + - Accept-Encoding + status: + code: 200 + message: OK +version: 1 diff --git a/tests/cassettes/bsplayer/test_logout.yaml b/tests/cassettes/bsplayer/test_logout.yaml new file mode 100644 index 00000000..7e0e64dd --- /dev/null +++ b/tests/cassettes/bsplayer/test_logout.yaml @@ -0,0 +1,111 @@ +interactions: +- request: + body: ' + + BSPlayer + v2.67' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - close + Content-Length: + - '543' + Content-Type: + - text/xml; charset=utf-8 + SOAPAction: + - '"http://api.bsplayer-subtitles.com/v1.php#logIn"' + User-Agent: + - BSPlayer/2.x (1022.12360) + method: POST + uri: http://s1.api.bsplayer-subtitles.com/v1.php + response: + body: + string: ' + + 200OK4be96047b18a1fe55e3e89a243ec2d8b + + ' + headers: + Connection: + - close + Content-Encoding: + - gzip + Content-Length: + - '341' + Content-Type: + - text/xml; charset=utf-8 + Date: + - Tue, 30 Jul 2024 22:26:24 GMT + Server: + - Apache/2.4.59 (Debian) + Vary: + - Accept-Encoding + status: + code: 200 + message: OK +- request: + body: ' + + 4be96047b18a1fe55e3e89a243ec2d8b' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - close + Content-Length: + - '523' + Content-Type: + - text/xml; charset=utf-8 + SOAPAction: + - '"http://api.bsplayer-subtitles.com/v1.php#logOut"' + User-Agent: + - BSPlayer/2.x (1022.12360) + method: POST + uri: http://s1.api.bsplayer-subtitles.com/v1.php + response: + body: + string: ' + + 200OK0 + + ' + headers: + Connection: + - close + Content-Encoding: + - gzip + Content-Length: + - '315' + Content-Type: + - text/xml; charset=utf-8 + Date: + - Tue, 30 Jul 2024 22:26:24 GMT + Server: + - Apache/2.4.59 (Debian) + Vary: + - Accept-Encoding + status: + code: 200 + message: OK +version: 1 diff --git a/tests/cassettes/bsplayer/test_query_hash_size.yaml b/tests/cassettes/bsplayer/test_query_hash_size.yaml new file mode 100644 index 00000000..d173335a --- /dev/null +++ b/tests/cassettes/bsplayer/test_query_hash_size.yaml @@ -0,0 +1,359 @@ +interactions: +- request: + body: ' + + BSPlayer + v2.67' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - close + Content-Length: + - '543' + Content-Type: + - text/xml; charset=utf-8 + SOAPAction: + - '"http://api.bsplayer-subtitles.com/v1.php#logIn"' + User-Agent: + - BSPlayer/2.x (1022.12360) + method: POST + uri: http://s1.api.bsplayer-subtitles.com/v1.php + response: + body: + string: ' + + 200OK78d6171c89ac7d2ce35d8b75a69f2bc4 + + ' + headers: + Connection: + - close + Content-Encoding: + - gzip + Content-Length: + - '342' + Content-Type: + - text/xml; charset=utf-8 + Date: + - Tue, 30 Jul 2024 22:26:24 GMT + Server: + - Apache/2.4.59 (Debian) + Vary: + - Accept-Encoding + status: + code: 200 + message: OK +- request: + body: ' + + 78d6171c89ac7d2ce35d8b75a69f2bc45b8f8f4e41ccb21e7033732714spa*' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - close + Content-Length: + - '659' + Content-Type: + - text/xml; charset=utf-8 + SOAPAction: + - '"http://api.bsplayer-subtitles.com/v1.php#searchSubtitles"' + User-Agent: + - BSPlayer/2.x (1022.12360) + method: POST + uri: http://s1.api.bsplayer-subtitles.com/v1.php + response: + body: + string: ' + + 200OK01645940231273http://download.bsplayer-subtitles.com/download/file/16459402/d78d6171c89ac7d2ce35d8b75a69f2bc4spaMan of Steel + 2013 720p BluRay x264 YIFY.ESP@TheSubFactory.Net.srtsrt1d379cd01d85cb723209626e5262b674507708285b8f8f4e41ccb21e001640607830316http://download.bsplayer-subtitles.com/download/file/16406078/d78d6171c89ac7d2ce35d8b75a69f2bc4spaman.of.steel.2013.720p.bluray.x264-felony.srtsrt2d72ac0adff113b80fb9f6934459bfe007708285b8f8f4e41ccb21e001648012536130http://download.bsplayer-subtitles.com/download/file/16480125/d78d6171c89ac7d2ce35d8b75a69f2bc4spaman.of.steel.2013.720p.bluray.x264-felony.srtsrtd915faa6364c6782c48732803cf82d5907708285b8f8f4e41ccb21e001651162634755http://download.bsplayer-subtitles.com/download/file/16511626/d78d6171c89ac7d2ce35d8b75a69f2bc4spaman.of.steel.2013.720p.bluray.x264-felony.srtsrt49a15ef8f4972a6ec8b08a5921a3786f07708285b8f8f4e41ccb21e001661516438829http://download.bsplayer-subtitles.com/download/file/16615164/d78d6171c89ac7d2ce35d8b75a69f2bc4spaMan.Of.Steel.2013.720p.BluRay.x264-Felony.srtsrt9bf0edf8fec7fa04d54e12cf046a80f907708285b8f8f4e41ccb21e001669074534772http://download.bsplayer-subtitles.com/download/file/16690745/d78d6171c89ac7d2ce35d8b75a69f2bc4spa5187_ES.srtsrt5e8685ae4dfb3a531658ba839f52946107708285b8f8f4e41ccb21e001683359134905http://download.bsplayer-subtitles.com/download/file/16833591/d78d6171c89ac7d2ce35d8b75a69f2bc4spaman.of.steel.2013.720p.bluray.x264-felony-spa.srtsrtfbb722cac90d84d4ccf0f502eb17332307708285b8f8f4e41ccb21e001692039131351http://download.bsplayer-subtitles.com/download/file/16920391/d78d6171c89ac7d2ce35d8b75a69f2bc4spaman.of.steel.2013.720p.bluray.x264-felony-spa.srtsrt6219a77ca90360d7c686f7091cf50d1707708285b8f8f4e41ccb21e001693599040397http://download.bsplayer-subtitles.com/download/file/16935990/d78d6171c89ac7d2ce35d8b75a69f2bc4spaman.of.steel.2013.720p.bluray.x264-felony.srtsrta05dff11b79951fae2eee140b2d20ce707708285b8f8f4e41ccb21e001740640034320http://download.bsplayer-subtitles.com/download/file/17406400/d78d6171c89ac7d2ce35d8b75a69f2bc4spaMan of Steel + [Felony].srtsrtfc83fb3ff2241be1f6b1eb5cef2651cd07708285b8f8f4e41ccb21e001647953134561http://download.bsplayer-subtitles.com/download/file/16479531/d78d6171c89ac7d2ce35d8b75a69f2bc4spaman.of.steel.2013.720p.bluray.x264-felony-spa.srtsrtce6f0fd8d5198e96c3b1e0bf2136b8c507708285b8f8f4e41ccb21e001647843030228http://download.bsplayer-subtitles.com/download/file/16478430/d78d6171c89ac7d2ce35d8b75a69f2bc4spacd1.srtsrt444d407f7633bc9d6ffb45c74d7ec88b07708285b8f8f4e41ccb21e001641626232183http://download.bsplayer-subtitles.com/download/file/16416262/d78d6171c89ac7d2ce35d8b75a69f2bc4spaMan Of Steel + [2013][720p][x264][BDRip].srtsrt7b6a1cd93660cc3c63397b2ffb95bfb207708285b8f8f4e41ccb21e001641813030411http://download.bsplayer-subtitles.com/download/file/16418130/d78d6171c89ac7d2ce35d8b75a69f2bc4spaman.of.steel.2013.720p.bluray.x264-felony-spa.srtsrt0f67aa55fbb8465068c7c0f97863738e07708285b8f8f4e41ccb21e001644317738591http://download.bsplayer-subtitles.com/download/file/16443177/d78d6171c89ac7d2ce35d8b75a69f2bc4spaman.of.steel.2013.720p.bluray.x264-felony.srtsrt2c7738333222451c5d3808d60937dd7e07708285b8f8f4e41ccb21e001646011138690http://download.bsplayer-subtitles.com/download/file/16460111/d78d6171c89ac7d2ce35d8b75a69f2bc4spaman.of.steel.2013.720p.bluray.x264-felony-spa.srtsrt8babd351c92c93757ff8dc25dada254707708285b8f8f4e41ccb21e001646194632319http://download.bsplayer-subtitles.com/download/file/16461946/d78d6171c89ac7d2ce35d8b75a69f2bc4spaman.of.steel.2013.720p.bluray.x264-felony-spa.srtsrtcacb0b869d7cbaac32b541d860896b8207708285b8f8f4e41ccb21e001647176038593http://download.bsplayer-subtitles.com/download/file/16471760/d78d6171c89ac7d2ce35d8b75a69f2bc4spaman.of.steel.2013.720p.bluray.x264-felony.srtsrt326059613db7e1ab2294bca76eda31b607708285b8f8f4e41ccb21e001647651934946http://download.bsplayer-subtitles.com/download/file/16476519/d78d6171c89ac7d2ce35d8b75a69f2bc4spaman.of.steel.2013.720p.bluray.x264-felony-spa.srtsrt146ff1447c050e6910799aaa2970270107708285b8f8f4e41ccb21e001647809634805http://download.bsplayer-subtitles.com/download/file/16478096/d78d6171c89ac7d2ce35d8b75a69f2bc4spaman.of.steel.2013.720p.bluray.x264-felony.srtsrta6b1db66c44cdc7460fb05d422f3b16d07708285b8f8f4e41ccb21e001758017940387http://download.bsplayer-subtitles.com/download/file/17580179/d78d6171c89ac7d2ce35d8b75a69f2bc4spaman.of.steel.2013.720p.bluray.x264-felony-spa(1)(2).srtsrt89351c9af2f5f33a97685ac88d80ffde07708285b8f8f4e41ccb21e00 + + ' + headers: + Connection: + - close + Content-Encoding: + - gzip + Content-Length: + - '1717' + Content-Type: + - text/xml; charset=utf-8 + Date: + - Tue, 30 Jul 2024 22:26:24 GMT + Server: + - Apache/2.4.59 (Debian) + Vary: + - Accept-Encoding + status: + code: 200 + message: OK +- request: + body: ' + + 78d6171c89ac7d2ce35d8b75a69f2bc4' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - close + Content-Length: + - '523' + Content-Type: + - text/xml; charset=utf-8 + SOAPAction: + - '"http://api.bsplayer-subtitles.com/v1.php#logOut"' + User-Agent: + - BSPlayer/2.x (1022.12360) + method: POST + uri: http://s1.api.bsplayer-subtitles.com/v1.php + response: + body: + string: ' + + 200OK0 + + ' + headers: + Connection: + - close + Content-Encoding: + - gzip + Content-Length: + - '315' + Content-Type: + - text/xml; charset=utf-8 + Date: + - Tue, 30 Jul 2024 22:26:24 GMT + Server: + - Apache/2.4.59 (Debian) + Vary: + - Accept-Encoding + status: + code: 200 + message: OK +version: 1 diff --git a/tests/conftest.py b/tests/conftest.py index 55900602..c98bd68f 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -37,6 +37,7 @@ def movies() -> dict[str, Movie]: year=2013, hashes={ 'napiprojekt': '6303e7ee6a835e9fcede9fb2fb00cb36', + 'bsplayer': '5b8f8f4e41ccb21e', 'opensubtitles': '5b8f8f4e41ccb21e', 'shooter': '314f454ab464775498ae6f1f5ad813a9;fdaa8b702d8936feba2122e93ba5c44f;' '0a6935e3436aa7db5597ef67a2c494e3;4d269733f36ddd49f71e92732a462fe5', @@ -104,6 +105,7 @@ def episodes() -> dict[str, Episode]: size=501910737, hashes={ 'napiprojekt': '6303e7ee6a835e9fcede9fb2fb00cb36', + 'bsplayer': '6878b3ef7c1bd19e', 'opensubtitles': '6878b3ef7c1bd19e', 'shooter': 'c13e0e5243c56d280064d344676fff94;cd4184d1c0c623735f6db90841ce15fc;' '3faefd72f92b63f2504269b4f484a377;8c68d1ef873afb8ba0cc9f97cbac41c1', @@ -130,6 +132,7 @@ def episodes() -> dict[str, Episode]: size=2142810931, hashes={ 'napiprojekt': '6303e7ee6a835e9fcede9fb2fb00cb36', + 'bsplayer': 'b850baa096976c22', 'opensubtitles': 'b850baa096976c22', 'shooter': 'b02d992c04ad74b31c252bd5a097a036;ef1b32f873b2acf8f166fc266bdf011a;' '82ce34a3bcee0c66ed3b26d900d31cca;78113770551f3efd1e2d4ec45898c59c', diff --git a/tests/providers/test_bsplayer.py b/tests/providers/test_bsplayer.py new file mode 100644 index 00000000..3b044884 --- /dev/null +++ b/tests/providers/test_bsplayer.py @@ -0,0 +1,121 @@ +import os + +import pytest +from babelfish import Language # type: ignore[import-untyped] +from subliminal.providers.bsplayer import BSPlayerProvider, BSPlayerSubtitle +from vcr import VCR # type: ignore[import-untyped] + +vcr = VCR( + path_transformer=lambda path: path + '.yaml', + record_mode=os.environ.get('VCR_RECORD_MODE', 'once'), + decode_compressed_response=True, + match_on=['method', 'scheme', 'host', 'port', 'path', 'query', 'body'], + cassette_library_dir=os.path.realpath(os.path.join('tests', 'cassettes', 'bsplayer')), +) + +SEARCH_URL = 'http://s1.api.bsplayer-subtitles.com/v1.php' + + +def test_get_matches_movie_hash(episodes): + subtitle = BSPlayerSubtitle( + subtitle_id='16442520', + size=12185, + page_link=None, + language=Language('spa'), + filename='The.Big.Bang.Theory.S07E05.720p.HDTV.X264-DIMENSION.srt', + subtitle_format='srt', + subtitle_hash='dbaf71fc665f83a716ae3f5daa62b7a0', + rating='5', + season=None, + episode=None, + encoding=None, + imdb_id='2557490', + imdb_rating=None, + movie_year=None, + movie_name=None, + movie_hash='6878b3ef7c1bd19e', + movie_size=0, + movie_fps=0, + ) + + matches = subtitle.get_matches(episodes['bbt_s07e05']) + assert matches == {'hash'} + + +@pytest.mark.integration() +@vcr.use_cassette +def test_login(): + provider = BSPlayerProvider(search_url=SEARCH_URL) + assert provider.token is None + provider.initialize() + assert provider.token is not None + + +@pytest.mark.integration() +@vcr.use_cassette +def test_logout(): + provider = BSPlayerProvider(search_url=SEARCH_URL) + provider.initialize() + provider.terminate() + assert provider.token is None + + +@pytest.mark.integration() +@vcr.use_cassette +def test_query_hash_size(movies): + video = movies['man_of_steel'] + languages = {Language('spa')} + expected_subtitles = { + '16406078', + '16416262', + '16418130', + '16443177', + '16459402', + '16460111', + '16461946', + '16471760', + '16476519', + '16478096', + '16478430', + '16479531', + '16480125', + '16511626', + '16615164', + '16690745', + '16833591', + '16920391', + '16935990', + '17406400', + '17580179', + } + with BSPlayerProvider(search_url=SEARCH_URL) as provider: + subtitles = provider.query(languages, file_hash=video.hashes['bsplayer'], size=video.size) + assert {subtitle.id for subtitle in subtitles} == expected_subtitles + assert {subtitle.language for subtitle in subtitles} == languages + + +@pytest.mark.integration() +@vcr.use_cassette +def test_list_subtitles_hash(movies): + video = movies['man_of_steel'] + languages = {Language('deu'), Language('fra')} + expected_subtitles = {'21230278', '16456646', '16448284', '16456702'} + + with BSPlayerProvider(search_url=SEARCH_URL) as provider: + subtitles = provider.list_subtitles(video, languages) + assert {subtitle.id for subtitle in subtitles} == expected_subtitles + assert {subtitle.language for subtitle in subtitles} == languages + + +@pytest.mark.integration() +@vcr.use_cassette +def test_download_subtitle(episodes): + video = episodes['bbt_s07e05'] + languages = {Language('eng'), Language('spa')} + with BSPlayerProvider(search_url=SEARCH_URL) as provider: + subtitles = provider.list_subtitles(video, languages) + assert len(subtitles) >= 1 + subtitle = subtitles[0] + provider.download_subtitle(subtitle) + assert subtitle.content is not None + assert subtitle.is_valid() is True diff --git a/tests/refiners/test_hash.py b/tests/refiners/test_hash.py index 4b943abf..047ab437 100644 --- a/tests/refiners/test_hash.py +++ b/tests/refiners/test_hash.py @@ -1,4 +1,13 @@ -from subliminal.refiners.hash import hash_opensubtitles, hash_thesubdb +from subliminal.refiners.hash import hash_bsplayer, hash_opensubtitles, hash_thesubdb + + +def test_hash_bsplayer(mkv): + assert hash_bsplayer(mkv['test1']) == '40b44a7096b71ec3' + + +def test_hash_bsplayer_too_small(tmpdir): + path = tmpdir.ensure('test_too_small.mkv') + assert hash_bsplayer(str(path)) is None def test_hash_opensubtitles(mkv): diff --git a/tests/test_core.py b/tests/test_core.py index 1e0efbb1..4cc996e9 100644 --- a/tests/test_core.py +++ b/tests/test_core.py @@ -86,7 +86,14 @@ def test_provider_pool_list_subtitles_provider(episodes): def test_provider_pool_list_subtitles(episodes): pool = ProviderPool() subtitles = pool.list_subtitles(episodes['bbt_s07e05'], {Language('eng')}) - assert sorted(subtitles) == ['gestdown', 'opensubtitles', 'opensubtitlescom', 'podnapisi', 'tvsubtitles'] # type: ignore[type-var,comparison-overlap] + assert sorted(subtitles) == [ # type: ignore[type-var,comparison-overlap] + 'bsplayer', + 'gestdown', + 'opensubtitles', + 'opensubtitlescom', + 'podnapisi', + 'tvsubtitles', + ] for provider in subtitles: assert provider_manager[provider].plugin.initialize.called assert provider_manager[provider].plugin.list_subtitles.called @@ -105,7 +112,14 @@ def test_async_provider_pool_list_subtitles_provider(episodes): def test_async_provider_pool_list_subtitles(episodes): pool = AsyncProviderPool() subtitles = pool.list_subtitles(episodes['bbt_s07e05'], {Language('eng')}) - assert sorted(subtitles) == ['gestdown', 'opensubtitles', 'opensubtitlescom', 'podnapisi', 'tvsubtitles'] # type: ignore[type-var,comparison-overlap] + assert sorted(subtitles) == [ # type: ignore[type-var,comparison-overlap] + 'bsplayer', + 'gestdown', + 'opensubtitles', + 'opensubtitlescom', + 'podnapisi', + 'tvsubtitles', + ] for provider in subtitles: assert provider_manager[provider].plugin.initialize.called assert provider_manager[provider].plugin.list_subtitles.called @@ -458,12 +472,12 @@ def test_list_subtitles_movie(movies): for name in ('addic7ed', 'napiprojekt', 'opensubtitlesvip', 'tvsubtitles'): assert not provider_manager[name].plugin.list_subtitles.called - for name in ('opensubtitles', 'opensubtitlescom', 'podnapisi'): + for name in ('bsplayer', 'opensubtitles', 'opensubtitlescom', 'podnapisi'): assert provider_manager[name].plugin.list_subtitles.called # test result assert len(subtitles) == 1 - assert sorted(subtitles[movies['man_of_steel']]) == ['opensubtitles', 'opensubtitlescom', 'podnapisi'] # type: ignore[type-var,comparison-overlap] + assert sorted(subtitles[movies['man_of_steel']]) == ['bsplayer', 'opensubtitles', 'opensubtitlescom', 'podnapisi'] # type: ignore[type-var,comparison-overlap] @pytest.mark.usefixtures('_mock_providers') @@ -477,12 +491,13 @@ def test_list_subtitles_episode(episodes): for name in ('addic7ed', 'napiprojekt', 'opensubtitlesvip'): assert not provider_manager[name].plugin.list_subtitles.called - for name in ('gestdown', 'opensubtitles', 'opensubtitlescom', 'podnapisi', 'tvsubtitles'): + for name in ('bsplayer', 'gestdown', 'opensubtitles', 'opensubtitlescom', 'podnapisi', 'tvsubtitles'): assert provider_manager[name].plugin.list_subtitles.called # test result assert len(subtitles) == 1 assert sorted(subtitles[episodes['bbt_s07e05']]) == [ # type: ignore[type-var,comparison-overlap] + 'bsplayer', 'gestdown', 'opensubtitles', 'opensubtitlescom', @@ -499,7 +514,7 @@ def test_list_subtitles_providers(episodes): subtitles = list_subtitles({video}, languages, providers=['opensubtitles']) # test providers - for name in ('addic7ed', 'napiprojekt', 'opensubtitlesvip', 'podnapisi', 'tvsubtitles'): + for name in ('addic7ed', 'bsplayer', 'napiprojekt', 'opensubtitlesvip', 'podnapisi', 'tvsubtitles'): assert not provider_manager[name].plugin.list_subtitles.called for name in ('opensubtitles',): @@ -521,12 +536,13 @@ def test_list_subtitles_episode_no_hash(episodes): for name in ('addic7ed', 'napiprojekt', 'opensubtitlesvip'): assert not provider_manager[name].plugin.list_subtitles.called - for name in ('gestdown', 'opensubtitles', 'podnapisi', 'tvsubtitles'): + for name in ('bsplayer', 'gestdown', 'opensubtitles', 'podnapisi', 'tvsubtitles'): assert provider_manager[name].plugin.list_subtitles.called # test result assert len(subtitles) == 1 assert sorted(subtitles[episodes['dallas_s01e03']]) == [ # type: ignore[type-var,comparison-overlap] + 'bsplayer', 'gestdown', 'opensubtitles', 'opensubtitlescom', @@ -544,7 +560,15 @@ def test_list_subtitles_no_language(episodes): subtitles = list_subtitles({video}, languages) # test providers - for name in ('addic7ed', 'napiprojekt', 'opensubtitles', 'opensubtitlesvip', 'podnapisi', 'tvsubtitles'): + for name in ( + 'addic7ed', + 'bsplayer', + 'napiprojekt', + 'opensubtitles', + 'opensubtitlesvip', + 'podnapisi', + 'tvsubtitles', + ): assert not provider_manager[name].plugin.list_subtitles.called # test result @@ -570,7 +594,7 @@ def test_download_subtitles(): download_subtitles(subtitles) # test providers - for name in ('addic7ed', 'napiprojekt', 'opensubtitles', 'opensubtitlesvip', 'podnapisi'): + for name in ('addic7ed', 'bsplayer', 'napiprojekt', 'opensubtitles', 'opensubtitlesvip', 'podnapisi'): assert not provider_manager[name].plugin.download_subtitle.called for name in ('tvsubtitles',): diff --git a/tests/test_extensions.py b/tests/test_extensions.py index b3bd931b..0770df7b 100644 --- a/tests/test_extensions.py +++ b/tests/test_extensions.py @@ -51,13 +51,14 @@ def test_registrable_extension_manager_internal_extension(): 'subliminal.test_providers', [ 'addic7ed = subliminal.providers.addic7ed:Addic7edProvider', + 'bsplayer = subliminal.providers.bsplayer:BSPlayerProvider', 'opensubtitles = subliminal.providers.opensubtitles:OpenSubtitlesProvider', 'podnapisi = subliminal.providers.podnapisi:PodnapisiProvider', 'tvsubtitles = subliminal.providers.tvsubtitles:TVsubtitlesProvider', ], ) - assert len(list(manager)) == 4 - assert len(manager.internal_extensions) == 4 + assert len(list(manager)) == 5 + assert len(manager.internal_extensions) == 5 def test_registrable_extension_manager_register(): @@ -65,12 +66,13 @@ def test_registrable_extension_manager_register(): 'subliminal.test_providers', [ 'addic7ed = subliminal.providers.addic7ed:Addic7edProvider', + 'bsplayer = subliminal.providers.bsplayer:BSPlayerProvider', 'opensubtitles = subliminal.providers.opensubtitles:OpenSubtitlesProvider', ], ) - assert len(list(manager)) == 2 - manager.register('de7cidda = subliminal.providers.addic7ed:Addic7edProvider') assert len(list(manager)) == 3 + manager.register('de7cidda = subliminal.providers.addic7ed:Addic7edProvider') + assert len(list(manager)) == 4 assert 'de7cidda' in manager.names() eps = manager.list_entry_points()