Merge pull request #1100 from MediaBrowser/dev

3.0.5607.2
pull/702/head
Luke 10 years ago
commit 033919685a

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

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

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

@ -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;
}
}
}
}
}
}

@ -1,4 +1,5 @@
using ImageMagickSharp;
using System.Linq;
using ImageMagickSharp;
using MediaBrowser.Common.Configuration;
using MediaBrowser.Controller.Drawing;
using MediaBrowser.Model.Drawing;
@ -195,15 +196,15 @@ namespace Emby.Drawing.ImageMagick
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)
{
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
{
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);
}
}

@ -2,7 +2,6 @@
using MediaBrowser.Common.Configuration;
using System;
using System.Collections.Generic;
using System.Linq;
namespace Emby.Drawing.ImageMagick
{
@ -15,7 +14,7 @@ namespace Emby.Drawing.ImageMagick
_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))
{
@ -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))
{
@ -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))
{
@ -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 list = new List<string>();
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 inputPaths = ImageHelpers.ProjectPaths(paths, 8);
using (var wandImages = new MagickWand(inputPaths.ToArray()))
{
var wand = new MagickWand(width, height);
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);
using (var wandImages = new MagickWand(inputPaths))
var inputPaths = ImageHelpers.ProjectPaths(paths, 4);
using (var wandImages = new MagickWand(inputPaths.ToArray()))
{
var wand = new MagickWand(width, height);
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);
using (var wandImages = new MagickWand(inputPaths))
var inputPaths = ImageHelpers.ProjectPaths(paths, 4);
using (var wandImages = new MagickWand(inputPaths.ToArray()))
{
var wand = new MagickWand(width, height);
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);
using (var wandImages = new MagickWand(inputPaths))
var inputPaths = ImageHelpers.ProjectPaths(paths, 8);
using (var wandImages = new MagickWand(inputPaths.ToArray()))
{
var wand = new MagickWand(width, height);
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);
using (var wandImages = new MagickWand(inputPaths))
var inputPaths = ImageHelpers.ProjectPaths(paths, 4);
using (var wandImages = new MagickWand(inputPaths.ToArray()))
{
var wand = new MagickWand(width, height);
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);
using (var wandImages = new MagickWand(inputPaths))
var inputPaths = ImageHelpers.ProjectPaths(paths, 4);
using (var wandImages = new MagickWand(inputPaths.ToArray()))
{
var wand = new MagickWand(width, height);
wand.OpenImage("gradient:#111111-#111111");

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

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

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

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

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

@ -37,6 +37,7 @@ namespace MediaBrowser.Dlna.Profiles
MusicSyncBitrate = 128000;
EnableAlbumArtInDidl = false;
EnableDlnaProtocol = true;
TranscodingProfiles = new[]
{
@ -76,9 +77,6 @@ namespace MediaBrowser.Dlna.Profiles
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)

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

@ -32,10 +32,10 @@
<RequiresPlainVideoItems>false</RequiresPlainVideoItems>
<RequiresPlainFolders>false</RequiresPlainFolders>
<EnableMSMediaReceiverRegistrar>false</EnableMSMediaReceiverRegistrar>
<XmlRootAttributes>
<XmlAttribute name="xmlns" value="urn:schemas-upnp-org:device-1-0" />
<XmlAttribute name="xmlns:dlna" value="urn:schemas-dlna-org:device-1-0" />
</XmlRootAttributes>
<IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
<EnableDlnaProtocol>true</EnableDlnaProtocol>
<EnableUrlBase>false</EnableUrlBase>
<XmlRootAttributes />
<DirectPlayProfiles>
<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" />

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

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

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

@ -33,10 +33,10 @@
<RequiresPlainVideoItems>false</RequiresPlainVideoItems>
<RequiresPlainFolders>false</RequiresPlainFolders>
<EnableMSMediaReceiverRegistrar>false</EnableMSMediaReceiverRegistrar>
<XmlRootAttributes>
<XmlAttribute name="xmlns" value="urn:schemas-upnp-org:device-1-0" />
<XmlAttribute name="xmlns:dlna" value="urn:schemas-dlna-org:device-1-0" />
</XmlRootAttributes>
<IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
<EnableDlnaProtocol>true</EnableDlnaProtocol>
<EnableUrlBase>false</EnableUrlBase>
<XmlRootAttributes />
<DirectPlayProfiles>
<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" />

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

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

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

@ -33,9 +33,10 @@
<RequiresPlainVideoItems>false</RequiresPlainVideoItems>
<RequiresPlainFolders>false</RequiresPlainFolders>
<EnableMSMediaReceiverRegistrar>false</EnableMSMediaReceiverRegistrar>
<IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
<EnableDlnaProtocol>true</EnableDlnaProtocol>
<EnableUrlBase>false</EnableUrlBase>
<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/" />
</XmlRootAttributes>
<DirectPlayProfiles>

@ -26,10 +26,10 @@
<RequiresPlainVideoItems>false</RequiresPlainVideoItems>
<RequiresPlainFolders>false</RequiresPlainFolders>
<EnableMSMediaReceiverRegistrar>false</EnableMSMediaReceiverRegistrar>
<XmlRootAttributes>
<XmlAttribute name="xmlns" value="urn:schemas-upnp-org:device-1-0" />
<XmlAttribute name="xmlns:dlna" value="urn:schemas-dlna-org:device-1-0" />
</XmlRootAttributes>
<IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
<EnableDlnaProtocol>true</EnableDlnaProtocol>
<EnableUrlBase>false</EnableUrlBase>
<XmlRootAttributes />
<DirectPlayProfiles>
<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" />

@ -32,9 +32,10 @@
<RequiresPlainVideoItems>false</RequiresPlainVideoItems>
<RequiresPlainFolders>false</RequiresPlainFolders>
<EnableMSMediaReceiverRegistrar>false</EnableMSMediaReceiverRegistrar>
<IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
<EnableDlnaProtocol>true</EnableDlnaProtocol>
<EnableUrlBase>false</EnableUrlBase>
<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/" />
</XmlRootAttributes>
<DirectPlayProfiles>

@ -32,9 +32,10 @@
<RequiresPlainVideoItems>false</RequiresPlainVideoItems>
<RequiresPlainFolders>false</RequiresPlainFolders>
<EnableMSMediaReceiverRegistrar>false</EnableMSMediaReceiverRegistrar>
<IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
<EnableDlnaProtocol>true</EnableDlnaProtocol>
<EnableUrlBase>false</EnableUrlBase>
<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" />
</XmlRootAttributes>
<DirectPlayProfiles>

@ -34,9 +34,10 @@
<RequiresPlainVideoItems>false</RequiresPlainVideoItems>
<RequiresPlainFolders>false</RequiresPlainFolders>
<EnableMSMediaReceiverRegistrar>false</EnableMSMediaReceiverRegistrar>
<IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
<EnableDlnaProtocol>true</EnableDlnaProtocol>
<EnableUrlBase>false</EnableUrlBase>
<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" />
</XmlRootAttributes>
<DirectPlayProfiles>

@ -34,9 +34,10 @@
<RequiresPlainVideoItems>false</RequiresPlainVideoItems>
<RequiresPlainFolders>false</RequiresPlainFolders>
<EnableMSMediaReceiverRegistrar>false</EnableMSMediaReceiverRegistrar>
<IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
<EnableDlnaProtocol>true</EnableDlnaProtocol>
<EnableUrlBase>false</EnableUrlBase>
<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" />
</XmlRootAttributes>
<DirectPlayProfiles>

@ -34,9 +34,10 @@
<RequiresPlainVideoItems>false</RequiresPlainVideoItems>
<RequiresPlainFolders>false</RequiresPlainFolders>
<EnableMSMediaReceiverRegistrar>false</EnableMSMediaReceiverRegistrar>
<IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
<EnableDlnaProtocol>true</EnableDlnaProtocol>
<EnableUrlBase>false</EnableUrlBase>
<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" />
</XmlRootAttributes>
<DirectPlayProfiles>

@ -34,9 +34,10 @@
<RequiresPlainVideoItems>false</RequiresPlainVideoItems>
<RequiresPlainFolders>false</RequiresPlainFolders>
<EnableMSMediaReceiverRegistrar>false</EnableMSMediaReceiverRegistrar>
<IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
<EnableDlnaProtocol>true</EnableDlnaProtocol>
<EnableUrlBase>false</EnableUrlBase>
<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" />
</XmlRootAttributes>
<DirectPlayProfiles>

@ -34,9 +34,10 @@
<RequiresPlainVideoItems>false</RequiresPlainVideoItems>
<RequiresPlainFolders>false</RequiresPlainFolders>
<EnableMSMediaReceiverRegistrar>false</EnableMSMediaReceiverRegistrar>
<IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
<EnableDlnaProtocol>true</EnableDlnaProtocol>
<EnableUrlBase>false</EnableUrlBase>
<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" />
</XmlRootAttributes>
<DirectPlayProfiles>

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

@ -32,10 +32,10 @@
<RequiresPlainVideoItems>false</RequiresPlainVideoItems>
<RequiresPlainFolders>false</RequiresPlainFolders>
<EnableMSMediaReceiverRegistrar>false</EnableMSMediaReceiverRegistrar>
<XmlRootAttributes>
<XmlAttribute name="xmlns" value="urn:schemas-upnp-org:device-1-0" />
<XmlAttribute name="xmlns:dlna" value="urn:schemas-dlna-org:device-1-0" />
</XmlRootAttributes>
<IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
<EnableDlnaProtocol>true</EnableDlnaProtocol>
<EnableUrlBase>false</EnableUrlBase>
<XmlRootAttributes />
<DirectPlayProfiles>
<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" />

@ -33,10 +33,10 @@
<RequiresPlainVideoItems>false</RequiresPlainVideoItems>
<RequiresPlainFolders>false</RequiresPlainFolders>
<EnableMSMediaReceiverRegistrar>false</EnableMSMediaReceiverRegistrar>
<XmlRootAttributes>
<XmlAttribute name="xmlns" value="urn:schemas-upnp-org:device-1-0" />
<XmlAttribute name="xmlns:dlna" value="urn:schemas-dlna-org:device-1-0" />
</XmlRootAttributes>
<IgnoreTranscodeByteRangeRequests>true</IgnoreTranscodeByteRangeRequests>
<EnableDlnaProtocol>true</EnableDlnaProtocol>
<EnableUrlBase>false</EnableUrlBase>
<XmlRootAttributes />
<DirectPlayProfiles>
<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" />

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

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

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

@ -51,10 +51,28 @@ namespace MediaBrowser.Dlna.Server
builder.Append("<?xml version=\"1.0\"?>");
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.Append(">");
builder.Append("<specVersion>");
@ -74,34 +92,33 @@ namespace MediaBrowser.Dlna.Server
builder.Append("<device>");
AppendDeviceProperties(builder);
//AppendIconList(builder);
if (_profile.EnableDlnaProtocol)
{
AppendIconList(builder);
}
AppendServiceList(builder);
builder.Append("</device>");
}
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_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\">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("<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("<manufacturerURL>" + SecurityElement.Escape(_profile.ManufacturerUrl ?? string.Empty) + "</manufacturerURL>");
builder.Append("<modelDescription>" + SecurityElement.Escape(_profile.ModelDescription ?? string.Empty) + "</modelDescription>");
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("<modelNumber>" + SecurityElement.Escape(_profile.ModelNumber ?? string.Empty) + "</modelNumber>");
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("<UDN>uuid:" + SecurityElement.Escape(_serverUdn) + "</UDN>");
builder.Append("<presentationURL>" + SecurityElement.Escape(_serverAddress) + "</presentationURL>");
if (!EnableAbsoluteUrls)

@ -30,7 +30,7 @@ namespace MediaBrowser.Dlna.Ssdp
{
var msg = Encoding.ASCII.GetBytes(Message);
var socket = CreateSocket();
var socket = CreateSocket(!IgnoreBindFailure);
if (socket == null)
{
@ -102,13 +102,20 @@ namespace MediaBrowser.Dlna.Ssdp
}
}
private Socket CreateSocket()
private Socket CreateSocket(bool isBroadcast)
{
try
{
var socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
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;
}
catch (Exception ex)

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

@ -139,15 +139,7 @@ namespace MediaBrowser.Dlna.Ssdp
values["MX"] = "3";
// 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);
}
public void SendDatagram(string header,
Dictionary<string, string> values,
EndPoint localAddress,
int sendCount)
{
SendDatagram(header, values, _ssdpEndp, localAddress, false, sendCount);
SendDatagram("M-SEARCH * HTTP/1.1", values, _ssdpEndp, localIp, false, 2);
}
public void SendDatagram(string header,
@ -433,27 +425,9 @@ namespace MediaBrowser.Dlna.Ssdp
if (string.Equals(server, _serverSignature, StringComparison.OrdinalIgnoreCase))
{
return true;
//return true;
}
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()
@ -542,7 +516,7 @@ namespace MediaBrowser.Dlna.Ssdp
_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)

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

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

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

@ -108,9 +108,9 @@ namespace MediaBrowser.Server.Implementations.EntryPoints
{
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);
}
}

