Merge pull request #1100 from MediaBrowser/dev

3.0.5607.2
This commit is contained in:
Luke 2015-05-12 10:55:26 -04:00
commit 033919685a
51 changed files with 326 additions and 257 deletions

View File

@ -57,6 +57,7 @@
<Compile Include="GDI\UnplayedCountIndicator.cs" /> <Compile Include="GDI\UnplayedCountIndicator.cs" />
<Compile Include="IImageEncoder.cs" /> <Compile Include="IImageEncoder.cs" />
<Compile Include="Common\ImageHeader.cs" /> <Compile Include="Common\ImageHeader.cs" />
<Compile Include="ImageHelpers.cs" />
<Compile Include="ImageMagick\ImageMagickEncoder.cs" /> <Compile Include="ImageMagick\ImageMagickEncoder.cs" />
<Compile Include="ImageMagick\StripCollageBuilder.cs" /> <Compile Include="ImageMagick\StripCollageBuilder.cs" />
<Compile Include="ImageProcessor.cs" /> <Compile Include="ImageProcessor.cs" />

View File

@ -1,11 +1,9 @@
using Emby.Drawing.ImageMagick; using MediaBrowser.Common.IO;
using MediaBrowser.Common.IO;
using System.Collections.Generic; using System.Collections.Generic;
using System.Drawing; using System.Drawing;
using System.Drawing.Drawing2D; using System.Drawing.Drawing2D;
using System.Drawing.Imaging; using System.Drawing.Imaging;
using System.IO; using System.IO;
using System.Linq;
namespace Emby.Drawing.GDI namespace Emby.Drawing.GDI
{ {
@ -18,10 +16,10 @@ namespace Emby.Drawing.GDI
int height) int height)
{ {
const int numStrips = 4; const int numStrips = 4;
files = StripCollageBuilder.ProjectPaths(files, numStrips).ToList(); files = ImageHelpers.ProjectPaths(files, numStrips);
const int rows = 1; const int rows = 1;
int cols = numStrips; int cols = numStrips;
int cellWidth = 2 * (width / 3); int cellWidth = 2 * (width / 3);
int cellHeight = height; int cellHeight = height;
@ -76,7 +74,7 @@ namespace Emby.Drawing.GDI
int width, int width,
int height) int height)
{ {
files = StripCollageBuilder.ProjectPaths(files, 4).ToList(); files = ImageHelpers.ProjectPaths(files, 4);
const int rows = 2; const int rows = 2;
const int cols = 2; const int cols = 2;

View File

@ -21,6 +21,8 @@ namespace Emby.Drawing.GDI
{ {
_fileSystem = fileSystem; _fileSystem = fileSystem;
_logger = logger; _logger = logger;
_logger.Info("GDI image processor initialized");
} }
public string[] SupportedInputFormats public string[] SupportedInputFormats

View File

@ -0,0 +1,43 @@
using System;
using System.Collections.Generic;
using System.Linq;
namespace Emby.Drawing
{
internal static class ImageHelpers
{
internal static List<string> ProjectPaths(List<string> paths, int count)
{
if (count <= 0)
{
throw new ArgumentOutOfRangeException("count");
}
if (paths.Count == 0)
{
throw new ArgumentOutOfRangeException("paths");
}
var list = new List<string>();
AddToList(list, paths, count);
return list.Take(count).ToList();
}
private static void AddToList(List<string> list, List<string> paths, int count)
{
while (list.Count < count)
{
foreach (var path in paths)
{
list.Add(path);
if (list.Count >= count)
{
return;
}
}
}
}
}
}

View File

@ -1,4 +1,5 @@
using ImageMagickSharp; using System.Linq;
using ImageMagickSharp;
using MediaBrowser.Common.Configuration; using MediaBrowser.Common.Configuration;
using MediaBrowser.Controller.Drawing; using MediaBrowser.Controller.Drawing;
using MediaBrowser.Model.Drawing; using MediaBrowser.Model.Drawing;
@ -195,15 +196,15 @@ namespace Emby.Drawing.ImageMagick
if (ratio >= 1.4) if (ratio >= 1.4)
{ {
new StripCollageBuilder(_appPaths).BuildThumbCollage(options.InputPaths, options.OutputPath, options.Width, options.Height, options.Text); new StripCollageBuilder(_appPaths).BuildThumbCollage(options.InputPaths.ToList(), options.OutputPath, options.Width, options.Height, options.Text);
} }
else if (ratio >= .9) else if (ratio >= .9)
{ {
new StripCollageBuilder(_appPaths).BuildSquareCollage(options.InputPaths, options.OutputPath, options.Width, options.Height, options.Text); new StripCollageBuilder(_appPaths).BuildSquareCollage(options.InputPaths.ToList(), options.OutputPath, options.Width, options.Height, options.Text);
} }
else else
{ {
new StripCollageBuilder(_appPaths).BuildPosterCollage(options.InputPaths, options.OutputPath, options.Width, options.Height, options.Text); new StripCollageBuilder(_appPaths).BuildPosterCollage(options.InputPaths.ToList(), options.OutputPath, options.Width, options.Height, options.Text);
} }
} }

View File

