def GetMetadata(media, movie, error_log, id): Log.Info("=== AnimeLists.GetMetadata() ===".ljust(157, '=')) mappingList, AnimeLists_dict = {}, {} found = False source, id = id.split('-', 1) if '-' in id else ("", id) AniDB_id = id if source.startswith('anidb') else "" TVDB_id = id if source.startswith('tvdb') else "" TMDB_id = id if source.startswith('tmdb') else "" IMDB_id = id if source.startswith('imdb') else "" AniDBid = "" TVDBid = "" TMDBid = "" IMDBid = "" tvdb_numbering = True if not movie and ( TVDB_id or AniDB_id and max(map(int, media.seasons.keys())) > 1) else False tvdbcounts = {} ### Search for match ### Log.Info("tvdb_numbering: {}".format(tvdb_numbering)) AniDB_id2, TVDB_id2 = "", "" AniDBTVDBMapCustom = GetAniDBTVDBMapCustom(media, movie) if AniDBTVDBMapCustom: AniDBTVDBMapFull = MergeMaps(AniDBTVDBMap, AniDBTVDBMapCustom) else: AniDBTVDBMapFull = AniDBTVDBMap def anime_core(anime): defaulttvdbseason = anime.get('defaulttvdbseason') if anime.get( 'defaulttvdbseason' ) and anime.get('defaulttvdbseason') != 'a' else '1' episodeoffset = anime.get('episodeoffset') if anime.get( 'episodeoffset') else '0' s1_mapping_count = len( anime.xpath( "mapping-list/mapping[@anidbseason='1'][@tvdbseason='0' or @tvdbseason='1']" )) s1e1_mapping = True if anime.xpath( "mapping-list/mapping[@anidbseason='1'][@tvdbseason='1'][contains(text(), '-1;')]" ) else False is_primary_series = True if defaulttvdbseason == '1' and episodeoffset == '0' and ( s1_mapping_count == 0 or s1e1_mapping) else False return defaulttvdbseason, episodeoffset, s1_mapping_count, is_primary_series Log.Info("--- AniDBTVDBMap ---".ljust(157, '-')) forcedID = { 'anidbid': AniDB_id, 'tvdbid': TVDB_id, 'tmdbid': TMDB_id, 'imdbid': IMDB_id } for anime in AniDBTVDBMapFull.iter('anime') if AniDBTVDBMapFull else []: # gather any manually specified source ids foundID, wantedID = {}, {} for check in forcedID.keys(): foundID[check] = anime.get(check, "") wantedID[check] = True if foundID[check] == forcedID[ check] and forcedID[check] != '' else False # if this row matches our specified source-id if True in wantedID.values(): # save the found values for later use in other GetMetadata that dont depend on AniDB etc. IMDBid, TMDBid, TVDBid, AniDBid = foundID['imdbid'], foundID[ 'tmdbid'], foundID['tvdbid'], foundID['anidbid'] # use the old check to decide whether to proceed if TVDBid == '' and AniDBid == '': continue # nothing found, skip else: continue found = True # record the number of entries using the same tvdb id SaveDict(Dict(tvdbcounts, TVDBid, default=0) + 1, tvdbcounts, TVDBid) defaulttvdbseason, episodeoffset, s1_mapping_count, is_primary_series = anime_core( anime) if not tvdb_numbering and not TVDB_id: TVDB_id2 = TVDBid if tvdb_numbering and AniDBid and TVDBid.isdigit( ) and is_primary_series and not AniDB_id: AniDB_id2 = AniDBid Log.Info( "[+] AniDBid: {:>5}, TVDBid: {:>6}, defaulttvdbseason: {:>4}, offset: {:>3}, TMDBid: {:>7}, IMDBid: {:>10}, name: {}" .format( AniDBid, TVDBid, ("({})".format(anime.get('defaulttvdbseason')) if anime.get('defaulttvdbseason') != defaulttvdbseason else '') + defaulttvdbseason, episodeoffset, TMDBid, IMDBid, GetXml(anime, 'name'))) ### AniDB/TMDB/IMDB numbered series ### if AniDB_id or TMDB_id or IMDB_id: AniDB_id2 = AniDBid # Needs to be set if TMDB/IMDB TVDB_id2 = TVDBid SaveDict(TMDBid, mappingList, 'tmdbid') SaveDict(IMDBid, mappingList, 'imdbid') SaveDict(defaulttvdbseason, mappingList, 'defaulttvdbseason') SaveDict(True if anime.get('defaulttvdbseason') == 'a' else False, mappingList, 'defaulttvdbseason_a') SaveDict(episodeoffset, mappingList, 'episodeoffset') SaveDict(GetXml(anime, 'name'), mappingList, 'name') SaveDict(GetXml(anime, "supplemental-info/studio"), AnimeLists_dict, 'studio') SaveDict(GetXml(anime, "supplemental-info/director"), AnimeLists_dict, 'director') SaveDict(GetXml(anime, "supplemental-info/credits"), AnimeLists_dict, 'writer') for genre in anime.xpath('supplemental-info/genre'): SaveDict([genre.text], AnimeLists_dict, 'genres') for art in anime.xpath('supplemental-info/fanart/thumb'): SaveDict( { art.text: ('/'.join( art.text.split('/')[3:]), 1, art.get('preview')) }, AnimeLists_dict, 'art') ### TheTVDB/multi-season numbered series and the Primary/Starting(s1e1) AniDB id ### if (TVDB_id or not movie and max(map(int, media.seasons.keys())) > 1 and AniDB_id == '') and TVDBid.isdigit() and is_primary_series: AniDB_id2 = AniDBid SaveDict(TMDBid, mappingList, 'tmdbid') SaveDict(IMDBid, mappingList, 'imdbid') SaveDict(defaulttvdbseason, mappingList, 'defaulttvdbseason') SaveDict(True if anime.get('defaulttvdbseason') == 'a' else False, mappingList, 'defaulttvdbseason_a') ### if TVDBid.isdigit(): SaveDict(episodeoffset, mappingList, 'TVDB', 's-1' if defaulttvdbseason == '0' and s1_mapping_count >= 1 else 's' + defaulttvdbseason, AniDBid) #mappingList['TVDB'][s1][anidbid]=episodeoffset SaveDict( { 'min': defaulttvdbseason, 'max': defaulttvdbseason }, mappingList, 'season_map', AniDBid) # Set the min/max season to the 'defaulttvdbseason' if source == "tvdb6" and int(episodeoffset) > 0: SaveDict( { 'min': '0', 'max': '0' }, mappingList, 'season_map', AniDBid ) # Force series as special if not starting the TVDB season for season in anime.iter( 'mapping' ): ### mapping list: <mapping-list> <mapping anidbseason="0" tvdbseason="0">;1-12;2-14;3-16;4-18;</mapping> </mapping-list> anidbseason, tvdbseason, offset, start, end = season.get( 'anidbseason'), season.get( 'tvdbseason'), season.get('offset') or '0', season.get( 'start'), season.get('end') Log.Info( " - season: [{:>2}], [{:>2}], range: [{:>3}-{:>3}], offset: {:>3}, text: {}" .format(anidbseason, tvdbseason, start or '000', end or '000', offset, (season.text or '').strip(';'))) for ep in range(int(start), int(end) + 1) if start else []: #Log.Info("[?] start: {}, end: {}, ep: {}".format(start, end, ep)) if not Dict(mappingList, 'TVDB', 's' + tvdbseason + 'e' + str(ep + int(offset))): SaveDict( (anidbseason, str(ep), AniDBid), mappingList, 'TVDB', 's' + tvdbseason + 'e' + str(ep + int(offset)) ) #mappingList['TVDB'][s1e1]=(AniDB_season, AniDB_episode, AniDBid) for start-end mappings #else: Log.Info("already present") for ep in filter( None, season.text.split(';')) if season.text else []: if not '-' in ep: Log.Info( '[!] MAPPING ERROR, season.text: "{}", ep mapping missing hyphen: "{}"' .format(season.text, ep)) elif not Dict(mappingList, 'TVDB', 's' + tvdbseason + 'e' + ep.split('-')[1]): SaveDict( (anidbseason, ep.split('-')[0], AniDBid), mappingList, 'TVDB', 's' + tvdbseason + 'e' + ep.split('-')[1] ) #mappingList['TVDB'][s1e1]=(AniDB_season, AniDB_episode, AniDBid) for manual mapping like '1-12' #elif '-' not in (mappingList, 'TVDB', 's'+tvdbseason+'e'+ep.split('-')[1]): # SaveDict((anidbseason, Dict(mappingList, 'TVDB', 's'+tvdbseason+'e'+ep.split('-')[1])[1]+'-'+ep.split('-')[0], AniDBid), mappingList, 'TVDB', 's'+tvdbseason+'e'+ep.split('-')[1]) # Log.Info("already present so converting to range but range not supported") if int(Dict(mappingList, 'season_map', AniDBid, 'max')) < int( season.get("tvdbseason")): SaveDict( season.get("tvdbseason"), mappingList, 'season_map', AniDBid, 'max' ) # Update the max season to the largest 'tvdbseason' season seen in 'mapping-list' ### if TVDBid == "hentai": SaveDict("X", AnimeLists_dict, 'content_rating') elif TVDBid in ("", "unknown", None): link = SCHUDLEE_FEEDBACK.format( title="aid:%s '%s' TVDBid:" % (AniDB_id, "title"), body=String.StripTags( XML.StringFromElement(anime, encoding='utf8'))) error_log['anime-list TVDBid missing'].append( 'AniDBid: "{}" | Title: "{}" | Has no matching TVDBid "{}" in mapping file | <a href="{}" target="_blank">Submit bug report</a>' .format(AniDB_id, "title", TVDBid, link)) Log.Info( '"anime-list TVDBid missing.htm" log added as tvdb serie id missing in mapping file: "{}"' .format(TVDBid)) # guid need 1 entry only, not an TheTVDB numbered serie with anidb guid if (AniDB_id or TMDB_id or IMDB_id) and (movie or max(map(int, media.seasons.keys())) <= 1): break else: # Loop has gone through all entries. This only happens when the exact entry is not found or a TVDB entry that needs to loop through all. if not found: Log.Info("ERROR: Could not find %s: %s" % (source, id)) if AniDB_id != "": error_log['anime-list AniDBid missing'].append( "AniDBid: " + common.WEB_LINK % (common.ANIDB_SERIE_URL + AniDB_id, AniDB_id)) # Reset the variables used for matching so it does not just keep the value of the last entry in the loop IMDBid, TMDBid, TVDBid, AniDBid = '', '', '', '' AniDB_winner = AniDB_id or AniDB_id2 TVDB_winner = TVDB_id or TVDB_id2 Log.Info(' ----- ------') Log.Info(' {:>5} {:>6}'.format( AniDB_winner, TVDB_winner)) SaveDict(Dict(tvdbcounts, TVDB_winner), mappingList, 'tvdbcount') if source == "tvdb": for s in media.seasons: for e in media.seasons[s].episodes: if int(e) > 100: SaveDict(True, mappingList, 'possible_anidb3') break else: SaveDict(False, mappingList, 'possible_anidb3') else: SaveDict(False, mappingList, 'possible_anidb3') for values in Dict(mappingList, 'TVDB', default={}).values(): if isinstance(values, tuple) and values[0] == '1' and values[1] == '1': SaveDict(True, mappingList, 's1e1_mapped') break else: SaveDict(False, mappingList, 's1e1_mapped') ### Update collection/studio TVDB_collection, title, studio = [], '', '' for anime in AniDBTVDBMapFull.iter( 'anime') if AniDBTVDBMapFull and TVDB_winner.isdigit() else []: if anime.get('tvdbid', "") == TVDB_winner: TVDB_collection.append(anime.get("anidbid", "")) if anime_core(anime)[3]: #[3]==is_primary_series title = AniDB.GetAniDBTitle( AniDB.AniDBTitlesDB.xpath( '/animetitles/anime[@aid="{}"]/title'.format( anime.get("anidbid", ""))))[ 0] #returns [title, main, language_rank] studio = GetXml(anime, "supplemental-info/studio") if len( TVDB_collection ) > 1 and title: # Require that there be at least 2 anidb mappings for a collection Log.Info( "[ ] collection: TVDBid '%s' is part of collection: '%s', related_anime_list: %s" % (TVDB_winner, SaveDict([title + ' Collection'], AnimeLists_dict, 'collections'), TVDB_collection)) else: Log.Info("[ ] collection: TVDBid '%s' is not part of any collection" % TVDB_winner) Log.Info("[ ] studio: {}".format( SaveDict(studio, AnimeLists_dict, 'studio'))) Log.Info("--- return ---".ljust(157, '-')) Log.Info( "AniDB_id: '{}', AniDB_id2: '{}', AniDBid: '{}', TVDB_id: '{}', TVDB_id2: '{}', TVDBid: '{}'" .format(AniDB_id, AniDB_id2, AniDBid, TVDB_id, TVDB_id2, TVDBid)) Log.Info("mappingList: {}".format(DictString(mappingList, 1))) Log.Info("AnimeLists_dict: {}".format(DictString(AnimeLists_dict, 1))) return AnimeLists_dict, AniDB_winner, TVDB_winner if TVDB_winner.isdigit( ) else "", Dict(mappingList, 'tmdbid'), Dict(mappingList, 'imdbid'), mappingList
def GetMetadata(media, movie, error_log, id): Log.Info("=== AnimeLists.GetMetadata() ===".ljust(157, '=')) MAPPING_FEEDBACK = 'http://github.com/ScudLee/anime-lists/issues/new?title=%s&body=%s' # ScudLee mapping file git feedback url mappingList, AnimeLists_dict = {}, {} #mappingList['poster_id_array'] = {} found = False source, id = id.split('-', 1) if '-' in id else ("", id) AniDB_id = id if source.startswith('anidb') else "" TVDB_id = id if source.startswith('tvdb') else "" TMDB_id = id if source.startswith('tmdb') else "" AniDBid = "" TVDBid = "" TMDBid = "" IMDBid = "" tvdb_numbering = True if not movie and ( TVDB_id or AniDB_id and max(map(int, media.seasons.keys())) > 1) else False tvdbcounts = {} ### Search for match ### Log.Info("tvdb_numbering: {}".format(tvdb_numbering)) AniDB_id2, TVDB_id2 = "", "" Log.Info("--- AniDBTVDBMap ---".ljust(157, '-')) forcedID = { 'anidbid': AniDB_id, 'tvdbid': TVDB_id, 'tmdbid': TMDB_id, "imdbid": "" } for anime in AniDBTVDBMap.iter('anime') if AniDBTVDBMap else []: # gather any manually specified source ids foundID, wantedID = {}, {} for check in forcedID.keys(): foundID[check] = anime.get(check, "") wantedID[check] = True if foundID[check] == forcedID[ check] and forcedID[check] != '' else False # if this row matches our specified source-id if True in wantedID.values(): # save the found values for later use in other GetMetadata that dont depend on AniDB etc. IMDBid, TMDBid, TVDBid, AniDBid = foundID['imdbid'], foundID[ 'tmdbid'], foundID['tvdbid'], foundID['anidbid'] # use the old check to decide whether to proceed if TVDBid == '' and AniDBid == '': continue # nothing found, skip else: continue # record the number of entries using the same tvdb id SaveDict(Dict(tvdbcounts, TVDBid, default=0) + 1, tvdbcounts, TVDBid) found = True if not tvdb_numbering and not TVDB_id: TVDB_id = TVDBid if tvdb_numbering and AniDBid and TVDBid.isdigit( ) and anime.get('defaulttvdbseason') in [ 'a', '1' ] and anime.get('episodeoffset') in ['', '0'] and len( anime.xpath( "mapping-list/mapping[@anidbseason='1'][@tvdbseason='0']") ) == 0 and not AniDB_id: AniDB_id2 = AniDBid Log.Info( "[+] AniDBid: {:>5}, TVDBid: {:>6}, defaulttvdbseason: {:>2}, offset: {:>3}, name: {}" .format(AniDBid, TVDBid, anime.get('defaulttvdbseason'), anime.get('episodeoffset') or '0', GetXml(anime, 'name'))) ### Anidb numbered serie ### if AniDB_id: # or defaulttvdbseason=='1': SaveDict(anime.get('tmdbid', ""), mappingList, 'tmdbid') SaveDict(anime.get('imdbid', ""), mappingList, 'imdbid') SaveDict(anime.get('defaulttvdbseason'), mappingList, 'defaulttvdbseason') SaveDict( anime.get('episodeoffset') or '0', mappingList, 'episodeoffset') SaveDict(GetXml(anime, 'name'), mappingList, 'name') SaveDict(GetXml(anime, 'studio'), AnimeLists_dict, 'studio') SaveDict(GetXml(anime, "supplemental-info/director"), AnimeLists_dict, 'director') SaveDict(GetXml(anime, "supplemental-info/credits"), AnimeLists_dict, 'writer') for genre in anime.xpath('supplemental-info/genre'): SaveDict([genre.text], AnimeLists_dict, 'genres') for art in anime.xpath('supplemental-info/fanart/thumb'): SaveDict( { art.text: ('/'.join( art.text.split('/')[3:]), 1, art.get('preview')) }, AnimeLists_dict, 'art') ### TheTVDB numbered series ### if TVDB_id or not movie and max(map(int, media.seasons.keys( ))) > 1 and AniDB_id == '': #In case AniDB guid but multiple seasons if TVDBid.isdigit(): if anime.get('defaulttvdbseason'): if anime.get('defaulttvdbseason') in [ 'a', '1' ] and anime.get('episodeoffset') in ['', '0'] and len( anime.xpath( "mapping-list/mapping[@anidbseason='1'][@tvdbseason='0']" )) == 0: SaveDict(anime.get('defaulttvdbseason'), mappingList, 'defaulttvdbseason') AniDB_id2 = AniDBid SaveDict( anime.get('episodeoffset') or '0', mappingList, 'TVDB', 's-1' if anime.get('defaulttvdbseason') == '0' and len( anime.xpath( "mapping-list/mapping[@anidbseason='1'][@tvdbseason='0']" )) >= 1 else 's' + anime.get('defaulttvdbseason'), AniDBid ) #mappingList['TVDB'][s1][anidbid]=episodeoffset SaveDict( { 'min': anime.get('defaulttvdbseason'), 'max': anime.get('defaulttvdbseason') }, mappingList, 'season_map', AniDBid ) # Set the min/max season to the 'defaulttvdbseason' if source == "tvdb6" and anime.get( 'episodeoffset').isdigit() and int( anime.get('episodeoffset')) > 0: SaveDict( { 'min': '0', 'max': '0' }, mappingList, 'season_map', AniDBid ) # Force series as special if not starting the TVDB season for season in anime.iter( 'mapping' ): ### mapping list: <mapping-list> <mapping anidbseason="0" tvdbseason="0">;1-12;2-14;3-16;4-18;</mapping> </mapping-list> anidbseason, tvdbseason, offset, start, end = season.get( 'anidbseason'), season.get('tvdbseason'), season.get( 'offset') or '0', season.get('start'), season.get( 'end') Log.Info( " - season: [{:>2}], [{:>2}], range: [{:>3}-{:>3}], offset: {:>3}, text: {}" .format(anidbseason, tvdbseason, start or '000', end or '000', offset, (season.text or '').strip(';'))) for ep in range(int(start), int(end) + 1) if start else []: #Log.Info("[?] start: {}, end: {}, ep: {}".format(start, end, ep)) if not Dict( mappingList, 'TVDB', 's' + tvdbseason + 'e' + str(ep + int(offset))): SaveDict( (anidbseason, str(ep), AniDBid), mappingList, 'TVDB', 's' + tvdbseason + 'e' + str(ep + int(offset)) ) #mappingList['TVDB'][s1e1]=(AniDB_season, AniDB_episode, AniDBid) for start-end mappings #else: Log.Info("already present") for ep in filter( None, season.text.split(';')) if season.text else []: if not '-' in ep: Log.Info( '[!] MAPPING ERROR, season.text: "{}", ep mapping missing hyphen: "{}"' .format(season.text, ep)) elif not Dict( mappingList, 'TVDB', 's' + tvdbseason + 'e' + ep.split('-')[1]): SaveDict( (anidbseason, ep.split('-')[0], AniDBid), mappingList, 'TVDB', 's' + tvdbseason + 'e' + ep.split('-')[1] ) #mappingList['TVDB'][s1e1]=(AniDB_season, AniDB_episode, AniDBid) for manual mapping like '1-12' #elif '-' not in (mappingList, 'TVDB', 's'+tvdbseason+'e'+ep.split('-')[1]): # SaveDict((anidbseason, Dict(mappingList, 'TVDB', 's'+tvdbseason+'e'+ep.split('-')[1])[1]+'-'+ep.split('-')[0], AniDBid), mappingList, 'TVDB', 's'+tvdbseason+'e'+ep.split('-')[1]) # Log.Info("already present so converting to range but range not supported") if Dict(mappingList, 'season_map', AniDBid, 'max').isdigit() and int( Dict(mappingList, 'season_map', AniDBid, 'max')) < int(season.get("tvdbseason")): SaveDict( season.get("tvdbseason"), mappingList, 'season_map', AniDBid, 'max' ) # Update the max season to the largest 'tvdbseason' season seen in 'mapping-list' elif TVDBid == "hentai": SaveDict("X", AnimeLists_dict, 'content_rating') elif TVDBid in ("", "unknown", None): link = MAPPING_FEEDBACK % ("aid:%s '%s' TVDBid:" % (AniDB_id, "title"), String.StripTags( XML.StringFromElement( anime, encoding='utf8'))) error_log['anime-list TVDBid missing'].append( 'AniDBid: "{}" | Title: "{}" | Has no matching TVDBid "{}" in mapping file | <a href="{}" target="_blank">Submit bug report</a>' .format(AniDB_id, "title", TVDBid, link)) Log.Info( '"anime-list TVDBid missing.htm" log added as tvdb serie id missing in mapping file: "{}"' .format(TVDBid)) #AniDB guid need 1 AniDB xml only, not an TheTVDB numbered serie with anidb guid (not anidb2 since seen as TheTVDB) if AniDB_id and (movie or max(map(int, media.seasons.keys())) <= 1): break else: # case [tmdb-123]: # <anime anidbid="456" tvdbid="" defaulttvdbseason="" episodeoffset="" tmdbid="123" imdbid=""> # fails the above tvdbid + anidb check, but useful info was still obtained (anidbid=456) # <anime tmdbid="123"> # fails the above tvdbid + anidbid check, so this used to return a blank tmdbid to be later used in # TheMovieDB.GetMetadata(), and '' as AniDBid to be used in AniDB.GetMetadata() # so, not resetting the AniDBid/TVDBid, and saving found info if ((TMDB_id or TMDBid) or IMDBid): SaveDict(TMDB_id or TMDBid or '', mappingList, 'tmdbid') SaveDict(IMDBid or '', mappingList, 'imdbid') Log.Info( "Saved possible tmdb/imdb values for later '%s'/'%s' for later, since not in AnimeList." % (Dict(mappingList, 'tmdbid'), Dict(mappingList, 'imdbid'))) elif not found: Log.Info("ERROR: Could not find %s: %s" % (source, id)) # this error only makes sense if it's AniDB_id, right? otherwise AniDB_id is always == "" # since it cant be not found and also have been set if AniDB_id != "": error_log['anime-list AniDBid missing'].append( "AniDBid: " + common.WEB_LINK % (common.ANIDB_SERIE_URL + AniDB_id, AniDB_id)) # keeping this reset since im not clear on it's purpose. AniDBid, TVDBid = '', '' Log.Info(' ----- ------') Log.Info(' {:>5} {:>6}'.format( AniDB_id or AniDB_id2 or AniDBid, TVDB_id or TVDBid)) SaveDict(Dict(tvdbcounts, TVDB_id or TVDBid), mappingList, 'tvdbcount') ### Update collection TVDB_collection, title = [], '' for anime in AniDBTVDBMap.iter( 'anime') if AniDBTVDBMap and TVDB_id.isdigit() else []: if anime.get('tvdbid', "") == TVDB_id: TVDB_collection.append(anime.get("anidbid", "")) if anime.get('defaulttvdbseason') in [ 'a', '1' ] and anime.get('episodeoffset') in ['', '0'] and len( anime.xpath( "mapping-list/mapping[@anidbseason='1'][@tvdbseason='0']" )) == 0: title = AniDB.GetAniDBTitle( AniDB.AniDBTitlesDB.xpath( '/animetitles/anime[@aid="{}"]/title'.format( anime.get("anidbid", ""))))[ 0] #returns [title, main, language_rank] if len(TVDB_collection) > 1 and title: SaveDict([title + ' Collection'], AnimeLists_dict, 'collections') Log.Info("[ ] collection: TVDBid '%s' is part of collection: '%s'" % (TVDB_id, title)) else: Log.Info("[ ] collection: TVDBid '%s' is not part of any collection" % (TVDB_id)) Log.Info("--- return ---".ljust(157, '-')) Log.Info( "AniDB_id: '{}', AniDB_id2: '{}', AniDBid: '{}', TVDB_id: '{}', TVDBid: '{}'" .format(AniDB_id, AniDB_id2, AniDBid, TVDB_id, TVDBid)) Log.Info("mappingList: {}".format(DictString(mappingList, 1))) Log.Info("AnimeLists_dict: {}".format(DictString(AnimeLists_dict, 1))) return AnimeLists_dict, AniDB_id or AniDB_id2 or AniDBid, ( TVDB_id or TVDBid) if (TVDB_id or TVDBid).isdigit() else "", Dict( mappingList, 'tmdbid'), Dict(mappingList, 'imdbid'), mappingList