@ -252,6 +252,9 @@ namespace MediaBrowser.Server.Implementations.Localization
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();
ParentalRating value;

@ -103,7 +103,7 @@ namespace MediaBrowser.Server.Implementations.Photos
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);
}
@ -115,22 +115,22 @@ namespace MediaBrowser.Server.Implementations.Photos
.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);
}
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);
}
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);
}
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));
@ -143,7 +143,13 @@ namespace MediaBrowser.Server.Implementations.Photos
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
@ -166,26 +172,23 @@ namespace MediaBrowser.Server.Implementations.Photos
if (imageType == ImageType.Thumb)
{
await CreateThumbCollage(item, itemsWithImages, outputPath, drawText).ConfigureAwait(false);
return true;
return await CreateThumbCollage(item, itemsWithImages, outputPath, drawText).ConfigureAwait(false);
}
if (imageType == ImageType.Primary)
{
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)
{
await CreateSquareCollage(item, itemsWithImages, outputPath, drawText).ConfigureAwait(false);
return await CreateSquareCollage(item, itemsWithImages, outputPath, drawText).ConfigureAwait(false);
}
else
{
await CreatePosterCollage(item, itemsWithImages, outputPath).ConfigureAwait(false);
return await CreatePosterCollage(item, itemsWithImages, outputPath).ConfigureAwait(false);
}
return true;
}
throw new ArgumentException("Unexpected image type");

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

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

