57 lines
1.7 KiB
Perl
57 lines
1.7 KiB
Perl
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;
|