package YTMusicAPI::Parsers::Albums; use strict; use warnings; use YTMusicAPI::Navigation; sub parse_album_header { my ($response) = @_; my $header = nav( $response, $HEADER_DETAIL ); my $album = { title => nav( $header, $TITLE_TEXT ), type => nav( $header, $SUBTITLE ), thumbnails => nav( $header, $THUMBNAIL_CROPPED ), isExplicit => defined( nav( $header, $SUBTITLE_BADGE_LABEL, 1 ) ) ? 1 : 0, }; if ( exists $header->{description} ) { $album->{description} = $header->{description}->{runs}->[0]->{text}; } my $album_info = parse_song_runs( $header->{subtitle}->{runs}->[ 2 .. $#{ $header->{subtitle}->{runs} } ] ); @$album{ keys %$album_info } = values %$album_info; if ( scalar @{ $header->{secondSubtitle}->{runs} } > 1 ) { $album->{trackCount} = to_int( $header->{secondSubtitle}->{runs}->[0]->{text} ); $album->{duration} = $header->{secondSubtitle}->{runs}->[2]->{text}; } else { $album->{duration} = $header->{secondSubtitle}->{runs}->[0]->{text}; } my $menu = nav( $header, $MENU ); my $toplevel = $menu->{topLevelButtons}; $album->{audioPlaylistId} = nav( $toplevel, [ 0, 'buttonRenderer', $NAVIGATION_WATCH_PLAYLIST_ID ], 1 ); unless ( $album->{audioPlaylistId} ) { $album->{audioPlaylistId} = nav( $toplevel, [ 0, 'buttonRenderer', $NAVIGATION_PLAYLIST_ID ], 1 ); } my $service = nav( $toplevel, [ 1, 'buttonRenderer', 'defaultServiceEndpoint' ], 1 ); if ($service) { $album->{likeStatus} = parse_like_status($service); } return $album; } 1;