diff --git a/core/share.go b/core/share.go
index d3cb180b8..ae6f6b81e 100644
--- a/core/share.go
+++ b/core/share.go
@@ -10,6 +10,7 @@ import (
gonanoid "github.com/matoous/go-nanoid/v2"
"github.com/navidrome/navidrome/log"
"github.com/navidrome/navidrome/model"
+ "github.com/navidrome/navidrome/model/request"
"github.com/navidrome/navidrome/utils/slice"
)
@@ -44,22 +45,17 @@ func (s *shareService) Load(ctx context.Context, id string) (*model.Share, error
}
idList := strings.Split(share.ResourceIDs, ",")
+ var mfs model.MediaFiles
switch share.ResourceType {
case "album":
- share.Tracks, err = s.loadMediafiles(ctx, squirrel.Eq{"album_id": idList}, "album")
+ mfs, err = s.loadMediafiles(ctx, squirrel.Eq{"album_id": idList}, "album")
+ case "playlist":
+ mfs, err = s.loadPlaylistTracks(ctx, share.ResourceIDs)
}
if err != nil {
return nil, err
}
- return entity.(*model.Share), nil
-}
-
-func (s *shareService) loadMediafiles(ctx context.Context, filter squirrel.Eq, sort string) ([]model.ShareTrack, error) {
- all, err := s.ds.MediaFile(ctx).GetAll(model.QueryOptions{Filters: filter, Sort: sort})
- if err != nil {
- return nil, err
- }
- return slice.Map(all, func(mf model.MediaFile) model.ShareTrack {
+ share.Tracks = slice.Map(mfs, func(mf model.MediaFile) model.ShareTrack {
return model.ShareTrack{
ID: mf.ID,
Title: mf.Title,
@@ -68,7 +64,23 @@ func (s *shareService) loadMediafiles(ctx context.Context, filter squirrel.Eq, s
Duration: mf.Duration,
UpdatedAt: mf.UpdatedAt,
}
- }), nil
+ })
+ return entity.(*model.Share), nil
+}
+
+func (s *shareService) loadMediafiles(ctx context.Context, filter squirrel.Eq, sort string) (model.MediaFiles, error) {
+ return s.ds.MediaFile(ctx).GetAll(model.QueryOptions{Filters: filter, Sort: sort})
+}
+
+func (s *shareService) loadPlaylistTracks(ctx context.Context, id string) (model.MediaFiles, error) {
+ // Create a context with a fake admin user, to be able to access playlists
+ ctx = request.WithUser(context.TODO(), model.User{IsAdmin: true})
+
+ tracks, err := s.ds.Playlist(ctx).Tracks(id, true).GetAll(model.QueryOptions{Sort: "id"})
+ if err != nil {
+ return nil, err
+ }
+ return tracks.MediaFiles(), nil
}
func (s *shareService) NewRepository(ctx context.Context) rest.Repository {
@@ -117,8 +129,11 @@ func (r *shareRepositoryWrapper) Save(entity interface{}) (string, error) {
if s.ExpiresAt.IsZero() {
s.ExpiresAt = time.Now().Add(365 * 24 * time.Hour)
}
- if s.ResourceType == "album" {
+ switch s.ResourceType {
+ case "album":
s.Contents = r.shareContentsFromAlbums(s.ID, s.ResourceIDs)
+ case "playlist":
+ s.Contents = r.shareContentsFromPlaylist(s.ID, s.ResourceIDs)
}
id, err = r.Persistable.Save(s)
return id, err
@@ -141,3 +156,15 @@ func (r *shareRepositoryWrapper) shareContentsFromAlbums(shareID string, ids str
}
return content
}
+func (r *shareRepositoryWrapper) shareContentsFromPlaylist(shareID string, id string) string {
+ pls, err := r.ds.Playlist(r.ctx).Get(id)
+ if err != nil {
+ log.Error(r.ctx, "Error retrieving album names for share", "share", shareID, err)
+ return ""
+ }
+ content := pls.Name
+ if len(content) > 30 {
+ content = content[:26] + "..."
+ }
+ return content
+}
diff --git a/ui/src/album/AlbumActions.js b/ui/src/album/AlbumActions.js
index 4167498e2..eef23b2b7 100644
--- a/ui/src/album/AlbumActions.js
+++ b/ui/src/album/AlbumActions.js
@@ -109,7 +109,7 @@ const AlbumActions = ({
{config.devEnableShare && (
@@ -118,7 +118,7 @@ const AlbumActions = ({
+ {config.devEnableShare && (
+
+ )}
{config.enableDownloads && (