diff --git a/MediaBrowser.XbmcMetadata/Parsers/BaseNfoParser.cs b/MediaBrowser.XbmcMetadata/Parsers/BaseNfoParser.cs index 007101868..09ff84044 100644 --- a/MediaBrowser.XbmcMetadata/Parsers/BaseNfoParser.cs +++ b/MediaBrowser.XbmcMetadata/Parsers/BaseNfoParser.cs @@ -778,7 +778,7 @@ namespace MediaBrowser.XbmcMetadata.Parsers case "thumb": { - FetchThumbNode(reader, itemResult); + FetchThumbNode(reader, itemResult, "thumb"); break; } @@ -796,7 +796,7 @@ namespace MediaBrowser.XbmcMetadata.Parsers break; } - FetchThumbNode(subtree, itemResult); + FetchThumbNode(subtree, itemResult, "fanart"); break; } @@ -819,17 +819,22 @@ namespace MediaBrowser.XbmcMetadata.Parsers } } - private void FetchThumbNode(XmlReader reader, MetadataResult itemResult) + private void FetchThumbNode(XmlReader reader, MetadataResult itemResult, string parentNode) { var artType = reader.GetAttribute("aspect"); var val = reader.ReadElementContentAsString(); // artType is null if the thumb node is a child of the fanart tag // -> set image type to fanart - if (string.IsNullOrWhiteSpace(artType)) + if (string.IsNullOrWhiteSpace(artType) && parentNode.Equals("fanart", StringComparison.Ordinal)) { artType = "fanart"; } + else if (string.IsNullOrWhiteSpace(artType)) + { + // Sonarr writes thumb tags for posters without aspect property + artType = "poster"; + } // skip: // - empty uri diff --git a/tests/Jellyfin.XbmcMetadata.Tests/Parsers/EpisodeNfoProviderTests.cs b/tests/Jellyfin.XbmcMetadata.Tests/Parsers/EpisodeNfoProviderTests.cs index 3e726f23d..4f4ae5afb 100644 --- a/tests/Jellyfin.XbmcMetadata.Tests/Parsers/EpisodeNfoProviderTests.cs +++ b/tests/Jellyfin.XbmcMetadata.Tests/Parsers/EpisodeNfoProviderTests.cs @@ -122,6 +122,20 @@ namespace Jellyfin.XbmcMetadata.Tests.Parsers Assert.Equal(2004, item.ProductionYear); } + [Fact] + public void Parse_GivenFileWithThumbWithoutAspect_Success() + { + var result = new MetadataResult + { + Item = new Episode() + }; + + _parser.Fetch(result, "Test Data/Sonarr-Thumb.nfo", CancellationToken.None); + + Assert.Single(result.RemoteImages.Where(x => x.Type == ImageType.Primary)); + Assert.Equal("https://artworks.thetvdb.com/banners/episodes/359095/7081317.jpg", result.RemoteImages.First(x => x.Type == ImageType.Primary).Url); + } + [Fact] public void Fetch_WithNullItem_ThrowsArgumentException() { diff --git a/tests/Jellyfin.XbmcMetadata.Tests/Test Data/Sonarr-Thumb.nfo b/tests/Jellyfin.XbmcMetadata.Tests/Test Data/Sonarr-Thumb.nfo new file mode 100644 index 000000000..fb86768ef --- /dev/null +++ b/tests/Jellyfin.XbmcMetadata.Tests/Test Data/Sonarr-Thumb.nfo @@ -0,0 +1,34 @@ + + Sometimes a Genius's Every Action Is at the Mercy of X + 1 + 8 + 2019-05-26 + After Nariyuki wins a smartphone in a lottery, he can't wait to use it for apps like the dictionary, schedule managing, and the like. He also learns that studying in the bathtub is effective and quickly puts the method into practice. + 4289 + https://artworks.thetvdb.com/banners/episodes/359095/7081317.jpg + false + + + + + + English + + + +