diff --git a/MediaBrowser.Api/Library/LibraryHelpers.cs b/MediaBrowser.Api/Library/LibraryHelpers.cs
index 46ec4f270..22a88e2bf 100644
--- a/MediaBrowser.Api/Library/LibraryHelpers.cs
+++ b/MediaBrowser.Api/Library/LibraryHelpers.cs
@@ -50,40 +50,5 @@ namespace MediaBrowser.Api.Library
fileSystem.DeleteFile(shortcut);
}
}
-
- ///
- /// Adds an additional mediaPath to an existing virtual folder, within either the default view or a user view
- ///
- /// The file system.
- /// Name of the virtual folder.
- /// The path.
- /// The app paths.
- public static void AddMediaPath(IFileSystem fileSystem, string virtualFolderName, string path, IServerApplicationPaths appPaths)
- {
- if (string.IsNullOrWhiteSpace(path))
- {
- throw new ArgumentNullException("path");
- }
-
- if (!fileSystem.DirectoryExists(path))
- {
- throw new DirectoryNotFoundException("The path does not exist.");
- }
-
- var rootFolderPath = appPaths.DefaultUserViewsPath;
- var virtualFolderPath = Path.Combine(rootFolderPath, virtualFolderName);
-
- var shortcutFilename = fileSystem.GetFileNameWithoutExtension(path);
-
- var lnk = Path.Combine(virtualFolderPath, shortcutFilename + ShortcutFileExtension);
-
- while (fileSystem.FileExists(lnk))
- {
- shortcutFilename += "1";
- lnk = Path.Combine(virtualFolderPath, shortcutFilename + ShortcutFileExtension);
- }
-
- fileSystem.CreateShortcut(lnk, path);
- }
}
}
diff --git a/MediaBrowser.Api/Library/LibraryStructureService.cs b/MediaBrowser.Api/Library/LibraryStructureService.cs
index 244dcf09f..817fd9ce0 100644
--- a/MediaBrowser.Api/Library/LibraryStructureService.cs
+++ b/MediaBrowser.Api/Library/LibraryStructureService.cs
@@ -190,75 +190,7 @@ namespace MediaBrowser.Api.Library
/// The request.
public void Post(AddVirtualFolder request)
{
- if (string.IsNullOrWhiteSpace(request.Name))
- {
- throw new ArgumentNullException("request");
- }
-
- var name = _fileSystem.GetValidFilename(request.Name);
-
- var rootFolderPath = _appPaths.DefaultUserViewsPath;
-
- var virtualFolderPath = Path.Combine(rootFolderPath, name);
- while (_fileSystem.DirectoryExists(virtualFolderPath))
- {
- name += "1";
- virtualFolderPath = Path.Combine(rootFolderPath, name);
- }
-
- if (request.Paths != null)
- {
- var invalidpath = request.Paths.FirstOrDefault(i => !_fileSystem.DirectoryExists(i));
- if (invalidpath != null)
- {
- throw new ArgumentException("The specified path does not exist: " + invalidpath + ".");
- }
- }
-
- _libraryMonitor.Stop();
-
- try
- {
- _fileSystem.CreateDirectory(virtualFolderPath);
-
- if (!string.IsNullOrEmpty(request.CollectionType))
- {
- var path = Path.Combine(virtualFolderPath, request.CollectionType + ".collection");
-
- using (File.Create(path))
- {
-
- }
- }
-
- if (request.Paths != null)
- {
- foreach (var path in request.Paths)
- {
- LibraryHelpers.AddMediaPath(_fileSystem, name, path, _appPaths);
- }
- }
- }
- finally
- {
- Task.Run(() =>
- {
- // No need to start if scanning the library because it will handle it
- if (request.RefreshLibrary)
- {
- _libraryManager.ValidateMediaLibrary(new Progress(), CancellationToken.None);
- }
- else
- {
- // Need to add a delay here or directory watchers may still pick up the changes
- var task = Task.Delay(1000);
- // Have to block here to allow exceptions to bubble
- Task.WaitAll(task);
-
- _libraryMonitor.Start();
- }
- });
- }
+ _libraryManager.AddVirtualFolder(request.Name, request.CollectionType, request.Paths, request.RefreshLibrary);
}
///
@@ -393,7 +325,7 @@ namespace MediaBrowser.Api.Library
try
{
- LibraryHelpers.AddMediaPath(_fileSystem, request.Name, request.Path, _appPaths);
+ _libraryManager.AddMediaPath(request.Name, request.Path);
}
finally
{
diff --git a/MediaBrowser.Controller/Entities/InternalItemsQuery.cs b/MediaBrowser.Controller/Entities/InternalItemsQuery.cs
index b148251ff..6838fde71 100644
--- a/MediaBrowser.Controller/Entities/InternalItemsQuery.cs
+++ b/MediaBrowser.Controller/Entities/InternalItemsQuery.cs
@@ -48,7 +48,8 @@ namespace MediaBrowser.Controller.Entities
public string PresentationUniqueKey { get; set; }
public string Path { get; set; }
-
+ public string Name { get; set; }
+
public string Person { get; set; }
public string[] PersonIds { get; set; }
public string[] ItemIds { get; set; }
@@ -107,6 +108,7 @@ namespace MediaBrowser.Controller.Entities
internal List ItemIdsFromPersonFilters { get; set; }
public int? ParentIndexNumber { get; set; }
+ public int? IndexNumber { get; set; }
public int? MinParentalRating { get; set; }
public int? MaxParentalRating { get; set; }
diff --git a/MediaBrowser.Controller/Library/ILibraryManager.cs b/MediaBrowser.Controller/Library/ILibraryManager.cs
index 5388b8668..07ba41b3d 100644
--- a/MediaBrowser.Controller/Library/ILibraryManager.cs
+++ b/MediaBrowser.Controller/Library/ILibraryManager.cs
@@ -569,5 +569,8 @@ namespace MediaBrowser.Controller.Library
/// The parent.
/// true if XXXX, false otherwise.
bool IgnoreFile(FileSystemMetadata file, BaseItem parent);
+
+ void AddVirtualFolder(string name, string collectionType, string[] mediaPaths, bool refreshLibrary);
+ void AddMediaPath(string virtualFolderName, string path);
}
}
\ No newline at end of file
diff --git a/MediaBrowser.Providers/Folders/DefaultImageProvider.cs b/MediaBrowser.Providers/Folders/DefaultImageProvider.cs
index afd8c583d..08b4f6461 100644
--- a/MediaBrowser.Providers/Folders/DefaultImageProvider.cs
+++ b/MediaBrowser.Providers/Folders/DefaultImageProvider.cs
@@ -117,7 +117,7 @@ namespace MediaBrowser.Providers.Folders
}
if (string.IsNullOrWhiteSpace(viewType))
{
- return urlPrefix + "generic.jpg";
+ //return urlPrefix + "generic.jpg";
}
return null;
diff --git a/MediaBrowser.Server.Implementations/Library/LibraryManager.cs b/MediaBrowser.Server.Implementations/Library/LibraryManager.cs
index 87fdc56b3..f6e2ddb8e 100644
--- a/MediaBrowser.Server.Implementations/Library/LibraryManager.cs
+++ b/MediaBrowser.Server.Implementations/Library/LibraryManager.cs
@@ -952,10 +952,15 @@ namespace MediaBrowser.Server.Implementations.Library
if (isArtist)
{
- var existing = RootFolder
- .GetRecursiveChildren(i => i is T && NameExtensions.AreEqual(i.Name, name))
- .Cast()
- .FirstOrDefault();
+ var existing = GetItemList(new InternalItemsQuery
+ {
+ IncludeItemTypes = new[] { typeof(T).Name },
+ Name = name
+
+ }).Cast()
+ .Where(i => !i.IsAccessedByName)
+ .Cast()
+ .FirstOrDefault();
if (existing != null)
{
@@ -2558,5 +2563,107 @@ namespace MediaBrowser.Server.Implementations.Library
throw new InvalidOperationException();
}
+
+ public void AddVirtualFolder(string name, string collectionType, string[] mediaPaths, bool refreshLibrary)
+ {
+ if (string.IsNullOrWhiteSpace(name))
+ {
+ throw new ArgumentNullException("name");
+ }
+
+ name = _fileSystem.GetValidFilename(name);
+
+ var rootFolderPath = ConfigurationManager.ApplicationPaths.DefaultUserViewsPath;
+
+ var virtualFolderPath = Path.Combine(rootFolderPath, name);
+ while (_fileSystem.DirectoryExists(virtualFolderPath))
+ {
+ name += "1";
+ virtualFolderPath = Path.Combine(rootFolderPath, name);
+ }
+
+ if (mediaPaths != null)
+ {
+ var invalidpath = mediaPaths.FirstOrDefault(i => !_fileSystem.DirectoryExists(i));
+ if (invalidpath != null)
+ {
+ throw new ArgumentException("The specified path does not exist: " + invalidpath + ".");
+ }
+ }
+
+ _libraryMonitorFactory().Stop();
+
+ try
+ {
+ _fileSystem.CreateDirectory(virtualFolderPath);
+
+ if (!string.IsNullOrEmpty(collectionType))
+ {
+ var path = Path.Combine(virtualFolderPath, collectionType + ".collection");
+
+ using (File.Create(path))
+ {
+
+ }
+ }
+
+ if (mediaPaths != null)
+ {
+ foreach (var path in mediaPaths)
+ {
+ AddMediaPath(name, path);
+ }
+ }
+ }
+ finally
+ {
+ Task.Run(() =>
+ {
+ // No need to start if scanning the library because it will handle it
+ if (refreshLibrary)
+ {
+ ValidateMediaLibrary(new Progress(), CancellationToken.None);
+ }
+ else
+ {
+ // Need to add a delay here or directory watchers may still pick up the changes
+ var task = Task.Delay(1000);
+ // Have to block here to allow exceptions to bubble
+ Task.WaitAll(task);
+
+ _libraryMonitorFactory().Start();
+ }
+ });
+ }
+ }
+
+ private const string ShortcutFileExtension = ".mblink";
+ public void AddMediaPath(string virtualFolderName, string path)
+ {
+ if (string.IsNullOrWhiteSpace(path))
+ {
+ throw new ArgumentNullException("path");
+ }
+
+ if (!_fileSystem.DirectoryExists(path))
+ {
+ throw new DirectoryNotFoundException("The path does not exist.");
+ }
+
+ var rootFolderPath = ConfigurationManager.ApplicationPaths.DefaultUserViewsPath;
+ var virtualFolderPath = Path.Combine(rootFolderPath, virtualFolderName);
+
+ var shortcutFilename = _fileSystem.GetFileNameWithoutExtension(path);
+
+ var lnk = Path.Combine(virtualFolderPath, shortcutFilename + ShortcutFileExtension);
+
+ while (_fileSystem.FileExists(lnk))
+ {
+ shortcutFilename += "1";
+ lnk = Path.Combine(virtualFolderPath, shortcutFilename + ShortcutFileExtension);
+ }
+
+ _fileSystem.CreateShortcut(lnk, path);
+ }
}
}
\ No newline at end of file
diff --git a/MediaBrowser.Server.Implementations/Persistence/SqliteItemRepository.cs b/MediaBrowser.Server.Implementations/Persistence/SqliteItemRepository.cs
index e26a56ec0..291ef7375 100644
--- a/MediaBrowser.Server.Implementations/Persistence/SqliteItemRepository.cs
+++ b/MediaBrowser.Server.Implementations/Persistence/SqliteItemRepository.cs
@@ -1966,9 +1966,14 @@ namespace MediaBrowser.Server.Implementations.Persistence
// cmd.Parameters.Add(cmd, "@MaxPlayers", DbType.Int32).Value = query.MaxPlayers.Value;
//}
+ if (query.IndexNumber.HasValue)
+ {
+ whereClauses.Add("IndexNumber=@IndexNumber");
+ cmd.Parameters.Add(cmd, "@IndexNumber", DbType.Int32).Value = query.IndexNumber.Value;
+ }
if (query.ParentIndexNumber.HasValue)
{
- whereClauses.Add("ParentIndexNumber=@MinEndDate");
+ whereClauses.Add("ParentIndexNumber=@ParentIndexNumber");
cmd.Parameters.Add(cmd, "@ParentIndexNumber", DbType.Int32).Value = query.ParentIndexNumber.Value;
}
if (query.MinEndDate.HasValue)
@@ -2065,6 +2070,19 @@ namespace MediaBrowser.Server.Implementations.Persistence
cmd.Parameters.Add(cmd, "@PersonName", DbType.String).Value = query.Person;
}
+ if (!string.IsNullOrWhiteSpace(query.Name))
+ {
+ if (_config.Configuration.SchemaVersion >= 66)
+ {
+ whereClauses.Add("CleanName=@Name");
+ }
+ else
+ {
+ whereClauses.Add("Name=@Name");
+ }
+ cmd.Parameters.Add(cmd, "@Name", DbType.String).Value = query.Name;
+ }
+
if (!string.IsNullOrWhiteSpace(query.NameContains))
{
if (_config.Configuration.SchemaVersion >= 66)
diff --git a/MediaBrowser.Server.Implementations/UserViews/DynamicImageProvider.cs b/MediaBrowser.Server.Implementations/UserViews/DynamicImageProvider.cs
index 911dbb0cb..161f771a9 100644
--- a/MediaBrowser.Server.Implementations/UserViews/DynamicImageProvider.cs
+++ b/MediaBrowser.Server.Implementations/UserViews/DynamicImageProvider.cs
@@ -153,7 +153,8 @@ namespace MediaBrowser.Server.Implementations.UserViews
CollectionType.HomeVideos,
CollectionType.BoxSets,
CollectionType.Playlists,
- CollectionType.Photos
+ CollectionType.Photos,
+ string.Empty
};
return collectionStripViewTypes.Contains(view.ViewType ?? string.Empty);