Merge pull request #2154 from dkanada/artist-collage

Add image provider for artists
This commit is contained in:
dkanada 2020-06-04 22:28:51 +09:00 committed by GitHub
commit 836741f2aa
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 133 additions and 70 deletions

View File

@ -0,0 +1,47 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Emby.Server.Implementations.Images;
using MediaBrowser.Common.Configuration;
using MediaBrowser.Controller.Drawing;
using MediaBrowser.Controller.Dto;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Entities.Audio;
using MediaBrowser.Controller.Entities.Movies;
using MediaBrowser.Controller.Entities.TV;
using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.Playlists;
using MediaBrowser.Controller.Providers;
using MediaBrowser.Model.Entities;
using MediaBrowser.Model.IO;
using MediaBrowser.Model.Querying;
namespace Emby.Server.Implementations.Images
{
public class ArtistImageProvider : BaseDynamicImageProvider<MusicArtist>
{
private readonly ILibraryManager _libraryManager;
public ArtistImageProvider(IFileSystem fileSystem, IProviderManager providerManager, IApplicationPaths applicationPaths, IImageProcessor imageProcessor, ILibraryManager libraryManager) : base(fileSystem, providerManager, applicationPaths, imageProcessor)
{
_libraryManager = libraryManager;
}
protected override IReadOnlyList<BaseItem> GetItemsWithImages(BaseItem item)
{
return Array.Empty<BaseItem>();
// TODO enable this when BaseDynamicImageProvider objects are configurable
// return _libraryManager.GetItemList(new InternalItemsQuery
// {
// ArtistIds = new[] { item.Id },
// IncludeItemTypes = new[] { typeof(MusicAlbum).Name },
// OrderBy = new[] { (ItemSortBy.Random, SortOrder.Ascending) },
// Limit = 4,
// Recursive = true,
// ImageTypes = new[] { ImageType.Primary },
// DtoOptions = new DtoOptions(false)
// });
}
}
}

View File

