#!/usr/bin/env python3 import subprocess import sys import signal import os import stat neededmodules = [ "bottle", "waitress", "setproctitle" ] recommendedmodules = [ "wand" ] SOURCE_URL = "https://github.com/krateng/maloja/archive/master.zip" def blue(txt): return "\033[94m" + txt + "\033[0m" def green(txt): return "\033[92m" + txt + "\033[0m" def yellow(txt): return "\033[93m" + txt + "\033[0m" def gotodir(): if os.path.exists("./server.py"): return True elif os.path.exists("/opt/maloja/server.py"): os.chdir("/opt/maloja/") return True print("Maloja installation could not be found.") return False def setup(): # LASTFM API KEY if os.path.exists("./apikey"): with open("apikey","r") as keyfile: apikey = keyfile.read().replace("\n","") if apikey == "NONE": print("Currently not using an API key for image display. Only local images will be used.") else: print("Please enter your Last.FM API key. If you do not want to display artist and track images, simply leave this empty and press Enter.") key = input() if key == "": key = "NONE" with open("apikey","w") as keyfile: keyfile.write(key) # OWN API KEY if os.path.exists("./clients/authenticated_machines.tsv"): pass else: print("Do you want to set up a key to enable scrobbling? Your scrobble extension needs that key so that only you can scrobble tracks to your database. [Y/n]") answer = input() if answer.lower() in ["y","yes","yea","1","positive","true",""]: import random key = "" for i in range(64): key += str(random.choice(list(range(10)) + list("abcdefghijklmnopqrstuvwxyz") + list("ABCDEFGHIJKLMNOPQRSTUVWXYZ"))) print("Your API Key: " + yellow(key)) with open("./clients/authenticated_machines.tsv","w") as keyfile: keyfile.write(key + "\n" + "Default Generated Key") elif answer.lower() in ["n","no","nay","0","negative","false"]: pass #file is generated my server itself if not found def install(): toinstall = [] toinstallr = [] for m in neededmodules: try: exec("import " + m) #I'm sorry except: toinstall.append(m) for m in recommendedmodules: try: exec("import " + m) except: toinstallr.append(m) if toinstall != []: print("The following python modules need to be installed:") for m in toinstall: print("\t" + m) if toinstallr != []: print("The following python modules are highly recommended, some features will not work without them:") for m in toinstallr: print("\t" + m) if toinstall != [] or toinstallr != []: if os.geteuid() != 0: print("Installing python modules should be fairly straight-forward, but Maloja can try to install \ them automatically. For this, you need to run this script as a root user.") return False else: print("Installing python modules should be fairly straight-forward, but Maloja can try to install \ them automatically, This might or might not work / bloat your system / cause a nuclear war.") fail = False if toinstall != []: print("Attempt to install required modules? [Y/n]") answer = input() if answer.lower() in ["y","yes","yea","1","positive","true",""]: for m in neededmodules: try: print("Installing " + m + " with pip...") import pip #os.system("pip3 install " + m) pip.main(["install",m]) print("Success!") except: print("Failure!") fail = True elif answer.lower() in ["n","no","nay","0","negative","false"]: return False #if you dont want to auto install required, you probably dont want to install recommended else: print("What?") return False if toinstallr != []: print("Attempt to install recommended modules? [Y/n]") answer = input() if answer.lower() in ["y","yes","yea","1","positive","true",""]: for m in recommendedmodules: try: print("Installing " + m + " with pip...") import pip #os.system("pip3 install " + m) pip.main(["install",m]) print("Success!") except: print("Failure!") fail = True elif answer.lower() in ["n","no","nay","0","negative","false"]: return False else: print("What?") return False if fail: return False print("All modules successfully installed!") return True else: print("All necessary modules seem to be installed.") return True def getInstance(): try: output = subprocess.check_output(["pidof","Maloja"]) pid = int(output) return pid except: return None def start(): if install(): if gotodir(): setup() p = subprocess.Popen(["python3","server.py"],stdout=subprocess.DEVNULL,stderr=subprocess.DEVNULL) print(green("Maloja started!") + " PID: " + str(p.pid)) print("Visit your server address (Port 42010) to see your web interface. Visit /setup to get started.") print("If you're installing this on your local machine, these links should get you there:") print("\t" + blue("http://localhost:42010")) print("\t" + blue("http://localhost:42010/setup")) return True #else: # os.chdir("/opt/maloja/") # p = subprocess.Popen(["python3","server.py"],stdout=subprocess.DEVNULL,stderr=subprocess.DEVNULL) # print("Maloja started! PID: " + str(p.pid)) # return True print("Error while starting Maloja.") return False def restart(): #pid = getInstance() #if pid == None: # print("Server is not running.") #else: # stop() #start() wasrunning = stop() start() return wasrunning def stop(): pid = getInstance() if pid == None: print("Server is not running") return False else: os.kill(pid,signal.SIGTERM) print("Maloja stopped! PID: " + str(pid)) return True def update(): import urllib.request import shutil #import tempfile import zipfile import distutils.dir_util if not gotodir(): return False print("Updating Maloja...") #with urllib.request.urlopen(SOURCE_URL) as response: # with tempfile.NamedTemporaryFile(delete=True) as tmpfile: # shutil.copyfileobj(response,tmpfile) # # with zipfile.ZipFile(tmpfile.name,"r") as z: # # for f in z.namelist(): # #print("extracting " + f) # z.extract(f) os.system("wget " + SOURCE_URL) with zipfile.ZipFile("./master.zip","r") as z: for f in z.namelist(): #print("extracting " + f) z.extract(f) os.remove("./master.zip") distutils.dir_util.copy_tree("./maloja-master/","./",verbose=2) shutil.rmtree("./maloja-master") print("Done!") os.chmod("./maloja",os.stat("./maloja").st_mode | stat.S_IXUSR) if stop(): start() #stop returns whether it was running before, in which case we restart it def loadlastfm(): try: filename = sys.argv[2] filename = os.path.abspath(filename) except: print("Please specify a file!") return if gotodir(): if os.path.exists("./scrobbles/lastfmimport.tsv"): print("Already imported Last.FM data. Overwrite? [y/N]") if input().lower() in ["y","yes","yea","1","positive","true"]: pass else: return print("Please wait...") os.system("python3 ./lastfmconverter.py " + filename + " ./scrobbles/lastfmimport.tsv") print("Successfully imported your Last.FM scrobbles!") if __name__ == "__main__": if sys.argv[1] == "start": restart() elif sys.argv[1] == "restart": restart() elif sys.argv[1] == "stop": stop() elif sys.argv[1] == "update": update() elif sys.argv[1] == "import": loadlastfm() else: print("Valid commands: start restart stop update")