diff --git a/ythdd_inv_tl.py b/ythdd_inv_tl.py index d9b44e6..cd5810a 100644 --- a/ythdd_inv_tl.py +++ b/ythdd_inv_tl.py @@ -385,38 +385,74 @@ def videos(data): related_raw = safeTraverse(wdata, ['ec2', 'contents', 'twoColumnWatchNextResults', 'secondaryResults', 'secondaryResults', 'results'], default=[]) # can possibly change in the future related = [] - for x in related_raw: - y = safeTraverse(x, ['compactVideoRenderer']) - if type(y) != dict: - continue - related_video = {} - related_video['videoId'] = safeTraverse(y, ['videoId']) - related_video['title'] = safeTraverse(y, ['title', 'simpleText']) - related_video['videoThumbnails'] = genThumbs(related_video['videoId']) #safeTraverse(y, ['thumbnail', 'thumbnails']) - related_video['author'] = safeTraverse(y, ['longBylineText', 'runs', 0, 'text']) - related_video['authorId'] = safeTraverse(y, ['longBylineText', 'runs', 0, 'navigationEndpoint', 'browseEndpoint', 'browseId'], default="UNKNOWNCHANNELID") - related_video['authorUrl'] = '/channel/' + related_video['authorId'] - related_video['authorVerified'] = False - if "ownerBadges" in y: - related_video['authorVerified'] = True # hopefully this won't break things, as invidious API doesn't distinguish music and normal verified badges - related_video['authorThumbnails'] = safeTraverse(y, ['channelThumbnail', 'thumbnails'], default=[]) - for z in related_video['authorThumbnails']: - z['url'] = ythdd_globals.translateLinks(z['url']) - related_video['lengthSeconds'] = 0 - time_lookup_list = [1, 60, 3_600, 86_400] - time_list = safeTraverse(y, ['lengthText', 'simpleText'], default="0:0").split(":") - for z in range(len(time_list)): - related_video['lengthSeconds'] += time_lookup_list[z] * int(time_list[len(time_list) - 1 - z]) - related_views_text = safeTraverse(y, ['viewCountText', 'simpleText'], default="0").split(" ")[0] - related_video['viewCountText'] = safeTraverse(y, ['shortViewCountText', 'simpleText'], default="0").split(" ")[0] - related_views = 0 - if related_views_text: - if related_views_text.lower() == "no": - related_views_text = "0" - related_views = int("0" + "".join([z for z in related_views_text if 48 <= ord(z) and ord(z) <= 57])) - related_views_text = related_views_text.split(" ")[0] - related_video['viewCount'] = related_views - related.append(related_video) + for x in related_raw[:-1]: + if safeTraverse(x, ['compactVideoRenderer'], default=[]): + y = safeTraverse(x, ['compactVideoRenderer']) + if type(y) != dict: + continue + related_video = {} + related_video['videoId'] = safeTraverse(y, ['videoId']) + related_video['title'] = safeTraverse(y, ['title', 'simpleText']) + related_video['videoThumbnails'] = genThumbs(related_video['videoId']) #safeTraverse(y, ['thumbnail', 'thumbnails']) + related_video['author'] = safeTraverse(y, ['longBylineText', 'runs', 0, 'text']) + related_video['authorId'] = safeTraverse(y, ['longBylineText', 'runs', 0, 'navigationEndpoint', 'browseEndpoint', 'browseId'], default="UNKNOWNCHANNELID") + related_video['authorUrl'] = '/channel/' + related_video['authorId'] + related_video['authorVerified'] = False + if "ownerBadges" in y: + related_video['authorVerified'] = True # hopefully this won't break things, as invidious API doesn't distinguish music and normal verified badges + related_video['authorThumbnails'] = safeTraverse(y, ['channelThumbnail', 'thumbnails'], default=[]) + for z in related_video['authorThumbnails']: + z['url'] = ythdd_globals.translateLinks(z['url']) + related_video['lengthSeconds'] = 0 + time_lookup_list = [1, 60, 3_600, 86_400] + time_list = safeTraverse(y, ['lengthText', 'simpleText'], default="0:0").split(":") + for z in range(len(time_list)): + related_video['lengthSeconds'] += time_lookup_list[z] * int(time_list[len(time_list) - 1 - z]) + related_views_text = safeTraverse(y, ['viewCountText', 'simpleText'], default="0").split(" ")[0] + related_video['viewCountText'] = safeTraverse(y, ['shortViewCountText', 'simpleText'], default="0").split(" ")[0] + related_views = 0 + if related_views_text: + if related_views_text.lower() == "no": + related_views_text = "0" + related_views = int("0" + "".join([z for z in related_views_text if 48 <= ord(z) and ord(z) <= 57])) + related_views_text = related_views_text.split(" ")[0] + related_video['viewCount'] = related_views + related.append(related_video) + else: + y = safeTraverse(x, ['lockupViewModel']) + if type(y) != dict: + continue + lmvm = safeTraverse(y, ['metadata', 'lockupMetadataViewModel'], default=[]) + related_video = {} + related_video['videoId'] = safeTraverse(y, ['contentId']) + related_video['title'] = safeTraverse(lmvm, ['title', 'content']) + related_video['videoThumbnails'] = genThumbs(related_video['videoId']) #safeTraverse(y, ['thumbnail', 'thumbnails']) + related_video['author'] = safeTraverse(lmvm, ['metadata', 'contentMetadataViewModel', 'metadataRows', 0, 'metadataParts', 0, 'text', 'content']) + related_video['authorId'] = safeTraverse(lmvm, ['image', 'decoratedAvatarViewModel', 'rendererContext', 'commandContext', 'onTap', 'innertubeCommand', 'browseEndpoint', 'browseId'], default="UNKNOWNCHANNELID") + related_video['authorUrl'] = '/channel/' + related_video['authorId'] + related_video['authorVerified'] = False if safeTraverse(lmvm, ['metadata', 'contentMetadataViewModel', 'metadataRows', 0, 'metadataParts', 0, 'text', 'attachmentRuns']) is None else True # seens to do the job + related_video['authorThumbnails'] = safeTraverse(lmvm, ['image', 'decoratedAvatarViewModel', 'avatar', 'avatarViewModel', 'image', 'sources'], default=[]) + for z in related_video['authorThumbnails']: + z['url'] = ythdd_globals.translateLinks(z['url']) + related_video['lengthSeconds'] = 0 + time_lookup_list = [1, 60, 3_600, 86_400] + time_list = safeTraverse(y, ['contentImage', 'thumbnailViewModel', 'overlays', 0, 'thumbnailOverlayBadgeViewModel', 'thumbnailBadges', 0, 'thumbnailBadgeViewModel', 'text'], default="0:0").split(":") + for z in range(len(time_list)): + related_video['lengthSeconds'] += time_lookup_list[z] * int(time_list[len(time_list) - 1 - z]) + related_views_text = safeTraverse(lmvm, ['metadata', 'contentMetadataViewModel', 'metadataRows', 1, 'metadataParts', 0, 'text', 'content'], default="0").split(" ")[0] + related_video['viewCountText'] = safeTraverse(lmvm, ['metadata', 'contentMetadataViewModel', 'metadataRows', 1, 'metadataParts', 0, 'text', 'content'], default="0").split(" ")[0] + related_views = 0 + magnitude = {'K': 1_000, 'M': 1_000_000, 'B': 1_000_000_000} + if related_views_text: + if related_views_text.lower() == "no": + related_views_text = "0" + related_views = int("0" + "".join([z for z in related_views_text if 48 <= ord(z) and ord(z) <= 57])) + related_views_text = related_views_text.split(" ")[0] + for x in magnitude.keys(): + if x == related_views_text[-1]: + related_views *= magnitude[x] + related_video['viewCount'] = related_views + related.append(related_video) # magnitude = {'K': 1_000, 'M': 1_000_000, 'B': 1_000_000_000} # toplevel_buttons = safeTraverse(video_primary_renderer, ['videoActions', 'menuRenderer', 'topLevelButtons'], default={}) # hacky solution @@ -549,6 +585,7 @@ def videos(data): if ythdd_globals.config['general']['debug']: response["ydata"] = ydata + response["wdata"] = wdata # for debugging: #return send(200, ythdd_extractor.WEBextractSinglePage(data[3]))