mirror of
https://github.com/krateng/maloja.git
synced 2025-04-16 00:40:32 +03:00
Switched image caching to SQL
This commit is contained in:
parent
4c40fb0577
commit
cf43a9221a
@ -18,7 +18,7 @@ from doreah import auth
|
||||
|
||||
# rest of the project
|
||||
from . import database
|
||||
from .utilities import resolveImage
|
||||
from .utilities import get_track_image, get_artist_image
|
||||
from .malojauri import uri_to_internal, remove_identical
|
||||
from .globalconf import malojaconfig, apikeystore, data_dir
|
||||
from .jinjaenv.context import jinja_environment
|
||||
@ -158,8 +158,12 @@ def deprecated_api(pth):
|
||||
def dynamic_image():
|
||||
keys = FormsDict.decode(request.query)
|
||||
relevant, _, _, _, _ = uri_to_internal(keys)
|
||||
result = resolveImage(**relevant)
|
||||
if result == "": return ""
|
||||
if 'track' in relevant:
|
||||
result = get_track_image(relevant['track'])
|
||||
elif 'artist' in relevant:
|
||||
result = get_artist_image(relevant['artist'])
|
||||
|
||||
if result is None: return ""
|
||||
redirect(result,307)
|
||||
|
||||
@webserver.route("/images/<pth:re:.*\\.jpeg>")
|
||||
|
@ -1,5 +1,6 @@
|
||||
from ..globalconf import data_dir, malojaconfig
|
||||
from .. import thirdparty
|
||||
from .. import database
|
||||
|
||||
from doreah import caching
|
||||
from doreah.logging import log
|
||||
@ -13,10 +14,124 @@ from threading import Thread, Timer
|
||||
import re
|
||||
import datetime
|
||||
|
||||
import sqlalchemy as sql
|
||||
|
||||
|
||||
|
||||
|
||||
DB = {}
|
||||
engine = sql.create_engine(f"sqlite:///{data_dir['cache']('images.sqlite')}", echo = False)
|
||||
meta = sql.MetaData()
|
||||
|
||||
DB['artists'] = sql.Table(
|
||||
'artists', meta,
|
||||
sql.Column('id',sql.Integer,primary_key=True),
|
||||
sql.Column('url',sql.String),
|
||||
sql.Column('expire',sql.Integer)
|
||||
)
|
||||
DB['tracks'] = sql.Table(
|
||||
'tracks', meta,
|
||||
sql.Column('id',sql.Integer,primary_key=True),
|
||||
sql.Column('url',sql.String),
|
||||
sql.Column('expire',sql.Integer)
|
||||
)
|
||||
|
||||
meta.create_all(engine)
|
||||
|
||||
def get_image_from_cache(id,table):
|
||||
now = int(datetime.datetime.now().timestamp())
|
||||
with engine.begin() as conn:
|
||||
op = DB[table].select(
|
||||
DB[table].c.url
|
||||
).where(
|
||||
DB[table].c.id==id,
|
||||
DB[table].c.expire>now
|
||||
)
|
||||
result = conn.execute(op).all()
|
||||
for row in result:
|
||||
return row.url
|
||||
|
||||
def set_image_in_cache(id,table,url):
|
||||
now = int(datetime.datetime.now().timestamp())
|
||||
if url is None:
|
||||
expire = now + (malojaconfig["CACHE_EXPIRE_NEGATIVE"] * 24 * 3600)
|
||||
else:
|
||||
expire = now + (malojaconfig["CACHE_EXPIRE_POSITIVE"] * 24 * 3600)
|
||||
with engine.begin() as conn:
|
||||
op = DB[table].insert().values(
|
||||
id=id,
|
||||
url=url,
|
||||
expire=expire
|
||||
).prefix_with('OR IGNORE')
|
||||
result = conn.execute(op)
|
||||
|
||||
|
||||
def get_track_image(track=None,track_id=None,fast=False):
|
||||
|
||||
if track_id is None:
|
||||
track_id = database.sqldb.get_track_id(track)
|
||||
title = track['title']
|
||||
artists = track['artists']
|
||||
|
||||
# check cache
|
||||
result = get_image_from_cache(track_id,'tracks')
|
||||
if result is not None:
|
||||
return result
|
||||
|
||||
# local image
|
||||
if malojaconfig["USE_LOCAL_IMAGES"]:
|
||||
images = local_files(artists=artists,title=title)
|
||||
if len(images) != 0:
|
||||
result = random.choice(images)
|
||||
result = urllib.parse.quote(result)
|
||||
set_image_in_cache(track_id,'tracks',result)
|
||||
return result
|
||||
|
||||
# forward
|
||||
if fast:
|
||||
titlequery = "title=" + urllib.parse.quote(title)
|
||||
artistquery = "&".join("artist=" + urllib.parse.quote(a) for a in artists)
|
||||
return (f"/image?{titlequery}&{artistquery}")
|
||||
|
||||
# third party
|
||||
result = thirdparty.get_image_track_all((artists,title))
|
||||
set_image_in_cache(track_id,'tracks',result)
|
||||
if result is not None: return result
|
||||
for a in artists:
|
||||
res = get_artist_image(artist=a,fast=False)
|
||||
if res != "": return res
|
||||
return None
|
||||
|
||||
|
||||
def get_artist_image(artist=None,artist_id=None,fast=False):
|
||||
|
||||
if artist_id is None:
|
||||
artist_id = database.sqldb.get_artist_id(artist)
|
||||
|
||||
# check cache
|
||||
result = get_image_from_cache(artist_id,'artists')
|
||||
if result is not None:
|
||||
return result
|
||||
|
||||
# local image
|
||||
if malojaconfig["USE_LOCAL_IMAGES"]:
|
||||
images = local_files(artist=artist)
|
||||
if len(images) != 0:
|
||||
result = random.choice(images)
|
||||
result = urllib.parse.quote(result)
|
||||
set_image_in_cache(artist_id,'artists',result)
|
||||
return result
|
||||
|
||||
# forward
|
||||
if fast:
|
||||
artistquery = "artist=" + urllib.parse.quote(artist)
|
||||
return (f"/image?{artistquery}")
|
||||
|
||||
# third party
|
||||
result = thirdparty.get_image_artist_all(artist)
|
||||
set_image_in_cache(artist_id,'artists',result)
|
||||
return result
|
||||
|
||||
### Caches
|
||||
|
||||
cacheage = malojaconfig["CACHE_EXPIRE_POSITIVE"] * 24 * 3600
|
||||
|
@ -39,10 +39,10 @@
|
||||
{% if adminmode %}
|
||||
<div
|
||||
class="changeable-image" data-uploader="b64=>upload('{{ encodedartist }}',b64)"
|
||||
style="background-image:url('{{ utilities.getArtistImage(artist=artist,fast=True) }}');"
|
||||
style="background-image:url('{{ utilities.get_artist_image(artist,fast=True) }}');"
|
||||
></div>
|
||||
{% else %}
|
||||
<div style="background-image:url('{{ utilities.getArtistImage(artist=artist,fast=True) }}');">
|
||||
<div style="background-image:url('{{ utilities.get_artist_image(artist,fast=True) }}');">
|
||||
</div>
|
||||
{% endif %}
|
||||
</td>
|
||||
|
@ -9,7 +9,7 @@
|
||||
{% set pages = math.ceil(charts.__len__() / amountkeys.perpage) %}
|
||||
{% if charts[0] is defined %}
|
||||
{% set topartist = charts[0].artist %}
|
||||
{% set img = utilities.getArtistImage(artist=topartist,fast=True) %}
|
||||
{% set img = utilities.get_artist_image(topartist,fast=True) %}
|
||||
{% else %}
|
||||
{% set img = "/favicon.png" %}
|
||||
{% endif %}
|
||||
|
@ -11,7 +11,7 @@
|
||||
{% set pages = math.ceil(charts.__len__() / amountkeys.perpage) %}
|
||||
{% if charts[0] is defined %}
|
||||
{% set toptrack = charts[0].track %}
|
||||
{% set img = utilities.getTrackImage(artists=toptrack.artists,title=toptrack.title,fast=True) %}
|
||||
{% set img = utilities.get_track_image(toptrack,fast=True) %}
|
||||
{% else %}
|
||||
{% set img = "/favicon.png" %}
|
||||
{% endif %}
|
||||
|
@ -23,7 +23,7 @@
|
||||
{% set rank = entry.rank %}
|
||||
<td>
|
||||
<a href="{{ links.url(artist) }}">
|
||||
<div style='background-image:url("{{ utilities.getArtistImage(artist,fast=True) }}")'>
|
||||
<div style='background-image:url("{{ utilities.get_artist_image(artist,fast=True) }}")'>
|
||||
<span class='stats'>#{{ rank }}</span> <span>{{ artist }}</span>
|
||||
</div>
|
||||
</a>
|
||||
|
@ -23,7 +23,7 @@
|
||||
{% set rank = entry.rank %}
|
||||
<td>
|
||||
<a href="{{ links.url(track) }}">
|
||||
<div style='background-image:url("{{ utilities.getTrackImage(track.artists,track.title,fast=True) }}")'>
|
||||
<div style='background-image:url("{{ utilities.get_track_image(track,fast=True) }}")'>
|
||||
<span class='stats'>#{{ rank }}</span> <span>{{ track.title }}</span>
|
||||
</div>
|
||||
</a>
|
||||
|
@ -4,9 +4,9 @@
|
||||
{% import 'snippets/filterdescription.jinja' as filterdesc %}
|
||||
|
||||
{% if filterkeys.get('track') is not none %}
|
||||
{% set img = utilities.getTrackImage(artists=filterkeys.track.artists,title=filterkeys.track.title,fast=True) %}
|
||||
{% set img = utilities.get_track_image(filterkeys.track,fast=True) %}
|
||||
{% elif filterkeys.get('artist') is not none %}
|
||||
{% set img = utilities.getArtistImage(filterkeys.artist,fast=True) %}
|
||||
{% set img = utilities.get_artist_image(filterkeys.artist,fast=True) %}
|
||||
{% else %}
|
||||
{% set img = "/favicon.png" %}
|
||||
{% endif %}
|
||||
|
@ -4,9 +4,9 @@
|
||||
{% import 'snippets/filterdescription.jinja' as filterdesc %}
|
||||
|
||||
{% if filterkeys.get('track') is not none %}
|
||||
{% set img = utilities.getTrackImage(artists=filterkeys.track.artists,title=filterkeys.track.title,fast=True) %}
|
||||
{% set img = utilities.get_track_image(filterkeys.track,fast=True) %}
|
||||
{% elif filterkeys.get('artist') is not none %}
|
||||
{% set img = utilities.getArtistImage(filterkeys.artist,fast=True) %}
|
||||
{% set img = utilities.get_artist_image(filterkeys.artist,fast=True) %}
|
||||
{% else %}
|
||||
{% set img = "/favicon.png" %}
|
||||
{% endif %}
|
||||
|
@ -8,11 +8,11 @@
|
||||
{% set pages = math.ceil(scrobbles.__len__() / amountkeys.perpage) %}
|
||||
|
||||
{% if filterkeys.get('track') is not none %}
|
||||
{% set img = utilities.getTrackImage(artists=filterkeys.track.artists,title=filterkeys.track.title,fast=True) %}
|
||||
{% set img = utilities.get_track_image(filterkeys.track,fast=True) %}
|
||||
{% elif filterkeys.get('artist') is not none %}
|
||||
{% set img = utilities.getArtistImage(filterkeys.artist,fast=True) %}
|
||||
{% set img = utilities.get_artist_image(filterkeys.artist,fast=True) %}
|
||||
{% elif scrobbles.__len__() > 0 %}
|
||||
{% set img = utilities.getTrackImage(artists=scrobbles[0].track.artists,title=scrobbles[0].track.title,fast=True) %}
|
||||
{% set img = utilities.get_track_image(scrobbles[0].track,fast=True) %}
|
||||
{% else %}
|
||||
{% set img = "/favicon.png" %}
|
||||
{% endif %}
|
||||
|
@ -3,9 +3,9 @@
|
||||
{% import 'snippets/links.jinja' as links %}
|
||||
|
||||
{% if 'artists' in entity %}
|
||||
{% set img = utilities.getTrackImage(artists=entity.artists,title=entity.title,fast=True) %}
|
||||
{% set img = utilities.get_track_image(entity,fast=True) %}
|
||||
{% else %}
|
||||
{% set img = utilities.getArtistImage(entity,fast=True) %}
|
||||
{% set img = utilities.get_artist_image(entity,fast=True) %}
|
||||
{% endif %}
|
||||
|
||||
<td class='icon'><div style="background-image:url('{{ img }}')"></div></td>
|
||||
|
@ -6,7 +6,7 @@
|
||||
|
||||
{% set entries = dbp.get_top_artists(limitkeys,delimitkeys) %}
|
||||
{% set repr = entries | find_representative('artist','scrobbles') %}
|
||||
{% set img = "/favicon.png" if repr is none else utilities.getArtistImage(repr.artist) %}
|
||||
{% set img = "/favicon.png" if repr is none else utilities.get_artist_image(repr.artist) %}
|
||||
|
||||
|
||||
{% block content %}
|
||||
|
@ -6,7 +6,7 @@
|
||||
|
||||
{% set entries = dbp.get_top_tracks(filterkeys,limitkeys,delimitkeys) %}
|
||||
{% set repr = entries | find_representative('track','scrobbles') %}
|
||||
{% set img = "/favicon.png" if repr is none else utilities.getTrackImage(repr.track.artists,repr.track.title) %}
|
||||
{% set img = "/favicon.png" if repr is none else utilities.get_track_image(repr.track) %}
|
||||
|
||||
|
||||
{% block content %}
|
||||
|
@ -33,10 +33,10 @@
|
||||
{% if adminmode %}
|
||||
<div
|
||||
class="changeable-image" data-uploader="b64=>upload('{{ encodedtrack }}',b64)"
|
||||
style="background-image:url('{{ utilities.getTrackImage(artists=track.artists,title=track.title,fast=True) }}');"
|
||||
style="background-image:url('{{ utilities.get_track_image(track,fast=True) }}');"
|
||||
></div>
|
||||
{% else %}
|
||||
<div style="background-image:url('{{ utilities.getTrackImage(artists=track.artists,title=track.title,fast=True) }}');">
|
||||
<div style="background-image:url('{{ utilities.get_track_image(track,fast=True) }}');">
|
||||
</div>
|
||||
{% endif %}
|
||||
</td>
|
||||
|
Loading…
x
Reference in New Issue
Block a user