@ -2,7 +2,6 @@
using MediaBrowser.Common.Configuration; using MediaBrowser.Common.Configuration;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq;
namespace Emby.Drawing.ImageMagick namespace Emby.Drawing.ImageMagick
{ {
@ -15,7 +14,7 @@ namespace Emby.Drawing.ImageMagick
_appPaths = appPaths; _appPaths = appPaths;
} }
public void BuildPosterCollage(IEnumerable<string> paths, string outputPath, int width, int height, string text) public void BuildPosterCollage(List<string> paths, string outputPath, int width, int height, string text)
{ {
if (!string.IsNullOrWhiteSpace(text)) if (!string.IsNullOrWhiteSpace(text))
{ {
@ -33,7 +32,7 @@ namespace Emby.Drawing.ImageMagick
} }
} }
public void BuildSquareCollage(IEnumerable<string> paths, string outputPath, int width, int height, string text) public void BuildSquareCollage(List<string> paths, string outputPath, int width, int height, string text)
{ {
if (!string.IsNullOrWhiteSpace(text)) if (!string.IsNullOrWhiteSpace(text))
{ {
@ -51,7 +50,7 @@ namespace Emby.Drawing.ImageMagick
} }
} }
public void BuildThumbCollage(IEnumerable<string> paths, string outputPath, int width, int height, string text) public void BuildThumbCollage(List<string> paths, string outputPath, int width, int height, string text)
{ {
if (!string.IsNullOrWhiteSpace(text)) if (!string.IsNullOrWhiteSpace(text))
{ {
@ -69,31 +68,10 @@ namespace Emby.Drawing.ImageMagick
} }
} }
internal static string[] ProjectPaths(IEnumerable<string> paths, int count) private MagickWand BuildThumbCollageWandWithText(List<string> paths, string text, int width, int height)
{ {
var clone = paths.ToList(); var inputPaths = ImageHelpers.ProjectPaths(paths, 8);
var list = new List<string>(); using (var wandImages = new MagickWand(inputPaths.ToArray()))
while (list.Count < count)
{
foreach (var path in clone)
{
list.Add(path);
if (list.Count >= count)
{
break;
}
}
}
return list.Take(count).ToArray();
}
private MagickWand BuildThumbCollageWandWithText(IEnumerable<string> paths, string text, int width, int height)
{
var inputPaths = ProjectPaths(paths, 8);
using (var wandImages = new MagickWand(inputPaths))
{ {
var wand = new MagickWand(width, height); var wand = new MagickWand(width, height);
wand.OpenImage("gradient:#111111-#111111"); wand.OpenImage("gradient:#111111-#111111");
@ -165,10 +143,10 @@ namespace Emby.Drawing.ImageMagick
} }
} }
private MagickWand BuildPosterCollageWand(IEnumerable<string> paths, int width, int height) private MagickWand BuildPosterCollageWand(List<string> paths, int width, int height)
{ {
var inputPaths = ProjectPaths(paths, 4); var inputPaths = ImageHelpers.ProjectPaths(paths, 4);
using (var wandImages = new MagickWand(inputPaths)) using (var wandImages = new MagickWand(inputPaths.ToArray()))
{ {
var wand = new MagickWand(width, height); var wand = new MagickWand(width, height);
wand.OpenImage("gradient:#111111-#111111"); wand.OpenImage("gradient:#111111-#111111");
@ -230,10 +208,10 @@ namespace Emby.Drawing.ImageMagick
} }
} }
private MagickWand BuildPosterCollageWandWithText(IEnumerable<string> paths, string label, int width, int height) private MagickWand BuildPosterCollageWandWithText(List<string> paths, string label, int width, int height)
{ {
var inputPaths = ProjectPaths(paths, 4); var inputPaths = ImageHelpers.ProjectPaths(paths, 4);
using (var wandImages = new MagickWand(inputPaths)) using (var wandImages = new MagickWand(inputPaths.ToArray()))
{ {
var wand = new MagickWand(width, height); var wand = new MagickWand(width, height);
wand.OpenImage("gradient:#111111-#111111"); wand.OpenImage("gradient:#111111-#111111");
@ -305,10 +283,10 @@ namespace Emby.Drawing.ImageMagick
} }
} }
private MagickWand BuildThumbCollageWand(IEnumerable<string> paths, int width, int height) private MagickWand BuildThumbCollageWand(List<string> paths, int width, int height)
{ {
var inputPaths = ProjectPaths(paths, 8); var inputPaths = ImageHelpers.ProjectPaths(paths, 8);
using (var wandImages = new MagickWand(inputPaths)) using (var wandImages = new MagickWand(inputPaths.ToArray()))
{ {
var wand = new MagickWand(width, height); var wand = new MagickWand(width, height);
wand.OpenImage("gradient:#111111-#111111"); wand.OpenImage("gradient:#111111-#111111");
@ -370,10 +348,10 @@ namespace Emby.Drawing.ImageMagick
} }
} }
private MagickWand BuildSquareCollageWand(IEnumerable<string> paths, int width, int height) private MagickWand BuildSquareCollageWand(List<string> paths, int width, int height)
{ {
var inputPaths = ProjectPaths(paths, 4); var inputPaths = ImageHelpers.ProjectPaths(paths, 4);
using (var wandImages = new MagickWand(inputPaths)) using (var wandImages = new MagickWand(inputPaths.ToArray()))
{ {
var wand = new MagickWand(width, height); var wand = new MagickWand(width, height);
wand.OpenImage("gradient:#111111-#111111"); wand.OpenImage("gradient:#111111-#111111");
@ -435,10 +413,10 @@ namespace Emby.Drawing.ImageMagick
} }
} }
private MagickWand BuildSquareCollageWandWithText(IEnumerable<string> paths, string label, int width, int height) private MagickWand BuildSquareCollageWandWithText(List<string> paths, string label, int width, int height)
{ {
var inputPaths = ProjectPaths(paths, 4); var inputPaths = ImageHelpers.ProjectPaths(paths, 4);
using (var wandImages = new MagickWand(inputPaths)) using (var wandImages = new MagickWand(inputPaths.ToArray()))
{ {
var wand = new MagickWand(width, height); var wand = new MagickWand(width, height);
wand.OpenImage("gradient:#111111-#111111"); wand.OpenImage("gradient:#111111-#111111");

View File

@ -764,7 +764,11 @@ namespace Emby.Drawing
try try
{ {
_logger.Debug("Creating image collage and saving to {0}", options.OutputPath);
_imageEncoder.CreateImageCollage(options); _imageEncoder.CreateImageCollage(options);
_logger.Debug("Completed creation of image collage and saved to {0}", options.OutputPath);
} }
finally finally
{ {

View File

@ -346,7 +346,7 @@ namespace MediaBrowser.Api
// We can really reduce the timeout for apps that are using the newer api // We can really reduce the timeout for apps that are using the newer api
if (!string.IsNullOrWhiteSpace(job.PlaySessionId) && job.Type != TranscodingJobType.Progressive) if (!string.IsNullOrWhiteSpace(job.PlaySessionId) && job.Type != TranscodingJobType.Progressive)
{ {
timerDuration = 60000; timerDuration = 50000;
} }
job.PingTimeout = timerDuration; job.PingTimeout = timerDuration;

View File

@ -108,6 +108,9 @@ namespace MediaBrowser.Api.Dlna
private readonly IConnectionManager _connectionManager; private readonly IConnectionManager _connectionManager;
private readonly IMediaReceiverRegistrar _mediaReceiverRegistrar; private readonly IMediaReceiverRegistrar _mediaReceiverRegistrar;
// TODO: Add utf-8
private const string XMLContentType = "text/xml";
public DlnaServerService(IDlnaManager dlnaManager, IContentDirectory contentDirectory, IConnectionManager connectionManager, IMediaReceiverRegistrar mediaReceiverRegistrar) public DlnaServerService(IDlnaManager dlnaManager, IContentDirectory contentDirectory, IConnectionManager connectionManager, IMediaReceiverRegistrar mediaReceiverRegistrar)
{ {
_dlnaManager = dlnaManager; _dlnaManager = dlnaManager;
@ -122,49 +125,49 @@ namespace MediaBrowser.Api.Dlna
var serverAddress = url.Substring(0, url.IndexOf("/dlna/", StringComparison.OrdinalIgnoreCase)); var serverAddress = url.Substring(0, url.IndexOf("/dlna/", StringComparison.OrdinalIgnoreCase));
var xml = _dlnaManager.GetServerDescriptionXml(GetRequestHeaders(), request.UuId, serverAddress); var xml = _dlnaManager.GetServerDescriptionXml(GetRequestHeaders(), request.UuId, serverAddress);
return ResultFactory.GetResult(xml, "text/xml"); return ResultFactory.GetResult(xml, XMLContentType);
} }
public object Get(GetContentDirectory request) public object Get(GetContentDirectory request)
{ {
var xml = _contentDirectory.GetServiceXml(GetRequestHeaders()); var xml = _contentDirectory.GetServiceXml(GetRequestHeaders());
return ResultFactory.GetResult(xml, "text/xml"); return ResultFactory.GetResult(xml, XMLContentType);
} }
public object Get(GetMediaReceiverRegistrar request) public object Get(GetMediaReceiverRegistrar request)
{ {
var xml = _mediaReceiverRegistrar.GetServiceXml(GetRequestHeaders()); var xml = _mediaReceiverRegistrar.GetServiceXml(GetRequestHeaders());
return ResultFactory.GetResult(xml, "text/xml"); return ResultFactory.GetResult(xml, XMLContentType);
} }
public object Get(GetConnnectionManager request) public object Get(GetConnnectionManager request)
{ {
var xml = _connectionManager.GetServiceXml(GetRequestHeaders()); var xml = _connectionManager.GetServiceXml(GetRequestHeaders());
return ResultFactory.GetResult(xml, "text/xml"); return ResultFactory.GetResult(xml, XMLContentType);
} }
public async Task<object> Post(ProcessMediaReceiverRegistrarControlRequest request) public async Task<object> Post(ProcessMediaReceiverRegistrarControlRequest request)
{ {
var response = await PostAsync(request.RequestStream, _mediaReceiverRegistrar).ConfigureAwait(false); var response = await PostAsync(request.RequestStream, _mediaReceiverRegistrar).ConfigureAwait(false);
return ResultFactory.GetResult(response.Xml, "text/xml"); return ResultFactory.GetResult(response.Xml, XMLContentType);
} }
public async Task<object> Post(ProcessContentDirectoryControlRequest request) public async Task<object> Post(ProcessContentDirectoryControlRequest request)
{ {
var response = await PostAsync(request.RequestStream, _contentDirectory).ConfigureAwait(false); var response = await PostAsync(request.RequestStream, _contentDirectory).ConfigureAwait(false);
return ResultFactory.GetResult(response.Xml, "text/xml"); return ResultFactory.GetResult(response.Xml, XMLContentType);
} }
public async Task<object> Post(ProcessConnectionManagerControlRequest request) public async Task<object> Post(ProcessConnectionManagerControlRequest request)
{ {
var response = await PostAsync(request.RequestStream, _connectionManager).ConfigureAwait(false); var response = await PostAsync(request.RequestStream, _connectionManager).ConfigureAwait(false);
return ResultFactory.GetResult(response.Xml, "text/xml"); return ResultFactory.GetResult(response.Xml, XMLContentType);
} }
private async Task<ControlResponse> PostAsync(Stream requestStream, IUpnpService service) private async Task<ControlResponse> PostAsync(Stream requestStream, IUpnpService service)

View File

@ -12,7 +12,7 @@ namespace MediaBrowser.Controller.Dlna
public Dictionary<string, string> Headers { get; set; } public Dictionary<string, string> Headers { get; set; }
public IPAddress LocalIp { get; set; } public IPEndPoint LocalEndPoint { get; set; }
public byte[] Message { get; set; } public byte[] Message { get; set; }
public SsdpMessageEventArgs() public SsdpMessageEventArgs()

View File

@ -72,8 +72,6 @@ namespace MediaBrowser.Dlna.PlayTo
async void _deviceDiscovery_DeviceDiscovered(object sender, SsdpMessageEventArgs e) async void _deviceDiscovery_DeviceDiscovered(object sender, SsdpMessageEventArgs e)
{ {
var localIp = e.LocalIp;
string usn; string usn;
if (!e.Headers.TryGetValue("USN", out usn)) usn = string.Empty; if (!e.Headers.TryGetValue("USN", out usn)) usn = string.Empty;
@ -125,7 +123,7 @@ namespace MediaBrowser.Dlna.PlayTo
if (controller == null) if (controller == null)
{ {
var serverAddress = GetServerAddress(localIp); var serverAddress = GetServerAddress(e.LocalEndPoint.Address);
string accessToken = null; string accessToken = null;
sessionInfo.SessionController = controller = new PlayToController(sessionInfo, sessionInfo.SessionController = controller = new PlayToController(sessionInfo,

View File

@ -37,6 +37,7 @@ namespace MediaBrowser.Dlna.Profiles
MusicSyncBitrate = 128000; MusicSyncBitrate = 128000;
EnableAlbumArtInDidl = false; EnableAlbumArtInDidl = false;
EnableDlnaProtocol = true;
TranscodingProfiles = new[] TranscodingProfiles = new[]
{ {
@ -76,9 +77,6 @@ namespace MediaBrowser.Dlna.Profiles
Type = DlnaProfileType.Video Type = DlnaProfileType.Video
} }
}; };
AddXmlRootAttribute("xmlns", "urn:schemas-upnp-org:device-1-0");
AddXmlRootAttribute("xmlns:dlna", "urn:schemas-dlna-org:device-1-0");
} }
public void AddXmlRootAttribute(string name, string value) public void AddXmlRootAttribute(string name, string value)

View File

@ -14,22 +14,24 @@ namespace MediaBrowser.Dlna.Profiles
Name = "Xbox 360"; Name = "Xbox 360";
// Required according to above // Required according to above
ModelName = "Windows Media Player Sharing"; ModelName = "Windows Media Connect";
ModelNumber = "12.0"; ModelNumber = "12.0";
FriendlyName = "${HostName}: Emby:"; FriendlyName = "${HostName}: 1";
ModelUrl = "http://go.microsoft.com/fwlink/?LinkId=105926"; ModelUrl = "http://go.microsoft.com/fwlink/?LinkId=105926";
Manufacturer = "Microsoft Corporation"; Manufacturer = "Microsoft Corporation";
ManufacturerUrl = "http://www.microsoft.com"; ManufacturerUrl = "http://www.microsoft.com";
XDlnaDoc = "DMS-1.50"; XDlnaDoc = "DMS-1.50";
ModelDescription = null; ModelDescription = "Emby : UPnP Media Server";
ModelNumber = "001";
TimelineOffsetSeconds = 40; TimelineOffsetSeconds = 40;
RequiresPlainFolders = true; RequiresPlainFolders = true;
RequiresPlainVideoItems = true; RequiresPlainVideoItems = true;
EnableMSMediaReceiverRegistrar = true; EnableMSMediaReceiverRegistrar = true;
EnableDlnaProtocol = false;
Identification = new DeviceIdentification Identification = new DeviceIdentification
{ {
@ -312,9 +314,6 @@ namespace MediaBrowser.Dlna.Profiles
} }
} }
}; };
XmlRootAttributes = new XmlAttribute[] { };
AddXmlRootAttribute("xmlns", "urn:schemas-upnp-org:device-1-0");
} }
} }
} }

