diff options
Diffstat (limited to 'MediaBrowser.Api')
| -rw-r--r-- | MediaBrowser.Api/ConfigurationService.cs | 33 | ||||
| -rw-r--r-- | MediaBrowser.Api/Library/LibraryService.cs | 2 | ||||
| -rw-r--r-- | MediaBrowser.Api/MediaBrowser.Api.csproj | 4 | ||||
| -rw-r--r-- | MediaBrowser.Api/Playback/BaseStreamingService.cs | 6 | ||||
| -rw-r--r-- | MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs | 37 | ||||
| -rw-r--r-- | MediaBrowser.Api/PlaylistService.cs | 31 | ||||
| -rw-r--r-- | MediaBrowser.Api/Subtitles/SubtitleService.cs | 6 | ||||
| -rw-r--r-- | MediaBrowser.Api/System/SystemService.cs | 27 |
8 files changed, 102 insertions, 44 deletions
diff --git a/MediaBrowser.Api/ConfigurationService.cs b/MediaBrowser.Api/ConfigurationService.cs index 1e7f9d8b0..7b6e5ed19 100644 --- a/MediaBrowser.Api/ConfigurationService.cs +++ b/MediaBrowser.Api/ConfigurationService.cs @@ -141,22 +141,29 @@ namespace MediaBrowser.Api private string AutoDetectMetadataService() { - var paths = _libraryManager.GetDefaultVirtualFolders() - .SelectMany(i => i.Locations) - .Distinct(StringComparer.OrdinalIgnoreCase) - .Select(i => new DirectoryInfo(i)) - .ToList(); - - if (paths.SelectMany(i => i.EnumerateFiles("*.xml", SearchOption.AllDirectories)) - .Any()) + try { - return XbmcMetadata; + var paths = _libraryManager.GetDefaultVirtualFolders() + .SelectMany(i => i.Locations) + .Distinct(StringComparer.OrdinalIgnoreCase) + .Select(i => new DirectoryInfo(i)) + .ToList(); + + if (paths.SelectMany(i => i.EnumerateFiles("*.xml", SearchOption.AllDirectories)) + .Any()) + { + return XbmcMetadata; + } + + if (paths.SelectMany(i => i.EnumerateFiles("*.xml", SearchOption.AllDirectories)) + .Any(i => string.Equals(i.Name, "series.xml", StringComparison.OrdinalIgnoreCase) || string.Equals(i.Name, "movie.xml", StringComparison.OrdinalIgnoreCase))) + { + return MediaBrowserMetadata; + } } - - if (paths.SelectMany(i => i.EnumerateFiles("*.xml", SearchOption.AllDirectories)) - .Any(i => string.Equals(i.Name, "series.xml", StringComparison.OrdinalIgnoreCase) || string.Equals(i.Name, "movie.xml", StringComparison.OrdinalIgnoreCase))) + catch (Exception) { - return MediaBrowserMetadata; + } return XbmcMetadata; diff --git a/MediaBrowser.Api/Library/LibraryService.cs b/MediaBrowser.Api/Library/LibraryService.cs index 10a3117a1..34b930a6a 100644 --- a/MediaBrowser.Api/Library/LibraryService.cs +++ b/MediaBrowser.Api/Library/LibraryService.cs @@ -286,7 +286,7 @@ namespace MediaBrowser.Api.Library public void Post(PostUpdatedSeries request) { - + Task.Run(() => _libraryManager.ValidateMediaLibrary(new Progress<double>(), CancellationToken.None)); } public object Get(GetFile request) diff --git a/MediaBrowser.Api/MediaBrowser.Api.csproj b/MediaBrowser.Api/MediaBrowser.Api.csproj index 9e516f463..5cb9ebb1b 100644 --- a/MediaBrowser.Api/MediaBrowser.Api.csproj +++ b/MediaBrowser.Api/MediaBrowser.Api.csproj @@ -49,6 +49,9 @@ <RunPostBuildEvent>Always</RunPostBuildEvent> </PropertyGroup> <ItemGroup> + <Reference Include="MoreLinq"> + <HintPath>..\packages\morelinq.1.0.16006\lib\net35\MoreLinq.dll</HintPath> + </Reference> <Reference Include="System" /> <Reference Include="System.Core" /> <Reference Include="Microsoft.CSharp" /> @@ -161,7 +164,6 @@ <ItemGroup> <None Include="packages.config" /> </ItemGroup> - <ItemGroup /> <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> <PropertyGroup> <PostBuildEvent> diff --git a/MediaBrowser.Api/Playback/BaseStreamingService.cs b/MediaBrowser.Api/Playback/BaseStreamingService.cs index 162c57b91..b965bf6f1 100644 --- a/MediaBrowser.Api/Playback/BaseStreamingService.cs +++ b/MediaBrowser.Api/Playback/BaseStreamingService.cs @@ -1193,13 +1193,13 @@ namespace MediaBrowser.Api.Playback return state.VideoRequest.Framerate.Value; } - var maxrate = state.VideoRequest.MaxFramerate ?? 23.97602; + var maxrate = state.VideoRequest.MaxFramerate; - if (state.VideoStream != null) + if (maxrate.HasValue && state.VideoStream != null) { var contentRate = state.VideoStream.AverageFrameRate ?? state.VideoStream.RealFrameRate; - if (contentRate.HasValue && contentRate.Value > maxrate) + if (contentRate.HasValue && contentRate.Value > maxrate.Value) { return maxrate; } diff --git a/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs b/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs index 88092901c..134c28524 100644 --- a/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs +++ b/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs @@ -1,4 +1,5 @@ -using MediaBrowser.Common.IO; +using MediaBrowser.Common.Extensions; +using MediaBrowser.Common.IO; using MediaBrowser.Controller.Channels; using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Dlna; @@ -385,17 +386,19 @@ namespace MediaBrowser.Api.Playback.Hls if (EnableAdaptiveBitrateStreaming(state)) { - //var requestedVideoBitrate = state.VideoRequest.VideoBitRate.Value; + var requestedVideoBitrate = state.VideoRequest.VideoBitRate.Value; - //// By default, vary by just 200k - //var variation = GetBitrateVariation(totalBitrate); + // By default, vary by just 200k + var variation = GetBitrateVariation(totalBitrate); - //var newBitrate = totalBitrate - variation; - //AppendPlaylist(builder, playlistUrl.Replace(requestedVideoBitrate.ToString(UsCulture), (requestedVideoBitrate - variation).ToString(UsCulture)), newBitrate, subtitleGroup); + var newBitrate = totalBitrate - variation; + var variantUrl = ReplaceBitrate(playlistUrl, requestedVideoBitrate, (requestedVideoBitrate - variation)); + AppendPlaylist(builder, variantUrl, newBitrate, subtitleGroup); - //variation *= 2; - //newBitrate = totalBitrate - variation; - //AppendPlaylist(builder, playlistUrl.Replace(requestedVideoBitrate.ToString(UsCulture), (requestedVideoBitrate - variation).ToString(UsCulture)), newBitrate, subtitleGroup); + variation *= 2; + newBitrate = totalBitrate - variation; + variantUrl = ReplaceBitrate(playlistUrl, requestedVideoBitrate, (requestedVideoBitrate - variation)); + AppendPlaylist(builder, variantUrl, newBitrate, subtitleGroup); } if (!string.IsNullOrWhiteSpace(subtitleGroup)) @@ -406,6 +409,14 @@ namespace MediaBrowser.Api.Playback.Hls return builder.ToString(); } + private string ReplaceBitrate(string url, int oldValue, int newValue) + { + return url.Replace( + "videobitrate=" + oldValue.ToString(UsCulture), + "videobitrate=" + newValue.ToString(UsCulture), + StringComparison.OrdinalIgnoreCase); + } + private void AddSubtitles(StreamState state, IEnumerable<MediaStream> subtitles, StringBuilder builder) { var selectedIndex = state.SubtitleStream == null ? (int?)null : state.SubtitleStream.Index; @@ -470,8 +481,8 @@ namespace MediaBrowser.Api.Playback.Hls private int GetBitrateVariation(int bitrate) { - // By default, vary by just 100k - var variation = 100000; + // By default, vary by just 50k + var variation = 50000; if (bitrate >= 10000000) { @@ -497,6 +508,10 @@ namespace MediaBrowser.Api.Playback.Hls { variation = 200000; } + else if (bitrate >= 400000) + { + variation = 100000; + } return variation; } diff --git a/MediaBrowser.Api/PlaylistService.cs b/MediaBrowser.Api/PlaylistService.cs index c6a4bb20c..5f4ced12e 100644 --- a/MediaBrowser.Api/PlaylistService.cs +++ b/MediaBrowser.Api/PlaylistService.cs @@ -7,7 +7,6 @@ using MediaBrowser.Model.Playlists; using MediaBrowser.Model.Querying; using ServiceStack; using System; -using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; @@ -24,6 +23,9 @@ namespace MediaBrowser.Api [ApiMember(Name = "UserId", Description = "User Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "GET")] public string UserId { get; set; } + + [ApiMember(Name = "MediaType", Description = "The playlist media type", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")] + public string MediaType { get; set; } } [Route("/Playlists/{Id}/Items", "POST", Summary = "Adds items to a playlist")] @@ -34,6 +36,13 @@ namespace MediaBrowser.Api [ApiMember(Name = "Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "POST")] public string Id { get; set; } + + /// <summary> + /// Gets or sets the user id. + /// </summary> + /// <value>The user id.</value> + [ApiMember(Name = "UserId", Description = "User Id", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")] + public string UserId { get; set; } } [Route("/Playlists/{Id}/Items", "DELETE", Summary = "Removes items from a playlist")] @@ -56,8 +65,8 @@ namespace MediaBrowser.Api /// Gets or sets the user id. /// </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; } + [ApiMember(Name = "UserId", Description = "User Id", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")] + public string UserId { get; set; } /// <summary> /// Skips over a given number of items within the results. Use for paging. @@ -99,25 +108,21 @@ namespace MediaBrowser.Api public async Task<object> Post(CreatePlaylist request) { - var item = await _playlistManager.CreatePlaylist(new PlaylistCreationOptions + var result = await _playlistManager.CreatePlaylist(new PlaylistCreationRequest { Name = request.Name, ItemIdList = (request.Ids ?? string.Empty).Split(',').Where(i => !string.IsNullOrWhiteSpace(i)).ToList(), - UserId = request.UserId + UserId = request.UserId, + MediaType = request.MediaType }).ConfigureAwait(false); - var dto = _dtoService.GetBaseItemDto(item, new List<ItemFields>()); - - return ToOptimizedResult(new PlaylistCreationResult - { - Id = dto.Id - }); + return ToOptimizedResult(result); } public void Post(AddToPlaylist request) { - var task = _playlistManager.AddToPlaylist(request.Id, request.Ids.Split(',')); + var task = _playlistManager.AddToPlaylist(request.Id, request.Ids.Split(','), request.UserId); Task.WaitAll(task); } @@ -132,7 +137,7 @@ namespace MediaBrowser.Api public object Get(GetPlaylistItems request) { var playlist = (Playlist)_libraryManager.GetItemById(request.Id); - var user = request.UserId.HasValue ? _userManager.GetUserById(request.UserId.Value) : null; + var user = !string.IsNullOrWhiteSpace(request.UserId) ? _userManager.GetUserById(new Guid(request.UserId)) : null; var items = playlist.GetManageableItems().ToArray(); diff --git a/MediaBrowser.Api/Subtitles/SubtitleService.cs b/MediaBrowser.Api/Subtitles/SubtitleService.cs index dc5799239..6e2882319 100644 --- a/MediaBrowser.Api/Subtitles/SubtitleService.cs +++ b/MediaBrowser.Api/Subtitles/SubtitleService.cs @@ -174,12 +174,16 @@ namespace MediaBrowser.Api.Subtitles } builder.AppendLine("#EXT-X-ENDLIST"); - + return ResultFactory.GetResult(builder.ToString(), Common.Net.MimeTypes.GetMimeType("playlist.m3u8"), new Dictionary<string, string>()); } public object Get(GetSubtitle request) { + if (string.Equals(request.Format, "js", StringComparison.OrdinalIgnoreCase)) + { + request.Format = "json"; + } if (string.IsNullOrEmpty(request.Format)) { var item = (Video)_libraryManager.GetItemById(new Guid(request.Id)); diff --git a/MediaBrowser.Api/System/SystemService.cs b/MediaBrowser.Api/System/SystemService.cs index 3913275ee..cb9d01956 100644 --- a/MediaBrowser.Api/System/SystemService.cs +++ b/MediaBrowser.Api/System/SystemService.cs @@ -1,5 +1,6 @@ using MediaBrowser.Common.Configuration; using MediaBrowser.Common.IO; +using MediaBrowser.Common.Net; using MediaBrowser.Controller; using MediaBrowser.Controller.Net; using MediaBrowser.Model.System; @@ -49,6 +50,13 @@ namespace MediaBrowser.Api.System { } + [Route("/System/Endpoint", "GET", Summary = "Gets information about the request endpoint")] + [Authenticated] + public class GetEndpointInfo : IReturn<EndpointInfo> + { + public string Endpoint { get; set; } + } + [Route("/System/Logs/Log", "GET", Summary = "Gets a log file")] public class GetLogFile { @@ -68,6 +76,8 @@ namespace MediaBrowser.Api.System private readonly IApplicationPaths _appPaths; private readonly IFileSystem _fileSystem; + private readonly INetworkManager _network; + /// <summary> /// Initializes a new instance of the <see cref="SystemService" /> class. /// </summary> @@ -75,11 +85,12 @@ namespace MediaBrowser.Api.System /// <param name="appPaths">The application paths.</param> /// <param name="fileSystem">The file system.</param> /// <exception cref="ArgumentNullException">jsonSerializer</exception> - public SystemService(IServerApplicationHost appHost, IApplicationPaths appPaths, IFileSystem fileSystem) + public SystemService(IServerApplicationHost appHost, IApplicationPaths appPaths, IFileSystem fileSystem, INetworkManager network) { _appHost = appHost; _appPaths = appPaths; _fileSystem = fileSystem; + _network = network; } public object Get(GetServerLogs request) @@ -174,5 +185,19 @@ namespace MediaBrowser.Api.System }); } + public object Get(GetEndpointInfo request) + { + return ToOptimizedResult(new EndpointInfo + { + IsLocal = Request.IsLocal, + IsInNetwork = _network.IsInLocalNetwork(request.Endpoint ?? Request.RemoteIp) + }); + } + } + + public class EndpointInfo + { + public bool IsLocal { get; set; } + public bool IsInNetwork { get; set; } } } |
