aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Controller
diff options
context:
space:
mode:
authorLuke Pulverenti <luke.pulverenti@gmail.com>2013-05-27 12:53:10 -0400
committerLuke Pulverenti <luke.pulverenti@gmail.com>2013-05-27 12:53:10 -0400
commit9a820efde33b7a4cfe1dd3e5c37a2f1beaaec896 (patch)
tree44905e755b26f13ab4815956763a08499a2f7c7d /MediaBrowser.Controller
parent390f1653327e15248c0b0181b338c6a14d04732a (diff)
fixes #280 - MB3 Local metadata fetcher for Music not seeing/using Artist Folder.jpg
Diffstat (limited to 'MediaBrowser.Controller')
-rw-r--r--MediaBrowser.Controller/Library/ILibraryManager.cs4
-rw-r--r--MediaBrowser.Controller/Library/ILibraryPostScanTask.cs20
-rw-r--r--MediaBrowser.Controller/MediaBrowser.Controller.csproj2
-rw-r--r--MediaBrowser.Controller/Providers/ImagesByNameProvider.cs9
-rw-r--r--MediaBrowser.Controller/Providers/Music/ArtistsPostScanTask.cs132
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;
+ });
+ }
+ }
+}