mirror of
https://github.com/krateng/maloja.git
synced 2023-08-10 21:12:55 +03:00
Added support for multiple images per entity
This commit is contained in:
parent
808389691b
commit
4d96500644
9
images/.gitignore
vendored
9
images/.gitignore
vendored
@ -1,6 +1,3 @@
|
||||
cache
|
||||
cached/
|
||||
*.jpg
|
||||
*.jpeg
|
||||
*.png
|
||||
*.gif
|
||||
*
|
||||
!.gitignore
|
||||
!*.info
|
||||
|
44
images/images.info
Normal file
44
images/images.info
Normal file
@ -0,0 +1,44 @@
|
||||
In this folder, you can save custom images for artists and tracks in case you
|
||||
don't like the ones provided by Last.FM, you don't want to use Last.FM or it's
|
||||
missing some artists / tracks that are important to you.
|
||||
|
||||
For artists, you can use a .jpg, .jpeg, .png or .gif image that is named like
|
||||
the artist, but without whitespace and non-latin-alphabet characters (plus
|
||||
extension). In case you want to have multiple images of the same format, you may
|
||||
add any number from 0-9 to the name. If you need more images than that, create a
|
||||
folder named like the artist and add any images inside. So, for example, if your
|
||||
artist is "Dal★Shabet", all these files would be considered:
|
||||
|
||||
DalShabet.jpg
|
||||
DalShabet4.png
|
||||
DalShabet0.gif
|
||||
DalShabet/bestimage.jpeg
|
||||
DalShabet/serri_only.png
|
||||
|
||||
The following files would not be considered:
|
||||
|
||||
Dal Shabet.gif (Whitespace)
|
||||
Dal★Shabet.png (non-latin character)
|
||||
DalShabet.webm (wrong extension)
|
||||
DalShabet23.jpg (to digit number)
|
||||
DalShabet/SomeoneLikeU_MV.mp4 (wrong extension)
|
||||
DalShabet3/party.png (wrong folder name)
|
||||
|
||||
|
||||
|
||||
The same concept applies to tracks, however their name consists of all artists in
|
||||
alphabetical order joined by a dash (-), then an underscore (_) and the track
|
||||
title. Rules as above apply, so if your track was named "Epic Crossover 파티 협동"
|
||||
and it was performed by HyunA, Dal★Shabet and Taylor Swift, the following files
|
||||
would be considered:
|
||||
|
||||
DalShabet-HyunA-TaylorSwift_EpicCrossover.jpg
|
||||
DalShabet-HyunA-TaylorSwift_EpicCrossover3.png
|
||||
DalShabet-HyunA-TaylorSwift_EpicCrossover/albumcover.png
|
||||
DalShabet-HyunA-TaylorSwift_EpicCrossover/dancing.gif
|
||||
|
||||
Not accepted would be:
|
||||
|
||||
DalShabet-HyunA-Taylor Swift_EpicCrossover.jpg (Whitespace)
|
||||
DalShabet-HyunA-TaylorSwift_EpicCrossover파티협동.jpg (non-latin characters)
|
||||
HyunA-DalShabet-TaylorSwift_EpicCrossover.jpg (wrong artist order)
|
327
utilities.py
327
utilities.py
@ -5,52 +5,12 @@ from threading import Thread
|
||||
import pickle
|
||||
import urllib
|
||||
import datetime
|
||||
import random
|
||||
from doreah import settings
|
||||
from doreah import caching
|
||||
from doreah.logging import log
|
||||
|
||||
|
||||
### TSV files
|
||||
|
||||
#def parseTSV(filename,*args,escape=True):
|
||||
# f = open(filename)
|
||||
#
|
||||
# result = []
|
||||
# for l in [l for l in f if (not l.startswith("#")) and (not l.strip()=="")]:
|
||||
#
|
||||
# l = l.replace("\n","")
|
||||
# if escape:
|
||||
# l = l.split("#")[0]
|
||||
# l = l.replace(r"\num","#") # translate escape sequences even if we don't support comments in the file and they are not actually necessary (they might still be used for some reason)
|
||||
# data = list(filter(None,l.split("\t"))) # Multiple tabs are okay, we don't accept empty fields unless trailing
|
||||
# entry = [] * len(args)
|
||||
# for i in range(len(args)):
|
||||
# if args[i]=="list":
|
||||
# try:
|
||||
# entry.append(data[i].split("␟"))
|
||||
# except:
|
||||
# entry.append([])
|
||||
# elif args[i]=="string":
|
||||
# try:
|
||||
# entry.append(data[i])
|
||||
# except:
|
||||
# entry.append("")
|
||||
# elif args[i]=="int":
|
||||
# try:
|
||||
# entry.append(int(data[i]))
|
||||
# except:
|
||||
# entry.append(0)
|
||||
# elif args[i]=="bool":
|
||||
# try:
|
||||
# entry.append((data[i].lower() in ["true","yes","1","y"]))
|
||||
# except:
|
||||
# entry.append(False)
|
||||
#
|
||||
# result.append(entry)
|
||||
|
||||
# f.close()
|
||||
# return result
|
||||
|
||||
def checksumTSV(folder):
|
||||
|
||||
sums = ""
|
||||
@ -112,86 +72,6 @@ def consistentRulestate(folder,checksums):
|
||||
return True
|
||||
|
||||
|
||||
#def parseAllTSV(path,*args,escape=True):
|
||||
#
|
||||
#
|
||||
# result = []
|
||||
# for f in os.listdir(path + "/"):
|
||||
#
|
||||
# if (f.endswith(".tsv")):
|
||||
#
|
||||
# result += parseTSV(path + "/" + f,*args,escape=escape)
|
||||
#
|
||||
# return result
|
||||
|
||||
#def createTSV(filename):
|
||||
#
|
||||
# if not os.path.exists(filename):
|
||||
# open(filename,"w").close()
|
||||
|
||||
#def addEntry(filename,a,escape=True):
|
||||
#
|
||||
# createTSV(filename)
|
||||
#
|
||||
# line = "\t".join(a)
|
||||
# if escape: line = line.replace("#",r"\num")
|
||||
# with open(filename,"a") as f:
|
||||
# f.write(line + "\n")
|
||||
|
||||
#def addEntries(filename,al,escape=True):
|
||||
#
|
||||
# with open(filename,"a") as f:
|
||||
# for a in al:
|
||||
# line = "\t".join(a)
|
||||
# if escape: line = line.replace("#",r"\num")
|
||||
# f.write(line + "\n")
|
||||
#
|
||||
|
||||
|
||||
### Useful functions
|
||||
|
||||
#def int_or_none(input_):
|
||||
# try:
|
||||
# return int(input_)
|
||||
# except:
|
||||
# return None
|
||||
|
||||
#def cleandict(d):
|
||||
# newdict = {k:d[k] for k in d if d[k] is not None}
|
||||
# d.clear()
|
||||
# d.update(newdict)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
### Logging
|
||||
# now handled by doreah
|
||||
|
||||
#def log(msg,module=None):
|
||||
# now = datetime.datetime.utcnow().strftime("%Y/%m/%d %H:%M:%S")
|
||||
# if module is None:
|
||||
# import inspect
|
||||
# module = inspect.getmodule(inspect.stack()[1][0]).__name__
|
||||
# if module == "__main__": module = "mainserver"
|
||||
# print("[" + module + "] " + msg)
|
||||
# with open("logs/" + module + ".log","a") as logfile:
|
||||
# logfile.write(now + " " + msg + "\n")
|
||||
|
||||
|
||||
### not meant to be precise, just for a rough idea
|
||||
# now handled by doreah
|
||||
#measurement = 0
|
||||
#def clock(*args):
|
||||
# import time
|
||||
# global measurement
|
||||
# now = time.time()
|
||||
# if len(args) > 0:
|
||||
# print(args[0] + ": " + str(now - measurement))
|
||||
# measurement = now
|
||||
|
||||
|
||||
|
||||
|
||||
### Media info
|
||||
|
||||
@ -276,125 +156,6 @@ track_cache = caching.Cache.create(name="track_cache",maxage=cacheage,maxage_neg
|
||||
|
||||
|
||||
|
||||
# I think I've only just understood modules
|
||||
#cachedTracks = {}
|
||||
#cachedArtists = {}
|
||||
#
|
||||
#cachedTracksDays = {}
|
||||
#cachedArtistsDays = {}
|
||||
#
|
||||
#def cache_track(artists,title,result):
|
||||
# cachedTracks[(frozenset(artists),title)] = result
|
||||
# day = datetime.date.today().toordinal()
|
||||
# cachedTracksDays[(frozenset(artists),title)] = day
|
||||
#def cache_artist(artist,result):
|
||||
# if result is None: log("Caching None for " + artist,module="debug")
|
||||
# cachedArtists[artist] = result
|
||||
# day = datetime.date.today().toordinal()
|
||||
# cachedArtistsDays[artist] = day
|
||||
|
||||
#def track_from_cache(artists,title):
|
||||
# try:
|
||||
# res = cachedTracks[(frozenset(artists),title)]
|
||||
# except:
|
||||
# # no entry there, let the calling function know
|
||||
# raise KeyError()
|
||||
#
|
||||
# if res is None:
|
||||
# retain = settings.get_settings("CACHE_EXPIRE_NEGATIVE")
|
||||
# else:
|
||||
# retain = settings.get_settings("CACHE_EXPIRE_POSITIVE")
|
||||
#
|
||||
# # if the settings say caches never expire, just return
|
||||
# if retain is None: return res
|
||||
#
|
||||
# # look if entry is too old
|
||||
# nowday = datetime.date.today().toordinal()
|
||||
# cacheday = cachedTracksDays[(frozenset(artists),title)]
|
||||
#
|
||||
# if (nowday - cacheday) > retain:
|
||||
# # fetch the new image in the background, but still return the old one for one last time
|
||||
# log("Expired cache for " + "/".join(artists) + " - " + title)
|
||||
# del cachedTracks[(frozenset(artists),title)]
|
||||
# t = Thread(target=getTrackImage,args=(artists,title,))
|
||||
# t.start()
|
||||
# return res
|
||||
|
||||
#def artist_from_cache(artist):
|
||||
# try:
|
||||
# res = cachedArtists[artist]
|
||||
# except:
|
||||
# # no entry there, let the calling function know
|
||||
# raise KeyError()
|
||||
#
|
||||
# if res is None:
|
||||
# retain = settings.get_settings("CACHE_EXPIRE_NEGATIVE")
|
||||
# else:
|
||||
# retain = settings.get_settings("CACHE_EXPIRE_POSITIVE")
|
||||
#
|
||||
# # if the settings say caches never expire, just return
|
||||
# if retain is None: return res
|
||||
#
|
||||
# # look if entry is too old
|
||||
# nowday = datetime.date.today().toordinal()
|
||||
# cacheday = cachedArtistsDays[artist]
|
||||
#
|
||||
# if (nowday - cacheday) > retain:
|
||||
# # fetch the new image in the background, but still return the old one for one last time
|
||||
# log("Expired cache for " + artist)
|
||||
# del cachedArtists[artist]
|
||||
# t = Thread(target=getArtistImage,args=(artist,))
|
||||
# t.start()
|
||||
# return res
|
||||
#
|
||||
|
||||
#def saveCache():
|
||||
# fl = open("images/cache","wb")
|
||||
# stream = pickle.dumps({"tracks":cachedTracks,"artists":cachedArtists,"tracks_days":cachedTracksDays,"artists_days":cachedArtistsDays})
|
||||
# fl.write(stream)
|
||||
# fl.close()
|
||||
|
||||
# pass
|
||||
# persistence.save(artist_cache,"artist_cache")
|
||||
# persistence.save(track_cache,"track_cache")
|
||||
|
||||
#def loadCache():
|
||||
# global artist_cache, track_cache
|
||||
# artist_cache_tmp = persistence.load("artist_cache")
|
||||
# track_cache_tmp = persistence.load("track_cache")
|
||||
# if artist_cache_tmp is not None: artist_cache = artist_cache_tmp
|
||||
# if track_cache_tmp is not None: track_cache = track_cache_tmp
|
||||
# pass
|
||||
|
||||
# try:
|
||||
# fl = open("images/cache","rb")
|
||||
# except:
|
||||
# return
|
||||
|
||||
# try:
|
||||
# ob = pickle.loads(fl.read())
|
||||
# global cachedTracks, cachedArtists, cachedTracksDays, cachedArtistsDays
|
||||
# cachedTracks, cachedArtists, cachedTracksDays, cachedArtistsDays = ob["tracks"],ob["artists"],ob["tracks_days"],ob["artists_days"]
|
||||
# #(cachedTracks, cachedArtists) = ob
|
||||
# finally:
|
||||
# fl.close()
|
||||
#
|
||||
# remove corrupt caching from previous versions
|
||||
# toremove = []
|
||||
# for k in cachedTracks:
|
||||
# if cachedTracks[k] == "":
|
||||
# toremove.append(k)
|
||||
# for k in toremove:
|
||||
# del cachedTracks[k]
|
||||
# log("Removed invalid cache key: " + str(k))
|
||||
|
||||
# toremove = []
|
||||
# for k in cachedArtists:
|
||||
# if cachedArtists[k] == "":
|
||||
# toremove.append(k)
|
||||
# for k in toremove:
|
||||
# del cachedArtists[k]
|
||||
# log("Removed invalid cache key: " + str(k))
|
||||
|
||||
def getTrackImage(artists,title,fast=False):
|
||||
|
||||
@ -403,19 +164,38 @@ def getTrackImage(artists,title,fast=False):
|
||||
if filename == "": filename = str(hash(obj))
|
||||
filepath = "images/tracks/" + filename
|
||||
|
||||
images = []
|
||||
|
||||
# add all images named like the tracks
|
||||
for ext in ["png","jpg","jpeg","gif"]:
|
||||
for num in [""] + [str(n) for n in range(0,10)]:
|
||||
if os.path.exists(filepath + num + "." + ext):
|
||||
images.append("/" + filepath + num + "." + ext)
|
||||
|
||||
# add images in a folder for that track
|
||||
try:
|
||||
for f in os.listdir(filepath + "/"):
|
||||
if f.split(".")[-1] in ["png","jpg","jpeg","gif"]:
|
||||
images.append("/" + filepath + "/" + f)
|
||||
except:
|
||||
pass
|
||||
|
||||
if len(images) != 0:
|
||||
return random.choice(images)
|
||||
|
||||
# check if custom image exists
|
||||
if os.path.exists(filepath + ".png"):
|
||||
imgurl = "/" + filepath + ".png"
|
||||
return imgurl
|
||||
elif os.path.exists(filepath + ".jpg"):
|
||||
imgurl = "/" + filepath + ".jpg"
|
||||
return imgurl
|
||||
elif os.path.exists(filepath + ".jpeg"):
|
||||
imgurl = "/" + filepath + ".jpeg"
|
||||
return imgurl
|
||||
elif os.path.exists(filepath + ".gif"):
|
||||
imgurl = "/" + filepath + ".gif"
|
||||
return imgurl
|
||||
# if os.path.exists(filepath + ".png"):
|
||||
# imgurl = "/" + filepath + ".png"
|
||||
# return imgurl
|
||||
# elif os.path.exists(filepath + ".jpg"):
|
||||
# imgurl = "/" + filepath + ".jpg"
|
||||
# return imgurl
|
||||
# elif os.path.exists(filepath + ".jpeg"):
|
||||
# imgurl = "/" + filepath + ".jpeg"
|
||||
# return imgurl
|
||||
# elif os.path.exists(filepath + ".gif"):
|
||||
# imgurl = "/" + filepath + ".gif"
|
||||
# return imgurl
|
||||
|
||||
|
||||
try:
|
||||
@ -466,19 +246,38 @@ def getArtistImage(artist,fast=False):
|
||||
filepath = "images/artists/" + filename
|
||||
#filepath_cache = "info/artists_cache/" + filename
|
||||
|
||||
images = []
|
||||
|
||||
# add all images named like the artist
|
||||
for ext in ["png","jpg","jpeg","gif"]:
|
||||
for num in [""] + [str(n) for n in range(0,10)]:
|
||||
if os.path.exists(filepath + num + "." + ext):
|
||||
images.append("/" + filepath + num + "." + ext)
|
||||
|
||||
# add images in a folder for that artist
|
||||
try:
|
||||
for f in os.listdir(filepath + "/"):
|
||||
if f.split(".")[-1] in ["png","jpg","jpeg","gif"]:
|
||||
images.append("/" + filepath + "/" + f)
|
||||
except:
|
||||
pass
|
||||
|
||||
if len(images) != 0:
|
||||
return random.choice(images)
|
||||
|
||||
# check if custom image exists
|
||||
if os.path.exists(filepath + ".png"):
|
||||
imgurl = "/" + filepath + ".png"
|
||||
return imgurl
|
||||
elif os.path.exists(filepath + ".jpg"):
|
||||
imgurl = "/" + filepath + ".jpg"
|
||||
return imgurl
|
||||
elif os.path.exists(filepath + ".jpeg"):
|
||||
imgurl = "/" + filepath + ".jpeg"
|
||||
return imgurl
|
||||
elif os.path.exists(filepath + ".gif"):
|
||||
imgurl = "/" + filepath + ".gif"
|
||||
return imgurl
|
||||
# if os.path.exists(filepath + ".png"):
|
||||
# imgurl = "/" + filepath + ".png"
|
||||
# return imgurl
|
||||
# elif os.path.exists(filepath + ".jpg"):
|
||||
# imgurl = "/" + filepath + ".jpg"
|
||||
# return imgurl
|
||||
# elif os.path.exists(filepath + ".jpeg"):
|
||||
# imgurl = "/" + filepath + ".jpeg"
|
||||
# return imgurl
|
||||
# elif os.path.exists(filepath + ".gif"):
|
||||
# imgurl = "/" + filepath + ".gif"
|
||||
# return imgurl
|
||||
|
||||
|
||||
try:
|
||||
|
Loading…
Reference in New Issue
Block a user