9
9
from ffmpy import FFmpeg
10
10
11
11
from const import TRACKS , ALBUM , GENRES , NAME , ITEMS , DISC_NUMBER , TRACK_NUMBER , IS_PLAYABLE , ARTISTS , IMAGES , URL , \
12
- RELEASE_DATE , ID , TRACKS_URL , SAVED_TRACKS_URL , TRACK_STATS_URL , CODEC_MAP , EXT_MAP , DURATION_MS
12
+ RELEASE_DATE , ID , TRACKS_URL , SAVED_TRACKS_URL , TRACK_STATS_URL , CODEC_MAP , EXT_MAP , DURATION_MS , HREF
13
13
from termoutput import Printer , PrintChannel
14
14
from utils import fix_filename , set_audio_tags , set_music_thumbnail , create_download_directory , \
15
15
get_directory_song_ids , add_to_directory_song_ids , get_previously_downloaded , add_to_archive , fmt_seconds
@@ -35,7 +35,7 @@ def get_saved_tracks() -> list:
35
35
return songs
36
36
37
37
38
- def get_song_info (song_id ) -> Tuple [List [str ], List [str ], str , str , Any , Any , Any , Any , Any , Any , int ]:
38
+ def get_song_info (song_id ) -> Tuple [List [str ], List [Any ], str , str , Any , Any , Any , Any , Any , Any , int ]:
39
39
""" Retrieves metadata for downloaded songs """
40
40
with Loader (PrintChannel .PROGRESS_INFO , "Fetching track information..." ):
41
41
(raw , info ) = ZSpotify .invoke_url (f'{ TRACKS_URL } ?ids={ song_id } &market=from_token' )
@@ -45,21 +45,8 @@ def get_song_info(song_id) -> Tuple[List[str], List[str], str, str, Any, Any, An
45
45
46
46
try :
47
47
artists = []
48
- genres = []
49
48
for data in info [TRACKS ][0 ][ARTISTS ]:
50
49
artists .append (data [NAME ])
51
- # query artist genres via href, which will be the api url
52
- with Loader (PrintChannel .PROGRESS_INFO , "Fetching artist information..." ):
53
- (raw , artistInfo ) = ZSpotify .invoke_url (f'{ data ["href" ]} ' )
54
- if ZSpotify .CONFIG .get_allGenres () and len (artistInfo [GENRES ]) > 0 :
55
- for genre in artistInfo [GENRES ]:
56
- genres .append (genre )
57
- elif len (artistInfo [GENRES ]) > 0 :
58
- genres .append (artistInfo [GENRES ][0 ])
59
-
60
- if len (genres ) == 0 :
61
- Printer .print (PrintChannel .WARNINGS , '### No Genres found for song ' + info [TRACKS ][0 ][NAME ])
62
- genres .append ('' )
63
50
64
51
album_name = info [TRACKS ][0 ][ALBUM ][NAME ]
65
52
name = info [TRACKS ][0 ][NAME ]
@@ -71,11 +58,34 @@ def get_song_info(song_id) -> Tuple[List[str], List[str], str, str, Any, Any, An
71
58
is_playable = info [TRACKS ][0 ][IS_PLAYABLE ]
72
59
duration_ms = info [TRACKS ][0 ][DURATION_MS ]
73
60
74
- return artists , genres , album_name , name , image_url , release_year , disc_number , track_number , scraped_song_id , is_playable , duration_ms
61
+ return artists , info [ TRACKS ][ 0 ][ ARTISTS ] , album_name , name , image_url , release_year , disc_number , track_number , scraped_song_id , is_playable , duration_ms
75
62
except Exception as e :
76
63
raise ValueError (f'Failed to parse TRACKS_URL response: { str (e )} \n { raw } ' )
77
64
78
65
66
+ def get_song_genres (rawartists : List [str ], track_name : str ) -> List [str ]:
67
+
68
+ try :
69
+ genres = []
70
+ for data in rawartists :
71
+ # query artist genres via href, which will be the api url
72
+ with Loader (PrintChannel .PROGRESS_INFO , "Fetching artist information..." ):
73
+ (raw , artistInfo ) = ZSpotify .invoke_url (f'{ data [HREF ]} ' )
74
+ if ZSpotify .CONFIG .get_all_genres () and len (artistInfo [GENRES ]) > 0 :
75
+ for genre in artistInfo [GENRES ]:
76
+ genres .append (genre )
77
+ elif len (artistInfo [GENRES ]) > 0 :
78
+ genres .append (artistInfo [GENRES ][0 ])
79
+
80
+ if len (genres ) == 0 :
81
+ Printer .print (PrintChannel .WARNINGS , '### No Genres found for song ' + track_name )
82
+ genres .append ('' )
83
+
84
+ return genres
85
+ except Exception as e :
86
+ raise ValueError (f'Failed to parse GENRES response: { str (e )} \n { raw } ' )
87
+
88
+
79
89
def get_song_duration (song_id : str ) -> float :
80
90
""" Retrieves duration of song in second as is on spotify """
81
91
@@ -106,7 +116,7 @@ def download_track(mode: str, track_id: str, extra_keys=None, disable_progressba
106
116
try :
107
117
output_template = ZSpotify .CONFIG .get_output (mode )
108
118
109
- (artists , genres , album_name , name , image_url , release_year , disc_number ,
119
+ (artists , raw_artists , album_name , name , image_url , release_year , disc_number ,
110
120
track_number , scraped_song_id , is_playable , duration_ms ) = get_song_info (track_id )
111
121
112
122
song_name = fix_filename (artists [0 ]) + ' - ' + fix_filename (name )
@@ -201,6 +211,8 @@ def download_track(mode: str, track_id: str, extra_keys=None, disable_progressba
201
211
202
212
time_downloaded = time .time ()
203
213
214
+ genres = get_song_genres (raw_artists , name )
215
+
204
216
convert_audio_format (filename_temp )
205
217
set_audio_tags (filename_temp , artists , genres , name , album_name , release_year , disc_number , track_number )
206
218
set_music_thumbnail (filename_temp , image_url )
0 commit comments