mirror of
https://github.com/navidrome/navidrome.git
synced 2025-04-15 03:30:39 +03:00
Fix error on empty playlists. Simplify code for some operations
This commit is contained in:
parent
f645c4769c
commit
ea435d0f60
@ -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
|
||||
|
@ -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
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user