diff --git a/README.md b/README.md index 548a9af5..b83d9533 100644 --- a/README.md +++ b/README.md @@ -28,14 +28,14 @@ Python packages: \*\*Git can be installed via apt for Debian-based distros or by downloading the binaries from [git-scm.com](https://git-scm.com/download/win) for Windows. ``` -Command line usage: - python zspotify Loads search prompt to find then download a specific track, album or playlist - python zspotify Downloads the track, album, playlist or podcast episode specified as a command line argument - python zspotify Downloads all albums by specified artist +Basic command line usage: + python zspotify Downloads the track, album, playlist or podcast episode specified as a command line argument. If an artist url is given, all albums by specified artist will be downloaded. Extra command line options: -p, --playlist Downloads a saved playlist from your account -ls, --liked-songs Downloads all the liked songs from your account + -s, --search Loads search prompt to find then download a specific track, album or playlist + -ns, --no-splash Suppress the splash screen when loading. Options that can be configured in zs_config.json: ROOT_PATH Change this path if you don't like the default directory where ZSpotify saves the music diff --git a/zspotify/__main__.py b/zspotify/__main__.py index 50dd3890..875b7676 100644 --- a/zspotify/__main__.py +++ b/zspotify/__main__.py @@ -1,4 +1,34 @@ +import argparse + from app import client + + if __name__ == '__main__': - client() + parser = argparse.ArgumentParser(prog='zspotify', + description='A Spotify downloader needing only a python interpreter and ffmpeg.') + parser.add_argument('-ns', '--no-splash', + action='store_true', + help='Suppress the splash screen when loading.') + group = parser.add_mutually_exclusive_group(required=True) + group.add_argument('url', + type=str, + default='', + nargs='?', + help='Downloads the track, album, playlist, podcast episode, or all albums by an artist from a url.') + group.add_argument('-ls', '--liked-songs', + dest='liked_songs', + action='store_true', + help='Downloads all the liked songs from your account.') + group.add_argument('-p', '--playlist', + action='store_true', + help='Downloads a saved playlist from your account.') + group.add_argument('-s', '--search', + dest='search_spotify', + action='store_true', + help='Loads search prompt to find then download a specific track, album or playlist') + + parser.set_defaults(func=client) + + args = parser.parse_args() + args.func(args) diff --git a/zspotify/app.py b/zspotify/app.py index a2433a57..0c029d03 100644 --- a/zspotify/app.py +++ b/zspotify/app.py @@ -1,5 +1,3 @@ -import sys - from librespot.audio.decoders import AudioQuality from tabulate import tabulate @@ -15,51 +13,56 @@ from zspotify import ZSpotify SEARCH_URL = 'https://api.spotify.com/v1/search' -def client() -> None: +def client(args) -> None: """ Connects to spotify to perform query's and get songs to download """ ZSpotify() - splash() + + if not args.no_splash: + splash() if ZSpotify.check_premium(): - print('[ DETECTED PREMIUM ACCOUNT - USING VERY_HIGH QUALITY ]\n\n') + if not args.no_splash: + print('[ DETECTED PREMIUM ACCOUNT - USING VERY_HIGH QUALITY ]\n\n') ZSpotify.DOWNLOAD_QUALITY = AudioQuality.VERY_HIGH else: - print('[ DETECTED FREE ACCOUNT - USING HIGH QUALITY ]\n\n') + if not args.no_splash: + print('[ DETECTED FREE ACCOUNT - USING HIGH QUALITY ]\n\n') ZSpotify.DOWNLOAD_QUALITY = AudioQuality.HIGH - if len(sys.argv) > 1: - if sys.argv[1] == '-p' or sys.argv[1] == '--playlist': - download_from_user_playlist() - elif sys.argv[1] == '-ls' or sys.argv[1] == '--liked-songs': - for song in get_saved_tracks(): - if not song[TRACK][NAME]: - print('### SKIPPING: SONG DOES NOT EXIST ON SPOTIFY ANYMORE ###') - else: - download_track(song[TRACK][ID], 'Liked Songs/') + if args.url: + track_id, album_id, playlist_id, episode_id, show_id, artist_id = regex_input_for_urls(args.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], + sanitize_data(name) + '/') print('\n') - else: - track_id, album_id, playlist_id, episode_id, show_id, artist_id = regex_input_for_urls(sys.argv[1]) + 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) - 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], - sanitize_data(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) + if args.playlist: + download_from_user_playlist() - else: + if args.liked_songs: + for song in get_saved_tracks(): + if not song[TRACK][NAME]: + print('### SKIPPING: SONG DOES NOT EXIST ON SPOTIFY ANYMORE ###') + else: + download_track(song[TRACK][ID], 'Liked Songs/') + print('\n') + + if args.search_spotify: search_text = '' while len(search_text) == 0: search_text = input('Enter search or URL: ') @@ -261,4 +264,3 @@ def search(search_term): download_artist_albums(dic[ID]) else: download_playlist(dic) -