Fixed: Don't force images to JPG and fix Kodi album art filenames

This commit is contained in:
ta264 2019-08-01 21:37:08 +01:00
commit 8d780f4057
5 changed files with 63 additions and 32 deletions

View file

@ -41,12 +41,17 @@ namespace NzbDrone.Core.Test.MediaCoverTests
Mocker.GetMock<IHttpClient>().Setup(c => c.Head(It.IsAny<HttpRequest>())).Returns(_httpResponse); Mocker.GetMock<IHttpClient>().Setup(c => c.Head(It.IsAny<HttpRequest>())).Returns(_httpResponse);
} }
[Test] [TestCase(".png")]
public void should_convert_cover_urls_to_local() [TestCase(".jpg")]
public void should_convert_cover_urls_to_local(string extension)
{ {
var covers = new List<MediaCover.MediaCover> var covers = new List<MediaCover.MediaCover>
{ {
new MediaCover.MediaCover {CoverType = MediaCoverTypes.Banner} new MediaCover.MediaCover
{
Url = "http://dummy.com/test" + extension,
CoverType = MediaCoverTypes.Banner
}
}; };
Mocker.GetMock<IDiskProvider>().Setup(c => c.FileGetLastWrite(It.IsAny<string>())) Mocker.GetMock<IDiskProvider>().Setup(c => c.FileGetLastWrite(It.IsAny<string>()))
@ -58,15 +63,20 @@ namespace NzbDrone.Core.Test.MediaCoverTests
Subject.ConvertToLocalUrls(12, MediaCoverEntity.Artist, covers); Subject.ConvertToLocalUrls(12, MediaCoverEntity.Artist, covers);
covers.Single().Url.Should().Be("/MediaCover/12/banner.jpg?lastWrite=1234"); covers.Single().Url.Should().Be("/MediaCover/12/banner" + extension + "?lastWrite=1234");
} }
[Test] [TestCase(".png")]
public void should_convert_album_cover_urls_to_local() [TestCase(".jpg")]
public void should_convert_album_cover_urls_to_local(string extension)
{ {
var covers = new List<MediaCover.MediaCover> var covers = new List<MediaCover.MediaCover>
{ {
new MediaCover.MediaCover {CoverType = MediaCoverTypes.Disc} new MediaCover.MediaCover
{
Url = "http://dummy.com/test" + extension,
CoverType = MediaCoverTypes.Disc
}
}; };
Mocker.GetMock<IDiskProvider>().Setup(c => c.FileGetLastWrite(It.IsAny<string>())) Mocker.GetMock<IDiskProvider>().Setup(c => c.FileGetLastWrite(It.IsAny<string>()))
@ -78,22 +88,27 @@ namespace NzbDrone.Core.Test.MediaCoverTests
Subject.ConvertToLocalUrls(6, MediaCoverEntity.Album, covers); Subject.ConvertToLocalUrls(6, MediaCoverEntity.Album, covers);
covers.Single().Url.Should().Be("/MediaCover/Albums/6/disc.jpg?lastWrite=1234"); covers.Single().Url.Should().Be("/MediaCover/Albums/6/disc" + extension + "?lastWrite=1234");
} }
[Test] [TestCase(".png")]
public void should_convert_media_urls_to_local_without_time_if_file_doesnt_exist() [TestCase(".jpg")]
public void should_convert_media_urls_to_local_without_time_if_file_doesnt_exist(string extension)
{ {
var covers = new List<MediaCover.MediaCover> var covers = new List<MediaCover.MediaCover>
{ {
new MediaCover.MediaCover {CoverType = MediaCoverTypes.Banner} new MediaCover.MediaCover
{
Url = "http://dummy.com/test" + extension,
CoverType = MediaCoverTypes.Banner
}
}; };
Subject.ConvertToLocalUrls(12, MediaCoverEntity.Artist, covers); Subject.ConvertToLocalUrls(12, MediaCoverEntity.Artist, covers);
covers.Single().Url.Should().Be("/MediaCover/12/banner.jpg"); covers.Single().Url.Should().Be("/MediaCover/12/banner" + extension);
} }
[Test] [Test]

