Better install script, some imports moved out of functions

This commit is contained in:
Krateng 2019-02-18 00:34:25 +01:00
parent 4b3cd8cce3
commit b65d65326c
7 changed files with 107 additions and 31 deletions

View File

@ -24,8 +24,9 @@ The software works fairly well and has a few web views, but there is only one sc
## Requirements
* [bottle.py](https://github.com/bottlepy/bottle)
* [waitress](https://github.com/Pylons/waitress)
* [python3](https://www.python.org/) - [GitHub](https://github.com/python/cpython)
* [bottle.py](https://bottlepy.org/) - [GitHub](https://github.com/bottlepy/bottle)
* [waitress](https://docs.pylonsproject.org/projects/waitress/) - [GitHub](https://github.com/Pylons/waitress)
## How to install
@ -37,6 +38,12 @@ Installing Maloja is fairly easy on a Linux machine. Don't ask me how to do it o
If you're missing packages, the console output will tell you so. Install them.
You can also only download the maloja file itself and run
./maloja update
to download the rest of the repository, then start it as described above.
2) (Recommended) Put your server behind a reverse proxy for SSL encryption. Configure that proxy to rewrite /db/ requests to the database port. In nginx this would look as follows:
location / {

View File

@ -232,7 +232,6 @@ def get_tracks_external():
def get_tracks(artist=None):
if artist is not None:
artistid = ARTISTS.index(artist)
else:

View File

@ -1,8 +1,9 @@
import urllib
from bottle import FormsDict
import datetime
def artistLink(name):
import urllib
return "<a href='/artist?artist=" + urllib.parse.quote(name) + "'>" + name + "</a>"
def artistLinks(artists):
@ -11,25 +12,21 @@ def artistLinks(artists):
#def trackLink(artists,title):
def trackLink(track):
artists,title = track["artists"],track["title"]
import urllib
return "<a href='/track?title=" + urllib.parse.quote(title) + "&" + "&".join(["artist=" + urllib.parse.quote(a) for a in artists]) + "'>" + title + "</a>"
#def scrobblesTrackLink(artists,title,timekeys,amount=None,pixels=None):
def scrobblesTrackLink(track,timekeys,amount=None,percent=None):
artists,title = track["artists"],track["title"]
import urllib
inner = str(amount) if amount is not None else "<div style='width:" + str(percent) + "%;'></div>"
return "<a href='/scrobbles?" + "&".join(["artist=" + urllib.parse.quote(a) for a in artists]) + "&title=" + urllib.parse.quote(title) + "&" + keysToUrl(timekeys) + "'>" + inner + "</a>"
def scrobblesArtistLink(artist,timekeys,amount=None,percent=None,associated=False):
import urllib
inner = str(amount) if amount is not None else "<div style='width:" + str(percent) + "%;'></div>"
askey = "&associated" if associated else ""
return "<a href='/scrobbles?artist=" + urllib.parse.quote(artist) + "&" + keysToUrl(timekeys) + askey + "'>" + inner + "</a>"
# necessary because urllib.parse.urlencode doesnt handle multidicts
def keysToUrl(*dicts):
import urllib
st = ""
keys = removeIdentical(*dicts)
for k in keys:
@ -39,8 +36,6 @@ def keysToUrl(*dicts):
return st
def removeIdentical(*dicts):
from bottle import FormsDict
#combine multiple dicts
keys = FormsDict()
for d in dicts:
@ -61,7 +56,6 @@ def removeIdentical(*dicts):
return new
def getTimeDesc(timestamp,short=False):
import datetime
tim = datetime.datetime.utcfromtimestamp(timestamp)
if short:
now = datetime.datetime.now(tz=datetime.timezone.utc)
@ -87,7 +81,6 @@ def getTimeDesc(timestamp,short=False):
# limit a multidict to only the specified keys
# would be a simple constructor expression, but multidicts apparently don't let me do that
def pickKeys(d,*keys):
from bottle import FormsDict
if isinstance(d,dict):
return {k:d.get(k) for k in d if k in keys}
else:
@ -103,7 +96,6 @@ def pickKeys(d,*keys):
# removes all duplicate keys, except artists when a title is specified
def clean(d):
from bottle import FormsDict
if isinstance(d,dict):
return
else:

2
logs/.gitignore vendored
View File

@ -1 +1 @@
*.txt
*.log

85
maloja
View File

@ -13,24 +13,99 @@ neededmodules = [
"setproctitle"
]
recommendedmodules = [
"wand"
]
SOURCE_URL = "https://github.com/krateng/maloja/archive/master.zip"
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:
return
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:
@ -44,7 +119,7 @@ def getInstance():
def start():
install()
if install():
try:
p = subprocess.Popen(["python3","server.py"],stdout=subprocess.DEVNULL,stderr=subprocess.DEVNULL)
@ -55,6 +130,7 @@ def start():
return False
def restart():
#pid = getInstance()
#if pid == None:
@ -73,8 +149,8 @@ def stop():
print("Server is not running")
return False
else:
print("Stopping " + str(pid))
os.kill(pid,signal.SIGTERM)
print("Maloja stopped! PID: " + str(pid))
return True
def update():
@ -93,7 +169,7 @@ def update():
with zipfile.ZipFile(tmpfile.name,"r") as z:
for f in z.namelist():
print("extracting " + f)
#print("extracting " + f)
z.extract(f)
@ -112,4 +188,5 @@ if __name__ == "__main__":
elif sys.argv[1] == "restart": restart()
elif sys.argv[1] == "stop": stop()
elif sys.argv[1] == "update": update()
else: print("Valid commands: start restart stop update")

View File

@ -162,7 +162,8 @@ def log(msg):
module = inspect.getmodule(inspect.stack()[1][0]).__name__
if module == "__main__": module = "mainserver"
print("[" + module + "] " + msg)
# best function ever
with open("logs/" + module + ".log","a") as logfile:
logfile.write(msg + "\n")
### Media info

View File

@ -272,7 +272,7 @@
<div class="footer">
<span>Get your own Maloja scrobble server on <a href="https://github.com/krateng/maloja">GitHub</a></span>
<span>Get your own Maloja scrobble server on <a target="_blank" rel="noopener noreferrer" href="https://github.com/krateng/maloja">GitHub</a></span>
</div>
</body>