View File

@ -32,10 +32,10 @@
<RequiresPlainVideoItems>false</RequiresPlainVideoItems> <RequiresPlainVideoItems>false</RequiresPlainVideoItems>
<RequiresPlainFolders>false</RequiresPlainFolders> <RequiresPlainFolders>false</RequiresPlainFolders>
<EnableMSMediaReceiverRegistrar>false</EnableMSMediaReceiverRegistrar> <EnableMSMediaReceiverRegistrar>false</EnableMSMediaReceiverRegistrar>
<XmlRootAttributes> <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
<XmlAttribute name="xmlns" value="urn:schemas-upnp-org:device-1-0" /> <EnableDlnaProtocol>true</EnableDlnaProtocol>
<XmlAttribute name="xmlns:dlna" value="urn:schemas-dlna-org:device-1-0" /> <EnableUrlBase>false</EnableUrlBase>
</XmlRootAttributes> <XmlRootAttributes />
<DirectPlayProfiles> <DirectPlayProfiles>
<DirectPlayProfile container="avi,mpeg,mkv,ts,mp4,mov,m4v,asf,webm,ogg,ogv,iso" type="Video" /> <DirectPlayProfile container="avi,mpeg,mkv,ts,mp4,mov,m4v,asf,webm,ogg,ogv,iso" type="Video" />
<DirectPlayProfile container="mp3,flac,asf,off,oga,aac" type="Audio" /> <DirectPlayProfile container="mp3,flac,asf,off,oga,aac" type="Audio" />

View File

@ -26,10 +26,10 @@
<RequiresPlainVideoItems>false</RequiresPlainVideoItems> <RequiresPlainVideoItems>false</RequiresPlainVideoItems>
<RequiresPlainFolders>false</RequiresPlainFolders> <RequiresPlainFolders>false</RequiresPlainFolders>
<EnableMSMediaReceiverRegistrar>false</EnableMSMediaReceiverRegistrar> <EnableMSMediaReceiverRegistrar>false</EnableMSMediaReceiverRegistrar>
<XmlRootAttributes> <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
<XmlAttribute name="xmlns" value="urn:schemas-upnp-org:device-1-0" /> <EnableDlnaProtocol>true</EnableDlnaProtocol>
<XmlAttribute name="xmlns:dlna" value="urn:schemas-dlna-org:device-1-0" /> <EnableUrlBase>false</EnableUrlBase>
</XmlRootAttributes> <XmlRootAttributes />
<DirectPlayProfiles> <DirectPlayProfiles>
<DirectPlayProfile container="mp3,wma" type="Audio" /> <DirectPlayProfile container="mp3,wma" type="Audio" />
<DirectPlayProfile container="avi,mp4" type="Video" /> <DirectPlayProfile container="avi,mp4" type="Video" />

View File

@ -31,10 +31,10 @@
<RequiresPlainVideoItems>false</RequiresPlainVideoItems> <RequiresPlainVideoItems>false</RequiresPlainVideoItems>
<RequiresPlainFolders>false</RequiresPlainFolders> <RequiresPlainFolders>false</RequiresPlainFolders>
<EnableMSMediaReceiverRegistrar>false</EnableMSMediaReceiverRegistrar> <EnableMSMediaReceiverRegistrar>false</EnableMSMediaReceiverRegistrar>
<XmlRootAttributes> <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
<XmlAttribute name="xmlns" value="urn:schemas-upnp-org:device-1-0" /> <EnableDlnaProtocol>true</EnableDlnaProtocol>
<XmlAttribute name="xmlns:dlna" value="urn:schemas-dlna-org:device-1-0" /> <EnableUrlBase>false</EnableUrlBase>
</XmlRootAttributes> <XmlRootAttributes />
<DirectPlayProfiles> <DirectPlayProfiles>
<DirectPlayProfile container="mp3,flac,m4a,wma" type="Audio" /> <DirectPlayProfile container="mp3,flac,m4a,wma" type="Audio" />
</DirectPlayProfiles> </DirectPlayProfiles>

View File

@ -32,10 +32,10 @@
<RequiresPlainVideoItems>true</RequiresPlainVideoItems> <RequiresPlainVideoItems>true</RequiresPlainVideoItems>
<RequiresPlainFolders>true</RequiresPlainFolders> <RequiresPlainFolders>true</RequiresPlainFolders>
<EnableMSMediaReceiverRegistrar>false</EnableMSMediaReceiverRegistrar> <EnableMSMediaReceiverRegistrar>false</EnableMSMediaReceiverRegistrar>
<XmlRootAttributes> <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
<XmlAttribute name="xmlns" value="urn:schemas-upnp-org:device-1-0" /> <EnableDlnaProtocol>true</EnableDlnaProtocol>
<XmlAttribute name="xmlns:dlna" value="urn:schemas-dlna-org:device-1-0" /> <EnableUrlBase>false</EnableUrlBase>
</XmlRootAttributes> <XmlRootAttributes />
<DirectPlayProfiles> <DirectPlayProfiles>
<DirectPlayProfile container="mpeg" audioCodec="mp2" videoCodec="mpeg2video" type="Video" /> <DirectPlayProfile container="mpeg" audioCodec="mp2" videoCodec="mpeg2video" type="Video" />
<DirectPlayProfile container="jpeg,jpg" type="Photo" /> <DirectPlayProfile container="jpeg,jpg" type="Photo" />

View File

@ -33,10 +33,10 @@
<RequiresPlainVideoItems>false</RequiresPlainVideoItems> <RequiresPlainVideoItems>false</RequiresPlainVideoItems>
<RequiresPlainFolders>false</RequiresPlainFolders> <RequiresPlainFolders>false</RequiresPlainFolders>
<EnableMSMediaReceiverRegistrar>false</EnableMSMediaReceiverRegistrar> <EnableMSMediaReceiverRegistrar>false</EnableMSMediaReceiverRegistrar>
<XmlRootAttributes> <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
<XmlAttribute name="xmlns" value="urn:schemas-upnp-org:device-1-0" /> <EnableDlnaProtocol>true</EnableDlnaProtocol>
<XmlAttribute name="xmlns:dlna" value="urn:schemas-dlna-org:device-1-0" /> <EnableUrlBase>false</EnableUrlBase>
</XmlRootAttributes> <XmlRootAttributes />
<DirectPlayProfiles> <DirectPlayProfiles>
<DirectPlayProfile container="mp4,mkv,mpeg,ts" audioCodec="mp3,ac3,aac,he-aac,pcm" videoCodec="h264,mpeg2video" type="Video" /> <DirectPlayProfile container="mp4,mkv,mpeg,ts" audioCodec="mp3,ac3,aac,he-aac,pcm" videoCodec="h264,mpeg2video" type="Video" />
<DirectPlayProfile container="mp3" audioCodec="mp3" type="Audio" /> <DirectPlayProfile container="mp3" audioCodec="mp3" type="Audio" />

View File

@ -32,10 +32,10 @@
<RequiresPlainVideoItems>false</RequiresPlainVideoItems> <RequiresPlainVideoItems>false</RequiresPlainVideoItems>
<RequiresPlainFolders>false</RequiresPlainFolders> <RequiresPlainFolders>false</RequiresPlainFolders>
<EnableMSMediaReceiverRegistrar>false</EnableMSMediaReceiverRegistrar> <EnableMSMediaReceiverRegistrar>false</EnableMSMediaReceiverRegistrar>
<XmlRootAttributes> <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
<XmlAttribute name="xmlns" value="urn:schemas-upnp-org:device-1-0" /> <EnableDlnaProtocol>true</EnableDlnaProtocol>
<XmlAttribute name="xmlns:dlna" value="urn:schemas-dlna-org:device-1-0" /> <EnableUrlBase>false</EnableUrlBase>
</XmlRootAttributes> <XmlRootAttributes />
<DirectPlayProfiles> <DirectPlayProfiles>
<DirectPlayProfile container="ts" audioCodec="aac,ac3,mp3" videoCodec="h264" type="Video" /> <DirectPlayProfile container="ts" audioCodec="aac,ac3,mp3" videoCodec="h264" type="Video" />
<DirectPlayProfile container="mkv" audioCodec="aac,ac3,mp3" videoCodec="h264" type="Video" /> <DirectPlayProfile container="mkv" audioCodec="aac,ac3,mp3" videoCodec="h264" type="Video" />

View File

