parsePlaylistHeaderMeta function
- JsonMap header
Parses header meta from playlist.
Implementation
JsonMap parsePlaylistHeaderMeta(JsonMap header) {
final playlistMeta = <String, dynamic>{
'views': null,
'duration': null,
'trackCount': null,
'title':
((header['title'] as JsonMap?)?['runs'] as List? ?? [])
.map((run) => (run as JsonMap)['text'])
.join(),
'thumbnails': nav(header, THUMBNAILS),
};
if (header.containsKey('facepile')) {
playlistMeta['author'] = {
'name': nav(header, [
'facepile',
'avatarStackViewModel',
'text',
'content',
]),
'id': nav(header, [
'facepile',
'avatarStackViewModel',
'rendererContext',
'commandContext',
'onTap',
'innertubeCommand',
'browseEndpoint',
'browseId',
], nullIfAbsent: true),
};
}
if (((header['secondSubtitle'] as JsonMap?)?['runs'] as List?) != null) {
final secondSubtitleRuns =
(header['secondSubtitle'] as JsonMap)['runs'] as List;
final hasViews = (secondSubtitleRuns.length > 3) ? 2 : 0;
final hasDuration = (secondSubtitleRuns.length > 1) ? 2 : 0;
playlistMeta['views'] =
hasViews == 0
? null
: toInt((secondSubtitleRuns[0] as JsonMap)['text'] as String);
playlistMeta['duration'] =
hasDuration == 0
? null
: (secondSubtitleRuns[hasViews + hasDuration] as JsonMap)['text'];
final songCountText =
(secondSubtitleRuns[hasViews + 0] as JsonMap)['text'] as String;
final songCountSearch =
RegExp(r'\d+').allMatches(songCountText).map((m) => m[0]).join();
playlistMeta['trackCount'] =
songCountSearch.isEmpty ? null : toInt(songCountSearch);
}
return playlistMeta;
}