diff --git a/MediaBrowser.Api/PlaylistService.cs b/MediaBrowser.Api/PlaylistService.cs index e16ca1ee8f..3dafd0eebc 100644 --- a/MediaBrowser.Api/PlaylistService.cs +++ b/MediaBrowser.Api/PlaylistService.cs @@ -40,10 +40,27 @@ namespace MediaBrowser.Api /// Gets or sets the user id. /// /// The user id. - [ApiMember(Name = "UserId", Description = "User Id", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")] + [ApiMember(Name = "UserId", Description = "User Id", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "POST")] public string UserId { get; set; } } + [Route("/Playlists/{Id}/Items/{ItemId}/Move/{NewIndex}", "POST", Summary = "Moves a playlist item")] + public class MoveItem : IReturnVoid + { + [ApiMember(Name = "ItemId", Description = "ItemId", IsRequired = true, DataType = "string", ParameterType = "query", Verb = "POST")] + public string ItemId { get; set; } + + [ApiMember(Name = "Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "POST")] + public string Id { get; set; } + + /// + /// Gets or sets the user id. + /// + /// The user id. + [ApiMember(Name = "NewIndex", Description = "NewIndex", IsRequired = true, DataType = "string", ParameterType = "query", Verb = "POST")] + public int NewIndex { get; set; } + } + [Route("/Playlists/{Id}/Items", "DELETE", Summary = "Removes items from a playlist")] public class RemoveFromPlaylist : IReturnVoid { @@ -105,6 +122,13 @@ namespace MediaBrowser.Api _libraryManager = libraryManager; } + public void Post(MoveItem request) + { + var task = _playlistManager.MoveItem(request.Id, request.ItemId, request.NewIndex); + + Task.WaitAll(task); + } + public async Task Post(CreatePlaylist request) { var result = await _playlistManager.CreatePlaylist(new PlaylistCreationRequest diff --git a/MediaBrowser.Controller/Playlists/IPlaylistManager.cs b/MediaBrowser.Controller/Playlists/IPlaylistManager.cs index cbe0b97a4e..a9336d8e33 100644 --- a/MediaBrowser.Controller/Playlists/IPlaylistManager.cs +++ b/MediaBrowser.Controller/Playlists/IPlaylistManager.cs @@ -45,5 +45,13 @@ namespace MediaBrowser.Controller.Playlists /// Folder. Folder GetPlaylistsFolder(string userId); + /// + /// Moves the item. + /// + /// The playlist identifier. + /// The entry identifier. + /// The new index. + /// Task. + Task MoveItem(string playlistId, string entryId, int newIndex); } } diff --git a/MediaBrowser.Server.Implementations/Playlists/PlaylistManager.cs b/MediaBrowser.Server.Implementations/Playlists/PlaylistManager.cs index a0d80598a7..e43978fa0a 100644 --- a/MediaBrowser.Server.Implementations/Playlists/PlaylistManager.cs +++ b/MediaBrowser.Server.Implementations/Playlists/PlaylistManager.cs @@ -230,6 +230,27 @@ namespace MediaBrowser.Server.Implementations.Playlists }); } + public async Task MoveItem(string playlistId, string entryId, int newIndex) + { + var playlist = _libraryManager.GetItemById(playlistId) as Playlist; + + if (playlist == null) + { + throw new ArgumentException("No Playlist exists with the supplied Id"); + } + + var children = playlist.GetManageableItems().ToList(); + + var oldIndex = children.FindIndex(i => string.Equals(entryId, i.Item1.Id, StringComparison.OrdinalIgnoreCase)); + + var item = playlist.LinkedChildren[oldIndex]; + + playlist.LinkedChildren.Remove(item); + playlist.LinkedChildren.Insert(newIndex, item); + + await playlist.UpdateToRepository(ItemUpdateType.MetadataEdit, CancellationToken.None).ConfigureAwait(false); + } + public Folder GetPlaylistsFolder(string userId) { return _libraryManager.RootFolder.Children.OfType() diff --git a/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj b/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj index a45a383cca..4c66eaee25 100644 --- a/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj +++ b/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj @@ -110,6 +110,12 @@ PreserveNewest + + PreserveNewest + + + PreserveNewest + PreserveNewest