Optimize playlist updates

This commit is contained in:
Deluan
2021-10-26 10:35:58 -04:00
parent 85185e3b98
commit af00503b77
9 changed files with 83 additions and 45 deletions
+11 -7
View File
@@ -218,7 +218,7 @@ func (r *playlistRepository) refreshSmartPlaylist(pls *model.Playlist) bool {
}
// Update playlist stats
err = r.updateStats(pls.ID)
err = r.RefreshStatus(pls.ID)
if err != nil {
log.Error(r.ctx, "Error updating smart playlist stats", "playlist", pls.Name, "id", pls.ID, err)
return false
@@ -268,28 +268,32 @@ func (r *playlistRepository) updatePlaylist(playlistId string, mediaFileIds []st
return err
}
return r.addTracks(playlistId, 1, mediaFileIds)
}
func (r *playlistRepository) addTracks(playlistId string, startingPos int, mediaFileIds []string) error {
// Break the track list in chunks to avoid hitting SQLITE_MAX_FUNCTION_ARG limit
chunks := utils.BreakUpStringSlice(mediaFileIds, 100)
chunks := utils.BreakUpStringSlice(mediaFileIds, 200)
// Add new tracks, chunk by chunk
pos := 1
pos := startingPos
for i := range chunks {
ins := Insert("playlist_tracks").Columns("playlist_id", "media_file_id", "id")
for _, t := range chunks[i] {
ins = ins.Values(playlistId, t, pos)
pos++
}
_, err = r.executeSQL(ins)
_, err := r.executeSQL(ins)
if err != nil {
return err
}
}
return r.updateStats(playlistId)
return r.RefreshStatus(playlistId)
}
// updateStats updates total playlist duration, size and count
func (r *playlistRepository) updateStats(playlistId string) error {
// RefreshStatus updates total playlist duration, size and count
func (r *playlistRepository) RefreshStatus(playlistId string) error {
statsSql := Select("sum(duration) as duration", "sum(size) as size", "count(*) as count").
From("media_file").
Join("playlist_tracks f on f.media_file_id = media_file.id").
+7 -6
View File
@@ -92,18 +92,19 @@ func (r *playlistTrackRepository) Add(mediaFileIds []string) (int, error) {
if len(mediaFileIds) > 0 {
log.Debug(r.ctx, "Adding songs to playlist", "playlistId", r.playlistId, "mediaFileIds", mediaFileIds)
} else {
return 0, nil
}
ids, err := r.getTracks()
// 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)
if err != nil {
return 0, err
}
// Append new tracks
ids = append(ids, mediaFileIds...)
// Update tracks and playlist
return len(mediaFileIds), r.playlistRepo.updatePlaylist(r.playlistId, ids)
return len(mediaFileIds), r.playlistRepo.addTracks(r.playlistId, res.Max+1, mediaFileIds)
}
func (r *playlistTrackRepository) AddAlbums(albumIds []string) (int, error) {