@ -30,10 +30,10 @@
<RequiresPlainVideoItems>false</RequiresPlainVideoItems> <RequiresPlainVideoItems>false</RequiresPlainVideoItems>
<RequiresPlainFolders>false</RequiresPlainFolders> <RequiresPlainFolders>false</RequiresPlainFolders>
<EnableMSMediaReceiverRegistrar>false</EnableMSMediaReceiverRegistrar> <EnableMSMediaReceiverRegistrar>false</EnableMSMediaReceiverRegistrar>
<XmlRootAttributes> <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
<XmlAttribute name="xmlns" value="urn:schemas-upnp-org:device-1-0" /> <EnableDlnaProtocol>true</EnableDlnaProtocol>
<XmlAttribute name="xmlns:dlna" value="urn:schemas-dlna-org:device-1-0" /> <EnableUrlBase>false</EnableUrlBase>
</XmlRootAttributes> <XmlRootAttributes />
<DirectPlayProfiles> <DirectPlayProfiles>
<DirectPlayProfile container="mp3,flac,m4a,wma" type="Audio" /> <DirectPlayProfile container="mp3,flac,m4a,wma" type="Audio" />
<DirectPlayProfile container="avi,mp4,mkv,ts" type="Video" /> <DirectPlayProfile container="avi,mp4,mkv,ts" type="Video" />

View File

@ -32,10 +32,10 @@
<RequiresPlainVideoItems>false</RequiresPlainVideoItems> <RequiresPlainVideoItems>false</RequiresPlainVideoItems>
<RequiresPlainFolders>false</RequiresPlainFolders> <RequiresPlainFolders>false</RequiresPlainFolders>
<EnableMSMediaReceiverRegistrar>false</EnableMSMediaReceiverRegistrar> <EnableMSMediaReceiverRegistrar>false</EnableMSMediaReceiverRegistrar>
<XmlRootAttributes> <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
<XmlAttribute name="xmlns" value="urn:schemas-upnp-org:device-1-0" /> <EnableDlnaProtocol>true</EnableDlnaProtocol>
<XmlAttribute name="xmlns:dlna" value="urn:schemas-dlna-org:device-1-0" /> <EnableUrlBase>false</EnableUrlBase>
</XmlRootAttributes> <XmlRootAttributes />
<DirectPlayProfiles> <DirectPlayProfiles>
<DirectPlayProfile container="mp3" audioCodec="mp2,mp3" type="Audio" /> <DirectPlayProfile container="mp3" audioCodec="mp2,mp3" type="Audio" />
<DirectPlayProfile container="mp4" audioCodec="mp4" type="Audio" /> <DirectPlayProfile container="mp4" audioCodec="mp4" type="Audio" />

View File

@ -33,9 +33,10 @@
<RequiresPlainVideoItems>false</RequiresPlainVideoItems> <RequiresPlainVideoItems>false</RequiresPlainVideoItems>
<RequiresPlainFolders>false</RequiresPlainFolders> <RequiresPlainFolders>false</RequiresPlainFolders>
<EnableMSMediaReceiverRegistrar>false</EnableMSMediaReceiverRegistrar> <EnableMSMediaReceiverRegistrar>false</EnableMSMediaReceiverRegistrar>
<IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
<EnableDlnaProtocol>true</EnableDlnaProtocol>
<EnableUrlBase>false</EnableUrlBase>
<XmlRootAttributes> <XmlRootAttributes>
<XmlAttribute name="xmlns" value="urn:schemas-upnp-org:device-1-0" />
<XmlAttribute name="xmlns:dlna" value="urn:schemas-dlna-org:device-1-0" />
<XmlAttribute name="xmlns:pv" value="http://www.pv.com/pvns/" /> <XmlAttribute name="xmlns:pv" value="http://www.pv.com/pvns/" />
</XmlRootAttributes> </XmlRootAttributes>
<DirectPlayProfiles> <DirectPlayProfiles>

View File

@ -26,10 +26,10 @@
<RequiresPlainVideoItems>false</RequiresPlainVideoItems> <RequiresPlainVideoItems>false</RequiresPlainVideoItems>
<RequiresPlainFolders>false</RequiresPlainFolders> <RequiresPlainFolders>false</RequiresPlainFolders>
<EnableMSMediaReceiverRegistrar>false</EnableMSMediaReceiverRegistrar> <EnableMSMediaReceiverRegistrar>false</EnableMSMediaReceiverRegistrar>
<XmlRootAttributes> <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
<XmlAttribute name="xmlns" value="urn:schemas-upnp-org:device-1-0" /> <EnableDlnaProtocol>true</EnableDlnaProtocol>
<XmlAttribute name="xmlns:dlna" value="urn:schemas-dlna-org:device-1-0" /> <EnableUrlBase>false</EnableUrlBase>
</XmlRootAttributes> <XmlRootAttributes />
<DirectPlayProfiles> <DirectPlayProfiles>
<DirectPlayProfile container="mp4,mov" audioCodec="aac" videoCodec="h264,mpeg4" type="Video" /> <DirectPlayProfile container="mp4,mov" audioCodec="aac" videoCodec="h264,mpeg4" type="Video" />
<DirectPlayProfile container="ts" audioCodec="aac,ac3,eac3,mp3,mp2,pcm" videoCodec="h264" type="Video" /> <DirectPlayProfile container="ts" audioCodec="aac,ac3,eac3,mp3,mp2,pcm" videoCodec="h264" type="Video" />

View File

@ -32,9 +32,10 @@
<RequiresPlainVideoItems>false</RequiresPlainVideoItems> <RequiresPlainVideoItems>false</RequiresPlainVideoItems>
<RequiresPlainFolders>false</RequiresPlainFolders> <RequiresPlainFolders>false</RequiresPlainFolders>
<EnableMSMediaReceiverRegistrar>false</EnableMSMediaReceiverRegistrar> <EnableMSMediaReceiverRegistrar>false</EnableMSMediaReceiverRegistrar>
<IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
<EnableDlnaProtocol>true</EnableDlnaProtocol>
<EnableUrlBase>false</EnableUrlBase>
<XmlRootAttributes> <XmlRootAttributes>
<XmlAttribute name="xmlns" value="urn:schemas-upnp-org:device-1-0" />
<XmlAttribute name="xmlns:dlna" value="urn:schemas-dlna-org:device-1-0" />
<XmlAttribute name="xmlns:sec" value="http://www.sec.co.kr/" /> <XmlAttribute name="xmlns:sec" value="http://www.sec.co.kr/" />
</XmlRootAttributes> </XmlRootAttributes>
<DirectPlayProfiles> <DirectPlayProfiles>

View File

@ -32,9 +32,10 @@
<RequiresPlainVideoItems>false</RequiresPlainVideoItems> <RequiresPlainVideoItems>false</RequiresPlainVideoItems>
<RequiresPlainFolders>false</RequiresPlainFolders> <RequiresPlainFolders>false</RequiresPlainFolders>
<EnableMSMediaReceiverRegistrar>false</EnableMSMediaReceiverRegistrar> <EnableMSMediaReceiverRegistrar>false</EnableMSMediaReceiverRegistrar>
<IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
<EnableDlnaProtocol>true</EnableDlnaProtocol>
<EnableUrlBase>false</EnableUrlBase>
<XmlRootAttributes> <XmlRootAttributes>
<XmlAttribute name="xmlns" value="urn:schemas-upnp-org:device-1-0" />
<XmlAttribute name="xmlns:dlna" value="urn:schemas-dlna-org:device-1-0" />
<XmlAttribute name="xmlns:av" value="urn:schemas-sony-com:av" /> <XmlAttribute name="xmlns:av" value="urn:schemas-sony-com:av" />
</XmlRootAttributes> </XmlRootAttributes>
<DirectPlayProfiles> <DirectPlayProfiles>

View File

@ -34,9 +34,10 @@
<RequiresPlainVideoItems>false</RequiresPlainVideoItems> <RequiresPlainVideoItems>false</RequiresPlainVideoItems>
<RequiresPlainFolders>false</RequiresPlainFolders> <RequiresPlainFolders>false</RequiresPlainFolders>
<EnableMSMediaReceiverRegistrar>false</EnableMSMediaReceiverRegistrar> <EnableMSMediaReceiverRegistrar>false</EnableMSMediaReceiverRegistrar>
<IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
<EnableDlnaProtocol>true</EnableDlnaProtocol>
<EnableUrlBase>false</EnableUrlBase>
<XmlRootAttributes> <XmlRootAttributes>
<XmlAttribute name="xmlns" value="urn:schemas-upnp-org:device-1-0" />
<XmlAttribute name="xmlns:dlna" value="urn:schemas-dlna-org:device-1-0" />
<XmlAttribute name="xmlns:av" value="urn:schemas-sony-com:av" /> <XmlAttribute name="xmlns:av" value="urn:schemas-sony-com:av" />
</XmlRootAttributes> </XmlRootAttributes>
<DirectPlayProfiles> <DirectPlayProfiles>

View File

@ -34,9 +34,10 @@
<RequiresPlainVideoItems>false</RequiresPlainVideoItems> <RequiresPlainVideoItems>false</RequiresPlainVideoItems>
<RequiresPlainFolders>false</RequiresPlainFolders> <RequiresPlainFolders>false</RequiresPlainFolders>
<EnableMSMediaReceiverRegistrar>false</EnableMSMediaReceiverRegistrar> <EnableMSMediaReceiverRegistrar>false</EnableMSMediaReceiverRegistrar>
<IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
<EnableDlnaProtocol>true</EnableDlnaProtocol>
<EnableUrlBase>false</EnableUrlBase>
<XmlRootAttributes> <XmlRootAttributes>
<XmlAttribute name="xmlns" value="urn:schemas-upnp-org:device-1-0" />
<XmlAttribute name="xmlns:dlna" value="urn:schemas-dlna-org:device-1-0" />
<XmlAttribute name="xmlns:av" value="urn:schemas-sony-com:av" /> <XmlAttribute name="xmlns:av" value="urn:schemas-sony-com:av" />
</XmlRootAttributes> </XmlRootAttributes>
<DirectPlayProfiles> <DirectPlayProfiles>

View File

