def download_srt_from_3rd_party(lang_codes=None, **kwargs): """Download subtitles specified by command line args""" lang_codes = lang_codes or get_all_prepped_lang_codes() bad_languages = {} for lang_code in lang_codes: lang_code = lcode_to_ietf(lang_code) lang_code = get_supported_language_map(lang_code)['amara'] try: lang_map_filepath = get_lang_map_filepath(lang_code) if not os.path.exists(lang_map_filepath): videos = {} # happens if an unknown set for subtitles. else: with open(lang_map_filepath, "r") as fp: videos = json.load(fp) except Exception as e: error_msg = "Error in subtitles metadata file for %s: %s" % (lang_code, e) logging.error(error_msg) bad_languages[lang_code] = error_msg continue try: download_if_criteria_met(videos, lang_code=lang_code, **kwargs) except Exception as e: error_msg = "Error downloading subtitles for %s: %s" % (lang_code, e) logging.error(error_msg) bad_languages[lang_code] = error_msg continue # now report final results if bad_languages: outstr = "Failed to download subtitles for the following languages: %s" % (bad_languages.keys()) outstr += "\n" + str(bad_languages) logging.error(outstr)
def annotate_topic_tree(node, level=0, statusdict=None, remote_sizes=None, lang_code=settings.LANGUAGE_CODE): # Not needed when on an api request (since translation.activate is already called), # but just to do things right / in an encapsulated way... # Though to be honest, this isn't quite right; we should be DE-activating translation # at the end. But with so many function exit-points... just a nightmare. if level == 0: translation.activate(lang_code) if not statusdict: statusdict = {} if node["kind"] == "Topic": if "Video" not in node["contains"]: return None children = [] unstarted = True complete = True for child_node in node["children"]: child = annotate_topic_tree(child_node, level=level+1, statusdict=statusdict, lang_code=lang_code) if not child: continue elif child["addClass"] == "unstarted": complete = False elif child["addClass"] == "partial": complete = False unstarted = False elif child["addClass"] == "complete": unstarted = False children.append(child) if not children: # All children were eliminated; so eliminate self. return None return { "title": _(node["title"]), "tooltip": re.sub(r'<[^>]*?>', '', _(node["description"]) or ""), "isFolder": True, "key": node["id"], "children": children, "addClass": complete and "complete" or unstarted and "unstarted" or "partial", "expand": level < 1, } elif node["kind"] == "Video": video_id = node["youtube_id"] youtube_id = get_youtube_id(video_id, lang_code=get_supported_language_map(lang_code)["dubbed_videos"]) if not youtube_id: # This video doesn't exist in this language, so remove from the topic tree. return None #statusdict contains an item for each video registered in the database # will be {} (empty dict) if there are no videos downloaded yet percent = statusdict.get(youtube_id, 0) vid_size = None status = None if not percent: status = "unstarted" vid_size = get_remote_video_size(youtube_id) / float(2**20) # express in MB elif percent == 100: status = "complete" vid_size = get_local_video_size(youtube_id, 0) / float(2**20) # express in MB else: status = "partial" return { "title": _(node["title"]), "tooltip": re.sub(r'<[^>]*?>', '', _(node.get("description")) or ""), "key": youtube_id, "addClass": status, "size": vid_size, } return None
def annotate_topic_tree(node, level=0, statusdict=None, remote_sizes=None, lang_code=settings.LANGUAGE_CODE): # Not needed when on an api request (since translation.activate is already called), # but just to do things right / in an encapsulated way... # Though to be honest, this isn't quite right; we should be DE-activating translation # at the end. But with so many function exit-points... just a nightmare. if level == 0: translation.activate(lang_code) if not statusdict: statusdict = {} if node["kind"] == "Topic": if "Video" not in node["contains"]: return None children = [] unstarted = True complete = True for child_node in node["children"]: child = annotate_topic_tree(child_node, level=level + 1, statusdict=statusdict, lang_code=lang_code) if not child: continue elif child["addClass"] == "unstarted": complete = False elif child["addClass"] == "partial": complete = False unstarted = False elif child["addClass"] == "complete": unstarted = False children.append(child) if not children: # All children were eliminated; so eliminate self. return None return { "title": _(node["title"]), "tooltip": re.sub(r'<[^>]*?>', '', _(node["description"]) or ""), "isFolder": True, "key": node["id"], "children": children, "addClass": complete and "complete" or unstarted and "unstarted" or "partial", "expand": level < 1, } elif node["kind"] == "Video": video_id = node["youtube_id"] youtube_id = get_youtube_id( video_id, lang_code=get_supported_language_map(lang_code)["dubbed_videos"]) if not youtube_id: # This video doesn't exist in this language, so remove from the topic tree. return None #statusdict contains an item for each video registered in the database # will be {} (empty dict) if there are no videos downloaded yet percent = statusdict.get(youtube_id, 0) vid_size = None status = None if not percent: status = "unstarted" vid_size = get_remote_video_size(youtube_id) / float( 2**20) # express in MB elif percent == 100: status = "complete" vid_size = get_local_video_size(youtube_id, 0) / float( 2**20) # express in MB else: status = "partial" return { "title": _(node["title"]), "tooltip": re.sub(r'<[^>]*?>', '', _(node.get("description")) or ""), "key": youtube_id, "addClass": status, "size": vid_size, } return None