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