From f809e608e47644aadd010fbc62147fd376c23f64 Mon Sep 17 00:00:00 2001 From: Gonzalo Merciel Date: Fri, 9 Aug 2019 11:41:35 -0300 Subject: [PATCH 1/4] Added subtitulamos.tv provider. --- .../providers/subtitulamostv.py | 136 ++++++++++++++++++ views/providers.tpl | 22 +++ 2 files changed, 158 insertions(+) create mode 100644 libs/subliminal_patch/providers/subtitulamostv.py diff --git a/libs/subliminal_patch/providers/subtitulamostv.py b/libs/subliminal_patch/providers/subtitulamostv.py new file mode 100644 index 000000000..08239768c --- /dev/null +++ b/libs/subliminal_patch/providers/subtitulamostv.py @@ -0,0 +1,136 @@ +# -*- coding: utf-8 -*- +import json +import logging +import os +import re +import io +import rarfile +import zipfile + +from babelfish import language_converters +from guessit import guessit +from requests import Session +from subzero.language import Language + +from subliminal import Movie, Episode, ProviderError, __short_version__ +from subliminal.exceptions import AuthenticationError, ConfigurationError, DownloadLimitExceeded, ProviderError +from subliminal_patch.subtitle import Subtitle, guess_matches +from subliminal.subtitle import fix_line_ending, SUBTITLE_EXTENSIONS +from subliminal_patch.providers import Provider +from subzero.language import Language + +logger = logging.getLogger(__name__) + +server_url = 'https://subtitulamos.tv/' + + +class SubtitulamosTVSubtitle(Subtitle): + provider_name = 'subtitulamostv' + + def __init__(self, subtitle_id, language, release_group, url, matches): + super(SubtitulamosTVSubtitle, self).__init__(language, page_link=url) + self.subtitle_id = subtitle_id + self.release_group = release_group + self.download_url = url + self.matches = matches + + @property + def id(self): + return self.subtitle_id + + @property + def download_link(self): + return self.download_url + + def get_matches(self, video): + matches = self.matches + + if isinstance(video, Episode): + matches |= guess_matches(video, guessit( + self.release_group, {'type': 'episode'}), partial=True) + + return matches + + +class SubtitulamosTVProvider(Provider): + """Subtitulamostv Provider""" + languages = {Language.fromietf(l) for l in ['en','es-AR','es-ES']} + video_types = (Episode,) + + # def __init__(self): + # if not token: + # raise ConfigurationError('Token must be specified') + # self.token = token + + def initialize(self): + self.session = Session() + self.session.headers = { + 'User-Agent': os.environ.get("SZ_USER_AGENT", "Sub-Zero/2")} + + def terminate(self): + self.session.close() + + def query(self, languages, video): + # query the server + result = None + matches = set() + + q = "%s %dx%02d" % (video.series, video.season, video.episode) + logger.debug('Searching subtitles "%s"', q) + + res = self.session.get( + server_url + 'search/query', params={'q':q}, timeout=10) + res.raise_for_status() + result = res.json() + + subtitles = [] + for s in [s for s in result if len(s['episodes'])]: + for e in s['episodes']: + res = self.session.get( + server_url + 'episodes/%d' % e['id'], timeout=10) + res.raise_for_status() + html = res.text + for lang_m in re.finditer(r"
(.*?)<\/div>.*?(?=
|
)", html, re.S): + lang = lang_m.group(1) + language = "es" + if "Latino" in lang: + language = "es-AR" + elif "(Espa" in lang: + language = "es-ES" + elif "English" in lang: + language = "en" + logger.debug('Found subtitles in "%s" language.', language) + + for subt_m in re.finditer(r"
(.*?)
.*?", lang_m.group(0), re.S): + logger.debug('Found release "%s".', subt_m.group(1)) + if video.alternative_series is None: + if video.series == s['name']: + matches.add('series') + elif s['name'] in [video.series]+video.alternative_series: + matches.add('series') + if video.season == e['season']: + matches.add('season') + if video.episode == e['number']: + matches.add('episode') + if video.title == e['name']: + matches.add('title') + + subtitles.append(SubtitulamosTVSubtitle( + subt_m.group(3), Language.fromietf(language), subt_m.group(1), server_url + subt_m.group(2), matches)) + + return subtitles + + def list_subtitles(self, video, languages): + return self.query(languages, video) + + def download_subtitle(self, subtitle): + logger.info('Downloading subtitle %r', subtitle) + r = self.session.get(subtitle.download_link, timeout=10) + r.raise_for_status() + + subtitle_content = r.text + + if subtitle_content: + subtitle.content = fix_line_ending(subtitle_content) + else: + logger.debug('Could not download subtitle from %s', subtitle.download_link) diff --git a/views/providers.tpl b/views/providers.tpl index 89d929217..e8c694411 100644 --- a/views/providers.tpl +++ b/views/providers.tpl @@ -628,6 +628,28 @@
+
+
+ +
+
+
+ + +
+
+ +
+
+ +
+
From 6b91993545c66ad3813cfd79fdee46ff1f1998ed Mon Sep 17 00:00:00 2001 From: Gonzalo Merciel Date: Thu, 10 Oct 2019 16:25:03 -0300 Subject: [PATCH 2/4] Added encoding, realease_info and better matching. --- .../providers/subtitulamostv.py | 96 ++++++++++++------- 1 file changed, 61 insertions(+), 35 deletions(-) diff --git a/libs/subliminal_patch/providers/subtitulamostv.py b/libs/subliminal_patch/providers/subtitulamostv.py index 08239768c..065e4563d 100644 --- a/libs/subliminal_patch/providers/subtitulamostv.py +++ b/libs/subliminal_patch/providers/subtitulamostv.py @@ -4,8 +4,6 @@ import logging import os import re import io -import rarfile -import zipfile from babelfish import language_converters from guessit import guessit @@ -26,42 +24,63 @@ server_url = 'https://subtitulamos.tv/' class SubtitulamosTVSubtitle(Subtitle): provider_name = 'subtitulamostv' - - def __init__(self, subtitle_id, language, release_group, url, matches): - super(SubtitulamosTVSubtitle, self).__init__(language, page_link=url) - self.subtitle_id = subtitle_id - self.release_group = release_group - self.download_url = url + hash_verifiable = False + + def __init__(self, language, page_link, download_link, description, title, matches, release_info): + super(SubtitulamosTVSubtitle, self).__init__(language, hearing_impaired=False, + page_link=page_link, release_info=release_info, encoding="windows-1252") + self.download_link = download_link + self.description = description.lower() + self.title = title self.matches = matches @property def id(self): - return self.subtitle_id - - @property - def download_link(self): - return self.download_url + return self.download_link def get_matches(self, video): matches = self.matches - if isinstance(video, Episode): - matches |= guess_matches(video, guessit( - self.release_group, {'type': 'episode'}), partial=True) + # release_group + if video.release_group and video.release_group.lower() in self.description: + matches.add('release_group') + + # resolution + if video.resolution and video.resolution.lower() in self.description: + matches.add('resolution') + + # format + if video.format: + formats = [video.format.lower()] + if formats[0] == "web-dl": + formats.append("webdl") + formats.append("webrip") + formats.append("web ") + for frmt in formats: + if frmt.lower() in self.description: + matches.add('format') + break + + # video_codec + if video.video_codec: + video_codecs = [video.video_codec.lower()] + if video_codecs[0] == "h264": + formats.append("x264") + elif video_codecs[0] == "h265": + formats.append("x265") + for vc in formats: + if vc.lower() in self.description: + matches.add('video_codec') + break return matches class SubtitulamosTVProvider(Provider): """Subtitulamostv Provider""" - languages = {Language.fromietf(l) for l in ['en','es-AR','es-ES']} + languages = {Language.fromietf(l) for l in ['en','es']} video_types = (Episode,) - # def __init__(self): - # if not token: - # raise ConfigurationError('Token must be specified') - # self.token = token - def initialize(self): self.session = Session() self.session.headers = { @@ -74,8 +93,8 @@ class SubtitulamosTVProvider(Provider): # query the server result = None matches = set() - - q = "%s %dx%02d" % (video.series, video.season, video.episode) + year = (" (%d)" % video.year) if video.year else "" + q = "%s%s %dx%02d" % (video.series, year, video.season, video.episode) logger.debug('Searching subtitles "%s"', q) res = self.session.get( @@ -93,20 +112,16 @@ class SubtitulamosTVProvider(Provider): for lang_m in re.finditer(r"
(.*?)<\/div>.*?(?=
|
)", html, re.S): lang = lang_m.group(1) language = "es" - if "Latino" in lang: - language = "es-AR" - elif "(Espa" in lang: - language = "es-ES" - elif "English" in lang: + if "English" in lang: language = "en" logger.debug('Found subtitles in "%s" language.', language) - for subt_m in re.finditer(r"
(.*?)
.*?
", lang_m.group(0), re.S): + for subt_m in re.finditer(r"
(.*?)
.*?
(?:.*?
.*?(.*?)

)?", lang_m.group(0), re.S): logger.debug('Found release "%s".', subt_m.group(1)) if video.alternative_series is None: - if video.series == s['name']: + if video.series.lower() == s['name'].lower(): matches.add('series') - elif s['name'] in [video.series]+video.alternative_series: + elif s['name'].lower() in [video.series.lower()]+map(lambda name: name.lower(), video.alternative_series): matches.add('series') if video.season == e['season']: matches.add('season') @@ -114,9 +129,20 @@ class SubtitulamosTVProvider(Provider): matches.add('episode') if video.title == e['name']: matches.add('title') - - subtitles.append(SubtitulamosTVSubtitle( - subt_m.group(3), Language.fromietf(language), subt_m.group(1), server_url + subt_m.group(2), matches)) + #if video.year is None or ("(%d)" % video.year) in s['name']: + matches.add('year') + logger.debug('%d' % video.year) + subtitles.append( + SubtitulamosTVSubtitle( + Language.fromietf(language), + server_url + 'episodes/%d' % e['id'], + server_url + subt_m.group(2), + subt_m.group(1)+(subt_m.group(3) if not subt_m.group(3) is None else ""), + e['name'], + matches, + ('%s %dx%d' % (s['name'], e['season'], e['number']), subt_m.group(1), lang_m.group(1)) + ) + ) return subtitles From 3d492ab4d635d76c90aa16e3c3269eccfb06e459 Mon Sep 17 00:00:00 2001 From: Gonzalo Merciel Date: Thu, 10 Oct 2019 17:24:13 -0300 Subject: [PATCH 3/4] Corrected release_info property. Corrected bug with matches. --- libs/subliminal_patch/providers/subtitulamostv.py | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/libs/subliminal_patch/providers/subtitulamostv.py b/libs/subliminal_patch/providers/subtitulamostv.py index 065e4563d..789ecd51e 100644 --- a/libs/subliminal_patch/providers/subtitulamostv.py +++ b/libs/subliminal_patch/providers/subtitulamostv.py @@ -28,18 +28,19 @@ class SubtitulamosTVSubtitle(Subtitle): def __init__(self, language, page_link, download_link, description, title, matches, release_info): super(SubtitulamosTVSubtitle, self).__init__(language, hearing_impaired=False, - page_link=page_link, release_info=release_info, encoding="windows-1252") + page_link=page_link, encoding="windows-1252") self.download_link = download_link self.description = description.lower() self.title = title - self.matches = matches + self.release_info = release_info + self.found_matches = matches @property def id(self): return self.download_link def get_matches(self, video): - matches = self.matches + matches = self.found_matches # release_group if video.release_group and video.release_group.lower() in self.description: @@ -92,7 +93,6 @@ class SubtitulamosTVProvider(Provider): def query(self, languages, video): # query the server result = None - matches = set() year = (" (%d)" % video.year) if video.year else "" q = "%s%s %dx%02d" % (video.series, year, video.season, video.episode) logger.debug('Searching subtitles "%s"', q) @@ -117,7 +117,7 @@ class SubtitulamosTVProvider(Provider): logger.debug('Found subtitles in "%s" language.', language) for subt_m in re.finditer(r"
(.*?)
.*?
(?:.*?
.*?(.*?)

)?", lang_m.group(0), re.S): - logger.debug('Found release "%s".', subt_m.group(1)) + matches = set() if video.alternative_series is None: if video.series.lower() == s['name'].lower(): matches.add('series') @@ -131,7 +131,6 @@ class SubtitulamosTVProvider(Provider): matches.add('title') #if video.year is None or ("(%d)" % video.year) in s['name']: matches.add('year') - logger.debug('%d' % video.year) subtitles.append( SubtitulamosTVSubtitle( Language.fromietf(language), @@ -140,7 +139,7 @@ class SubtitulamosTVProvider(Provider): subt_m.group(1)+(subt_m.group(3) if not subt_m.group(3) is None else ""), e['name'], matches, - ('%s %dx%d' % (s['name'], e['season'], e['number']), subt_m.group(1), lang_m.group(1)) + '%s %dx%d,%s,%s' % (s['name'], e['season'], e['number'], subt_m.group(1), lang_m.group(1)), ) ) From 2e645039f11fd0e6343709f1f094ffa5d9c5396d Mon Sep 17 00:00:00 2001 From: Gonzalo Merciel Date: Wed, 30 Oct 2019 22:57:50 -0500 Subject: [PATCH 4/4] Fixed encoding issues --- libs/subliminal_patch/providers/subtitulamostv.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libs/subliminal_patch/providers/subtitulamostv.py b/libs/subliminal_patch/providers/subtitulamostv.py index 789ecd51e..4ad74a67b 100644 --- a/libs/subliminal_patch/providers/subtitulamostv.py +++ b/libs/subliminal_patch/providers/subtitulamostv.py @@ -15,7 +15,6 @@ from subliminal.exceptions import AuthenticationError, ConfigurationError, Downl from subliminal_patch.subtitle import Subtitle, guess_matches from subliminal.subtitle import fix_line_ending, SUBTITLE_EXTENSIONS from subliminal_patch.providers import Provider -from subzero.language import Language logger = logging.getLogger(__name__) @@ -28,7 +27,7 @@ class SubtitulamosTVSubtitle(Subtitle): def __init__(self, language, page_link, download_link, description, title, matches, release_info): super(SubtitulamosTVSubtitle, self).__init__(language, hearing_impaired=False, - page_link=page_link, encoding="windows-1252") + page_link=page_link) self.download_link = download_link self.description = description.lower() self.title = title @@ -153,6 +152,7 @@ class SubtitulamosTVProvider(Provider): r = self.session.get(subtitle.download_link, timeout=10) r.raise_for_status() + r.encoding = "ISO-8859-1" subtitle_content = r.text if subtitle_content: