aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Server.Implementations/Library
diff options
context:
space:
mode:
authorEric Reed <ebr@mediabrowser3.com>2013-12-04 15:07:56 -0500
committerEric Reed <ebr@mediabrowser3.com>2013-12-04 15:07:56 -0500
commit6819be81601f6a95a60ce2735474ae0015d19bff (patch)
tree7e2743455e53d4a028fae789f2fc74a7c5ae87b9 /MediaBrowser.Server.Implementations/Library
parent190be6311fbdf3a73f9c8e330f44edafe7764284 (diff)
parentcb882a4b48e9cf03cd363c54d93338ad62153e7e (diff)
Merge branch 'master' of https://github.com/MediaBrowser/MediaBrowser
Diffstat (limited to 'MediaBrowser.Server.Implementations/Library')
-rw-r--r--MediaBrowser.Server.Implementations/Library/LibraryManager.cs110
-rw-r--r--MediaBrowser.Server.Implementations/Library/LuceneSearchEngine.cs16
-rw-r--r--MediaBrowser.Server.Implementations/Library/ResolverHelper.cs5
-rw-r--r--MediaBrowser.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs15
-rw-r--r--MediaBrowser.Server.Implementations/Library/Resolvers/TV/EpisodeResolver.cs9
-rw-r--r--MediaBrowser.Server.Implementations/Library/Validators/ArtistsValidator.cs75
-rw-r--r--MediaBrowser.Server.Implementations/Library/Validators/GameGenresValidator.cs2
-rw-r--r--MediaBrowser.Server.Implementations/Library/Validators/GenresValidator.cs2
-rw-r--r--MediaBrowser.Server.Implementations/Library/Validators/MusicGenresValidator.cs2
-rw-r--r--MediaBrowser.Server.Implementations/Library/Validators/PeoplePostScanTask.cs2
-rw-r--r--MediaBrowser.Server.Implementations/Library/Validators/StudiosValidator.cs2
11 files changed, 111 insertions, 129 deletions
diff --git a/MediaBrowser.Server.Implementations/Library/LibraryManager.cs b/MediaBrowser.Server.Implementations/Library/LibraryManager.cs
index 6a2df70b1..3b6a5ea25 100644
--- a/MediaBrowser.Server.Implementations/Library/LibraryManager.cs
+++ b/MediaBrowser.Server.Implementations/Library/LibraryManager.cs
@@ -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>
@@ -657,16 +670,6 @@ namespace MediaBrowser.Server.Implementations.Library
}
/// <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>
private static readonly CultureInfo UsCulture = new CultureInfo("en-US");
@@ -688,6 +691,16 @@ namespace MediaBrowser.Server.Implementations.Library
}
/// <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>
private readonly ConcurrentDictionary<string, BaseItem> _itemsByName = new ConcurrentDictionary<string, BaseItem>(StringComparer.OrdinalIgnoreCase);
@@ -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);
@@ -874,6 +906,20 @@ namespace MediaBrowser.Server.Implementations.Library
/// <returns>Task.</returns>
public async Task ValidateMediaLibraryInternal(IProgress<double> progress, CancellationToken cancellationToken)
{
+ _directoryWatchersFactory().Stop();
+
+ try
+ {
+ await PerformLibraryValidation(progress, cancellationToken).ConfigureAwait(false);
+ }
+ finally
+ {
+ _directoryWatchersFactory().Start();
+ }
+ }
+
+ private async Task PerformLibraryValidation(IProgress<double> progress, CancellationToken cancellationToken)
+ {
_logger.Info("Validating media library");
await RootFolder.RefreshMetadata(cancellationToken).ConfigureAwait(false);
@@ -1361,16 +1407,7 @@ namespace MediaBrowser.Server.Implementations.Library
/// <returns>BaseItem.</returns>
public BaseItem RetrieveItem(Guid id)
{
- var item = ItemRepository.RetrieveItem(id);
-
- var folder = item as Folder;
-
- if (folder != null)
- {
- folder.LoadSavedChildren();
- }
-
- return item;
+ return ItemRepository.RetrieveItem(id);
}
private readonly ConcurrentDictionary<string, SemaphoreSlim> _fileLocks = new ConcurrentDictionary<string, SemaphoreSlim>();
@@ -1470,5 +1507,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);
+ }
}
}
diff --git a/MediaBrowser.Server.Implementations/Library/LuceneSearchEngine.cs b/MediaBrowser.Server.Implementations/Library/LuceneSearchEngine.cs
index d5fccc6fd..b194b2e94 100644
--- a/MediaBrowser.Server.Implementations/Library/LuceneSearchEngine.cs
+++ b/MediaBrowser.Server.Implementations/Library/LuceneSearchEngine.cs
@@ -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)
diff --git a/MediaBrowser.Server.Implementations/Library/ResolverHelper.cs b/MediaBrowser.Server.Implementations/Library/ResolverHelper.cs
index 620bcaee4..e32fcd627 100644
--- a/MediaBrowser.Server.Implementations/Library/ResolverHelper.cs
+++ b/MediaBrowser.Server.Implementations/Library/ResolverHelper.cs
@@ -1,11 +1,11 @@
using MediaBrowser.Common.Extensions;
using MediaBrowser.Common.IO;
using MediaBrowser.Controller.Entities;
-using MediaBrowser.Controller.IO;
using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.Resolvers;
using System;
using System.IO;
+using System.Linq;
using System.Text.RegularExpressions;
namespace MediaBrowser.Server.Implementations.Library
@@ -48,7 +48,8 @@ namespace MediaBrowser.Server.Implementations.Library
// Make sure the item has a name
EnsureName(item);
- item.DontFetchMeta = item.Path.IndexOf("[dontfetchmeta]", StringComparison.OrdinalIgnoreCase) != -1;
+ item.DontFetchMeta = item.Path.IndexOf("[dontfetchmeta]", StringComparison.OrdinalIgnoreCase) != -1 ||
+ item.Parents.Any(i => i.DontFetchMeta);
// Make sure DateCreated and DateModified have values
EntityResolutionHelper.EnsureDates(fileSystem, item, args, true);
diff --git a/MediaBrowser.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs b/MediaBrowser.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs
index 0f87b9d33..03e29dd38 100644
--- a/MediaBrowser.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs
+++ b/MediaBrowser.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs
@@ -172,7 +172,7 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers.Movies
private void SetProviderIdFromPath(Video item)
{
//we need to only look at the name of this actual item (not parents)
- var justName = Path.GetFileName(item.Path);
+ var justName = item.IsInMixedFolder ? Path.GetFileName(item.Path) : Path.GetFileName(Path.GetDirectoryName(item.Path));
var id = justName.GetAttributeValue("tmdbid");
@@ -345,26 +345,17 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers.Movies
/// <returns><c>true</c> if [is DVD directory] [the specified directory name]; otherwise, <c>false</c>.</returns>
private bool IsDvdDirectory(string directoryName)
{
- return directoryName.Equals("video_ts", StringComparison.OrdinalIgnoreCase);
+ return string.Equals(directoryName, "video_ts", StringComparison.OrdinalIgnoreCase);
}
/// <summary>
- /// Determines whether [is hd DVD directory] [the specified directory name].
- /// </summary>
- /// <param name="directoryName">Name of the directory.</param>
- /// <returns><c>true</c> if [is hd DVD directory] [the specified directory name]; otherwise, <c>false</c>.</returns>
- private bool IsHdDvdDirectory(string directoryName)
- {
- return directoryName.Equals("hvdvd_ts", StringComparison.OrdinalIgnoreCase);
- }
- /// <summary>
/// Determines whether [is blu ray directory] [the specified directory name].
/// </summary>
/// <param name="directoryName">Name of the directory.</param>
/// <returns><c>true</c> if [is blu ray directory] [the specified directory name]; otherwise, <c>false</c>.</returns>
private bool IsBluRayDirectory(string directoryName)
{
- return directoryName.Equals("bdmv", StringComparison.OrdinalIgnoreCase);
+ return string.Equals(directoryName, "bdmv", StringComparison.OrdinalIgnoreCase);
}
}
}
diff --git a/MediaBrowser.Server.Implementations/Library/Resolvers/TV/EpisodeResolver.cs b/MediaBrowser.Server.Implementations/Library/Resolvers/TV/EpisodeResolver.cs
index 0a6a72fc1..693594a20 100644
--- a/MediaBrowser.Server.Implementations/Library/Resolvers/TV/EpisodeResolver.cs
+++ b/MediaBrowser.Server.Implementations/Library/Resolvers/TV/EpisodeResolver.cs
@@ -20,7 +20,7 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers.TV
var season = args.Parent as Season;
// If the parent is a Season or Series, then this is an Episode if the VideoResolver returns something
- if (season != null)
+ if (season != null || args.Parent is Series)
{
Episode episode = null;
@@ -51,8 +51,11 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers.TV
if (episode != null)
{
- episode.ParentIndexNumber = season.IndexNumber;
-
+ if (season != null)
+ {
+ episode.ParentIndexNumber = season.IndexNumber;
+ }
+
if (episode.ParentIndexNumber == null)
{
episode.ParentIndexNumber = TVUtils.GetSeasonNumberFromEpisodeFile(args.Path);
diff --git a/MediaBrowser.Server.Implementations/Library/Validators/ArtistsValidator.cs b/MediaBrowser.Server.Implementations/Library/Validators/ArtistsValidator.cs
index 7d46d7060..40ef5304c 100644
--- a/MediaBrowser.Server.Implementations/Library/Validators/ArtistsValidator.cs
+++ b/MediaBrowser.Server.Implementations/Library/Validators/ArtistsValidator.cs
@@ -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;
@@ -166,26 +137,7 @@ namespace MediaBrowser.Server.Implementations.Library.Validators
if (userId.HasValue)
{
- artist.UserItemCounts[userId.Value] = counts;
- }
- }
-
- /// <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;
- }
+ artist.SetItemByNameCounts(userId.Value, counts);
}
}
@@ -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;
diff --git a/MediaBrowser.Server.Implementations/Library/Validators/GameGenresValidator.cs b/MediaBrowser.Server.Implementations/Library/Validators/GameGenresValidator.cs
index d21a123c0..c7af7a238 100644
--- a/MediaBrowser.Server.Implementations/Library/Validators/GameGenresValidator.cs
+++ b/MediaBrowser.Server.Implementations/Library/Validators/GameGenresValidator.cs
@@ -106,7 +106,7 @@ namespace MediaBrowser.Server.Implementations.Library.Validators
{
var itemCounts = CountHelpers.GetCounts(counts[libraryId]);
- itemByName.UserItemCounts[libraryId] = itemCounts;
+ itemByName.SetItemByNameCounts(libraryId, itemCounts);
}
await itemByName.RefreshMetadata(cancellationToken).ConfigureAwait(false);
diff --git a/MediaBrowser.Server.Implementations/Library/Validators/GenresValidator.cs b/MediaBrowser.Server.Implementations/Library/Validators/GenresValidator.cs
index 0670e1a85..cb1253df0 100644
--- a/MediaBrowser.Server.Implementations/Library/Validators/GenresValidator.cs
+++ b/MediaBrowser.Server.Implementations/Library/Validators/GenresValidator.cs
@@ -107,7 +107,7 @@ namespace MediaBrowser.Server.Implementations.Library.Validators
{
var itemCounts = CountHelpers.GetCounts(counts[libraryId]);
- itemByName.UserItemCounts[libraryId] = itemCounts;
+ itemByName.SetItemByNameCounts(libraryId, itemCounts);
}
await itemByName.RefreshMetadata(cancellationToken).ConfigureAwait(false);
diff --git a/MediaBrowser.Server.Implementations/Library/Validators/MusicGenresValidator.cs b/MediaBrowser.Server.Implementations/Library/Validators/MusicGenresValidator.cs
index 166f557cf..57a6a612b 100644
--- a/MediaBrowser.Server.Implementations/Library/Validators/MusicGenresValidator.cs
+++ b/MediaBrowser.Server.Implementations/Library/Validators/MusicGenresValidator.cs
@@ -107,7 +107,7 @@ namespace MediaBrowser.Server.Implementations.Library.Validators
{
var itemCounts = CountHelpers.GetCounts(counts[libraryId]);
- itemByName.UserItemCounts[libraryId] = itemCounts;
+ itemByName.SetItemByNameCounts(libraryId, itemCounts);
}
await itemByName.RefreshMetadata(cancellationToken).ConfigureAwait(false);
diff --git a/MediaBrowser.Server.Implementations/Library/Validators/PeoplePostScanTask.cs b/MediaBrowser.Server.Implementations/Library/Validators/PeoplePostScanTask.cs
index cfc7f4310..0104b2b7e 100644
--- a/MediaBrowser.Server.Implementations/Library/Validators/PeoplePostScanTask.cs
+++ b/MediaBrowser.Server.Implementations/Library/Validators/PeoplePostScanTask.cs
@@ -94,7 +94,7 @@ namespace MediaBrowser.Server.Implementations.Library.Validators
{
var itemCounts = CountHelpers.GetCounts(counts[libraryId]);
- itemByName.UserItemCounts[libraryId] = itemCounts;
+ itemByName.SetItemByNameCounts(libraryId, itemCounts);
}
}
catch (Exception ex)
diff --git a/MediaBrowser.Server.Implementations/Library/Validators/StudiosValidator.cs b/MediaBrowser.Server.Implementations/Library/Validators/StudiosValidator.cs
index 02c7a94b4..0f4ff562e 100644
--- a/MediaBrowser.Server.Implementations/Library/Validators/StudiosValidator.cs
+++ b/MediaBrowser.Server.Implementations/Library/Validators/StudiosValidator.cs
@@ -106,7 +106,7 @@ namespace MediaBrowser.Server.Implementations.Library.Validators
{
var itemCounts = CountHelpers.GetCounts(counts[libraryId]);
- itemByName.UserItemCounts[libraryId] = itemCounts;
+ itemByName.SetItemByNameCounts(libraryId, itemCounts);
}
await itemByName.RefreshMetadata(cancellationToken).ConfigureAwait(false);