mirror of
https://github.com/krateng/maloja.git
synced 2025-07-09 03:04:07 -04:00
Implemented artist metadata interface
This commit is contained in:
parent
b6a66ff2ed
commit
fe106a3227
@ -9,11 +9,18 @@ HOST = "::" # You most likely want either :: for IPv6 or 0.0.0.0 for IPv4 here
|
|||||||
|
|
||||||
[Third Party Services]
|
[Third Party Services]
|
||||||
|
|
||||||
|
# whether to use metadata providers
|
||||||
|
METADATA_LASTFM = true
|
||||||
|
METADATA_SPOTIFY = true
|
||||||
|
# whether to proxy scrobble to other services
|
||||||
|
SCROBBLE_LASTFM = false
|
||||||
|
|
||||||
LASTFM_API_KEY = "ASK" # 'ASK' signifies that the user has not yet indicated to not use any key at all.
|
LASTFM_API_KEY = "ASK" # 'ASK' signifies that the user has not yet indicated to not use any key at all.
|
||||||
LASTFM_API_SECRET = "ASK"
|
LASTFM_API_SECRET = "ASK"
|
||||||
FANARTTV_API_KEY = "ASK"
|
FANARTTV_API_KEY = "ASK"
|
||||||
SPOTIFY_API_ID = "ASK"
|
SPOTIFY_API_ID = "ASK"
|
||||||
SPOTIFY_API_SECRET = "ASK"
|
SPOTIFY_API_SECRET = "ASK"
|
||||||
|
|
||||||
CACHE_EXPIRE_NEGATIVE = 30 # after how many days negative results should be tried again
|
CACHE_EXPIRE_NEGATIVE = 30 # after how many days negative results should be tried again
|
||||||
CACHE_EXPIRE_POSITIVE = 300 # after how many days positive results should be refreshed
|
CACHE_EXPIRE_POSITIVE = 300 # after how many days positive results should be refreshed
|
||||||
THUMBOR_SERVER = None
|
THUMBOR_SERVER = None
|
||||||
|
30
maloja/thirdparty/__init__.py
vendored
30
maloja/thirdparty/__init__.py
vendored
@ -31,6 +31,10 @@ def get_image_track_all(track):
|
|||||||
for service in services["metadata"]:
|
for service in services["metadata"]:
|
||||||
res = service.get_image_track(track)
|
res = service.get_image_track(track)
|
||||||
if res is not None: return res
|
if res is not None: return res
|
||||||
|
def get_image_artist_all(artist):
|
||||||
|
for service in services["metadata"]:
|
||||||
|
res = service.get_image_artist(artist)
|
||||||
|
if res is not None: return res
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -135,13 +139,33 @@ class MetadataInterface(GenericInterface,abstract=True):
|
|||||||
responsedata = response.read()
|
responsedata = response.read()
|
||||||
if self.metadata["response_type"] == "json":
|
if self.metadata["response_type"] == "json":
|
||||||
data = json.loads(responsedata)
|
data = json.loads(responsedata)
|
||||||
return self.metadata_parse_response(data)
|
return self.metadata_parse_response_track(data)
|
||||||
|
|
||||||
|
def get_image_artist(self,artist):
|
||||||
|
artiststring = urllib.parse.quote(artist)
|
||||||
|
response = urllib.request.urlopen(
|
||||||
|
self.metadata["artisturl"].format(artist=artiststring,**self.settings)
|
||||||
|
)
|
||||||
|
|
||||||
|
responsedata = response.read()
|
||||||
|
if self.metadata["response_type"] == "json":
|
||||||
|
data = json.loads(responsedata)
|
||||||
|
return self.metadata_parse_response_artist(data)
|
||||||
|
|
||||||
# default function to parse response by descending down nodes
|
# default function to parse response by descending down nodes
|
||||||
# override if more complicated
|
# override if more complicated
|
||||||
def metadata_parse_response(self,data):
|
def metadata_parse_response_artist(self,data):
|
||||||
res = data
|
res = data
|
||||||
for node in self.metadata["response_parse_tree"]:
|
for node in self.metadata["response_parse_tree_artist"]:
|
||||||
|
try:
|
||||||
|
res = res[node]
|
||||||
|
except:
|
||||||
|
return None
|
||||||
|
return res
|
||||||
|
|
||||||
|
def metadata_parse_response_track(self,data):
|
||||||
|
res = data
|
||||||
|
for node in self.metadata["response_parse_tree_track"]:
|
||||||
try:
|
try:
|
||||||
res = res[node]
|
res = res[node]
|
||||||
except:
|
except:
|
||||||
|
6
maloja/thirdparty/lastfm.py
vendored
6
maloja/thirdparty/lastfm.py
vendored
@ -20,12 +20,14 @@ class LastFM(MetadataInterface, ProxyScrobbleInterface):
|
|||||||
metadata = {
|
metadata = {
|
||||||
"trackurl": "https://ws.audioscrobbler.com/2.0/?method=track.getinfo&track={title}&artist={artist}&api_key={apikey}&format=json",
|
"trackurl": "https://ws.audioscrobbler.com/2.0/?method=track.getinfo&track={title}&artist={artist}&api_key={apikey}&format=json",
|
||||||
"response_type":"json",
|
"response_type":"json",
|
||||||
"response_parse_tree": ["track","album","image",3,"#text"],
|
"response_parse_tree_track": ["track","album","image",3,"#text"],
|
||||||
"required_settings": ["apikey"],
|
"required_settings": ["apikey"],
|
||||||
"activated_setting": "METADATA_LASTFM"
|
"activated_setting": "METADATA_LASTFM"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
def get_image_artist(self,artist):
|
||||||
|
return None
|
||||||
|
# lastfm doesn't provide artist images
|
||||||
|
|
||||||
def proxyscrobble_parse_response(self,data):
|
def proxyscrobble_parse_response(self,data):
|
||||||
return data.attrib.get("status") == "ok" and data.find("scrobbles").attrib.get("ignored") == "0"
|
return data.attrib.get("status") == "ok" and data.find("scrobbles").attrib.get("ignored") == "0"
|
||||||
|
4
maloja/thirdparty/spotify.py
vendored
4
maloja/thirdparty/spotify.py
vendored
@ -13,8 +13,10 @@ class Spotify(MetadataInterface):
|
|||||||
|
|
||||||
metadata = {
|
metadata = {
|
||||||
"trackurl": "https://api.spotify.com/v1/search?q={artist}%20{title}&type=track&access_token={token}",
|
"trackurl": "https://api.spotify.com/v1/search?q={artist}%20{title}&type=track&access_token={token}",
|
||||||
|
"artisturl": "https://api.spotify.com/v1/search?q={artist}&type=artist&access_token={token}",
|
||||||
"response_type":"json",
|
"response_type":"json",
|
||||||
"response_parse_tree": ["tracks","items",0,"album","images",0,"url"],
|
"response_parse_tree_track": ["tracks","items",0,"album","images",0,"url"],
|
||||||
|
"response_parse_tree_artist": ["artists","items",0,"images",0,"url"],
|
||||||
"required_settings": ["apiid","secret"],
|
"required_settings": ["apiid","secret"],
|
||||||
"activated_setting": "METADATA_SPOTIFY"
|
"activated_setting": "METADATA_SPOTIFY"
|
||||||
}
|
}
|
||||||
|
@ -14,8 +14,8 @@ from doreah import caching
|
|||||||
from doreah.logging import log
|
from doreah.logging import log
|
||||||
from doreah.regular import yearly, daily
|
from doreah.regular import yearly, daily
|
||||||
|
|
||||||
from .external import api_request_track, api_request_artist
|
#from .external import api_request_track, api_request_artist
|
||||||
from .thirdparty import get_image_track_all
|
from .thirdparty import get_image_track_all, get_image_artist_all
|
||||||
from .__pkginfo__ import version
|
from .__pkginfo__ import version
|
||||||
from . import globalconf
|
from . import globalconf
|
||||||
from .globalconf import datadir
|
from .globalconf import datadir
|
||||||
@ -348,7 +348,8 @@ def getArtistImage(artist,fast=False):
|
|||||||
if fast: return "/image?artist=" + urllib.parse.quote(artist)
|
if fast: return "/image?artist=" + urllib.parse.quote(artist)
|
||||||
|
|
||||||
# non-fast lookup (esentially only the resolver lookup)
|
# non-fast lookup (esentially only the resolver lookup)
|
||||||
result = api_request_artist(artist=artist)
|
# result = api_request_artist(artist=artist)
|
||||||
|
result = get_image_artist_all(artist)
|
||||||
|
|
||||||
# cache results (even negative ones)
|
# cache results (even negative ones)
|
||||||
#cachedArtists[artist] = result
|
#cachedArtists[artist] = result
|
||||||
|
Loading…
x
Reference in New Issue
Block a user