Add ability to reorder playlist items

This commit is contained in:
Deluan
2020-06-04 19:05:41 -04:00
parent b597a34cb4
commit 331fa1d952
8 changed files with 158 additions and 34 deletions
+27 -9
View File
@@ -4,6 +4,7 @@ import (
. "github.com/Masterminds/squirrel"
"github.com/deluan/navidrome/log"
"github.com/deluan/navidrome/model"
"github.com/deluan/navidrome/utils"
"github.com/deluan/rest"
)
@@ -70,18 +71,10 @@ func (r *playlistTrackRepository) Add(mediaFileIds []string) error {
log.Debug(r.ctx, "Adding songs to playlist", "playlistId", r.playlistId, "mediaFileIds", mediaFileIds)
}
// Get all current tracks
all := r.newSelect().Columns("media_file_id").Where(Eq{"playlist_id": r.playlistId}).OrderBy("id")
var tracks model.PlaylistTracks
err := r.queryAll(all, &tracks)
ids, err := r.getTracks()
if err != nil {
log.Error("Error querying current tracks from playlist", "playlistId", r.playlistId, err)
return err
}
ids := make([]string, len(tracks))
for i := range tracks {
ids[i] = tracks[i].MediaFileID
}
// Append new tracks
ids = append(ids, mediaFileIds...)
@@ -90,6 +83,22 @@ func (r *playlistTrackRepository) Add(mediaFileIds []string) error {
return r.Update(ids)
}
func (r *playlistTrackRepository) getTracks() ([]string, error) {
// Get all current tracks
all := r.newSelect().Columns("media_file_id").Where(Eq{"playlist_id": r.playlistId}).OrderBy("id")
var tracks model.PlaylistTracks
err := r.queryAll(all, &tracks)
if err != nil {
log.Error("Error querying current tracks from playlist", "playlistId", r.playlistId, err)
return nil, err
}
ids := make([]string, len(tracks))
for i := range tracks {
ids[i] = tracks[i].MediaFileID
}
return ids, nil
}
func (r *playlistTrackRepository) Update(mediaFileIds []string) error {
// Remove old tracks
del := Delete(r.tableName).Where(Eq{"playlist_id": r.playlistId})
@@ -156,4 +165,13 @@ func (r *playlistTrackRepository) Delete(id string) error {
return r.updateStats()
}
func (r *playlistTrackRepository) Reorder(pos int, newPos int) error {
ids, err := r.getTracks()
if err != nil {
return err
}
newOrder := utils.MoveString(ids, pos-1, newPos-1)
return r.Update(newOrder)
}
var _ model.PlaylistTrackRepository = (*playlistTrackRepository)(nil)