Files
dotfiles/scripts/song
2023-10-28 19:10:37 +02:00

310 lines
6.9 KiB
Python
Executable File

#!/usr/bin/env python3
# written while listening to mocking bird on loop
# if you really went through my config in that much detail...
# ... to stumble upon this weired script i wrote a long time ago
# ... please message me on discord (@c2vi) about it!!
from datetime import datetime
import sys
import json
import requests
import base64
import os
with open("~/.mysecrets/spotify-client-id", "r") as file:
CLIENT_ID = file.read()
with open("~/.mysecrets/spotify-client-secret", "r") as file:
CLIENT_SECRET = file.read()
LIST_COUNT = 6
FILL_TO = 45
CONF_PATH = os.getenv("SONG_CONF_PATH")
if CONF_PATH == "":
print("No SONG_CONF_PATH environment variable found")
exit(1)
def get_token():
url = "https://accounts.spotify.com/api/token"
form_data = {"grant_type": "client_credentials"}
message = CLIENT_ID + ":" + CLIENT_SECRET
message_bytes = message.encode('ascii')
base64_bytes = base64.b64encode(message_bytes)
auth_base64 = base64_bytes.decode('ascii')
headers = {
"user-agent": "Hi Spotify.....xD",
"Authorization": f"Basic {auth_base64}",
}
x = requests.post(url, headers=headers, data=form_data)
data = x.json()
return data["access_token"]
def spotify_search(name):
token = get_token()
url = "https://api.spotify.com/v1/search"
headers = {
"user-agent": "Hi Spotify.....xD",
"Authorization": f"Bearer {token}",
}
params = {"q": name, "type": "track"}
x = requests.get(url, headers=headers, params=params)
data = x.json()
count = 0
for track in data["tracks"]["items"]:
count += 1
if count > LIST_COUNT:
break
#print(track.keys())
name = track["name"]
artists = get_artists(track)
out = f"{count}) {name}"
out = fill(out)
out += f"BY: {artists}"
print(out)
try:
number = int(input("NUMBER: "))
return data["tracks"]["items"][number -1]
except:
exit(1)
def get_artists(track):
artists = ""
for artist in track["artists"]:
if artists != "":
artists += " --- " + artist["name"]
else:
artists += artist["name"]
return artists
def add_track(track, pos = None):
# get the track id
# first letter , or first two, ....
count = 1
myid = track["name"][0:count]
while get_track_pos(myid) != -1:
count += 1
myid = track["name"][0:count]
if count == 2000:
print("Count went to 2000 in add_track")
exit(1)
mytrack = {
"id": track["id"],
"name": track["name"],
"artists": get_artists(track),
"myid": myid,
}
if pos == None:
config["now"].append(mytrack)
else:
config["now"].insert(pos -1, mytrack)
config["log"].append({
"type": "add",
"track": mytrack,
"time": now.strftime("%m/%d/%Y-%H:%M:%S"),
})
def set_track(track_id, pos):
mytrack = get_track_from_myid(track_id)
old_pos = get_track_pos(track_id)
config["now"].pop(old_pos)
config["now"].insert(pos, mytrack)
config["log"].append({
"type": "move",
"track": mytrack,
"time": now.strftime("%m/%d/%Y-%H:%M:%S"),
"from": old_pos +1,
"to": pos +1,
})
def get_track_pos(track_or_myid):
id = ""
if type(track_or_myid) == dict:
id = track_or_myid["myid"]
else:
id = track_or_myid
count = 0
for track in config["now"]:
if track["myid"] == id:
return count
count += 1
return -1
def get_track_from_myid(myid):
for track in config["now"]:
if track["myid"] == myid:
return track
print(f"Track {myid} not found")
exit(1)
def remove_track(track_or_myid):
myid = ""
if type(track_or_myid) == dict:
myid = track_or_myid["myid"]
else:
myid = track_or_myid
config["log"].append({
"type": "remove",
"track": get_track_from_myid(myid),
"time": now.strftime("%m/%d/%Y-%H:%M:%S"),
})
new_tracks = []
for track in config["now"]:
if track["myid"] != myid:
new_tracks.append(track)
config["now"] = new_tracks
def list_track():
count = 0
for track in config["now"]:
count += 1
out = str(count) + ") " + track["myid"]
out = fill(out, l=10)
out += track["name"]
out = fill(out)
out += "BY: " + track["artists"]
print(out)
def fill(string, l = FILL_TO):
count = 0
while len(string) < l:
string += " "
count += 1
return string
def log():
for entry in config["log"]:
typ = entry["type"]
name = entry["track"]["name"]
time = entry["time"]
if typ == "move":
fro = entry["from"]
to = entry["to"]
print(f"MOVE \t from {fro} to {to} \t {time} \t {name}")
elif typ == "add":
print(f"ADD \t {time} \t {name}")
elif typ == "remove":
print(f"REMOVE \t {time} \t {name}")
def main():
searh_term = " ".join(args[2:len(args)])
if args[1] == "s":
track = spotify_search(searh_term)
elif args[1] == "a" or args[1] == "add":
try:
pos = int(args[2])
print("Inserting at pos:", pos)
searh_term = " ".join(args[3:len(args)])
track = spotify_search(searh_term)
add_track(track, pos = pos)
except:
track = spotify_search(searh_term)
add_track(track)
elif args[1] == "rm":
remove_track(args[2])
elif args[1] == "l":
list_track()
elif args[1] == "st" or args[1] == "set":
set_track(args[2], int(args[3]) -1)
list_track()
elif args[1] == "up":
pos = get_track_pos(args[2])
delta = 1
try:
delta = int(args[3])
except:
pass
set_track(args[2], pos - delta)
list_track()
elif args[1] == "down" or args[1] == "dn":
pos = get_track_pos(args[2])
delta = 1
try:
delta = int(args[3])
except:
pass
set_track(args[2], pos + delta)
list_track()
elif args[1] == "log" and len(args) >= 3 and args[2] == "rm":
num = 1
try:
num = int(args[3])
except:
pass
config["log"] = config["log"][0:-num]
log()
elif args[1] == "log":
log()
else:
print("Unknown command!")
exit(1)
if __name__ == "__main__":
args = sys.argv
now = datetime.now()
# read config
with open(CONF_PATH, "r") as file:
config = json.loads(file.read())
# init config
if config.get("log", None) == None:
config["log"] = []
if config.get("now", None) == None:
config["now"] = []
main()
# write config
with open(CONF_PATH, "w") as file:
file.write(json.dumps(config))