From efc939234a6c856046bf53ed3504e1cef7150c57 Mon Sep 17 00:00:00 2001 From: girst Date: Fri, 7 Aug 2020 17:59:57 +0200 Subject: [PATCH] more innertube variants --- app/common/innertube.py | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/app/common/innertube.py b/app/common/innertube.py index 658bd93..410f791 100644 --- a/app/common/innertube.py +++ b/app/common/innertube.py @@ -285,13 +285,18 @@ def parse_channel_items(items, channel_id, author): for item in items: key = next(iter(item.keys()), None) content = item[key] - if key == "gridVideoRenderer" or key == "videoRenderer": + if key in ["gridVideoRenderer", "videoRenderer", "videoCardRenderer"]: + # only videoCardRenderer (topic channels) has author and channel, others fall back to supplied ones. result.append({'type': 'VIDEO', 'content': { 'video_id': content['videoId'], 'title': content['title']['simpleText'], - 'author': author, - 'channel_id': channel_id, - 'length': listfind(content.get('thumbnailOverlays',[]),'thumbnailOverlayTimeStatusRenderer').get('text',{}).get('simpleText'), + 'author': content.get('bylineText',{}).get('runs',[{}])[0].get('text') or author, + 'channel_id': content.get('bylineText',{}).get('runs',[{}])[0] \ + .get('navigationEndpoint',{}).get('browseEndpoint',{}).get('browseId') or channel_id, + 'length': (content.get('lengthText',{}).get('simpleText') or # topic channel + listfind(content.get('thumbnailOverlays',[]),'thumbnailOverlayTimeStatusRenderer') + .get('text',{}).get('simpleText')), + # topic channel: .metadataText.simpleText = "22M views \u00b7 2 months ago" 'views': toInt(content.get('viewCountText',{}).get('simpleText')), 'published': age(content.get('publishedTimeText',{}).get('simpleText')), }}) @@ -307,13 +312,24 @@ def parse_channel_items(items, channel_id, author): content.get('videoCountShortText',{}).get('simpleText') or # grid(1) content.get('videoCountText',{}).get('runs',[{}])[0].get('text')), # grid(2) }}) - elif key == "itemSectionRenderer": - r, e = parse_channel_items(content['contents'], channel_id, author) + elif key in ["itemSectionRenderer", "gridRenderer", "horizontalCardListRenderer"]: + newkey = { + "itemSectionRenderer": 'contents', + "gridRenderer": 'items', + "horizontalCardListRenderer": 'cards', + }.get(key) + r, e = parse_channel_items(content[newkey], channel_id, author) + result.extend(r) + extra.extend(e) + elif key == "shelfRenderer": + r, e = parse_channel_items([content['content']], channel_id, author) result.extend(r) extra.extend(e) elif key == "messageRenderer": # e.g. {'messageRenderer': {'text': {'runs': [{'text': 'This channel has no playlists.'}]}}} pass + elif key == "gameCardRenderer": + pass else: log_unknown_card(item) -- 2.39.3