mirror of
https://github.com/krateng/maloja.git
synced 2023-08-10 21:12:55 +03:00
Added highly experimental last.fm proxy scrobbling
This commit is contained in:
parent
8cbc7a8e56
commit
b9ae163132
@ -6,6 +6,7 @@ import utilities
|
||||
from malojatime import register_scrobbletime, time_stamps, ranges
|
||||
from urihandler import uri_to_internal, internal_to_uri, compose_querystring
|
||||
import compliant_api
|
||||
from external import proxy_scrobble
|
||||
# doreah toolkit
|
||||
from doreah.logging import log
|
||||
from doreah import tsv
|
||||
@ -116,6 +117,9 @@ def createScrobble(artists,title,time,volatile=False):
|
||||
invalidate_caches()
|
||||
dblock.release()
|
||||
|
||||
proxy_scrobble(artists,title,time)
|
||||
|
||||
|
||||
return get_track_dict(TRACKS[obj.track])
|
||||
|
||||
|
||||
|
43
external.py
43
external.py
@ -3,6 +3,9 @@ import json
|
||||
import base64
|
||||
from doreah.settings import get_settings
|
||||
from doreah.logging import log
|
||||
import hashlib
|
||||
|
||||
### PICTURES
|
||||
|
||||
|
||||
apis_artists = []
|
||||
@ -130,3 +133,43 @@ def api_request_track(track):
|
||||
pass
|
||||
|
||||
return None
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
### SCROBBLING
|
||||
|
||||
# creates signature and returns full query string
|
||||
def lfmbuild(parameters):
|
||||
m = hashlib.md5()
|
||||
keys = sorted(str(k) for k in parameters)
|
||||
m.update(utf("".join(str(k) + str(parameters[k]) for k in keys)))
|
||||
m.update(utf(get_settings("LASTFM_API_SECRET")))
|
||||
sig = m.hexdigest()
|
||||
return "&".join(str(k) + "=" + str(parameters[k]) for k in parameters) + "&api_sig=" + sig
|
||||
|
||||
def utf(st):
|
||||
return st.encode(encoding="UTF-8")
|
||||
|
||||
|
||||
|
||||
apis_scrobble = []
|
||||
|
||||
if get_settings("LASTFM_API_SK") not in [None,"ASK"] and get_settings("LASTFM_API_SECRET") not in [None,"ASK"] and get_settings("LASTFM_API_KEY") not in [None,"ASK"]:
|
||||
apis_scrobble.append({
|
||||
"name":"LastFM",
|
||||
"scrobbleurl":"http://ws.audioscrobbler.com/2.0/",
|
||||
"requestbody":lambda artists,title,timestamp: lfmbuild({"method":"track.scrobble","artist[0]":", ".join(artists),"track[0]":title,"timestamp":timestamp,"api_key":get_settings("LASTFM_API_KEY"),"sk":get_settings("LASTFM_API_SK")})
|
||||
})
|
||||
|
||||
|
||||
|
||||
|
||||
def proxy_scrobble(artists,title,timestamp):
|
||||
for api in apis_scrobble:
|
||||
response = urllib.request.urlopen(api["scrobbleurl"],data=utf(api["requestbody"](artists,title,timestamp)))
|
||||
xml = response.read()
|
||||
|
@ -5,6 +5,7 @@ WEB_PORT = 42010
|
||||
[Third Party Services]
|
||||
|
||||
LASTFM_API_KEY = "ASK" # 'ASK' signifies that the user has not yet indicated to not use any key at all.
|
||||
LASTFM_API_SECRET = "ASK"
|
||||
FANARTTV_API_KEY = "ASK"
|
||||
SPOTIFY_API_ID = "ASK"
|
||||
SPOTIFY_API_SECRET = "ASK"
|
||||
|
46
website/proxy.html
Normal file
46
website/proxy.html
Normal file
@ -0,0 +1,46 @@
|
||||
<!DOCTYPE html>
|
||||
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<title>Maloja - Proxyscrobble</title>
|
||||
<script src="javascript/cookies.js"></script>
|
||||
|
||||
<script>
|
||||
window.addEventListener("load",function(){
|
||||
try {
|
||||
document.getElementById("lastfmlink").href += window.location.href;
|
||||
}
|
||||
catch (e) {
|
||||
}
|
||||
|
||||
|
||||
});
|
||||
</script>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<table class="top_info">
|
||||
<tr>
|
||||
<td class="image">
|
||||
<div style="background-image:url('/favicon.png')"></div>
|
||||
</td>
|
||||
<td class="text">
|
||||
<h1>Proxyscrobble</h1>
|
||||
|
||||
<p class="desc">Duplicate your scrobbles to another service.
|
||||
Your API key is required to make any changes to the server: <input id='apikey' onchange='checkAPIkey()' style='width:300px;'/></p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<table class="list">
|
||||
<tr>
|
||||
<td>Last.fm</td>
|
||||
KEY_STATUS_LASTFM
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
|
||||
</body>
|
||||
</html>
|
53
website/proxy.py
Normal file
53
website/proxy.py
Normal file
@ -0,0 +1,53 @@
|
||||
from doreah.settings import get_settings, update_settings
|
||||
import urllib.request
|
||||
import hashlib
|
||||
import xml.etree.ElementTree as ET
|
||||
from bottle import redirect, request
|
||||
from database import checkAPIkey
|
||||
from external import lfmbuild
|
||||
|
||||
def instructions(keys):
|
||||
authenticated = False
|
||||
if "Cookie" in request.headers:
|
||||
cookies = request.headers["Cookie"].split(";")
|
||||
for c in cookies:
|
||||
if c.strip().startswith("apikey="):
|
||||
authenticated = checkAPIkey(c.strip()[7:])
|
||||
|
||||
if "token" in keys and authenticated:
|
||||
token = keys.get("token")
|
||||
parameters = {
|
||||
"method":"auth.getSession",
|
||||
"token":token,
|
||||
"api_key":get_settings("LASTFM_API_KEY")
|
||||
}
|
||||
response = urllib.request.urlopen("http://ws.audioscrobbler.com/2.0/?" + lfmbuild(parameters))
|
||||
xml = response.read()
|
||||
data = ET.fromstring(xml)
|
||||
if data.attrib.get("status") == "ok":
|
||||
username = data.find("session").find("name").text
|
||||
sessionkey = data.find("session").find("key").text
|
||||
|
||||
update_settings("settings/settings.ini",{"LASTFM_API_SK":sessionkey,"LASTFM_USERNAME":username},create_new=True)
|
||||
|
||||
return "/proxy"
|
||||
|
||||
else:
|
||||
key,secret,sessionkey,name = get_settings("LASTFM_API_KEY","LASTFM_API_SECRET","LASTFM_API_SK","LASTFM_USERNAME")
|
||||
|
||||
if key is None:
|
||||
lastfm = "<td>No Last.fm key provided</td>"
|
||||
elif secret is None:
|
||||
lastfm = "<td>No Last.fm secret provided</td>"
|
||||
elif sessionkey is None and authenticated:
|
||||
url = "http://www.last.fm/api/auth/?api_key=" + key + "&cb="
|
||||
lastfm = "<td class='button'><a id='lastfmlink' href='" + url + "'><div>Connect</div></a></td>"
|
||||
elif sessionkey is None:
|
||||
lastfm = "<td>Not active</td>"
|
||||
else:
|
||||
|
||||
lastfm = "<td>Account: " + name + "</td>"
|
||||
|
||||
|
||||
|
||||
return {"KEY_STATUS_LASTFM":lastfm},[]
|
Loading…
Reference in New Issue
Block a user