From 608ebf4829e7e394170bb2dec8a33c83600e9c08 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Sat, 28 Jun 2014 15:35:30 -0400 Subject: [PATCH] update video player layout --- MediaBrowser.Api/ApiEntryPoint.cs | 37 ++++++ .../Playback/BaseStreamingService.cs | 109 ++++++++++++------ .../Playback/Hls/BaseHlsService.cs | 2 +- MediaBrowser.Api/Playback/StreamRequest.cs | 2 +- MediaBrowser.Api/Playback/StreamState.cs | 4 + .../UserLibrary/ArtistsService.cs | 4 +- .../UserLibrary/GameGenresService.cs | 4 +- MediaBrowser.Api/UserLibrary/GenresService.cs | 4 +- .../UserLibrary/MusicGenresService.cs | 4 +- .../UserLibrary/PersonsService.cs | 4 +- .../UserLibrary/StudiosService.cs | 4 +- MediaBrowser.Api/UserLibrary/YearsService.cs | 4 +- MediaBrowser.Controller/Dto/IDtoService.cs | 10 -- .../LiveTv/LiveTvChannel.cs | 4 +- MediaBrowser.Dlna/PlayTo/Device.cs | 28 +---- MediaBrowser.Dlna/PlayTo/TransportCommands.cs | 6 +- MediaBrowser.Model/Dto/ChapterInfoDto.cs | 3 +- .../Dto/DtoService.cs | 40 +++++-- .../HttpServer/LoggerUtils.cs | 5 +- .../Api/DashboardService.cs | 1 - .../MediaBrowser.WebDashboard.csproj | 3 - 21 files changed, 167 insertions(+), 115 deletions(-) diff --git a/MediaBrowser.Api/ApiEntryPoint.cs b/MediaBrowser.Api/ApiEntryPoint.cs index 154966240f..5775546108 100644 --- a/MediaBrowser.Api/ApiEntryPoint.cs +++ b/MediaBrowser.Api/ApiEntryPoint.cs @@ -324,6 +324,35 @@ namespace MediaBrowser.Api } } + /// + /// Kills the transcoding jobs. + /// + /// The device identifier. + /// The output path. + /// The delete mode. + /// deviceId + internal void KillTranscodingJobs(string deviceId, string outputPath, FileDeleteMode deleteMode) + { + if (string.IsNullOrEmpty(deviceId)) + { + throw new ArgumentNullException("deviceId"); + } + + var jobs = new List(); + + lock (_activeTranscodingJobs) + { + // This is really only needed for HLS. + // Progressive streams can stop on their own reliably + jobs.AddRange(_activeTranscodingJobs.Where(i => string.Equals(deviceId, i.DeviceId, StringComparison.OrdinalIgnoreCase) && string.Equals(outputPath, i.Path, StringComparison.OrdinalIgnoreCase))); + } + + foreach (var job in jobs) + { + KillTranscodingJob(job, deleteMode); + } + } + /// /// Kills the transcoding job. /// @@ -443,6 +472,8 @@ namespace MediaBrowser.Api .Where(f => f.IndexOf(name, StringComparison.OrdinalIgnoreCase) != -1) .ToList(); + Exception e = null; + foreach (var file in filesToDelete) { try @@ -452,9 +483,15 @@ namespace MediaBrowser.Api } catch (IOException ex) { + e = ex; Logger.ErrorException("Error deleting HLS file {0}", ex, file); } } + + if (e != null) + { + throw e; + } } } diff --git a/MediaBrowser.Api/Playback/BaseStreamingService.cs b/MediaBrowser.Api/Playback/BaseStreamingService.cs index 235675b983..3cb7b914ad 100644 --- a/MediaBrowser.Api/Playback/BaseStreamingService.cs +++ b/MediaBrowser.Api/Playback/BaseStreamingService.cs @@ -123,7 +123,11 @@ namespace MediaBrowser.Api.Playback var outputFileExtension = GetOutputFileExtension(state); - return Path.Combine(folder, GetCommandLineArguments("dummy\\dummy", state, false).GetMD5() + (outputFileExtension ?? string.Empty).ToLower()); + var data = GetCommandLineArguments("dummy\\dummy", state, false); + + data += "-" + (state.Request.DeviceId ?? string.Empty); + + return Path.Combine(folder, data.GetMD5().ToString("N") + (outputFileExtension ?? string.Empty).ToLower()); } protected readonly CultureInfo UsCulture = new CultureInfo("en-US"); @@ -772,7 +776,7 @@ namespace MediaBrowser.Api.Playback /// /// The state. /// System.String. - protected string GetInputArgument(StreamState state) + protected virtual string GetInputArgument(StreamState state) { var protocol = state.InputProtocol; @@ -789,6 +793,58 @@ namespace MediaBrowser.Api.Playback return MediaEncoder.GetInputArgument(inputPath, protocol); } + private async Task AcquireResources(StreamState state, CancellationTokenSource cancellationTokenSource) + { + if (state.VideoType == VideoType.Iso && state.IsoType.HasValue && IsoManager.CanMount(state.MediaPath)) + { + state.IsoMount = await IsoManager.Mount(state.MediaPath, cancellationTokenSource.Token).ConfigureAwait(false); + } + + if (string.IsNullOrEmpty(state.MediaPath)) + { + if (string.Equals(state.ItemType, typeof(LiveTvChannel).Name)) + { + var streamInfo = await LiveTvManager.GetChannelStream(state.Request.Id, cancellationTokenSource.Token).ConfigureAwait(false); + + state.LiveTvStreamId = streamInfo.Id; + + if (!string.IsNullOrEmpty(streamInfo.Path)) + { + state.MediaPath = streamInfo.Path; + state.InputProtocol = MediaProtocol.File; + + await Task.Delay(1000, cancellationTokenSource.Token).ConfigureAwait(false); + } + else if (!string.IsNullOrEmpty(streamInfo.Url)) + { + state.MediaPath = streamInfo.Url; + state.InputProtocol = MediaProtocol.Http; + } + } + + else if (string.Equals(state.ItemType, typeof(LiveTvVideoRecording).Name) || + string.Equals(state.ItemType, typeof(LiveTvAudioRecording).Name)) + { + var streamInfo = await LiveTvManager.GetRecordingStream(state.Request.Id, cancellationTokenSource.Token).ConfigureAwait(false); + + state.LiveTvStreamId = streamInfo.Id; + + if (!string.IsNullOrEmpty(streamInfo.Path)) + { + state.MediaPath = streamInfo.Path; + state.InputProtocol = MediaProtocol.File; + + await Task.Delay(1000, cancellationTokenSource.Token).ConfigureAwait(false); + } + else if (!string.IsNullOrEmpty(streamInfo.Url)) + { + state.MediaPath = streamInfo.Url; + state.InputProtocol = MediaProtocol.Http; + } + } + } + } + /// /// Starts the FFMPEG. /// @@ -806,10 +862,7 @@ namespace MediaBrowser.Api.Playback Directory.CreateDirectory(Path.GetDirectoryName(outputPath)); - if (state.VideoType == VideoType.Iso && state.IsoType.HasValue && IsoManager.CanMount(state.MediaPath)) - { - state.IsoMount = await IsoManager.Mount(state.MediaPath, cancellationTokenSource.Token).ConfigureAwait(false); - } + await AcquireResources(state, cancellationTokenSource).ConfigureAwait(false); var commandLineArgs = GetCommandLineArguments(outputPath, state, true); @@ -1363,6 +1416,8 @@ namespace MediaBrowser.Api.Playback List mediaStreams = null; + state.ItemType = item.GetType().Name; + if (item is ILiveTvRecording) { var recording = await LiveTvManager.GetInternalRecording(request.Id, cancellationToken).ConfigureAwait(false); @@ -1379,16 +1434,8 @@ namespace MediaBrowser.Api.Playback mediaStreams = source.MediaStreams; - if (string.IsNullOrWhiteSpace(path) && string.IsNullOrWhiteSpace(mediaUrl)) - { - var streamInfo = await LiveTvManager.GetRecordingStream(request.Id, cancellationToken).ConfigureAwait(false); - - state.LiveTvStreamId = streamInfo.Id; - mediaStreams = streamInfo.MediaStreams; - - path = streamInfo.Path; - mediaUrl = streamInfo.Url; - } + // Just to prevent this from being null and causing other methods to fail + state.MediaPath = string.Empty; if (!string.IsNullOrEmpty(path)) { @@ -1421,30 +1468,16 @@ namespace MediaBrowser.Api.Playback state.VideoType = VideoType.VideoFile; state.IsInputVideo = string.Equals(channel.MediaType, MediaType.Video, StringComparison.OrdinalIgnoreCase); - - var streamInfo = await LiveTvManager.GetChannelStream(request.Id, cancellationToken).ConfigureAwait(false); - - state.LiveTvStreamId = streamInfo.Id; - mediaStreams = streamInfo.MediaStreams; - - if (!string.IsNullOrEmpty(streamInfo.Path)) - { - state.MediaPath = streamInfo.Path; - state.InputProtocol = MediaProtocol.File; - - await Task.Delay(1000, cancellationToken).ConfigureAwait(false); - } - else if (!string.IsNullOrEmpty(streamInfo.Url)) - { - state.MediaPath = streamInfo.Url; - state.InputProtocol = MediaProtocol.Http; - } + mediaStreams = new List(); state.ReadInputAtNativeFramerate = true; state.OutputAudioSync = "1000"; state.DeInterlace = true; state.InputVideoSync = "-1"; state.InputAudioSync = "1"; + + // Just to prevent this from being null and causing other methods to fail + state.MediaPath = string.Empty; } else if (item is IChannelMediaItem) { @@ -1500,7 +1533,7 @@ namespace MediaBrowser.Api.Playback AttachMediaStreamInfo(state, mediaStreams, videoRequest, url); - state.SegmentLength = state.ReadInputAtNativeFramerate ? 5 : 10; + state.SegmentLength = state.ReadInputAtNativeFramerate ? 5 : 7; state.HlsListSize = state.ReadInputAtNativeFramerate ? 100 : 1440; var container = Path.GetExtension(state.RequestedUrl); @@ -1928,7 +1961,7 @@ namespace MediaBrowser.Api.Playback videoRequest.Height = null; } - protected string GetInputModifier(StreamState state) + protected string GetInputModifier(StreamState state, bool genPts = true) { var inputModifier = string.Empty; @@ -1948,9 +1981,9 @@ namespace MediaBrowser.Api.Playback inputModifier += " " + GetFastSeekCommandLineParameter(state.Request); inputModifier = inputModifier.Trim(); - if (state.VideoRequest != null) + if (state.VideoRequest != null && genPts) { - inputModifier += " -fflags genpts"; + inputModifier += " -fflags +genpts"; } if (!string.IsNullOrEmpty(state.InputAudioSync)) diff --git a/MediaBrowser.Api/Playback/Hls/BaseHlsService.cs b/MediaBrowser.Api/Playback/Hls/BaseHlsService.cs index 8957d9fa1c..e41a331be9 100644 --- a/MediaBrowser.Api/Playback/Hls/BaseHlsService.cs +++ b/MediaBrowser.Api/Playback/Hls/BaseHlsService.cs @@ -272,7 +272,7 @@ namespace MediaBrowser.Api.Playback.Hls // If isEncoding is true we're actually starting ffmpeg var startNumberParam = isEncoding ? GetStartNumber(state).ToString(UsCulture) : "0"; - var args = string.Format("{0} {1} -i {2} -map_metadata -1 -threads {3} {4} {5} {6} -hls_time {7} -start_number {8} -hls_list_size {9} -y \"{10}\"", + var args = string.Format("{0} {1} -i {2} -map_metadata -1 -threads {3} {4} {5} -sc_threshold 0 {6} -hls_time {7} -start_number {8} -hls_list_size {9} -y \"{10}\"", itsOffset, inputModifier, GetInputArgument(state), diff --git a/MediaBrowser.Api/Playback/StreamRequest.cs b/MediaBrowser.Api/Playback/StreamRequest.cs index 0e4db45e31..dfb57ef0d7 100644 --- a/MediaBrowser.Api/Playback/StreamRequest.cs +++ b/MediaBrowser.Api/Playback/StreamRequest.cs @@ -33,7 +33,7 @@ namespace MediaBrowser.Api.Playback /// The start time ticks. [ApiMember(Name = "StartTimeTicks", Description = "Optional. Specify a starting offset, in ticks. 1 tick = 10000 ms", IsRequired = false, DataType = "int", ParameterType = "query", Verb = "GET")] public long? StartTimeTicks { get; set; } - + /// /// Gets or sets the audio bit rate. /// diff --git a/MediaBrowser.Api/Playback/StreamState.cs b/MediaBrowser.Api/Playback/StreamState.cs index 4737097cb4..c6f4544477 100644 --- a/MediaBrowser.Api/Playback/StreamState.cs +++ b/MediaBrowser.Api/Playback/StreamState.cs @@ -94,6 +94,10 @@ namespace MediaBrowser.Api.Playback public bool EnableMpegtsM2TsMode { get; set; } public TranscodeSeekInfo TranscodeSeekInfo { get; set; } + public long? EncodingDurationTicks { get; set; } + + public string ItemType { get; set; } + public string GetMimeType(string outputPath) { if (!string.IsNullOrEmpty(MimeType)) diff --git a/MediaBrowser.Api/UserLibrary/ArtistsService.cs b/MediaBrowser.Api/UserLibrary/ArtistsService.cs index 20b0f5fb1e..13027d30b5 100644 --- a/MediaBrowser.Api/UserLibrary/ArtistsService.cs +++ b/MediaBrowser.Api/UserLibrary/ArtistsService.cs @@ -88,10 +88,10 @@ namespace MediaBrowser.Api.UserLibrary { var user = UserManager.GetUserById(request.UserId.Value); - return DtoService.GetItemByNameDto(item, fields.ToList(), user); + return DtoService.GetBaseItemDto(item, fields.ToList(), user); } - return DtoService.GetItemByNameDto(item, fields.ToList()); + return DtoService.GetBaseItemDto(item, fields.ToList()); } /// diff --git a/MediaBrowser.Api/UserLibrary/GameGenresService.cs b/MediaBrowser.Api/UserLibrary/GameGenresService.cs index 34eadc3c35..b1379ad5d6 100644 --- a/MediaBrowser.Api/UserLibrary/GameGenresService.cs +++ b/MediaBrowser.Api/UserLibrary/GameGenresService.cs @@ -76,10 +76,10 @@ namespace MediaBrowser.Api.UserLibrary { var user = UserManager.GetUserById(request.UserId.Value); - return DtoService.GetItemByNameDto(item, fields.ToList(), user); + return DtoService.GetBaseItemDto(item, fields.ToList(), user); } - return DtoService.GetItemByNameDto(item, fields.ToList()); + return DtoService.GetBaseItemDto(item, fields.ToList()); } /// diff --git a/MediaBrowser.Api/UserLibrary/GenresService.cs b/MediaBrowser.Api/UserLibrary/GenresService.cs index 58dec11f61..68f0e21edc 100644 --- a/MediaBrowser.Api/UserLibrary/GenresService.cs +++ b/MediaBrowser.Api/UserLibrary/GenresService.cs @@ -81,10 +81,10 @@ namespace MediaBrowser.Api.UserLibrary { var user = UserManager.GetUserById(request.UserId.Value); - return DtoService.GetItemByNameDto(item, fields.ToList(), user); + return DtoService.GetBaseItemDto(item, fields.ToList(), user); } - return DtoService.GetItemByNameDto(item, fields.ToList()); + return DtoService.GetBaseItemDto(item, fields.ToList()); } /// diff --git a/MediaBrowser.Api/UserLibrary/MusicGenresService.cs b/MediaBrowser.Api/UserLibrary/MusicGenresService.cs index 9b7a941d84..538b165751 100644 --- a/MediaBrowser.Api/UserLibrary/MusicGenresService.cs +++ b/MediaBrowser.Api/UserLibrary/MusicGenresService.cs @@ -76,10 +76,10 @@ namespace MediaBrowser.Api.UserLibrary { var user = UserManager.GetUserById(request.UserId.Value); - return DtoService.GetItemByNameDto(item, fields.ToList(), user); + return DtoService.GetBaseItemDto(item, fields.ToList(), user); } - return DtoService.GetItemByNameDto(item, fields.ToList()); + return DtoService.GetBaseItemDto(item, fields.ToList()); } /// diff --git a/MediaBrowser.Api/UserLibrary/PersonsService.cs b/MediaBrowser.Api/UserLibrary/PersonsService.cs index f7ea4198d6..962effdeda 100644 --- a/MediaBrowser.Api/UserLibrary/PersonsService.cs +++ b/MediaBrowser.Api/UserLibrary/PersonsService.cs @@ -93,10 +93,10 @@ namespace MediaBrowser.Api.UserLibrary { var user = UserManager.GetUserById(request.UserId.Value); - return DtoService.GetItemByNameDto(item, fields.ToList(), user); + return DtoService.GetBaseItemDto(item, fields.ToList(), user); } - return DtoService.GetItemByNameDto(item, fields.ToList()); + return DtoService.GetBaseItemDto(item, fields.ToList()); } /// diff --git a/MediaBrowser.Api/UserLibrary/StudiosService.cs b/MediaBrowser.Api/UserLibrary/StudiosService.cs index 7eff5054be..4c38ba0d1f 100644 --- a/MediaBrowser.Api/UserLibrary/StudiosService.cs +++ b/MediaBrowser.Api/UserLibrary/StudiosService.cs @@ -78,10 +78,10 @@ namespace MediaBrowser.Api.UserLibrary { var user = UserManager.GetUserById(request.UserId.Value); - return DtoService.GetItemByNameDto(item, fields.ToList(), user); + return DtoService.GetBaseItemDto(item, fields.ToList(), user); } - return DtoService.GetItemByNameDto(item, fields.ToList()); + return DtoService.GetBaseItemDto(item, fields.ToList()); } /// diff --git a/MediaBrowser.Api/UserLibrary/YearsService.cs b/MediaBrowser.Api/UserLibrary/YearsService.cs index 8a3bc12b2b..4dda045c06 100644 --- a/MediaBrowser.Api/UserLibrary/YearsService.cs +++ b/MediaBrowser.Api/UserLibrary/YearsService.cs @@ -78,10 +78,10 @@ namespace MediaBrowser.Api.UserLibrary { var user = UserManager.GetUserById(request.UserId.Value); - return DtoService.GetItemByNameDto(item, fields.ToList(), user); + return DtoService.GetBaseItemDto(item, fields.ToList(), user); } - return DtoService.GetItemByNameDto(item, fields.ToList()); + return DtoService.GetBaseItemDto(item, fields.ToList()); } /// diff --git a/MediaBrowser.Controller/Dto/IDtoService.cs b/MediaBrowser.Controller/Dto/IDtoService.cs index 0482e140b0..f9d7cc21af 100644 --- a/MediaBrowser.Controller/Dto/IDtoService.cs +++ b/MediaBrowser.Controller/Dto/IDtoService.cs @@ -49,16 +49,6 @@ namespace MediaBrowser.Controller.Dto /// Task{BaseItemDto}. BaseItemDto GetBaseItemDto(BaseItem item, List fields, User user = null, BaseItem owner = null); - /// - /// Gets the item by name dto. - /// - /// The item. - /// The fields. - /// The user. - /// BaseItemDto. - BaseItemDto GetItemByNameDto(T item, List fields, User user = null) - where T : BaseItem, IItemByName; - /// /// Gets the chapter information dto. /// diff --git a/MediaBrowser.Controller/LiveTv/LiveTvChannel.cs b/MediaBrowser.Controller/LiveTv/LiveTvChannel.cs index 01fed68c8a..f2fa912cad 100644 --- a/MediaBrowser.Controller/LiveTv/LiveTvChannel.cs +++ b/MediaBrowser.Controller/LiveTv/LiveTvChannel.cs @@ -3,13 +3,13 @@ using MediaBrowser.Model.Configuration; using MediaBrowser.Model.Dto; using MediaBrowser.Model.Entities; using MediaBrowser.Model.LiveTv; +using MediaBrowser.Model.MediaInfo; using System.Collections.Generic; using System.Linq; -using MediaBrowser.Model.MediaInfo; namespace MediaBrowser.Controller.LiveTv { - public class LiveTvChannel : BaseItem, IItemByName, IHasMediaSources + public class LiveTvChannel : BaseItem, IHasMediaSources { /// /// Gets the user data key. diff --git a/MediaBrowser.Dlna/PlayTo/Device.cs b/MediaBrowser.Dlna/PlayTo/Device.cs index a5c3a6038a..0580740279 100644 --- a/MediaBrowser.Dlna/PlayTo/Device.cs +++ b/MediaBrowser.Dlna/PlayTo/Device.cs @@ -289,7 +289,8 @@ namespace MediaBrowser.Dlna.PlayTo throw new InvalidOperationException("Unable to find service"); } - await new SsdpHttpClient(_httpClient, _config).SendCommandAsync(Properties.BaseUrl, service, command.Name, AvCommands.BuildPost(command, service.ServiceType, url, dictionary), header) + var post = AvCommands.BuildPost(command, service.ServiceType, url, dictionary); + await new SsdpHttpClient(_httpClient, _config).SendCommandAsync(Properties.BaseUrl, service, command.Name, post, header) .ConfigureAwait(false); await Task.Delay(50).ConfigureAwait(false); @@ -315,31 +316,6 @@ namespace MediaBrowser.Dlna.PlayTo return SecurityElement.Escape(value); } - public async Task SetNextAvTransport(string value, string header, string metaData) - { - var command = AvCommands.ServiceActions.FirstOrDefault(c => c.Name == "SetNextAVTransportURI"); - if (command == null) - return; - - var dictionary = new Dictionary - { - {"NextURI", value}, - {"NextURIMetaData", CreateDidlMeta(metaData)} - }; - - var service = Properties.Services.FirstOrDefault(s => s.ServiceType == ServiceAvtransportType); - - if (service == null) - { - throw new InvalidOperationException("Unable to find service"); - } - - await new SsdpHttpClient(_httpClient, _config).SendCommandAsync(Properties.BaseUrl, service, command.Name, AvCommands.BuildPost(command, service.ServiceType, value, dictionary), header) - .ConfigureAwait(false); - - RestartTimer(); - } - public async Task SetPlay() { var command = AvCommands.ServiceActions.FirstOrDefault(c => c.Name == "Play"); diff --git a/MediaBrowser.Dlna/PlayTo/TransportCommands.cs b/MediaBrowser.Dlna/PlayTo/TransportCommands.cs index 13b9b6b189..31e25a3676 100644 --- a/MediaBrowser.Dlna/PlayTo/TransportCommands.cs +++ b/MediaBrowser.Dlna/PlayTo/TransportCommands.cs @@ -165,12 +165,12 @@ namespace MediaBrowser.Dlna.PlayTo private string BuildArgumentXml(Argument argument, string value, string commandParameter = "") { - var state = StateVariables.FirstOrDefault(a => a.Name == argument.RelatedStateVariable); + var state = StateVariables.FirstOrDefault(a => string.Equals(a.Name, argument.RelatedStateVariable, StringComparison.OrdinalIgnoreCase)); if (state != null) { - var sendValue = (state.AllowedValues.FirstOrDefault(a => a == commandParameter) ?? - state.AllowedValues.FirstOrDefault()) ?? + var sendValue = state.AllowedValues.FirstOrDefault(a => string.Equals(a, commandParameter, StringComparison.OrdinalIgnoreCase)) ?? + state.AllowedValues.FirstOrDefault() ?? value; return string.Format("<{0} xmlns:dt=\"urn:schemas-microsoft-com:datatypes\" dt:dt=\"{1}\">{2}", argument.Name, state.DataType ?? "string", sendValue); diff --git a/MediaBrowser.Model/Dto/ChapterInfoDto.cs b/MediaBrowser.Model/Dto/ChapterInfoDto.cs index 09dd2d5820..1ec4251697 100644 --- a/MediaBrowser.Model/Dto/ChapterInfoDto.cs +++ b/MediaBrowser.Model/Dto/ChapterInfoDto.cs @@ -1,5 +1,4 @@ -using System; -using System.ComponentModel; +using System.ComponentModel; using System.Diagnostics; using System.Runtime.Serialization; diff --git a/MediaBrowser.Server.Implementations/Dto/DtoService.cs b/MediaBrowser.Server.Implementations/Dto/DtoService.cs index 061898176b..6684c4efbe 100644 --- a/MediaBrowser.Server.Implementations/Dto/DtoService.cs +++ b/MediaBrowser.Server.Implementations/Dto/DtoService.cs @@ -62,6 +62,26 @@ namespace MediaBrowser.Server.Implementations.Dto /// Task{DtoBaseItem}. /// item public BaseItemDto GetBaseItemDto(BaseItem item, List fields, User user = null, BaseItem owner = null) + { + var byName = item as IItemByName; + + if (byName != null) + { + var libraryItems = user != null ? + user.RootFolder.GetRecursiveChildren(user) : + _libraryManager.RootFolder.RecursiveChildren; + + var dto = GetBaseItemDtoInternal(item, fields, user); + + SetItemByNameInfo(item, dto, byName.GetTaggedItems(libraryItems).ToList(), user); + + return dto; + } + + return GetBaseItemDtoInternal(item, fields, user, owner); + } + + private BaseItemDto GetBaseItemDtoInternal(BaseItem item, List fields, User user = null, BaseItem owner = null) { if (item == null) { @@ -141,20 +161,18 @@ namespace MediaBrowser.Server.Implementations.Dto return dto; } - public BaseItemDto GetItemByNameDto(T item, List fields, User user = null) - where T : BaseItem, IItemByName - { - var libraryItems = user != null ? user.RootFolder.GetRecursiveChildren(user) : - _libraryManager.RootFolder.RecursiveChildren; - - return GetItemByNameDto(item, fields, item.GetTaggedItems(libraryItems).ToList(), user); - } - public BaseItemDto GetItemByNameDto(T item, List fields, List taggedItems, User user = null) where T : BaseItem, IItemByName { - var dto = GetBaseItemDto(item, fields, user); + var dto = GetBaseItemDtoInternal(item, fields, user); + SetItemByNameInfo(item, dto, taggedItems, user); + + return dto; + } + + private void SetItemByNameInfo(BaseItem item, BaseItemDto dto, List taggedItems, User user = null) + { if (item is MusicArtist || item is MusicGenre) { dto.AlbumCount = taggedItems.Count(i => i is MusicAlbum); @@ -181,8 +199,6 @@ namespace MediaBrowser.Server.Implementations.Dto } dto.ChildCount = taggedItems.Count; - - return dto; } /// diff --git a/MediaBrowser.Server.Implementations/HttpServer/LoggerUtils.cs b/MediaBrowser.Server.Implementations/HttpServer/LoggerUtils.cs index 0f7e94ac59..3c8f86b1e4 100644 --- a/MediaBrowser.Server.Implementations/HttpServer/LoggerUtils.cs +++ b/MediaBrowser.Server.Implementations/HttpServer/LoggerUtils.cs @@ -1,4 +1,5 @@ -using MediaBrowser.Model.Logging; +using System.Globalization; +using MediaBrowser.Model.Logging; using System; using System.Linq; using System.Net; @@ -45,7 +46,7 @@ namespace MediaBrowser.Server.Implementations.HttpServer //log.AppendLine("Headers: " + string.Join(",", response.Headers.AllKeys.Select(k => k + "=" + response.Headers[k]))); - var responseTime = string.Format(". Response time: {0} ms", duration.TotalMilliseconds); + var responseTime = string.Format(". Response time: {0} ms. Content length: {1} bytes.", duration.TotalMilliseconds, response.ContentLength64.ToString(CultureInfo.InvariantCulture)); var msg = "HTTP Response " + statusCode + " to " + endPoint + responseTime; diff --git a/MediaBrowser.WebDashboard/Api/DashboardService.cs b/MediaBrowser.WebDashboard/Api/DashboardService.cs index 40a9d8ed67..acdbc9d65f 100644 --- a/MediaBrowser.WebDashboard/Api/DashboardService.cs +++ b/MediaBrowser.WebDashboard/Api/DashboardService.cs @@ -668,7 +668,6 @@ namespace MediaBrowser.WebDashboard.Api { "site.css", "chromecast.css", - "contextmenu.css", "mediaplayer.css", "mediaplayer-video.css", "librarymenu.css", diff --git a/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj b/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj index 1ae22d49ef..be05261b7b 100644 --- a/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj +++ b/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj @@ -113,9 +113,6 @@ PreserveNewest - - PreserveNewest - PreserveNewest