# -*- coding: utf-8 -*- # Copyright 2012 Ofir123 # # This file is part of subliminal. # # subliminal is free software; you can redistribute it and/or modify it under # the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # subliminal is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with subliminal. If not, see . from . import ServiceBase from ..exceptions import ServiceError from ..language import language_set from ..subtitles import get_subtitle_path, ResultSubtitle from ..videos import Episode, Movie from ..utils import to_unicode import bisect import logging from urllib import urlencode logger = logging.getLogger(__name__) class Subscenter(ServiceBase): server = 'http://www.cinemast.org/he/cinemast/api/' api_based = True languages = language_set(['he']) videos = [Episode, Movie] require_video = False default_username = 'subliminal@gmail.com' default_password = 'subliminal' def __init__(self, config=None): super(Subscenter, self).__init__(config) self.token = None self.user_id = None def init(self): super(Subscenter, self).init() logger.debug('Logging in') url = self.server_url + 'login/' # actual login data = {'username': self.default_username, 'password': self.default_password} r = self.session.post(url, data=urlencode(data), allow_redirects=False, timeout=10) if r.status_code != 200: raise ServiceError('Login failed') try: result = r.json() if 'token' not in result: raise ServiceError('Login failed') logger.info('Logged in') self.user_id = r.json().get('user') self.token = r.json().get('token') except ValueError: raise ServiceError('Login failed') def terminate(self): super(Subscenter, self).terminate() if self.token or self.user_id: logger.info('Logged out') self.token = None self.user_id = None def list_checked(self, video, languages): series = None season = None episode = None title = video.title year = video.year if isinstance(video, Episode): series = video.series season = video.season episode = video.episode return self.query(video.path or video.release, languages, series, season, episode, title, year) def query(self, filepath, languages=None, series=None, season=None, episode=None, title=None, year=None): logger.debug(u'Getting subtitles for {0} season {1} episode {2} with languages {3}'.format( series, season, episode, languages)) query = { 'user': self.user_id, 'token': self.token } # episode if season and episode: query['q'] = series query['type'] = 'series' query['season'] = season query['episode'] = episode elif title: query['q'] = title query['type'] = 'movies' if year: query['year_start'] = year - 1 query['year_end'] = year else: raise ServiceError('One or more parameters are missing') # get the list of subtitles logger.debug('Getting the list of subtitles') url = self.server_url + 'search/' r = self.session.post(url, data=urlencode(query)) r.raise_for_status() try: results = r.json() except ValueError: return {} # loop over results subtitles = {} for group_data in results.get('data', []): for language_code, subtitles_data in group_data.get('subtitles', {}).items(): language_object = self.get_language(language_code) for subtitle_item in subtitles_data: # read the item subtitle_id = subtitle_item['id'] subtitle_key = subtitle_item['key'] release = subtitle_item['version'] subtitle_path = get_subtitle_path(filepath, language_object, self.config.multi) download_link = self.server_url + 'subtitle/download/{0}/?v={1}&key={2}&sub_id={3}'.format( language_code, release, subtitle_key, subtitle_id) # Add the release and increment downloaded count if we already have the subtitle. if subtitle_id in subtitles: logger.debug('Found additional release {0} for subtitle {1}'.format( release, subtitle_id)) bisect.insort_left(subtitles[subtitle_id].release, release) # Deterministic order. continue # Otherwise create it. subtitle = ResultSubtitle(subtitle_path, language_object, self.__class__.__name__.lower(), download_link, release=to_unicode(release)) logger.debug('Found subtitle %r', subtitle) subtitles[subtitle_id] = subtitle return subtitles.values() def download(self, subtitle): data = { 'user': self.user_id, 'token': self.token } self.download_zip_file(subtitle.link, subtitle.path, data=urlencode(data)) return subtitle Service = Subscenter