From ca5cbea5ea547ad44a19471562e4b91c0d27f0c3 Mon Sep 17 00:00:00 2001 From: Kepoor Hampond Date: Fri, 27 Jan 2017 00:18:58 -0800 Subject: [PATCH] Ability to place songs from playlists all into one folder. Use flag. --- README.md | 11 +++++++---- irs/__main__.py | 19 +++++++++++++++---- irs/config.py | 8 +++++--- irs/manager.py | 47 +++++++++++++++++++++++++++++++++++++++++------ irs/utils.py | 2 +- setup.py | 2 +- 6 files changed, 70 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index 5f9ff66..50a9f93 100644 --- a/README.md +++ b/README.md @@ -30,15 +30,16 @@ irs -A "Sadnecessary" # -a "Milky Chance" Full usage: ``` usage: - irs (-h | -v) - irs [-l] - irs -p PLAYLIST [-c COMMAND] [-l] - irs -A ALBUM [-c COMMAND] [-l] + irs (-h | -v | -C) + irs [-l] [-sa] + irs -p PLAYLIST [-c COMMAND] [-l] [-sa] + irs -A ALBUM [-c COMMAND] [-l] [-sa] irs -a ARTIST -s SONG [-c COMMAND] [-l] Options: -h, --help show this help message and exit -v, --version Display the version and exit. + -C, --config Return location of configuration file. -A ALBUM, --album ALBUM Search spotify for an album. -p PLAYLIST, --playlist PLAYLIST @@ -53,6 +54,8 @@ Options: -a/--artist -l, --choose-link If supplied, will bring up a console choice for what link you want to download based off a list of titles. + -sa, --start-at A song index to start at if something goes wrong while + downloading and you have to restart. ``` Make a note that capitalization and spelling matters a lot in this program. diff --git a/irs/__main__.py b/irs/__main__.py index 3ed8157..684e8f7 100644 --- a/irs/__main__.py +++ b/irs/__main__.py @@ -3,9 +3,9 @@ HELP = \ """ usage: irs (-h | -v | -C) - irs [-l] - irs -p PLAYLIST [-c COMMAND] [-l] - irs -A ALBUM [-c COMMAND] [-l] + irs [-l] [-sa] + irs -p PLAYLIST [-c COMMAND] [-l] [-sa] + irs -A ALBUM [-c COMMAND] [-l] [-sa] irs -a ARTIST -s SONG [-c COMMAND] [-l] Options: @@ -35,6 +35,12 @@ Options: -l, --choose-link If supplied, will bring up a console choice for what link you want to download based off a list of titles. + + -sa, --start-at A song index to start at if something goes wrong while + downloading and you have to restart. + + -of, --one-folder To place all songs downloaded from a playlist into one + folder. """ # For exiting @@ -60,11 +66,16 @@ def main(): parser.add_argument('-u', '--user', dest="user", help="Specify user to download playlists from.") parser.add_argument('-l', '--choose-link', action='store_true', dest="link", \ - help="Whether or not to choose the link from a list of titles.") + help="Whether or not to choose the link from a list of titles.") + + parser.add_argument('-sa', '--start-at', dest="start_at", help="An index to start at if downloading a list.") parser.add_argument('-p', '--playlist', dest="playlist", \ help="Specify playlist filename. Each line should be formatted like so: SONGNAME - ARTIST") + parser.add_argument('-of', '--one-folder', action="store_true", dest="one_folder", \ + help="Place all downloaded playlist songs into one folder") + media = parser.add_mutually_exclusive_group() media.add_argument('-s', '--song', dest="song", help="Specify song name of the artist.") diff --git a/irs/config.py b/irs/config.py index 2bd3ba9..4a0ebdc 100644 --- a/irs/config.py +++ b/irs/config.py @@ -6,12 +6,14 @@ CONFIG = dict( # default_flags = '-c rhythmbox %(loc)s', # To make choosing of links default: # default_flags = '-l', + # To place all playlist songs into one folder: + # default_flags = '-of', default_flags = '', # These are necessary to download Spotify playlists - client_id = '', - client_secret = '', + client_id = 'e4198f6a3f7b48029366f22528b5dc66', + client_secret = '69adc699f79e4640a6fd7610635b025f', # For a custom directory. Note that `~` will not work as a shortcut. directory = str(expanduser("~")) + "/Music", @@ -20,5 +22,5 @@ CONFIG = dict( numbered_file_names = True, # Downloaded file names - download_file_names = True, + download_file_names = False, ) diff --git a/irs/manager.py b/irs/manager.py index 7a43960..7596a92 100644 --- a/irs/manager.py +++ b/irs/manager.py @@ -164,6 +164,7 @@ class Manager: spotify_list = choose_from_spotify_list(items, length=length) list_type = spotify_list["type"] + name = spotify_list["name"] if list_type != "playlist": spotify_list = eval("spotify.%s" % list_type)(spotify_list["uri"]) else: @@ -195,10 +196,10 @@ class Manager: album = spotify_list songs.append({ - "name": song["name"], + "name": song["name"].split(" - ")[0], "artist": artist["name"], "album": album["name"], - "tracknum": song["track_number"], + "tracknum": increment, "album_cover": album["images"][0]["url"] }) @@ -209,9 +210,41 @@ class Manager: print ("\t" + song["name"] + " - " + song["artist"]) print (bc.ENDC + "\n") - for song in songs: - self.rip_mp3(song["name"], song["artist"], album=song["album"], \ - tracknum=song["tracknum"], album_art_url=song["album_cover"]) + if self.args.start_at: + start_at = int(self.args.start_at) - 1 + if start_at < 0: + start_at = 0 + else: + start_at = 0 + + for song in songs[start_at:]: + + already_there = False + if os.path.isdir(CONFIG["directory"] + "/" + song["artist"]): + already_there = True + + song_loc = self.rip_mp3(song["name"], song["artist"], album=song["album"], \ + tracknum=song["tracknum"], album_art_url=song["album_cover"], \ + out_of="%s/%s - " % (song["tracknum"], len(songs))) + + if self.args.one_folder: + + one_folder = CONFIG["directory"] + "/" + strip_special_chars(name[:30]) + + if not os.path.isdir(one_folder): + os.makedirs(one_folder) + + new_loc = one_folder + "/" + song_loc.split("/")[-1] + + os.rename(song_loc, new_loc) + + if not already_there: + import shutil + shutil.rmtree(CONFIG["directory"] + "/" + song["artist"]) + + if self.args.command: + os.system((self.args.command.replace("%(loc)s", '"%s"' % new_loc) + " &")) + else: print (bc.FAIL + "No results were found. Make sure to use proper spelling and capitalization." + bc.ENDC) @@ -221,7 +254,7 @@ class Manager: album=None, # if you want to specify an album and save a bit of time. tracknum=None, # to specify the tracknumber in the album. album_art_url=None, # if you want to save a lot of time trying to find album cover. - organize=True + out_of="", # For a string to put before the song title. ): @@ -231,6 +264,8 @@ class Manager: if not artist: artist = self.args.artist + + print (color(out_of, ["UNDERLINE"]), end="") audio_code = self.find_mp3(song=song, artist=artist) if CONFIG["numbered_file_names"] and tracknum: diff --git a/irs/utils.py b/irs/utils.py index 3b4d0ea..5fad85a 100644 --- a/irs/utils.py +++ b/irs/utils.py @@ -123,7 +123,7 @@ def fail_oauth(): print (get_config_file_path()) exit(1) -def choose_from_spotify_list(thelist, length=10): +def choose_from_spotify_list(thelist, length=100000): spotify = spotipy.Spotify() thelist = list(thelist) diff --git a/setup.py b/setup.py index c94fca1..bb649fa 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup setup( name='irs', - version='4.8.23', + version='3.1.0', description='A music downloader that just gets metadata.', url='https://github.com/kepoorhampond/irs', author='Kepoor Hampond',