diff --git a/database.py b/database.py index 9994139..1ae61db 100644 --- a/database.py +++ b/database.py @@ -885,6 +885,18 @@ def search(**keys): return {"artists":artists_result[:max_],"tracks":tracks_result[:max_]} + +@dbserver.post("addpicture") +def add_picture(b64,key,artist:Multi=[],title=None): + if (checkAPIkey(key)): + keys = FormsDict() + for a in artist: + keys.append("artist",a) + if title is not None: keys.append("title",title) + k_filter, _, _, _ = uri_to_internal(keys) + if "track" in k_filter: k_filter = k_filter["track"] + utilities.set_image(b64,**k_filter) + #### ## Server operation #### diff --git a/info.py b/info.py index 4fad071..941fd4b 100644 --- a/info.py +++ b/info.py @@ -5,6 +5,6 @@ author = { "email":"maloja@krateng.dev", "github": "krateng" } -version = 1,5,14 +version = 1,5,15 versionstr = ".".join(str(n) for n in version) dev = os.path.exists("./.dev") diff --git a/server.py b/server.py index e78e930..0c558c8 100755 --- a/server.py +++ b/server.py @@ -1,7 +1,7 @@ #!/usr/bin/env python # server stuff -from bottle import Bottle, route, get, post, error, run, template, static_file, request, response, FormsDict, redirect, template, HTTPResponse +from bottle import Bottle, route, get, post, error, run, template, static_file, request, response, FormsDict, redirect, template, HTTPResponse, BaseRequest import waitress # monkey patching import monkey @@ -35,6 +35,8 @@ import urllib #settings.update("settings/default.ini","settings/settings.ini") MAIN_PORT = settings.get_settings("WEB_PORT") HOST = settings.get_settings("HOST") +THREADS = 12 +BaseRequest.MEMFILE_MAX = 15 * 1024 * 1024 webserver = Bottle() @@ -251,4 +253,5 @@ database.start_db() database.dbserver.mount(server=webserver) log("Starting up Maloja server...") -run(webserver, host=HOST, port=MAIN_PORT, server='waitress') +#run(webserver, host=HOST, port=MAIN_PORT, server='waitress') +waitress.serve(webserver, host=HOST, port=MAIN_PORT, threads=THREADS) diff --git a/utilities.py b/utilities.py index 861488d..d3850ef 100644 --- a/utilities.py +++ b/utilities.py @@ -8,6 +8,7 @@ import urllib import datetime import random import itertools +import base64 from doreah import settings from doreah import caching from doreah.logging import log @@ -144,10 +145,10 @@ track_cache = caching.Cache(name="imgcache_tracks",maxage=cacheage,maxage_negati def clean(name): return "".join(c for c in name if c.isalnum() or c in []).strip() -def local_files(artist=None,artists=None,title=None): - +def get_all_possible_filenames(artist=None,artists=None,title=None): # check if we're dealing with a track or artist, then clean up names # (only remove non-alphanumeric, allow korean and stuff) + if title is not None and artists is not None: track = True title, artists = clean(title), [clean(a) for a in artists] @@ -203,20 +204,27 @@ def local_files(artist=None,artists=None,title=None): filenames = list(set(filenames)) if len(filenames) == 0: filenames.append(str(hash(artist))) + return [superfolder + name for name in filenames] + +def local_files(artist=None,artists=None,title=None): + + + filenames = get_all_possible_filenames(artist,artists,title) + images = [] for purename in filenames: # direct files for ext in ["png","jpg","jpeg","gif"]: #for num in [""] + [str(n) for n in range(0,10)]: - if os.path.exists(superfolder + purename + "." + ext): - images.append("/" + superfolder + purename + "." + ext) + if os.path.exists(purename + "." + ext): + images.append("/" + purename + "." + ext) # folder try: - for f in os.listdir(superfolder + purename + "/"): + for f in os.listdir(purename + "/"): if f.split(".")[-1] in ["png","jpg","jpeg","gif"]: - images.append("/" + superfolder + purename + "/" + f) + images.append("/" + purename + "/" + f) except: pass @@ -416,8 +424,32 @@ def resolveImage(artist=None,track=None): +def set_image(b64,**keys): + track = "title" in keys + regex = r"data:image/(\w+);base64,(.+)" + type,b64 = re.fullmatch(regex,b64).groups() + print(b64[:40]) + b64 = base64.b64decode(b64) + filename = "webupload" + str(int(datetime.datetime.now().timestamp())) + "." + type + for folder in get_all_possible_filenames(**keys): + if os.path.exists(folder): + with open(os.path.join(folder,filename),"wb") as f: + f.write(b64) + # set as current picture in rotation + if track: local_track_cache.add((frozenset(keys["artists"]),keys["title"]),os.path.join(folder,filename)) + else: local_artist_cache.add(keys["artist"],os.path.join(folder,filename)) + return + + folder = get_all_possible_filenames(**keys)[0] + os.makedirs(folder) + with open(os.path.join(folder,filename),"wb") as f: + f.write(b64) + + # set as current picture in rotation + if track: local_track_cache.add((frozenset(keys["artists"]),keys["title"]),os.path.join(folder,filename)) + else: local_artist_cache.add(keys["artist"],os.path.join(folder,filename)) diff --git a/website/artist.pyhp b/website/artist.pyhp index 4d22f58..6070112 100644 --- a/website/artist.pyhp +++ b/website/artist.pyhp @@ -48,7 +48,8 @@
-
+
+

diff --git a/website/common/header.html b/website/common/header.html index aec0e53..37d9792 100644 --- a/website/common/header.html +++ b/website/common/header.html @@ -8,3 +8,4 @@ + diff --git a/website/javascript/neopolitan.js b/website/javascript/neopolitan.js index 1b233d5..5590597 100644 --- a/website/javascript/neopolitan.js +++ b/website/javascript/neopolitan.js @@ -25,4 +25,12 @@ if(functions.length>0){supervisor();} var body=document.getElementsByTagName("BODY")[0] if(body.getAttribute("data-linkinterceptor")!=undefined){var interceptor=eval(body.getAttribute("data-linkinterceptor"));function interceptClickEvent(e){var href;var target=e.target||e.srcElement;if(target.tagName==='A'&&!target.classList.contains("no-intercept")){href=target.getAttribute('href');e.preventDefault();history.pushState({},"",href);interceptor();}} document.addEventListener('click',interceptClickEvent);}},false);document.addEventListener('keyup',function(evt){if(evt.srcElement.tagName=="INPUT"){return;} -var elements=document.querySelectorAll('[data-hotkey]');for(let e of elements){if(e.getAttribute("data-hotkey")==evt.code){evt.preventDefault();e.onclick();break;}}},false); \ No newline at end of file +var elements=document.querySelectorAll('[data-hotkey]');for(let e of elements){if(e.getAttribute("data-hotkey")==evt.code){evt.preventDefault();e.onclick();break;}}},false);function dragover(evt){evt.preventDefault();} +function readImageFile(evt,crop=false){evt.preventDefault();var element=this;var file=evt.dataTransfer.files[0];var reader=new FileReader();reader.onload=(function(evt){parseImage(reader.result,element,crop);});reader.readAsArrayBuffer(file);} +function parseImage(buffer,element,crop){var binary='';var bytes=new Uint8Array(buffer);var len=bytes.byteLength;for(var i=0;i
-
+
+