add dish hopper profile

This commit is contained in:
Luke Pulverenti 2014-09-23 21:44:05 -04:00
parent dbb8ec192f
commit 995353e216
24 changed files with 462 additions and 69 deletions

View File

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

View File

@ -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))
{ {

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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.

View File

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

View File

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

View File

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

View 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"
}
};
}
}
}

View File

@ -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 />

View File

@ -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 />

View 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>

View File

@ -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 />

View File

@ -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 />

View File

@ -65,6 +65,6 @@
</CodecProfiles> </CodecProfiles>
<ResponseProfiles /> <ResponseProfiles />
<SubtitleProfiles> <SubtitleProfiles>
<SubtitleProfile format="ttml" method="External" /> <SubtitleProfile format="vtt" method="External" />
</SubtitleProfiles> </SubtitleProfiles>
</Profile> </Profile>

View File

@ -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 />

View File

@ -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();

View File

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

View File

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

View File

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

View File

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