diff --git a/persistence/playlist_repository.go b/persistence/playlist_repository.go index 0bbc734d..360e3914 100644 --- a/persistence/playlist_repository.go +++ b/persistence/playlist_repository.go @@ -322,7 +322,7 @@ func (r *playlistRepository) loadTracks(sel SelectBuilder, id string) (model.Pla " AND annotation.user_id = '" + userId(r.ctx) + "')"). Join("media_file f on f.id = media_file_id"). Where(Eq{"playlist_id": id}).OrderBy("playlist_tracks.id") - var tracks model.PlaylistTracks + tracks := model.PlaylistTracks{} err := r.queryAll(tracksQuery, &tracks) for i, t := range tracks { tracks[i].MediaFile.ID = t.MediaFileID diff --git a/persistence/playlist_track_repository.go b/persistence/playlist_track_repository.go index a157bc54..0d4abe15 100644 --- a/persistence/playlist_track_repository.go +++ b/persistence/playlist_track_repository.go @@ -101,69 +101,54 @@ func (r *playlistTrackRepository) Add(mediaFileIds []string) (int, error) { // Get next pos (ID) in playlist sql := r.newSelect().Columns("max(id) as max").Where(Eq{"playlist_id": r.playlistId}) - var res struct{ Max int } - err := r.queryOne(sql, &res) + var max int + err := r.queryOne(sql, &max) if err != nil { return 0, err } - return len(mediaFileIds), r.playlistRepo.addTracks(r.playlistId, res.Max+1, mediaFileIds) + return len(mediaFileIds), r.playlistRepo.addTracks(r.playlistId, max+1, mediaFileIds) } -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 } - sq = sq.OrderBy("album_artist, album, disc_number, track_number") - err := r.queryAll(sq, &res) +func (r *playlistTrackRepository) addMediaFileIds(cond Sqlizer) (int, error) { + sq := Select("id").From("media_file").Where(cond).OrderBy("album_artist, album, disc_number, track_number") + var ids []string + err := r.queryAll(sq, &ids) if err != nil { log.Error(r.ctx, "Error getting tracks to add to playlist", err) 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) AddAlbums(albumIds []string) (int, error) { + return r.addMediaFileIds(Eq{"album_id": albumIds}) +} + +func (r *playlistTrackRepository) AddArtists(artistIds []string) (int, error) { + return r.addMediaFileIds(Eq{"album_artist_id": artistIds}) +} + +func (r *playlistTrackRepository) AddDiscs(discs []model.DiscID) (int, error) { + if len(discs) == 0 { + return 0, nil + } + var clauses Or + for _, d := range discs { + clauses = append(clauses, And{Eq{"album_id": d.AlbumID}, Eq{"disc_number": d.DiscNumber}}) + } + return r.addMediaFileIds(clauses) +} + +// Get ids from all current tracks 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) + var ids []string + err := r.queryAll(all, &ids) 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 }