mirror of
https://github.com/jellyfin/jellyfin.git
synced 2025-07-09 03:04:24 -04:00
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
|
||||
|
43
Emby.Drawing/ImageHelpers.cs
Normal file
43
Emby.Drawing/ImageHelpers.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -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 (!string.IsNullOrWhiteSpace(ip))
|
||||
if (e.LocalEndPoint == null)
|
||||
{
|
||||
var ip = _appHost.LocalIpAddress;
|
||||
e.LocalEndPoint = new IPEndPoint(IPAddress.Parse(ip), 0);
|
||||
}
|
||||
|
||||
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…
x
Reference in New Issue
Block a user