aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Server.Implementations/Library
diff options
context:
space:
mode:
Diffstat (limited to 'MediaBrowser.Server.Implementations/Library')
-rw-r--r--MediaBrowser.Server.Implementations/Library/CoreResolutionIgnoreRule.cs6
-rw-r--r--MediaBrowser.Server.Implementations/Library/LibraryManager.cs14
-rw-r--r--MediaBrowser.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs75
-rw-r--r--MediaBrowser.Server.Implementations/Library/UserDataManager.cs2
-rw-r--r--MediaBrowser.Server.Implementations/Library/UserManager.cs57
5 files changed, 92 insertions, 62 deletions
diff --git a/MediaBrowser.Server.Implementations/Library/CoreResolutionIgnoreRule.cs b/MediaBrowser.Server.Implementations/Library/CoreResolutionIgnoreRule.cs
index 95ec416b6..5268faa4f 100644
--- a/MediaBrowser.Server.Implementations/Library/CoreResolutionIgnoreRule.cs
+++ b/MediaBrowser.Server.Implementations/Library/CoreResolutionIgnoreRule.cs
@@ -114,6 +114,12 @@ namespace MediaBrowser.Server.Implementations.Library
{
return true;
}
+
+ // Don't misidentify xbmc trailers as a movie
+ if (filename.IndexOf(BaseItem.XbmcTrailerFileSuffix, StringComparison.OrdinalIgnoreCase) != -1)
+ {
+ return true;
+ }
}
}
diff --git a/MediaBrowser.Server.Implementations/Library/LibraryManager.cs b/MediaBrowser.Server.Implementations/Library/LibraryManager.cs
index 41694765d..11c99a32c 100644
--- a/MediaBrowser.Server.Implementations/Library/LibraryManager.cs
+++ b/MediaBrowser.Server.Implementations/Library/LibraryManager.cs
@@ -899,6 +899,15 @@ namespace MediaBrowser.Server.Implementations.Library
}
/// <summary>
+ /// Queues the library scan.
+ /// </summary>
+ public void QueueLibraryScan()
+ {
+ // Just run the scheduled task so that the user can see it
+ _taskManager.QueueScheduledTask<RefreshMediaLibraryTask>();
+ }
+
+ /// <summary>
/// Validates the media library internal.
/// </summary>
/// <param name="progress">The progress.</param>
@@ -1311,11 +1320,6 @@ namespace MediaBrowser.Server.Implementations.Library
{
var list = items.ToList();
- foreach (var item in list)
- {
- item.DateLastSaved = DateTime.UtcNow;
- }
-
await ItemRepository.SaveItems(list, cancellationToken).ConfigureAwait(false);
foreach (var item in list)
diff --git a/MediaBrowser.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs b/MediaBrowser.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs
index 03e29dd38..3d6f7e66a 100644
--- a/MediaBrowser.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs
+++ b/MediaBrowser.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs
@@ -91,31 +91,43 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers.Movies
if (args.Path.IndexOf("[trailers]", StringComparison.OrdinalIgnoreCase) != -1 ||
string.Equals(collectionType, CollectionType.Trailers, StringComparison.OrdinalIgnoreCase))
{
- return FindMovie<Trailer>(args.Path, args.FileSystemChildren);
+ return FindMovie<Trailer>(args.Path, args.Parent, args.FileSystemChildren);
}
if (args.Path.IndexOf("[musicvideos]", StringComparison.OrdinalIgnoreCase) != -1 ||
string.Equals(collectionType, CollectionType.MusicVideos, StringComparison.OrdinalIgnoreCase))
{
- return FindMovie<MusicVideo>(args.Path, args.FileSystemChildren);
+ return FindMovie<MusicVideo>(args.Path, args.Parent, args.FileSystemChildren);
}
if (args.Path.IndexOf("[adultvideos]", StringComparison.OrdinalIgnoreCase) != -1 ||
string.Equals(collectionType, CollectionType.AdultVideos, StringComparison.OrdinalIgnoreCase))
{
- return FindMovie<AdultVideo>(args.Path, args.FileSystemChildren);
+ return FindMovie<AdultVideo>(args.Path, args.Parent, args.FileSystemChildren);
}
+ if (string.Equals(collectionType, CollectionType.HomeVideos, StringComparison.OrdinalIgnoreCase))
+ {
+ return FindMovie<Video>(args.Path, args.Parent, args.FileSystemChildren);
+ }
+
if (string.IsNullOrEmpty(collectionType) ||
string.Equals(collectionType, CollectionType.Movies, StringComparison.OrdinalIgnoreCase) ||
string.Equals(collectionType, CollectionType.BoxSets, StringComparison.OrdinalIgnoreCase))
{
- return FindMovie<Movie>(args.Path, args.FileSystemChildren);
+ return FindMovie<Movie>(args.Path, args.Parent, args.FileSystemChildren);
}
return null;
}
+ var filename = Path.GetFileName(args.Path);
+ // Don't misidentify xbmc trailers as a movie
+ if (filename.IndexOf(BaseItem.XbmcTrailerFileSuffix, StringComparison.OrdinalIgnoreCase) != -1)
+ {
+ return null;
+ }
+
// Find movies that are mixed in the same folder
if (args.Path.IndexOf("[trailers]", StringComparison.OrdinalIgnoreCase) != -1 ||
string.Equals(collectionType, CollectionType.Trailers, StringComparison.OrdinalIgnoreCase))
@@ -172,7 +184,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 = item.IsInMixedFolder ? Path.GetFileName(item.Path) : Path.GetFileName(Path.GetDirectoryName(item.Path));
+ var justName = item.IsInMixedFolder ? Path.GetFileName(item.Path) : Path.GetFileName(item.MetaLocation);
var id = justName.GetAttributeValue("tmdbid");
@@ -187,9 +199,10 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers.Movies
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="path">The path.</param>
+ /// <param name="parent">The parent.</param>
/// <param name="fileSystemEntries">The file system entries.</param>
/// <returns>Movie.</returns>
- private T FindMovie<T>(string path, IEnumerable<FileSystemInfo> fileSystemEntries)
+ private T FindMovie<T>(string path, Folder parent, IEnumerable<FileSystemInfo> fileSystemEntries)
where T : Video, new()
{
var movies = new List<T>();
@@ -237,7 +250,8 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers.Movies
var childArgs = new ItemResolveArgs(_applicationPaths, _libraryManager)
{
FileInfo = child,
- Path = child.FullName
+ Path = child.FullName,
+ Parent = parent
};
var item = ResolveVideo<T>(childArgs);
@@ -261,7 +275,9 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers.Movies
if (multiDiscFolders.Count > 0)
{
- return GetMultiDiscMovie<T>(multiDiscFolders);
+ var folders = fileSystemEntries.Where(child => (child.Attributes & FileAttributes.Directory) == FileAttributes.Directory);
+
+ return GetMultiDiscMovie<T>(multiDiscFolders, folders);
}
return null;
@@ -271,25 +287,26 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers.Movies
/// Gets the multi disc movie.
/// </summary>
/// <typeparam name="T"></typeparam>
- /// <param name="folders">The folders.</param>
+ /// <param name="multiDiscFolders">The folders.</param>
+ /// <param name="allFolders">All folders.</param>
/// <returns>``0.</returns>
- private T GetMultiDiscMovie<T>(List<FileSystemInfo> folders)
+ private T GetMultiDiscMovie<T>(List<FileSystemInfo> multiDiscFolders, IEnumerable<FileSystemInfo> allFolders)
where T : Video, new()
{
- var videoType = VideoType.BluRay;
+ var videoTypes = new List<VideoType>();
- var folderPaths = folders.Select(i => i.FullName).Where(i =>
+ var folderPaths = multiDiscFolders.Select(i => i.FullName).Where(i =>
{
var subfolders = Directory.GetDirectories(i).Select(Path.GetFileName).ToList();
if (subfolders.Any(IsDvdDirectory))
{
- videoType = VideoType.Dvd;
+ videoTypes.Add(VideoType.Dvd);
return true;
}
if (subfolders.Any(IsBluRayDirectory))
{
- videoType = VideoType.BluRay;
+ videoTypes.Add(VideoType.BluRay);
return true;
}
@@ -297,18 +314,46 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers.Movies
}).OrderBy(i => i).ToList();
+ // If different video types were found, don't allow this
+ if (videoTypes.Count > 0 && videoTypes.Any(i => i != videoTypes[0]))
+ {
+ return null;
+ }
+
if (folderPaths.Count == 0)
{
return null;
}
+ // If there are other folders side by side that are folder rips, don't allow it
+ // TODO: Improve this to return null if any folder is present aside from our regularly ignored folders
+ if (allFolders.Except(multiDiscFolders).Any(i =>
+ {
+ var subfolders = Directory.GetDirectories(i.FullName).Select(Path.GetFileName).ToList();
+
+ if (subfolders.Any(IsDvdDirectory))
+ {
+ return true;
+ }
+ if (subfolders.Any(IsBluRayDirectory))
+ {
+ return true;
+ }
+
+ return false;
+
+ }))
+ {
+ return null;
+ }
+
return new T
{
Path = folderPaths[0],
IsMultiPart = true,
- VideoType = videoType
+ VideoType = videoTypes[0]
};
}
diff --git a/MediaBrowser.Server.Implementations/Library/UserDataManager.cs b/MediaBrowser.Server.Implementations/Library/UserDataManager.cs
index 8d010aecc..79f126511 100644
--- a/MediaBrowser.Server.Implementations/Library/UserDataManager.cs
+++ b/MediaBrowser.Server.Implementations/Library/UserDataManager.cs
@@ -49,7 +49,7 @@ namespace MediaBrowser.Server.Implementations.Library
/// userId
/// or
/// key</exception>
- public async Task SaveUserData(Guid userId, BaseItem item, UserItemData userData, UserDataSaveReason reason, CancellationToken cancellationToken)
+ public async Task SaveUserData(Guid userId, IHasUserData item, UserItemData userData, UserDataSaveReason reason, CancellationToken cancellationToken)
{
if (userData == null)
{
diff --git a/MediaBrowser.Server.Implementations/Library/UserManager.cs b/MediaBrowser.Server.Implementations/Library/UserManager.cs
index 4243aecfe..d4a74f2b6 100644
--- a/MediaBrowser.Server.Implementations/Library/UserManager.cs
+++ b/MediaBrowser.Server.Implementations/Library/UserManager.cs
@@ -22,39 +22,10 @@ namespace MediaBrowser.Server.Implementations.Library
public class UserManager : IUserManager
{
/// <summary>
- /// The _users
- /// </summary>
- private IEnumerable<User> _users;
- /// <summary>
- /// The _user lock
- /// </summary>
- private object _usersSyncLock = new object();
- /// <summary>
- /// The _users initialized
- /// </summary>
- private bool _usersInitialized;
- /// <summary>
/// Gets the users.
/// </summary>
/// <value>The users.</value>
- public IEnumerable<User> Users
- {
- get
- {
- // Call ToList to exhaust the stream because we'll be iterating over this multiple times
- LazyInitializer.EnsureInitialized(ref _users, ref _usersInitialized, ref _usersSyncLock, LoadUsers);
- return _users;
- }
- internal set
- {
- _users = value;
-
- if (value == null)
- {
- _usersInitialized = false;
- }
- }
- }
+ public IEnumerable<User> Users { get; private set; }
/// <summary>
/// The _logger
@@ -78,11 +49,13 @@ namespace MediaBrowser.Server.Implementations.Library
/// </summary>
/// <param name="logger">The logger.</param>
/// <param name="configurationManager">The configuration manager.</param>
+ /// <param name="userRepository">The user repository.</param>
public UserManager(ILogger logger, IServerConfigurationManager configurationManager, IUserRepository userRepository)
{
_logger = logger;
UserRepository = userRepository;
ConfigurationManager = configurationManager;
+ Users = new List<User>();
}
#region UserUpdated Event
@@ -132,6 +105,11 @@ namespace MediaBrowser.Server.Implementations.Library
return Users.FirstOrDefault(u => u.Id == id);
}
+ public async Task Initialize()
+ {
+ Users = await LoadUsers().ConfigureAwait(false);
+ }
+
/// <summary>
/// Authenticates a User and returns a result indicating whether or not it succeeded
/// </summary>
@@ -185,7 +163,7 @@ namespace MediaBrowser.Server.Implementations.Library
/// Loads the users from the repository
/// </summary>
/// <returns>IEnumerable{User}.</returns>
- private IEnumerable<User> LoadUsers()
+ private async Task<IEnumerable<User>> LoadUsers()
{
var users = UserRepository.RetrieveAllUsers().ToList();
@@ -198,10 +176,7 @@ namespace MediaBrowser.Server.Implementations.Library
user.DateLastSaved = DateTime.UtcNow;
- var task = UserRepository.SaveUser(user, CancellationToken.None);
-
- // Hate having to block threads
- Task.WaitAll(task);
+ await UserRepository.SaveUser(user, CancellationToken.None).ConfigureAwait(false);
users.Add(user);
}
@@ -284,7 +259,7 @@ namespace MediaBrowser.Server.Implementations.Library
}
public event EventHandler<GenericEventArgs<User>> UserCreated;
-
+
/// <summary>
/// Creates the user.
/// </summary>
@@ -311,11 +286,11 @@ namespace MediaBrowser.Server.Implementations.Library
Users = list;
user.DateLastSaved = DateTime.UtcNow;
-
+
await UserRepository.SaveUser(user, CancellationToken.None).ConfigureAwait(false);
EventHelper.QueueEventIfNotNull(UserCreated, this, new GenericEventArgs<User> { Argument = user }, _logger);
-
+
return user;
}
@@ -377,10 +352,10 @@ namespace MediaBrowser.Server.Implementations.Library
}
}
- OnUserDeleted(user);
-
// Force this to be lazy loaded again
- Users = null;
+ Users = await LoadUsers().ConfigureAwait(false);
+
+ OnUserDeleted(user);
}
/// <summary>