@ -34,9 +34,10 @@
<RequiresPlainVideoItems>false</RequiresPlainVideoItems> <RequiresPlainVideoItems>false</RequiresPlainVideoItems>
<RequiresPlainFolders>false</RequiresPlainFolders> <RequiresPlainFolders>false</RequiresPlainFolders>
<EnableMSMediaReceiverRegistrar>false</EnableMSMediaReceiverRegistrar> <EnableMSMediaReceiverRegistrar>false</EnableMSMediaReceiverRegistrar>
<IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
<EnableDlnaProtocol>true</EnableDlnaProtocol>
<EnableUrlBase>false</EnableUrlBase>
<XmlRootAttributes> <XmlRootAttributes>
<XmlAttribute name="xmlns" value="urn:schemas-upnp-org:device-1-0" />
<XmlAttribute name="xmlns:dlna" value="urn:schemas-dlna-org:device-1-0" />
<XmlAttribute name="xmlns:av" value="urn:schemas-sony-com:av" /> <XmlAttribute name="xmlns:av" value="urn:schemas-sony-com:av" />
</XmlRootAttributes> </XmlRootAttributes>
<DirectPlayProfiles> <DirectPlayProfiles>

View File

@ -34,9 +34,10 @@
<RequiresPlainVideoItems>false</RequiresPlainVideoItems> <RequiresPlainVideoItems>false</RequiresPlainVideoItems>
<RequiresPlainFolders>false</RequiresPlainFolders> <RequiresPlainFolders>false</RequiresPlainFolders>
<EnableMSMediaReceiverRegistrar>false</EnableMSMediaReceiverRegistrar> <EnableMSMediaReceiverRegistrar>false</EnableMSMediaReceiverRegistrar>
<IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
<EnableDlnaProtocol>true</EnableDlnaProtocol>
<EnableUrlBase>false</EnableUrlBase>
<XmlRootAttributes> <XmlRootAttributes>
<XmlAttribute name="xmlns" value="urn:schemas-upnp-org:device-1-0" />
<XmlAttribute name="xmlns:dlna" value="urn:schemas-dlna-org:device-1-0" />
<XmlAttribute name="xmlns:av" value="urn:schemas-sony-com:av" /> <XmlAttribute name="xmlns:av" value="urn:schemas-sony-com:av" />
</XmlRootAttributes> </XmlRootAttributes>
<DirectPlayProfiles> <DirectPlayProfiles>

View File

@ -34,9 +34,10 @@
<RequiresPlainVideoItems>false</RequiresPlainVideoItems> <RequiresPlainVideoItems>false</RequiresPlainVideoItems>
<RequiresPlainFolders>false</RequiresPlainFolders> <RequiresPlainFolders>false</RequiresPlainFolders>
<EnableMSMediaReceiverRegistrar>false</EnableMSMediaReceiverRegistrar> <EnableMSMediaReceiverRegistrar>false</EnableMSMediaReceiverRegistrar>
<IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
<EnableDlnaProtocol>true</EnableDlnaProtocol>
<EnableUrlBase>false</EnableUrlBase>
<XmlRootAttributes> <XmlRootAttributes>
<XmlAttribute name="xmlns" value="urn:schemas-upnp-org:device-1-0" />
<XmlAttribute name="xmlns:dlna" value="urn:schemas-dlna-org:device-1-0" />
<XmlAttribute name="xmlns:av" value="urn:schemas-sony-com:av" /> <XmlAttribute name="xmlns:av" value="urn:schemas-sony-com:av" />
</XmlRootAttributes> </XmlRootAttributes>
<DirectPlayProfiles> <DirectPlayProfiles>

View File

@ -34,10 +34,10 @@
<RequiresPlainVideoItems>false</RequiresPlainVideoItems> <RequiresPlainVideoItems>false</RequiresPlainVideoItems>
<RequiresPlainFolders>false</RequiresPlainFolders> <RequiresPlainFolders>false</RequiresPlainFolders>
<EnableMSMediaReceiverRegistrar>false</EnableMSMediaReceiverRegistrar> <EnableMSMediaReceiverRegistrar>false</EnableMSMediaReceiverRegistrar>
<XmlRootAttributes> <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
<XmlAttribute name="xmlns" value="urn:schemas-upnp-org:device-1-0" /> <EnableDlnaProtocol>true</EnableDlnaProtocol>
<XmlAttribute name="xmlns:dlna" value="urn:schemas-dlna-org:device-1-0" /> <EnableUrlBase>false</EnableUrlBase>
</XmlRootAttributes> <XmlRootAttributes />
<DirectPlayProfiles> <DirectPlayProfiles>
<DirectPlayProfile container="avi" audioCodec="mp2,mp3" videoCodec="mpeg4" type="Video" /> <DirectPlayProfile container="avi" audioCodec="mp2,mp3" videoCodec="mpeg4" type="Video" />
<DirectPlayProfile container="ts" audioCodec="ac3,mp2,mp3,aac" videoCodec="mpeg1video,mpeg2video,h264" type="Video" /> <DirectPlayProfile container="ts" audioCodec="ac3,mp2,mp3,aac" videoCodec="mpeg1video,mpeg2video,h264" type="Video" />

View File

@ -32,10 +32,10 @@
<RequiresPlainVideoItems>false</RequiresPlainVideoItems> <RequiresPlainVideoItems>false</RequiresPlainVideoItems>
<RequiresPlainFolders>false</RequiresPlainFolders> <RequiresPlainFolders>false</RequiresPlainFolders>
<EnableMSMediaReceiverRegistrar>false</EnableMSMediaReceiverRegistrar> <EnableMSMediaReceiverRegistrar>false</EnableMSMediaReceiverRegistrar>
<XmlRootAttributes> <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
<XmlAttribute name="xmlns" value="urn:schemas-upnp-org:device-1-0" /> <EnableDlnaProtocol>true</EnableDlnaProtocol>
<XmlAttribute name="xmlns:dlna" value="urn:schemas-dlna-org:device-1-0" /> <EnableUrlBase>false</EnableUrlBase>
</XmlRootAttributes> <XmlRootAttributes />
<DirectPlayProfiles> <DirectPlayProfiles>
<DirectPlayProfile container="avi,mpeg,mkv,ts,mp4,mov,m4v,asf,webm,ogg,ogv,iso" type="Video" /> <DirectPlayProfile container="avi,mpeg,mkv,ts,mp4,mov,m4v,asf,webm,ogg,ogv,iso" type="Video" />
<DirectPlayProfile container="mp3,flac,asf,off,oga,aac" type="Audio" /> <DirectPlayProfile container="mp3,flac,asf,off,oga,aac" type="Audio" />

View File

@ -33,10 +33,10 @@
<RequiresPlainVideoItems>false</RequiresPlainVideoItems> <RequiresPlainVideoItems>false</RequiresPlainVideoItems>
<RequiresPlainFolders>false</RequiresPlainFolders> <RequiresPlainFolders>false</RequiresPlainFolders>
<EnableMSMediaReceiverRegistrar>false</EnableMSMediaReceiverRegistrar> <EnableMSMediaReceiverRegistrar>false</EnableMSMediaReceiverRegistrar>
<XmlRootAttributes> <IgnoreTranscodeByteRangeRequests>true</IgnoreTranscodeByteRangeRequests>
<XmlAttribute name="xmlns" value="urn:schemas-upnp-org:device-1-0" /> <EnableDlnaProtocol>true</EnableDlnaProtocol>
<XmlAttribute name="xmlns:dlna" value="urn:schemas-dlna-org:device-1-0" /> <EnableUrlBase>false</EnableUrlBase>
</XmlRootAttributes> <XmlRootAttributes />
<DirectPlayProfiles> <DirectPlayProfiles>
<DirectPlayProfile container="avi" audioCodec="ac3,dca,mp2,mp3,pcm" videoCodec="mpeg1video,mpeg2video,mpeg4,h264,vc1" type="Video" /> <DirectPlayProfile container="avi" audioCodec="ac3,dca,mp2,mp3,pcm" videoCodec="mpeg1video,mpeg2video,mpeg4,h264,vc1" type="Video" />
<DirectPlayProfile container="mpeg" audioCodec="ac3,dca,mp2,mp3,pcm" videoCodec="mpeg1video,mpeg2video" type="Video" /> <DirectPlayProfile container="mpeg" audioCodec="ac3,dca,mp2,mp3,pcm" videoCodec="mpeg1video,mpeg2video" type="Video" />

View File

@ -8,11 +8,12 @@
<HttpHeaderInfo name="User-Agent" value="Xenon" match="Substring" /> <HttpHeaderInfo name="User-Agent" value="Xenon" match="Substring" />
</Headers> </Headers>
</Identification> </Identification>
<FriendlyName>${HostName}: Emby:</FriendlyName> <FriendlyName>${HostName}: 1</FriendlyName>
<Manufacturer>Microsoft Corporation</Manufacturer> <Manufacturer>Microsoft Corporation</Manufacturer>
<ManufacturerUrl>http://www.microsoft.com</ManufacturerUrl> <ManufacturerUrl>http://www.microsoft.com</ManufacturerUrl>
<ModelName>Windows Media Player Sharing</ModelName> <ModelName>Windows Media Connect</ModelName>
<ModelNumber>12.0</ModelNumber> <ModelDescription>Emby : UPnP Media Server</ModelDescription>
<ModelNumber>001</ModelNumber>
<ModelUrl>http://go.microsoft.com/fwlink/?LinkId=105926</ModelUrl> <ModelUrl>http://go.microsoft.com/fwlink/?LinkId=105926</ModelUrl>
<EnableAlbumArtInDidl>false</EnableAlbumArtInDidl> <EnableAlbumArtInDidl>false</EnableAlbumArtInDidl>
<EnableSingleAlbumArtLimit>false</EnableSingleAlbumArtLimit> <EnableSingleAlbumArtLimit>false</EnableSingleAlbumArtLimit>
@ -32,9 +33,10 @@
<RequiresPlainVideoItems>true</RequiresPlainVideoItems> <RequiresPlainVideoItems>true</RequiresPlainVideoItems>
<RequiresPlainFolders>true</RequiresPlainFolders> <RequiresPlainFolders>true</RequiresPlainFolders>
<EnableMSMediaReceiverRegistrar>true</EnableMSMediaReceiverRegistrar> <EnableMSMediaReceiverRegistrar>true</EnableMSMediaReceiverRegistrar>
<XmlRootAttributes> <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
<XmlAttribute name="xmlns" value="urn:schemas-upnp-org:device-1-0" /> <EnableDlnaProtocol>false</EnableDlnaProtocol>
</XmlRootAttributes> <EnableUrlBase>true</EnableUrlBase>
<XmlRootAttributes />
<DirectPlayProfiles> <DirectPlayProfiles>
<DirectPlayProfile container="avi" audioCodec="ac3,mp3" videoCodec="mpeg4" type="Video" /> <DirectPlayProfile container="avi" audioCodec="ac3,mp3" videoCodec="mpeg4" type="Video" />
<DirectPlayProfile container="avi" audioCodec="aac" videoCodec="h264" type="Video" /> <DirectPlayProfile container="avi" audioCodec="aac" videoCodec="h264" type="Video" />

