You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
bazarr/custom_libs/subliminal_patch/providers/regielive.py

154 lines
5.1 KiB

# -*- 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.json()['cod'] == 200:
results_subs = response.json()['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')