diff --git a/README.md b/README.md index 107d2684..dae25b5a 100644 --- a/README.md +++ b/README.md @@ -34,14 +34,14 @@ Python packages: ### Command line usage: ``` -Basic 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. Can take multiple urls. 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 @@ -77,7 +77,7 @@ There is a community maintained repo for Google Colab at [Ori5000/zspotifycolab] **There have been 2-3 reports from users who received account bans from Spotify for using this tool**. -We recommend using ZSpotify with a burner account. +We recommend using ZSpotify with a burner account. Alternatively, there is a configuration option labled ```DOWNLOAD_REAL_TIME```, this limits the download speed to the duration of the song being downloaded thus not appearing suspicious to Spotify. This option is much slower and is only recommended for premium users who wish to download songs in 320kbps without buying premium on a burner account. diff --git a/zspotify/__main__.py b/zspotify/__main__.py index 50dd3890..6016faf6 100644 --- a/zspotify/__main__.py +++ b/zspotify/__main__.py @@ -1,4 +1,35 @@ +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('urls', + type=str, + # action='extend', + default='', + nargs='*', + help='Downloads the track, album, playlist, podcast episode, or all albums by an artist from a url. Can take multiple urls.') + 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 3ee926b1..b0cbb968 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,32 +13,26 @@ 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/') - print('\n') - else: + 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( - sys.argv[1]) + spotify_url) if track_id is not None: download_track(track_id) @@ -61,7 +53,19 @@ def client() -> None: for episode in get_show_episodes(show_id): download_episode(episode) - else: + if args.playlist: + download_from_user_playlist() + + 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: ')