mirror of
https://github.com/navidrome/navidrome.git
synced 2025-04-05 13:37:38 +03:00
Add Bookmarks to Subsonic API
This commit is contained in:
parent
3d0e70e907
commit
23d69d26e0
3 changed files with 71 additions and 6 deletions
|
@ -77,7 +77,7 @@ func (r *playQueueRepository) AddBookmark(userId, id, comment string, position i
|
||||||
UpdatedAt: time.Now(),
|
UpdatedAt: time.Now(),
|
||||||
}
|
}
|
||||||
|
|
||||||
sel := r.newSelect().Column("id").Where(And{
|
sel := r.newSelect().Column("*").Where(And{
|
||||||
Eq{"user_id": userId},
|
Eq{"user_id": userId},
|
||||||
Eq{"items": ""},
|
Eq{"items": ""},
|
||||||
Eq{"current": id},
|
Eq{"current": id},
|
||||||
|
@ -89,11 +89,13 @@ func (r *playQueueRepository) AddBookmark(userId, id, comment string, position i
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
if !prev.CreatedAt.IsZero() {
|
// If there is a previous bookmark, override
|
||||||
|
if prev.ID != "" {
|
||||||
|
bm.ID = prev.ID
|
||||||
bm.CreatedAt = prev.CreatedAt
|
bm.CreatedAt = prev.CreatedAt
|
||||||
}
|
}
|
||||||
|
|
||||||
_, err = r.put(prev.ID, bm)
|
_, err = r.put(bm.ID, bm)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Error(r.ctx, "Error saving bookmark", "user", u.UserName, err, "mediaFileId", id, err)
|
log.Error(r.ctx, "Error saving bookmark", "user", u.UserName, err, "mediaFileId", id, err)
|
||||||
return err
|
return err
|
||||||
|
@ -115,7 +117,7 @@ func (r *playQueueRepository) GetBookmarks(userId string) (model.Bookmarks, erro
|
||||||
items := r.loadTracks(model.MediaFiles{{ID: pqs[i].Current}})
|
items := r.loadTracks(model.MediaFiles{{ID: pqs[i].Current}})
|
||||||
bms[i].Item = items[0]
|
bms[i].Item = items[0]
|
||||||
bms[i].Comment = pqs[i].Comment
|
bms[i].Comment = pqs[i].Comment
|
||||||
bms[i].Position = int64(pqs[i].Position)
|
bms[i].Position = pqs[i].Position
|
||||||
bms[i].CreatedAt = pqs[i].CreatedAt
|
bms[i].CreatedAt = pqs[i].CreatedAt
|
||||||
bms[i].UpdatedAt = pqs[i].UpdatedAt
|
bms[i].UpdatedAt = pqs[i].UpdatedAt
|
||||||
}
|
}
|
||||||
|
@ -217,7 +219,7 @@ func (r *playQueueRepository) loadTracks(tracks model.MediaFiles) model.MediaFil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *playQueueRepository) clearPlayQueue(userId string) error {
|
func (r *playQueueRepository) clearPlayQueue(userId string) error {
|
||||||
return r.delete(Eq{"user_id": userId})
|
return r.delete(And{Eq{"user_id": userId}, NotEq{"items": ""}})
|
||||||
}
|
}
|
||||||
|
|
||||||
var _ model.PlayQueueRepository = (*playQueueRepository)(nil)
|
var _ model.PlayQueueRepository = (*playQueueRepository)(nil)
|
||||||
|
|
|
@ -113,6 +113,9 @@ func (api *Router) routes() http.Handler {
|
||||||
r.Group(func(r chi.Router) {
|
r.Group(func(r chi.Router) {
|
||||||
c := initBookmarksController(api)
|
c := initBookmarksController(api)
|
||||||
withPlayer := r.With(getPlayer(api.Players))
|
withPlayer := r.With(getPlayer(api.Players))
|
||||||
|
H(withPlayer, "getBookmarks", c.GetBookmarks)
|
||||||
|
H(withPlayer, "createBookmark", c.CreateBookmark)
|
||||||
|
H(withPlayer, "deleteBookmark", c.DeleteBookmark)
|
||||||
H(withPlayer, "getPlayQueue", c.GetPlayQueue)
|
H(withPlayer, "getPlayQueue", c.GetPlayQueue)
|
||||||
H(withPlayer, "savePlayQueue", c.SavePlayQueue)
|
H(withPlayer, "savePlayQueue", c.SavePlayQueue)
|
||||||
})
|
})
|
||||||
|
|
|
@ -18,6 +18,66 @@ func NewBookmarksController(ds model.DataStore) *BookmarksController {
|
||||||
return &BookmarksController{ds: ds}
|
return &BookmarksController{ds: ds}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *BookmarksController) GetBookmarks(w http.ResponseWriter, r *http.Request) (*responses.Subsonic, error) {
|
||||||
|
user, _ := request.UserFrom(r.Context())
|
||||||
|
|
||||||
|
repo := c.ds.PlayQueue(r.Context())
|
||||||
|
bmks, err := repo.GetBookmarks(user.ID)
|
||||||
|
if err != nil {
|
||||||
|
return nil, NewError(responses.ErrorGeneric, "Internal Error")
|
||||||
|
}
|
||||||
|
|
||||||
|
response := NewResponse()
|
||||||
|
response.Bookmarks = &responses.Bookmarks{}
|
||||||
|
for _, bmk := range bmks {
|
||||||
|
b := responses.Bookmark{
|
||||||
|
Entry: []responses.Child{ChildFromMediaFile(r.Context(), bmk.Item)},
|
||||||
|
Position: bmk.Position,
|
||||||
|
Username: user.UserName,
|
||||||
|
Comment: bmk.Comment,
|
||||||
|
Created: bmk.CreatedAt,
|
||||||
|
Changed: bmk.UpdatedAt,
|
||||||
|
}
|
||||||
|
response.Bookmarks.Bookmark = append(response.Bookmarks.Bookmark, b)
|
||||||
|
}
|
||||||
|
return response, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *BookmarksController) CreateBookmark(w http.ResponseWriter, r *http.Request) (*responses.Subsonic, error) {
|
||||||
|
id, err := RequiredParamString(r, "id", "id parameter required")
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
comment := utils.ParamString(r, "comment")
|
||||||
|
position := utils.ParamInt64(r, "position", 0)
|
||||||
|
|
||||||
|
user, _ := request.UserFrom(r.Context())
|
||||||
|
|
||||||
|
repo := c.ds.PlayQueue(r.Context())
|
||||||
|
err = repo.AddBookmark(user.ID, id, comment, position)
|
||||||
|
if err != nil {
|
||||||
|
return nil, NewError(responses.ErrorGeneric, "Internal Error")
|
||||||
|
}
|
||||||
|
return NewResponse(), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *BookmarksController) DeleteBookmark(w http.ResponseWriter, r *http.Request) (*responses.Subsonic, error) {
|
||||||
|
id, err := RequiredParamString(r, "id", "id parameter required")
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
user, _ := request.UserFrom(r.Context())
|
||||||
|
|
||||||
|
repo := c.ds.PlayQueue(r.Context())
|
||||||
|
err = repo.DeleteBookmark(user.ID, id)
|
||||||
|
if err != nil {
|
||||||
|
return nil, NewError(responses.ErrorGeneric, "Internal Error")
|
||||||
|
}
|
||||||
|
return NewResponse(), nil
|
||||||
|
}
|
||||||
|
|
||||||
func (c *BookmarksController) GetPlayQueue(w http.ResponseWriter, r *http.Request) (*responses.Subsonic, error) {
|
func (c *BookmarksController) GetPlayQueue(w http.ResponseWriter, r *http.Request) (*responses.Subsonic, error) {
|
||||||
user, _ := request.UserFrom(r.Context())
|
user, _ := request.UserFrom(r.Context())
|
||||||
|
|
||||||
|
@ -31,7 +91,7 @@ func (c *BookmarksController) GetPlayQueue(w http.ResponseWriter, r *http.Reques
|
||||||
response.PlayQueue = &responses.PlayQueue{
|
response.PlayQueue = &responses.PlayQueue{
|
||||||
Entry: ChildrenFromMediaFiles(r.Context(), pq.Items),
|
Entry: ChildrenFromMediaFiles(r.Context(), pq.Items),
|
||||||
Current: pq.Current,
|
Current: pq.Current,
|
||||||
Position: int64(pq.Position),
|
Position: pq.Position,
|
||||||
Username: user.UserName,
|
Username: user.UserName,
|
||||||
Changed: &pq.UpdatedAt,
|
Changed: &pq.UpdatedAt,
|
||||||
ChangedBy: pq.ChangedBy,
|
ChangedBy: pq.ChangedBy,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue