diff options
Diffstat (limited to 'MediaBrowser.Api')
38 files changed, 226 insertions, 177 deletions
diff --git a/MediaBrowser.Api/ApiEntryPoint.cs b/MediaBrowser.Api/ApiEntryPoint.cs index db3dbf048..68087309b 100644 --- a/MediaBrowser.Api/ApiEntryPoint.cs +++ b/MediaBrowser.Api/ApiEntryPoint.cs @@ -340,7 +340,7 @@ namespace MediaBrowser.Api // We can really reduce the timeout for apps that are using the newer api if (!string.IsNullOrWhiteSpace(job.PlaySessionId)) { - timerDuration = 60000; + timerDuration = 120000; } } diff --git a/MediaBrowser.Api/BaseApiService.cs b/MediaBrowser.Api/BaseApiService.cs index 66b2a314e..d4b5be584 100644 --- a/MediaBrowser.Api/BaseApiService.cs +++ b/MediaBrowser.Api/BaseApiService.cs @@ -198,15 +198,15 @@ namespace MediaBrowser.Api return libraryManager.GetPerson(DeSlugPersonName(name, libraryManager)); } - protected IList<BaseItem> GetAllLibraryItems(Guid? userId, IUserManager userManager, ILibraryManager libraryManager, string parentId, Func<BaseItem,bool> filter) + protected IList<BaseItem> GetAllLibraryItems(string userId, IUserManager userManager, ILibraryManager libraryManager, string parentId, Func<BaseItem,bool> filter) { if (!string.IsNullOrEmpty(parentId)) { var folder = (Folder)libraryManager.GetItemById(new Guid(parentId)); - if (userId.HasValue) + if (!string.IsNullOrWhiteSpace(userId)) { - var user = userManager.GetUserById(userId.Value); + var user = userManager.GetUserById(userId); if (user == null) { @@ -221,9 +221,9 @@ namespace MediaBrowser.Api return folder .GetRecursiveChildren(filter); } - if (userId.HasValue) + if (!string.IsNullOrWhiteSpace(userId)) { - var user = userManager.GetUserById(userId.Value); + var user = userManager.GetUserById(userId); if (user == null) { @@ -231,7 +231,7 @@ namespace MediaBrowser.Api } return userManager - .GetUserById(userId.Value) + .GetUserById(userId) .RootFolder .GetRecursiveChildren(user, filter) .ToList(); diff --git a/MediaBrowser.Api/BrandingService.cs b/MediaBrowser.Api/BrandingService.cs index ac491a997..c900e4d06 100644 --- a/MediaBrowser.Api/BrandingService.cs +++ b/MediaBrowser.Api/BrandingService.cs @@ -34,7 +34,8 @@ namespace MediaBrowser.Api { var result = _config.GetConfiguration<BrandingOptions>("branding"); - return ResultFactory.GetResult(result.CustomCss, "text/css"); + // When null this throws a 405 error under Mono OSX, so default to empty string + return ResultFactory.GetResult(result.CustomCss ?? string.Empty, "text/css"); } } } diff --git a/MediaBrowser.Api/DisplayPreferencesService.cs b/MediaBrowser.Api/DisplayPreferencesService.cs index 72b12020d..df04de79e 100644 --- a/MediaBrowser.Api/DisplayPreferencesService.cs +++ b/MediaBrowser.Api/DisplayPreferencesService.cs @@ -23,7 +23,7 @@ namespace MediaBrowser.Api public string DisplayPreferencesId { get; set; } [ApiMember(Name = "UserId", Description = "User Id", IsRequired = true, DataType = "string", ParameterType = "query", Verb = "POST")] - public Guid UserId { get; set; } + public string UserId { get; set; } } [Route("/DisplayPreferences/{Id}", "GET", Summary = "Gets a user's display preferences for an item")] @@ -37,7 +37,7 @@ namespace MediaBrowser.Api public string Id { get; set; } [ApiMember(Name = "UserId", Description = "User Id", IsRequired = true, DataType = "string", ParameterType = "query", Verb = "GET")] - public Guid UserId { get; set; } + public string UserId { get; set; } [ApiMember(Name = "Client", Description = "Client", IsRequired = true, DataType = "string", ParameterType = "query", Verb = "GET")] public string Client { get; set; } diff --git a/MediaBrowser.Api/GamesService.cs b/MediaBrowser.Api/GamesService.cs index c18c32920..93cc01079 100644 --- a/MediaBrowser.Api/GamesService.cs +++ b/MediaBrowser.Api/GamesService.cs @@ -32,7 +32,7 @@ namespace MediaBrowser.Api /// </summary> /// <value>The user id.</value> [ApiMember(Name = "UserId", Description = "Optional. Filter by user id", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")] - public Guid? UserId { get; set; } + public string UserId { get; set; } } /// <summary> @@ -46,7 +46,7 @@ namespace MediaBrowser.Api /// </summary> /// <value>The user id.</value> [ApiMember(Name = "UserId", Description = "Optional. Filter by user id", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")] - public Guid? UserId { get; set; } + public string UserId { get; set; } } /// <summary> @@ -106,7 +106,7 @@ namespace MediaBrowser.Api .Cast<GameSystem>() .ToList(); - var user = request.UserId == null ? null : _userManager.GetUserById(request.UserId.Value); + var user = request.UserId == null ? null : _userManager.GetUserById(request.UserId); var result = gameSystems .Select(i => GetSummary(i, user)) diff --git a/MediaBrowser.Api/Images/ImageService.cs b/MediaBrowser.Api/Images/ImageService.cs index 8c6cc0a18..b8ea62137 100644 --- a/MediaBrowser.Api/Images/ImageService.cs +++ b/MediaBrowser.Api/Images/ImageService.cs @@ -675,10 +675,18 @@ namespace MediaBrowser.Api.Images private ImageFormat[] GetClientSupportedFormats() { - if ((Request.AcceptTypes ?? new string[] { }).Contains("image/webp", StringComparer.OrdinalIgnoreCase)) + var supportsWebP = (Request.AcceptTypes ?? new string[] {}).Contains("image/webp", StringComparer.OrdinalIgnoreCase); + + var userAgent = Request.UserAgent ?? string.Empty; + + if (userAgent.IndexOf("crosswalk", StringComparison.OrdinalIgnoreCase) != -1 && + userAgent.IndexOf("android", StringComparison.OrdinalIgnoreCase) != -1) { - var userAgent = Request.UserAgent ?? string.Empty; + supportsWebP = true; + } + if (supportsWebP) + { // Not displaying properly on iOS if (userAgent.IndexOf("cfnetwork", StringComparison.OrdinalIgnoreCase) == -1) { diff --git a/MediaBrowser.Api/ItemUpdateService.cs b/MediaBrowser.Api/ItemUpdateService.cs index bab02de35..8f7edabbb 100644 --- a/MediaBrowser.Api/ItemUpdateService.cs +++ b/MediaBrowser.Api/ItemUpdateService.cs @@ -428,7 +428,7 @@ namespace MediaBrowser.Api var series = item as Series; if (series != null) { - series.Status = request.Status; + series.Status = request.SeriesStatus; series.AirDays = request.AirDays; series.AirTime = request.AirTime; diff --git a/MediaBrowser.Api/Library/LibraryService.cs b/MediaBrowser.Api/Library/LibraryService.cs index 269f4cb20..e8340a1cb 100644 --- a/MediaBrowser.Api/Library/LibraryService.cs +++ b/MediaBrowser.Api/Library/LibraryService.cs @@ -77,7 +77,7 @@ namespace MediaBrowser.Api.Library /// </summary> /// <value>The user id.</value> [ApiMember(Name = "UserId", Description = "Optional. Filter by user id, and attach user data", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")] - public Guid? UserId { get; set; } + public string UserId { get; set; } /// <summary> /// Gets or sets the id. @@ -102,7 +102,7 @@ namespace MediaBrowser.Api.Library /// </summary> /// <value>The user id.</value> [ApiMember(Name = "UserId", Description = "Optional. Filter by user id, and attach user data", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")] - public Guid? UserId { get; set; } + public string UserId { get; set; } /// <summary> /// Gets or sets the id. @@ -127,7 +127,7 @@ namespace MediaBrowser.Api.Library /// </summary> /// <value>The user id.</value> [ApiMember(Name = "UserId", Description = "Optional. Filter by user id, and attach user data", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")] - public Guid? UserId { get; set; } + public string UserId { get; set; } /// <summary> /// Gets or sets the id. @@ -159,7 +159,7 @@ namespace MediaBrowser.Api.Library public class GetItemCounts : IReturn<ItemCounts> { [ApiMember(Name = "UserId", Description = "Optional. Get counts from a specific user's library.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")] - public Guid? UserId { get; set; } + public string UserId { get; set; } [ApiMember(Name = "IsFavorite", Description = "Optional. Get counts of favorite items", IsRequired = false, DataType = "bool", ParameterType = "query", Verb = "GET")] public bool? IsFavorite { get; set; } @@ -174,7 +174,7 @@ namespace MediaBrowser.Api.Library /// </summary> /// <value>The user id.</value> [ApiMember(Name = "UserId", Description = "Optional. Filter by user id, and attach user data", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")] - public Guid? UserId { get; set; } + public string UserId { get; set; } /// <summary> /// Gets or sets the id. @@ -193,7 +193,7 @@ namespace MediaBrowser.Api.Library /// </summary> /// <value>The user id.</value> [ApiMember(Name = "UserId", Description = "Optional. Filter by user id, and attach user data", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")] - public Guid? UserId { get; set; } + public string UserId { get; set; } [ApiMember(Name = "IncludeItemTypes", Description = "Optional. If specified, results will be filtered based on item type. This allows multiple, comma delimeted.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET", AllowMultiple = true)] public string IncludeItemTypes { get; set; } @@ -412,7 +412,7 @@ namespace MediaBrowser.Api.Library var baseItemDtos = new List<BaseItemDto>(); - var user = request.UserId.HasValue ? _userManager.GetUserById(request.UserId.Value) : null; + var user = !string.IsNullOrWhiteSpace(request.UserId) ? _userManager.GetUserById(request.UserId) : null; var dtoOptions = GetDtoOptions(request); @@ -483,15 +483,15 @@ namespace MediaBrowser.Api.Library return ToOptimizedSerializedResultUsingCache(counts); } - private bool FilterItem(BaseItem item, GetItemCounts request, Guid? userId) + private bool FilterItem(BaseItem item, GetItemCounts request, string userId) { - if (userId.HasValue) + if (!string.IsNullOrWhiteSpace(userId)) { if (request.IsFavorite.HasValue) { var val = request.IsFavorite.Value; - if (_userDataManager.GetUserData(userId.Value, item.GetUserDataKey()).IsFavorite != val) + if (_userDataManager.GetUserData(userId, item.GetUserDataKey()).IsFavorite != val) { return false; } @@ -609,10 +609,10 @@ namespace MediaBrowser.Api.Library private ThemeMediaResult GetThemeSongs(GetThemeSongs request) { - var user = request.UserId.HasValue ? _userManager.GetUserById(request.UserId.Value) : null; + var user = !string.IsNullOrWhiteSpace(request.UserId) ? _userManager.GetUserById(request.UserId) : null; var item = string.IsNullOrEmpty(request.Id) - ? (request.UserId.HasValue + ? (!string.IsNullOrWhiteSpace(request.UserId) ? user.RootFolder : (Folder)_libraryManager.RootFolder) : _libraryManager.GetItemById(request.Id); @@ -652,10 +652,10 @@ namespace MediaBrowser.Api.Library public ThemeMediaResult GetThemeVideos(GetThemeVideos request) { - var user = request.UserId.HasValue ? _userManager.GetUserById(request.UserId.Value) : null; + var user = !string.IsNullOrWhiteSpace(request.UserId) ? _userManager.GetUserById(request.UserId) : null; var item = string.IsNullOrEmpty(request.Id) - ? (request.UserId.HasValue + ? (!string.IsNullOrWhiteSpace(request.UserId) ? user.RootFolder : (Folder)_libraryManager.RootFolder) : _libraryManager.GetItemById(request.Id); diff --git a/MediaBrowser.Api/LiveTv/LiveTvService.cs b/MediaBrowser.Api/LiveTv/LiveTvService.cs index b8b74369c..c474642d5 100644 --- a/MediaBrowser.Api/LiveTv/LiveTvService.cs +++ b/MediaBrowser.Api/LiveTv/LiveTvService.cs @@ -78,7 +78,7 @@ namespace MediaBrowser.Api.LiveTv [Route("/LiveTv/Recordings", "GET", Summary = "Gets live tv recordings")] [Authenticated] - public class GetRecordings : IReturn<QueryResult<RecordingInfoDto>> + public class GetRecordings : IReturn<QueryResult<BaseItemDto>> { [ApiMember(Name = "ChannelId", Description = "Optional filter by channel id.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")] public string ChannelId { get; set; } @@ -107,7 +107,7 @@ namespace MediaBrowser.Api.LiveTv [Route("/LiveTv/Recordings/Groups", "GET", Summary = "Gets live tv recording groups")] [Authenticated] - public class GetRecordingGroups : IReturn<QueryResult<RecordingGroupDto>> + public class GetRecordingGroups : IReturn<QueryResult<BaseItemDto>> { [ApiMember(Name = "UserId", Description = "Optional filter by user and attach user data.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")] public string UserId { get; set; } @@ -115,7 +115,7 @@ namespace MediaBrowser.Api.LiveTv [Route("/LiveTv/Recordings/{Id}", "GET", Summary = "Gets a live tv recording")] [Authenticated] - public class GetRecording : IReturn<RecordingInfoDto> + public class GetRecording : IReturn<BaseItemDto> { [ApiMember(Name = "Id", Description = "Recording Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "GET")] public string Id { get; set; } @@ -161,7 +161,7 @@ namespace MediaBrowser.Api.LiveTv [Route("/LiveTv/Programs", "GET,POST", Summary = "Gets available live tv epgs..")] [Authenticated] - public class GetPrograms : IReturn<QueryResult<ProgramInfoDto>> + public class GetPrograms : IReturn<QueryResult<BaseItemDto>> { [ApiMember(Name = "ChannelIds", Description = "The channels to return guide information for.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET,POST")] public string ChannelIds { get; set; } @@ -208,7 +208,7 @@ namespace MediaBrowser.Api.LiveTv [Route("/LiveTv/Programs/Recommended", "GET", Summary = "Gets available live tv epgs..")] [Authenticated] - public class GetRecommendedPrograms : IReturn<QueryResult<ProgramInfoDto>> + public class GetRecommendedPrograms : IReturn<QueryResult<BaseItemDto>> { [ApiMember(Name = "UserId", Description = "Optional filter by user id.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET,POST")] public string UserId { get; set; } @@ -231,7 +231,7 @@ namespace MediaBrowser.Api.LiveTv [Route("/LiveTv/Programs/{Id}", "GET", Summary = "Gets a live tv program")] [Authenticated] - public class GetProgram : IReturn<ProgramInfoDto> + public class GetProgram : IReturn<BaseItemDto> { [ApiMember(Name = "Id", Description = "Program Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "GET")] public string Id { get; set; } @@ -310,7 +310,7 @@ namespace MediaBrowser.Api.LiveTv [Route("/LiveTv/Recordings/Groups/{Id}", "GET", Summary = "Gets a recording group")] [Authenticated] - public class GetRecordingGroup : IReturn<RecordingGroupDto> + public class GetRecordingGroup : IReturn<BaseItemDto> { [ApiMember(Name = "Id", Description = "Recording group Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "GET")] public string Id { get; set; } diff --git a/MediaBrowser.Api/Movies/CollectionService.cs b/MediaBrowser.Api/Movies/CollectionService.cs index ec3265b56..e8c33abc6 100644 --- a/MediaBrowser.Api/Movies/CollectionService.cs +++ b/MediaBrowser.Api/Movies/CollectionService.cs @@ -2,8 +2,6 @@ using MediaBrowser.Controller.Dto; using MediaBrowser.Controller.Net; using MediaBrowser.Model.Collections; -using MediaBrowser.Model.Dto; -using MediaBrowser.Model.Querying; using ServiceStack; using System; using System.Collections.Generic; @@ -22,7 +20,7 @@ namespace MediaBrowser.Api.Movies public string Name { get; set; } [ApiMember(Name = "ParentId", Description = "Optional - create the collection within a specific folder", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "POST")] - public Guid? ParentId { get; set; } + public string ParentId { get; set; } [ApiMember(Name = "Ids", Description = "Item Ids to add to the collection", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "POST", AllowMultiple = true)] public string Ids { get; set; } @@ -35,7 +33,7 @@ namespace MediaBrowser.Api.Movies public string Ids { get; set; } [ApiMember(Name = "Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "POST")] - public Guid Id { get; set; } + public string Id { get; set; } } [Route("/Collections/{Id}/Items", "DELETE", Summary = "Removes items from a collection")] @@ -45,7 +43,7 @@ namespace MediaBrowser.Api.Movies public string Ids { get; set; } [ApiMember(Name = "Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "DELETE")] - public Guid Id { get; set; } + public string Id { get; set; } } [Authenticated] @@ -64,11 +62,13 @@ namespace MediaBrowser.Api.Movies { var userId = AuthorizationContext.GetAuthorizationInfo(Request).UserId; + var parentId = string.IsNullOrWhiteSpace(request.ParentId) ? (Guid?)null : new Guid(request.ParentId); + var item = await _collectionManager.CreateCollection(new CollectionCreationOptions { IsLocked = request.IsLocked, Name = request.Name, - ParentId = request.ParentId, + ParentId = parentId, ItemIdList = (request.Ids ?? string.Empty).Split(',').Where(i => !string.IsNullOrWhiteSpace(i)).Select(i => new Guid(i)).ToList(), UserIds = new List<Guid> { new Guid(userId) } @@ -86,14 +86,14 @@ namespace MediaBrowser.Api.Movies public void Post(AddToCollection request) { - var task = _collectionManager.AddToCollection(request.Id, request.Ids.Split(',').Select(i => new Guid(i))); + var task = _collectionManager.AddToCollection(new Guid(request.Id), request.Ids.Split(',').Select(i => new Guid(i))); Task.WaitAll(task); } public void Delete(RemoveFromCollection request) { - var task = _collectionManager.RemoveFromCollection(request.Id, request.Ids.Split(',').Select(i => new Guid(i))); + var task = _collectionManager.RemoveFromCollection(new Guid(request.Id), request.Ids.Split(',').Select(i => new Guid(i))); Task.WaitAll(task); } diff --git a/MediaBrowser.Api/Movies/MoviesService.cs b/MediaBrowser.Api/Movies/MoviesService.cs index 1a7f6d8f4..513bde871 100644 --- a/MediaBrowser.Api/Movies/MoviesService.cs +++ b/MediaBrowser.Api/Movies/MoviesService.cs @@ -42,7 +42,7 @@ namespace MediaBrowser.Api.Movies /// </summary> /// <value>The user id.</value> [ApiMember(Name = "UserId", Description = "Optional. Filter by user id, and attach user data", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")] - public Guid? UserId { get; set; } + public string UserId { get; set; } /// <summary> /// Specify this to localize the search to a specific item or folder. Omit to use the root. @@ -119,7 +119,7 @@ namespace MediaBrowser.Api.Movies public async Task<object> Get(GetMovieRecommendations request) { - var user = _userManager.GetUserById(request.UserId.Value); + var user = _userManager.GetUserById(request.UserId); IEnumerable<BaseItem> movies = GetAllLibraryItems(request.UserId, _userManager, _libraryManager, request.ParentId, i => i is Movie); @@ -167,10 +167,10 @@ namespace MediaBrowser.Api.Movies private async Task<ItemsResult> GetSimilarItemsResult(BaseGetSimilarItemsFromItem request, Func<BaseItem, bool> includeInSearch, Func<BaseItem, BaseItem, int> getSimilarityScore) { - var user = request.UserId.HasValue ? _userManager.GetUserById(request.UserId.Value) : null; + var user = !string.IsNullOrWhiteSpace(request.UserId) ? _userManager.GetUserById(request.UserId) : null; var item = string.IsNullOrEmpty(request.Id) ? - (request.UserId.HasValue ? user.RootFolder : + (!string.IsNullOrWhiteSpace(request.UserId) ? user.RootFolder : _libraryManager.RootFolder) : _libraryManager.GetItemById(request.Id); Func<BaseItem, bool> filter = i => i.Id != item.Id && includeInSearch(i); diff --git a/MediaBrowser.Api/Movies/TrailersService.cs b/MediaBrowser.Api/Movies/TrailersService.cs index 3bee59a86..c807bfde6 100644 --- a/MediaBrowser.Api/Movies/TrailersService.cs +++ b/MediaBrowser.Api/Movies/TrailersService.cs @@ -34,7 +34,7 @@ namespace MediaBrowser.Api.Movies /// </summary> /// <value>The user id.</value> [ApiMember(Name = "UserId", Description = "User Id", IsRequired = false, DataType = "string", ParameterType = "path", Verb = "GET")] - public Guid? UserId { get; set; } + public string UserId { get; set; } } /// <summary> @@ -103,7 +103,7 @@ namespace MediaBrowser.Api.Movies public async Task<object> Get(Getrailers request) { - var user = request.UserId.HasValue ? _userManager.GetUserById(request.UserId.Value) : null; + var user = !string.IsNullOrWhiteSpace(request.UserId) ? _userManager.GetUserById(request.UserId) : null; var result = await GetAllTrailers(user).ConfigureAwait(false); IEnumerable<BaseItem> items = result.Items; diff --git a/MediaBrowser.Api/Music/InstantMixService.cs b/MediaBrowser.Api/Music/InstantMixService.cs index 46034dc61..506b7bc3a 100644 --- a/MediaBrowser.Api/Music/InstantMixService.cs +++ b/MediaBrowser.Api/Music/InstantMixService.cs @@ -75,7 +75,7 @@ namespace MediaBrowser.Api.Music { var item = _libraryManager.GetItemById(request.Id); - var user = _userManager.GetUserById(request.UserId.Value); + var user = _userManager.GetUserById(request.UserId); var items = _musicManager.GetInstantMixFromItem(item, user); @@ -86,7 +86,7 @@ namespace MediaBrowser.Api.Music { var item = _libraryManager.GetItemById(request.Id); - var user = _userManager.GetUserById(request.UserId.Value); + var user = _userManager.GetUserById(request.UserId); var items = _musicManager.GetInstantMixFromItem(item, user); @@ -97,7 +97,7 @@ namespace MediaBrowser.Api.Music { var item = _libraryManager.GetItemById(request.Id); - var user = _userManager.GetUserById(request.UserId.Value); + var user = _userManager.GetUserById(request.UserId); var items = _musicManager.GetInstantMixFromItem(item, user); @@ -108,7 +108,7 @@ namespace MediaBrowser.Api.Music { var album = _libraryManager.GetItemById(request.Id); - var user = _userManager.GetUserById(request.UserId.Value); + var user = _userManager.GetUserById(request.UserId); var items = _musicManager.GetInstantMixFromItem(album, user); @@ -119,7 +119,7 @@ namespace MediaBrowser.Api.Music { var playlist = (Playlist)_libraryManager.GetItemById(request.Id); - var user = _userManager.GetUserById(request.UserId.Value); + var user = _userManager.GetUserById(request.UserId); var items = _musicManager.GetInstantMixFromItem(playlist, user); @@ -128,7 +128,7 @@ namespace MediaBrowser.Api.Music public object Get(GetInstantMixFromMusicGenre request) { - var user = _userManager.GetUserById(request.UserId.Value); + var user = _userManager.GetUserById(request.UserId); var items = _musicManager.GetInstantMixFromGenres(new[] { request.Name }, user); @@ -137,7 +137,7 @@ namespace MediaBrowser.Api.Music public object Get(GetInstantMixFromArtist request) { - var user = _userManager.GetUserById(request.UserId.Value); + var user = _userManager.GetUserById(request.UserId); var items = _musicManager.GetInstantMixFromArtist(request.Name, user); diff --git a/MediaBrowser.Api/Playback/BaseStreamingService.cs b/MediaBrowser.Api/Playback/BaseStreamingService.cs index 31679aad3..41d785a34 100644 --- a/MediaBrowser.Api/Playback/BaseStreamingService.cs +++ b/MediaBrowser.Api/Playback/BaseStreamingService.cs @@ -8,12 +8,12 @@ using MediaBrowser.Controller.Library; using MediaBrowser.Controller.MediaEncoding; using MediaBrowser.Model.Configuration; using MediaBrowser.Model.Dlna; -using MediaBrowser.Model.Drawing; using MediaBrowser.Model.Dto; using MediaBrowser.Model.Entities; using MediaBrowser.Model.Extensions; using MediaBrowser.Model.IO; using MediaBrowser.Model.MediaInfo; +using MediaBrowser.Model.Serialization; using System; using System.Collections.Generic; using System.Diagnostics; @@ -23,7 +23,6 @@ using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; -using MediaBrowser.Model.Serialization; namespace MediaBrowser.Api.Playback { @@ -690,7 +689,7 @@ namespace MediaBrowser.Api.Playback // TODO: Perhaps also use original_size=1920x800 ?? return string.Format("subtitles=filename='{0}'{1},setpts=PTS -{2}/TB", - subtitlePath.Replace("'", "\\'").Replace('\\', '/').Replace(":/", "\\:/"), + subtitlePath.Replace('\\', '/').Replace("'", "\\'").Replace(":/", "\\:/"), charsetParam, seconds.ToString(UsCulture)); } @@ -698,7 +697,7 @@ namespace MediaBrowser.Api.Playback var mediaPath = state.MediaPath ?? string.Empty; return string.Format("subtitles='{0}:si={1}',setpts=PTS -{2}/TB", - mediaPath.Replace("'", "\\'").Replace('\\', '/').Replace(":/", "\\:/"), + mediaPath.Replace('\\', '/').Replace("'", "\\'").Replace(":/", "\\:/"), state.InternalSubtitleStreamOffset.ToString(UsCulture), seconds.ToString(UsCulture)); } @@ -773,6 +772,11 @@ namespace MediaBrowser.Api.Playback ? null : audioStream.Channels; + if (inputChannels <= 0) + { + inputChannels = null; + } + var codec = outputAudioCodec ?? string.Empty; if (codec.IndexOf("wma", StringComparison.OrdinalIgnoreCase) != -1) @@ -813,11 +817,11 @@ namespace MediaBrowser.Api.Playback } /// <summary> - /// Gets the name of the output audio codec + /// Gets the audio encoder. /// </summary> /// <param name="request">The request.</param> /// <returns>System.String.</returns> - private string GetAudioCodec(StreamRequest request) + protected string GetAudioEncoder(StreamRequest request) { var codec = request.AudioCodec; @@ -846,7 +850,7 @@ namespace MediaBrowser.Api.Playback /// </summary> /// <param name="request">The request.</param> /// <returns>System.String.</returns> - private string GetVideoCodec(VideoStreamRequest request) + protected string GetVideoEncoder(VideoStreamRequest request) { var codec = request.VideoCodec; @@ -1665,13 +1669,13 @@ namespace MediaBrowser.Api.Playback state.OutputAudioBitrate = GetAudioBitrateParam(state.Request, state.AudioStream); state.OutputAudioSampleRate = request.AudioSampleRate; - state.OutputAudioCodec = GetAudioCodec(state.Request); + state.OutputAudioCodec = state.Request.AudioCodec; state.OutputAudioChannels = GetNumAudioChannelsParam(state.Request, state.AudioStream, state.OutputAudioCodec); if (videoRequest != null) { - state.OutputVideoCodec = GetVideoCodec(videoRequest); + state.OutputVideoCodec = state.VideoRequest.VideoCodec; state.OutputVideoBitrate = GetVideoBitrateParamValue(state.VideoRequest, state.VideoStream); if (state.OutputVideoBitrate.HasValue) @@ -1768,6 +1772,12 @@ namespace MediaBrowser.Api.Playback state.InputAudioSync = "1"; } + if (string.Equals(mediaSource.Container, "wma", StringComparison.OrdinalIgnoreCase)) + { + // Seeing some stuttering when transcoding wma to audio-only HLS + state.InputAudioSync = "1"; + } + var mediaStreams = mediaSource.MediaStreams; if (videoRequest != null) @@ -2061,15 +2071,18 @@ namespace MediaBrowser.Api.Playback state.MimeType = mediaProfile.MimeType; } - var transcodingProfile = state.VideoRequest == null ? - profile.GetAudioTranscodingProfile(state.OutputContainer, audioCodec) : - profile.GetVideoTranscodingProfile(state.OutputContainer, audioCodec, videoCodec); - - if (transcodingProfile != null) + if (!state.Request.Static) { - state.EstimateContentLength = transcodingProfile.EstimateContentLength; - state.EnableMpegtsM2TsMode = transcodingProfile.EnableMpegtsM2TsMode; - state.TranscodeSeekInfo = transcodingProfile.TranscodeSeekInfo; + var transcodingProfile = state.VideoRequest == null ? + profile.GetAudioTranscodingProfile(state.OutputContainer, audioCodec) : + profile.GetVideoTranscodingProfile(state.OutputContainer, audioCodec, videoCodec); + + if (transcodingProfile != null) + { + state.EstimateContentLength = transcodingProfile.EstimateContentLength; + state.EnableMpegtsM2TsMode = transcodingProfile.EnableMpegtsM2TsMode; + state.TranscodeSeekInfo = transcodingProfile.TranscodeSeekInfo; + } } } @@ -2088,6 +2101,15 @@ namespace MediaBrowser.Api.Playback responseHeaders["transferMode.dlna.org"] = string.IsNullOrEmpty(transferMode) ? "Streaming" : transferMode; responseHeaders["realTimeInfo.dlna.org"] = "DLNA.ORG_TLAG=*"; + if (string.Equals(GetHeader("getMediaInfo.sec"), "1", StringComparison.OrdinalIgnoreCase)) + { + if (state.RunTimeTicks.HasValue) + { + var ms = TimeSpan.FromTicks(state.RunTimeTicks.Value).TotalMilliseconds; + responseHeaders["MediaInfo.sec"] = string.Format("SEC_Duration={0};", Convert.ToInt32(ms).ToString(CultureInfo.InvariantCulture)); + } + } + if (state.RunTimeTicks.HasValue && !isStaticallyStreamed && profile != null) { AddTimeSeekResponseHeaders(state, responseHeaders); diff --git a/MediaBrowser.Api/Playback/Dash/MpegDashService.cs b/MediaBrowser.Api/Playback/Dash/MpegDashService.cs index 1a90dbb53..47eb38b2d 100644 --- a/MediaBrowser.Api/Playback/Dash/MpegDashService.cs +++ b/MediaBrowser.Api/Playback/Dash/MpegDashService.cs @@ -378,9 +378,9 @@ namespace MediaBrowser.Api.Playback.Dash protected override string GetAudioArguments(StreamState state) { - var codec = state.OutputAudioCodec; + var codec = GetAudioEncoder(state.Request); - if (codec.Equals("copy", StringComparison.OrdinalIgnoreCase)) + if (string.Equals(codec, "copy", StringComparison.OrdinalIgnoreCase)) { return "-codec:a:0 copy"; } @@ -408,7 +408,7 @@ namespace MediaBrowser.Api.Playback.Dash protected override string GetVideoArguments(StreamState state) { - var codec = state.OutputVideoCodec; + var codec = GetVideoEncoder(state.VideoRequest); var args = "-codec:v:0 " + codec; diff --git a/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs b/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs index 6ca5c57f3..ab57e561f 100644 --- a/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs +++ b/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs @@ -295,6 +295,10 @@ namespace MediaBrowser.Api.Playback.Hls } } } + catch (DirectoryNotFoundException) + { + + } catch (FileNotFoundException) { @@ -446,22 +450,29 @@ namespace MediaBrowser.Api.Playback.Hls while (!cancellationToken.IsCancellationRequested) { - using (var fileStream = GetPlaylistFileStream(playlistPath)) + try { - using (var reader = new StreamReader(fileStream)) + using (var fileStream = GetPlaylistFileStream(playlistPath)) { - while (!reader.EndOfStream) + using (var reader = new StreamReader(fileStream)) { - var text = await reader.ReadLineAsync().ConfigureAwait(false); - - // If it appears in the playlist, it's done - if (text.IndexOf(segmentFilename, StringComparison.OrdinalIgnoreCase) != -1) + while (!reader.EndOfStream) { - return GetSegmentResult(segmentPath, segmentIndex, segmentLength, transcodingJob); + var text = await reader.ReadLineAsync().ConfigureAwait(false); + + // If it appears in the playlist, it's done + if (text.IndexOf(segmentFilename, StringComparison.OrdinalIgnoreCase) != -1) + { + return GetSegmentResult(segmentPath, segmentIndex, segmentLength, transcodingJob); + } } } } } + catch (IOException) + { + // May get an error if the file is locked + } await Task.Delay(100, cancellationToken).ConfigureAwait(false); } @@ -775,9 +786,19 @@ namespace MediaBrowser.Api.Playback.Hls protected override string GetAudioArguments(StreamState state) { + var codec = GetAudioEncoder(state.Request); + if (!state.IsOutputVideo) { + if (string.Equals(codec, "copy", StringComparison.OrdinalIgnoreCase)) + { + return "-acodec copy"; + } + var audioTranscodeParams = new List<string>(); + + audioTranscodeParams.Add("-acodec " + codec); + if (state.OutputAudioBitrate.HasValue) { audioTranscodeParams.Add("-ab " + state.OutputAudioBitrate.Value.ToString(UsCulture)); @@ -797,8 +818,6 @@ namespace MediaBrowser.Api.Playback.Hls return string.Join(" ", audioTranscodeParams.ToArray()); } - var codec = state.OutputAudioCodec; - if (string.Equals(codec, "copy", StringComparison.OrdinalIgnoreCase)) { return "-codec:a:0 copy"; @@ -832,7 +851,7 @@ namespace MediaBrowser.Api.Playback.Hls return string.Empty; } - var codec = state.OutputVideoCodec; + var codec = GetVideoEncoder(state.VideoRequest); var args = "-codec:v:0 " + codec; @@ -879,7 +898,7 @@ namespace MediaBrowser.Api.Playback.Hls if (!EnableSplitTranscoding(state)) { - args += " -copyts"; + //args += " -copyts"; } return args; @@ -910,11 +929,11 @@ namespace MediaBrowser.Api.Playback.Hls //toTimeParam = " -to " + MediaEncoder.GetTimeParameter(endTime); toTimeParam = " -t " + MediaEncoder.GetTimeParameter(TimeSpan.FromSeconds(durationSeconds).Ticks); } + } - if (state.IsOutputVideo && !string.Equals(state.OutputVideoCodec, "copy", StringComparison.OrdinalIgnoreCase) && (state.Request.StartTimeTicks ?? 0) > 0) - { - timestampOffsetParam = " -output_ts_offset " + MediaEncoder.GetTimeParameter(state.Request.StartTimeTicks ?? 0).ToString(CultureInfo.InvariantCulture); - } + if (state.IsOutputVideo && !string.Equals(state.OutputVideoCodec, "copy", StringComparison.OrdinalIgnoreCase) && (state.Request.StartTimeTicks ?? 0) > 0) + { + timestampOffsetParam = " -output_ts_offset " + MediaEncoder.GetTimeParameter(state.Request.StartTimeTicks ?? 0).ToString(CultureInfo.InvariantCulture); } var mapArgs = state.IsOutputVideo ? GetMapArgs(state) : string.Empty; @@ -959,6 +978,7 @@ namespace MediaBrowser.Api.Playback.Hls private bool EnableSplitTranscoding(StreamState state) { + return false; if (string.Equals(Request.QueryString["EnableSplitTranscoding"], "false", StringComparison.OrdinalIgnoreCase)) { return false; diff --git a/MediaBrowser.Api/Playback/Hls/VideoHlsService.cs b/MediaBrowser.Api/Playback/Hls/VideoHlsService.cs index f21be190f..d8e3423fc 100644 --- a/MediaBrowser.Api/Playback/Hls/VideoHlsService.cs +++ b/MediaBrowser.Api/Playback/Hls/VideoHlsService.cs @@ -48,9 +48,9 @@ namespace MediaBrowser.Api.Playback.Hls /// <returns>System.String.</returns> protected override string GetAudioArguments(StreamState state) { - var codec = state.OutputAudioCodec; + var codec = GetAudioEncoder(state.Request); - if (codec.Equals("copy", StringComparison.OrdinalIgnoreCase)) + if (string.Equals(codec, "copy", StringComparison.OrdinalIgnoreCase)) { return "-codec:a:0 copy"; } @@ -83,7 +83,7 @@ namespace MediaBrowser.Api.Playback.Hls /// <returns>System.String.</returns> protected override string GetVideoArguments(StreamState state) { - var codec = state.OutputVideoCodec; + var codec = GetVideoEncoder(state.VideoRequest); var args = "-codec:v:0 " + codec; diff --git a/MediaBrowser.Api/Playback/MediaInfoService.cs b/MediaBrowser.Api/Playback/MediaInfoService.cs index 72d4961cd..0b7b50134 100644 --- a/MediaBrowser.Api/Playback/MediaInfoService.cs +++ b/MediaBrowser.Api/Playback/MediaInfoService.cs @@ -46,7 +46,7 @@ namespace MediaBrowser.Api.Playback } [Route("/Playback/BitrateTest", "GET")] - public class GetBitrateTestBytes : IReturn<PlaybackInfoResponse> + public class GetBitrateTestBytes { [ApiMember(Name = "Size", Description = "Size", IsRequired = true, DataType = "int", ParameterType = "query", Verb = "GET")] public long Size { get; set; } diff --git a/MediaBrowser.Api/Playback/Progressive/BaseProgressiveStreamingService.cs b/MediaBrowser.Api/Playback/Progressive/BaseProgressiveStreamingService.cs index 041b4ea41..910ac18e7 100644 --- a/MediaBrowser.Api/Playback/Progressive/BaseProgressiveStreamingService.cs +++ b/MediaBrowser.Api/Playback/Progressive/BaseProgressiveStreamingService.cs @@ -1,12 +1,10 @@ -using System.Globalization; -using MediaBrowser.Common.IO; +using MediaBrowser.Common.IO; using MediaBrowser.Common.Net; using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Devices; using MediaBrowser.Controller.Dlna; using MediaBrowser.Controller.Drawing; using MediaBrowser.Controller.Library; -using MediaBrowser.Controller.LiveTv; using MediaBrowser.Controller.MediaEncoding; using MediaBrowser.Controller.Net; using MediaBrowser.Model.IO; @@ -15,6 +13,7 @@ using MediaBrowser.Model.Serialization; using ServiceStack.Web; using System; using System.Collections.Generic; +using System.Globalization; using System.IO; using System.Threading; using System.Threading.Tasks; diff --git a/MediaBrowser.Api/Playback/Progressive/VideoService.cs b/MediaBrowser.Api/Playback/Progressive/VideoService.cs index 283f9671f..ebd72b2ce 100644 --- a/MediaBrowser.Api/Playback/Progressive/VideoService.cs +++ b/MediaBrowser.Api/Playback/Progressive/VideoService.cs @@ -89,7 +89,7 @@ namespace MediaBrowser.Api.Playback.Progressive protected override string GetCommandLineArguments(string outputPath, StreamState state, bool isEncoding) { // Get the output codec name - var videoCodec = state.OutputVideoCodec; + var videoCodec = GetVideoEncoder(state.VideoRequest); var format = string.Empty; var keyFrame = string.Empty; @@ -183,11 +183,11 @@ namespace MediaBrowser.Api.Playback.Progressive } // Get the output codec name - var codec = state.OutputAudioCodec; + var codec = GetAudioEncoder(state.Request); var args = "-codec:a:0 " + codec; - if (codec.Equals("copy", StringComparison.OrdinalIgnoreCase)) + if (string.Equals(codec, "copy", StringComparison.OrdinalIgnoreCase)) { return args; } diff --git a/MediaBrowser.Api/PluginService.cs b/MediaBrowser.Api/PluginService.cs index 4af9bfe58..eb49914eb 100644 --- a/MediaBrowser.Api/PluginService.cs +++ b/MediaBrowser.Api/PluginService.cs @@ -42,7 +42,7 @@ namespace MediaBrowser.Api /// </summary> /// <value>The id.</value> [ApiMember(Name = "Id", Description = "Plugin Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "DELETE")] - public Guid Id { get; set; } + public string Id { get; set; } } /// <summary> @@ -57,7 +57,7 @@ namespace MediaBrowser.Api /// </summary> /// <value>The id.</value> [ApiMember(Name = "Id", Description = "Plugin Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "GET")] - public Guid Id { get; set; } + public string Id { get; set; } } /// <summary> @@ -72,7 +72,7 @@ namespace MediaBrowser.Api /// </summary> /// <value>The id.</value> [ApiMember(Name = "Id", Description = "Plugin Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "POST")] - public Guid Id { get; set; } + public string Id { get; set; } /// <summary> /// The raw Http Request Input Stream @@ -239,7 +239,8 @@ namespace MediaBrowser.Api /// <returns>System.Object.</returns> public object Get(GetPluginConfiguration request) { - var plugin = _appHost.Plugins.First(p => p.Id == request.Id); + var guid = new Guid(request.Id); + var plugin = _appHost.Plugins.First(p => p.Id == guid); var dateModified = plugin.ConfigurationDateLastModified; @@ -298,7 +299,8 @@ namespace MediaBrowser.Api /// <param name="request">The request.</param> public void Delete(UninstallPlugin request) { - var plugin = _appHost.Plugins.First(p => p.Id == request.Id); + var guid = new Guid(request.Id); + var plugin = _appHost.Plugins.First(p => p.Id == guid); _installationManager.UninstallPlugin(plugin); } diff --git a/MediaBrowser.Api/Reports/ReportRequests.cs b/MediaBrowser.Api/Reports/ReportRequests.cs index 939b49282..7fe0bfba1 100644 --- a/MediaBrowser.Api/Reports/ReportRequests.cs +++ b/MediaBrowser.Api/Reports/ReportRequests.cs @@ -1,10 +1,9 @@ -using System; -using System.Linq; -using MediaBrowser.Api.UserLibrary; -using MediaBrowser.Controller.Net; +using MediaBrowser.Api.UserLibrary; using MediaBrowser.Model.Entities; using ServiceStack; +using System; using System.Collections.Generic; +using System.Linq; namespace MediaBrowser.Api.Reports { @@ -15,7 +14,7 @@ namespace MediaBrowser.Api.Reports /// </summary> /// <value>The user id.</value> [ApiMember(Name = "UserId", Description = "User Id", IsRequired = false, DataType = "string", ParameterType = "path", Verb = "GET")] - public Guid? UserId { get; set; } + public string UserId { get; set; } /// <summary> /// Limit results to items containing a specific person diff --git a/MediaBrowser.Api/Reports/ReportsService.cs b/MediaBrowser.Api/Reports/ReportsService.cs index b13e5628c..4438876f7 100644 --- a/MediaBrowser.Api/Reports/ReportsService.cs +++ b/MediaBrowser.Api/Reports/ReportsService.cs @@ -175,7 +175,7 @@ namespace MediaBrowser.Api.Reports { // Placeholder in case needed later request.Recursive = true; - var user = request.UserId.HasValue ? _userManager.GetUserById(request.UserId.Value) : null; + var user = !string.IsNullOrWhiteSpace(request.UserId) ? _userManager.GetUserById(request.UserId) : null; request.Fields = "MediaSources,DateCreated,Settings,Studios,SyncInfo,ItemCounts"; var parentItem = string.IsNullOrEmpty(request.ParentId) ? diff --git a/MediaBrowser.Api/Session/SessionsService.cs b/MediaBrowser.Api/Session/SessionsService.cs index d4ea6a0eb..1160f685c 100644 --- a/MediaBrowser.Api/Session/SessionsService.cs +++ b/MediaBrowser.Api/Session/SessionsService.cs @@ -21,7 +21,7 @@ namespace MediaBrowser.Api.Session public class GetSessions : IReturn<List<SessionInfoDto>> { [ApiMember(Name = "ControllableByUserId", Description = "Optional. Filter by sessions that a given user is allowed to remote control.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")] - public Guid? ControllableByUserId { get; set; } + public string ControllableByUserId { get; set; } [ApiMember(Name = "DeviceId", Description = "Optional. Filter by device id.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")] public string DeviceId { get; set; } @@ -200,7 +200,7 @@ namespace MediaBrowser.Api.Session public string Id { get; set; } [ApiMember(Name = "UserId", Description = "UserId Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "POST")] - public Guid UserId { get; set; } + public string UserId { get; set; } } [Route("/Sessions/{Id}/Users/{UserId}", "DELETE", Summary = "Removes an additional user from a session")] @@ -211,7 +211,7 @@ namespace MediaBrowser.Api.Session public string Id { get; set; } [ApiMember(Name = "UserId", Description = "UserId Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "POST")] - public Guid UserId { get; set; } + public string UserId { get; set; } } [Route("/Sessions/Capabilities", "POST", Summary = "Updates capabilities for a device")] @@ -375,15 +375,15 @@ namespace MediaBrowser.Api.Session result = result.Where(i => string.Equals(i.DeviceId, request.DeviceId, StringComparison.OrdinalIgnoreCase)); } - if (request.ControllableByUserId.HasValue) + if (!string.IsNullOrWhiteSpace(request.ControllableByUserId)) { result = result.Where(i => i.SupportsMediaControl); - var user = _userManager.GetUserById(request.ControllableByUserId.Value); + var user = _userManager.GetUserById(request.ControllableByUserId); if (!user.Policy.EnableRemoteControlOfOtherUsers) { - result = result.Where(i => !i.UserId.HasValue || i.ContainsUser(request.ControllableByUserId.Value)); + result = result.Where(i => !i.UserId.HasValue || i.ContainsUser(request.ControllableByUserId)); } if (!user.Policy.EnableSharedDeviceControl) diff --git a/MediaBrowser.Api/SimilarItemsHelper.cs b/MediaBrowser.Api/SimilarItemsHelper.cs index fb04dd030..91e749778 100644 --- a/MediaBrowser.Api/SimilarItemsHelper.cs +++ b/MediaBrowser.Api/SimilarItemsHelper.cs @@ -32,7 +32,7 @@ namespace MediaBrowser.Api /// </summary> /// <value>The user id.</value> [ApiMember(Name = "UserId", Description = "Optional. Filter by user id, and attach user data", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")] - public Guid? UserId { get; set; } + public string UserId { get; set; } /// <summary> /// The maximum number of items to return @@ -70,10 +70,10 @@ namespace MediaBrowser.Api /// <returns>ItemsResult.</returns> internal static ItemsResult GetSimilarItemsResult(DtoOptions dtoOptions, IUserManager userManager, IItemRepository itemRepository, ILibraryManager libraryManager, IUserDataManager userDataRepository, IDtoService dtoService, ILogger logger, BaseGetSimilarItemsFromItem request, Func<BaseItem, bool> includeInSearch, Func<BaseItem, BaseItem, int> getSimilarityScore) { - var user = request.UserId.HasValue ? userManager.GetUserById(request.UserId.Value) : null; + var user = !string.IsNullOrWhiteSpace(request.UserId) ? userManager.GetUserById(request.UserId) : null; var item = string.IsNullOrEmpty(request.Id) ? - (request.UserId.HasValue ? user.RootFolder : + (!string.IsNullOrWhiteSpace(request.UserId) ? user.RootFolder : libraryManager.RootFolder) : libraryManager.GetItemById(request.Id); Func<BaseItem, bool> filter = i => i.Id != item.Id && includeInSearch(i); diff --git a/MediaBrowser.Api/TvShowsService.cs b/MediaBrowser.Api/TvShowsService.cs index 9c9feead5..29a4a8bb5 100644 --- a/MediaBrowser.Api/TvShowsService.cs +++ b/MediaBrowser.Api/TvShowsService.cs @@ -77,7 +77,7 @@ namespace MediaBrowser.Api /// </summary> /// <value>The user id.</value> [ApiMember(Name = "UserId", Description = "User Id", IsRequired = true, DataType = "string", ParameterType = "query", Verb = "GET")] - public Guid UserId { get; set; } + public string UserId { get; set; } /// <summary> /// Skips over a given number of items within the results. Use for paging. @@ -130,7 +130,7 @@ namespace MediaBrowser.Api /// </summary> /// <value>The user id.</value> [ApiMember(Name = "UserId", Description = "User Id", IsRequired = true, DataType = "string", ParameterType = "query", Verb = "GET")] - public Guid UserId { get; set; } + public string UserId { get; set; } /// <summary> /// Fields to return within the items, in addition to basic information @@ -140,7 +140,7 @@ namespace MediaBrowser.Api public string Fields { get; set; } [ApiMember(Name = "Id", Description = "The series id", IsRequired = true, DataType = "string", ParameterType = "query", Verb = "GET")] - public Guid Id { get; set; } + public string Id { get; set; } [ApiMember(Name = "Season", Description = "Optional filter by season number.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")] public int? Season { get; set; } @@ -183,7 +183,7 @@ namespace MediaBrowser.Api /// </summary> /// <value>The user id.</value> [ApiMember(Name = "UserId", Description = "User Id", IsRequired = true, DataType = "string", ParameterType = "query", Verb = "GET")] - public Guid UserId { get; set; } + public string UserId { get; set; } /// <summary> /// Fields to return within the items, in addition to basic information @@ -193,7 +193,7 @@ namespace MediaBrowser.Api public string Fields { get; set; } [ApiMember(Name = "Id", Description = "The series id", IsRequired = true, DataType = "string", ParameterType = "query", Verb = "GET")] - public Guid Id { get; set; } + public string Id { get; set; } [ApiMember(Name = "IsSpecialSeason", Description = "Optional. Filter by special season.", IsRequired = false, DataType = "bool", ParameterType = "query", Verb = "GET")] public bool? IsSpecialSeason { get; set; } diff --git a/MediaBrowser.Api/UserLibrary/ArtistsService.cs b/MediaBrowser.Api/UserLibrary/ArtistsService.cs index 9f3f17465..2393d0533 100644 --- a/MediaBrowser.Api/UserLibrary/ArtistsService.cs +++ b/MediaBrowser.Api/UserLibrary/ArtistsService.cs @@ -40,7 +40,7 @@ namespace MediaBrowser.Api.UserLibrary /// </summary> /// <value>The user id.</value> [ApiMember(Name = "UserId", Description = "Optional. Filter by user id, and attach user data", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")] - public Guid? UserId { get; set; } + public string UserId { get; set; } } /// <summary> @@ -84,9 +84,9 @@ namespace MediaBrowser.Api.UserLibrary var dtoOptions = GetDtoOptions(request); - if (request.UserId.HasValue) + if (!string.IsNullOrWhiteSpace(request.UserId)) { - var user = UserManager.GetUserById(request.UserId.Value); + var user = UserManager.GetUserById(request.UserId); return DtoService.GetBaseItemDto(item, dtoOptions, user); } diff --git a/MediaBrowser.Api/UserLibrary/BaseItemsByNameService.cs b/MediaBrowser.Api/UserLibrary/BaseItemsByNameService.cs index b2364ce3c..8084fd083 100644 --- a/MediaBrowser.Api/UserLibrary/BaseItemsByNameService.cs +++ b/MediaBrowser.Api/UserLibrary/BaseItemsByNameService.cs @@ -61,9 +61,9 @@ namespace MediaBrowser.Api.UserLibrary BaseItem parentItem; List<BaseItem> libraryItems = null; - if (request.UserId.HasValue) + if (!string.IsNullOrWhiteSpace(request.UserId)) { - user = UserManager.GetUserById(request.UserId.Value); + user = UserManager.GetUserById(request.UserId); parentItem = string.IsNullOrEmpty(request.ParentId) ? user.RootFolder : LibraryManager.GetItemById(request.ParentId); if (RequiresLibraryItems(request, dtoOptions)) @@ -92,7 +92,7 @@ namespace MediaBrowser.Api.UserLibrary { var folder = (Folder)parentItem; - if (request.UserId.HasValue) + if (!string.IsNullOrWhiteSpace(request.UserId)) { items = request.Recursive ? folder.GetRecursiveChildren(user, filter) : @@ -388,7 +388,7 @@ namespace MediaBrowser.Api.UserLibrary /// </summary> /// <value>The user id.</value> [ApiMember(Name = "UserId", Description = "Optional. Filter by user id, and attach user data", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")] - public Guid? UserId { get; set; } + public string UserId { get; set; } [ApiMember(Name = "NameStartsWithOrGreater", Description = "Optional filter by items whose name is sorted equally or greater than a given input string.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")] public string NameStartsWithOrGreater { get; set; } diff --git a/MediaBrowser.Api/UserLibrary/GameGenresService.cs b/MediaBrowser.Api/UserLibrary/GameGenresService.cs index 2f7430d33..f9d0f0d0f 100644 --- a/MediaBrowser.Api/UserLibrary/GameGenresService.cs +++ b/MediaBrowser.Api/UserLibrary/GameGenresService.cs @@ -37,7 +37,7 @@ namespace MediaBrowser.Api.UserLibrary /// </summary> /// <value>The user id.</value> [ApiMember(Name = "UserId", Description = "Optional. Filter by user id, and attach user data", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")] - public Guid? UserId { get; set; } + public string UserId { get; set; } } [Authenticated] @@ -71,9 +71,9 @@ namespace MediaBrowser.Api.UserLibrary var dtoOptions = GetDtoOptions(request); - if (request.UserId.HasValue) + if (!string.IsNullOrWhiteSpace(request.UserId)) { - var user = UserManager.GetUserById(request.UserId.Value); + var user = UserManager.GetUserById(request.UserId); return DtoService.GetBaseItemDto(item, dtoOptions, user); } diff --git a/MediaBrowser.Api/UserLibrary/GenresService.cs b/MediaBrowser.Api/UserLibrary/GenresService.cs index 63c0575bf..070246886 100644 --- a/MediaBrowser.Api/UserLibrary/GenresService.cs +++ b/MediaBrowser.Api/UserLibrary/GenresService.cs @@ -39,7 +39,7 @@ namespace MediaBrowser.Api.UserLibrary /// </summary> /// <value>The user id.</value> [ApiMember(Name = "UserId", Description = "Optional. Filter by user id, and attach user data", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")] - public Guid? UserId { get; set; } + public string UserId { get; set; } } /// <summary> @@ -76,9 +76,9 @@ namespace MediaBrowser.Api.UserLibrary var dtoOptions = GetDtoOptions(request); - if (request.UserId.HasValue) + if (!string.IsNullOrWhiteSpace(request.UserId)) { - var user = UserManager.GetUserById(request.UserId.Value); + var user = UserManager.GetUserById(request.UserId); return DtoService.GetBaseItemDto(item, dtoOptions, user); } diff --git a/MediaBrowser.Api/UserLibrary/ItemsService.cs b/MediaBrowser.Api/UserLibrary/ItemsService.cs index 51f88d574..bc2e4699c 100644 --- a/MediaBrowser.Api/UserLibrary/ItemsService.cs +++ b/MediaBrowser.Api/UserLibrary/ItemsService.cs @@ -30,7 +30,7 @@ namespace MediaBrowser.Api.UserLibrary /// </summary> /// <value>The user id.</value> [ApiMember(Name = "UserId", Description = "User Id", IsRequired = false, DataType = "string", ParameterType = "path", Verb = "GET")] - public Guid? UserId { get; set; } + public string UserId { get; set; } /// <summary> /// Limit results to items containing a specific person @@ -325,7 +325,7 @@ namespace MediaBrowser.Api.UserLibrary private async Task<ItemsResult> GetItems(GetItems request) { var parentItem = string.IsNullOrEmpty(request.ParentId) ? null : _libraryManager.GetItemById(request.ParentId); - var user = request.UserId.HasValue ? _userManager.GetUserById(request.UserId.Value) : null; + var user = !string.IsNullOrWhiteSpace(request.UserId) ? _userManager.GetUserById(request.UserId) : null; var result = await GetItemsToSerialize(request, user, parentItem).ConfigureAwait(false); diff --git a/MediaBrowser.Api/UserLibrary/MusicGenresService.cs b/MediaBrowser.Api/UserLibrary/MusicGenresService.cs index 1fe9dfaaa..e63d6c0f4 100644 --- a/MediaBrowser.Api/UserLibrary/MusicGenresService.cs +++ b/MediaBrowser.Api/UserLibrary/MusicGenresService.cs @@ -37,7 +37,7 @@ namespace MediaBrowser.Api.UserLibrary /// </summary> /// <value>The user id.</value> [ApiMember(Name = "UserId", Description = "Optional. Filter by user id, and attach user data", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")] - public Guid? UserId { get; set; } + public string UserId { get; set; } } [Authenticated] @@ -71,9 +71,9 @@ namespace MediaBrowser.Api.UserLibrary var dtoOptions = GetDtoOptions(request); - if (request.UserId.HasValue) + if (!string.IsNullOrWhiteSpace(request.UserId)) { - var user = UserManager.GetUserById(request.UserId.Value); + var user = UserManager.GetUserById(request.UserId); return DtoService.GetBaseItemDto(item, dtoOptions, user); } diff --git a/MediaBrowser.Api/UserLibrary/PersonsService.cs b/MediaBrowser.Api/UserLibrary/PersonsService.cs index 08ee6e462..b7fb4f542 100644 --- a/MediaBrowser.Api/UserLibrary/PersonsService.cs +++ b/MediaBrowser.Api/UserLibrary/PersonsService.cs @@ -43,7 +43,7 @@ namespace MediaBrowser.Api.UserLibrary /// </summary> /// <value>The user id.</value> [ApiMember(Name = "UserId", Description = "Optional. Filter by user id, and attach user data", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")] - public Guid? UserId { get; set; } + public string UserId { get; set; } } /// <summary> @@ -87,9 +87,9 @@ namespace MediaBrowser.Api.UserLibrary var dtoOptions = GetDtoOptions(request); - if (request.UserId.HasValue) + if (!string.IsNullOrWhiteSpace(request.UserId)) { - var user = UserManager.GetUserById(request.UserId.Value); + var user = UserManager.GetUserById(request.UserId); return DtoService.GetBaseItemDto(item, dtoOptions, user); } diff --git a/MediaBrowser.Api/UserLibrary/PlaystateService.cs b/MediaBrowser.Api/UserLibrary/PlaystateService.cs index f66f307db..5f32725d8 100644 --- a/MediaBrowser.Api/UserLibrary/PlaystateService.cs +++ b/MediaBrowser.Api/UserLibrary/PlaystateService.cs @@ -23,7 +23,7 @@ namespace MediaBrowser.Api.UserLibrary /// </summary> /// <value>The user id.</value> [ApiMember(Name = "UserId", Description = "User Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "POST")] - public Guid UserId { get; set; } + public string UserId { get; set; } [ApiMember(Name = "DatePlayed", Description = "The date the item was played (if any). Format = yyyyMMddHHmmss", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "POST")] public string DatePlayed { get; set; } @@ -47,7 +47,7 @@ namespace MediaBrowser.Api.UserLibrary /// </summary> /// <value>The user id.</value> [ApiMember(Name = "UserId", Description = "User Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "DELETE")] - public Guid UserId { get; set; } + public string UserId { get; set; } /// <summary> /// Gets or sets the id. @@ -90,7 +90,7 @@ namespace MediaBrowser.Api.UserLibrary /// </summary> /// <value>The user id.</value> [ApiMember(Name = "UserId", Description = "User Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "POST")] - public Guid UserId { get; set; } + public string UserId { get; set; } /// <summary> /// Gets or sets the id. @@ -143,7 +143,7 @@ namespace MediaBrowser.Api.UserLibrary /// </summary> /// <value>The user id.</value> [ApiMember(Name = "UserId", Description = "User Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "POST")] - public Guid UserId { get; set; } + public string UserId { get; set; } /// <summary> /// Gets or sets the id. @@ -198,7 +198,7 @@ namespace MediaBrowser.Api.UserLibrary /// </summary> /// <value>The user id.</value> [ApiMember(Name = "UserId", Description = "User Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "DELETE")] - public Guid UserId { get; set; } + public string UserId { get; set; } /// <summary> /// Gets or sets the id. diff --git a/MediaBrowser.Api/UserLibrary/StudiosService.cs b/MediaBrowser.Api/UserLibrary/StudiosService.cs index ae1da0346..d6a7db14f 100644 --- a/MediaBrowser.Api/UserLibrary/StudiosService.cs +++ b/MediaBrowser.Api/UserLibrary/StudiosService.cs @@ -38,7 +38,7 @@ namespace MediaBrowser.Api.UserLibrary /// </summary> /// <value>The user id.</value> [ApiMember(Name = "UserId", Description = "Optional. Filter by user id, and attach user data", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")] - public Guid? UserId { get; set; } + public string UserId { get; set; } } /// <summary> @@ -75,9 +75,9 @@ namespace MediaBrowser.Api.UserLibrary var dtoOptions = GetDtoOptions(request); - if (request.UserId.HasValue) + if (!string.IsNullOrWhiteSpace(request.UserId)) { - var user = UserManager.GetUserById(request.UserId.Value); + var user = UserManager.GetUserById(request.UserId); return DtoService.GetBaseItemDto(item, dtoOptions, user); } diff --git a/MediaBrowser.Api/UserLibrary/UserLibraryService.cs b/MediaBrowser.Api/UserLibrary/UserLibraryService.cs index aa6e227d8..c2c481cb6 100644 --- a/MediaBrowser.Api/UserLibrary/UserLibraryService.cs +++ b/MediaBrowser.Api/UserLibrary/UserLibraryService.cs @@ -5,9 +5,7 @@ using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Net; using MediaBrowser.Model.Dto; using MediaBrowser.Model.Entities; -using MediaBrowser.Model.Library; using MediaBrowser.Model.Querying; -using MoreLinq; using ServiceStack; using System; using System.Collections.Generic; @@ -28,7 +26,7 @@ namespace MediaBrowser.Api.UserLibrary /// </summary> /// <value>The user id.</value> [ApiMember(Name = "UserId", Description = "User Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "GET")] - public Guid UserId { get; set; } + public string UserId { get; set; } /// <summary> /// Gets or sets the id. @@ -49,7 +47,7 @@ namespace MediaBrowser.Api.UserLibrary /// </summary> /// <value>The user id.</value> [ApiMember(Name = "UserId", Description = "User Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "GET")] - public Guid UserId { get; set; } + public string UserId { get; set; } } /// <summary> @@ -63,7 +61,7 @@ namespace MediaBrowser.Api.UserLibrary /// </summary> /// <value>The user id.</value> [ApiMember(Name = "UserId", Description = "User Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "GET")] - public Guid UserId { get; set; } + public string UserId { get; set; } /// <summary> /// Gets or sets the item id. @@ -84,7 +82,7 @@ namespace MediaBrowser.Api.UserLibrary /// </summary> /// <value>The user id.</value> [ApiMember(Name = "UserId", Description = "User Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "POST")] - public Guid UserId { get; set; } + public string UserId { get; set; } /// <summary> /// Gets or sets the id. @@ -105,7 +103,7 @@ namespace MediaBrowser.Api.UserLibrary /// </summary> /// <value>The user id.</value> [ApiMember(Name = "UserId", Description = "User Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "DELETE")] - public Guid UserId { get; set; } + public string UserId { get; set; } /// <summary> /// Gets or sets the id. @@ -126,7 +124,7 @@ namespace MediaBrowser.Api.UserLibrary /// </summary> /// <value>The user id.</value> [ApiMember(Name = "UserId", Description = "User Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "DELETE")] - public Guid UserId { get; set; } + public string UserId { get; set; } /// <summary> /// Gets or sets the id. @@ -147,7 +145,7 @@ namespace MediaBrowser.Api.UserLibrary /// </summary> /// <value>The user id.</value> [ApiMember(Name = "UserId", Description = "User Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "POST")] - public Guid UserId { get; set; } + public string UserId { get; set; } /// <summary> /// Gets or sets the id. @@ -175,7 +173,7 @@ namespace MediaBrowser.Api.UserLibrary /// </summary> /// <value>The user id.</value> [ApiMember(Name = "UserId", Description = "User Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "GET")] - public Guid UserId { get; set; } + public string UserId { get; set; } /// <summary> /// Gets or sets the id. @@ -196,7 +194,7 @@ namespace MediaBrowser.Api.UserLibrary /// </summary> /// <value>The user id.</value> [ApiMember(Name = "UserId", Description = "User Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "GET")] - public Guid UserId { get; set; } + public string UserId { get; set; } /// <summary> /// Gets or sets the id. @@ -515,7 +513,7 @@ namespace MediaBrowser.Api.UserLibrary /// <param name="itemId">The item id.</param> /// <param name="isFavorite">if set to <c>true</c> [is favorite].</param> /// <returns>Task{UserItemDataDto}.</returns> - private async Task<UserItemDataDto> MarkFavorite(Guid userId, string itemId, bool isFavorite) + private async Task<UserItemDataDto> MarkFavorite(string userId, string itemId, bool isFavorite) { var user = _userManager.GetUserById(userId); @@ -563,7 +561,7 @@ namespace MediaBrowser.Api.UserLibrary /// <param name="itemId">The item id.</param> /// <param name="likes">if set to <c>true</c> [likes].</param> /// <returns>Task{UserItemDataDto}.</returns> - private async Task<UserItemDataDto> UpdateUserItemRating(Guid userId, string itemId, bool? likes) + private async Task<UserItemDataDto> UpdateUserItemRating(string userId, string itemId, bool? likes) { var user = _userManager.GetUserById(userId); diff --git a/MediaBrowser.Api/UserLibrary/YearsService.cs b/MediaBrowser.Api/UserLibrary/YearsService.cs index d95496333..859b9f959 100644 --- a/MediaBrowser.Api/UserLibrary/YearsService.cs +++ b/MediaBrowser.Api/UserLibrary/YearsService.cs @@ -38,7 +38,7 @@ namespace MediaBrowser.Api.UserLibrary /// </summary> /// <value>The user id.</value> [ApiMember(Name = "UserId", Description = "Optional. Filter by user id, and attach user data", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")] - public Guid? UserId { get; set; } + public string UserId { get; set; } } /// <summary> @@ -75,9 +75,9 @@ namespace MediaBrowser.Api.UserLibrary var dtoOptions = GetDtoOptions(request); - if (request.UserId.HasValue) + if (!string.IsNullOrWhiteSpace(request.UserId)) { - var user = UserManager.GetUserById(request.UserId.Value); + var user = UserManager.GetUserById(request.UserId); return DtoService.GetBaseItemDto(item, dtoOptions, user); } diff --git a/MediaBrowser.Api/VideosService.cs b/MediaBrowser.Api/VideosService.cs index d1b0eb05f..a65bee7ef 100644 --- a/MediaBrowser.Api/VideosService.cs +++ b/MediaBrowser.Api/VideosService.cs @@ -19,7 +19,7 @@ namespace MediaBrowser.Api public class GetAdditionalParts : IReturn<ItemsResult> { [ApiMember(Name = "UserId", Description = "Optional. Filter by user id, and attach user data", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")] - public Guid? UserId { get; set; } + public string UserId { get; set; } /// <summary> /// Gets or sets the id. @@ -71,10 +71,10 @@ namespace MediaBrowser.Api /// <returns>System.Object.</returns> public object Get(GetAdditionalParts request) { - var user = request.UserId.HasValue ? _userManager.GetUserById(request.UserId.Value) : null; + var user = !string.IsNullOrWhiteSpace(request.UserId) ? _userManager.GetUserById(request.UserId) : null; var item = string.IsNullOrEmpty(request.Id) - ? (request.UserId.HasValue + ? (!string.IsNullOrWhiteSpace(request.UserId) ? user.RootFolder : _libraryManager.RootFolder) : _libraryManager.GetItemById(request.Id); |