View File

@ -33,10 +33,10 @@
<RequiresPlainVideoItems>false</RequiresPlainVideoItems> <RequiresPlainVideoItems>false</RequiresPlainVideoItems>
<RequiresPlainFolders>false</RequiresPlainFolders> <RequiresPlainFolders>false</RequiresPlainFolders>
<EnableMSMediaReceiverRegistrar>false</EnableMSMediaReceiverRegistrar> <EnableMSMediaReceiverRegistrar>false</EnableMSMediaReceiverRegistrar>
<XmlRootAttributes> <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
<XmlAttribute name="xmlns" value="urn:schemas-upnp-org:device-1-0" /> <EnableDlnaProtocol>true</EnableDlnaProtocol>
<XmlAttribute name="xmlns:dlna" value="urn:schemas-dlna-org:device-1-0" /> <EnableUrlBase>false</EnableUrlBase>
</XmlRootAttributes> <XmlRootAttributes />
<DirectPlayProfiles> <DirectPlayProfiles>
<DirectPlayProfile container="ts" audioCodec="ac3" videoCodec="h264" type="Video" /> <DirectPlayProfile container="ts" audioCodec="ac3" videoCodec="h264" type="Video" />
<DirectPlayProfile container="avi" audioCodec="ac3,mp3" videoCodec="mpeg4" type="Video" /> <DirectPlayProfile container="avi" audioCodec="ac3,mp3" videoCodec="mpeg4" type="Video" />

View File

@ -32,10 +32,10 @@
<RequiresPlainVideoItems>false</RequiresPlainVideoItems> <RequiresPlainVideoItems>false</RequiresPlainVideoItems>
<RequiresPlainFolders>false</RequiresPlainFolders> <RequiresPlainFolders>false</RequiresPlainFolders>
<EnableMSMediaReceiverRegistrar>false</EnableMSMediaReceiverRegistrar> <EnableMSMediaReceiverRegistrar>false</EnableMSMediaReceiverRegistrar>
<XmlRootAttributes> <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
<XmlAttribute name="xmlns" value="urn:schemas-upnp-org:device-1-0" /> <EnableDlnaProtocol>true</EnableDlnaProtocol>
<XmlAttribute name="xmlns:dlna" value="urn:schemas-dlna-org:device-1-0" /> <EnableUrlBase>false</EnableUrlBase>
</XmlRootAttributes> <XmlRootAttributes />
<DirectPlayProfiles> <DirectPlayProfiles>
<DirectPlayProfile container="mp3" audioCodec="mp2,mp3" type="Audio" /> <DirectPlayProfile container="mp3" audioCodec="mp2,mp3" type="Audio" />
<DirectPlayProfile container="mp4" audioCodec="mp4" type="Audio" /> <DirectPlayProfile container="mp4" audioCodec="mp4" type="Audio" />

View File

@ -51,10 +51,28 @@ namespace MediaBrowser.Dlna.Server
builder.Append("<?xml version=\"1.0\"?>"); builder.Append("<?xml version=\"1.0\"?>");
builder.Append("<root"); builder.Append("<root");
foreach (var att in _profile.XmlRootAttributes)
var attributes = _profile.XmlRootAttributes.ToList();
if (_profile.EnableDlnaProtocol)
{
attributes.Insert(0, new XmlAttribute
{
Name = "xmlns:dlna",
Value = "urn:schemas-dlna-org:device-1-0"
});
}
attributes.Insert(0, new XmlAttribute
{
Name = "xmlns",
Value = "urn:schemas-upnp-org:device-1-0"
});
foreach (var att in attributes)
{ {
builder.AppendFormat(" {0}=\"{1}\"", att.Name, att.Value); builder.AppendFormat(" {0}=\"{1}\"", att.Name, att.Value);
} }
builder.Append(">"); builder.Append(">");
builder.Append("<specVersion>"); builder.Append("<specVersion>");
@ -74,33 +92,32 @@ namespace MediaBrowser.Dlna.Server
builder.Append("<device>"); builder.Append("<device>");
AppendDeviceProperties(builder); AppendDeviceProperties(builder);
//AppendIconList(builder); if (_profile.EnableDlnaProtocol)
{
AppendIconList(builder);
}
AppendServiceList(builder); AppendServiceList(builder);
builder.Append("</device>"); builder.Append("</device>");
} }
private void AppendDeviceProperties(StringBuilder builder) private void AppendDeviceProperties(StringBuilder builder)
{ {
builder.Append("<UDN>uuid:" + SecurityElement.Escape(_serverUdn) + "</UDN>"); builder.Append("<deviceType>urn:schemas-upnp-org:device:MediaServer:1</deviceType>");
if (!string.IsNullOrWhiteSpace(_profile.XDlnaCap)) if (_profile.EnableDlnaProtocol)
{ {
builder.Append("<dlna:X_DLNACAP>" + SecurityElement.Escape(_profile.XDlnaCap ?? string.Empty) + "</dlna:X_DLNACAP>"); builder.Append("<dlna:X_DLNACAP>" + SecurityElement.Escape(_profile.XDlnaCap ?? string.Empty) + "</dlna:X_DLNACAP>");
}
builder.Append("<dlna:X_DLNADOC xmlns:dlna=\"urn:schemas-dlna-org:device-1-0\">M-DMS-1.50</dlna:X_DLNADOC>"); builder.Append("<dlna:X_DLNADOC xmlns:dlna=\"urn:schemas-dlna-org:device-1-0\">M-DMS-1.50</dlna:X_DLNADOC>");
builder.Append("<dlna:X_DLNADOC xmlns:dlna=\"urn:schemas-dlna-org:device-1-0\">" + SecurityElement.Escape(_profile.XDlnaDoc ?? string.Empty) + "</dlna:X_DLNADOC>"); builder.Append("<dlna:X_DLNADOC xmlns:dlna=\"urn:schemas-dlna-org:device-1-0\">" + SecurityElement.Escape(_profile.XDlnaDoc ?? string.Empty) + "</dlna:X_DLNADOC>");
}
builder.Append("<friendlyName>" + SecurityElement.Escape(GetFriendlyName()) + "</friendlyName>"); builder.Append("<friendlyName>" + SecurityElement.Escape(GetFriendlyName()) + "</friendlyName>");
builder.Append("<deviceType>urn:schemas-upnp-org:device:MediaServer:1</deviceType>");
builder.Append("<manufacturer>" + SecurityElement.Escape(_profile.Manufacturer ?? string.Empty) + "</manufacturer>"); builder.Append("<manufacturer>" + SecurityElement.Escape(_profile.Manufacturer ?? string.Empty) + "</manufacturer>");
builder.Append("<manufacturerURL>" + SecurityElement.Escape(_profile.ManufacturerUrl ?? string.Empty) + "</manufacturerURL>"); builder.Append("<manufacturerURL>" + SecurityElement.Escape(_profile.ManufacturerUrl ?? string.Empty) + "</manufacturerURL>");
builder.Append("<modelName>" + SecurityElement.Escape(_profile.ModelName ?? string.Empty) + "</modelName>");
if (!string.IsNullOrWhiteSpace(_profile.ModelDescription)) builder.Append("<modelDescription>" + SecurityElement.Escape(_profile.ModelDescription ?? string.Empty) + "</modelDescription>");
{ builder.Append("<modelName>" + SecurityElement.Escape(_profile.ModelName ?? string.Empty) + "</modelName>");
builder.Append("<modelDescription>" + SecurityElement.Escape(_profile.ModelDescription ?? string.Empty) + "</modelDescription>");
}
builder.Append("<modelNumber>" + SecurityElement.Escape(_profile.ModelNumber ?? string.Empty) + "</modelNumber>"); builder.Append("<modelNumber>" + SecurityElement.Escape(_profile.ModelNumber ?? string.Empty) + "</modelNumber>");
builder.Append("<modelURL>" + SecurityElement.Escape(_profile.ModelUrl ?? string.Empty) + "</modelURL>"); builder.Append("<modelURL>" + SecurityElement.Escape(_profile.ModelUrl ?? string.Empty) + "</modelURL>");
@ -114,6 +131,7 @@ namespace MediaBrowser.Dlna.Server
builder.Append("<serialNumber>" + SecurityElement.Escape(_profile.SerialNumber) + "</serialNumber>"); builder.Append("<serialNumber>" + SecurityElement.Escape(_profile.SerialNumber) + "</serialNumber>");
} }
builder.Append("<UDN>uuid:" + SecurityElement.Escape(_serverUdn) + "</UDN>");
builder.Append("<presentationURL>" + SecurityElement.Escape(_serverAddress) + "</presentationURL>"); builder.Append("<presentationURL>" + SecurityElement.Escape(_serverAddress) + "</presentationURL>");
if (!EnableAbsoluteUrls) if (!EnableAbsoluteUrls)

