From d5f8e23a89cf1677e6ced124df4c0e07cdb7d114 Mon Sep 17 00:00:00 2001 From: archekb <47732882+archekb@users.noreply.github.com> Date: Tue, 15 Aug 2023 16:49:18 +0200 Subject: [PATCH] feat(subsonic): gracefully handle missing podcast episode paths when returning playlists fixes #345 * fix return playlist if file not found and do not add to playlist not downloaded podcast --------- Co-authored-by: sentriz --- server/ctrlsubsonic/handlers_playlist.go | 8 +++++++- server/ctrlsubsonic/specidpaths/specidpaths.go | 2 +- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/server/ctrlsubsonic/handlers_playlist.go b/server/ctrlsubsonic/handlers_playlist.go index 88ca47af..333e601e 100644 --- a/server/ctrlsubsonic/handlers_playlist.go +++ b/server/ctrlsubsonic/handlers_playlist.go @@ -4,6 +4,7 @@ import ( "encoding/base64" "errors" "fmt" + "log" "net/http" "sort" "time" @@ -208,8 +209,10 @@ func playlistRender(c *Controller, params params.Params, playlistID string, play for _, path := range playlist.Items { file, err := specidpaths.Lookup(c.DB, PathsOf(c.MusicPaths), c.PodcastsPath, path) if err != nil { - return nil, fmt.Errorf("lookup path %q: %w", path, err) + log.Printf("error looking up path %q: %s", path, err) + continue } + var trch *spec.TrackChild switch id := file.SID(); id.Type { case specid.Track: @@ -237,5 +240,8 @@ func playlistRender(c *Controller, params params.Params, playlistID string, play trch.TranscodedSuffix = transcodeSuffix resp.List = append(resp.List, trch) } + + resp.SongCount = len(resp.List) + return resp, nil } diff --git a/server/ctrlsubsonic/specidpaths/specidpaths.go b/server/ctrlsubsonic/specidpaths/specidpaths.go index e330b180..2ecf892f 100644 --- a/server/ctrlsubsonic/specidpaths/specidpaths.go +++ b/server/ctrlsubsonic/specidpaths/specidpaths.go @@ -27,7 +27,7 @@ func Locate(dbc *db.DB, podcastsPath string, id specid.ID) (Result, error) { } case specid.PodcastEpisode: var pe db.PodcastEpisode - if err := dbc.Where("id=?", id.Value).Find(&pe).Error; err == nil { + if err := dbc.Where("id=? AND status=?", id.Value, db.PodcastEpisodeStatusCompleted).Find(&pe).Error; err == nil { pe.AbsP = filepath.Join(podcastsPath, pe.Path) return &pe, err }