# -*- coding: utf-8 -*- from __future__ import absolute_import import logging import io import os from requests import Session from guessit import guessit from subliminal_patch.providers import Provider from subliminal_patch.subtitle import Subtitle, guess_matches from subliminal.subtitle import SUBTITLE_EXTENSIONS, fix_line_ending from subliminal.video import Episode, Movie from subzero.language import Language import urllib import zipfile logger = logging.getLogger(__name__) class RegieLiveSubtitle(Subtitle): """RegieLive Subtitle.""" provider_name = 'regielive' hash_verifiable = False def __init__(self, filename, video, link, rating, language): super(RegieLiveSubtitle, self).__init__(language) self.filename = filename self.page_link = link self.video = video self.rating = rating self.language = language self.release_info = filename @property def id(self): return self.page_link def get_matches(self, video): type_ = "movie" if isinstance(video, Movie) else "episode" matches = set() subtitle_filename = self.filename.lower() # episode if type_ == "episode": # already matched in search query matches.update(['title', 'series', 'season', 'episode', 'year']) # movie else: # already matched in search query matches.update(['title', 'year']) if video.release_group and video.release_group.lower() in subtitle_filename: matches.update(['release_group', 'hash']) matches |= guess_matches(video, guessit(self.filename, {"type": type_})) return matches class RegieLiveProvider(Provider): """RegieLive Provider.""" languages = {Language(l) for l in ['ron']} language = list(languages)[0] video_types = (Episode, Movie) SEARCH_THROTTLE = 8 hash_verifiable = False def __init__(self): self.initialize() def initialize(self): self.session = Session() self.url = 'https://api.regielive.ro/bazarr/search.php' self.api = 'API-BAZARR-YTZ-SL' self.headers = {'RL-API': self.api} def terminate(self): self.session.close() def query(self, video, language): payload = {} if isinstance(video, Episode): payload['nume'] = video.series payload['sezon'] = video.season payload['episod'] = video.episode elif isinstance(video, Movie): payload['nume'] = video.title payload['an'] = video.year response = self.session.get( self.url + "?" + urllib.parse.urlencode(payload), data=payload, headers=self.headers) subtitles = [] if response.status_code == 200: results = response.json() if len(results) > 0: results_subs = results['rezultate'] for film in results_subs: for sub in results_subs[film]['subtitrari']: subtitles.append( RegieLiveSubtitle( results_subs[film]['subtitrari'][sub]['titlu'], video, results_subs[film]['subtitrari'][sub]['url'], results_subs[film]['subtitrari'][sub]['rating']['nota'], language)) return subtitles def list_subtitles(self, video, languages): return self.query(video, self.language) def download_subtitle(self, subtitle): session = self.session _addheaders = { 'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:72.0) Gecko/20100101 Firefox/72.0', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8', 'Origin': 'https://subtitrari.regielive.ro', 'Accept-Language': 'en-US,en;q=0.5', 'Referer': 'https://subtitrari.regielive.ro', 'Pragma': 'no-cache', 'Cache-Control': 'no-cache' } session.headers.update(_addheaders) res = session.get('https://subtitrari.regielive.ro') cookies = res.cookies _zipped = session.get(subtitle.page_link, cookies=cookies) if _zipped: if _zipped.text == '500': raise ValueError('Error 500 on server') archive = zipfile.ZipFile(io.BytesIO(_zipped.content)) subtitle_content = self._get_subtitle_from_archive(archive) subtitle.content = fix_line_ending(subtitle_content) return subtitle raise ValueError('Problems conecting to the server') def _get_subtitle_from_archive(self, archive): # some files have a non subtitle with .txt extension _tmp = list(SUBTITLE_EXTENSIONS) _tmp.remove('.txt') _subtitle_extensions = tuple(_tmp) for name in archive.namelist(): # discard hidden files if os.path.split(name)[-1].startswith('.'): continue # discard non-subtitle files if not name.lower().endswith(_subtitle_extensions): continue return archive.read(name) raise APIThrottled('Can not find the subtitle in the compressed file')