mirror of
https://github.com/krateng/maloja.git
synced 2023-08-10 21:12:55 +03:00
Implemented compare in jinja
This commit is contained in:
parent
44a2739a3b
commit
65861d4c41
@ -12,3 +12,4 @@ countas Shirley Manson Garbage
|
||||
countas Lewis Brindley The Yogscast
|
||||
countas Sips The Yogscast
|
||||
countas Sjin The Yogscast
|
||||
countas Airi Suzuki ℃-ute
|
||||
|
Can't render this file because it has a wrong number of fields in line 5.
|
@ -681,6 +681,62 @@ def trackInfo(track):
|
||||
|
||||
|
||||
|
||||
@dbserver.get("compare")
|
||||
def compare_external(**keys):
|
||||
|
||||
results = compare(keys["remote"])
|
||||
return results
|
||||
|
||||
def compare(remoteurl):
|
||||
import json
|
||||
compareurl = remoteurl + "/api/info"
|
||||
|
||||
response = urllib.request.urlopen(compareurl)
|
||||
strangerinfo = json.loads(response.read())
|
||||
owninfo = info()
|
||||
|
||||
#add_known_server(compareto)
|
||||
|
||||
artists = {}
|
||||
|
||||
for a in owninfo["artists"]:
|
||||
artists[a.lower()] = {"name":a,"self":int(owninfo["artists"][a]*1000),"other":0}
|
||||
|
||||
for a in strangerinfo["artists"]:
|
||||
artists[a.lower()] = artists.setdefault(a.lower(),{"name":a,"self":0})
|
||||
artists[a.lower()]["other"] = int(strangerinfo["artists"][a]*1000)
|
||||
|
||||
for a in artists:
|
||||
common = min(artists[a]["self"],artists[a]["other"])
|
||||
artists[a]["self"] -= common
|
||||
artists[a]["other"] -= common
|
||||
artists[a]["common"] = common
|
||||
|
||||
best = sorted((artists[a]["name"] for a in artists),key=lambda x: artists[x.lower()]["common"],reverse=True)
|
||||
|
||||
result = {
|
||||
"unique_self":sum(artists[a]["self"] for a in artists if artists[a]["common"] == 0),
|
||||
"more_self":sum(artists[a]["self"] for a in artists if artists[a]["common"] != 0),
|
||||
"common":sum(artists[a]["common"] for a in artists),
|
||||
"more_other":sum(artists[a]["other"] for a in artists if artists[a]["common"] != 0),
|
||||
"unique_other":sum(artists[a]["other"] for a in artists if artists[a]["common"] == 0)
|
||||
}
|
||||
|
||||
total = sum(result[c] for c in result)
|
||||
|
||||
for r in result:
|
||||
result[r] = (result[r],result[r]/total)
|
||||
|
||||
|
||||
|
||||
return {
|
||||
"result":result,
|
||||
"info":{
|
||||
"ownname":owninfo["name"],
|
||||
"remotename":strangerinfo["name"]
|
||||
},
|
||||
"commonartist":best[0]
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
60
maloja/malojauri.py
Normal file
60
maloja/malojauri.py
Normal file
@ -0,0 +1,60 @@
|
||||
from .malojatime import get_range_object
|
||||
|
||||
|
||||
|
||||
# this also sets defaults!
|
||||
def uri_to_internal(keys,forceTrack=False,forceArtist=False):
|
||||
|
||||
# output:
|
||||
# 1 keys that define the filtered object like artist or track
|
||||
# 2 keys that define time limits of the whole thing
|
||||
# 3 keys that define interal time ranges
|
||||
# 4 keys that define amount limits
|
||||
|
||||
# 1
|
||||
if "title" in keys and not forceArtist:
|
||||
filterkeys = {"track":{"artists":keys.getall("artist"),"title":keys.get("title")}}
|
||||
elif "artist" in keys and not forceTrack:
|
||||
filterkeys = {"artist":keys.get("artist")}
|
||||
if "associated" in keys: resultkeys1["associated"] = True
|
||||
else:
|
||||
filterkeys = {}
|
||||
|
||||
# 2
|
||||
limitkeys = {}
|
||||
since,to,within = None,None,None
|
||||
if "since" in keys: since = keys.get("since")
|
||||
elif "from" in keys: since = keys.get("from")
|
||||
elif "start" in keys: since = keys.get("start")
|
||||
if "to" in keys: to = keys.get("to")
|
||||
elif "until" in keys: to = keys.get("until")
|
||||
elif "end" in keys: to = keys.get("end")
|
||||
if "in" in keys: within = keys.get("in")
|
||||
elif "within" in keys: within = keys.get("within")
|
||||
elif "during" in keys: within = keys.get("during")
|
||||
limitkeys["timerange"] = get_range_object(since=since,to=to,within=within)
|
||||
|
||||
#3
|
||||
delimitkeys = {"step":"month","stepn":1,"trail":1}
|
||||
if "step" in keys: [delimitkeys["step"],delimitkeys["stepn"]] = (keys["step"].split("-") + [1])[:2]
|
||||
if "stepn" in keys: delimitkeys["stepn"] = keys["stepn"] #overwrite if explicitly given
|
||||
if "stepn" in delimitkeys: delimitkeys["stepn"] = int(delimitkeys["stepn"]) #in both cases, convert it here
|
||||
if "trail" in keys: delimitkeys["trail"] = int(keys["trail"])
|
||||
if "cumulative" in keys: delimitkeys["trail"] = math.inf
|
||||
|
||||
|
||||
|
||||
#4
|
||||
amountkeys = {"page":0,"perpage":100}
|
||||
if "max" in keys: amountkeys["page"],amountkeys["perpage"] = 0, int(keys["max"])
|
||||
#different max than the internal one! the user doesn't get to disable pagination
|
||||
if "page" in keys: amountkeys["page"] = int(keys["page"])
|
||||
if "perpage" in keys: amountkeys["perpage"] = int(keys["perpage"])
|
||||
|
||||
|
||||
#5
|
||||
specialkeys = {}
|
||||
if "remote" in keys: specialkeys["remote"] = keys["remote"]
|
||||
|
||||
|
||||
return filterkeys, limitkeys, delimitkeys, amountkeys, specialkeys
|
@ -17,7 +17,8 @@ from . import htmlgenerators
|
||||
from . import malojatime
|
||||
from . import utilities
|
||||
from .utilities import resolveImage
|
||||
from .urihandler import uri_to_internal, remove_identical
|
||||
from .urihandler import remove_identical
|
||||
from .malojauri import uri_to_internal
|
||||
from . import urihandler
|
||||
from . import globalconf
|
||||
from . import jinja_filters
|
||||
@ -114,7 +115,7 @@ def graceful_exit(sig=None,frame=None):
|
||||
@webserver.route("/image")
|
||||
def dynamic_image():
|
||||
keys = FormsDict.decode(request.query)
|
||||
relevant, _, _, _ = uri_to_internal(keys)
|
||||
relevant, _, _, _, _ = uri_to_internal(keys)
|
||||
result = resolveImage(**relevant)
|
||||
if result == "": return ""
|
||||
redirect(result,307)
|
||||
@ -265,7 +266,8 @@ def static_html(name):
|
||||
"apikey":request.cookies.get("apikey") if adminmode else None,
|
||||
"_urikeys":keys, #temporary!
|
||||
}
|
||||
LOCAL_CONTEXT["filterkeys"], LOCAL_CONTEXT["limitkeys"], LOCAL_CONTEXT["delimitkeys"], LOCAL_CONTEXT["amountkeys"] = uri_to_internal(keys)
|
||||
lc = LOCAL_CONTEXT
|
||||
lc["filterkeys"], lc["limitkeys"], lc["delimitkeys"], lc["amountkeys"], lc["specialkeys"] = uri_to_internal(keys)
|
||||
|
||||
template = jinjaenv.get_template(name + '.jinja')
|
||||
|
||||
|
@ -698,6 +698,8 @@ table.tiles_top td div {
|
||||
|
||||
table.tiles_top td span {
|
||||
background-color:rgba(0,0,0,0.7);
|
||||
display: inline-block;
|
||||
padding: 3px;
|
||||
}
|
||||
table.tiles_top td a:hover {
|
||||
text-decoration: none;
|
||||
|
110
maloja/web/jinja/compare.jinja
Normal file
110
maloja/web/jinja/compare.jinja
Normal file
@ -0,0 +1,110 @@
|
||||
{% extends "abstracts/base.jinja" %}
|
||||
{% block title %}Maloja - Compare{% endblock %}
|
||||
|
||||
{% block scripts %}
|
||||
<style>
|
||||
.comparecircle {
|
||||
height:500px;
|
||||
width:500px;
|
||||
border-radius:250px;
|
||||
border: 1px solid rgba(245,245,220,0.3);
|
||||
margin:auto;
|
||||
margin-top:100px;
|
||||
text-align:center;
|
||||
line-height:500px;
|
||||
font-size:60px;
|
||||
color:black;
|
||||
/* background-image: linear-gradient(to right,KEY_CIRCLE_CSS); */
|
||||
|
||||
}
|
||||
|
||||
table tr td:first-child {
|
||||
text-align: left;
|
||||
padding:10px;
|
||||
width:33%;
|
||||
}
|
||||
table tr td {
|
||||
text-align: center;
|
||||
padding:10px;
|
||||
}
|
||||
|
||||
table tr td:last-child {
|
||||
text-align: right;
|
||||
padding:10px;
|
||||
width:33%;
|
||||
}
|
||||
</style>
|
||||
{% endblock %}
|
||||
|
||||
{% set data = db.compare(specialkeys.remote) %}
|
||||
{% set comparedata = data.result %}
|
||||
{% set info = data.info %}
|
||||
{% set bestartist = data.commonartist %}
|
||||
<!--
|
||||
{% set categories =
|
||||
{
|
||||
"unique_self":"rgba(255,255,255,0.2)",
|
||||
"more_self":"rgba(255,255,255,0.5)",
|
||||
"common":"white",
|
||||
"more_other":"rgba(255,255,255,0.5)",
|
||||
"unique_other":"rgba(255,255,255,0.2)"
|
||||
}
|
||||
%}-->
|
||||
<!--
|
||||
{% set css = [] %}
|
||||
{% set cumulative = 0 %}
|
||||
{% for cat in categories %}
|
||||
{% set cumulative = cumulative + (comparedata[cat][1]*100) %}
|
||||
{% set _ = css.append(categories[cat] + " " + cumulative.__str__() + "%") %}
|
||||
{% endfor %}-->
|
||||
|
||||
{% set fullmatch = comparedata.common[1]*100 %}
|
||||
{% set partialmatch = comparedata.more_self[1]*100 + comparedata.more_other[1]*100 %}
|
||||
|
||||
{% set match = fullmatch + (partialmatch)/2 %}
|
||||
{% set pixel_fullmatch = fullmatch * 2.5 %}
|
||||
{% set pixel_partialmatch = (fullmatch+partialmatch) * 2.5 %}
|
||||
|
||||
{% set match = [match,100] | min %}
|
||||
|
||||
{% set r = [255*match/50,255] | min %}
|
||||
{% set g = [255*match/50,255] | min %}
|
||||
{% set b = [255*(match/50-1),0] | max %}
|
||||
|
||||
|
||||
{% block content %}
|
||||
<table style="width:99%;">
|
||||
<tr>
|
||||
<td><h1>{{ info.ownname }}</h1></td>
|
||||
<td>
|
||||
|
||||
<div class="comparecircle"
|
||||
style="background-image: radial-gradient(rgb({{ r }},{{ g }}, {{ b }}) {{ pixel_fullmatch }}px, transparent {{ pixel_partialmatch }}px);">
|
||||
{{ match | round(1) }}%
|
||||
|
||||
</div>
|
||||
</td>
|
||||
<td><h1>{{ info.remotename }}</h1></td>
|
||||
|
||||
</tr>
|
||||
<tr>
|
||||
<td></td>
|
||||
<td style="font-size:70%;color:grey;">
|
||||
The size of the circle shows matching music taste.
|
||||
The fuzziness of its border indicates differences in quantity.
|
||||
</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td></td>
|
||||
<td>
|
||||
<span>Common Favorite</span>
|
||||
<h2 style="margin:7px;">{{ htmlgenerators.artistLink(bestartist) }}</h2>
|
||||
<img src="{{ utilities.getArtistImage(bestartist) }}" style="width:80px;" />
|
||||
</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
|
||||
{% endblock %}
|
Loading…
Reference in New Issue
Block a user