diff --git a/dev/releases/3.2.yml b/dev/releases/3.2.yml
index f6d53d1..46926d8 100644
--- a/dev/releases/3.2.yml
+++ b/dev/releases/3.2.yml
@@ -2,6 +2,7 @@ minor_release_name: "Nicole"
3.2.0:
notes:
- "[Architecture] Switched to linuxserver.io container base image"
+ - "[Architecture] Reworked image handling"
- "[Feature] Added basic support for albums"
- "[Feature] New start page"
- "[Feature] Added UI for track-artist, track-album and album-artist association"
@@ -10,3 +11,4 @@ minor_release_name: "Nicole"
- "[Bugfix] Fixed search on manual scrobble page"
- "[Bugfix] Disabled DB maintenance while not running main server"
- "[Bugfix] Removed some nonsensical ephemereal database entry creations"
+ - "[Bugfix] Fixed API endpoint for track charts with no artist provided"
diff --git a/maloja/database/__init__.py b/maloja/database/__init__.py
index a0cdcc2..b2cd5c0 100644
--- a/maloja/database/__init__.py
+++ b/maloja/database/__init__.py
@@ -363,6 +363,9 @@ def get_albums_artist_appears_on(dbconn=None,**keys):
return result
+@waitfordb
+def get_tracks_without_album(dbconn=None,resolve_ids=True):
+ return get_charts_tracks(album=None,timerange=alltime(),resolve_ids=resolve_ids,dbconn=dbconn)
@waitfordb
def get_charts_artists(dbconn=None,resolve_ids=True,**keys):
diff --git a/maloja/database/dbcache.py b/maloja/database/dbcache.py
index 254d248..666ba21 100644
--- a/maloja/database/dbcache.py
+++ b/maloja/database/dbcache.py
@@ -134,7 +134,7 @@ else:
def serialize(obj):
try:
return serialize(obj.hashable())
- except Exception:
+ except AttributeError:
try:
return json.dumps(obj)
except Exception:
diff --git a/maloja/database/sqldb.py b/maloja/database/sqldb.py
index 28256fa..a53dbf3 100644
--- a/maloja/database/sqldb.py
+++ b/maloja/database/sqldb.py
@@ -1108,7 +1108,7 @@ def count_scrobbles_by_track_of_artist(since,to,artist,resolve_ids=True,dbconn=N
@connection_provider
def count_scrobbles_by_track_of_album(since,to,album,resolve_ids=True,dbconn=None):
- album_id = get_album_id(album,dbconn=dbconn)
+ album_id = get_album_id(album,dbconn=dbconn) if album else None
jointable = sql.join(
DB['scrobbles'],
diff --git a/maloja/web/jinja/abstracts/admin.jinja b/maloja/web/jinja/abstracts/admin.jinja
index ff14fd5..12a7b73 100644
--- a/maloja/web/jinja/abstracts/admin.jinja
+++ b/maloja/web/jinja/abstracts/admin.jinja
@@ -21,7 +21,8 @@
['setup','Server Setup'],
['settings','Settings'],
['apikeys','API Keys'],
- ['manual','Manual Scrobbling']
+ ['manual','Manual Scrobbling'],
+ ['albumless','Tracks without Albums']
] %}
{# ['import','Scrobble Import'],
diff --git a/maloja/web/jinja/admin_albumless.jinja b/maloja/web/jinja/admin_albumless.jinja
new file mode 100644
index 0000000..a04ee6a
--- /dev/null
+++ b/maloja/web/jinja/admin_albumless.jinja
@@ -0,0 +1,12 @@
+{% set page ='admin_albumless' %}
+{% extends "abstracts/admin.jinja" %}
+{% block title %}Maloja - Albumless Tracks{% endblock %}
+
+{% block maincontent %}
+Here you can find tracks that currently have no album.
+
+{% with list = dbc.get_tracks_without_album() %}
+{% include 'partials/list_tracks.jinja' %}
+{% endwith %}
+
+{% endblock %}
diff --git a/maloja/web/jinja/partials/list_tracks.jinja b/maloja/web/jinja/partials/list_tracks.jinja
new file mode 100644
index 0000000..bfef6de
--- /dev/null
+++ b/maloja/web/jinja/partials/list_tracks.jinja
@@ -0,0 +1,21 @@
+{% import 'snippets/links.jinja' as links %}
+{% import 'snippets/entityrow.jinja' as entityrow %}
+
+
+
+{% set firstindex = amountkeys.page * amountkeys.perpage %}
+{% set lastindex = firstindex + amountkeys.perpage %}
+
+
+