mirror of
https://github.com/jellyfin/jellyfin.git
synced 2026-03-18 08:06:35 +00:00
consolidate Artist & MusicArtist
This commit is contained in:
@@ -277,7 +277,7 @@ namespace MediaBrowser.Server.Implementations.Dto
|
||||
Id = GetDtoId(item),
|
||||
Name = item.Name,
|
||||
MediaType = item.MediaType,
|
||||
Type = item.GetType().Name,
|
||||
Type = item.GetClientTypeName(),
|
||||
RunTimeTicks = item.RunTimeTicks
|
||||
};
|
||||
|
||||
@@ -932,7 +932,7 @@ namespace MediaBrowser.Server.Implementations.Dto
|
||||
dto.RemoteTrailers = item.RemoteTrailers;
|
||||
}
|
||||
|
||||
dto.Type = item.GetType().Name;
|
||||
dto.Type = item.GetClientTypeName();
|
||||
dto.CommunityRating = item.CommunityRating;
|
||||
dto.VoteCount = item.VoteCount;
|
||||
|
||||
|
||||
@@ -391,10 +391,23 @@ namespace MediaBrowser.Server.Implementations.Library
|
||||
/// <param name="item">The item.</param>
|
||||
private void UpdateItemInLibraryCache(BaseItem item)
|
||||
{
|
||||
if (!(item is IItemByName))
|
||||
if (item is IItemByName)
|
||||
{
|
||||
LibraryItemsCache.AddOrUpdate(item.Id, item, delegate { return item; });
|
||||
var hasDualAccess = item as IHasDualAccess;
|
||||
if (hasDualAccess != null)
|
||||
{
|
||||
if (hasDualAccess.IsAccessedByName)
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
LibraryItemsCache.AddOrUpdate(item.Id, item, delegate { return item; });
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -656,16 +669,6 @@ namespace MediaBrowser.Server.Implementations.Library
|
||||
return GetItemByName<GameGenre>(ConfigurationManager.ApplicationPaths.GameGenrePath, name);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets a Genre
|
||||
/// </summary>
|
||||
/// <param name="name">The name.</param>
|
||||
/// <returns>Task{Genre}.</returns>
|
||||
public Artist GetArtist(string name)
|
||||
{
|
||||
return GetItemByName<Artist>(ConfigurationManager.ApplicationPaths.ArtistsPath, name);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// The us culture
|
||||
/// </summary>
|
||||
@@ -687,6 +690,16 @@ namespace MediaBrowser.Server.Implementations.Library
|
||||
return GetItemByName<Year>(ConfigurationManager.ApplicationPaths.YearPath, value.ToString(UsCulture));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets a Genre
|
||||
/// </summary>
|
||||
/// <param name="name">The name.</param>
|
||||
/// <returns>Task{Genre}.</returns>
|
||||
public MusicArtist GetArtist(string name)
|
||||
{
|
||||
return GetItemByName<MusicArtist>(ConfigurationManager.ApplicationPaths.ArtistsPath, name);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// The images by name item cache
|
||||
/// </summary>
|
||||
@@ -697,12 +710,12 @@ namespace MediaBrowser.Server.Implementations.Library
|
||||
{
|
||||
if (string.IsNullOrEmpty(path))
|
||||
{
|
||||
throw new ArgumentNullException();
|
||||
throw new ArgumentNullException("path");
|
||||
}
|
||||
|
||||
if (string.IsNullOrEmpty(name))
|
||||
{
|
||||
throw new ArgumentNullException();
|
||||
throw new ArgumentNullException("name");
|
||||
}
|
||||
|
||||
var validFilename = _fileSystem.GetValidFilename(name).Trim();
|
||||
@@ -743,6 +756,20 @@ namespace MediaBrowser.Server.Implementations.Library
|
||||
private Tuple<bool, T> CreateItemByName<T>(string path, string name)
|
||||
where T : BaseItem, new()
|
||||
{
|
||||
var isArtist = typeof(T) == typeof(MusicArtist);
|
||||
|
||||
if (isArtist)
|
||||
{
|
||||
var existing = RootFolder.RecursiveChildren
|
||||
.OfType<T>()
|
||||
.FirstOrDefault(i => string.Equals(i.Name, name, StringComparison.OrdinalIgnoreCase));
|
||||
|
||||
if (existing != null)
|
||||
{
|
||||
return new Tuple<bool, T>(false, existing);
|
||||
}
|
||||
}
|
||||
|
||||
var fileInfo = new DirectoryInfo(path);
|
||||
|
||||
var isNew = false;
|
||||
@@ -779,6 +806,11 @@ namespace MediaBrowser.Server.Implementations.Library
|
||||
isNew = true;
|
||||
}
|
||||
|
||||
if (isArtist)
|
||||
{
|
||||
(item as MusicArtist).IsAccessedByName = true;
|
||||
}
|
||||
|
||||
// Set this now so we don't cause additional file system access during provider executions
|
||||
item.ResetResolveArgs(fileInfo);
|
||||
|
||||
@@ -1363,16 +1395,19 @@ namespace MediaBrowser.Server.Implementations.Library
|
||||
{
|
||||
var item = ItemRepository.RetrieveItem(id);
|
||||
|
||||
var folder = item as Folder;
|
||||
|
||||
if (folder != null)
|
||||
if (item != null && item.IsFolder)
|
||||
{
|
||||
folder.LoadSavedChildren();
|
||||
LoadSavedChildren(item as Folder);
|
||||
}
|
||||
|
||||
return item;
|
||||
}
|
||||
|
||||
private void LoadSavedChildren(Folder item)
|
||||
{
|
||||
item.LoadSavedChildren();
|
||||
}
|
||||
|
||||
private readonly ConcurrentDictionary<string, SemaphoreSlim> _fileLocks = new ConcurrentDictionary<string, SemaphoreSlim>();
|
||||
|
||||
/// <summary>
|
||||
@@ -1470,5 +1505,30 @@ namespace MediaBrowser.Server.Implementations.Library
|
||||
|
||||
return collectionTypes.Count == 1 ? collectionTypes[0] : null;
|
||||
}
|
||||
|
||||
|
||||
public IEnumerable<string> GetAllArtists()
|
||||
{
|
||||
return GetAllArtists(RootFolder.RecursiveChildren);
|
||||
}
|
||||
|
||||
public IEnumerable<string> GetAllArtists(IEnumerable<BaseItem> items)
|
||||
{
|
||||
return items
|
||||
.OfType<Audio>()
|
||||
.SelectMany(i =>
|
||||
{
|
||||
var list = new List<string>();
|
||||
|
||||
if (!string.IsNullOrEmpty(i.AlbumArtist))
|
||||
{
|
||||
list.Add(i.AlbumArtist);
|
||||
}
|
||||
list.AddRange(i.Artists);
|
||||
|
||||
return list;
|
||||
})
|
||||
.Distinct(StringComparer.OrdinalIgnoreCase);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -74,21 +74,7 @@ namespace MediaBrowser.Server.Implementations.Library
|
||||
}));
|
||||
|
||||
// Find artists
|
||||
var artists = items.OfType<Audio>()
|
||||
.SelectMany(i =>
|
||||
{
|
||||
var list = new List<string>();
|
||||
|
||||
if (!string.IsNullOrEmpty(i.AlbumArtist))
|
||||
{
|
||||
list.Add(i.AlbumArtist);
|
||||
}
|
||||
list.AddRange(i.Artists);
|
||||
|
||||
return list;
|
||||
})
|
||||
.Where(i => !string.IsNullOrEmpty(i))
|
||||
.Distinct(StringComparer.OrdinalIgnoreCase)
|
||||
var artists = _libraryManager.GetAllArtists(items)
|
||||
.ToList();
|
||||
|
||||
foreach (var item in artists)
|
||||
|
||||
@@ -57,7 +57,6 @@ namespace MediaBrowser.Server.Implementations.Library.Validators
|
||||
{
|
||||
var allItems = _libraryManager.RootFolder.GetRecursiveChildren();
|
||||
|
||||
var allMusicArtists = allItems.OfType<MusicArtist>().ToList();
|
||||
var allSongs = allItems.OfType<Audio>().ToList();
|
||||
|
||||
var innerProgress = new ActionableProgress<double>();
|
||||
@@ -80,36 +79,8 @@ namespace MediaBrowser.Server.Implementations.Library.Validators
|
||||
{
|
||||
cancellationToken.ThrowIfCancellationRequested();
|
||||
|
||||
artist.ValidateImages();
|
||||
artist.ValidateBackdrops();
|
||||
|
||||
var musicArtist = Artist.FindMusicArtist(artist, allMusicArtists);
|
||||
|
||||
if (musicArtist != null)
|
||||
{
|
||||
MergeImages(musicArtist.Images, artist.Images);
|
||||
|
||||
// Merge backdrops
|
||||
var additionalBackdrops = musicArtist
|
||||
.BackdropImagePaths
|
||||
.Except(artist.BackdropImagePaths)
|
||||
.ToList();
|
||||
|
||||
var sources = additionalBackdrops
|
||||
.Select(musicArtist.GetImageSourceInfo)
|
||||
.Where(i => i != null)
|
||||
.ToList();
|
||||
|
||||
foreach (var path in additionalBackdrops)
|
||||
{
|
||||
artist.RemoveImageSourceForPath(path);
|
||||
}
|
||||
|
||||
artist.BackdropImagePaths.AddRange(additionalBackdrops);
|
||||
artist.ImageSources.AddRange(sources);
|
||||
}
|
||||
|
||||
if (!artist.LockedFields.Contains(MetadataFields.Genres))
|
||||
// Only do this for artists accessed by name. Folder-based artists use ArtistInfoFromSongsProvider
|
||||
if (artist.IsAccessedByName && !artist.LockedFields.Contains(MetadataFields.Genres))
|
||||
{
|
||||
// Avoid implicitly captured closure
|
||||
var artist1 = artist;
|
||||
@@ -145,7 +116,7 @@ namespace MediaBrowser.Server.Implementations.Library.Validators
|
||||
/// <param name="artist">The artist.</param>
|
||||
/// <param name="userId">The user id.</param>
|
||||
/// <param name="allItems">All items.</param>
|
||||
private void SetItemCounts(Artist artist, Guid? userId, IEnumerable<IHasArtist> allItems)
|
||||
private void SetItemCounts(MusicArtist artist, Guid? userId, IEnumerable<IHasArtist> allItems)
|
||||
{
|
||||
var name = artist.Name;
|
||||
|
||||
@@ -170,25 +141,6 @@ namespace MediaBrowser.Server.Implementations.Library.Validators
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Merges the images.
|
||||
/// </summary>
|
||||
/// <param name="source">The source.</param>
|
||||
/// <param name="target">The target.</param>
|
||||
private void MergeImages(Dictionary<ImageType, string> source, Dictionary<ImageType, string> target)
|
||||
{
|
||||
foreach (var key in source.Keys
|
||||
.Where(k => !target.ContainsKey(k)))
|
||||
{
|
||||
string path;
|
||||
|
||||
if (source.TryGetValue(key, out path))
|
||||
{
|
||||
target[key] = path;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets all artists.
|
||||
/// </summary>
|
||||
@@ -196,25 +148,12 @@ namespace MediaBrowser.Server.Implementations.Library.Validators
|
||||
/// <param name="cancellationToken">The cancellation token.</param>
|
||||
/// <param name="progress">The progress.</param>
|
||||
/// <returns>Task{Artist[]}.</returns>
|
||||
private async Task<List<Artist>> GetAllArtists(IEnumerable<Audio> allSongs, CancellationToken cancellationToken, IProgress<double> progress)
|
||||
private async Task<List<MusicArtist>> GetAllArtists(IEnumerable<Audio> allSongs, CancellationToken cancellationToken, IProgress<double> progress)
|
||||
{
|
||||
var allArtists = allSongs
|
||||
.SelectMany(i =>
|
||||
{
|
||||
var list = new List<string>();
|
||||
|
||||
if (!string.IsNullOrEmpty(i.AlbumArtist))
|
||||
{
|
||||
list.Add(i.AlbumArtist);
|
||||
}
|
||||
list.AddRange(i.Artists);
|
||||
|
||||
return list;
|
||||
})
|
||||
.Distinct(StringComparer.OrdinalIgnoreCase)
|
||||
var allArtists = _libraryManager.GetAllArtists(allSongs)
|
||||
.ToList();
|
||||
|
||||
var returnArtists = new List<Artist>(allArtists.Count);
|
||||
var returnArtists = new List<MusicArtist>(allArtists.Count);
|
||||
|
||||
var numComplete = 0;
|
||||
var numArtists = allArtists.Count;
|
||||
|
||||
@@ -508,7 +508,7 @@ namespace MediaBrowser.Server.Implementations.Providers
|
||||
return new[] { GetSavePathForItemInMixedFolder(item, type, string.Empty, extension) };
|
||||
}
|
||||
|
||||
if (item is MusicAlbum || item is Artist || item is MusicArtist)
|
||||
if (item is MusicAlbum || item is MusicArtist)
|
||||
{
|
||||
return new[] { Path.Combine(item.MetaLocation, "folder" + extension) };
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user