diff options
24 files changed, 462 insertions, 69 deletions
diff --git a/MediaBrowser.Api/Playback/BaseStreamingService.cs b/MediaBrowser.Api/Playback/BaseStreamingService.cs index 19740d107..74eb9c012 100644 --- a/MediaBrowser.Api/Playback/BaseStreamingService.cs +++ b/MediaBrowser.Api/Playback/BaseStreamingService.cs @@ -1638,7 +1638,7 @@ namespace MediaBrowser.Api.Playback AttachMediaStreamInfo(state, mediaStreams, videoRequest, url); - state.SegmentLength = state.ReadInputAtNativeFramerate ? 5 : 7; + state.SegmentLength = state.ReadInputAtNativeFramerate ? 5 : 6; state.HlsListSize = state.ReadInputAtNativeFramerate ? 100 : 1440; var container = Path.GetExtension(state.RequestedUrl); diff --git a/MediaBrowser.Common.Implementations/Networking/BaseNetworkManager.cs b/MediaBrowser.Common.Implementations/Networking/BaseNetworkManager.cs index 46f880657..2a1c5dfe6 100644 --- a/MediaBrowser.Common.Implementations/Networking/BaseNetworkManager.cs +++ b/MediaBrowser.Common.Implementations/Networking/BaseNetworkManager.cs @@ -24,32 +24,32 @@ namespace MediaBrowser.Common.Implementations.Networking /// <returns>IPAddress.</returns> public IEnumerable<string> GetLocalIpAddresses() { - var list = GetIPsDefault() - .Where(i => !IPAddress.IsLoopback(i)) - .Select(i => i.ToString()) - .ToList(); + var list = GetIPsDefault().Where(i => !IPAddress.IsLoopback(i)).Select(i => i.ToString()).ToList(); - try + if (list.Count > 0) { - var listFromDns = Dns.GetHostAddresses(Dns.GetHostName()) - .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(); - } + return list; } - catch - { - } - - return list; + return GetLocalIpAddressesFallback(); + } + + 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) @@ -64,6 +64,11 @@ namespace MediaBrowser.Common.Implementations.Networking throw new ArgumentNullException("endpoint"); } + if (IsInPrivateAddressSpace(endpoint)) + { + return true; + } + const int lengthMatch = 4; 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; if (resolveHost && !IPAddress.TryParse(endpoint, out address)) { diff --git a/MediaBrowser.Dlna/ContentDirectory/ContentDirectory.cs b/MediaBrowser.Dlna/ContentDirectory/ContentDirectory.cs index dce93ae4e..87f705e16 100644 --- a/MediaBrowser.Dlna/ContentDirectory/ContentDirectory.cs +++ b/MediaBrowser.Dlna/ContentDirectory/ContentDirectory.cs @@ -4,6 +4,7 @@ using MediaBrowser.Controller.Dlna; using MediaBrowser.Controller.Drawing; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Library; +using MediaBrowser.Controller.Localization; using MediaBrowser.Dlna.Service; using MediaBrowser.Model.Dlna; using MediaBrowser.Model.Logging; @@ -21,6 +22,7 @@ namespace MediaBrowser.Dlna.ContentDirectory private readonly IDlnaManager _dlna; private readonly IServerConfigurationManager _config; private readonly IUserManager _userManager; + private readonly ILocalizationManager _localization; public ContentDirectory(IDlnaManager dlna, IUserDataManager userDataManager, @@ -29,7 +31,7 @@ namespace MediaBrowser.Dlna.ContentDirectory IServerConfigurationManager config, IUserManager userManager, ILogger logger, - IHttpClient httpClient) + IHttpClient httpClient, ILocalizationManager localization) : base(logger, httpClient) { _dlna = dlna; @@ -38,6 +40,7 @@ namespace MediaBrowser.Dlna.ContentDirectory _libraryManager = libraryManager; _config = config; _userManager = userManager; + _localization = localization; } private int SystemUpdateId @@ -73,7 +76,8 @@ namespace MediaBrowser.Dlna.ContentDirectory _userDataManager, user, SystemUpdateId, - _config) + _config, + _localization) .ProcessControlRequest(request); } diff --git a/MediaBrowser.Dlna/ContentDirectory/ControlHandler.cs b/MediaBrowser.Dlna/ContentDirectory/ControlHandler.cs index 330ddba69..59b907f7d 100644 --- a/MediaBrowser.Dlna/ContentDirectory/ControlHandler.cs +++ b/MediaBrowser.Dlna/ContentDirectory/ControlHandler.cs @@ -3,6 +3,7 @@ using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Drawing; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Library; +using MediaBrowser.Controller.Localization; using MediaBrowser.Dlna.Didl; using MediaBrowser.Dlna.Server; using MediaBrowser.Dlna.Service; @@ -38,7 +39,7 @@ namespace MediaBrowser.Dlna.ContentDirectory 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) { _libraryManager = libraryManager; @@ -47,7 +48,7 @@ namespace MediaBrowser.Dlna.ContentDirectory _systemUpdateId = systemUpdateId; _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) @@ -182,7 +183,7 @@ namespace MediaBrowser.Dlna.ContentDirectory if (folder == null) { - result.DocumentElement.AppendChild(_didlBuilder.GetItemElement(result, item, deviceId, filter)); + result.DocumentElement.AppendChild(_didlBuilder.GetItemElement(result, item, null, deviceId, filter)); } else { @@ -214,7 +215,7 @@ namespace MediaBrowser.Dlna.ContentDirectory } 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 { - result.DocumentElement.AppendChild(_didlBuilder.GetItemElement(result, i, deviceId, filter)); + result.DocumentElement.AppendChild(_didlBuilder.GetItemElement(result, i, folder, deviceId, filter)); } } diff --git a/MediaBrowser.Dlna/Didl/DidlBuilder.cs b/MediaBrowser.Dlna/Didl/DidlBuilder.cs index 3840cbd12..fecdb2793 100644 --- a/MediaBrowser.Dlna/Didl/DidlBuilder.cs +++ b/MediaBrowser.Dlna/Didl/DidlBuilder.cs @@ -7,6 +7,7 @@ using MediaBrowser.Controller.Entities.Audio; using MediaBrowser.Controller.Entities.Movies; using MediaBrowser.Controller.Entities.TV; using MediaBrowser.Controller.Library; +using MediaBrowser.Controller.Localization; using MediaBrowser.Controller.Playlists; using MediaBrowser.Model.Dlna; using MediaBrowser.Model.Drawing; @@ -33,17 +34,19 @@ namespace MediaBrowser.Dlna.Didl private readonly string _serverAddress; private readonly User _user; 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; _imageProcessor = imageProcessor; _serverAddress = serverAddress; _userDataManager = userDataManager; + _localization = localization; _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(); @@ -60,12 +63,12 @@ namespace MediaBrowser.Dlna.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; } - 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); element.SetAttribute("restricted", "1"); @@ -78,7 +81,7 @@ namespace MediaBrowser.Dlna.Didl //AddBookmarkInfo(item, user, element); - AddGeneralProperties(item, element, filter); + AddGeneralProperties(item, context, element, filter); // refID? // storeAttribute(itemNode, object, ClassProperties.REF_ID, false); @@ -276,6 +279,38 @@ namespace MediaBrowser.Dlna.Didl 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) { @@ -408,7 +443,7 @@ namespace MediaBrowser.Dlna.Didl } } - AddCommonFields(folder, container, filter); + AddCommonFields(folder, null, container, filter); AddCover(folder, container); @@ -431,15 +466,16 @@ namespace MediaBrowser.Dlna.Didl /// Adds fields used by both items and folders /// </summary> /// <param name="item">The item.</param> + /// <param name="context">The context.</param> /// <param name="element">The element.</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 // MediaMonkey for example won't display content without a 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)); @@ -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; diff --git a/MediaBrowser.Dlna/DlnaManager.cs b/MediaBrowser.Dlna/DlnaManager.cs index 2dd863c80..66555a90d 100644 --- a/MediaBrowser.Dlna/DlnaManager.cs +++ b/MediaBrowser.Dlna/DlnaManager.cs @@ -80,6 +80,7 @@ namespace MediaBrowser.Dlna new WindowsPhoneProfile(), new AndroidProfile(), new DirectTvProfile(), + new DishHopperJoeyProfile(), new DefaultProfile() }; diff --git a/MediaBrowser.Dlna/Main/DlnaEntryPoint.cs b/MediaBrowser.Dlna/Main/DlnaEntryPoint.cs index 1d88eca03..810b1e568 100644 --- a/MediaBrowser.Dlna/Main/DlnaEntryPoint.cs +++ b/MediaBrowser.Dlna/Main/DlnaEntryPoint.cs @@ -6,6 +6,7 @@ using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Dlna; using MediaBrowser.Controller.Drawing; using MediaBrowser.Controller.Library; +using MediaBrowser.Controller.Localization; using MediaBrowser.Controller.Persistence; using MediaBrowser.Controller.Plugins; using MediaBrowser.Controller.Session; @@ -35,6 +36,7 @@ namespace MediaBrowser.Dlna.Main private readonly IDlnaManager _dlnaManager; private readonly IImageProcessor _imageProcessor; private readonly IUserDataManager _userDataManager; + private readonly ILocalizationManager _localization; private SsdpHandler _ssdpHandler; private DeviceDiscovery _deviceDiscovery; @@ -42,7 +44,7 @@ namespace MediaBrowser.Dlna.Main private readonly List<string> _registeredServerIds = new List<string>(); 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; _appHost = appHost; @@ -55,6 +57,7 @@ namespace MediaBrowser.Dlna.Main _dlnaManager = dlnaManager; _imageProcessor = imageProcessor; _userDataManager = userDataManager; + _localization = localization; _logger = logManager.GetLogger("Dlna"); } @@ -221,7 +224,8 @@ namespace MediaBrowser.Dlna.Main _deviceDiscovery, _httpClient, _config, - _userDataManager); + _userDataManager, + _localization); _manager.Start(); } diff --git a/MediaBrowser.Dlna/MediaBrowser.Dlna.csproj b/MediaBrowser.Dlna/MediaBrowser.Dlna.csproj index 466c99009..7b09a492d 100644 --- a/MediaBrowser.Dlna/MediaBrowser.Dlna.csproj +++ b/MediaBrowser.Dlna/MediaBrowser.Dlna.csproj @@ -74,6 +74,7 @@ <Compile Include="Didl\DidlBuilder.cs" /> <Compile Include="PlayTo\PlayToController.cs" /> <Compile Include="Profiles\DirectTvProfile.cs" /> + <Compile Include="Profiles\DishHopperJoeyProfile.cs" /> <Compile Include="Ssdp\DeviceDiscoveryInfo.cs" /> <Compile Include="Ssdp\Extensions.cs" /> <Compile Include="PlayTo\PlaybackProgressEventArgs.cs" /> @@ -192,6 +193,9 @@ <ItemGroup> <EmbeddedResource Include="Profiles\Xml\DirecTV HD-DVR.xml" /> </ItemGroup> + <ItemGroup> + <EmbeddedResource Include="Profiles\Xml\Dish Hopper-Joey.xml" /> + </ItemGroup> <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> <!-- 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. diff --git a/MediaBrowser.Dlna/PlayTo/PlayToController.cs b/MediaBrowser.Dlna/PlayTo/PlayToController.cs index bef3f6d0e..11fc8ecc3 100644 --- a/MediaBrowser.Dlna/PlayTo/PlayToController.cs +++ b/MediaBrowser.Dlna/PlayTo/PlayToController.cs @@ -2,6 +2,7 @@ using MediaBrowser.Controller.Drawing; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Library; +using MediaBrowser.Controller.Localization; using MediaBrowser.Controller.Persistence; using MediaBrowser.Controller.Session; using MediaBrowser.Dlna.Didl; @@ -33,6 +34,7 @@ namespace MediaBrowser.Dlna.PlayTo private readonly IUserManager _userManager; private readonly IImageProcessor _imageProcessor; private readonly IUserDataManager _userDataManager; + private readonly ILocalizationManager _localization; private readonly DeviceDiscovery _deviceDiscovery; private readonly string _serverAddress; @@ -52,7 +54,7 @@ namespace MediaBrowser.Dlna.PlayTo 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; _itemRepository = itemRepository; @@ -64,6 +66,7 @@ namespace MediaBrowser.Dlna.PlayTo _serverAddress = serverAddress; _deviceDiscovery = deviceDiscovery; _userDataManager = userDataManager; + _localization = localization; _logger = logger; } @@ -476,7 +479,8 @@ namespace MediaBrowser.Dlna.PlayTo 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; diff --git a/MediaBrowser.Dlna/PlayTo/PlayToManager.cs b/MediaBrowser.Dlna/PlayTo/PlayToManager.cs index 891dcec87..f570209ad 100644 --- a/MediaBrowser.Dlna/PlayTo/PlayToManager.cs +++ b/MediaBrowser.Dlna/PlayTo/PlayToManager.cs @@ -4,6 +4,7 @@ using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Dlna; using MediaBrowser.Controller.Drawing; using MediaBrowser.Controller.Library; +using MediaBrowser.Controller.Localization; using MediaBrowser.Controller.Persistence; using MediaBrowser.Controller.Session; using MediaBrowser.Dlna.Ssdp; @@ -30,10 +31,11 @@ namespace MediaBrowser.Dlna.PlayTo private readonly IHttpClient _httpClient; private readonly IServerConfigurationManager _config; private readonly IUserDataManager _userDataManager; + private readonly ILocalizationManager _localization; 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; _sessionManager = sessionManager; @@ -47,6 +49,7 @@ namespace MediaBrowser.Dlna.PlayTo _httpClient = httpClient; _config = config; _userDataManager = userDataManager; + _localization = localization; } public void Start() @@ -106,7 +109,8 @@ namespace MediaBrowser.Dlna.PlayTo _imageProcessor, serverAddress, _deviceDiscovery, - _userDataManager); + _userDataManager, + _localization); controller.Init(device); diff --git a/MediaBrowser.Dlna/Profiles/DefaultProfile.cs b/MediaBrowser.Dlna/Profiles/DefaultProfile.cs index 5c317d94d..3c4506e4b 100644 --- a/MediaBrowser.Dlna/Profiles/DefaultProfile.cs +++ b/MediaBrowser.Dlna/Profiles/DefaultProfile.cs @@ -53,6 +53,12 @@ namespace MediaBrowser.Dlna.Profiles AudioCodec = "aac", VideoCodec = "h264", VideoProfile= "baseline" + }, + + new TranscodingProfile + { + Container = "jpeg", + Type = DlnaProfileType.Photo } }; diff --git a/MediaBrowser.Dlna/Profiles/DishHopperJoeyProfile.cs b/MediaBrowser.Dlna/Profiles/DishHopperJoeyProfile.cs new file mode 100644 index 000000000..a4a7edd28 --- /dev/null +++ b/MediaBrowser.Dlna/Profiles/DishHopperJoeyProfile.cs @@ -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" + } + }; + + } + } +} diff --git a/MediaBrowser.Dlna/Profiles/Xml/Default.xml b/MediaBrowser.Dlna/Profiles/Xml/Default.xml index 61aebdb89..cc1481ee3 100644 --- a/MediaBrowser.Dlna/Profiles/Xml/Default.xml +++ b/MediaBrowser.Dlna/Profiles/Xml/Default.xml @@ -33,6 +33,7 @@ <TranscodingProfiles> <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="jpeg" type="Photo" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" context="Streaming" /> </TranscodingProfiles> <ContainerProfiles /> <CodecProfiles /> diff --git a/MediaBrowser.Dlna/Profiles/Xml/Denon AVR.xml b/MediaBrowser.Dlna/Profiles/Xml/Denon AVR.xml index b9b7b6e8e..ffcdcf9fc 100644 --- a/MediaBrowser.Dlna/Profiles/Xml/Denon AVR.xml +++ b/MediaBrowser.Dlna/Profiles/Xml/Denon AVR.xml @@ -37,6 +37,7 @@ <TranscodingProfiles> <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="jpeg" type="Photo" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" context="Streaming" /> </TranscodingProfiles> <ContainerProfiles /> <CodecProfiles /> diff --git a/MediaBrowser.Dlna/Profiles/Xml/Dish Hopper-Joey.xml b/MediaBrowser.Dlna/Profiles/Xml/Dish Hopper-Joey.xml new file mode 100644 index 000000000..98ab66408 --- /dev/null +++ b/MediaBrowser.Dlna/Profiles/Xml/Dish Hopper-Joey.xml @@ -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>
\ No newline at end of file diff --git a/MediaBrowser.Dlna/Profiles/Xml/Linksys DMA2100.xml b/MediaBrowser.Dlna/Profiles/Xml/Linksys DMA2100.xml index d2cfae46b..7d0f416e9 100644 --- a/MediaBrowser.Dlna/Profiles/Xml/Linksys DMA2100.xml +++ b/MediaBrowser.Dlna/Profiles/Xml/Linksys DMA2100.xml @@ -37,6 +37,7 @@ <TranscodingProfiles> <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="jpeg" type="Photo" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" context="Streaming" /> </TranscodingProfiles> <ContainerProfiles /> <CodecProfiles /> diff --git a/MediaBrowser.Dlna/Profiles/Xml/MediaMonkey.xml b/MediaBrowser.Dlna/Profiles/Xml/MediaMonkey.xml index b8360d95c..eb85e5877 100644 --- a/MediaBrowser.Dlna/Profiles/Xml/MediaMonkey.xml +++ b/MediaBrowser.Dlna/Profiles/Xml/MediaMonkey.xml @@ -43,6 +43,7 @@ <TranscodingProfiles> <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="jpeg" type="Photo" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" context="Streaming" /> </TranscodingProfiles> <ContainerProfiles /> <CodecProfiles /> diff --git a/MediaBrowser.Dlna/Profiles/Xml/Windows 8 RT.xml b/MediaBrowser.Dlna/Profiles/Xml/Windows 8 RT.xml index 284166fa3..3ed3c14d9 100644 --- a/MediaBrowser.Dlna/Profiles/Xml/Windows 8 RT.xml +++ b/MediaBrowser.Dlna/Profiles/Xml/Windows 8 RT.xml @@ -65,6 +65,6 @@ </CodecProfiles> <ResponseProfiles /> <SubtitleProfiles> - <SubtitleProfile format="ttml" method="External" /> + <SubtitleProfile format="vtt" method="External" /> </SubtitleProfiles> </Profile>
\ No newline at end of file diff --git a/MediaBrowser.Dlna/Profiles/Xml/foobar2000.xml b/MediaBrowser.Dlna/Profiles/Xml/foobar2000.xml index 09886210c..81347accc 100644 --- a/MediaBrowser.Dlna/Profiles/Xml/foobar2000.xml +++ b/MediaBrowser.Dlna/Profiles/Xml/foobar2000.xml @@ -43,6 +43,7 @@ <TranscodingProfiles> <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="jpeg" type="Photo" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" context="Streaming" /> </TranscodingProfiles> <ContainerProfiles /> <CodecProfiles /> diff --git a/MediaBrowser.Server.Implementations/HttpServer/HttpListenerHost.cs b/MediaBrowser.Server.Implementations/HttpServer/HttpListenerHost.cs index d88a04063..95877ec0c 100644 --- a/MediaBrowser.Server.Implementations/HttpServer/HttpListenerHost.cs +++ b/MediaBrowser.Server.Implementations/HttpServer/HttpListenerHost.cs @@ -166,6 +166,17 @@ namespace MediaBrowser.Server.Implementations.HttpServer 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)) { var list = _localEndpoints.ToList(); diff --git a/MediaBrowser.Server.Implementations/Library/SearchEngine.cs b/MediaBrowser.Server.Implementations/Library/SearchEngine.cs index 738222540..02d643477 100644 --- a/MediaBrowser.Server.Implementations/Library/SearchEngine.cs +++ b/MediaBrowser.Server.Implementations/Library/SearchEngine.cs @@ -355,7 +355,22 @@ namespace MediaBrowser.Server.Implementations.Library /// <returns>System.String[][].</returns> 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" + }; } } } diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/javascript.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/javascript.json index 552aa0a14..2a3e4bc6f 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/javascript.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/javascript.json @@ -571,5 +571,12 @@ "MediaInfoStreamTypeEmbeddedImage": "Embedded Image", "MediaInfoRefFrames": "Ref frames", "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" } diff --git a/MediaBrowser.Server.Implementations/Localization/Server/server.json b/MediaBrowser.Server.Implementations/Localization/Server/server.json index 52a3b8df0..555ca7c16 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/server.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/server.json @@ -1196,5 +1196,6 @@ "LabelThisFeatureRequiresSupporterHelp": "This feature requires an active supporter membership.", "OptionTrailersFromMyMoviesHelp": "Requires setup of local trailers.", "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}" } diff --git a/MediaBrowser.ServerApplication/ApplicationHost.cs b/MediaBrowser.ServerApplication/ApplicationHost.cs index e05ae9fa1..8db1035ce 100644 --- a/MediaBrowser.ServerApplication/ApplicationHost.cs +++ b/MediaBrowser.ServerApplication/ApplicationHost.cs @@ -496,7 +496,7 @@ namespace MediaBrowser.ServerApplication UserViewManager = new UserViewManager(LibraryManager, LocalizationManager, FileSystemManager, UserManager, ChannelManager, LiveTvManager, ApplicationPaths, playlistManager); 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); NotificationManager = new NotificationManager(LogManager, UserManager, ServerConfigurationManager); |