View File

@ -30,7 +30,7 @@ namespace MediaBrowser.Dlna.Ssdp
{ {
var msg = Encoding.ASCII.GetBytes(Message); var msg = Encoding.ASCII.GetBytes(Message);
var socket = CreateSocket(); var socket = CreateSocket(!IgnoreBindFailure);
if (socket == null) if (socket == null)
{ {
@ -102,13 +102,20 @@ namespace MediaBrowser.Dlna.Ssdp
} }
} }
private Socket CreateSocket() private Socket CreateSocket(bool isBroadcast)
{ {
try try
{ {
var socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); var socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
if (isBroadcast)
{
socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, true);
socket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastTimeToLive, 4);
}
return socket; return socket;
} }
catch (Exception ex) catch (Exception ex)

View File

@ -87,11 +87,14 @@ namespace MediaBrowser.Dlna.Ssdp
try try
{ {
var ip = _appHost.LocalIpAddress; if (e.LocalEndPoint == null)
{
if (!string.IsNullOrWhiteSpace(ip)) var ip = _appHost.LocalIpAddress;
e.LocalEndPoint = new IPEndPoint(IPAddress.Parse(ip), 0);
}
if (e.LocalEndPoint != null)
{ {
e.LocalIp = IPAddress.Parse(ip);
TryCreateDevice(e); TryCreateDevice(e);
} }
} }
@ -140,7 +143,7 @@ namespace MediaBrowser.Dlna.Ssdp
{ {
var args = SsdpHelper.ParseSsdpResponse(receiveBuffer); var args = SsdpHelper.ParseSsdpResponse(receiveBuffer);
args.EndPoint = endPoint; args.EndPoint = endPoint;
args.LocalIp = localIp; args.LocalEndPoint = new IPEndPoint(localIp, 0);
if (!_ssdpHandler.IsSelfNotification(args)) if (!_ssdpHandler.IsSelfNotification(args))
{ {

View File

@ -139,15 +139,7 @@ namespace MediaBrowser.Dlna.Ssdp
values["MX"] = "3"; values["MX"] = "3";
// UDP is unreliable, so send 3 requests at a time (per Upnp spec, sec 1.1.2) // UDP is unreliable, so send 3 requests at a time (per Upnp spec, sec 1.1.2)
SendDatagram("M-SEARCH * HTTP/1.1", values, localIp, 2); SendDatagram("M-SEARCH * HTTP/1.1", values, _ssdpEndp, localIp, false, 2);
}
public void SendDatagram(string header,
Dictionary<string, string> values,
EndPoint localAddress,
int sendCount)
{
SendDatagram(header, values, _ssdpEndp, localAddress, false, sendCount);
} }
public void SendDatagram(string header, public void SendDatagram(string header,
@ -433,27 +425,9 @@ namespace MediaBrowser.Dlna.Ssdp
if (string.Equals(server, _serverSignature, StringComparison.OrdinalIgnoreCase)) if (string.Equals(server, _serverSignature, StringComparison.OrdinalIgnoreCase))
{ {
return true; //return true;
} }
return false; return false;
//string usn;
//args.Headers.TryGetValue("USN", out usn);
//if (string.IsNullOrWhiteSpace(usn))
//{
// return false;
//}
//_logger.Debug("IsSelfNotification test: " + usn);
//return RegisteredDevices.Any(i =>
//{
// var isSameDevice = string.Equals(usn, i.USN, StringComparison.OrdinalIgnoreCase) ||
// i.USN.IndexOf(usn, StringComparison.OrdinalIgnoreCase) != 1 ||
// usn.IndexOf(i.USN, StringComparison.OrdinalIgnoreCase) != 1;
// return isSameDevice;
//});
} }
public void Dispose() public void Dispose()
@ -542,7 +516,7 @@ namespace MediaBrowser.Dlna.Ssdp
_logger.Debug("{0} said {1}", dev.USN, type); _logger.Debug("{0} said {1}", dev.USN, type);
} }
SendDatagram(header, values, new IPEndPoint(dev.Address, 0), sendCount); SendDatagram(header, values, _ssdpEndp, new IPEndPoint(dev.Address, 0), false, sendCount);
} }
public void RegisterNotification(Guid uuid, Uri descriptionUri, IPAddress address, IEnumerable<string> services) public void RegisterNotification(Guid uuid, Uri descriptionUri, IPAddress address, IEnumerable<string> services)

View File

@ -17,7 +17,7 @@ namespace MediaBrowser.Model.Configuration
DownMixAudioBoost = 2; DownMixAudioBoost = 2;
EncodingQuality = EncodingQuality.Auto; EncodingQuality = EncodingQuality.Auto;
EnableThrottling = true; EnableThrottling = true;
ThrottleThresholdSeconds = 120; ThrottleThresholdSeconds = 110;
} }
} }
} }

View File

@ -77,6 +77,7 @@ namespace MediaBrowser.Model.Dlna
public bool EnableMSMediaReceiverRegistrar { get; set; } public bool EnableMSMediaReceiverRegistrar { get; set; }
public bool IgnoreTranscodeByteRangeRequests { get; set; } public bool IgnoreTranscodeByteRangeRequests { get; set; }
public bool EnableDlnaProtocol { get; set; }
public XmlAttribute[] XmlRootAttributes { get; set; } public XmlAttribute[] XmlRootAttributes { get; set; }

View File

@ -52,7 +52,7 @@ namespace MediaBrowser.Providers.TV
target.Status = source.Status; target.Status = source.Status;
} }
if (replaceData || target.AirDays.Count == 0) if (replaceData || target.AirDays == null || target.AirDays.Count == 0)
{ {
target.AirDays = source.AirDays; target.AirDays = source.AirDays;
} }

View File

@ -108,9 +108,9 @@ namespace MediaBrowser.Server.Implementations.EntryPoints
{ {
var endpoint = e.EndPoint as IPEndPoint; var endpoint = e.EndPoint as IPEndPoint;
if (endpoint != null && e.LocalIp != null) if (endpoint != null && e.LocalEndPoint != null)
{ {
NatUtility.Handle(e.LocalIp, e.Message, endpoint, NatProtocol.Upnp); NatUtility.Handle(e.LocalEndPoint.Address, e.Message, endpoint, NatProtocol.Upnp);
} }
} }

View File

@ -252,6 +252,9 @@ namespace MediaBrowser.Server.Implementations.Localization
throw new ArgumentNullException("rating"); throw new ArgumentNullException("rating");
} }
// Fairly common for some users to have "Rated R" in their rating field
rating = rating.Replace("Rated ", string.Empty, StringComparison.OrdinalIgnoreCase);
var ratingsDictionary = GetParentalRatingsDictionary(); var ratingsDictionary = GetParentalRatingsDictionary();
ParentalRating value; ParentalRating value;

View File

@ -103,7 +103,7 @@ namespace MediaBrowser.Server.Implementations.Photos
return parts.GetMD5().ToString("N"); return parts.GetMD5().ToString("N");
} }
protected Task CreateThumbCollage(IHasImages primaryItem, List<BaseItem> items, string outputPath, bool drawText) protected Task<bool> CreateThumbCollage(IHasImages primaryItem, List<BaseItem> items, string outputPath, bool drawText)
{ {
return CreateCollage(primaryItem, items, outputPath, 960, 540, drawText, primaryItem.Name); return CreateCollage(primaryItem, items, outputPath, 960, 540, drawText, primaryItem.Name);
} }
@ -115,22 +115,22 @@ namespace MediaBrowser.Server.Implementations.Photos
.Where(i => !string.IsNullOrWhiteSpace(i)); .Where(i => !string.IsNullOrWhiteSpace(i));
} }
protected Task CreatePosterCollage(IHasImages primaryItem, List<BaseItem> items, string outputPath) protected Task<bool> CreatePosterCollage(IHasImages primaryItem, List<BaseItem> items, string outputPath)
{ {
return CreateCollage(primaryItem, items, outputPath, 600, 900, true, primaryItem.Name); return CreateCollage(primaryItem, items, outputPath, 600, 900, true, primaryItem.Name);
} }
protected Task CreateSquareCollage(IHasImages primaryItem, List<BaseItem> items, string outputPath, bool drawText) protected Task<bool> CreateSquareCollage(IHasImages primaryItem, List<BaseItem> items, string outputPath, bool drawText)
{ {
return CreateCollage(primaryItem, items, outputPath, 800, 800, drawText, primaryItem.Name); return CreateCollage(primaryItem, items, outputPath, 800, 800, drawText, primaryItem.Name);
} }
protected Task CreateThumbCollage(IHasImages primaryItem, List<BaseItem> items, string outputPath, int width, int height, bool drawText, string text) protected Task<bool> CreateThumbCollage(IHasImages primaryItem, List<BaseItem> items, string outputPath, int width, int height, bool drawText, string text)
{ {
return CreateCollage(primaryItem, items, outputPath, width, height, drawText, text); return CreateCollage(primaryItem, items, outputPath, width, height, drawText, text);
} }
private Task CreateCollage(IHasImages primaryItem, List<BaseItem> items, string outputPath, int width, int height, bool drawText, string text) private Task<bool> CreateCollage(IHasImages primaryItem, List<BaseItem> items, string outputPath, int width, int height, bool drawText, string text)
{ {
Directory.CreateDirectory(Path.GetDirectoryName(outputPath)); Directory.CreateDirectory(Path.GetDirectoryName(outputPath));
@ -143,7 +143,13 @@ namespace MediaBrowser.Server.Implementations.Photos
InputPaths = GetStripCollageImagePaths(primaryItem, items).ToArray() InputPaths = GetStripCollageImagePaths(primaryItem, items).ToArray()
}; };
return ImageProcessor.CreateImageCollage(options); if (options.InputPaths.Length == 0)
{
return Task.FromResult(false);
}
ImageProcessor.CreateImageCollage(options);
return Task.FromResult(true);
} }
public string Name public string Name
@ -166,26 +172,23 @@ namespace MediaBrowser.Server.Implementations.Photos
if (imageType == ImageType.Thumb) if (imageType == ImageType.Thumb)
{ {
await CreateThumbCollage(item, itemsWithImages, outputPath, drawText).ConfigureAwait(false); return await CreateThumbCollage(item, itemsWithImages, outputPath, drawText).ConfigureAwait(false);
return true;
} }
if (imageType == ImageType.Primary) if (imageType == ImageType.Primary)
{ {
if (item is UserView) if (item is UserView)
{ {
await CreateSquareCollage(item, itemsWithImages, outputPath, drawText).ConfigureAwait(false); return await CreateSquareCollage(item, itemsWithImages, outputPath, drawText).ConfigureAwait(false);
} }
else if (item is PhotoAlbum || item is Playlist) else if (item is PhotoAlbum || item is Playlist)
{ {
await CreateSquareCollage(item, itemsWithImages, outputPath, drawText).ConfigureAwait(false); return await CreateSquareCollage(item, itemsWithImages, outputPath, drawText).ConfigureAwait(false);
} }
else else
{ {
await CreatePosterCollage(item, itemsWithImages, outputPath).ConfigureAwait(false); return await CreatePosterCollage(item, itemsWithImages, outputPath).ConfigureAwait(false);
} }
return true;
} }
throw new ArgumentException("Unexpected image type"); throw new ArgumentException("Unexpected image type");

