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.
85 lines
2.5 KiB
85 lines
2.5 KiB
7 years ago
|
# -*- coding: utf-8 -*-
|
||
5 years ago
|
from __future__ import absolute_import
|
||
7 years ago
|
import json
|
||
|
import logging
|
||
|
import os
|
||
|
|
||
|
from babelfish import Language, language_converters
|
||
|
from requests import Session
|
||
|
|
||
|
from . import Provider
|
||
|
from .. import __short_version__
|
||
|
from ..subtitle import Subtitle, fix_line_ending
|
||
|
|
||
|
logger = logging.getLogger(__name__)
|
||
|
|
||
|
language_converters.register('shooter = subliminal.converters.shooter:ShooterConverter')
|
||
|
|
||
|
|
||
|
class ShooterSubtitle(Subtitle):
|
||
|
"""Shooter Subtitle."""
|
||
|
provider_name = 'shooter'
|
||
|
|
||
|
def __init__(self, language, hash, download_link):
|
||
|
super(ShooterSubtitle, self).__init__(language)
|
||
|
self.hash = hash
|
||
|
self.download_link = download_link
|
||
|
|
||
|
@property
|
||
|
def id(self):
|
||
|
return self.download_link
|
||
|
|
||
|
def get_matches(self, video):
|
||
|
matches = set()
|
||
|
|
||
|
# hash
|
||
|
if 'shooter' in video.hashes and video.hashes['shooter'] == self.hash:
|
||
|
matches.add('hash')
|
||
|
|
||
|
return matches
|
||
|
|
||
|
|
||
|
class ShooterProvider(Provider):
|
||
|
"""Shooter Provider."""
|
||
|
languages = {Language(l) for l in ['eng', 'zho']}
|
||
|
server_url = 'https://www.shooter.cn/api/subapi.php'
|
||
5 years ago
|
subtitle_class = ShooterSubtitle
|
||
|
|
||
|
def __init__(self):
|
||
|
self.session = None
|
||
7 years ago
|
|
||
|
def initialize(self):
|
||
|
self.session = Session()
|
||
|
self.session.headers['User-Agent'] = 'Subliminal/%s' % __short_version__
|
||
|
|
||
|
def terminate(self):
|
||
|
self.session.close()
|
||
|
|
||
|
def query(self, language, filename, hash=None):
|
||
|
# query the server
|
||
|
params = {'filehash': hash, 'pathinfo': os.path.realpath(filename), 'format': 'json', 'lang': language.shooter}
|
||
|
logger.debug('Searching subtitles %r', params)
|
||
|
r = self.session.post(self.server_url, params=params, timeout=10)
|
||
|
r.raise_for_status()
|
||
|
|
||
|
# handle subtitles not found
|
||
|
if r.content == b'\xff':
|
||
|
logger.debug('No subtitles found')
|
||
|
return []
|
||
|
|
||
|
# parse the subtitles
|
||
|
results = json.loads(r.text)
|
||
5 years ago
|
subtitles = [self.subtitle_class(language, hash, t['Link']) for s in results for t in s['Files']]
|
||
7 years ago
|
|
||
|
return subtitles
|
||
|
|
||
|
def list_subtitles(self, video, languages):
|
||
|
return [s for l in languages for s in self.query(l, video.name, video.hashes.get('shooter'))]
|
||
|
|
||
|
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 = fix_line_ending(r.content)
|