Add script for scrobbling physical albums

master
trémeur 5 months ago
parent cc87be8be9
commit 3ac23d3ed2

1
.gitignore vendored

@ -1,3 +1,4 @@
albums.py
prompts.html
prompts.org
__pycache__/*

@ -0,0 +1,119 @@
import pylast,random,re,sys,time
import albums
network = pylast.LastFMNetwork(api_key=albums.apikey, api_secret=albums.apisecret, username="litrovers", password_hash=pylast.md5(albums.pw)) # https://input.sh/scrobbling-live-sets-into-last-fm-using-python/
thealbums = sorted(albums.albums,key=lambda d: d["name"])
# albums = sorted(albums,key=lambda d: d["artist"])
def countdown(t): # https://stackoverflow.com/a/25189629
while t:
mins, secs = divmod(t, 60)
timeformat = '{:02d}:{:02d}'.format(mins, secs)
print(timeformat, end='\r')
time.sleep(1)
t -= 1
def scrobble(thealbum):
for album in thealbums:
if thealbum == album["code"]:
i = 0
for tracklist in album["tracks"]:
i += 1
for item in tracklist:
if " :: " in item:
theartist = re.sub(" :: .*","",item)
thetrack = re.sub(".* :: ","",item)
else:
theartist = album["artist"]
thetrack = item
# last_api_call = network.scrobble(theartist,thetrack,int(time.time()))
print("Scrobbled " + item)
# countdown(tracklist[item])
if i < len(album["tracks"]):
input("Press enter after changing side")
def query_yes_no(question, default="yes"): # https://code.activestate.com/recipes/577058/
"""Ask a yes/no question via raw_input() and return their answer.
"question" is a string that is presented to the user.
"default" is the presumed answer if the user just hits <Enter>.
It must be "yes" (the default), "no" or None (meaning
an answer is required of the user).
The "answer" return value is one of "yes" or "no".
"""
valid = {"yes":"yes", "y":"yes", "ye":"yes",
"no":"no", "n":"no"}
if default == None:
prompt = " [y/n] "
elif default == "yes":
prompt = " [Y/n] "
elif default == "no":
prompt = " [y/N] "
else:
raise ValueError("invalid default answer: '%s'" % default)
while 1:
sys.stdout.write(question + prompt)
choice = input().lower()
if default is not None and choice == '':
return default
elif choice in valid.keys():
return valid[choice]
else:
sys.stdout.write("Please respond with 'yes' or 'no' "\
"(or 'y' or 'n').\n")
def selectFromDict(options, name): # https://stackoverflow.com/a/64536882
index = 0
indexValidList = []
print('Select an ' + name + ':')
for optionName in options:
index = index + 1
indexValidList.extend([options[optionName]])
print(str(index) + ') ' + optionName)
inputValid = False
while not inputValid:
inputRaw = input(name + ': ')
inputNo = int(inputRaw) - 1
if inputNo > -1 and inputNo < len(indexValidList):
selected = indexValidList[inputNo]
# print('Selected ' + name + ': ' + selected)
inputValid = True
break
else:
print('Please select a valid ' + name + ' number')
return selected
def choosealbum():
randomer = query_yes_no("Pick an album for me?","no")
if randomer == "yes":
revision = "yes"
while revision == "yes":
chosen = random.choice(thealbums)
thechosen = chosen["code"]
try:
print(chosen["album artist"] + ": " + chosen["name"])
except:
print(chosen["artist"] + ": " + chosen["name"])
revision = query_yes_no("Roll again?","no")
else:
process = False
while process == False:
firstletter = input("Type the first letter of the album name\n")
letteralbums = {}
for album in thealbums:
process = True
if album["name"][0].lower() == str(firstletter):
try:
letteralbums[album["name"] + " (" + album["album artist"] + ")"] = album["code"]
except:
letteralbums[album["name"] + " (" + album["artist"] + ")"] = album["code"]
if len(letteralbums) == 0:
process = False
print("No albums found")
thechosen = selectFromDict(letteralbums, "album")
scrobble(thechosen)
if __name__ == "__main__":
choosealbum()
Loading…
Cancel
Save