View File

@ -8,37 +8,37 @@ using System.Threading.Tasks;
namespace MediaBrowser.Server.Implementations.Photos namespace MediaBrowser.Server.Implementations.Photos
{ {
//public class PhotoAlbumImageProvider : IDynamicImageProvider public class PhotoAlbumImageProvider : IDynamicImageProvider
//{ {
// public IEnumerable<ImageType> GetSupportedImages(IHasImages item) public IEnumerable<ImageType> GetSupportedImages(IHasImages item)
// { {
// return new List<ImageType> { ImageType.Primary }; return new List<ImageType> { ImageType.Primary };
// } }
// public Task<DynamicImageResponse> GetImage(IHasImages item, ImageType type, CancellationToken cancellationToken) public Task<DynamicImageResponse> GetImage(IHasImages item, ImageType type, CancellationToken cancellationToken)
// { {
// var album = (PhotoAlbum)item; var album = (PhotoAlbum)item;
// var image = album.Children var image = album.Children
// .OfType<Photo>() .OfType<Photo>()
// .Select(i => i.GetImagePath(type)) .Select(i => i.GetImagePath(type))
// .FirstOrDefault(i => !string.IsNullOrEmpty(i)); .FirstOrDefault(i => !string.IsNullOrEmpty(i));
// return Task.FromResult(new DynamicImageResponse return Task.FromResult(new DynamicImageResponse
// { {
// Path = image, Path = image,
// HasImage = !string.IsNullOrEmpty(image) HasImage = !string.IsNullOrEmpty(image)
// }); });
// } }
// public string Name public string Name
// { {
// get { return "Image Extractor"; } get { return "Image Extractor"; }
// } }
// public bool Supports(IHasImages item) public bool Supports(IHasImages item)
// { {
// return item is PhotoAlbum; return item is PhotoAlbum;
// } }
//} }
} }

View File

@ -224,8 +224,7 @@ namespace MediaBrowser.Server.Implementations.UserViews
return false; return false;
} }
await CreateThumbCollage(item, itemsWithImages, outputPath, 960, 540, false, item.Name).ConfigureAwait(false); return await CreateThumbCollage(item, itemsWithImages, outputPath, 960, 540, false, item.Name).ConfigureAwait(false);
return true;
} }
return await base.CreateImage(item, itemsWithImages, outputPath, imageType, imageIndex).ConfigureAwait(false); return await base.CreateImage(item, itemsWithImages, outputPath, imageType, imageIndex).ConfigureAwait(false);

View File

@ -9,6 +9,7 @@ using System.IO;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using WebMarkupMin.Core;
using WebMarkupMin.Core.Minifiers; using WebMarkupMin.Core.Minifiers;
using WebMarkupMin.Core.Settings; using WebMarkupMin.Core.Settings;
@ -58,7 +59,7 @@ namespace MediaBrowser.WebDashboard.Api
{ {
// Don't apply any caching for html pages // Don't apply any caching for html pages
// jQuery ajax doesn't seem to handle if-modified-since correctly // jQuery ajax doesn't seem to handle if-modified-since correctly
if (isHtml) if (isHtml && path.IndexOf("cordovaindex.html", StringComparison.OrdinalIgnoreCase) == -1)
{ {
resourceStream = await ModifyHtml(resourceStream, mode, localizationCulture, enableMinification).ConfigureAwait(false); resourceStream = await ModifyHtml(resourceStream, mode, localizationCulture, enableMinification).ConfigureAwait(false);
} }
@ -137,7 +138,12 @@ namespace MediaBrowser.WebDashboard.Api
{ {
try try
{ {
var minifier = new HtmlMinifier(new HtmlMinificationSettings()); var minifier = new HtmlMinifier(new HtmlMinificationSettings
{
AttributeQuotesRemovalMode = HtmlAttributeQuotesRemovalMode.KeepQuotes,
RemoveOptionalEndTags = false,
RemoveTagsWithoutContent = false
});
var result = minifier.Minify(html, false); var result = minifier.Minify(html, false);
if (result.Errors.Count > 0) if (result.Errors.Count > 0)
@ -313,7 +319,7 @@ namespace MediaBrowser.WebDashboard.Api
if (string.Equals(mode, "cordova", StringComparison.OrdinalIgnoreCase)) if (string.Equals(mode, "cordova", StringComparison.OrdinalIgnoreCase))
{ {
apiClientFiles.Add("thirdparty/apiclient/cordova/serverdiscovery.js"); apiClientFiles.Add("thirdparty/cordova/serverdiscovery.js");
} }
else else
{ {
@ -321,6 +327,11 @@ namespace MediaBrowser.WebDashboard.Api
} }
apiClientFiles.Add("thirdparty/apiclient/connectionmanager.js"); apiClientFiles.Add("thirdparty/apiclient/connectionmanager.js");
if (string.Equals(mode, "cordova", StringComparison.OrdinalIgnoreCase))
{
apiClientFiles.Add("thirdparty/cordova/remotecontrols.js");
}
foreach (var file in apiClientFiles) foreach (var file in apiClientFiles)
{ {
using (var fs = _fileSystem.GetFileStream(GetDashboardResourcePath(file), FileMode.Open, FileAccess.Read, FileShare.ReadWrite, true)) using (var fs = _fileSystem.GetFileStream(GetDashboardResourcePath(file), FileMode.Open, FileAccess.Read, FileShare.ReadWrite, true))

View File

@ -213,7 +213,13 @@
<Content Include="dashboard-ui\thirdparty\apiclient\connectservice.js"> <Content Include="dashboard-ui\thirdparty\apiclient\connectservice.js">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content> </Content>
<Content Include="dashboard-ui\thirdparty\apiclient\cordova\serverdiscovery.js"> <Content Include="dashboard-ui\cordovaindex.html">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="dashboard-ui\thirdparty\cordova\remotecontrols.js">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="dashboard-ui\thirdparty\cordova\serverdiscovery.js">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content> </Content>
<Content Include="dashboard-ui\thirdparty\apiclient\deferred.js"> <Content Include="dashboard-ui\thirdparty\apiclient\deferred.js">
@ -1665,6 +1671,9 @@
<Content Include="dashboard-ui\thirdparty\jstree3.0.8\themes\default\throbber.gif"> <Content Include="dashboard-ui\thirdparty\jstree3.0.8\themes\default\throbber.gif">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content> </Content>
<Content Include="dashboard-ui\thirdparty\masonry.pkgd.min.js">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="dashboard-ui\thirdparty\require.js"> <Content Include="dashboard-ui\thirdparty\require.js">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content> </Content>
@ -2288,6 +2297,9 @@
<None Include="dashboard-ui\css\fonts\RobotoThin.woff"> <None Include="dashboard-ui\css\fonts\RobotoThin.woff">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None> </None>
<None Include="dashboard-ui\thirdparty\fontawesome\css\font-awesome.css.map">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="dashboard-ui\thirdparty\fontawesome\fonts\fontawesome-webfont.eot"> <None Include="dashboard-ui\thirdparty\fontawesome\fonts\fontawesome-webfont.eot">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None> </None>
@ -2297,6 +2309,9 @@
<None Include="dashboard-ui\thirdparty\fontawesome\fonts\fontawesome-webfont.woff"> <None Include="dashboard-ui\thirdparty\fontawesome\fonts\fontawesome-webfont.woff">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None> </None>
<None Include="dashboard-ui\thirdparty\fontawesome\fonts\fontawesome-webfont.woff2">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="dashboard-ui\thirdparty\fontawesome\fonts\FontAwesome.otf"> <None Include="dashboard-ui\thirdparty\fontawesome\fonts\FontAwesome.otf">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None> </None>

View File

@ -1,4 +1,4 @@
using System.Reflection; using System.Reflection;
//[assembly: AssemblyVersion("3.0.*")] //[assembly: AssemblyVersion("3.0.*")]
[assembly: AssemblyVersion("3.0.5607.1")] [assembly: AssemblyVersion("3.0.5607.2")]