def query(self, languages, video): # query the server keywords = [] if isinstance(video, Movie): if video.title: # title = "".join(e for e in video.title if e.isalnum()) title = video.title keywords.append(title) if video.year: keywords.append(str(video.year)) elif isinstance(video, Episode): if video.series: # series = "".join(e for e in video.series if e.isalnum()) series = video.series keywords.append(series) if video.season and video.episode: keywords.append('S%02dE%02d' % (video.season, video.episode)) elif video.episode: keywords.append('E%02d' % video.episode) query = ' '.join(keywords) params = {'token': self.token, 'q': query, 'is_file': 1} logger.debug('Searching subtitles: GET /sub/search %r', params) res = self.session.get(server_url + '/sub/search', params=params, timeout=10) res.raise_for_status() result = res.json() if result['status'] != 0: logger.error('status error: %r', result['status']) return [] # parse the subtitles pattern = re.compile(r'lang(?P<code>\w+)') subtitles = [] for sub in result['sub']['subs']: if 'lang' not in sub: continue for key in sub['lang']['langlist'].keys(): match = pattern.match(key) try: language = Language.fromassrt(match.group('code')) output_language = search_language_in_list( language, languages) if output_language: subtitles.append( AssrtSubtitle(output_language, sub['id'], sub['videoname'], self.session, self.token)) except: pass return subtitles
def query(self, languages, video): # query the server keywords = [] if isinstance(video, Movie): if video.title: keywords.append(video.title) if video.year: keywords.append(str(video.year)) elif isinstance(video, Episode): if video.series: keywords.append(video.series) if video.season and video.episode: keywords.append('S%02dE%02d' % (video.season, video.episode)) elif video.episode: keywords.append('E%02d' % video.episode) query = ' '.join(keywords) params = {'token': self.token, 'q': query, 'is_file': 1} logger.debug('Searching subtitles %r', params) res = self.session.get(server_url + '/sub/search', params=params, timeout=10) res.raise_for_status() result = res.json() if result['status'] != 0: logger.error('status error: %r', r) return [] if not result['sub']['subs']: logger.debug('No subtitle found') # parse the subtitles pattern = re.compile(ur'lang(?P<code>\w+)') subtitles = [] for sub in result['sub']['subs']: if 'lang' not in sub: continue for key in sub['lang']['langlist'].keys(): match = pattern.match(key) try: language = Language.fromassrt(match.group('code')) if language in languages: subtitles.append(AssrtSubtitle(language, sub['id'], sub['videoname'], self.session, self.token)) except: pass return subtitles
def _get_detail(self): if self._detail: return self._detail params = {'token': self.token, 'id': self.id} logger.info('Get subtitle detail: GET /sub/detail %r', params) r = self.session.get(server_url + '/sub/detail', params=params, timeout=10) r.raise_for_status() result = r.json() sub = result['sub']['subs'][0] files = sub['filelist'] # first pass: guessit for f in files: guess = guessit(f['f'], self.guessit_options) langs = set() if 'language' in guess: langs.update(guess['language']) if 'subtitle_language' in guess: langs.update(guess['subtitle_language']) if self.language in langs: self._defail = f return f # second pass: keyword matching codes = language_converters['assrt'].codes for f in files: langs = set([Language.fromassrt(k) for k in codes if k in f['f']]) if self.language in langs: self._defail = f return f # fallback: pick up first file if nothing matches return files[0]
def _get_detail(self): if self._detail: return self._detail params = {'token': self.token, 'id': self.id} r = self.session.get(server_url + '/sub/detail', params=params, timeout=10) r.raise_for_status() result = r.json() sub = result['sub']['subs'][0] files = sub['filelist'] # first pass: guessit for f in files: logger.info('File %r', f) guess = guessit(f['f'], self.guessit_options) logger.info('GuessIt %r', guess) langs = set() if 'language' in guess: langs.update(guess['language']) if 'subtitle_language' in guess: langs.update(guess['subtitle_language']) if self.language in langs: self._defail = f return f # second pass: keyword matching codes = language_converters['assrt'].codes for f in files: langs = set([ Language.fromassrt(k) for k in codes if k in f['f'] ]) logger.info('%s: %r', f['f'], langs) if self.language in langs: self._defail = f return f # fallback: pick up first file if nothing matches return files[0]