@ -194,7 +194,8 @@ namespace Emby.Server.Implementations.Images
return outputPath; return outputPath;
} }
protected virtual string CreateImage(BaseItem item, protected virtual string CreateImage(
BaseItem item,
IReadOnlyCollection<BaseItem> itemsWithImages, IReadOnlyCollection<BaseItem> itemsWithImages,
string outputPathWithoutExtension, string outputPathWithoutExtension,
ImageType imageType, ImageType imageType,
@ -214,7 +215,12 @@ namespace Emby.Server.Implementations.Images
if (imageType == ImageType.Primary) if (imageType == ImageType.Primary)
{ {
if (item is UserView || item is Playlist || item is MusicGenre || item is Genre || item is PhotoAlbum) if (item is UserView
|| item is Playlist
|| item is MusicGenre
|| item is Genre
|| item is PhotoAlbum
|| item is MusicArtist)
{ {
return CreateSquareCollage(item, itemsWithImages, outputPath); return CreateSquareCollage(item, itemsWithImages, outputPath);
} }
@ -225,7 +231,7 @@ namespace Emby.Server.Implementations.Images
throw new ArgumentException("Unexpected image type", nameof(imageType)); throw new ArgumentException("Unexpected image type", nameof(imageType));
} }
public bool HasChanged(BaseItem item, IDirectoryService directoryServicee) public bool HasChanged(BaseItem item, IDirectoryService directoryService)
{ {
if (!Supports(item)) if (!Supports(item))
{ {
@ -236,6 +242,7 @@ namespace Emby.Server.Implementations.Images
{ {
return true; return true;
} }
if (SupportedImages.Contains(ImageType.Thumb) && HasChanged(item, ImageType.Thumb)) if (SupportedImages.Contains(ImageType.Thumb) && HasChanged(item, ImageType.Thumb))
{ {
return true; return true;

View File

@ -13,7 +13,7 @@ using MediaBrowser.Model.Entities;
using MediaBrowser.Model.IO; using MediaBrowser.Model.IO;
using MediaBrowser.Model.Querying; using MediaBrowser.Model.Querying;
namespace Emby.Server.Implementations.UserViews namespace Emby.Server.Implementations.Images
{ {
public class CollectionFolderImageProvider : BaseDynamicImageProvider<CollectionFolder> public class CollectionFolderImageProvider : BaseDynamicImageProvider<CollectionFolder>
{ {

View File

@ -16,7 +16,7 @@ using MediaBrowser.Controller.Providers;
using MediaBrowser.Model.Entities; using MediaBrowser.Model.Entities;
using MediaBrowser.Model.IO; using MediaBrowser.Model.IO;
namespace Emby.Server.Implementations.UserViews namespace Emby.Server.Implementations.Images
{ {
public class DynamicImageProvider : BaseDynamicImageProvider<UserView> public class DynamicImageProvider : BaseDynamicImageProvider<UserView>
{ {

View File

@ -13,7 +13,7 @@ using MediaBrowser.Model.Entities;
using MediaBrowser.Model.IO; using MediaBrowser.Model.IO;
using MediaBrowser.Model.Querying; using MediaBrowser.Model.Querying;
namespace Emby.Server.Implementations.UserViews namespace Emby.Server.Implementations.Images
{ {
public abstract class BaseFolderImageProvider<T> : BaseDynamicImageProvider<T> public abstract class BaseFolderImageProvider<T> : BaseDynamicImageProvider<T>
where T : Folder, new() where T : Folder, new()
@ -77,16 +77,12 @@ namespace Emby.Server.Implementations.UserViews
return false; return false;
} }
if (item is Folder folder) if (item is Folder && item.IsTopParent)
{
if (folder.IsTopParent)
{ {
return false; return false;
} }
}
return true; return true;
//return item.SourceType == SourceType.Library;
} }
} }

View File

@ -1,5 +1,4 @@
#pragma warning disable CS1591 using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using Emby.Server.Implementations.Images; using Emby.Server.Implementations.Images;
@ -17,56 +16,8 @@ using MediaBrowser.Model.Entities;
using MediaBrowser.Model.IO; using MediaBrowser.Model.IO;
using MediaBrowser.Model.Querying; using MediaBrowser.Model.Querying;
namespace Emby.Server.Implementations.Playlists namespace Emby.Server.Implementations.Images
{ {
public class PlaylistImageProvider : BaseDynamicImageProvider<Playlist>
{
public PlaylistImageProvider(IFileSystem fileSystem, IProviderManager providerManager, IApplicationPaths applicationPaths, IImageProcessor imageProcessor) : base(fileSystem, providerManager, applicationPaths, imageProcessor)
{
}
protected override IReadOnlyList<BaseItem> GetItemsWithImages(BaseItem item)
{
var playlist = (Playlist)item;
return playlist.GetManageableItems()
.Select(i =>
{
var subItem = i.Item2;
if (subItem is Episode episode)
{
var series = episode.Series;
if (series != null && series.HasImage(ImageType.Primary))
{
return series;
}
}
if (subItem.HasImage(ImageType.Primary))
{
return subItem;
}
var parent = subItem.GetOwner() ?? subItem.GetParent();
if (parent != null && parent.HasImage(ImageType.Primary))
{
if (parent is MusicAlbum)
{
return parent;
}
}
return null;
})
.Where(i => i != null)
.GroupBy(x => x.Id)
.Select(x => x.First())
.ToList();
}
}
public class MusicGenreImageProvider : BaseDynamicImageProvider<MusicGenre> public class MusicGenreImageProvider : BaseDynamicImageProvider<MusicGenre>
{ {
private readonly ILibraryManager _libraryManager; private readonly ILibraryManager _libraryManager;

View File

@ -0,0 +1,66 @@
#pragma warning disable CS1591
using System.Collections.Generic;
using System.Linq;
using MediaBrowser.Common.Configuration;
using MediaBrowser.Controller.Drawing;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Entities.Audio;
using MediaBrowser.Controller.Entities.TV;
using MediaBrowser.Controller.Playlists;
using MediaBrowser.Controller.Providers;
using MediaBrowser.Model.Entities;
using MediaBrowser.Model.IO;
namespace Emby.Server.Implementations.Images
{
public class PlaylistImageProvider : BaseDynamicImageProvider<Playlist>
{
public PlaylistImageProvider(IFileSystem fileSystem, IProviderManager providerManager, IApplicationPaths applicationPaths, IImageProcessor imageProcessor) : base(fileSystem, providerManager, applicationPaths, imageProcessor)
{
}
protected override IReadOnlyList<BaseItem> GetItemsWithImages(BaseItem item)
{
var playlist = (Playlist)item;
return playlist.GetManageableItems()
.Select(i =>
{
var subItem = i.Item2;
var episode = subItem as Episode;
if (episode != null)
{
var series = episode.Series;
if (series != null && series.HasImage(ImageType.Primary))
{
return series;
}
}
if (subItem.HasImage(ImageType.Primary))
{
return subItem;
}
var parent = subItem.GetOwner() ?? subItem.GetParent();
if (parent != null && parent.HasImage(ImageType.Primary))
{
if (parent is MusicAlbum)
{
return parent;
}
}
return null;
})
.Where(i => i != null)
.GroupBy(x => x.Id)
.Select(x => x.First())
.ToList();
}
}
}

View File

@ -53,9 +53,7 @@ namespace Jellyfin.Drawing.Skia
"jpeg", "jpeg",
"jpg", "jpg",
"png", "png",
"dng", "dng",
"webp", "webp",
"gif", "gif",
"bmp", "bmp",
@ -64,10 +62,8 @@ namespace Jellyfin.Drawing.Skia
"ktx", "ktx",
"pkm", "pkm",
"wbmp", "wbmp",
// TODO: check if these are supported on multiple platforms
// TODO // https://github.com/google/skia/blob/master/infra/bots/recipes/test.py#L454
// Are all of these supported? https://github.com/google/skia/blob/master/infra/bots/recipes/test.py#L454
// working on windows at least // working on windows at least
"cr2", "cr2",
"nef", "nef",
@ -272,7 +268,7 @@ namespace Jellyfin.Drawing.Skia
return path; return path;
} }
var tempPath = Path.Combine(_appPaths.TempDirectory, Guid.NewGuid() + Path.GetExtension(path) ?? string.Empty); var tempPath = Path.Combine(_appPaths.TempDirectory, Guid.NewGuid() + Path.GetExtension(path));
Directory.CreateDirectory(Path.GetDirectoryName(tempPath)); Directory.CreateDirectory(Path.GetDirectoryName(tempPath));
File.Copy(path, tempPath, true); File.Copy(path, tempPath, true);