View file

@ -165,7 +165,7 @@ namespace NzbDrone.Core.Extras.Metadata.Consumers.Roksbox
return new List<ImageFileResult>(); ; return new List<ImageFileResult>(); ;
} }
var source = _mediaCoverService.GetCoverPath(artist.Id, MediaCoverEntity.Artist, image.CoverType); var source = _mediaCoverService.GetCoverPath(artist.Id, MediaCoverEntity.Artist, image.CoverType, image.Extension);
var destination = Path.GetFileName(artist.Path) + Path.GetExtension(source); var destination = Path.GetFileName(artist.Path) + Path.GetExtension(source);
return new List<ImageFileResult>{ new ImageFileResult(destination, source) }; return new List<ImageFileResult>{ new ImageFileResult(destination, source) };

View file

@ -205,11 +205,11 @@ namespace NzbDrone.Core.Extras.Metadata.Consumers.Xbmc
{ {
foreach (var image in artist.Metadata.Value.Images) foreach (var image in artist.Metadata.Value.Images)
{ {
var source = _mediaCoverService.GetCoverPath(artist.Id, MediaCoverEntity.Artist, image.CoverType); var source = _mediaCoverService.GetCoverPath(artist.Id, MediaCoverEntity.Artist, image.CoverType, image.Extension);
var destination = image.CoverType.ToString().ToLowerInvariant() + Path.GetExtension(image.Url); var destination = image.CoverType.ToString().ToLowerInvariant() + image.Extension;
if (image.CoverType == MediaCoverTypes.Poster) if (image.CoverType == MediaCoverTypes.Poster)
{ {
destination = "folder" + Path.GetExtension(image.Url); destination = "folder" + image.Extension;
} }
yield return new ImageFileResult(destination, source); yield return new ImageFileResult(destination, source);
@ -222,7 +222,21 @@ namespace NzbDrone.Core.Extras.Metadata.Consumers.Xbmc
{ {
// TODO: Make Source fallback to URL if local does not exist // TODO: Make Source fallback to URL if local does not exist
// var source = _mediaCoverService.GetCoverPath(album.ArtistId, image.CoverType, null, album.Id); // var source = _mediaCoverService.GetCoverPath(album.ArtistId, image.CoverType, null, album.Id);
var destination = Path.Combine(albumPath, image.CoverType.ToString().ToLowerInvariant() + Path.GetExtension(image.Url)); string filename;
switch(image.CoverType)
{
case MediaCoverTypes.Cover:
filename = "folder";
break;
case MediaCoverTypes.Disc:
filename = "discart";
break;
default:
continue;
}
var destination = Path.Combine(albumPath, filename + image.Extension);
yield return new ImageFileResult(destination, image.Url); yield return new ImageFileResult(destination, image.Url);
} }

View file

@ -1,3 +1,4 @@
using System.IO;
using NzbDrone.Core.Datastore; using NzbDrone.Core.Datastore;
namespace NzbDrone.Core.MediaCover namespace NzbDrone.Core.MediaCover
@ -26,6 +27,7 @@ namespace NzbDrone.Core.MediaCover
{ {
public MediaCoverTypes CoverType { get; set; } public MediaCoverTypes CoverType { get; set; }
public string Url { get; set; } public string Url { get; set; }
public string Extension => Path.GetExtension(Url);
public MediaCover() public MediaCover()
{ {

View file

@ -18,7 +18,7 @@ namespace NzbDrone.Core.MediaCover
public interface IMapCoversToLocal public interface IMapCoversToLocal
{ {
void ConvertToLocalUrls(int entityId, MediaCoverEntity coverEntity, IEnumerable<MediaCover> covers); void ConvertToLocalUrls(int entityId, MediaCoverEntity coverEntity, IEnumerable<MediaCover> covers);
string GetCoverPath(int entityId, MediaCoverEntity coverEntity, MediaCoverTypes mediaCoverTypes, int? height = null); string GetCoverPath(int entityId, MediaCoverEntity coverEntity, MediaCoverTypes mediaCoverTypes, string extension, int? height = null);
} }
public class MediaCoverService : public class MediaCoverService :
@ -59,17 +59,17 @@ namespace NzbDrone.Core.MediaCover
_coverRootFolder = appFolderInfo.GetMediaCoverPath(); _coverRootFolder = appFolderInfo.GetMediaCoverPath();
} }
public string GetCoverPath(int entityId, MediaCoverEntity coverEntity, MediaCoverTypes coverTypes, int? height = null) public string GetCoverPath(int entityId, MediaCoverEntity coverEntity, MediaCoverTypes coverTypes, string extension, int? height = null)
{ {
var heightSuffix = height.HasValue ? "-" + height.ToString() : ""; var heightSuffix = height.HasValue ? "-" + height.ToString() : "";
if (coverEntity == MediaCoverEntity.Album) if (coverEntity == MediaCoverEntity.Album)
{ {
return Path.Combine(GetAlbumCoverPath(entityId), coverTypes.ToString().ToLower() + heightSuffix + ".jpg"); return Path.Combine(GetAlbumCoverPath(entityId), coverTypes.ToString().ToLower() + heightSuffix + extension);
} }
else else
{ {
return Path.Combine(GetArtistCoverPath(entityId), coverTypes.ToString().ToLower() + heightSuffix + ".jpg"); return Path.Combine(GetArtistCoverPath(entityId), coverTypes.ToString().ToLower() + heightSuffix + extension);
} }
} }
@ -77,15 +77,15 @@ namespace NzbDrone.Core.MediaCover
{ {
foreach (var mediaCover in covers) foreach (var mediaCover in covers)
{ {
var filePath = GetCoverPath(entityId, coverEntity, mediaCover.CoverType, null); var filePath = GetCoverPath(entityId, coverEntity, mediaCover.CoverType, mediaCover.Extension, null);
if (coverEntity == MediaCoverEntity.Album) if (coverEntity == MediaCoverEntity.Album)
{ {
mediaCover.Url = _configFileProvider.UrlBase + @"/MediaCover/Albums/" + entityId + "/" + mediaCover.CoverType.ToString().ToLower() + ".jpg"; mediaCover.Url = _configFileProvider.UrlBase + @"/MediaCover/Albums/" + entityId + "/" + mediaCover.CoverType.ToString().ToLower() + mediaCover.Extension;
} }
else else
{ {
mediaCover.Url = _configFileProvider.UrlBase + @"/MediaCover/" + entityId + "/" + mediaCover.CoverType.ToString().ToLower() + ".jpg"; mediaCover.Url = _configFileProvider.UrlBase + @"/MediaCover/" + entityId + "/" + mediaCover.CoverType.ToString().ToLower() + mediaCover.Extension;
} }
if (_diskProvider.FileExists(filePath)) if (_diskProvider.FileExists(filePath))
@ -110,7 +110,7 @@ namespace NzbDrone.Core.MediaCover
{ {
foreach (var cover in artist.Metadata.Value.Images) foreach (var cover in artist.Metadata.Value.Images)
{ {
var fileName = GetCoverPath(artist.Id, MediaCoverEntity.Artist, cover.CoverType); var fileName = GetCoverPath(artist.Id, MediaCoverEntity.Artist, cover.CoverType, cover.Extension);
var alreadyExists = false; var alreadyExists = false;
try try
@ -141,7 +141,7 @@ namespace NzbDrone.Core.MediaCover
{ {
foreach (var cover in album.Images.Where(e => e.CoverType == MediaCoverTypes.Cover)) foreach (var cover in album.Images.Where(e => e.CoverType == MediaCoverTypes.Cover))
{ {
var fileName = GetCoverPath(album.Id, MediaCoverEntity.Album, cover.CoverType, null); var fileName = GetCoverPath(album.Id, MediaCoverEntity.Album, cover.CoverType, cover.Extension, null);
var alreadyExists = false; var alreadyExists = false;
try try
{ {
@ -169,7 +169,7 @@ namespace NzbDrone.Core.MediaCover
private void DownloadCover(Artist artist, MediaCover cover, DateTime lastModified) private void DownloadCover(Artist artist, MediaCover cover, DateTime lastModified)
{ {
var fileName = GetCoverPath(artist.Id, MediaCoverEntity.Artist, cover.CoverType); var fileName = GetCoverPath(artist.Id, MediaCoverEntity.Artist, cover.CoverType, cover.Extension);
_logger.Info("Downloading {0} for {1} {2}", cover.CoverType, artist, cover.Url); _logger.Info("Downloading {0} for {1} {2}", cover.CoverType, artist, cover.Url);
_httpClient.DownloadFile(cover.Url, fileName); _httpClient.DownloadFile(cover.Url, fileName);
@ -186,7 +186,7 @@ namespace NzbDrone.Core.MediaCover
private void DownloadAlbumCover(Album album, MediaCover cover, DateTime lastModified) private void DownloadAlbumCover(Album album, MediaCover cover, DateTime lastModified)
{ {
var fileName = GetCoverPath(album.Id, MediaCoverEntity.Album, cover.CoverType, null); var fileName = GetCoverPath(album.Id, MediaCoverEntity.Album, cover.CoverType, cover.Extension, null);
_logger.Info("Downloading {0} for {1} {2}", cover.CoverType, album, cover.Url); _logger.Info("Downloading {0} for {1} {2}", cover.CoverType, album, cover.Url);
_httpClient.DownloadFile(cover.Url, fileName); _httpClient.DownloadFile(cover.Url, fileName);
@ -207,8 +207,8 @@ namespace NzbDrone.Core.MediaCover
foreach (var height in heights) foreach (var height in heights)
{ {
var mainFileName = GetCoverPath(artist.Id, MediaCoverEntity.Artist, cover.CoverType); var mainFileName = GetCoverPath(artist.Id, MediaCoverEntity.Artist, cover.CoverType, cover.Extension);
var resizeFileName = GetCoverPath(artist.Id, MediaCoverEntity.Artist, cover.CoverType, height); var resizeFileName = GetCoverPath(artist.Id, MediaCoverEntity.Artist, cover.CoverType, cover.Extension, height);
if (forceResize || !_diskProvider.FileExists(resizeFileName) || _diskProvider.GetFileSize(resizeFileName) == 0) if (forceResize || !_diskProvider.FileExists(resizeFileName) || _diskProvider.GetFileSize(resizeFileName) == 0)
{ {
@ -232,8 +232,8 @@ namespace NzbDrone.Core.MediaCover
foreach (var height in heights) foreach (var height in heights)
{ {
var mainFileName = GetCoverPath(album.Id, MediaCoverEntity.Album, cover.CoverType, null); var mainFileName = GetCoverPath(album.Id, MediaCoverEntity.Album, cover.CoverType, cover.Extension, null);
var resizeFileName = GetCoverPath(album.Id, MediaCoverEntity.Album, cover.CoverType, height); var resizeFileName = GetCoverPath(album.Id, MediaCoverEntity.Album, cover.CoverType, cover.Extension, height);
if (forceResize || !_diskProvider.FileExists(resizeFileName) || _diskProvider.GetFileSize(resizeFileName) == 0) if (forceResize || !_diskProvider.FileExists(resizeFileName) || _diskProvider.GetFileSize(resizeFileName) == 0)
{ {