mirror of
https://github.com/JonasunderscoreJones/turbo-octo-potato.git
synced 2025-10-25 02:59:18 +02:00
Moved tokens and credentials to the .env file to not store them in the python file itself anymore. - Added .env credential storage - Fixed deadspaces
89 lines
3 KiB
Python
89 lines
3 KiB
Python
import pylast, spotipy, sys, os, time
|
|
from spotipy.oauth2 import SpotifyOAuth
|
|
from dotenv import load_dotenv
|
|
|
|
# load .env file
|
|
load_dotenv()
|
|
|
|
# Define your Last.fm API credentials
|
|
LASTFM_API_KEY = os.getenv(' LASTFM_API_KEY')
|
|
LASTFM_API_SECRET = os.getenv('LASTFM_API_SECRET')
|
|
LASTFM_USERNAME = os.getenv('LASTFM_USERNAME')
|
|
LASTFM_PASSWORD_HASH = os.getenv('LASTFM_PASSWORD_HASH')
|
|
|
|
# Define your Spotify API credentials
|
|
SPOTIPY_CLIENT_ID = os.getenv('SPOTIPY_CLIENT_ID')
|
|
SPOTIPY_CLIENT_SECRET = os.getenv('SPOTIPY_CLIENT_SECRET')
|
|
SPOTIPY_REDIRECT_URI = os.getenv('SPOTIPY_REDIRECT_URI')
|
|
|
|
VERBOSE = True
|
|
|
|
def verboseprint(message):
|
|
if VERBOSE:
|
|
print(message)
|
|
|
|
#last.fm auth
|
|
def lastfmauth():
|
|
SESSION_KEY_FILE = os.path.join(os.path.expanduser("~"), ".session_key")
|
|
network = pylast.LastFMNetwork(LASTFM_API_KEY, LASTFM_API_SECRET)
|
|
if not os.path.exists(SESSION_KEY_FILE):
|
|
skg = pylast.SessionKeyGenerator(network)
|
|
url = skg.get_web_auth_url()
|
|
|
|
print(f"Please authorize this script to access your account: {url}\n")
|
|
import time
|
|
import webbrowser
|
|
|
|
webbrowser.open(url)
|
|
|
|
while True:
|
|
try:
|
|
session_key = skg.get_web_auth_session_key(url)
|
|
with open(SESSION_KEY_FILE, "w") as f:
|
|
f.write(session_key)
|
|
break
|
|
except pylast.WSError:
|
|
time.sleep(1)
|
|
else:
|
|
session_key = open(SESSION_KEY_FILE).read()
|
|
|
|
network.session_key = session_key
|
|
return network
|
|
|
|
#spotify
|
|
def spotifyauth():
|
|
return spotipy.Spotify(auth_manager=SpotifyOAuth(client_id=SPOTIPY_CLIENT_ID,
|
|
client_secret=SPOTIPY_CLIENT_SECRET,
|
|
redirect_uri=SPOTIPY_REDIRECT_URI,
|
|
scope="user-library-read"))
|
|
def show_tracks(results):
|
|
tracknr = results['offset']
|
|
for item in results['items']:
|
|
track = item['track']
|
|
tracknr+=1
|
|
verboseprint("%-10s %13s" % (f"ETA:{round((((int(results['total'])-tracknr)*0.25)/60))}min", f"[{tracknr}/{int(results['total'])}]") + "%32.32s %s" % (track['artists'][0]['name'], track['name']))
|
|
#TODO: Fix this abomination
|
|
try:
|
|
track = network.get_track(track['artists'][0]['name'], track['name'])
|
|
track.love()
|
|
except pylast.NetworkError:
|
|
try:
|
|
time.sleep(1)
|
|
track = network.get_track(track['artists'][0]['name'], track['name'])
|
|
track.love()
|
|
except pylast.NetworkError:
|
|
verboseprint("Network error. Skipping..." + "%32.32s %s" % (track['artists'][0]['name'], track['name']))
|
|
|
|
|
|
verboseprint("Authenticating Spotify...")
|
|
sp = spotifyauth()
|
|
verboseprint("Done\nAuthenticating Last.fm")
|
|
network = lastfmauth()
|
|
verboseprint("Done!\nStarting...")
|
|
|
|
results = sp.current_user_saved_tracks()
|
|
show_tracks(results)
|
|
|
|
while results['next']:
|
|
results = sp.next(results)
|
|
show_tracks(results)
|