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}{0}>", 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