add dish hopper profile
This commit is contained in:
parent
dbb8ec192f
commit
995353e216
|
@ -1638,7 +1638,7 @@ namespace MediaBrowser.Api.Playback
|
||||||
|
|
||||||
AttachMediaStreamInfo(state, mediaStreams, videoRequest, url);
|
AttachMediaStreamInfo(state, mediaStreams, videoRequest, url);
|
||||||
|
|
||||||
state.SegmentLength = state.ReadInputAtNativeFramerate ? 5 : 7;
|
state.SegmentLength = state.ReadInputAtNativeFramerate ? 5 : 6;
|
||||||
state.HlsListSize = state.ReadInputAtNativeFramerate ? 100 : 1440;
|
state.HlsListSize = state.ReadInputAtNativeFramerate ? 100 : 1440;
|
||||||
|
|
||||||
var container = Path.GetExtension(state.RequestedUrl);
|
var container = Path.GetExtension(state.RequestedUrl);
|
||||||
|
|
|
@ -24,32 +24,32 @@ namespace MediaBrowser.Common.Implementations.Networking
|
||||||
/// <returns>IPAddress.</returns>
|
/// <returns>IPAddress.</returns>
|
||||||
public IEnumerable<string> GetLocalIpAddresses()
|
public IEnumerable<string> GetLocalIpAddresses()
|
||||||
{
|
{
|
||||||
var list = GetIPsDefault()
|
var list = GetIPsDefault().Where(i => !IPAddress.IsLoopback(i)).Select(i => i.ToString()).ToList();
|
||||||
.Where(i => !IPAddress.IsLoopback(i))
|
|
||||||
.Select(i => i.ToString())
|
|
||||||
.ToList();
|
|
||||||
|
|
||||||
try
|
if (list.Count > 0)
|
||||||
{
|
{
|
||||||
var listFromDns = Dns.GetHostAddresses(Dns.GetHostName())
|
return list;
|
||||||
.Where(i => i.AddressFamily == AddressFamily.InterNetwork)
|
|
||||||
.Where(i => !IPAddress.IsLoopback(i))
|
|
||||||
.Select(i => i.ToString())
|
|
||||||
.ToList();
|
|
||||||
|
|
||||||
if (listFromDns.Count > 0)
|
|
||||||
{
|
|
||||||
return listFromDns
|
|
||||||
.OrderBy(i => (list.Contains(i, StringComparer.OrdinalIgnoreCase) ? 0 : 1))
|
|
||||||
.ToList();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
catch
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
return GetLocalIpAddressesFallback();
|
||||||
|
}
|
||||||
return list;
|
|
||||||
|
private bool IsInPrivateAddressSpace(string endpoint)
|
||||||
|
{
|
||||||
|
// Private address space:
|
||||||
|
// http://en.wikipedia.org/wiki/Private_network
|
||||||
|
|
||||||
|
return
|
||||||
|
|
||||||
|
// If url was requested with computer name, we may see this
|
||||||
|
endpoint.IndexOf("::", StringComparison.OrdinalIgnoreCase) != -1 ||
|
||||||
|
|
||||||
|
endpoint.StartsWith("localhost", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
endpoint.StartsWith("127.", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
endpoint.StartsWith("10.", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
endpoint.StartsWith("192.", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
endpoint.StartsWith("172.", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
endpoint.StartsWith("169.", StringComparison.OrdinalIgnoreCase);
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool IsInLocalNetwork(string endpoint)
|
public bool IsInLocalNetwork(string endpoint)
|
||||||
|
@ -64,6 +64,11 @@ namespace MediaBrowser.Common.Implementations.Networking
|
||||||
throw new ArgumentNullException("endpoint");
|
throw new ArgumentNullException("endpoint");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (IsInPrivateAddressSpace(endpoint))
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
const int lengthMatch = 4;
|
const int lengthMatch = 4;
|
||||||
|
|
||||||
if (endpoint.Length >= lengthMatch)
|
if (endpoint.Length >= lengthMatch)
|
||||||
|
@ -77,24 +82,6 @@ namespace MediaBrowser.Common.Implementations.Networking
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Private address space:
|
|
||||||
// http://en.wikipedia.org/wiki/Private_network
|
|
||||||
|
|
||||||
var isPrivate =
|
|
||||||
|
|
||||||
// If url was requested with computer name, we may see this
|
|
||||||
endpoint.IndexOf("::", StringComparison.OrdinalIgnoreCase) != -1 ||
|
|
||||||
|
|
||||||
endpoint.StartsWith("10.", StringComparison.OrdinalIgnoreCase) ||
|
|
||||||
endpoint.StartsWith("192.", StringComparison.OrdinalIgnoreCase) ||
|
|
||||||
endpoint.StartsWith("172.", StringComparison.OrdinalIgnoreCase) ||
|
|
||||||
endpoint.StartsWith("169.", StringComparison.OrdinalIgnoreCase);
|
|
||||||
|
|
||||||
if (isPrivate)
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
IPAddress address;
|
IPAddress address;
|
||||||
if (resolveHost && !IPAddress.TryParse(endpoint, out address))
|
if (resolveHost && !IPAddress.TryParse(endpoint, out address))
|
||||||
{
|
{
|
||||||
|
|
|
@ -4,6 +4,7 @@ using MediaBrowser.Controller.Dlna;
|
||||||
using MediaBrowser.Controller.Drawing;
|
using MediaBrowser.Controller.Drawing;
|
||||||
using MediaBrowser.Controller.Entities;
|
using MediaBrowser.Controller.Entities;
|
||||||
using MediaBrowser.Controller.Library;
|
using MediaBrowser.Controller.Library;
|
||||||
|
using MediaBrowser.Controller.Localization;
|
||||||
using MediaBrowser.Dlna.Service;
|
using MediaBrowser.Dlna.Service;
|
||||||
using MediaBrowser.Model.Dlna;
|
using MediaBrowser.Model.Dlna;
|
||||||
using MediaBrowser.Model.Logging;
|
using MediaBrowser.Model.Logging;
|
||||||
|
@ -21,6 +22,7 @@ namespace MediaBrowser.Dlna.ContentDirectory
|
||||||
private readonly IDlnaManager _dlna;
|
private readonly IDlnaManager _dlna;
|
||||||
private readonly IServerConfigurationManager _config;
|
private readonly IServerConfigurationManager _config;
|
||||||
private readonly IUserManager _userManager;
|
private readonly IUserManager _userManager;
|
||||||
|
private readonly ILocalizationManager _localization;
|
||||||
|
|
||||||
public ContentDirectory(IDlnaManager dlna,
|
public ContentDirectory(IDlnaManager dlna,
|
||||||
IUserDataManager userDataManager,
|
IUserDataManager userDataManager,
|
||||||
|
@ -29,7 +31,7 @@ namespace MediaBrowser.Dlna.ContentDirectory
|
||||||
IServerConfigurationManager config,
|
IServerConfigurationManager config,
|
||||||
IUserManager userManager,
|
IUserManager userManager,
|
||||||
ILogger logger,
|
ILogger logger,
|
||||||
IHttpClient httpClient)
|
IHttpClient httpClient, ILocalizationManager localization)
|
||||||
: base(logger, httpClient)
|
: base(logger, httpClient)
|
||||||
{
|
{
|
||||||
_dlna = dlna;
|
_dlna = dlna;
|
||||||
|
@ -38,6 +40,7 @@ namespace MediaBrowser.Dlna.ContentDirectory
|
||||||
_libraryManager = libraryManager;
|
_libraryManager = libraryManager;
|
||||||
_config = config;
|
_config = config;
|
||||||
_userManager = userManager;
|
_userManager = userManager;
|
||||||
|
_localization = localization;
|
||||||
}
|
}
|
||||||
|
|
||||||
private int SystemUpdateId
|
private int SystemUpdateId
|
||||||
|
@ -73,7 +76,8 @@ namespace MediaBrowser.Dlna.ContentDirectory
|
||||||
_userDataManager,
|
_userDataManager,
|
||||||
user,
|
user,
|
||||||
SystemUpdateId,
|
SystemUpdateId,
|
||||||
_config)
|
_config,
|
||||||
|
_localization)
|
||||||
.ProcessControlRequest(request);
|
.ProcessControlRequest(request);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -3,6 +3,7 @@ using MediaBrowser.Controller.Configuration;
|
||||||
using MediaBrowser.Controller.Drawing;
|
using MediaBrowser.Controller.Drawing;
|
||||||
using MediaBrowser.Controller.Entities;
|
using MediaBrowser.Controller.Entities;
|
||||||
using MediaBrowser.Controller.Library;
|
using MediaBrowser.Controller.Library;
|
||||||
|
using MediaBrowser.Controller.Localization;
|
||||||
using MediaBrowser.Dlna.Didl;
|
using MediaBrowser.Dlna.Didl;
|
||||||
using MediaBrowser.Dlna.Server;
|
using MediaBrowser.Dlna.Server;
|
||||||
using MediaBrowser.Dlna.Service;
|
using MediaBrowser.Dlna.Service;
|
||||||
|
@ -38,7 +39,7 @@ namespace MediaBrowser.Dlna.ContentDirectory
|
||||||
|
|
||||||
private readonly DeviceProfile _profile;
|
private readonly DeviceProfile _profile;
|
||||||
|
|
||||||
public ControlHandler(ILogger logger, ILibraryManager libraryManager, DeviceProfile profile, string serverAddress, IImageProcessor imageProcessor, IUserDataManager userDataManager, User user, int systemUpdateId, IServerConfigurationManager config)
|
public ControlHandler(ILogger logger, ILibraryManager libraryManager, DeviceProfile profile, string serverAddress, IImageProcessor imageProcessor, IUserDataManager userDataManager, User user, int systemUpdateId, IServerConfigurationManager config, ILocalizationManager localization)
|
||||||
: base(config, logger)
|
: base(config, logger)
|
||||||
{
|
{
|
||||||
_libraryManager = libraryManager;
|
_libraryManager = libraryManager;
|
||||||
|
@ -47,7 +48,7 @@ namespace MediaBrowser.Dlna.ContentDirectory
|
||||||
_systemUpdateId = systemUpdateId;
|
_systemUpdateId = systemUpdateId;
|
||||||
_profile = profile;
|
_profile = profile;
|
||||||
|
|
||||||
_didlBuilder = new DidlBuilder(profile, user, imageProcessor, serverAddress, userDataManager);
|
_didlBuilder = new DidlBuilder(profile, user, imageProcessor, serverAddress, userDataManager, localization);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override IEnumerable<KeyValuePair<string, string>> GetResult(string methodName, Headers methodParams)
|
protected override IEnumerable<KeyValuePair<string, string>> GetResult(string methodName, Headers methodParams)
|
||||||
|
@ -182,7 +183,7 @@ namespace MediaBrowser.Dlna.ContentDirectory
|
||||||
|
|
||||||
if (folder == null)
|
if (folder == null)
|
||||||
{
|
{
|
||||||
result.DocumentElement.AppendChild(_didlBuilder.GetItemElement(result, item, deviceId, filter));
|
result.DocumentElement.AppendChild(_didlBuilder.GetItemElement(result, item, null, deviceId, filter));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -214,7 +215,7 @@ namespace MediaBrowser.Dlna.ContentDirectory
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
result.DocumentElement.AppendChild(_didlBuilder.GetItemElement(result, i, deviceId, filter));
|
result.DocumentElement.AppendChild(_didlBuilder.GetItemElement(result, i, folder, deviceId, filter));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -288,7 +289,7 @@ namespace MediaBrowser.Dlna.ContentDirectory
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
result.DocumentElement.AppendChild(_didlBuilder.GetItemElement(result, i, deviceId, filter));
|
result.DocumentElement.AppendChild(_didlBuilder.GetItemElement(result, i, folder, deviceId, filter));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -7,6 +7,7 @@ using MediaBrowser.Controller.Entities.Audio;
|
||||||
using MediaBrowser.Controller.Entities.Movies;
|
using MediaBrowser.Controller.Entities.Movies;
|
||||||
using MediaBrowser.Controller.Entities.TV;
|
using MediaBrowser.Controller.Entities.TV;
|
||||||
using MediaBrowser.Controller.Library;
|
using MediaBrowser.Controller.Library;
|
||||||
|
using MediaBrowser.Controller.Localization;
|
||||||
using MediaBrowser.Controller.Playlists;
|
using MediaBrowser.Controller.Playlists;
|
||||||
using MediaBrowser.Model.Dlna;
|
using MediaBrowser.Model.Dlna;
|
||||||
using MediaBrowser.Model.Drawing;
|
using MediaBrowser.Model.Drawing;
|
||||||
|
@ -33,17 +34,19 @@ namespace MediaBrowser.Dlna.Didl
|
||||||
private readonly string _serverAddress;
|
private readonly string _serverAddress;
|
||||||
private readonly User _user;
|
private readonly User _user;
|
||||||
private readonly IUserDataManager _userDataManager;
|
private readonly IUserDataManager _userDataManager;
|
||||||
|
private readonly ILocalizationManager _localization;
|
||||||
|
|
||||||
public DidlBuilder(DeviceProfile profile, User user, IImageProcessor imageProcessor, string serverAddress, IUserDataManager userDataManager)
|
public DidlBuilder(DeviceProfile profile, User user, IImageProcessor imageProcessor, string serverAddress, IUserDataManager userDataManager, ILocalizationManager localization)
|
||||||
{
|
{
|
||||||
_profile = profile;
|
_profile = profile;
|
||||||
_imageProcessor = imageProcessor;
|
_imageProcessor = imageProcessor;
|
||||||
_serverAddress = serverAddress;
|
_serverAddress = serverAddress;
|
||||||
_userDataManager = userDataManager;
|
_userDataManager = userDataManager;
|
||||||
|
_localization = localization;
|
||||||
_user = user;
|
_user = user;
|
||||||
}
|
}
|
||||||
|
|
||||||
public string GetItemDidl(BaseItem item, string deviceId, Filter filter, StreamInfo streamInfo)
|
public string GetItemDidl(BaseItem item, BaseItem context, string deviceId, Filter filter, StreamInfo streamInfo)
|
||||||
{
|
{
|
||||||
var result = new XmlDocument();
|
var result = new XmlDocument();
|
||||||
|
|
||||||
|
@ -60,12 +63,12 @@ namespace MediaBrowser.Dlna.Didl
|
||||||
|
|
||||||
result.AppendChild(didl);
|
result.AppendChild(didl);
|
||||||
|
|
||||||
result.DocumentElement.AppendChild(GetItemElement(result, item, deviceId, filter, streamInfo));
|
result.DocumentElement.AppendChild(GetItemElement(result, item, context, deviceId, filter, streamInfo));
|
||||||
|
|
||||||
return result.DocumentElement.OuterXml;
|
return result.DocumentElement.OuterXml;
|
||||||
}
|
}
|
||||||
|
|
||||||
public XmlElement GetItemElement(XmlDocument doc, BaseItem item, string deviceId, Filter filter, StreamInfo streamInfo = null)
|
public XmlElement GetItemElement(XmlDocument doc, BaseItem item, BaseItem context, string deviceId, Filter filter, StreamInfo streamInfo = null)
|
||||||
{
|
{
|
||||||
var element = doc.CreateElement(string.Empty, "item", NS_DIDL);
|
var element = doc.CreateElement(string.Empty, "item", NS_DIDL);
|
||||||
element.SetAttribute("restricted", "1");
|
element.SetAttribute("restricted", "1");
|
||||||
|
@ -78,7 +81,7 @@ namespace MediaBrowser.Dlna.Didl
|
||||||
|
|
||||||
//AddBookmarkInfo(item, user, element);
|
//AddBookmarkInfo(item, user, element);
|
||||||
|
|
||||||
AddGeneralProperties(item, element, filter);
|
AddGeneralProperties(item, context, element, filter);
|
||||||
|
|
||||||
// refID?
|
// refID?
|
||||||
// storeAttribute(itemNode, object, ClassProperties.REF_ID, false);
|
// storeAttribute(itemNode, object, ClassProperties.REF_ID, false);
|
||||||
|
@ -276,6 +279,38 @@ namespace MediaBrowser.Dlna.Didl
|
||||||
|
|
||||||
container.AppendChild(res);
|
container.AppendChild(res);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private string GetDisplayName(BaseItem item, BaseItem context)
|
||||||
|
{
|
||||||
|
var episode = item as Episode;
|
||||||
|
|
||||||
|
if (episode != null)
|
||||||
|
{
|
||||||
|
// This is a special embedded within a season
|
||||||
|
if (item.ParentIndexNumber.HasValue && item.ParentIndexNumber.Value == 0)
|
||||||
|
{
|
||||||
|
var season = context as Season;
|
||||||
|
if (season != null && season.IndexNumber.HasValue && season.IndexNumber.Value != 0)
|
||||||
|
{
|
||||||
|
return string.Format(_localization.GetLocalizedString("ValueSpecialEpisodeName"), item.Name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (item.IndexNumber.HasValue)
|
||||||
|
{
|
||||||
|
var number = item.IndexNumber.Value.ToString("00").ToString(CultureInfo.InvariantCulture);
|
||||||
|
|
||||||
|
if (episode.IndexNumberEnd.HasValue)
|
||||||
|
{
|
||||||
|
number += "-" + episode.IndexNumberEnd.Value.ToString("00").ToString(CultureInfo.InvariantCulture);
|
||||||
|
}
|
||||||
|
|
||||||
|
return number + " - " + item.Name;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return item.Name;
|
||||||
|
}
|
||||||
|
|
||||||
private void AddAudioResource(XmlElement container, IHasMediaSources audio, string deviceId, Filter filter, StreamInfo streamInfo = null)
|
private void AddAudioResource(XmlElement container, IHasMediaSources audio, string deviceId, Filter filter, StreamInfo streamInfo = null)
|
||||||
{
|
{
|
||||||
|
@ -408,7 +443,7 @@ namespace MediaBrowser.Dlna.Didl
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
AddCommonFields(folder, container, filter);
|
AddCommonFields(folder, null, container, filter);
|
||||||
|
|
||||||
AddCover(folder, container);
|
AddCover(folder, container);
|
||||||
|
|
||||||
|
@ -431,15 +466,16 @@ namespace MediaBrowser.Dlna.Didl
|
||||||
/// Adds fields used by both items and folders
|
/// Adds fields used by both items and folders
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="item">The item.</param>
|
/// <param name="item">The item.</param>
|
||||||
|
/// <param name="context">The context.</param>
|
||||||
/// <param name="element">The element.</param>
|
/// <param name="element">The element.</param>
|
||||||
/// <param name="filter">The filter.</param>
|
/// <param name="filter">The filter.</param>
|
||||||
private void AddCommonFields(BaseItem item, XmlElement element, Filter filter)
|
private void AddCommonFields(BaseItem item, BaseItem context, XmlElement element, Filter filter)
|
||||||
{
|
{
|
||||||
// Don't filter on dc:title because not all devices will include it in the filter
|
// Don't filter on dc:title because not all devices will include it in the filter
|
||||||
// MediaMonkey for example won't display content without a title
|
// MediaMonkey for example won't display content without a title
|
||||||
//if (filter.Contains("dc:title"))
|
//if (filter.Contains("dc:title"))
|
||||||
{
|
{
|
||||||
AddValue(element, "dc", "title", item.Name, NS_DC);
|
AddValue(element, "dc", "title", GetDisplayName(item, context), NS_DC);
|
||||||
}
|
}
|
||||||
|
|
||||||
element.AppendChild(CreateObjectClass(element.OwnerDocument, item));
|
element.AppendChild(CreateObjectClass(element.OwnerDocument, item));
|
||||||
|
@ -592,9 +628,9 @@ namespace MediaBrowser.Dlna.Didl
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void AddGeneralProperties(BaseItem item, XmlElement element, Filter filter)
|
private void AddGeneralProperties(BaseItem item, BaseItem context, XmlElement element, Filter filter)
|
||||||
{
|
{
|
||||||
AddCommonFields(item, element, filter);
|
AddCommonFields(item, context, element, filter);
|
||||||
|
|
||||||
var audio = item as Audio;
|
var audio = item as Audio;
|
||||||
|
|
||||||
|
|
|
@ -80,6 +80,7 @@ namespace MediaBrowser.Dlna
|
||||||
new WindowsPhoneProfile(),
|
new WindowsPhoneProfile(),
|
||||||
new AndroidProfile(),
|
new AndroidProfile(),
|
||||||
new DirectTvProfile(),
|
new DirectTvProfile(),
|
||||||
|
new DishHopperJoeyProfile(),
|
||||||
new DefaultProfile()
|
new DefaultProfile()
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -6,6 +6,7 @@ using MediaBrowser.Controller.Configuration;
|
||||||
using MediaBrowser.Controller.Dlna;
|
using MediaBrowser.Controller.Dlna;
|
||||||
using MediaBrowser.Controller.Drawing;
|
using MediaBrowser.Controller.Drawing;
|
||||||
using MediaBrowser.Controller.Library;
|
using MediaBrowser.Controller.Library;
|
||||||
|
using MediaBrowser.Controller.Localization;
|
||||||
using MediaBrowser.Controller.Persistence;
|
using MediaBrowser.Controller.Persistence;
|
||||||
using MediaBrowser.Controller.Plugins;
|
using MediaBrowser.Controller.Plugins;
|
||||||
using MediaBrowser.Controller.Session;
|
using MediaBrowser.Controller.Session;
|
||||||
|
@ -35,6 +36,7 @@ namespace MediaBrowser.Dlna.Main
|
||||||
private readonly IDlnaManager _dlnaManager;
|
private readonly IDlnaManager _dlnaManager;
|
||||||
private readonly IImageProcessor _imageProcessor;
|
private readonly IImageProcessor _imageProcessor;
|
||||||
private readonly IUserDataManager _userDataManager;
|
private readonly IUserDataManager _userDataManager;
|
||||||
|
private readonly ILocalizationManager _localization;
|
||||||
|
|
||||||
private SsdpHandler _ssdpHandler;
|
private SsdpHandler _ssdpHandler;
|
||||||
private DeviceDiscovery _deviceDiscovery;
|
private DeviceDiscovery _deviceDiscovery;
|
||||||
|
@ -42,7 +44,7 @@ namespace MediaBrowser.Dlna.Main
|
||||||
private readonly List<string> _registeredServerIds = new List<string>();
|
private readonly List<string> _registeredServerIds = new List<string>();
|
||||||
private bool _dlnaServerStarted;
|
private bool _dlnaServerStarted;
|
||||||
|
|
||||||
public DlnaEntryPoint(IServerConfigurationManager config, ILogManager logManager, IServerApplicationHost appHost, INetworkManager network, ISessionManager sessionManager, IHttpClient httpClient, IItemRepository itemRepo, ILibraryManager libraryManager, IUserManager userManager, IDlnaManager dlnaManager, IImageProcessor imageProcessor, IUserDataManager userDataManager)
|
public DlnaEntryPoint(IServerConfigurationManager config, ILogManager logManager, IServerApplicationHost appHost, INetworkManager network, ISessionManager sessionManager, IHttpClient httpClient, IItemRepository itemRepo, ILibraryManager libraryManager, IUserManager userManager, IDlnaManager dlnaManager, IImageProcessor imageProcessor, IUserDataManager userDataManager, ILocalizationManager localization)
|
||||||
{
|
{
|
||||||
_config = config;
|
_config = config;
|
||||||
_appHost = appHost;
|
_appHost = appHost;
|
||||||
|
@ -55,6 +57,7 @@ namespace MediaBrowser.Dlna.Main
|
||||||
_dlnaManager = dlnaManager;
|
_dlnaManager = dlnaManager;
|
||||||
_imageProcessor = imageProcessor;
|
_imageProcessor = imageProcessor;
|
||||||
_userDataManager = userDataManager;
|
_userDataManager = userDataManager;
|
||||||
|
_localization = localization;
|
||||||
_logger = logManager.GetLogger("Dlna");
|
_logger = logManager.GetLogger("Dlna");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -221,7 +224,8 @@ namespace MediaBrowser.Dlna.Main
|
||||||
_deviceDiscovery,
|
_deviceDiscovery,
|
||||||
_httpClient,
|
_httpClient,
|
||||||
_config,
|
_config,
|
||||||
_userDataManager);
|
_userDataManager,
|
||||||
|
_localization);
|
||||||
|
|
||||||
_manager.Start();
|
_manager.Start();
|
||||||
}
|
}
|
||||||
|
|
|
@ -74,6 +74,7 @@
|
||||||
<Compile Include="Didl\DidlBuilder.cs" />
|
<Compile Include="Didl\DidlBuilder.cs" />
|
||||||
<Compile Include="PlayTo\PlayToController.cs" />
|
<Compile Include="PlayTo\PlayToController.cs" />
|
||||||
<Compile Include="Profiles\DirectTvProfile.cs" />
|
<Compile Include="Profiles\DirectTvProfile.cs" />
|
||||||
|
<Compile Include="Profiles\DishHopperJoeyProfile.cs" />
|
||||||
<Compile Include="Ssdp\DeviceDiscoveryInfo.cs" />
|
<Compile Include="Ssdp\DeviceDiscoveryInfo.cs" />
|
||||||
<Compile Include="Ssdp\Extensions.cs" />
|
<Compile Include="Ssdp\Extensions.cs" />
|
||||||
<Compile Include="PlayTo\PlaybackProgressEventArgs.cs" />
|
<Compile Include="PlayTo\PlaybackProgressEventArgs.cs" />
|
||||||
|
@ -192,6 +193,9 @@
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<EmbeddedResource Include="Profiles\Xml\DirecTV HD-DVR.xml" />
|
<EmbeddedResource Include="Profiles\Xml\DirecTV HD-DVR.xml" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<EmbeddedResource Include="Profiles\Xml\Dish Hopper-Joey.xml" />
|
||||||
|
</ItemGroup>
|
||||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||||
Other similar extension points exist, see Microsoft.Common.targets.
|
Other similar extension points exist, see Microsoft.Common.targets.
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
using MediaBrowser.Controller.Drawing;
|
using MediaBrowser.Controller.Drawing;
|
||||||
using MediaBrowser.Controller.Entities;
|
using MediaBrowser.Controller.Entities;
|
||||||
using MediaBrowser.Controller.Library;
|
using MediaBrowser.Controller.Library;
|
||||||
|
using MediaBrowser.Controller.Localization;
|
||||||
using MediaBrowser.Controller.Persistence;
|
using MediaBrowser.Controller.Persistence;
|
||||||
using MediaBrowser.Controller.Session;
|
using MediaBrowser.Controller.Session;
|
||||||
using MediaBrowser.Dlna.Didl;
|
using MediaBrowser.Dlna.Didl;
|
||||||
|
@ -33,6 +34,7 @@ namespace MediaBrowser.Dlna.PlayTo
|
||||||
private readonly IUserManager _userManager;
|
private readonly IUserManager _userManager;
|
||||||
private readonly IImageProcessor _imageProcessor;
|
private readonly IImageProcessor _imageProcessor;
|
||||||
private readonly IUserDataManager _userDataManager;
|
private readonly IUserDataManager _userDataManager;
|
||||||
|
private readonly ILocalizationManager _localization;
|
||||||
|
|
||||||
private readonly DeviceDiscovery _deviceDiscovery;
|
private readonly DeviceDiscovery _deviceDiscovery;
|
||||||
private readonly string _serverAddress;
|
private readonly string _serverAddress;
|
||||||
|
@ -52,7 +54,7 @@ namespace MediaBrowser.Dlna.PlayTo
|
||||||
|
|
||||||
private Timer _updateTimer;
|
private Timer _updateTimer;
|
||||||
|
|
||||||
public PlayToController(SessionInfo session, ISessionManager sessionManager, IItemRepository itemRepository, ILibraryManager libraryManager, ILogger logger, IDlnaManager dlnaManager, IUserManager userManager, IImageProcessor imageProcessor, string serverAddress, DeviceDiscovery deviceDiscovery, IUserDataManager userDataManager)
|
public PlayToController(SessionInfo session, ISessionManager sessionManager, IItemRepository itemRepository, ILibraryManager libraryManager, ILogger logger, IDlnaManager dlnaManager, IUserManager userManager, IImageProcessor imageProcessor, string serverAddress, DeviceDiscovery deviceDiscovery, IUserDataManager userDataManager, ILocalizationManager localization)
|
||||||
{
|
{
|
||||||
_session = session;
|
_session = session;
|
||||||
_itemRepository = itemRepository;
|
_itemRepository = itemRepository;
|
||||||
|
@ -64,6 +66,7 @@ namespace MediaBrowser.Dlna.PlayTo
|
||||||
_serverAddress = serverAddress;
|
_serverAddress = serverAddress;
|
||||||
_deviceDiscovery = deviceDiscovery;
|
_deviceDiscovery = deviceDiscovery;
|
||||||
_userDataManager = userDataManager;
|
_userDataManager = userDataManager;
|
||||||
|
_localization = localization;
|
||||||
_logger = logger;
|
_logger = logger;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -476,7 +479,8 @@ namespace MediaBrowser.Dlna.PlayTo
|
||||||
|
|
||||||
playlistItem.StreamUrl = playlistItem.StreamInfo.ToUrl(serverAddress);
|
playlistItem.StreamUrl = playlistItem.StreamInfo.ToUrl(serverAddress);
|
||||||
|
|
||||||
var itemXml = new DidlBuilder(profile, user, _imageProcessor, serverAddress, _userDataManager).GetItemDidl(item, _session.DeviceId, new Filter(), playlistItem.StreamInfo);
|
var itemXml = new DidlBuilder(profile, user, _imageProcessor, serverAddress, _userDataManager, _localization)
|
||||||
|
.GetItemDidl(item, null, _session.DeviceId, new Filter(), playlistItem.StreamInfo);
|
||||||
|
|
||||||
playlistItem.Didl = itemXml;
|
playlistItem.Didl = itemXml;
|
||||||
|
|
||||||
|
|
|
@ -4,6 +4,7 @@ using MediaBrowser.Controller.Configuration;
|
||||||
using MediaBrowser.Controller.Dlna;
|
using MediaBrowser.Controller.Dlna;
|
||||||
using MediaBrowser.Controller.Drawing;
|
using MediaBrowser.Controller.Drawing;
|
||||||
using MediaBrowser.Controller.Library;
|
using MediaBrowser.Controller.Library;
|
||||||
|
using MediaBrowser.Controller.Localization;
|
||||||
using MediaBrowser.Controller.Persistence;
|
using MediaBrowser.Controller.Persistence;
|
||||||
using MediaBrowser.Controller.Session;
|
using MediaBrowser.Controller.Session;
|
||||||
using MediaBrowser.Dlna.Ssdp;
|
using MediaBrowser.Dlna.Ssdp;
|
||||||
|
@ -30,10 +31,11 @@ namespace MediaBrowser.Dlna.PlayTo
|
||||||
private readonly IHttpClient _httpClient;
|
private readonly IHttpClient _httpClient;
|
||||||
private readonly IServerConfigurationManager _config;
|
private readonly IServerConfigurationManager _config;
|
||||||
private readonly IUserDataManager _userDataManager;
|
private readonly IUserDataManager _userDataManager;
|
||||||
|
private readonly ILocalizationManager _localization;
|
||||||
|
|
||||||
private readonly DeviceDiscovery _deviceDiscovery;
|
private readonly DeviceDiscovery _deviceDiscovery;
|
||||||
|
|
||||||
public PlayToManager(ILogger logger, ISessionManager sessionManager, IItemRepository itemRepository, ILibraryManager libraryManager, IUserManager userManager, IDlnaManager dlnaManager, IServerApplicationHost appHost, IImageProcessor imageProcessor, DeviceDiscovery deviceDiscovery, IHttpClient httpClient, IServerConfigurationManager config, IUserDataManager userDataManager)
|
public PlayToManager(ILogger logger, ISessionManager sessionManager, IItemRepository itemRepository, ILibraryManager libraryManager, IUserManager userManager, IDlnaManager dlnaManager, IServerApplicationHost appHost, IImageProcessor imageProcessor, DeviceDiscovery deviceDiscovery, IHttpClient httpClient, IServerConfigurationManager config, IUserDataManager userDataManager, ILocalizationManager localization)
|
||||||
{
|
{
|
||||||
_logger = logger;
|
_logger = logger;
|
||||||
_sessionManager = sessionManager;
|
_sessionManager = sessionManager;
|
||||||
|
@ -47,6 +49,7 @@ namespace MediaBrowser.Dlna.PlayTo
|
||||||
_httpClient = httpClient;
|
_httpClient = httpClient;
|
||||||
_config = config;
|
_config = config;
|
||||||
_userDataManager = userDataManager;
|
_userDataManager = userDataManager;
|
||||||
|
_localization = localization;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Start()
|
public void Start()
|
||||||
|
@ -106,7 +109,8 @@ namespace MediaBrowser.Dlna.PlayTo
|
||||||
_imageProcessor,
|
_imageProcessor,
|
||||||
serverAddress,
|
serverAddress,
|
||||||
_deviceDiscovery,
|
_deviceDiscovery,
|
||||||
_userDataManager);
|
_userDataManager,
|
||||||
|
_localization);
|
||||||
|
|
||||||
controller.Init(device);
|
controller.Init(device);
|
||||||
|
|
||||||
|
|
|
@ -53,6 +53,12 @@ namespace MediaBrowser.Dlna.Profiles
|
||||||
AudioCodec = "aac",
|
AudioCodec = "aac",
|
||||||
VideoCodec = "h264",
|
VideoCodec = "h264",
|
||||||
VideoProfile= "baseline"
|
VideoProfile= "baseline"
|
||||||
|
},
|
||||||
|
|
||||||
|
new TranscodingProfile
|
||||||
|
{
|
||||||
|
Container = "jpeg",
|
||||||
|
Type = DlnaProfileType.Photo
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
219
MediaBrowser.Dlna/Profiles/DishHopperJoeyProfile.cs
Normal file
219
MediaBrowser.Dlna/Profiles/DishHopperJoeyProfile.cs
Normal file
|
@ -0,0 +1,219 @@
|
||||||
|
using MediaBrowser.Model.Dlna;
|
||||||
|
using System.Xml.Serialization;
|
||||||
|
|
||||||
|
namespace MediaBrowser.Dlna.Profiles
|
||||||
|
{
|
||||||
|
[XmlRoot("Profile")]
|
||||||
|
public class DishHopperJoeyProfile : DefaultProfile
|
||||||
|
{
|
||||||
|
public DishHopperJoeyProfile()
|
||||||
|
{
|
||||||
|
Name = "Dish Hopper-Joey";
|
||||||
|
|
||||||
|
ProtocolInfo = "http-get:*:video/mp2t:*,http-get:*:video/MP1S:*,http-get:*:video/mpeg2:*,http-get:*:video/mp4:*,http-get:*:video/x-matroska:*,http-get:*:audio/mpeg:*,http-get:*:audio/mpeg3:*,http-get:*:audio/mp3:*,http-get:*:audio/mp4:*,http-get:*:audio/mp4a-latm:*,http-get:*:image/jpeg:*";
|
||||||
|
|
||||||
|
Identification = new DeviceIdentification
|
||||||
|
{
|
||||||
|
Manufacturer = "Echostar Technologies LLC",
|
||||||
|
ManufacturerUrl = "http://www.echostar.com",
|
||||||
|
|
||||||
|
Headers = new[]
|
||||||
|
{
|
||||||
|
new HttpHeaderInfo
|
||||||
|
{
|
||||||
|
Match = HeaderMatchType.Substring,
|
||||||
|
Name = "User-Agent",
|
||||||
|
Value ="XiP"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
TranscodingProfiles = new[]
|
||||||
|
{
|
||||||
|
new TranscodingProfile
|
||||||
|
{
|
||||||
|
Container = "mp3",
|
||||||
|
AudioCodec = "mp3",
|
||||||
|
Type = DlnaProfileType.Audio
|
||||||
|
},
|
||||||
|
new TranscodingProfile
|
||||||
|
{
|
||||||
|
Container = "mp4",
|
||||||
|
Type = DlnaProfileType.Video,
|
||||||
|
AudioCodec = "aac",
|
||||||
|
VideoCodec = "h264"
|
||||||
|
},
|
||||||
|
|
||||||
|
new TranscodingProfile
|
||||||
|
{
|
||||||
|
Container = "jpeg",
|
||||||
|
Type = DlnaProfileType.Photo
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
DirectPlayProfiles = new[]
|
||||||
|
{
|
||||||
|
new DirectPlayProfile
|
||||||
|
{
|
||||||
|
Container = "mp4,mkv,mpeg,ts",
|
||||||
|
VideoCodec = "h264,mpeg2video",
|
||||||
|
AudioCodec = "mp3,ac3,aac,he-aac,pcm",
|
||||||
|
Type = DlnaProfileType.Video
|
||||||
|
},
|
||||||
|
|
||||||
|
new DirectPlayProfile
|
||||||
|
{
|
||||||
|
Container = "mp3",
|
||||||
|
AudioCodec = "mp3",
|
||||||
|
Type = DlnaProfileType.Audio
|
||||||
|
},
|
||||||
|
|
||||||
|
new DirectPlayProfile
|
||||||
|
{
|
||||||
|
Container = "alac",
|
||||||
|
AudioCodec = "alac",
|
||||||
|
Type = DlnaProfileType.Audio
|
||||||
|
},
|
||||||
|
|
||||||
|
new DirectPlayProfile
|
||||||
|
{
|
||||||
|
Container = "flac",
|
||||||
|
AudioCodec = "flac",
|
||||||
|
Type = DlnaProfileType.Audio
|
||||||
|
},
|
||||||
|
|
||||||
|
new DirectPlayProfile
|
||||||
|
{
|
||||||
|
Container = "jpeg",
|
||||||
|
Type = DlnaProfileType.Photo
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
CodecProfiles = new[]
|
||||||
|
{
|
||||||
|
new CodecProfile
|
||||||
|
{
|
||||||
|
Type = CodecType.Video,
|
||||||
|
Conditions = new []
|
||||||
|
{
|
||||||
|
new ProfileCondition
|
||||||
|
{
|
||||||
|
Condition = ProfileConditionType.LessThanEqual,
|
||||||
|
Property = ProfileConditionValue.Width,
|
||||||
|
Value = "1920",
|
||||||
|
IsRequired = true
|
||||||
|
},
|
||||||
|
new ProfileCondition
|
||||||
|
{
|
||||||
|
Condition = ProfileConditionType.LessThanEqual,
|
||||||
|
Property = ProfileConditionValue.Height,
|
||||||
|
Value = "1080",
|
||||||
|
IsRequired = true
|
||||||
|
},
|
||||||
|
new ProfileCondition
|
||||||
|
{
|
||||||
|
Condition = ProfileConditionType.LessThanEqual,
|
||||||
|
Property = ProfileConditionValue.VideoFramerate,
|
||||||
|
Value = "30",
|
||||||
|
IsRequired = true
|
||||||
|
},
|
||||||
|
new ProfileCondition
|
||||||
|
{
|
||||||
|
Condition = ProfileConditionType.LessThanEqual,
|
||||||
|
Property = ProfileConditionValue.VideoBitrate,
|
||||||
|
Value = "20000000",
|
||||||
|
IsRequired = true
|
||||||
|
},
|
||||||
|
new ProfileCondition
|
||||||
|
{
|
||||||
|
Condition = ProfileConditionType.LessThanEqual,
|
||||||
|
Property = ProfileConditionValue.VideoLevel,
|
||||||
|
Value = "41",
|
||||||
|
IsRequired = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
new CodecProfile
|
||||||
|
{
|
||||||
|
Type = CodecType.Video,
|
||||||
|
Codec = "mpeg2video",
|
||||||
|
Conditions = new []
|
||||||
|
{
|
||||||
|
new ProfileCondition
|
||||||
|
{
|
||||||
|
Condition = ProfileConditionType.LessThanEqual,
|
||||||
|
Property = ProfileConditionValue.Width,
|
||||||
|
Value = "1920",
|
||||||
|
IsRequired = true
|
||||||
|
},
|
||||||
|
new ProfileCondition
|
||||||
|
{
|
||||||
|
Condition = ProfileConditionType.LessThanEqual,
|
||||||
|
Property = ProfileConditionValue.Height,
|
||||||
|
Value = "1080",
|
||||||
|
IsRequired = true
|
||||||
|
},
|
||||||
|
new ProfileCondition
|
||||||
|
{
|
||||||
|
Condition = ProfileConditionType.LessThanEqual,
|
||||||
|
Property = ProfileConditionValue.VideoFramerate,
|
||||||
|
Value = "30",
|
||||||
|
IsRequired = true
|
||||||
|
},
|
||||||
|
new ProfileCondition
|
||||||
|
{
|
||||||
|
Condition = ProfileConditionType.LessThanEqual,
|
||||||
|
Property = ProfileConditionValue.VideoBitrate,
|
||||||
|
Value = "20000000",
|
||||||
|
IsRequired = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
new CodecProfile
|
||||||
|
{
|
||||||
|
Type = CodecType.VideoAudio,
|
||||||
|
Codec = "ac3,he-aac",
|
||||||
|
Conditions = new []
|
||||||
|
{
|
||||||
|
new ProfileCondition
|
||||||
|
{
|
||||||
|
Condition = ProfileConditionType.LessThanEqual,
|
||||||
|
Property = ProfileConditionValue.AudioChannels,
|
||||||
|
Value = "6",
|
||||||
|
IsRequired = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
new CodecProfile
|
||||||
|
{
|
||||||
|
Type = CodecType.VideoAudio,
|
||||||
|
Codec = "aac",
|
||||||
|
Conditions = new []
|
||||||
|
{
|
||||||
|
new ProfileCondition
|
||||||
|
{
|
||||||
|
Condition = ProfileConditionType.LessThanEqual,
|
||||||
|
Property = ProfileConditionValue.AudioChannels,
|
||||||
|
Value = "2",
|
||||||
|
IsRequired = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
ResponseProfiles = new[]
|
||||||
|
{
|
||||||
|
new ResponseProfile
|
||||||
|
{
|
||||||
|
Container = "mkv,ts",
|
||||||
|
Type = DlnaProfileType.Video,
|
||||||
|
MimeType = "video/mp4"
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -33,6 +33,7 @@
|
||||||
<TranscodingProfiles>
|
<TranscodingProfiles>
|
||||||
<TranscodingProfile container="mp3" type="Audio" audioCodec="mp3" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" context="Streaming" />
|
<TranscodingProfile container="mp3" type="Audio" audioCodec="mp3" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" context="Streaming" />
|
||||||
<TranscodingProfile container="ts" type="Video" videoCodec="h264" audioCodec="aac" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" videoProfile="baseline" context="Streaming" />
|
<TranscodingProfile container="ts" type="Video" videoCodec="h264" audioCodec="aac" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" videoProfile="baseline" context="Streaming" />
|
||||||
|
<TranscodingProfile container="jpeg" type="Photo" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" context="Streaming" />
|
||||||
</TranscodingProfiles>
|
</TranscodingProfiles>
|
||||||
<ContainerProfiles />
|
<ContainerProfiles />
|
||||||
<CodecProfiles />
|
<CodecProfiles />
|
||||||
|
|
|
@ -37,6 +37,7 @@
|
||||||
<TranscodingProfiles>
|
<TranscodingProfiles>
|
||||||
<TranscodingProfile container="mp3" type="Audio" audioCodec="mp3" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" context="Streaming" />
|
<TranscodingProfile container="mp3" type="Audio" audioCodec="mp3" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" context="Streaming" />
|
||||||
<TranscodingProfile container="ts" type="Video" videoCodec="h264" audioCodec="aac" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" videoProfile="baseline" context="Streaming" />
|
<TranscodingProfile container="ts" type="Video" videoCodec="h264" audioCodec="aac" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" videoProfile="baseline" context="Streaming" />
|
||||||
|
<TranscodingProfile container="jpeg" type="Photo" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" context="Streaming" />
|
||||||
</TranscodingProfiles>
|
</TranscodingProfiles>
|
||||||
<ContainerProfiles />
|
<ContainerProfiles />
|
||||||
<CodecProfiles />
|
<CodecProfiles />
|
||||||
|
|
84
MediaBrowser.Dlna/Profiles/Xml/Dish Hopper-Joey.xml
Normal file
84
MediaBrowser.Dlna/Profiles/Xml/Dish Hopper-Joey.xml
Normal file
|
@ -0,0 +1,84 @@
|
||||||
|
<?xml version="1.0"?>
|
||||||
|
<Profile xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
|
||||||
|
<Name>Dish Hopper-Joey</Name>
|
||||||
|
<Identification>
|
||||||
|
<Manufacturer>Echostar Technologies LLC</Manufacturer>
|
||||||
|
<ManufacturerUrl>http://www.echostar.com</ManufacturerUrl>
|
||||||
|
<Headers>
|
||||||
|
<HttpHeaderInfo name="User-Agent" value="XiP" match="Substring" />
|
||||||
|
</Headers>
|
||||||
|
</Identification>
|
||||||
|
<FriendlyName>Media Browser</FriendlyName>
|
||||||
|
<Manufacturer>Media Browser</Manufacturer>
|
||||||
|
<ManufacturerUrl>http://mediabrowser.tv/</ManufacturerUrl>
|
||||||
|
<ModelName>Media Browser</ModelName>
|
||||||
|
<ModelDescription>Media Browser</ModelDescription>
|
||||||
|
<ModelNumber>Media Browser</ModelNumber>
|
||||||
|
<ModelUrl>http://mediabrowser.tv/</ModelUrl>
|
||||||
|
<IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
|
||||||
|
<EnableAlbumArtInDidl>false</EnableAlbumArtInDidl>
|
||||||
|
<SupportedMediaTypes>Audio,Photo,Video</SupportedMediaTypes>
|
||||||
|
<AlbumArtPn>JPEG_SM</AlbumArtPn>
|
||||||
|
<MaxAlbumArtWidth>480</MaxAlbumArtWidth>
|
||||||
|
<MaxAlbumArtHeight>480</MaxAlbumArtHeight>
|
||||||
|
<MaxIconWidth>48</MaxIconWidth>
|
||||||
|
<MaxIconHeight>48</MaxIconHeight>
|
||||||
|
<MaxStreamingBitrate>8000000</MaxStreamingBitrate>
|
||||||
|
<MaxStaticBitrate>8000000</MaxStaticBitrate>
|
||||||
|
<MusicStreamingTranscodingBitrate>128000</MusicStreamingTranscodingBitrate>
|
||||||
|
<MusicSyncBitrate>128000</MusicSyncBitrate>
|
||||||
|
<XDlnaDoc>DMS-1.50</XDlnaDoc>
|
||||||
|
<ProtocolInfo>http-get:*:video/mp2t:*,http-get:*:video/MP1S:*,http-get:*:video/mpeg2:*,http-get:*:video/mp4:*,http-get:*:video/x-matroska:*,http-get:*:audio/mpeg:*,http-get:*:audio/mpeg3:*,http-get:*:audio/mp3:*,http-get:*:audio/mp4:*,http-get:*:audio/mp4a-latm:*,http-get:*:image/jpeg:*</ProtocolInfo>
|
||||||
|
<TimelineOffsetSeconds>0</TimelineOffsetSeconds>
|
||||||
|
<RequiresPlainVideoItems>false</RequiresPlainVideoItems>
|
||||||
|
<RequiresPlainFolders>false</RequiresPlainFolders>
|
||||||
|
<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" />
|
||||||
|
<DirectPlayProfile container="alac" audioCodec="alac" type="Audio" />
|
||||||
|
<DirectPlayProfile container="flac" audioCodec="flac" type="Audio" />
|
||||||
|
<DirectPlayProfile container="jpeg" type="Photo" />
|
||||||
|
</DirectPlayProfiles>
|
||||||
|
<TranscodingProfiles>
|
||||||
|
<TranscodingProfile container="mp3" type="Audio" audioCodec="mp3" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" context="Streaming" />
|
||||||
|
<TranscodingProfile container="mp4" type="Video" videoCodec="h264" audioCodec="aac" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" context="Streaming" />
|
||||||
|
<TranscodingProfile container="jpeg" type="Photo" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" context="Streaming" />
|
||||||
|
</TranscodingProfiles>
|
||||||
|
<ContainerProfiles />
|
||||||
|
<CodecProfiles>
|
||||||
|
<CodecProfile type="Video">
|
||||||
|
<Conditions>
|
||||||
|
<ProfileCondition condition="LessThanEqual" property="Width" value="1920" isRequired="true" />
|
||||||
|
<ProfileCondition condition="LessThanEqual" property="Height" value="1080" isRequired="true" />
|
||||||
|
<ProfileCondition condition="LessThanEqual" property="VideoFramerate" value="30" isRequired="true" />
|
||||||
|
<ProfileCondition condition="LessThanEqual" property="VideoBitrate" value="20000000" isRequired="true" />
|
||||||
|
<ProfileCondition condition="LessThanEqual" property="VideoLevel" value="41" isRequired="true" />
|
||||||
|
</Conditions>
|
||||||
|
</CodecProfile>
|
||||||
|
<CodecProfile type="Video" codec="mpeg2video">
|
||||||
|
<Conditions>
|
||||||
|
<ProfileCondition condition="LessThanEqual" property="Width" value="1920" isRequired="true" />
|
||||||
|
<ProfileCondition condition="LessThanEqual" property="Height" value="1080" isRequired="true" />
|
||||||
|
<ProfileCondition condition="LessThanEqual" property="VideoFramerate" value="30" isRequired="true" />
|
||||||
|
<ProfileCondition condition="LessThanEqual" property="VideoBitrate" value="20000000" isRequired="true" />
|
||||||
|
</Conditions>
|
||||||
|
</CodecProfile>
|
||||||
|
<CodecProfile type="VideoAudio" codec="ac3,he-aac">
|
||||||
|
<Conditions>
|
||||||
|
<ProfileCondition condition="LessThanEqual" property="AudioChannels" value="6" isRequired="true" />
|
||||||
|
</Conditions>
|
||||||
|
</CodecProfile>
|
||||||
|
<CodecProfile type="VideoAudio" codec="aac">
|
||||||
|
<Conditions>
|
||||||
|
<ProfileCondition condition="LessThanEqual" property="AudioChannels" value="2" isRequired="true" />
|
||||||
|
</Conditions>
|
||||||
|
</CodecProfile>
|
||||||
|
</CodecProfiles>
|
||||||
|
<ResponseProfiles>
|
||||||
|
<ResponseProfile container="mkv,ts" type="Video" mimeType="video/mp4">
|
||||||
|
<Conditions />
|
||||||
|
</ResponseProfile>
|
||||||
|
</ResponseProfiles>
|
||||||
|
<SubtitleProfiles />
|
||||||
|
</Profile>
|
|
@ -37,6 +37,7 @@
|
||||||
<TranscodingProfiles>
|
<TranscodingProfiles>
|
||||||
<TranscodingProfile container="mp3" type="Audio" audioCodec="mp3" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" context="Streaming" />
|
<TranscodingProfile container="mp3" type="Audio" audioCodec="mp3" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" context="Streaming" />
|
||||||
<TranscodingProfile container="ts" type="Video" videoCodec="h264" audioCodec="aac" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" videoProfile="baseline" context="Streaming" />
|
<TranscodingProfile container="ts" type="Video" videoCodec="h264" audioCodec="aac" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" videoProfile="baseline" context="Streaming" />
|
||||||
|
<TranscodingProfile container="jpeg" type="Photo" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" context="Streaming" />
|
||||||
</TranscodingProfiles>
|
</TranscodingProfiles>
|
||||||
<ContainerProfiles />
|
<ContainerProfiles />
|
||||||
<CodecProfiles />
|
<CodecProfiles />
|
||||||
|
|
|
@ -43,6 +43,7 @@
|
||||||
<TranscodingProfiles>
|
<TranscodingProfiles>
|
||||||
<TranscodingProfile container="mp3" type="Audio" audioCodec="mp3" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" context="Streaming" />
|
<TranscodingProfile container="mp3" type="Audio" audioCodec="mp3" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" context="Streaming" />
|
||||||
<TranscodingProfile container="ts" type="Video" videoCodec="h264" audioCodec="aac" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" videoProfile="baseline" context="Streaming" />
|
<TranscodingProfile container="ts" type="Video" videoCodec="h264" audioCodec="aac" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" videoProfile="baseline" context="Streaming" />
|
||||||
|
<TranscodingProfile container="jpeg" type="Photo" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" context="Streaming" />
|
||||||
</TranscodingProfiles>
|
</TranscodingProfiles>
|
||||||
<ContainerProfiles />
|
<ContainerProfiles />
|
||||||
<CodecProfiles />
|
<CodecProfiles />
|
||||||
|
|
|
@ -65,6 +65,6 @@
|
||||||
</CodecProfiles>
|
</CodecProfiles>
|
||||||
<ResponseProfiles />
|
<ResponseProfiles />
|
||||||
<SubtitleProfiles>
|
<SubtitleProfiles>
|
||||||
<SubtitleProfile format="ttml" method="External" />
|
<SubtitleProfile format="vtt" method="External" />
|
||||||
</SubtitleProfiles>
|
</SubtitleProfiles>
|
||||||
</Profile>
|
</Profile>
|
|
@ -43,6 +43,7 @@
|
||||||
<TranscodingProfiles>
|
<TranscodingProfiles>
|
||||||
<TranscodingProfile container="mp3" type="Audio" audioCodec="mp3" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" context="Streaming" />
|
<TranscodingProfile container="mp3" type="Audio" audioCodec="mp3" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" context="Streaming" />
|
||||||
<TranscodingProfile container="ts" type="Video" videoCodec="h264" audioCodec="aac" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" videoProfile="baseline" context="Streaming" />
|
<TranscodingProfile container="ts" type="Video" videoCodec="h264" audioCodec="aac" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" videoProfile="baseline" context="Streaming" />
|
||||||
|
<TranscodingProfile container="jpeg" type="Photo" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" context="Streaming" />
|
||||||
</TranscodingProfiles>
|
</TranscodingProfiles>
|
||||||
<ContainerProfiles />
|
<ContainerProfiles />
|
||||||
<CodecProfiles />
|
<CodecProfiles />
|
||||||
|
|
|
@ -166,6 +166,17 @@ namespace MediaBrowser.Server.Implementations.HttpServer
|
||||||
|
|
||||||
private void OnRequestReceived(string localEndPoint)
|
private void OnRequestReceived(string localEndPoint)
|
||||||
{
|
{
|
||||||
|
var ignore = localEndPoint.IndexOf("::", StringComparison.OrdinalIgnoreCase) != -1 ||
|
||||||
|
|
||||||
|
localEndPoint.StartsWith("127.", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
localEndPoint.StartsWith("localhost", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
localEndPoint.StartsWith("169.", StringComparison.OrdinalIgnoreCase);
|
||||||
|
|
||||||
|
if (ignore)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (_localEndpointLock.TryEnterWriteLock(100))
|
if (_localEndpointLock.TryEnterWriteLock(100))
|
||||||
{
|
{
|
||||||
var list = _localEndpoints.ToList();
|
var list = _localEndpoints.ToList();
|
||||||
|
|
|
@ -355,7 +355,22 @@ namespace MediaBrowser.Server.Implementations.Library
|
||||||
/// <returns>System.String[][].</returns>
|
/// <returns>System.String[][].</returns>
|
||||||
private List<string> GetWords(string term)
|
private List<string> GetWords(string term)
|
||||||
{
|
{
|
||||||
return term.Split().Where(i => !string.IsNullOrWhiteSpace(i)).ToList();
|
var stoplist = GetStopList().ToList();
|
||||||
|
|
||||||
|
return term.Split()
|
||||||
|
.Where(i => !string.IsNullOrWhiteSpace(i) && !stoplist.Contains(i, StringComparer.OrdinalIgnoreCase))
|
||||||
|
.ToList();
|
||||||
|
}
|
||||||
|
|
||||||
|
private IEnumerable<string> GetStopList()
|
||||||
|
{
|
||||||
|
return new[]
|
||||||
|
{
|
||||||
|
"the",
|
||||||
|
"a",
|
||||||
|
"of",
|
||||||
|
"an"
|
||||||
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -571,5 +571,12 @@
|
||||||
"MediaInfoStreamTypeEmbeddedImage": "Embedded Image",
|
"MediaInfoStreamTypeEmbeddedImage": "Embedded Image",
|
||||||
"MediaInfoRefFrames": "Ref frames",
|
"MediaInfoRefFrames": "Ref frames",
|
||||||
"TabPlayback": "Playback",
|
"TabPlayback": "Playback",
|
||||||
"HeaderSelectCustomIntrosPath": "Select Custom Intros Path"
|
"HeaderSelectCustomIntrosPath": "Select Custom Intros Path",
|
||||||
|
"HeaderRateAndReview": "Rate and Review",
|
||||||
|
"HeaderThankYou": "Thank You",
|
||||||
|
"MessageThankYouForYourReview": "Thank you for your review.",
|
||||||
|
"LabelYourRating": "Your rating:",
|
||||||
|
"LabelFullReview": "Full review:",
|
||||||
|
"LabelShortRatingDescription": "Short rating summary:",
|
||||||
|
"OptionIRecommendThisItem": "I recommend this item"
|
||||||
}
|
}
|
||||||
|
|
|
@ -1196,5 +1196,6 @@
|
||||||
"LabelThisFeatureRequiresSupporterHelp": "This feature requires an active supporter membership.",
|
"LabelThisFeatureRequiresSupporterHelp": "This feature requires an active supporter membership.",
|
||||||
"OptionTrailersFromMyMoviesHelp": "Requires setup of local trailers.",
|
"OptionTrailersFromMyMoviesHelp": "Requires setup of local trailers.",
|
||||||
"LabelCustomIntrosPath": "Custom intros path:",
|
"LabelCustomIntrosPath": "Custom intros path:",
|
||||||
"LabelCustomIntrosPathHelp": "A folder containing video files. A video will be randomly selected and played after trailers."
|
"LabelCustomIntrosPathHelp": "A folder containing video files. A video will be randomly selected and played after trailers.",
|
||||||
|
"ValueSpecialEpisodeName": "Special - {0}"
|
||||||
}
|
}
|
||||||
|
|
|
@ -496,7 +496,7 @@ namespace MediaBrowser.ServerApplication
|
||||||
UserViewManager = new UserViewManager(LibraryManager, LocalizationManager, FileSystemManager, UserManager, ChannelManager, LiveTvManager, ApplicationPaths, playlistManager);
|
UserViewManager = new UserViewManager(LibraryManager, LocalizationManager, FileSystemManager, UserManager, ChannelManager, LiveTvManager, ApplicationPaths, playlistManager);
|
||||||
RegisterSingleInstance(UserViewManager);
|
RegisterSingleInstance(UserViewManager);
|
||||||
|
|
||||||
var contentDirectory = new ContentDirectory(dlnaManager, UserDataManager, ImageProcessor, LibraryManager, ServerConfigurationManager, UserManager, LogManager.GetLogger("UpnpContentDirectory"), HttpClient);
|
var contentDirectory = new ContentDirectory(dlnaManager, UserDataManager, ImageProcessor, LibraryManager, ServerConfigurationManager, UserManager, LogManager.GetLogger("UpnpContentDirectory"), HttpClient, LocalizationManager);
|
||||||
RegisterSingleInstance<IContentDirectory>(contentDirectory);
|
RegisterSingleInstance<IContentDirectory>(contentDirectory);
|
||||||
|
|
||||||
NotificationManager = new NotificationManager(LogManager, UserManager, ServerConfigurationManager);
|
NotificationManager = new NotificationManager(LogManager, UserManager, ServerConfigurationManager);
|
||||||
|
|
Loading…
Reference in New Issue
Block a user