From b02bc074a846c8804d90cf329fa93bcb76de1942 Mon Sep 17 00:00:00 2001 From: Fernando Date: Tue, 4 Jul 2017 08:33:39 -0300 Subject: [PATCH] Rename subtitle provider from TheWiz > Wizdom (#2923) * Rename subtitle provider from TheWiz > Wizdom * Also change URL * Fix test * Update subtitles.py --- medusa/init/__init__.py | 2 +- .../{thewiz.py => wizdom.py} | 72 +++++++++--------- medusa/subtitles.py | 3 +- pytest.ini | 2 +- static/images/subtitles/thewiz.png | Bin 9910 -> 0 bytes static/images/subtitles/wizdom.png | Bin 0 -> 1760 bytes tests/test_subtitles.py | 2 +- 7 files changed, 40 insertions(+), 41 deletions(-) rename medusa/subtitle_providers/{thewiz.py => wizdom.py} (75%) delete mode 100644 static/images/subtitles/thewiz.png create mode 100644 static/images/subtitles/wizdom.png diff --git a/medusa/init/__init__.py b/medusa/init/__init__.py index 974369bbe4..ca75938640 100644 --- a/medusa/init/__init__.py +++ b/medusa/init/__init__.py @@ -140,7 +140,7 @@ def _configure_subliminal(): 'itasa = {basename}.subtitle_providers.itasa:ItaSAProvider'.format(basename=basename), 'legendastv = {basename}.subtitle_providers.legendastv:LegendasTVProvider'.format(basename=basename), 'subscenter = {basename}.subtitle_providers.subscenter:SubsCenterProvider'.format(basename=basename), - 'thewiz = {basename}.subtitle_providers.thewiz:TheWizProvider'.format(basename=basename)): + 'wizdom = {basename}.subtitle_providers.wizdom:WizdomProvider'.format(basename=basename)): provider_manager.register(name) refiner_manager.register('release = {basename}.refiners.release:refine'.format(basename=basename)) diff --git a/medusa/subtitle_providers/thewiz.py b/medusa/subtitle_providers/wizdom.py similarity index 75% rename from medusa/subtitle_providers/thewiz.py rename to medusa/subtitle_providers/wizdom.py index ff63a50d2d..f35925307e 100644 --- a/medusa/subtitle_providers/thewiz.py +++ b/medusa/subtitle_providers/wizdom.py @@ -19,13 +19,13 @@ logger = logging.getLogger(__name__) -class TheWizSubtitle(Subtitle): - """TheWiz Subtitle.""" - provider_name = 'thewiz' +class WizdomSubtitle(Subtitle): + """Wizdom Subtitle.""" + provider_name = 'wizdom' def __init__(self, language, hearing_impaired, page_link, series, season, episode, title, imdb_id, subtitle_id, releases): - super(TheWizSubtitle, self).__init__(language, hearing_impaired, page_link) + super(WizdomSubtitle, self).__init__(language, hearing_impaired, page_link) self.series = series self.season = season self.episode = episode @@ -72,10 +72,10 @@ def get_matches(self, video): return matches -class TheWizProvider(Provider): - """TheWiz Provider.""" +class WizdomProvider(Provider): + """Wizdom Provider.""" languages = {Language.fromalpha2(l) for l in ['he']} - server_url = 'http://subs.thewiz.info/' + server_url = 'wizdom.xyz' _tmdb_api_key = 'f7f51775877e0bb6703520952b3c7840' @@ -94,49 +94,41 @@ def _search_imdb_id(self, title, year, is_movie): :param str title: title to search for. :param int year: year to search for (or 0 if not relevant). - :param bool is_movie: If True, IMDB ID will be searched for in TMDB instead of TheWiz. + :param bool is_movie: If True, IMDB ID will be searched for in TMDB instead of Wizdom. :return: the IMDB ID for the given title and year (or None if not found). :rtype: str """ # make the search logger.info('Searching IMDB ID for %r%r', title, '' if not year else ' ({})'.format(year)) + category = 'movie' if is_movie else 'tv' title = title.replace('\'', '') - if is_movie: - # get TMDB ID first - r = self.session.get('http://api.tmdb.org/3/search/movie?api_key={}&query={}{}&language=en'.format( - self._tmdb_api_key, title, '' if not year else '&year={}'.format(year))) - r.raise_for_status() - tmdb_results = r.json().get('results') - if tmdb_results: - tmdb_id = tmdb_results[0].get('id') - if tmdb_id: - # get actual IMDB ID from TMDB - r = self.session.get('http://api.tmdb.org/3/movie/{}?api_key={}&language=en'.format( - tmdb_id, self._tmdb_api_key)) - r.raise_for_status() - return str(r.json().get('imdb_id', '')) or None - return None - - # handle TV series - r = self.session.get(self.server_url + 'search.tv.php', params={'name': title}, timeout=10) + # get TMDB ID first + r = self.session.get('http://api.tmdb.org/3/search/{}?api_key={}&query={}{}&language=en'.format( + category, self._tmdb_api_key, title, '' if not year else '&year={}'.format(year))) r.raise_for_status() - return r.text or None + tmdb_results = r.json().get('results') + if tmdb_results: + tmdb_id = tmdb_results[0].get('id') + if tmdb_id: + # get actual IMDB ID from TMDB + r = self.session.get('http://api.tmdb.org/3/{}/{}{}?api_key={}&language=en'.format( + category, tmdb_id, '' if is_movie else '/external_ids', self._tmdb_api_key)) + r.raise_for_status() + return str(r.json().get('imdb_id', '')) or None + return None def query(self, title, season=None, episode=None, year=None, filename=None, imdb_id=None): # search for the IMDB ID if needed. is_movie = not (season and episode) imdb_id = imdb_id or self._search_imdb_id(title, year, is_movie) - # get search parameters - season = season or 0 - episode = episode or 0 - version = os.path.splitext(os.path.basename(filename))[0] if filename else 0 + if not imdb_id: + return {} # search logger.debug('Using IMDB ID %r', imdb_id) - url = 'http://subs.thewiz.info/search.id.php?imdb={}&season={}&episode={}&version={}'.format( - imdb_id, season, episode, version) - page_link = self.server_url + '#/{}/{}'.format('movies' if is_movie else 'series', imdb_id) + url = 'http://json.{}/{}.json'.format(self.server_url, imdb_id) + page_link = 'http://{}/#/{}/{}'.format(self.server_url, 'movies' if is_movie else 'series', imdb_id) # get the list of subtitles logger.debug('Getting the list of subtitles') @@ -147,13 +139,19 @@ def query(self, title, season=None, episode=None, year=None, filename=None, imdb except ValueError: return {} + # filter irrelevant results + if not is_movie: + results = results.get('subs', {}).get(str(season), {}).get(str(episode), []) + else: + results = results.get('subs', []) + # loop over results subtitles = {} for result in results: language = Language.fromalpha2('he') hearing_impaired = False subtitle_id = result['id'] - release = result['versioname'] + release = result['version'] # add the release and increment downloaded count if we already have the subtitle if subtitle_id in subtitles: @@ -163,7 +161,7 @@ def query(self, title, season=None, episode=None, year=None, filename=None, imdb continue # otherwise create it - subtitle = TheWizSubtitle(language, hearing_impaired, page_link, title, season, episode, title, imdb_id, + subtitle = WizdomSubtitle(language, hearing_impaired, page_link, title, season, episode, title, imdb_id, subtitle_id, [release]) logger.debug('Found subtitle %r', subtitle) subtitles[subtitle_id] = subtitle @@ -187,7 +185,7 @@ def list_subtitles(self, video, languages): def download_subtitle(self, subtitle): # download - url = self.server_url + 'zip/{}.zip'.format(subtitle.subtitle_id) + url = 'http://zip.{}/{}.zip'.format(self.server_url, subtitle.subtitle_id) r = self.session.get(url, headers={'Referer': subtitle.page_link}, timeout=10) r.raise_for_status() diff --git a/medusa/subtitles.py b/medusa/subtitles.py index 32e1b345d9..ff7bf84a95 100644 --- a/medusa/subtitles.py +++ b/medusa/subtitles.py @@ -64,7 +64,8 @@ 'shooter': 'http://www.shooter.cn', 'subscenter': 'http://www.subscenter.org', 'thesubdb': 'http://www.thesubdb.com', - 'tvsubtitles': 'http://www.tvsubtitles.net' + 'tvsubtitles': 'http://www.tvsubtitles.net', + 'wizdom': 'http://wizdom.xyz' } diff --git a/pytest.ini b/pytest.ini index 76bf6157ec..0271c7b7f4 100644 --- a/pytest.ini +++ b/pytest.ini @@ -147,7 +147,7 @@ flake8-ignore = medusa/subtitle_providers/__init__.py D104 medusa/subtitle_providers/legendastv.py I100 D100 D102 D105 D204 medusa/subtitle_providers/itasa.py D102 I100 D100 D101 D105 D400 E123 E126 - medusa/subtitle_providers/thewiz.py D100 D102 D204 + medusa/subtitle_providers/wizdom.py D100 D102 D204 medusa/subtitle_providers/subscenter.py I100 D100 D102 D204 medusa/system/__init__.py D104 medusa/system/restart.py D100 D101 D102 diff --git a/static/images/subtitles/thewiz.png b/static/images/subtitles/thewiz.png deleted file mode 100644 index c0917fd87733a1e61085de7013e8404f38d0207a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9910 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 diff --git a/static/images/subtitles/wizdom.png b/static/images/subtitles/wizdom.png new file mode 100644 index 0000000000000000000000000000000000000000..faf51e5fef59c9d51982109684bc892407431210 GIT binary patch literal 1760 zcmV<61|Ru}P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vG?A^-p`A_1!6-I4$R26ah9K~zXf<&|qx zl+_x?_kQOB*vXT(g$N8cxfz#WxK?;Fj|>SjVuG#A%F3jR6_hTiywp-Fvoygx<#+)# zZM0Bf1QiuhJj1{!APzVL$ju>vQ3MCXk@=rJ_tDw5g*h7JGA=G;iT9UgnRP?dA{_ zHqQRV4S`%;ZWP5*AI|(kByIgPK>Xu{X;f*BBh}VtNlV`}Vrq&Zt<5vVMTOxcGb@0c z&3KF&@}mis`3bMR<{`|Hj<|Iyyd-?#tD)o?xDYtKSz+Z*B{vzith; z`^GwpG+%j!L*v|usF#VMUiAiw^K#HqTZLxLaTLB3Rkv;;S^0ekZO@G&R$I9XpP)!` z5x&LC{|>v+UhjKzR}MxJtKZ89exmOVM$ukoWc?wGTGFT3 zZ?PuPn?~CKNtuU&qBCf0X+zbedNemRp{=bAjg5_HX>P`)hDN;i`YWiOO52rEp=xh9 z?cN?j2j@5oK4H@It^?0BXHhU~a#;bZ`NkmHD|2>ucOa3|;NJw=)Hu`_P55tV8MbG9 ziPB?-p{=aJ(UZTRqOuZobq1W&=%Aec6c9^boXO>~UTf5>I;H=jnCfI7!`s~DaW=t@ z@%bz%{q0CJwPb|YeKVLq`b(1oke_n^dP5y9=xd?P--p({AL87eH7NM@BN%FH(f-?2 zT|1nqm#oy(anvGe3@e$Uv^gpBqw&J?U;hXUpELy(_3 z8#-M%)Y+Smzw!lGPpm~x?po9w%7p&dZuH)=ptrXd=k%ALTp&YtoB+mn;hThvk?^8_ zj9DSri6jCuD~0aMROof5vFEdQuw_LGuARt4x*`&q&1q;j^cA{#`_b3e2P**mrZiv% z%bO)y!%GcMk6f_FW@em9u>ZppoUXWtYq~=~>v5Ft{T#~{DA2KO0cwBVfYuHZj7B3$ zY8r9igXe*n1UD3-b-dK@^eO~jU=D#bf#6i^1QZ@rL6x~0#k;;nTU`~Zv}a)4^c*g( zlA->r8bufC@%oHNTx6R=GC{Xo_zo{MJSK%W9?uf=DcFz^REHAQj~J9>ya)X+M{ri7 zMdA0WasJ3IsE-vQ`_uPP8ODqf3GO6PT%SEEl$RQw%P+gx_sD58m|2@lgxrj^*s&-c ztCFIi+OY*IS1iYz*jRl1*%#O+_eTfYkS*4>!5%qRMhNb`Tf;FB$Gu=m9E+1j^HF;^ z8)b9cpgvWCQ>ROyt**gO@m|md5Zq=xx+Q00$c&;h!EQP)@#okXAEwmTH{;r3f3$6U z3+-kLN=r59=;=dUQ7*b>2yu(`^)|aEwq9M2ANpfF7+IgJPU&wopmVkmO$U`Qv*T_1 zMV&1vL4(EqSa3DDn zUC)R+`)3LEb|;RK@+l9_LPA_r%B}qk`bzwI`Y5h;nV_$!LC%l+ppuHytVv`nA38F; z8x_3%P~H*jKb(i+;v$rl>##p-2j)7BzyITXza$ajkeB(nrkZ_G4I7q0D@sok47_Yd z-1(4^Wf>v=G!&_I^^KQd>b`;UQ%B7TLMHLcBa4g>-$bczh5nLZ=yk3;ueCf!{-Q5i zC=opEJ;uT8GIlglm!>22rQ}XqdHLm$$NDOHSpEoE>?$C&frPxxPmdU!ySuy0+uPe; z;^ifM#MwRAFDS_8;|NEO(7?bzKR-VoFE;Pv<1<|%k$CVq500y=>!it(Cr@y5bDQYw z?Cj#<;o(Rmk}*!6o)Ts@&Njz3