diff --git a/lib/subliminal/services/itasa.py b/lib/subliminal/services/itasa.py index 880537d27089df0db41548ca614ef1c249569983..f726a156e670ac369a860bc003d31ce52ead8fb6 100644 --- a/lib/subliminal/services/itasa.py +++ b/lib/subliminal/services/itasa.py @@ -16,15 +16,20 @@ # You should have received a copy of the GNU Lesser General Public License # along with subliminal. If not, see <http://www.gnu.org/licenses/>. from . import ServiceBase +from ..exceptions import DownloadFailedError, ServiceError from ..cache import cachedmethod from ..language import language_set, Language -from ..subtitles import get_subtitle_path, ResultSubtitle +from ..subtitles import get_subtitle_path, ResultSubtitle, EXTENSIONS from ..utils import get_keywords from ..videos import Episode from bs4 import BeautifulSoup import logging import re +import os import requests +import zipfile +import StringIO +import guessit from sickbeard.common import Quality @@ -43,18 +48,17 @@ class Itasa(ServiceBase): Quality.SDDVD : 'dvdrip', Quality.RAWHDTV : '1080i', Quality.HDTV : '720p', - Quality.FULLHDTV : '720p', + Quality.FULLHDTV : ('1080p','720p'), Quality.HDWEBDL : 'web-dl', Quality.FULLHDWEBDL : 'web-dl', - Quality.HDBLURAY : 'bluray', - Quality.FULLHDBLURAY : 'bluray' + Quality.HDBLURAY : ('bdrip', 'bluray'), + Quality.FULLHDBLURAY : ('bdrip', 'bluray'), + Quality.UNKNOWN : 'unknown' #Any subtitle will be downloaded } def init(self): super(Itasa, self).init() - username = 'sickbeard' - password = 'subliminal' login_pattern = '<input type="hidden" name="return" value="([^\n\r\t ]+?)" /><input type="hidden" name="([^\n\r\t ]+?)" value="([^\n\r\t ]+?)" />' response = requests.get(self.server_url + 'index.php') @@ -65,19 +69,20 @@ class Itasa(ServiceBase): if not match: raise ServiceError('Can not find unique id parameter on page') - log_parameter = {'username': 'mr_orange', - 'passwd': '121176', - 'remember': 'yes', - 'Submit': 'Login', - 'remember': 'yes', - 'option': 'com_user', - 'task': 'login', - 'silent': 'true', - 'return': match.group(1), match.group(2): match.group(3) - } + login_parameter = {'username': 'sickbeard', + 'passwd': 'subliminal', + 'remember': 'yes', + 'Submit': 'Login', + 'remember': 'yes', + 'option': 'com_user', + 'task': 'login', + 'silent': 'true', + 'return': match.group(1), + match.group(2): match.group(3) + } self.session = requests.session() - r = self.session.post(self.server_url + 'index.php', data=log_parameter) + r = self.session.post(self.server_url + 'index.php', data=login_parameter) if not re.search('logouticon.png', r.content, re.IGNORECASE | re.DOTALL): raise ServiceError('Itasa Login Failed') @@ -88,7 +93,7 @@ class Itasa(ServiceBase): soup = BeautifulSoup(r.content, self.required_features) all_series = soup.find('div', attrs = {'id' : 'remositorycontainerlist'}) for tv_series in all_series.find_all(href=re.compile('func=select')): - series_name = tv_series.text.lower().strip() + series_name = tv_series.text.lower().strip().replace(':','') match = re.search('&id=([0-9]+)', tv_series['href']) if match is None: continue @@ -97,7 +102,7 @@ class Itasa(ServiceBase): return self.cached_value(self.get_series_id, args=(name,)) def get_episode_id(self, series, series_id, season, episode, quality): - """Get the episode subtitle with the given quality""" + """Get the id subtitle for episode with the given quality""" season_link = None quality_link = None @@ -120,12 +125,13 @@ class Itasa(ServiceBase): all_qualities = soup.find('div', attrs = {'id' : 'remositorycontainerlist'}) for qualities in all_qualities.find_all(href=re.compile('func=select')): - if qualities.text.lower().strip() == self.quality_dict[quality]: + if qualities.text.lower().strip() in self.quality_dict[quality]: quality_link = qualities['href'] r = self.session.get(qualities['href']) soup = BeautifulSoup(r.content, self.required_features) break - + + #If we want SDTV we are just on the right page so quality link will be None if not quality == Quality.SDTV and not quality_link: logger.debug(u'Could not find a subtitle with required quality for series %s season %s' % (series, str(season))) return None @@ -133,7 +139,7 @@ class Itasa(ServiceBase): all_episodes = soup.find('div', attrs = {'id' : 'remositoryfilelisting'}) for episodes in all_episodes.find_all(href=re.compile('func=fileinfo')): ep_string = "%(seasonnumber)dx%(episodenumber)02d" % {'seasonnumber': season, 'episodenumber': episode} - if re.search(ep_string, episodes.text): + if re.search(ep_string, episodes.text, re.I) or re.search('completa$', episodes.text, re.I): match = re.search('&id=([0-9]+)', episodes['href']) if match: episode_id = match.group(1) @@ -149,12 +155,13 @@ class Itasa(ServiceBase): logger.debug(u'Getting subtitles for %s season %d episode %d with languages %r' % (series, season, episode, languages)) self.init_cache() try: - series_id = self.get_series_id(series.lower()) + series = series.lower().replace('(','').replace(')','') + series_id = self.get_series_id(series) except KeyError: logger.debug(u'Could not find series id for %s' % series) return [] - episode_id = self.get_episode_id(series.lower(), series_id, season, episode, Quality.nameQuality(filepath)) + episode_id = self.get_episode_id(series, series_id, season, episode, Quality.nameQuality(filepath)) if not episode_id: logger.debug(u'Could not find subtitle for series %s' % series) return [] @@ -170,8 +177,40 @@ class Itasa(ServiceBase): return [subtitle] def download(self, subtitle): - self.download_zip_file(subtitle.link, subtitle.path) - return subtitle + + logger.info(u'Downloading %s in %s' % (subtitle.link, subtitle.path)) + try: + r = self.session.get(subtitle.link, headers={'Referer': self.server_url, 'User-Agent': self.user_agent}) + zipcontent = StringIO.StringIO(r.content) + zipsub = zipfile.ZipFile(zipcontent) +# if not zipsub.is_zipfile(zipcontent): +# raise DownloadFailedError('Downloaded file is not a zip file') + subfile = '' + if len(zipsub.namelist()) == 1: + subfile = zipsub.namelist()[0] + else: + #Season Zip Retrive Season and episode Numbers from path + guess = guessit.guess_file_info(subtitle.path, 'episode') + ep_string = "s%(seasonnumber)02de%(episodenumber)02d" % {'seasonnumber': guess['season'], 'episodenumber': guess['episodeNumber']} + for file in zipsub.namelist(): + if re.search(ep_string, file, re.I): + subfile = file + break + if os.path.splitext(subfile)[1] in EXTENSIONS: + with open(subtitle.path, 'wb') as f: + f.write(zipsub.open(subfile).read()) + else: + zipsub.close() + raise DownloadFailedError('No subtitles found in zip file') + + zipsub.close() + except Exception as e: + if os.path.exists(subtitle.path): + os.remove(subtitle.path) + raise DownloadFailedError(str(e)) + + logger.debug(u'Download finished') + Service = Itasa \ No newline at end of file