@ -51,23 +51,43 @@ class YandexMusicTrackIE(YandexMusicBaseIE):
IE_DESC = ' Яндекс.Музыка - Трек '
IE_DESC = ' Яндекс.Музыка - Трек '
_VALID_URL = r ' https?://music \ .yandex \ .(?:ru|kz|ua|by)/album/(?P<album_id> \ d+)/track/(?P<id> \ d+) '
_VALID_URL = r ' https?://music \ .yandex \ .(?:ru|kz|ua|by)/album/(?P<album_id> \ d+)/track/(?P<id> \ d+) '
_TEST = {
_TESTS = [ {
' url ' : ' http://music.yandex.ru/album/540508/track/4878838 ' ,
' url ' : ' http://music.yandex.ru/album/540508/track/4878838 ' ,
' md5 ' : ' f496818aa2f60b6c0062980d2e00dc20 ' ,
' md5 ' : ' f496818aa2f60b6c0062980d2e00dc20 ' ,
' info_dict ' : {
' info_dict ' : {
' id ' : ' 4878838 ' ,
' id ' : ' 4878838 ' ,
' ext ' : ' mp3 ' ,
' ext ' : ' mp3 ' ,
' title ' : ' Carlo Ambrosio, Carlo Ambrosio & Fabio Di Bari - Gypsy Eyes 1 ' ,
' title ' : ' Carlo Ambrosio & Fabio Di Bari - Gypsy Eyes 1 ' ,
' filesize ' : 4628061 ,
' filesize ' : 4628061 ,
' duration ' : 193.04 ,
' duration ' : 193.04 ,
' track ' : ' Gypsy Eyes 1 ' ,
' track ' : ' Gypsy Eyes 1 ' ,
' album ' : ' Gypsy Soul ' ,
' album ' : ' Gypsy Soul ' ,
' album_artist ' : ' Carlo Ambrosio ' ,
' album_artist ' : ' Carlo Ambrosio ' ,
' artist ' : ' Carlo Ambrosio, Carlo Ambrosio & Fabio Di Bari ' ,
' artist ' : ' Carlo Ambrosio & Fabio Di Bari ' ,
' release_year ' : 2009 ,
' release_year ' : 2009 ,
} ,
} ,
' skip ' : ' Travis CI servers blocked by YandexMusic ' ,
' skip ' : ' Travis CI servers blocked by YandexMusic ' ,
}
} , {
# multiple disks
' url ' : ' http://music.yandex.ru/album/3840501/track/705105 ' ,
' md5 ' : ' ebe7b4e2ac7ac03fe11c19727ca6153e ' ,
' info_dict ' : {
' id ' : ' 705105 ' ,
' ext ' : ' mp3 ' ,
' title ' : ' Hooverphonic - Sometimes ' ,
' filesize ' : 5743386 ,
' duration ' : 239.27 ,
' track ' : ' Sometimes ' ,
' album ' : ' The Best of Hooverphonic ' ,
' album_artist ' : ' Hooverphonic ' ,
' artist ' : ' Hooverphonic ' ,
' release_year ' : 2016 ,
' genre ' : ' pop ' ,
' disc_number ' : 2 ,
' track_number ' : 9 ,
} ,
' skip ' : ' Travis CI servers blocked by YandexMusic ' ,
} ]
def _real_extract ( self , url ) :
def _real_extract ( self , url ) :
mobj = re . match ( self . _VALID_URL , url )
mobj = re . match ( self . _VALID_URL , url )
@ -110,9 +130,21 @@ class YandexMusicTrackIE(YandexMusicBaseIE):
' abr ' : int_or_none ( download_data . get ( ' bitrate ' ) ) ,
' abr ' : int_or_none ( download_data . get ( ' bitrate ' ) ) ,
}
}
def extract_artist_name ( artist ) :
decomposed = artist . get ( ' decomposed ' )
if not isinstance ( decomposed , list ) :
return artist [ ' name ' ]
parts = [ artist [ ' name ' ] ]
for element in decomposed :
if isinstance ( element , dict ) and element . get ( ' name ' ) :
parts . append ( element [ ' name ' ] )
elif isinstance ( element , compat_str ) :
parts . append ( element )
return ' ' . join ( parts )
def extract_artist ( artist_list ) :
def extract_artist ( artist_list ) :
if artist_list and isinstance ( artist_list , list ) :
if artist_list and isinstance ( artist_list , list ) :
artists_names = [ a [ ' name ' ] for a in artist_list if a . get ( ' name ' ) ]
artists_names = [ extract_artist_name ( a ) for a in artist_list if a . get ( ' name ' ) ]
if artists_names :
if artists_names :
return ' , ' . join ( artists_names )
return ' , ' . join ( artists_names )
@ -121,10 +153,17 @@ class YandexMusicTrackIE(YandexMusicBaseIE):
album = albums [ 0 ]
album = albums [ 0 ]
if isinstance ( album , dict ) :
if isinstance ( album , dict ) :
year = album . get ( ' year ' )
year = album . get ( ' year ' )
disc_number = int_or_none ( try_get (
album , lambda x : x [ ' trackPosition ' ] [ ' volume ' ] ) )
track_number = int_or_none ( try_get (
album , lambda x : x [ ' trackPosition ' ] [ ' index ' ] ) )
track_info . update ( {
track_info . update ( {
' album ' : album . get ( ' title ' ) ,
' album ' : album . get ( ' title ' ) ,
' album_artist ' : extract_artist ( album . get ( ' artists ' ) ) ,
' album_artist ' : extract_artist ( album . get ( ' artists ' ) ) ,
' release_year ' : int_or_none ( year ) ,
' release_year ' : int_or_none ( year ) ,
' genre ' : album . get ( ' genre ' ) ,
' disc_number ' : disc_number ,
' track_number ' : track_number ,
} )
} )
track_artist = extract_artist ( track . get ( ' artists ' ) )
track_artist = extract_artist ( track . get ( ' artists ' ) )
@ -152,7 +191,7 @@ class YandexMusicAlbumIE(YandexMusicPlaylistBaseIE):
IE_DESC = ' Яндекс.Музыка - Альбом '
IE_DESC = ' Яндекс.Музыка - Альбом '
_VALID_URL = r ' https?://music \ .yandex \ .(?:ru|kz|ua|by)/album/(?P<id> \ d+)/?( \ ?|$) '
_VALID_URL = r ' https?://music \ .yandex \ .(?:ru|kz|ua|by)/album/(?P<id> \ d+)/?( \ ?|$) '
_TEST = {
_TESTS = [ {
' url ' : ' http://music.yandex.ru/album/540508 ' ,
' url ' : ' http://music.yandex.ru/album/540508 ' ,
' info_dict ' : {
' info_dict ' : {
' id ' : ' 540508 ' ,
' id ' : ' 540508 ' ,
@ -160,7 +199,15 @@ class YandexMusicAlbumIE(YandexMusicPlaylistBaseIE):
} ,
} ,
' playlist_count ' : 50 ,
' playlist_count ' : 50 ,
' skip ' : ' Travis CI servers blocked by YandexMusic ' ,
' skip ' : ' Travis CI servers blocked by YandexMusic ' ,
}
} , {
' url ' : ' https://music.yandex.ru/album/3840501 ' ,
' info_dict ' : {
' id ' : ' 3840501 ' ,
' title ' : ' Hooverphonic - The Best of Hooverphonic (2016) ' ,
} ,
' playlist_count ' : 33 ,
' skip ' : ' Travis CI servers blocked by YandexMusic ' ,
} ]
def _real_extract ( self , url ) :
def _real_extract ( self , url ) :
album_id = self . _match_id ( url )
album_id = self . _match_id ( url )
@ -169,7 +216,7 @@ class YandexMusicAlbumIE(YandexMusicPlaylistBaseIE):
' http://music.yandex.ru/handlers/album.jsx?album= %s ' % album_id ,
' http://music.yandex.ru/handlers/album.jsx?album= %s ' % album_id ,
album_id , ' Downloading album JSON ' )
album_id , ' Downloading album JSON ' )
entries = self . _build_playlist ( album [ ' volumes ' ] [ 0 ] )
entries = self . _build_playlist ( [ track for volume in album [ ' volumes ' ] for track in volume ] )
title = ' %s - %s ' % ( album [ ' artists ' ] [ 0 ] [ ' name ' ] , album [ ' title ' ] )
title = ' %s - %s ' % ( album [ ' artists ' ] [ 0 ] [ ' name ' ] , album [ ' title ' ] )
year = album . get ( ' year ' )
year = album . get ( ' year ' )