mirror of
https://github.com/xhongc/music-tag-web.git
synced 2026-05-05 05:44:53 +08:00
feature:getStarred2 api
This commit is contained in:
@@ -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):
|
||||
|
||||
@@ -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")
|
||||
|
||||
Reference in New Issue
Block a user