From feaed1ddcae5b06f1c806db23b350313720771cd Mon Sep 17 00:00:00 2001 From: yiannisha Date: Thu, 11 Nov 2021 18:14:22 +0200 Subject: [PATCH 1/2] Added --download argument --- zspotify/__main__.py | 3 +++ zspotify/app.py | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/zspotify/__main__.py b/zspotify/__main__.py index 6016faf6..0311fc2f 100644 --- a/zspotify/__main__.py +++ b/zspotify/__main__.py @@ -28,6 +28,9 @@ if __name__ == '__main__': dest='search_spotify', action='store_true', help='Loads search prompt to find then download a specific track, album or playlist') + group.add_argument('-d', '--download', + type=str, + help='Downloads tracks, playlists and albums from the URLs written in the file passed.') parser.set_defaults(func=client) diff --git a/zspotify/app.py b/zspotify/app.py index e0511cea..3c9de608 100644 --- a/zspotify/app.py +++ b/zspotify/app.py @@ -1,5 +1,6 @@ from librespot.audio.decoders import AudioQuality from tabulate import tabulate +import os from album import download_album, download_artist_albums from const import TRACK, NAME, ID, ARTIST, ARTISTS, ITEMS, TRACKS, EXPLICIT, ALBUM, ALBUMS, \ @@ -29,6 +30,39 @@ def client(args) -> None: print('[ DETECTED FREE ACCOUNT - USING HIGH QUALITY ]\n\n') ZSpotify.DOWNLOAD_QUALITY = AudioQuality.HIGH + if args.download: + urls = [] + filename = args.download + if os.path.exists(filename): + with open(filename, 'r', encoding='utf-8') as file: + urls.extend([line.strip() for line in file.readlines()]) + + for spotify_url in urls: + track_id, album_id, playlist_id, episode_id, show_id, artist_id = regex_input_for_urls( + spotify_url) + + if track_id is not None: + download_track(track_id) + elif artist_id is not None: + download_artist_albums(artist_id) + elif album_id is not None: + download_album(album_id) + elif playlist_id is not None: + playlist_songs = get_playlist_songs(playlist_id) + name, _ = get_playlist_info(playlist_id) + for song in playlist_songs: + download_track(song[TRACK][ID], + fix_filename(name) + '/') + print('\n') + elif episode_id is not None: + download_episode(episode_id) + elif show_id is not None: + for episode in get_show_episodes(show_id): + download_episode(episode) + + else: + print(f'File {filename} not found.\n') + if args.urls: for spotify_url in args.urls: track_id, album_id, playlist_id, episode_id, show_id, artist_id = regex_input_for_urls( From 485d5ba826a10cd814743cefd8a02896746b8e1e Mon Sep 17 00:00:00 2001 From: yiannisha Date: Thu, 11 Nov 2021 18:23:53 +0200 Subject: [PATCH 2/2] Added download_from_urls helper function --- zspotify/app.py | 69 +++++++++++++++---------------------------------- 1 file changed, 21 insertions(+), 48 deletions(-) diff --git a/zspotify/app.py b/zspotify/app.py index 3c9de608..8e961b42 100644 --- a/zspotify/app.py +++ b/zspotify/app.py @@ -37,55 +37,13 @@ def client(args) -> None: with open(filename, 'r', encoding='utf-8') as file: urls.extend([line.strip() for line in file.readlines()]) - for spotify_url in urls: - track_id, album_id, playlist_id, episode_id, show_id, artist_id = regex_input_for_urls( - spotify_url) - - if track_id is not None: - download_track(track_id) - elif artist_id is not None: - download_artist_albums(artist_id) - elif album_id is not None: - download_album(album_id) - elif playlist_id is not None: - playlist_songs = get_playlist_songs(playlist_id) - name, _ = get_playlist_info(playlist_id) - for song in playlist_songs: - download_track(song[TRACK][ID], - fix_filename(name) + '/') - print('\n') - elif episode_id is not None: - download_episode(episode_id) - elif show_id is not None: - for episode in get_show_episodes(show_id): - download_episode(episode) + download_from_urls(urls) else: print(f'File {filename} not found.\n') if args.urls: - for spotify_url in args.urls: - track_id, album_id, playlist_id, episode_id, show_id, artist_id = regex_input_for_urls( - spotify_url) - - if track_id is not None: - download_track(track_id) - elif artist_id is not None: - download_artist_albums(artist_id) - elif album_id is not None: - download_album(album_id) - elif playlist_id is not None: - playlist_songs = get_playlist_songs(playlist_id) - name, _ = get_playlist_info(playlist_id) - for song in playlist_songs: - download_track(song[TRACK][ID], - fix_filename(name) + '/') - print('\n') - elif episode_id is not None: - download_episode(episode_id) - elif show_id is not None: - for episode in get_show_episodes(show_id): - download_episode(episode) + download_from_urls(args.urls) if args.playlist: download_from_user_playlist() @@ -104,28 +62,43 @@ def client(args) -> None: while len(search_text) == 0: search_text = input('Enter search or URL: ') + if not download_from_urls([search_text]): + search(search_text) + +def download_from_urls(urls: list[str]) -> bool: + """ Downloads from a list of spotify urls """ + download = False + + for spotify_url in urls: track_id, album_id, playlist_id, episode_id, show_id, artist_id = regex_input_for_urls( - search_text) + spotify_url) if track_id is not None: + download = True download_track(track_id) elif artist_id is not None: + download = True download_artist_albums(artist_id) elif album_id is not None: + download = True download_album(album_id) elif playlist_id is not None: + download = True playlist_songs = get_playlist_songs(playlist_id) name, _ = get_playlist_info(playlist_id) for song in playlist_songs: - download_track(song[TRACK][ID], fix_filename(name) + '/') + download_track(song[TRACK][ID], + fix_filename(name) + '/') print('\n') elif episode_id is not None: + download = True download_episode(episode_id) elif show_id is not None: + download = True for episode in get_show_episodes(show_id): download_episode(episode) - else: - search(search_text) + + return download def search(search_term):