Add songs to playlists with drag and drop

This commit is contained in:
Deluan
2021-10-01 10:37:05 -04:00
parent 2ab4647420
commit 6c3e45de41
14 changed files with 392 additions and 94 deletions
+2 -2
View File
@@ -214,8 +214,8 @@ func (r *playlistRepository) removeOrphans() error {
log.Debug(r.ctx, "Deleted tracks, now reordering", "id", pl.Id, "name", pl.Name, "deleted", n)
// To reorganize the playlist, just add an empty list of new tracks
trks := r.Tracks(pl.Id)
if err := trks.Add(nil); err != nil {
tracks := r.Tracks(pl.Id)
if _, err := tracks.Add(nil); err != nil {
return err
}
}
+43 -4
View File
@@ -70,9 +70,9 @@ func (r *playlistTrackRepository) NewInstance() interface{} {
return &model.PlaylistTrack{}
}
func (r *playlistTrackRepository) Add(mediaFileIds []string) error {
func (r *playlistTrackRepository) Add(mediaFileIds []string) (int, error) {
if !r.isWritable() {
return rest.ErrPermissionDenied
return 0, rest.ErrPermissionDenied
}
if len(mediaFileIds) > 0 {
@@ -81,14 +81,53 @@ func (r *playlistTrackRepository) Add(mediaFileIds []string) error {
ids, err := r.getTracks()
if err != nil {
return err
return 0, err
}
// Append new tracks
ids = append(ids, mediaFileIds...)
// Update tracks and playlist
return r.Update(ids)
return len(mediaFileIds), r.Update(ids)
}
func (r *playlistTrackRepository) AddAlbums(albumIds []string) (int, error) {
sq := Select("id").From("media_file").Where(Eq{"album_id": albumIds})
return r.addMediaFileIds(sq)
}
func (r *playlistTrackRepository) AddArtists(artistIds []string) (int, error) {
sq := Select("id").From("media_file").Where(Eq{"album_artist_id": artistIds})
return r.addMediaFileIds(sq)
}
func (r *playlistTrackRepository) AddDiscs(discs []model.DiscID) (int, error) {
sq := Select("id").From("media_file")
if len(discs) == 0 {
return 0, nil
}
var clauses []Sqlizer
for _, d := range discs {
clauses = append(clauses, And{Eq{"album_id": d.AlbumID}, Eq{"disc_number": d.DiscNumber}})
}
sq = sq.Where(Or(clauses))
return r.addMediaFileIds(sq)
}
func (r *playlistTrackRepository) addMediaFileIds(sq SelectBuilder) (int, error) {
var res []struct{ Id string }
err := r.queryAll(sq, &res)
if err != nil {
return 0, err
}
if len(res) == 0 {
return 0, nil
}
var ids []string
for _, r := range res {
ids = append(ids, r.Id)
}
return r.Add(ids)
}
func (r *playlistTrackRepository) getTracks() ([]string, error) {