#!/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))