diff --git a/MediaBrowser.Api/Library/LibraryService.cs b/MediaBrowser.Api/Library/LibraryService.cs index 0476927d7f..10a3117a13 100644 --- a/MediaBrowser.Api/Library/LibraryService.cs +++ b/MediaBrowser.Api/Library/LibraryService.cs @@ -466,11 +466,13 @@ namespace MediaBrowser.Api.Library /// Deletes the specified request. /// /// The request. - public Task Delete(DeleteItem request) + public void Delete(DeleteItem request) { var item = _libraryManager.GetItemById(request.Id); - return _libraryManager.DeleteItem(item); + var task = _libraryManager.DeleteItem(item); + + Task.WaitAll(task); } /// diff --git a/MediaBrowser.Api/Music/InstantMixService.cs b/MediaBrowser.Api/Music/InstantMixService.cs index ff029d5b52..f342422426 100644 --- a/MediaBrowser.Api/Music/InstantMixService.cs +++ b/MediaBrowser.Api/Music/InstantMixService.cs @@ -34,6 +34,20 @@ namespace MediaBrowser.Api.Music public string Name { get; set; } } + [Route("/Artists/InstantMix", "GET", Summary = "Creates an instant playlist based on a given artist")] + public class GetInstantMixFromArtistId : BaseGetSimilarItems + { + [ApiMember(Name = "Id", Description = "The artist Id", IsRequired = true, DataType = "string", ParameterType = "query", Verb = "GET")] + public string Id { get; set; } + } + + [Route("/MusicGenres/InstantMix", "GET", Summary = "Creates an instant playlist based on a music genre")] + public class GetInstantMixFromMusicGenreId : BaseGetSimilarItems + { + [ApiMember(Name = "Id", Description = "The genre Id", IsRequired = true, DataType = "string", ParameterType = "querypath", Verb = "GET")] + public string Id { get; set; } + } + [Authenticated] public class InstantMixService : BaseApiService { @@ -51,6 +65,28 @@ namespace MediaBrowser.Api.Music _libraryManager = libraryManager; } + public object Get(GetInstantMixFromArtistId request) + { + var item = (MusicArtist)_libraryManager.GetItemById(request.Id); + + var user = _userManager.GetUserById(request.UserId.Value); + + var items = _musicManager.GetInstantMixFromArtist(item.Name, user); + + return GetResult(items, user, request); + } + + public object Get(GetInstantMixFromMusicGenreId request) + { + var item = (MusicGenre)_libraryManager.GetItemById(request.Id); + + var user = _userManager.GetUserById(request.UserId.Value); + + var items = _musicManager.GetInstantMixFromGenres(new[] { item.Name }, user); + + return GetResult(items, user, request); + } + public object Get(GetInstantMixFromSong request) { var item = (Audio)_libraryManager.GetItemById(request.Id); diff --git a/MediaBrowser.Api/Sync/SyncService.cs b/MediaBrowser.Api/Sync/SyncService.cs index 591b1abadd..9cf19d160b 100644 --- a/MediaBrowser.Api/Sync/SyncService.cs +++ b/MediaBrowser.Api/Sync/SyncService.cs @@ -87,9 +87,11 @@ namespace MediaBrowser.Api.Sync return ToOptimizedResult(result); } - public Task Delete(CancelSyncJob request) + public void Delete(CancelSyncJob request) { - return _syncManager.CancelJob(request.Id); + var task = _syncManager.CancelJob(request.Id); + + Task.WaitAll(task); } public async Task Post(CreateSyncJob request) diff --git a/MediaBrowser.Api/UserLibrary/PlaystateService.cs b/MediaBrowser.Api/UserLibrary/PlaystateService.cs index 6bcd369d6e..2abb76dc82 100644 --- a/MediaBrowser.Api/UserLibrary/PlaystateService.cs +++ b/MediaBrowser.Api/UserLibrary/PlaystateService.cs @@ -221,7 +221,14 @@ namespace MediaBrowser.Api.UserLibrary /// Posts the specified request. /// /// The request. - public async Task Post(MarkPlayedItem request) + public object Post(MarkPlayedItem request) + { + var result = MarkPlayed(request).Result; + + return ToOptimizedResult(result); + } + + private async Task MarkPlayed(MarkPlayedItem request) { var user = _userManager.GetUserById(request.UserId); @@ -243,18 +250,18 @@ namespace MediaBrowser.Api.UserLibrary await UpdatePlayedStatus(additionalUser, request.Id, true, datePlayed).ConfigureAwait(false); } - return ToOptimizedResult(dto); + return dto; } /// /// Posts the specified request. /// /// The request. - public Task Post(OnPlaybackStart request) + public void Post(OnPlaybackStart request) { var queueableMediaTypes = (request.QueueableMediaTypes ?? string.Empty); - return Post(new ReportPlaybackStart + Post(new ReportPlaybackStart { CanSeek = request.CanSeek, ItemId = request.Id, @@ -265,20 +272,22 @@ namespace MediaBrowser.Api.UserLibrary }); } - public Task Post(ReportPlaybackStart request) + public void Post(ReportPlaybackStart request) { request.SessionId = GetSession().Id; - return _sessionManager.OnPlaybackStart(request); + var task = _sessionManager.OnPlaybackStart(request); + + Task.WaitAll(task); } /// /// Posts the specified request. /// /// The request. - public Task Post(OnPlaybackProgress request) + public void Post(OnPlaybackProgress request) { - return Post(new ReportPlaybackProgress + Post(new ReportPlaybackProgress { ItemId = request.Id, PositionTicks = request.PositionTicks, @@ -291,20 +300,22 @@ namespace MediaBrowser.Api.UserLibrary }); } - public Task Post(ReportPlaybackProgress request) + public void Post(ReportPlaybackProgress request) { request.SessionId = GetSession().Id; - return _sessionManager.OnPlaybackProgress(request); + var task = _sessionManager.OnPlaybackProgress(request); + + Task.WaitAll(task); } /// /// Posts the specified request. /// /// The request. - public Task Delete(OnPlaybackStopped request) + public void Delete(OnPlaybackStopped request) { - return Post(new ReportPlaybackStopped + Post(new ReportPlaybackStopped { ItemId = request.Id, PositionTicks = request.PositionTicks, @@ -312,11 +323,13 @@ namespace MediaBrowser.Api.UserLibrary }); } - public Task Post(ReportPlaybackStopped request) + public void Post(ReportPlaybackStopped request) { request.SessionId = GetSession().Id; - return _sessionManager.OnPlaybackStopped(request); + var task = _sessionManager.OnPlaybackStopped(request); + + Task.WaitAll(task); } /// @@ -372,4 +385,4 @@ namespace MediaBrowser.Api.UserLibrary return _userDataRepository.GetUserDataDto(item, user); } } -} +} \ No newline at end of file diff --git a/MediaBrowser.Api/UserService.cs b/MediaBrowser.Api/UserService.cs index 3761cf4248..2c504bee11 100644 --- a/MediaBrowser.Api/UserService.cs +++ b/MediaBrowser.Api/UserService.cs @@ -242,7 +242,7 @@ namespace MediaBrowser.Api { users = users.Where(i => i.Configuration.IsHidden == request.IsHidden.Value); } - + var result = users .OrderBy(u => u.Name) .Select(i => _userManager.GetUserDto(i, Request.RemoteIp)) @@ -274,7 +274,14 @@ namespace MediaBrowser.Api /// Deletes the specified request. /// /// The request. - public async Task Delete(DeleteUser request) + public void Delete(DeleteUser request) + { + var task = DeleteAsync(request); + + Task.WaitAll(task); + } + + public async Task DeleteAsync(DeleteUser request) { var user = _userManager.GetUserById(request.Id); @@ -347,7 +354,13 @@ namespace MediaBrowser.Api /// Posts the specified request. /// /// The request. - public async Task Post(UpdateUserPassword request) + public void Post(UpdateUserPassword request) + { + var task = PostAsync(request); + Task.WaitAll(task); + } + + public async Task PostAsync(UpdateUserPassword request) { var user = _userManager.GetUserById(request.Id); @@ -372,12 +385,19 @@ namespace MediaBrowser.Api await _userManager.ChangePassword(user, request.NewPassword).ConfigureAwait(false); } } - + /// /// Posts the specified request. /// /// The request. - public async Task Post(UpdateUser request) + public void Post(UpdateUser request) + { + var task = PostAsync(request); + + Task.WaitAll(task); + } + + public async Task PostAsync(UpdateUser request) { // We need to parse this manually because we told service stack not to with IRequiresRequestStream // https://code.google.com/p/servicestack/source/browse/trunk/Common/ServiceStack.Text/ServiceStack.Text/Controller/PathInfo.cs diff --git a/MediaBrowser.Api/VideosService.cs b/MediaBrowser.Api/VideosService.cs index 5ce1341b0b..c964ab4589 100644 --- a/MediaBrowser.Api/VideosService.cs +++ b/MediaBrowser.Api/VideosService.cs @@ -97,7 +97,14 @@ namespace MediaBrowser.Api return ToOptimizedSerializedResultUsingCache(result); } - public async Task Delete(DeleteAlternateSources request) + public void Delete(DeleteAlternateSources request) + { + var task = DeleteAsync(request); + + Task.WaitAll(task); + } + + public async Task DeleteAsync(DeleteAlternateSources request) { var video = (Video)_libraryManager.GetItemById(request.Id); @@ -112,7 +119,14 @@ namespace MediaBrowser.Api await video.UpdateToRepository(ItemUpdateType.MetadataDownload, CancellationToken.None).ConfigureAwait(false); } - public async Task Post(MergeVersions request) + public void Post(MergeVersions request) + { + var task = PostAsync(request); + + Task.WaitAll(task); + } + + public async Task PostAsync(MergeVersions request) { var items = request.Ids.Split(',') .Select(i => new Guid(i)) diff --git a/MediaBrowser.Server.Implementations/HttpServer/HttpListenerHost.cs b/MediaBrowser.Server.Implementations/HttpServer/HttpListenerHost.cs index 79638d751b..1cec4461b9 100644 --- a/MediaBrowser.Server.Implementations/HttpServer/HttpListenerHost.cs +++ b/MediaBrowser.Server.Implementations/HttpServer/HttpListenerHost.cs @@ -83,7 +83,7 @@ namespace MediaBrowser.Server.Implementations.HttpServer container.Adapter = _containerAdapter; Plugins.Add(new SwaggerFeature()); - Plugins.Add(new CorsFeature(allowedHeaders: "Content-Type, Authorization, X-MediaBrowser-Token")); + Plugins.Add(new CorsFeature(allowedHeaders: "Content-Type, Authorization, Range, X-MediaBrowser-Token")); //Plugins.Add(new AuthFeature(() => new AuthUserSession(), new IAuthProvider[] { // new SessionAuthProvider(_containerAdapter.Resolve()),