2013-11-04 16:26:49 +00:00
using MediaBrowser.Common.IO ;
2013-10-31 14:03:23 +00:00
using MediaBrowser.Controller ;
2013-08-13 14:41:45 +00:00
using MediaBrowser.Controller.IO ;
2013-02-27 20:25:45 +00:00
using MediaBrowser.Controller.Library ;
2013-02-25 03:56:00 +00:00
using MediaBrowser.Model.Entities ;
2013-11-04 16:20:44 +00:00
using MediaBrowser.Model.Logging ;
2013-12-07 15:52:38 +00:00
using ServiceStack ;
2013-02-25 03:56:00 +00:00
using System ;
using System.Collections.Generic ;
2013-11-04 16:26:49 +00:00
using System.IO ;
2013-02-25 03:56:00 +00:00
using System.Linq ;
2013-08-13 14:41:45 +00:00
using System.Threading ;
2013-09-14 21:18:57 +00:00
using System.Threading.Tasks ;
2013-02-25 03:56:00 +00:00
namespace MediaBrowser.Api.Library
{
/// <summary>
/// Class GetDefaultVirtualFolders
/// </summary>
[Route("/Library/VirtualFolders", "GET")]
[Route("/Users/{UserId}/VirtualFolders", "GET")]
public class GetVirtualFolders : IReturn < List < VirtualFolderInfo > >
{
/// <summary>
/// Gets or sets the user id.
/// </summary>
/// <value>The user id.</value>
public string UserId { get ; set ; }
}
2013-12-29 14:54:11 +00:00
[Route("/Library/VirtualFolders", "POST")]
[Route("/Users/{UserId}/VirtualFolders", "POST")]
2013-02-25 03:56:00 +00:00
public class AddVirtualFolder : IReturnVoid
{
/// <summary>
/// Gets or sets the user id.
/// </summary>
/// <value>The user id.</value>
public string UserId { get ; set ; }
2013-09-14 21:18:57 +00:00
2013-02-25 03:56:00 +00:00
/// <summary>
/// Gets or sets the name.
/// </summary>
/// <value>The name.</value>
public string Name { get ; set ; }
2013-07-12 19:56:40 +00:00
/// <summary>
/// Gets or sets the type of the collection.
/// </summary>
/// <value>The type of the collection.</value>
public string CollectionType { get ; set ; }
2013-09-05 17:05:39 +00:00
/// <summary>
/// Gets or sets a value indicating whether [refresh library].
/// </summary>
/// <value><c>true</c> if [refresh library]; otherwise, <c>false</c>.</value>
public bool RefreshLibrary { get ; set ; }
2013-02-25 03:56:00 +00:00
}
2013-12-29 14:54:11 +00:00
[Route("/Library/VirtualFolders", "DELETE")]
[Route("/Users/{UserId}/VirtualFolders", "DELETE")]
2013-02-25 03:56:00 +00:00
public class RemoveVirtualFolder : IReturnVoid
{
/// <summary>
/// Gets or sets the user id.
/// </summary>
/// <value>The user id.</value>
public string UserId { get ; set ; }
/// <summary>
/// Gets or sets the name.
/// </summary>
/// <value>The name.</value>
public string Name { get ; set ; }
2013-09-05 17:05:39 +00:00
/// <summary>
/// Gets or sets a value indicating whether [refresh library].
/// </summary>
/// <value><c>true</c> if [refresh library]; otherwise, <c>false</c>.</value>
public bool RefreshLibrary { get ; set ; }
2013-02-25 03:56:00 +00:00
}
2013-12-29 14:54:11 +00:00
[Route("/Library/VirtualFolders/Name", "POST")]
[Route("/Users/{UserId}/VirtualFolders/Name", "POST")]
2013-02-25 03:56:00 +00:00
public class RenameVirtualFolder : IReturnVoid
{
/// <summary>
/// Gets or sets the user id.
/// </summary>
/// <value>The user id.</value>
public string UserId { get ; set ; }
/// <summary>
/// Gets or sets the name.
/// </summary>
/// <value>The name.</value>
public string Name { get ; set ; }
/// <summary>
/// Gets or sets the name.
/// </summary>
/// <value>The name.</value>
public string NewName { get ; set ; }
2013-09-05 17:05:39 +00:00
/// <summary>
/// Gets or sets a value indicating whether [refresh library].
/// </summary>
/// <value><c>true</c> if [refresh library]; otherwise, <c>false</c>.</value>
public bool RefreshLibrary { get ; set ; }
2013-02-25 03:56:00 +00:00
}
2013-12-29 14:54:11 +00:00
[Route("/Library/VirtualFolders/Paths", "POST")]
[Route("/Users/{UserId}/VirtualFolders/Paths", "POST")]
2013-02-25 03:56:00 +00:00
public class AddMediaPath : IReturnVoid
{
/// <summary>
/// Gets or sets the user id.
/// </summary>
/// <value>The user id.</value>
public string UserId { get ; set ; }
/// <summary>
/// Gets or sets the name.
/// </summary>
/// <value>The name.</value>
public string Name { get ; set ; }
/// <summary>
/// Gets or sets the name.
/// </summary>
/// <value>The name.</value>
public string Path { get ; set ; }
2013-09-05 17:05:39 +00:00
/// <summary>
/// Gets or sets a value indicating whether [refresh library].
/// </summary>
/// <value><c>true</c> if [refresh library]; otherwise, <c>false</c>.</value>
public bool RefreshLibrary { get ; set ; }
2013-02-25 03:56:00 +00:00
}
2013-09-14 21:18:57 +00:00
2013-12-29 14:54:11 +00:00
[Route("/Library/VirtualFolders/Paths", "DELETE")]
[Route("/Users/{UserId}/VirtualFolders/Paths", "DELETE")]
2013-02-25 03:56:00 +00:00
public class RemoveMediaPath : IReturnVoid
{
/// <summary>
/// Gets or sets the user id.
/// </summary>
/// <value>The user id.</value>
public string UserId { get ; set ; }
/// <summary>
/// Gets or sets the name.
/// </summary>
/// <value>The name.</value>
public string Name { get ; set ; }
/// <summary>
/// Gets or sets the name.
/// </summary>
/// <value>The name.</value>
public string Path { get ; set ; }
2013-09-05 17:05:39 +00:00
/// <summary>
/// Gets or sets a value indicating whether [refresh library].
/// </summary>
/// <value><c>true</c> if [refresh library]; otherwise, <c>false</c>.</value>
public bool RefreshLibrary { get ; set ; }
2013-02-25 03:56:00 +00:00
}
2014-02-11 04:55:01 +00:00
[Route("/Library/Changes/New", "POST")]
2014-01-28 21:51:47 +00:00
public class ReportChangedPath : IReturnVoid
{
/// <summary>
/// Gets or sets the name.
/// </summary>
/// <value>The name.</value>
2014-02-11 04:55:01 +00:00
[ApiMember(Name = "Path", Description = "The path that was changed.", IsRequired = true, DataType = "string", ParameterType = "query", Verb = "POST")]
2014-01-28 21:51:47 +00:00
public string Path { get ; set ; }
2014-02-11 04:55:01 +00:00
[ApiMember(Name = "ImageUrl", Description = "Optional thumbnail image url of the content.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "POST")]
public string ImageUrl { get ; set ; }
}
[Route("/Library/Episodes/New", "POST")]
public class ReportNewEpisode : IReturnVoid
{
/// <summary>
/// Gets or sets the name.
/// </summary>
/// <value>The name.</value>
[ApiMember(Name = "TvdbId", Description = "The tvdb id of the new episode.", IsRequired = true, DataType = "string", ParameterType = "query", Verb = "POST")]
public string TvdbId { get ; set ; }
[ApiMember(Name = "ImageUrl", Description = "Optional thumbnail image url of the content.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "POST")]
public string ImageUrl { get ; set ; }
2014-01-28 21:51:47 +00:00
}
2013-02-25 03:56:00 +00:00
/// <summary>
/// Class LibraryStructureService
/// </summary>
2013-03-16 05:52:33 +00:00
public class LibraryStructureService : BaseApiService
2013-02-25 03:56:00 +00:00
{
/// <summary>
/// The _app paths
/// </summary>
private readonly IServerApplicationPaths _appPaths ;
2013-02-27 20:25:45 +00:00
/// <summary>
/// The _user manager
/// </summary>
private readonly IUserManager _userManager ;
2013-02-28 19:32:41 +00:00
/// <summary>
/// The _library manager
/// </summary>
private readonly ILibraryManager _libraryManager ;
2013-04-10 15:32:09 +00:00
2014-01-28 21:25:10 +00:00
private readonly ILibraryMonitor _libraryMonitor ;
2013-09-14 21:18:57 +00:00
2013-10-30 14:40:14 +00:00
private readonly IFileSystem _fileSystem ;
2013-11-04 16:20:44 +00:00
private readonly ILogger _logger ;
2013-10-30 14:40:14 +00:00
2013-02-25 03:56:00 +00:00
/// <summary>
2013-04-10 15:32:09 +00:00
/// Initializes a new instance of the <see cref="LibraryStructureService"/> class.
2013-02-25 03:56:00 +00:00
/// </summary>
/// <param name="appPaths">The app paths.</param>
2013-02-27 20:25:45 +00:00
/// <param name="userManager">The user manager.</param>
2013-04-10 15:32:09 +00:00
/// <param name="libraryManager">The library manager.</param>
/// <exception cref="System.ArgumentNullException">appPaths</exception>
2014-01-28 21:25:10 +00:00
public LibraryStructureService ( IServerApplicationPaths appPaths , IUserManager userManager , ILibraryManager libraryManager , ILibraryMonitor libraryMonitor , IFileSystem fileSystem , ILogger logger )
2013-02-25 03:56:00 +00:00
{
if ( appPaths = = null )
{
throw new ArgumentNullException ( "appPaths" ) ;
}
2013-02-27 20:25:45 +00:00
_userManager = userManager ;
2013-02-25 03:56:00 +00:00
_appPaths = appPaths ;
2013-02-28 19:32:41 +00:00
_libraryManager = libraryManager ;
2014-01-28 21:25:10 +00:00
_libraryMonitor = libraryMonitor ;
2013-10-30 14:40:14 +00:00
_fileSystem = fileSystem ;
2013-11-04 16:20:44 +00:00
_logger = logger ;
2013-02-25 03:56:00 +00:00
}
2014-01-28 21:51:47 +00:00
/// <summary>
/// Posts the specified request.
/// </summary>
/// <param name="request">The request.</param>
/// <exception cref="System.ArgumentException">Please supply a Path</exception>
public void Post ( ReportChangedPath request )
{
if ( string . IsNullOrEmpty ( request . Path ) )
{
throw new ArgumentException ( "Please supply a Path" ) ;
}
_libraryMonitor . ReportFileSystemChanged ( request . Path ) ;
}
2013-02-25 03:56:00 +00:00
/// <summary>
/// Gets the specified request.
/// </summary>
/// <param name="request">The request.</param>
/// <returns>System.Object.</returns>
public object Get ( GetVirtualFolders request )
{
if ( string . IsNullOrEmpty ( request . UserId ) )
{
2013-04-17 16:46:52 +00:00
var result = _libraryManager . GetDefaultVirtualFolders ( ) . OrderBy ( i = > i . Name ) . ToList ( ) ;
2013-02-25 03:56:00 +00:00
2014-02-04 04:04:19 +00:00
return ToOptimizedSerializedResultUsingCache ( result ) ;
2013-02-25 03:56:00 +00:00
}
else
{
2013-02-27 20:25:45 +00:00
var user = _userManager . GetUserById ( new Guid ( request . UserId ) ) ;
2013-02-25 03:56:00 +00:00
2013-04-17 16:46:52 +00:00
var result = _libraryManager . GetVirtualFolders ( user ) . OrderBy ( i = > i . Name ) . ToList ( ) ;
2013-02-25 03:56:00 +00:00
2014-02-04 04:04:19 +00:00
return ToOptimizedSerializedResultUsingCache ( result ) ;
2013-02-25 03:56:00 +00:00
}
}
/// <summary>
/// Posts the specified request.
/// </summary>
/// <param name="request">The request.</param>
2013-09-14 21:18:57 +00:00
public void Post ( AddVirtualFolder request )
2013-02-25 03:56:00 +00:00
{
2013-12-29 14:54:11 +00:00
if ( string . IsNullOrWhiteSpace ( request . Name ) )
{
throw new ArgumentNullException ( "request" ) ;
}
2013-11-04 16:20:44 +00:00
var name = _fileSystem . GetValidFilename ( request . Name ) ;
string rootFolderPath ;
if ( string . IsNullOrEmpty ( request . UserId ) )
{
rootFolderPath = _appPaths . DefaultUserViewsPath ;
}
else
{
var user = _userManager . GetUserById ( new Guid ( request . UserId ) ) ;
rootFolderPath = user . RootFolderPath ;
}
var virtualFolderPath = Path . Combine ( rootFolderPath , name ) ;
if ( Directory . Exists ( virtualFolderPath ) )
{
throw new ArgumentException ( "There is already a media collection with the name " + name + "." ) ;
}
2014-01-28 21:25:10 +00:00
_libraryMonitor . Stop ( ) ;
2013-08-13 14:41:45 +00:00
try
2013-02-25 03:56:00 +00:00
{
2013-11-04 16:20:44 +00:00
Directory . CreateDirectory ( virtualFolderPath ) ;
if ( ! string . IsNullOrEmpty ( request . CollectionType ) )
2013-08-13 14:41:45 +00:00
{
2013-11-04 16:20:44 +00:00
var path = Path . Combine ( virtualFolderPath , request . CollectionType + ".collection" ) ;
2013-08-13 14:41:45 +00:00
2013-11-04 16:20:44 +00:00
File . Create ( path ) ;
2013-08-13 14:41:45 +00:00
}
2013-09-05 17:05:39 +00:00
// Need to add a delay here or directory watchers may still pick up the changes
2013-09-14 21:18:57 +00:00
var task = Task . Delay ( 1000 ) ;
// Have to block here to allow exceptions to bubble
Task . WaitAll ( task ) ;
2013-02-25 03:56:00 +00:00
}
2013-08-13 14:41:45 +00:00
finally
2013-02-25 03:56:00 +00:00
{
2013-11-27 02:38:11 +00:00
// No need to start if scanning the library because it will handle it
if ( ! request . RefreshLibrary )
{
2014-01-28 21:25:10 +00:00
_libraryMonitor . Start ( ) ;
2013-11-27 02:38:11 +00:00
}
2013-02-25 03:56:00 +00:00
}
2013-05-21 06:02:00 +00:00
2013-09-05 17:05:39 +00:00
if ( request . RefreshLibrary )
{
_libraryManager . ValidateMediaLibrary ( new Progress < double > ( ) , CancellationToken . None ) ;
}
2013-02-25 03:56:00 +00:00
}
/// <summary>
/// Posts the specified request.
/// </summary>
/// <param name="request">The request.</param>
2013-09-14 21:18:57 +00:00
public void Post ( RenameVirtualFolder request )
2013-02-25 03:56:00 +00:00
{
2013-12-29 14:54:11 +00:00
if ( string . IsNullOrWhiteSpace ( request . Name ) )
{
throw new ArgumentNullException ( "request" ) ;
}
if ( string . IsNullOrWhiteSpace ( request . NewName ) )
{
throw new ArgumentNullException ( "request" ) ;
}
2013-11-04 16:26:49 +00:00
string rootFolderPath ;
if ( string . IsNullOrEmpty ( request . UserId ) )
{
rootFolderPath = _appPaths . DefaultUserViewsPath ;
}
else
{
var user = _userManager . GetUserById ( new Guid ( request . UserId ) ) ;
rootFolderPath = user . RootFolderPath ;
}
var currentPath = Path . Combine ( rootFolderPath , request . Name ) ;
var newPath = Path . Combine ( rootFolderPath , request . NewName ) ;
if ( ! Directory . Exists ( currentPath ) )
{
throw new DirectoryNotFoundException ( "The media collection does not exist" ) ;
}
if ( ! string . Equals ( currentPath , newPath , StringComparison . OrdinalIgnoreCase ) & & Directory . Exists ( newPath ) )
{
throw new ArgumentException ( "There is already a media collection with the name " + newPath + "." ) ;
}
2014-01-28 21:25:10 +00:00
_libraryMonitor . Stop ( ) ;
2013-08-13 14:41:45 +00:00
try
2013-02-25 03:56:00 +00:00
{
2013-11-04 16:26:49 +00:00
// Only make a two-phase move when changing capitalization
if ( string . Equals ( currentPath , newPath , StringComparison . OrdinalIgnoreCase ) )
2013-08-13 14:41:45 +00:00
{
2013-11-04 16:26:49 +00:00
//Create an unique name
var temporaryName = Guid . NewGuid ( ) . ToString ( ) ;
var temporaryPath = Path . Combine ( rootFolderPath , temporaryName ) ;
Directory . Move ( currentPath , temporaryPath ) ;
currentPath = temporaryPath ;
2013-08-13 14:41:45 +00:00
}
2013-11-04 16:26:49 +00:00
Directory . Move ( currentPath , newPath ) ;
2013-09-05 17:05:39 +00:00
// Need to add a delay here or directory watchers may still pick up the changes
2013-09-14 21:18:57 +00:00
var task = Task . Delay ( 1000 ) ;
// Have to block here to allow exceptions to bubble
Task . WaitAll ( task ) ;
2013-02-25 03:56:00 +00:00
}
2013-08-13 14:41:45 +00:00
finally
2013-02-25 03:56:00 +00:00
{
2013-11-27 02:38:11 +00:00
// No need to start if scanning the library because it will handle it
if ( ! request . RefreshLibrary )
{
2014-01-28 21:25:10 +00:00
_libraryMonitor . Start ( ) ;
2013-11-27 02:38:11 +00:00
}
2013-02-25 03:56:00 +00:00
}
2013-05-21 06:02:00 +00:00
2013-09-05 17:05:39 +00:00
if ( request . RefreshLibrary )
{
_libraryManager . ValidateMediaLibrary ( new Progress < double > ( ) , CancellationToken . None ) ;
}
2013-02-25 03:56:00 +00:00
}
2013-09-14 21:18:57 +00:00
2013-02-25 03:56:00 +00:00
/// <summary>
/// Deletes the specified request.
/// </summary>
/// <param name="request">The request.</param>
2013-09-14 21:18:57 +00:00
public void Delete ( RemoveVirtualFolder request )
2013-02-25 03:56:00 +00:00
{
2013-12-29 14:54:11 +00:00
if ( string . IsNullOrWhiteSpace ( request . Name ) )
{
throw new ArgumentNullException ( "request" ) ;
}
2013-11-04 16:20:44 +00:00
string rootFolderPath ;
if ( string . IsNullOrEmpty ( request . UserId ) )
{
rootFolderPath = _appPaths . DefaultUserViewsPath ;
}
else
{
var user = _userManager . GetUserById ( new Guid ( request . UserId ) ) ;
rootFolderPath = user . RootFolderPath ;
}
var path = Path . Combine ( rootFolderPath , request . Name ) ;
if ( ! Directory . Exists ( path ) )
{
throw new DirectoryNotFoundException ( "The media folder does not exist" ) ;
}
2014-01-28 21:25:10 +00:00
_libraryMonitor . Stop ( ) ;
2013-08-13 14:41:45 +00:00
try
2013-02-25 03:56:00 +00:00
{
2013-11-04 16:20:44 +00:00
Directory . Delete ( path , true ) ;
2013-09-05 17:05:39 +00:00
// Need to add a delay here or directory watchers may still pick up the changes
2013-11-04 16:20:44 +00:00
var delayTask = Task . Delay ( 1000 ) ;
2013-09-14 21:18:57 +00:00
// Have to block here to allow exceptions to bubble
2013-11-04 16:20:44 +00:00
Task . WaitAll ( delayTask ) ;
2013-02-25 03:56:00 +00:00
}
2013-08-13 14:41:45 +00:00
finally
2013-02-25 03:56:00 +00:00
{
2013-11-27 02:38:11 +00:00
// No need to start if scanning the library because it will handle it
if ( ! request . RefreshLibrary )
{
2014-01-28 21:25:10 +00:00
_libraryMonitor . Start ( ) ;
2013-11-27 02:38:11 +00:00
}
2013-02-25 03:56:00 +00:00
}
2013-05-21 06:02:00 +00:00
2013-09-05 17:05:39 +00:00
if ( request . RefreshLibrary )
{
_libraryManager . ValidateMediaLibrary ( new Progress < double > ( ) , CancellationToken . None ) ;
}
2013-02-25 03:56:00 +00:00
}
/// <summary>
/// Posts the specified request.
/// </summary>
/// <param name="request">The request.</param>
2013-09-14 21:18:57 +00:00
public void Post ( AddMediaPath request )
2013-02-25 03:56:00 +00:00
{
2013-12-29 14:54:11 +00:00
if ( string . IsNullOrWhiteSpace ( request . Name ) )
{
throw new ArgumentNullException ( "request" ) ;
}
2014-01-28 21:25:10 +00:00
_libraryMonitor . Stop ( ) ;
2013-08-13 14:41:45 +00:00
try
2013-02-25 03:56:00 +00:00
{
2013-08-13 14:41:45 +00:00
if ( string . IsNullOrEmpty ( request . UserId ) )
{
2013-10-30 14:40:14 +00:00
LibraryHelpers . AddMediaPath ( _fileSystem , request . Name , request . Path , null , _appPaths ) ;
2013-08-13 14:41:45 +00:00
}
else
{
var user = _userManager . GetUserById ( new Guid ( request . UserId ) ) ;
2013-10-30 14:40:14 +00:00
LibraryHelpers . AddMediaPath ( _fileSystem , request . Name , request . Path , user , _appPaths ) ;
2013-08-13 14:41:45 +00:00
}
2013-09-05 17:05:39 +00:00
// Need to add a delay here or directory watchers may still pick up the changes
2013-09-14 21:18:57 +00:00
var task = Task . Delay ( 1000 ) ;
// Have to block here to allow exceptions to bubble
Task . WaitAll ( task ) ;
2013-02-25 03:56:00 +00:00
}
2013-08-13 14:41:45 +00:00
finally
2013-02-25 03:56:00 +00:00
{
2013-11-27 02:38:11 +00:00
// No need to start if scanning the library because it will handle it
if ( ! request . RefreshLibrary )
{
2014-01-28 21:25:10 +00:00
_libraryMonitor . Start ( ) ;
2013-11-27 02:38:11 +00:00
}
2013-02-25 03:56:00 +00:00
}
2013-05-21 06:02:00 +00:00
2013-09-05 17:05:39 +00:00
if ( request . RefreshLibrary )
{
_libraryManager . ValidateMediaLibrary ( new Progress < double > ( ) , CancellationToken . None ) ;
}
2013-02-25 03:56:00 +00:00
}
/// <summary>
/// Deletes the specified request.
/// </summary>
/// <param name="request">The request.</param>
2013-09-14 21:18:57 +00:00
public void Delete ( RemoveMediaPath request )
2013-02-25 03:56:00 +00:00
{
2013-12-29 14:54:11 +00:00
if ( string . IsNullOrWhiteSpace ( request . Name ) )
{
throw new ArgumentNullException ( "request" ) ;
}
2014-01-28 21:25:10 +00:00
_libraryMonitor . Stop ( ) ;
2013-08-13 14:41:45 +00:00
try
2013-02-25 03:56:00 +00:00
{
2013-08-13 14:41:45 +00:00
if ( string . IsNullOrEmpty ( request . UserId ) )
{
2013-10-30 14:40:14 +00:00
LibraryHelpers . RemoveMediaPath ( _fileSystem , request . Name , request . Path , null , _appPaths ) ;
2013-08-13 14:41:45 +00:00
}
else
{
var user = _userManager . GetUserById ( new Guid ( request . UserId ) ) ;
2013-10-30 14:40:14 +00:00
LibraryHelpers . RemoveMediaPath ( _fileSystem , request . Name , request . Path , user , _appPaths ) ;
2013-08-13 14:41:45 +00:00
}
2013-09-05 17:05:39 +00:00
// Need to add a delay here or directory watchers may still pick up the changes
2013-09-14 21:18:57 +00:00
var task = Task . Delay ( 1000 ) ;
// Have to block here to allow exceptions to bubble
Task . WaitAll ( task ) ;
2013-02-25 03:56:00 +00:00
}
2013-08-13 14:41:45 +00:00
finally
2013-02-25 03:56:00 +00:00
{
2013-11-27 02:38:11 +00:00
// No need to start if scanning the library because it will handle it
if ( ! request . RefreshLibrary )
{
2014-01-28 21:25:10 +00:00
_libraryMonitor . Start ( ) ;
2013-11-27 02:38:11 +00:00
}
2013-02-25 03:56:00 +00:00
}
2013-05-21 06:02:00 +00:00
2013-09-05 17:05:39 +00:00
if ( request . RefreshLibrary )
{
_libraryManager . ValidateMediaLibrary ( new Progress < double > ( ) , CancellationToken . None ) ;
}
2013-02-25 03:56:00 +00:00
}
}
}