diff options
| author | Luke Pulverenti <luke.pulverenti@gmail.com> | 2013-05-27 12:53:10 -0400 |
|---|---|---|
| committer | Luke Pulverenti <luke.pulverenti@gmail.com> | 2013-05-27 12:53:10 -0400 |
| commit | 9a820efde33b7a4cfe1dd3e5c37a2f1beaaec896 (patch) | |
| tree | 44905e755b26f13ab4815956763a08499a2f7c7d /MediaBrowser.Controller | |
| parent | 390f1653327e15248c0b0181b338c6a14d04732a (diff) | |
fixes #280 - MB3 Local metadata fetcher for Music not seeing/using Artist Folder.jpg
Diffstat (limited to 'MediaBrowser.Controller')
5 files changed, 165 insertions, 2 deletions
diff --git a/MediaBrowser.Controller/Library/ILibraryManager.cs b/MediaBrowser.Controller/Library/ILibraryManager.cs index 90c96c1ee..f5abb8dcd 100644 --- a/MediaBrowser.Controller/Library/ILibraryManager.cs +++ b/MediaBrowser.Controller/Library/ILibraryManager.cs @@ -144,12 +144,14 @@ namespace MediaBrowser.Controller.Library /// <param name="introProviders">The intro providers.</param> /// <param name="itemComparers">The item comparers.</param> /// <param name="prescanTasks">The prescan tasks.</param> + /// <param name="postscanTasks">The postscan tasks.</param> void AddParts(IEnumerable<IResolverIgnoreRule> rules, IEnumerable<IVirtualFolderCreator> pluginFolders, IEnumerable<IItemResolver> resolvers, IEnumerable<IIntroProvider> introProviders, IEnumerable<IBaseItemComparer> itemComparers, - IEnumerable<ILibraryPrescanTask> prescanTasks); + IEnumerable<ILibraryPrescanTask> prescanTasks, + IEnumerable<ILibraryPostScanTask> postscanTasks); /// <summary> /// Sorts the specified items. diff --git a/MediaBrowser.Controller/Library/ILibraryPostScanTask.cs b/MediaBrowser.Controller/Library/ILibraryPostScanTask.cs new file mode 100644 index 000000000..694422907 --- /dev/null +++ b/MediaBrowser.Controller/Library/ILibraryPostScanTask.cs @@ -0,0 +1,20 @@ +using System; +using System.Threading; +using System.Threading.Tasks; + +namespace MediaBrowser.Controller.Library +{ + /// <summary> + /// An interface for tasks that run after the media library scan + /// </summary> + public interface ILibraryPostScanTask + { + /// <summary> + /// Runs the specified progress. + /// </summary> + /// <param name="progress">The progress.</param> + /// <param name="cancellationToken">The cancellation token.</param> + /// <returns>Task.</returns> + Task Run(IProgress<double> progress, CancellationToken cancellationToken); + } +} diff --git a/MediaBrowser.Controller/MediaBrowser.Controller.csproj b/MediaBrowser.Controller/MediaBrowser.Controller.csproj index 921e16eed..d3f8ba927 100644 --- a/MediaBrowser.Controller/MediaBrowser.Controller.csproj +++ b/MediaBrowser.Controller/MediaBrowser.Controller.csproj @@ -73,8 +73,10 @@ <Compile Include="Configuration\IServerConfigurationManager.cs" /> <Compile Include="Dto\SessionInfoDtoBuilder.cs" /> <Compile Include="Entities\Audio\MusicAlbumDisc.cs" /> + <Compile Include="Library\ILibraryPostScanTask.cs" /> <Compile Include="Library\ILibraryPrescanTask.cs" /> <Compile Include="Providers\Movies\MovieDbImagesProvider.cs" /> + <Compile Include="Providers\Music\ArtistsPostScanTask.cs" /> <Compile Include="Providers\Music\FanArtUpdatesPrescanTask.cs" /> <Compile Include="Providers\TV\FanArtSeasonProvider.cs" /> <Compile Include="Providers\TV\TvdbPrescanTask.cs" /> diff --git a/MediaBrowser.Controller/Providers/ImagesByNameProvider.cs b/MediaBrowser.Controller/Providers/ImagesByNameProvider.cs index 54a6f3a89..20305006e 100644 --- a/MediaBrowser.Controller/Providers/ImagesByNameProvider.cs +++ b/MediaBrowser.Controller/Providers/ImagesByNameProvider.cs @@ -155,7 +155,14 @@ namespace MediaBrowser.Controller.Providers { var location = GetLocation(item); - var files = new DirectoryInfo(location).EnumerateFiles("*", SearchOption.TopDirectoryOnly).ToList(); + var directoryInfo = new DirectoryInfo(location); + + if (!directoryInfo.Exists) + { + return null; + } + + var files = directoryInfo.EnumerateFiles("*", SearchOption.TopDirectoryOnly).ToList(); var file = files.FirstOrDefault(i => string.Equals(i.Name, filenameWithoutExtension + ".png", StringComparison.OrdinalIgnoreCase)); diff --git a/MediaBrowser.Controller/Providers/Music/ArtistsPostScanTask.cs b/MediaBrowser.Controller/Providers/Music/ArtistsPostScanTask.cs new file mode 100644 index 000000000..67bb35b63 --- /dev/null +++ b/MediaBrowser.Controller/Providers/Music/ArtistsPostScanTask.cs @@ -0,0 +1,132 @@ +using MediaBrowser.Common.Progress; +using MediaBrowser.Controller.Entities; +using MediaBrowser.Controller.Entities.Audio; +using MediaBrowser.Controller.Library; +using MediaBrowser.Model.Entities; +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; + +namespace MediaBrowser.Controller.Providers.Music +{ + /// <summary> + /// Class ArtistsPostScanTask + /// </summary> + public class ArtistsPostScanTask : ILibraryPostScanTask + { + /// <summary> + /// The _library manager + /// </summary> + private readonly ILibraryManager _libraryManager; + + /// <summary> + /// Initializes a new instance of the <see cref="ArtistsPostScanTask"/> class. + /// </summary> + /// <param name="libraryManager">The library manager.</param> + public ArtistsPostScanTask(ILibraryManager libraryManager) + { + _libraryManager = libraryManager; + } + + /// <summary> + /// Runs the specified progress. + /// </summary> + /// <param name="progress">The progress.</param> + /// <param name="cancellationToken">The cancellation token.</param> + /// <returns>Task.</returns> + public async Task Run(IProgress<double> progress, CancellationToken cancellationToken) + { + var allItems = _libraryManager.RootFolder.RecursiveChildren.ToList(); + + var allArtists = await GetAllArtists(allItems).ConfigureAwait(false); + + progress.Report(10); + + var allMusicArtists = allItems.OfType<MusicArtist>().ToList(); + + var numComplete = 0; + + foreach (var artist in allArtists) + { + var musicArtist = FindMusicArtist(artist, allMusicArtists); + + if (musicArtist != null) + { + artist.Images = new Dictionary<ImageType, string>(musicArtist.Images); + + artist.BackdropImagePaths = musicArtist.BackdropImagePaths.ToList(); + artist.ScreenshotImagePaths = musicArtist.ScreenshotImagePaths.ToList(); + artist.SetProviderId(MetadataProviders.Musicbrainz, musicArtist.GetProviderId(MetadataProviders.Musicbrainz)); + } + + numComplete++; + double percent = numComplete; + percent /= allArtists.Length; + percent *= 5; + + progress.Report(10 + percent); + } + + var innerProgress = new ActionableProgress<double>(); + + innerProgress.RegisterAction(pct => progress.Report(15 + pct * .85)); + + await _libraryManager.ValidateArtists(cancellationToken, innerProgress).ConfigureAwait(false); + } + + /// <summary> + /// Gets all artists. + /// </summary> + /// <param name="allItems">All items.</param> + /// <returns>Task{Artist[]}.</returns> + private Task<Artist[]> GetAllArtists(IEnumerable<BaseItem> allItems) + { + var itemsList = allItems.OfType<Audio>().ToList(); + + var tasks = itemsList + .SelectMany(i => + { + var list = new List<string>(); + + if (!string.IsNullOrEmpty(i.AlbumArtist)) + { + list.Add(i.AlbumArtist); + } + if (!string.IsNullOrEmpty(i.Artist)) + { + list.Add(i.Artist); + } + + return list; + }) + .Distinct(StringComparer.OrdinalIgnoreCase) + .Select(i => _libraryManager.GetArtist(i)); + + return Task.WhenAll(tasks); + } + + /// <summary> + /// Finds the music artist. + /// </summary> + /// <param name="artist">The artist.</param> + /// <param name="allMusicArtists">All music artists.</param> + /// <returns>MusicArtist.</returns> + private static MusicArtist FindMusicArtist(Artist artist, IEnumerable<MusicArtist> allMusicArtists) + { + var musicBrainzId = artist.GetProviderId(MetadataProviders.Musicbrainz); + + return allMusicArtists.FirstOrDefault(i => + { + if (!string.IsNullOrWhiteSpace(musicBrainzId) && string.Equals(musicBrainzId, i.GetProviderId(MetadataProviders.Musicbrainz), StringComparison.OrdinalIgnoreCase)) + { + return true; + } + + return string.Compare(i.Name, artist.Name, CultureInfo.CurrentCulture, CompareOptions.IgnoreNonSpace | CompareOptions.IgnoreCase | CompareOptions.IgnoreSymbols) == 0; + }); + } + } +} |
