Browse Source

Merge pull request #2903 from randrey/dlna-albumart-fix

Fix DLNA clients displaying wrong album art.

(cherry picked from commit 1cc5d6745a954fd4e42a12720fd89eb3b5ecaa91)
Signed-off-by: Joshua M. Boniface <joshua@boniface.me>
dkanada 5 years ago
parent
commit
d8f865e93c
1 changed files with 45 additions and 6 deletions
  1. 45 6
      Emby.Dlna/Didl/DidlBuilder.cs

+ 45 - 6
Emby.Dlna/Didl/DidlBuilder.cs

@@ -1006,19 +1006,58 @@ namespace Emby.Dlna.Didl
                 }
             }
 
-            item = item.GetParents().FirstOrDefault(i => i.HasImage(ImageType.Primary));
+            // For audio tracks without art use album art if available.
+            if (item is Audio audioItem)
+            {
+                var album = audioItem.AlbumEntity;
+                return album != null && album.HasImage(ImageType.Primary)
+                    ? GetImageInfo(album, ImageType.Primary)
+                    : null;
+            }
 
-            if (item != null)
+            // Don't look beyond album/playlist level. Metadata service may assign an image from a different album/show to the parent folder.
+            if (item is MusicAlbum || item is Playlist)
             {
-                if (item.HasImage(ImageType.Primary))
-                {
-                    return GetImageInfo(item, ImageType.Primary);
-                }
+                return null;
+            }
+
+            // For other item types check parents, but be aware that image retrieved from a parent may be not suitable for this media item.
+            var parentWithImage = GetFirstParentWithImageBelowUserRoot(item);
+            if (parentWithImage != null)
+            {
+                return GetImageInfo(parentWithImage, ImageType.Primary);
             }
 
             return null;
         }
 
+        private BaseItem GetFirstParentWithImageBelowUserRoot(BaseItem item)
+        {
+            if (item == null)
+            {
+                return null;
+            }
+
+            if (item.HasImage(ImageType.Primary))
+            {
+                return item;
+            }
+
+            var parent = item.GetParent();
+            if (parent is UserRootFolder)
+            {
+                return null;
+            }
+
+            // terminate in case we went past user root folder (unlikely?)
+            if (parent is Folder folder && folder.IsRoot)
+            {
+                return null;
+            }
+
+            return GetFirstParentWithImageBelowUserRoot(parent);
+        }
+
         private ImageDownloadInfo GetImageInfo(BaseItem item, ImageType type)
         {
             var imageInfo = item.GetImageInfo(type, 0);