def download_songs(download_list=()): print("Downloading {cnt} songs:".format(cnt=len(download_list))) for song in download_list: print(">>> [{song_name}]({song_url})".format(song_name=song.name, song_url=song.download_url())) remaining_list = list(download_list) downloader = downloadtool.get_download_tool("aria2") base_dir = config.get_config().get('download_dir') song_path_pattern = config.get_config().get('file_path_pattern') while len(remaining_list) > 0: for song in remaining_list: try: print("Downloading {name} ({curr}/{total})".format(name=song.name, curr=len(download_list)-len(remaining_list), total=len(download_list))) output_dir, output_file = _get_download_path(song, base_dir, song_path_pattern) if not os.path.exists(output_dir): os.makedirs(output_dir) downloader.download(uri=song.download_url(), file_name=output_file, dir_path=output_dir) remaining_list.remove(song) except Exception as e: print("Download error: {error}. {url} will try again later".format(error=e, url=song.download_url()))
def main(): from sys import argv if len(argv) < 3: print("Usage: username password") exit(1) username = argv[1] password = argv[2] s = Session() s.login(username, password) # print(s.get_collections().json()['playlist'][0]) # d = datatypes.DictData(s.get_collections().json()['playlist'][0]) # print(d.name) # print(d.id) # print(s.album_list_from_artist('9272')[0].name) # return print(s.song_details_by_id(18604870)[0].download_url()) return action = "search_artist" # action = "search_album" action = "search_song" if action == "search_artist": artist = '孙燕' print(s.search(Session.SEARCH_TYPE_ARTIST, artist)) elif action == "search_album": artist = '找' print(s.search(Session.SEARCH_TYPE_ALBUM, artist)) elif action == "search_song": artist = '克卜勒' print(s.search(Session.SEARCH_TYPE_SONG, artist)) else: download_list = [] download_mode = "fetch_artist" artist_id = 9106 if download_mode == "fetch_favourite": for pl in s.get_collections(): print('Playlist({id}): {name}'.format(id=pl.id, name=pl.name)) for song in s.song_details_from_playlist(pl): #print('Song({id})<{bit_rate}> {name}: {url}'.format(id=song.id, #name=song.bMusic.name, #bit_rate=song.bMusic.bitrate, #url=song.download_url())) download_list.append(song) # if song.bMusic.bitrate != 320000: # print('Song<{name}> hMusic:<{hMusic}>'.format(name=song.bMusic.name, hMusic=song.hMusic)) # print('Song<{name}> mMusic:<{hMusic}>'.format(name=song.bMusic.name, hMusic=song.mMusic)) # print('Song<{name}> lMusic:<{hMusic}>'.format(name=song.bMusic.name, hMusic=song.lMusic)) elif download_mode == "fetch_artist": albums = s.album_list_from_artist(artist_id) for album_info in albums: album_detail = s.album_detail(album_info.id) print(str(album_detail)) for song in album_detail.songs: download_list.append(song) for song in download_list: print("Tobe download: {url}".format(url=song.download_url())) return import downloadtool download_tool = downloadtool.get_download_tool("aria2") total = len(download_list) while len(download_list) > 0: for song in download_list: try: print("Downloading ({done}/{total})".format(total=total, done=len(download_list))) download_tool.download(uri=song.download_url(), file_name=song.bMusic.name+'.'+song.bMusic.extension) download_list.remove(song) except Exception as e: print("Download error: {url} will try again later".format(url=song.download_url()))