Speed up Subsonic GetPlaylist (by optimizing loadTracks)

This commit is contained in:
Deluan 2021-10-25 11:14:20 -04:00
parent 76fdcd112b
commit 8d6b5f9d02

View File

@ -3,7 +3,6 @@ package persistence
import ( import (
"context" "context"
"encoding/json" "encoding/json"
"strconv"
"strings" "strings"
"time" "time"
@ -311,23 +310,23 @@ func (r *playlistRepository) updateStats(playlistId string) error {
} }
func (r *playlistRepository) loadTracks(pls *model.Playlist) error { func (r *playlistRepository) loadTracks(pls *model.Playlist) error {
tracksQuery := Select().From("media_file f"). tracksQuery := Select().From("playlist_tracks").
LeftJoin("annotation on ("+ LeftJoin("annotation on ("+
"annotation.item_id = f.id"+ "annotation.item_id = media_file_id"+
" AND annotation.item_type = 'media_file'"+ " AND annotation.item_type = 'media_file'"+
" AND annotation.user_id = '"+userId(r.ctx)+"')"). " AND annotation.user_id = '"+userId(r.ctx)+"')").
Columns("starred", "starred_at", "play_count", "play_date", "rating", "f.*"). Columns("starred", "starred_at", "play_count", "play_date", "rating", "f.*",
Join("playlist_tracks t on t.media_file_id = f.id"). "f.id as media_file_id", "playlist_tracks.id as id").
Where(Eq{"playlist_id": pls.ID}).OrderBy("t.id") Join("media_file f on f.id = media_file_id").
Where(Eq{"playlist_id": pls.ID}).OrderBy("playlist_tracks.id")
err := r.queryAll(tracksQuery, &pls.Tracks) err := r.queryAll(tracksQuery, &pls.Tracks)
if err != nil { if err != nil {
log.Error(r.ctx, "Error loading playlist tracks", "playlist", pls.Name, "id", pls.ID, err) log.Error(r.ctx, "Error loading playlist tracks", "playlist", pls.Name, "id", pls.ID, err)
} }
// Fix Track attributes // Fix Track attributes
for i, t := range pls.Tracks { for i, t := range pls.Tracks {
pls.Tracks[i].ID = strconv.Itoa(i + 1) // (must be the position of the track in the list) pls.Tracks[i].MediaFile.ID = t.MediaFileID
pls.Tracks[i].PlaylistID = pls.ID pls.Tracks[i].PlaylistID = pls.ID
pls.Tracks[i].MediaFileID = t.MediaFile.ID
} }
return err return err
} }