| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125 |
- # PIP Spotipy | https://spotipy.readthedocs.io/en/2.13.0/
- #
- #
- # 1). Login
- # 2). Select playlist
- # 3). Iterate/Download items
- # 4). Use spotify metadata to ID3 tag song
- # 5). Songs that could not be found are listed an possible exported for later use
- #
- # This will be awesome!
- #
- from command import search, settings
- from helper import console, tagging
- import colorama as color
- import spotipy
- from spotipy.oauth2 import SpotifyOAuth
- from helper.settings import Settings
- from helper.tags.tagitem import TagItem
- def spotify():
- if Settings.SpotifyUsername.get() == '' or Settings.SpotifyClientID.get() == '' or Settings.SpotifySecret.get() == '':
- console.output('You need to request a developers account at spotify. You only have to do this once.')
- console.output('This is very easy, quick, and free to do and this doesn\'t further affect your account')
- console.output('Please go to:')
- console.output('\thttps://developer.spotify.com/dashboard/applications')
- console.output('And create a new application.')
- console.output('Fill in a name, description and enter in the Redirect URI\'s this:')
- console.output('\thttp://spotify-finder')
- console.output('Save it and make sure you find Client ID and Client Secret on your screen')
- console.ask_input('Are you ready to fill in your username, client ID, and secret? [y]')
- settings()
- return True
- console.output('Logging in to Spotify')
- spotify = spotipy.Spotify(auth_manager=SpotifyOAuth(scope=Settings.SpotifyScope.get(),
- client_id=Settings.SpotifyClientID.get(),
- client_secret=Settings.SpotifySecret.get(),
- redirect_uri='http://spotify-finder',
- username=Settings.SpotifyUsername.get()))
- playlists = spotify.current_user_playlists()
- console.output('Found {0} spotify playlists'.format(len(playlists['items'])), console.DBG_INFO)
- playlist = console.option_picker("Pick a playlist that you want to download from",
- playlists['items'],
- quit=True,
- objects=[
- '__id__',
- 'x[name]',
- 'x[description]'
- ],
- table=[
- ('ID', 2),
- ('Name', 50),
- ('Description', 100)
- ])
- if playlist is None:
- return True
- else:
- playlist = playlists['items'][playlist]
- tracks = spotify.playlist_tracks(playlist['id'], fields='items(track(album(name,images(url)),artists(name),name))')
- console.output('Found {0} tracks in playlist {1}'.format(len(tracks['items']), playlist['name']), console.DBG_INFO)
- console.output('Start finding music from playlist \'{0}\''.format(playlist['name']))
- success = []
- fail = []
- for track in tracks['items']:
- track = track['track']
- tag = TagItem()
- tag.set_title(track['name'])
- tag.set_artist(', '.join(list(i['name'] for i in track['artists'])))
- tag.set_cover_url(track['album']['images'][0]['url']) # 640x640
- tag.set_album(track['album']['name'])
- tag.set_genre('') # unknown
- keywords = '{0} - {1}'.format(track['artists'][0]['name'], track['name'])
- console.output('Looking up {0} - {1}'.format(track['artists'][0]['name'], track['name']))
- result = search(keywords=keywords, automode=True, tags=tag)
- if result:
- success.append(tag)
- console.output(color.Fore.GREEN + '[ OK ] {tag.artist} - {tag.title}'.format(tag=tag))
- else:
- fail.append(tag)
- console.output(color.Fore.RED + '[FAIL] {tag.artist} - {tag.title}'.format(tag=tag))
- console.output('Sucessfully downloaded {0} songs. {1} songs failed to download'.format(len(success), len(fail)))
- if len(fail) > 0:
- seefails = console.ask_input('Do you want to see a list of the failed songs and manually search for it? [y/n]')
- if seefails == 'y':
- while True:
- song = console.option_picker('Pick a song to manually download it',
- fail,
- quit=True,
- objects=[
- '__id__',
- 'x.artist',
- 'x.title'
- ],
- table=[
- ('ID', 2),
- ('Artist', 50),
- ('Title', 100)
- ])
- if song is None:
- break
- else:
- keywords = '{tag.artist} - {tag.title}'.format(tag=tag)
- search(keywords=keywords)
- return True
|