|
|
|
# coding=utf-8
|
|
|
|
from __future__ import absolute_import
|
|
|
|
|
|
|
|
from collections import defaultdict
|
|
|
|
import logging
|
|
|
|
import time
|
|
|
|
|
|
|
|
from subliminal.core import check_video
|
|
|
|
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
|
|
# list_all_subtitles, list_supported_languages, list_supported_video_types, download_subtitles, download_best_subtitles
|
|
|
|
def list_all_subtitles(videos, languages, pool_instance):
|
|
|
|
listed_subtitles = defaultdict(list)
|
|
|
|
|
|
|
|
# return immediatly if no video passed the checks
|
|
|
|
if not videos:
|
|
|
|
return listed_subtitles
|
|
|
|
|
|
|
|
for video in videos:
|
|
|
|
logger.info("Listing subtitles for %r", video)
|
|
|
|
subtitles = pool_instance.list_subtitles(
|
|
|
|
video, languages - video.subtitle_languages
|
|
|
|
)
|
|
|
|
listed_subtitles[video].extend(subtitles)
|
|
|
|
logger.info("Found %d subtitle(s)", len(subtitles))
|
|
|
|
|
|
|
|
return listed_subtitles
|
|
|
|
|
|
|
|
|
|
|
|
def list_supported_languages(pool_instance):
|
|
|
|
return pool_instance.list_supported_languages()
|
|
|
|
|
|
|
|
|
|
|
|
def list_supported_video_types(pool_instance):
|
|
|
|
return pool_instance.list_supported_video_types()
|
|
|
|
|
|
|
|
|
|
|
|
def download_subtitles(subtitles, pool_instance):
|
|
|
|
for subtitle in subtitles:
|
|
|
|
logger.info("Downloading subtitle %r with score %s", subtitle, subtitle.score)
|
|
|
|
pool_instance.download_subtitle(subtitle)
|
|
|
|
|
|
|
|
|
|
|
|
def download_best_subtitles(
|
|
|
|
videos,
|
|
|
|
languages,
|
|
|
|
pool_instance,
|
|
|
|
min_score=0,
|
|
|
|
hearing_impaired=False,
|
|
|
|
only_one=False,
|
|
|
|
compute_score=None,
|
|
|
|
**kwargs
|
|
|
|
):
|
|
|
|
downloaded_subtitles = defaultdict(list)
|
|
|
|
|
|
|
|
# check videos
|
|
|
|
checked_videos = []
|
|
|
|
for video in videos:
|
|
|
|
if not check_video(video, languages=languages, undefined=only_one):
|
|
|
|
logger.info("Skipping video %r", video)
|
|
|
|
continue
|
|
|
|
checked_videos.append(video)
|
|
|
|
|
|
|
|
# return immediately if no video passed the checks
|
|
|
|
if not checked_videos:
|
|
|
|
return downloaded_subtitles
|
|
|
|
|
|
|
|
# download best subtitles
|
|
|
|
for video in checked_videos:
|
|
|
|
logger.info("Downloading best subtitles for %r", video)
|
|
|
|
subtitles = pool_instance.download_best_subtitles(
|
|
|
|
pool_instance.list_subtitles(video, languages - video.subtitle_languages),
|
|
|
|
video,
|
|
|
|
languages,
|
|
|
|
min_score=min_score,
|
|
|
|
hearing_impaired=hearing_impaired,
|
|
|
|
only_one=only_one,
|
|
|
|
compute_score=compute_score,
|
|
|
|
)
|
|
|
|
logger.info("Downloaded %d subtitle(s)", len(subtitles))
|
|
|
|
downloaded_subtitles[video].extend(subtitles)
|
|
|
|
|
|
|
|
return downloaded_subtitles
|