1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
|
from ytmusicapi.parsers.browsing import *
TRENDS = {"ARROW_DROP_UP": "up", "ARROW_DROP_DOWN": "down", "ARROW_CHART_NEUTRAL": "neutral"}
def parse_chart_song(data):
parsed = parse_song_flat(data)
parsed.update(parse_ranking(data))
return parsed
def parse_chart_artist(data):
subscribers = get_flex_column_item(data, 1)
if subscribers:
subscribers = nav(subscribers, TEXT_RUN_TEXT).split(" ")[0]
parsed = {
"title": nav(get_flex_column_item(data, 0), TEXT_RUN_TEXT),
"browseId": nav(data, NAVIGATION_BROWSE_ID),
"subscribers": subscribers,
"thumbnails": nav(data, THUMBNAILS),
}
parsed.update(parse_ranking(data))
return parsed
def parse_chart_trending(data):
flex_0 = get_flex_column_item(data, 0)
artists = parse_song_artists(data, 1)
index = get_dot_separator_index(artists)
# last item is views for some reason
views = None if index == len(artists) else artists.pop()["name"].split(" ")[0]
return {
"title": nav(flex_0, TEXT_RUN_TEXT),
"videoId": nav(flex_0, TEXT_RUN + NAVIGATION_VIDEO_ID, True),
"playlistId": nav(flex_0, TEXT_RUN + NAVIGATION_PLAYLIST_ID, True),
"artists": artists,
"thumbnails": nav(data, THUMBNAILS),
"views": views,
}
def parse_ranking(data):
return {
"rank": nav(data, ["customIndexColumn", "musicCustomIndexColumnRenderer", *TEXT_RUN_TEXT]),
"trend": TRENDS[nav(data, ["customIndexColumn", "musicCustomIndexColumnRenderer", *ICON_TYPE])],
}
|