@ -9,6 +9,7 @@ using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WebMarkupMin.Core;
using WebMarkupMin.Core.Minifiers;
using WebMarkupMin.Core.Settings;
@ -32,9 +33,9 @@ namespace MediaBrowser.WebDashboard.Api
}
public async Task<Stream> GetResource(string path,
string mode,
string mode,
string localizationCulture,
string appVersion,
string appVersion,
bool enableMinification)
{
var isHtml = IsHtml(path);
@ -58,7 +59,7 @@ namespace MediaBrowser.WebDashboard.Api
{
// Don't apply any caching for html pages
// 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);
}
@ -137,7 +138,12 @@ namespace MediaBrowser.WebDashboard.Api
{
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);
if (result.Errors.Count > 0)
@ -313,7 +319,7 @@ namespace MediaBrowser.WebDashboard.Api
if (string.Equals(mode, "cordova", StringComparison.OrdinalIgnoreCase))
{
apiClientFiles.Add("thirdparty/apiclient/cordova/serverdiscovery.js");
apiClientFiles.Add("thirdparty/cordova/serverdiscovery.js");
}
else
{
@ -321,6 +327,11 @@ namespace MediaBrowser.WebDashboard.Api
}
apiClientFiles.Add("thirdparty/apiclient/connectionmanager.js");
if (string.Equals(mode, "cordova", StringComparison.OrdinalIgnoreCase))
{
apiClientFiles.Add("thirdparty/cordova/remotecontrols.js");
}
foreach (var file in apiClientFiles)
{
using (var fs = _fileSystem.GetFileStream(GetDashboardResourcePath(file), FileMode.Open, FileAccess.Read, FileShare.ReadWrite, true))

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

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

Loading…
Cancel
Save