From 29d2cbfab3a6e3367e2db62dabfea5a13d13eda6 Mon Sep 17 00:00:00 2001 From: charlesxie <408737515@qq.com> Date: Fri, 19 May 2023 17:32:23 +0800 Subject: [PATCH] =?UTF-8?q?feature=EF=BC=9AgetStarred2=20api?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- applications/subsonic/serializers.py | 52 ++++++++++++++++++++-------- applications/subsonic/views.py | 4 +-- 2 files changed, 39 insertions(+), 17 deletions(-) diff --git a/applications/subsonic/serializers.py b/applications/subsonic/serializers.py index 6e1ed4a..867da2c 100644 --- a/applications/subsonic/serializers.py +++ b/applications/subsonic/serializers.py @@ -3,7 +3,7 @@ import collections from django.db.models import Count, functions, Sum from rest_framework import serializers -from applications.music.models import Track +from applications.music.models import Track, Artist, Album from applications.subsonic.utils import get_type_from_ext @@ -184,19 +184,43 @@ class GetSongSerializer(serializers.Serializer): return get_track_data(track) -def get_starred_tracks_data(favorites): - by_track_id = {f.track_id: f for f in favorites} - tracks = ( - Track.objects.filter(pk__in=by_track_id.keys()) - .select_related("album__artist") - ) - tracks = tracks.order_by("-created_at") - data = [] - for t in tracks: - td = get_track_data(t) - td["starred"] = to_subsonic_date(by_track_id[t.pk].created_at) - data.append(td) - return data +def get_starred_data(favorites): + by_track_id = {} + by_album_id = {} + by_artist_id = {} + song_data = [] + artist_data = [] + album_data = [] + for f in favorites: + if f.track_id: + by_track_id[f.track_id] = f + elif f.album_id: + by_album_id[f.album_id] = f + elif f.artist_id: + by_artist_id[f.artist_id] = f + if by_track_id: + tracks = ( + Track.objects.filter(pk__in=by_track_id.keys()) + .select_related("album__artist") + ) + for t in tracks: + td = get_track_data(t) + td["starred"] = to_subsonic_date(by_track_id[t.pk].creation_date) + song_data.append(td) + if by_artist_id: + artists = Artist.objects.filter(pk__in=by_artist_id.keys()).annotate(_albums_count=Count("albums")) \ + .values("id", "name", "_albums_count") + for a in artists: + ad = get_artist_data(a) + ad["starred"] = to_subsonic_date(by_artist_id[a["id"]].creation_date) + artist_data.append(ad) + if by_album_id: + albums = Album.objects.filter(pk__in=by_album_id.keys()).select_related("artist").prefetch_related("tracks") + for a in albums: + ad = get_album2_data(a) + ad["starred"] = to_subsonic_date(by_album_id[a.pk].creation_date) + album_data.append(ad) + return {"song": song_data, "album": album_data, "artist": artist_data} def get_album_list2_data(albums): diff --git a/applications/subsonic/views.py b/applications/subsonic/views.py index 3ec1ed4..9f4e12e 100644 --- a/applications/subsonic/views.py +++ b/applications/subsonic/views.py @@ -2,7 +2,6 @@ Documentation of Subsonic API can be found at http://www.subsonic.org/pages/api.jsp """ import datetime -import time from django.conf import settings from django.db.models import Count @@ -14,7 +13,6 @@ from rest_framework.decorators import action from applications.music.models import Artist, Album, Attachment, Track, Playlist, TrackFavorite, Genre from . import authentication, negotiation, serializers -from .filters import AlbumList2FilterSet from .utils import handle_serve @@ -489,7 +487,7 @@ class SubsonicViewSet(viewsets.GenericViewSet): ) def get_starred2(self, request, *args, **kwargs): favorites = request.user.track_favorites.all() - data = {"starred2": {"song": serializers.get_starred_tracks_data(favorites)}} + data = {"starred2": serializers.get_starred_data(favorites)} return response.Response(data) @action(detail=False, methods=["get", "post"], url_name="star", url_path="star")