2015-08-21 02:36:30 +00:00
using MediaBrowser.Api.Movies ;
using MediaBrowser.Api.Music ;
2014-02-21 05:04:11 +00:00
using MediaBrowser.Controller.Dto ;
using MediaBrowser.Controller.Entities ;
using MediaBrowser.Controller.Entities.Audio ;
using MediaBrowser.Controller.Entities.Movies ;
using MediaBrowser.Controller.Entities.TV ;
2013-02-21 01:33:05 +00:00
using MediaBrowser.Controller.Library ;
2015-08-03 02:12:52 +00:00
using MediaBrowser.Controller.LiveTv ;
2014-07-04 02:22:57 +00:00
using MediaBrowser.Controller.Net ;
2014-02-21 05:04:11 +00:00
using MediaBrowser.Controller.Persistence ;
2015-08-21 02:36:30 +00:00
using MediaBrowser.Controller.TV ;
2015-02-12 03:54:31 +00:00
using MediaBrowser.Model.Activity ;
2014-02-21 05:04:11 +00:00
using MediaBrowser.Model.Dto ;
using MediaBrowser.Model.Entities ;
using MediaBrowser.Model.Querying ;
2013-02-21 01:33:05 +00:00
using System ;
using System.Collections.Generic ;
2014-02-21 05:04:11 +00:00
using System.Globalization ;
using System.IO ;
2013-02-21 01:33:05 +00:00
using System.Linq ;
2014-02-21 05:04:11 +00:00
using System.Threading ;
using System.Threading.Tasks ;
2017-05-26 06:48:54 +00:00
2016-10-25 19:02:04 +00:00
using MediaBrowser.Model.IO ;
2016-08-31 21:07:02 +00:00
using MediaBrowser.Controller.Configuration ;
2016-10-25 19:02:04 +00:00
using MediaBrowser.Controller.IO ;
2016-10-24 02:45:23 +00:00
using MediaBrowser.Model.Globalization ;
2016-10-25 19:02:04 +00:00
using MediaBrowser.Model.Services ;
2017-06-11 20:40:25 +00:00
using MediaBrowser.Common.Extensions ;
2017-06-23 16:04:45 +00:00
using MediaBrowser.Common.Progress ;
2017-08-09 19:56:38 +00:00
using MediaBrowser.Model.Extensions ;
2013-02-21 01:33:05 +00:00
2013-02-25 03:56:00 +00:00
namespace MediaBrowser.Api.Library
2013-02-21 01:33:05 +00:00
{
2014-11-15 02:31:03 +00:00
[Route("/Items/{Id}/File", "GET", Summary = "Gets the original file of an item")]
[Authenticated]
2014-02-21 05:04:11 +00:00
public class GetFile
{
/// <summary>
/// Gets or sets the id.
/// </summary>
/// <value>The id.</value>
[ApiMember(Name = "Id", Description = "Item Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "GET")]
public string Id { get ; set ; }
}
/// <summary>
/// Class GetCriticReviews
/// </summary>
2014-11-15 02:31:03 +00:00
[Route("/Items/{Id}/CriticReviews", "GET", Summary = "Gets critic reviews for an item")]
[Authenticated]
2014-02-21 05:04:11 +00:00
public class GetCriticReviews : IReturn < QueryResult < ItemReview > >
{
/// <summary>
/// Gets or sets the id.
/// </summary>
/// <value>The id.</value>
[ApiMember(Name = "Id", Description = "Item Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "GET")]
public string Id { get ; set ; }
/// <summary>
/// Skips over a given number of items within the results. Use for paging.
/// </summary>
/// <value>The start index.</value>
[ApiMember(Name = "StartIndex", Description = "Optional. The record index to start at. All items with a lower index will be dropped from the results.", IsRequired = false, DataType = "int", ParameterType = "query", Verb = "GET")]
public int? StartIndex { get ; set ; }
/// <summary>
/// The maximum number of items to return
/// </summary>
/// <value>The limit.</value>
[ApiMember(Name = "Limit", Description = "Optional. The maximum number of records to return", IsRequired = false, DataType = "int", ParameterType = "query", Verb = "GET")]
public int? Limit { get ; set ; }
}
/// <summary>
/// Class GetThemeSongs
/// </summary>
2014-11-15 02:31:03 +00:00
[Route("/Items/{Id}/ThemeSongs", "GET", Summary = "Gets theme songs for an item")]
[Authenticated]
2014-02-21 05:04:11 +00:00
public class GetThemeSongs : IReturn < ThemeMediaResult >
{
/// <summary>
/// Gets or sets the user id.
/// </summary>
/// <value>The user id.</value>
[ApiMember(Name = "UserId", Description = "Optional. Filter by user id, and attach user data", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
2015-05-29 23:51:33 +00:00
public string UserId { get ; set ; }
2014-02-21 05:04:11 +00:00
/// <summary>
/// Gets or sets the id.
/// </summary>
/// <value>The id.</value>
[ApiMember(Name = "Id", Description = "Item Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "GET")]
public string Id { get ; set ; }
[ApiMember(Name = "InheritFromParent", Description = "Determines whether or not parent items should be searched for theme media.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
public bool InheritFromParent { get ; set ; }
}
/// <summary>
/// Class GetThemeVideos
/// </summary>
2014-11-15 02:31:03 +00:00
[Route("/Items/{Id}/ThemeVideos", "GET", Summary = "Gets theme videos for an item")]
[Authenticated]
2014-02-21 05:04:11 +00:00
public class GetThemeVideos : IReturn < ThemeMediaResult >
{
/// <summary>
/// Gets or sets the user id.
/// </summary>
/// <value>The user id.</value>
[ApiMember(Name = "UserId", Description = "Optional. Filter by user id, and attach user data", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
2015-05-29 23:51:33 +00:00
public string UserId { get ; set ; }
2014-02-21 05:04:11 +00:00
/// <summary>
/// Gets or sets the id.
/// </summary>
/// <value>The id.</value>
[ApiMember(Name = "Id", Description = "Item Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "GET")]
public string Id { get ; set ; }
[ApiMember(Name = "InheritFromParent", Description = "Determines whether or not parent items should be searched for theme media.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
public bool InheritFromParent { get ; set ; }
}
/// <summary>
/// Class GetThemeVideos
/// </summary>
2014-11-15 02:31:03 +00:00
[Route("/Items/{Id}/ThemeMedia", "GET", Summary = "Gets theme videos and songs for an item")]
[Authenticated]
2014-02-21 05:04:11 +00:00
public class GetThemeMedia : IReturn < AllThemeMediaResult >
{
/// <summary>
/// Gets or sets the user id.
/// </summary>
/// <value>The user id.</value>
[ApiMember(Name = "UserId", Description = "Optional. Filter by user id, and attach user data", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
2015-05-29 23:51:33 +00:00
public string UserId { get ; set ; }
2014-02-21 05:04:11 +00:00
/// <summary>
/// Gets or sets the id.
/// </summary>
/// <value>The id.</value>
[ApiMember(Name = "Id", Description = "Item Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "GET")]
public string Id { get ; set ; }
[ApiMember(Name = "InheritFromParent", Description = "Determines whether or not parent items should be searched for theme media.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
public bool InheritFromParent { get ; set ; }
}
2014-11-15 02:31:03 +00:00
[Route("/Library/Refresh", "POST", Summary = "Starts a library scan")]
[Authenticated(Roles = "Admin")]
2014-02-21 05:04:11 +00:00
public class RefreshLibrary : IReturnVoid
{
}
2014-11-15 02:31:03 +00:00
[Route("/Items/{Id}", "DELETE", Summary = "Deletes an item from the library and file system")]
2014-11-19 02:45:12 +00:00
[Authenticated]
2014-02-21 05:04:11 +00:00
public class DeleteItem : IReturnVoid
{
[ApiMember(Name = "Id", Description = "Item Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "DELETE")]
public string Id { get ; set ; }
}
2016-01-19 19:03:46 +00:00
[Route("/Items", "DELETE", Summary = "Deletes an item from the library and file system")]
[Authenticated]
public class DeleteItems : IReturnVoid
{
[ApiMember(Name = "Ids", Description = "Ids", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "DELETE")]
public string Ids { get ; set ; }
}
2014-02-21 05:04:11 +00:00
[Route("/Items/Counts", "GET")]
2014-11-15 02:31:03 +00:00
[Authenticated]
2014-02-21 05:04:11 +00:00
public class GetItemCounts : IReturn < ItemCounts >
{
[ApiMember(Name = "UserId", Description = "Optional. Get counts from a specific user's library.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
2015-05-29 23:51:33 +00:00
public string UserId { get ; set ; }
2014-02-21 05:04:11 +00:00
[ApiMember(Name = "IsFavorite", Description = "Optional. Get counts of favorite items", IsRequired = false, DataType = "bool", ParameterType = "query", Verb = "GET")]
public bool? IsFavorite { get ; set ; }
}
2014-11-15 02:31:03 +00:00
[Route("/Items/{Id}/Ancestors", "GET", Summary = "Gets all parents of an item")]
[Authenticated]
2014-02-21 05:04:11 +00:00
public class GetAncestors : IReturn < BaseItemDto [ ] >
{
/// <summary>
/// Gets or sets the user id.
/// </summary>
/// <value>The user id.</value>
[ApiMember(Name = "UserId", Description = "Optional. Filter by user id, and attach user data", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
2015-05-29 23:51:33 +00:00
public string UserId { get ; set ; }
2014-02-21 05:04:11 +00:00
/// <summary>
/// Gets or sets the id.
/// </summary>
/// <value>The id.</value>
[ApiMember(Name = "Id", Description = "Item Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "GET")]
public string Id { get ; set ; }
}
2014-11-15 02:31:03 +00:00
[Route("/Items/YearIndex", "GET", Summary = "Gets a year index based on an item query.")]
[Authenticated]
2014-02-21 05:04:11 +00:00
public class GetYearIndex : IReturn < List < ItemIndex > >
{
/// <summary>
/// Gets or sets the user id.
/// </summary>
/// <value>The user id.</value>
[ApiMember(Name = "UserId", Description = "Optional. Filter by user id, and attach user data", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
2015-05-29 23:51:33 +00:00
public string UserId { get ; set ; }
2014-02-21 05:04:11 +00:00
[ApiMember(Name = "IncludeItemTypes", Description = "Optional. If specified, results will be filtered based on item type. This allows multiple, comma delimeted.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET", AllowMultiple = true)]
public string IncludeItemTypes { get ; set ; }
}
2013-02-21 01:33:05 +00:00
/// <summary>
/// Class GetPhyscialPaths
/// </summary>
2014-11-15 02:31:03 +00:00
[Route("/Library/PhysicalPaths", "GET", Summary = "Gets a list of physical paths from virtual folders")]
[Authenticated(Roles = "Admin")]
2013-02-21 01:33:05 +00:00
public class GetPhyscialPaths : IReturn < List < string > >
{
}
2014-11-15 02:31:03 +00:00
[Route("/Library/MediaFolders", "GET", Summary = "Gets all user media folders.")]
[Authenticated]
2017-08-19 19:43:35 +00:00
public class GetMediaFolders : IReturn < QueryResult < BaseItemDto > >
2014-02-21 05:04:11 +00:00
{
2014-07-01 04:26:50 +00:00
[ApiMember(Name = "IsHidden", Description = "Optional. Filter by folders that are marked hidden, or not.", IsRequired = false, DataType = "boolean", ParameterType = "query", Verb = "GET")]
public bool? IsHidden { get ; set ; }
2014-02-21 05:04:11 +00:00
}
2014-11-15 02:31:03 +00:00
[Route("/Library/Series/Added", "POST", Summary = "Reports that new episodes of a series have been added by an external source")]
[Route("/Library/Series/Updated", "POST", Summary = "Reports that new episodes of a series have been added by an external source")]
[Authenticated]
2014-04-27 03:42:05 +00:00
public class PostUpdatedSeries : IReturnVoid
{
2014-07-12 14:05:51 +00:00
[ApiMember(Name = "TvdbId", Description = "Tvdb Id", IsRequired = false, DataType = "string", ParameterType = "path", Verb = "GET")]
2014-04-27 03:42:05 +00:00
public string TvdbId { get ; set ; }
}
2015-09-02 15:33:20 +00:00
[Route("/Library/Movies/Added", "POST", Summary = "Reports that new movies have been added by an external source")]
[Route("/Library/Movies/Updated", "POST", Summary = "Reports that new movies have been added by an external source")]
[Authenticated]
public class PostUpdatedMovies : IReturnVoid
{
[ApiMember(Name = "TmdbId", Description = "Tmdb Id", IsRequired = false, DataType = "string", ParameterType = "path", Verb = "GET")]
public string TmdbId { get ; set ; }
[ApiMember(Name = "ImdbId", Description = "Imdb Id", IsRequired = false, DataType = "string", ParameterType = "path", Verb = "GET")]
public string ImdbId { get ; set ; }
}
2015-02-06 05:39:07 +00:00
[Route("/Items/{Id}/Download", "GET", Summary = "Downloads item media")]
[Authenticated(Roles = "download")]
public class GetDownload
{
/// <summary>
/// Gets or sets the id.
/// </summary>
/// <value>The id.</value>
[ApiMember(Name = "Id", Description = "Item Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "GET")]
public string Id { get ; set ; }
}
2015-08-21 03:21:27 +00:00
[Route("/Items/{Id}/Similar", "GET", Summary = "Gets similar items")]
[Authenticated]
2015-08-21 02:36:30 +00:00
public class GetSimilarItems : BaseGetSimilarItemsFromItem
{
}
2013-02-21 01:33:05 +00:00
/// <summary>
/// Class LibraryService
/// </summary>
2013-03-16 05:52:33 +00:00
public class LibraryService : BaseApiService
2013-02-21 01:33:05 +00:00
{
2013-02-24 21:53:54 +00:00
/// <summary>
2014-02-21 05:04:11 +00:00
/// The _item repo
2013-02-24 21:53:54 +00:00
/// </summary>
2014-02-21 05:04:11 +00:00
private readonly IItemRepository _itemRepo ;
2013-02-28 19:32:41 +00:00
private readonly ILibraryManager _libraryManager ;
2014-02-21 05:04:11 +00:00
private readonly IUserManager _userManager ;
private readonly IUserDataManager _userDataManager ;
private readonly IDtoService _dtoService ;
2014-11-19 02:45:12 +00:00
private readonly IAuthorizationContext _authContext ;
2015-02-12 03:54:31 +00:00
private readonly IActivityManager _activityManager ;
private readonly ILocalizationManager _localization ;
2015-08-03 02:12:52 +00:00
private readonly ILiveTvManager _liveTv ;
2015-08-21 02:36:30 +00:00
private readonly ITVSeriesManager _tvManager ;
2015-08-28 19:10:44 +00:00
private readonly ILibraryMonitor _libraryMonitor ;
2015-09-13 23:07:54 +00:00
private readonly IFileSystem _fileSystem ;
2016-08-31 21:07:02 +00:00
private readonly IServerConfigurationManager _config ;
2013-02-24 21:53:54 +00:00
/// <summary>
/// Initializes a new instance of the <see cref="LibraryService" /> class.
/// </summary>
2014-02-21 05:04:11 +00:00
public LibraryService ( IItemRepository itemRepo , ILibraryManager libraryManager , IUserManager userManager ,
2016-08-31 21:07:02 +00:00
IDtoService dtoService , IUserDataManager userDataManager , IAuthorizationContext authContext , IActivityManager activityManager , ILocalizationManager localization , ILiveTvManager liveTv , ITVSeriesManager tvManager , ILibraryMonitor libraryMonitor , IFileSystem fileSystem , IServerConfigurationManager config )
2013-02-24 21:53:54 +00:00
{
2014-02-21 05:04:11 +00:00
_itemRepo = itemRepo ;
_libraryManager = libraryManager ;
_userManager = userManager ;
_dtoService = dtoService ;
_userDataManager = userDataManager ;
2014-11-19 02:45:12 +00:00
_authContext = authContext ;
2015-02-12 03:54:31 +00:00
_activityManager = activityManager ;
_localization = localization ;
2015-08-05 03:43:54 +00:00
_liveTv = liveTv ;
2015-08-21 02:36:30 +00:00
_tvManager = tvManager ;
2015-09-02 15:35:47 +00:00
_libraryMonitor = libraryMonitor ;
2015-09-13 23:07:54 +00:00
_fileSystem = fileSystem ;
2016-08-31 21:07:02 +00:00
_config = config ;
2015-08-21 02:36:30 +00:00
}
public object Get ( GetSimilarItems request )
{
var user = ! string . IsNullOrWhiteSpace ( request . UserId ) ? _userManager . GetUserById ( request . UserId ) : null ;
var item = string . IsNullOrEmpty ( request . Id ) ?
( ! string . IsNullOrWhiteSpace ( request . UserId ) ? user . RootFolder :
_libraryManager . RootFolder ) : _libraryManager . GetItemById ( request . Id ) ;
if ( item is Game )
{
2016-11-10 14:41:24 +00:00
return new GamesService ( _userManager , _userDataManager , _libraryManager , _itemRepo , _dtoService , _authContext )
2015-08-21 02:36:30 +00:00
{
Request = Request ,
} . Get ( new GetSimilarGames
{
Fields = request . Fields ,
Id = request . Id ,
Limit = request . Limit ,
UserId = request . UserId
} ) ;
}
if ( item is MusicAlbum )
{
2016-11-10 14:41:24 +00:00
return new AlbumsService ( _userManager , _userDataManager , _libraryManager , _itemRepo , _dtoService , _authContext )
2015-08-21 02:36:30 +00:00
{
Request = Request ,
} . Get ( new GetSimilarAlbums
{
Fields = request . Fields ,
Id = request . Id ,
Limit = request . Limit ,
2016-07-22 17:54:43 +00:00
UserId = request . UserId ,
2016-07-22 22:10:39 +00:00
ExcludeArtistIds = request . ExcludeArtistIds
2015-08-21 02:36:30 +00:00
} ) ;
}
if ( item is MusicArtist )
{
2016-11-10 14:41:24 +00:00
return new AlbumsService ( _userManager , _userDataManager , _libraryManager , _itemRepo , _dtoService , _authContext )
2015-08-21 02:36:30 +00:00
{
Request = Request ,
} . Get ( new GetSimilarArtists
{
Fields = request . Fields ,
Id = request . Id ,
Limit = request . Limit ,
UserId = request . UserId
} ) ;
}
var program = item as IHasProgramAttributes ;
2016-03-19 15:38:05 +00:00
if ( item is Movie | | ( program ! = null & & program . IsMovie ) | | item is Trailer )
2015-08-21 02:36:30 +00:00
{
2016-11-21 08:54:53 +00:00
return new MoviesService ( _userManager , _libraryManager , _dtoService , _config , _authContext )
2015-08-21 02:36:30 +00:00
{
Request = Request ,
} . Get ( new GetSimilarMovies
{
Fields = request . Fields ,
Id = request . Id ,
Limit = request . Limit ,
UserId = request . UserId
} ) ;
}
2016-03-25 03:53:42 +00:00
if ( item is Series | | ( program ! = null & & program . IsSeries ) )
2015-08-21 02:36:30 +00:00
{
2016-11-10 14:41:24 +00:00
return new TvShowsService ( _userManager , _userDataManager , _libraryManager , _itemRepo , _dtoService , _tvManager , _authContext )
2015-08-21 02:36:30 +00:00
{
Request = Request ,
} . Get ( new GetSimilarShows
{
Fields = request . Fields ,
Id = request . Id ,
Limit = request . Limit ,
UserId = request . UserId
} ) ;
}
2017-08-19 19:43:35 +00:00
return new QueryResult < BaseItemDto > ( ) ;
2014-02-21 05:04:11 +00:00
}
public object Get ( GetMediaFolders request )
{
2015-11-03 04:34:47 +00:00
var items = _libraryManager . GetUserRootFolder ( ) . Children . Concat ( _libraryManager . RootFolder . VirtualChildren ) . OrderBy ( i = > i . SortName ) . ToList ( ) ;
2014-02-21 05:04:11 +00:00
2014-07-01 04:26:50 +00:00
if ( request . IsHidden . HasValue )
{
var val = request . IsHidden . Value ;
items = items . Where ( i = > i . IsHidden = = val ) . ToList ( ) ;
}
2016-11-10 14:41:24 +00:00
var dtoOptions = GetDtoOptions ( _authContext , request ) ;
2015-02-06 05:39:07 +00:00
2017-08-19 19:43:35 +00:00
var result = new QueryResult < BaseItemDto >
2013-02-24 21:53:54 +00:00
{
2014-02-21 05:04:11 +00:00
TotalRecordCount = items . Count ,
2014-12-27 05:08:39 +00:00
Items = items . Select ( i = > _dtoService . GetBaseItemDto ( i , dtoOptions ) ) . ToArray ( )
2014-02-21 05:04:11 +00:00
} ;
return ToOptimizedResult ( result ) ;
}
2014-08-05 03:41:56 +00:00
public void Post ( PostUpdatedSeries request )
{
2016-03-20 06:46:51 +00:00
var series = _libraryManager . GetItemList ( new InternalItemsQuery
2015-08-28 19:10:44 +00:00
{
2017-05-21 07:25:49 +00:00
IncludeItemTypes = new [ ] { typeof ( Series ) . Name } ,
DtoOptions = new DtoOptions ( false )
{
EnableImages = false
}
2015-08-28 19:10:44 +00:00
2016-03-20 06:46:51 +00:00
} ) . Where ( i = > string . Equals ( request . TvdbId , i . GetProviderId ( MetadataProviders . Tvdb ) , StringComparison . OrdinalIgnoreCase ) ) . ToArray ( ) ;
2015-08-28 19:10:44 +00:00
if ( series . Length > 0 )
{
foreach ( var item in series )
{
_libraryMonitor . ReportFileSystemChanged ( item . Path ) ;
}
2015-09-02 15:33:20 +00:00
}
else
{
2017-06-23 16:04:45 +00:00
Task . Run ( ( ) = > _libraryManager . ValidateMediaLibrary ( new SimpleProgress < double > ( ) , CancellationToken . None ) ) ;
2015-09-02 15:33:20 +00:00
}
}
public void Post ( PostUpdatedMovies request )
{
2016-03-20 06:46:51 +00:00
var movies = _libraryManager . GetItemList ( new InternalItemsQuery
2015-09-02 15:33:20 +00:00
{
2017-05-21 07:25:49 +00:00
IncludeItemTypes = new [ ] { typeof ( Movie ) . Name } ,
DtoOptions = new DtoOptions ( false )
{
EnableImages = false
}
2015-09-02 15:33:20 +00:00
2017-08-09 19:56:38 +00:00
} ) ;
2015-09-02 15:33:20 +00:00
if ( ! string . IsNullOrWhiteSpace ( request . ImdbId ) )
{
2017-08-09 19:56:38 +00:00
movies = movies . Where ( i = > string . Equals ( request . ImdbId , i . GetProviderId ( MetadataProviders . Imdb ) , StringComparison . OrdinalIgnoreCase ) ) . ToList ( ) ;
2015-09-02 15:33:20 +00:00
}
else if ( ! string . IsNullOrWhiteSpace ( request . TmdbId ) )
{
2017-08-09 19:56:38 +00:00
movies = movies . Where ( i = > string . Equals ( request . TmdbId , i . GetProviderId ( MetadataProviders . Tmdb ) , StringComparison . OrdinalIgnoreCase ) ) . ToList ( ) ;
2015-09-02 15:33:20 +00:00
}
else
{
2017-08-09 19:56:38 +00:00
movies = new List < BaseItem > ( ) ;
2015-09-02 15:33:20 +00:00
}
2017-08-09 19:56:38 +00:00
if ( movies . Count > 0 )
2015-09-02 15:33:20 +00:00
{
foreach ( var item in movies )
{
_libraryMonitor . ReportFileSystemChanged ( item . Path ) ;
}
2015-08-28 19:10:44 +00:00
}
else
{
2017-06-23 16:04:45 +00:00
Task . Run ( ( ) = > _libraryManager . ValidateMediaLibrary ( new SimpleProgress < double > ( ) , CancellationToken . None ) ) ;
2015-08-28 19:10:44 +00:00
}
2014-08-05 03:41:56 +00:00
}
2016-06-19 06:18:29 +00:00
public Task < object > Get ( GetDownload request )
2015-02-06 05:39:07 +00:00
{
var item = _libraryManager . GetItemById ( request . Id ) ;
2015-02-12 03:54:31 +00:00
var auth = _authContext . GetAuthorizationInfo ( Request ) ;
2015-02-06 05:39:07 +00:00
2015-02-12 03:54:31 +00:00
var user = _userManager . GetUserById ( auth . UserId ) ;
if ( user ! = null )
{
if ( ! item . CanDownload ( user ) )
{
throw new ArgumentException ( "Item does not support downloading" ) ;
}
}
else
2015-02-06 05:39:07 +00:00
{
2015-02-12 03:54:31 +00:00
if ( ! item . CanDownload ( ) )
{
throw new ArgumentException ( "Item does not support downloading" ) ;
}
2015-02-06 05:39:07 +00:00
}
var headers = new Dictionary < string , string > ( ) ;
2015-02-12 03:54:31 +00:00
if ( user ! = null )
{
LogDownload ( item , user , auth ) ;
}
2017-09-01 19:24:39 +00:00
var path = item . Path ;
// Quotes are valid in linux. They'll possibly cause issues here
var filename = ( Path . GetFileName ( path ) ? ? string . Empty ) . Replace ( "\"" , string . Empty ) ;
if ( ! string . IsNullOrWhiteSpace ( filename ) )
{
headers [ "Content-Disposition" ] = "attachment; filename=\"" + filename + "\"" ;
}
2015-02-06 05:39:07 +00:00
return ResultFactory . GetStaticFileResult ( Request , new StaticFileResultOptions
{
2017-09-01 19:24:39 +00:00
Path = path ,
2015-02-06 05:39:07 +00:00
ResponseHeaders = headers
} ) ;
}
2017-08-27 00:32:33 +00:00
private void LogDownload ( BaseItem item , User user , AuthorizationInfo auth )
2015-02-12 03:54:31 +00:00
{
try
{
2017-08-27 00:32:33 +00:00
_activityManager . Create ( new ActivityLogEntry
2015-02-12 03:54:31 +00:00
{
Name = string . Format ( _localization . GetLocalizedString ( "UserDownloadingItemWithValues" ) , user . Name , item . Name ) ,
Type = "UserDownloadingContent" ,
ShortOverview = string . Format ( _localization . GetLocalizedString ( "AppDeviceValues" ) , auth . Client , auth . Device ) ,
UserId = auth . UserId
2017-08-27 00:32:33 +00:00
} ) ;
2015-02-12 03:54:31 +00:00
}
catch
{
// Logged at lower levels
}
}
2016-06-19 06:18:29 +00:00
public Task < object > Get ( GetFile request )
2014-02-21 05:04:11 +00:00
{
2014-04-25 20:15:50 +00:00
var item = _libraryManager . GetItemById ( request . Id ) ;
2014-02-21 05:04:11 +00:00
var locationType = item . LocationType ;
if ( locationType = = LocationType . Remote | | locationType = = LocationType . Virtual )
{
throw new ArgumentException ( "This command cannot be used for remote or virtual items." ) ;
}
2016-02-12 04:54:00 +00:00
if ( _fileSystem . DirectoryExists ( item . Path ) )
2014-02-21 05:04:11 +00:00
{
throw new ArgumentException ( "This command cannot be used for directories." ) ;
2013-02-24 21:53:54 +00:00
}
2016-06-19 06:18:29 +00:00
return ResultFactory . GetStaticFileResult ( Request , item . Path ) ;
2014-02-21 05:04:11 +00:00
}
2013-02-21 01:33:05 +00:00
/// <summary>
/// Gets the specified request.
/// </summary>
/// <param name="request">The request.</param>
/// <returns>System.Object.</returns>
public object Get ( GetPhyscialPaths request )
{
2013-12-20 16:51:25 +00:00
var result = _libraryManager . RootFolder . Children
2014-02-10 20:11:46 +00:00
. SelectMany ( c = > c . PhysicalLocations )
2013-12-20 16:51:25 +00:00
. ToList ( ) ;
2013-02-21 01:33:05 +00:00
2014-02-04 04:04:19 +00:00
return ToOptimizedSerializedResultUsingCache ( result ) ;
2013-02-21 01:33:05 +00:00
}
2014-02-21 05:04:11 +00:00
/// <summary>
/// Gets the specified request.
/// </summary>
/// <param name="request">The request.</param>
/// <returns>System.Object.</returns>
public object Get ( GetAncestors request )
{
var result = GetAncestors ( request ) ;
return ToOptimizedSerializedResultUsingCache ( result ) ;
}
/// <summary>
/// Gets the ancestors.
/// </summary>
/// <param name="request">The request.</param>
/// <returns>Task{BaseItemDto[]}.</returns>
public List < BaseItemDto > GetAncestors ( GetAncestors request )
{
2014-04-25 20:15:50 +00:00
var item = _libraryManager . GetItemById ( request . Id ) ;
2014-02-21 05:04:11 +00:00
var baseItemDtos = new List < BaseItemDto > ( ) ;
2015-05-29 23:51:33 +00:00
var user = ! string . IsNullOrWhiteSpace ( request . UserId ) ? _userManager . GetUserById ( request . UserId ) : null ;
2014-02-21 05:04:11 +00:00
2016-11-10 14:41:24 +00:00
var dtoOptions = GetDtoOptions ( _authContext , request ) ;
2014-02-21 05:04:11 +00:00
2015-11-11 14:56:31 +00:00
BaseItem parent = item . GetParent ( ) ;
2015-02-06 05:39:07 +00:00
2014-02-21 05:04:11 +00:00
while ( parent ! = null )
{
if ( user ! = null )
{
parent = TranslateParentItem ( parent , user ) ;
}
2014-12-27 05:08:39 +00:00
baseItemDtos . Add ( _dtoService . GetBaseItemDto ( parent , dtoOptions , user ) ) ;
2014-02-21 05:04:11 +00:00
2015-11-11 14:56:31 +00:00
parent = parent . GetParent ( ) ;
2014-02-21 05:04:11 +00:00
}
2017-08-19 19:43:35 +00:00
return baseItemDtos ;
2014-02-21 05:04:11 +00:00
}
private BaseItem TranslateParentItem ( BaseItem item , User user )
{
2015-11-11 14:56:31 +00:00
if ( item . GetParent ( ) is AggregateFolder )
2014-02-21 05:04:11 +00:00
{
return user . RootFolder . GetChildren ( user , true ) . FirstOrDefault ( i = > i . PhysicalLocations . Contains ( item . Path ) ) ;
}
return item ;
}
/// <summary>
/// Gets the specified request.
/// </summary>
/// <param name="request">The request.</param>
/// <returns>System.Object.</returns>
public object Get ( GetCriticReviews request )
{
var result = GetCriticReviews ( request ) ;
return ToOptimizedSerializedResultUsingCache ( result ) ;
}
/// <summary>
/// Gets the specified request.
/// </summary>
/// <param name="request">The request.</param>
/// <returns>System.Object.</returns>
public object Get ( GetItemCounts request )
{
2016-03-25 03:53:42 +00:00
var user = string . IsNullOrWhiteSpace ( request . UserId ) ? null : _userManager . GetUserById ( request . UserId ) ;
2014-02-21 05:04:11 +00:00
var counts = new ItemCounts
{
2016-03-25 03:53:42 +00:00
AlbumCount = GetCount ( typeof ( MusicAlbum ) , user , request ) ,
EpisodeCount = GetCount ( typeof ( Episode ) , user , request ) ,
GameCount = GetCount ( typeof ( Game ) , user , request ) ,
GameSystemCount = GetCount ( typeof ( GameSystem ) , user , request ) ,
MovieCount = GetCount ( typeof ( Movie ) , user , request ) ,
SeriesCount = GetCount ( typeof ( Series ) , user , request ) ,
SongCount = GetCount ( typeof ( Audio ) , user , request ) ,
MusicVideoCount = GetCount ( typeof ( MusicVideo ) , user , request ) ,
BoxSetCount = GetCount ( typeof ( BoxSet ) , user , request ) ,
BookCount = GetCount ( typeof ( Book ) , user , request )
2014-02-21 05:04:11 +00:00
} ;
return ToOptimizedSerializedResultUsingCache ( counts ) ;
}
2016-03-25 03:53:42 +00:00
private int GetCount ( Type type , User user , GetItemCounts request )
2015-11-10 18:58:05 +00:00
{
2016-03-25 03:53:42 +00:00
var query = new InternalItemsQuery ( user )
{
IncludeItemTypes = new [ ] { type . Name } ,
Limit = 0 ,
Recursive = true ,
2017-01-09 17:05:34 +00:00
IsVirtualItem = false ,
2017-05-21 07:25:49 +00:00
IsFavorite = request . IsFavorite ,
DtoOptions = new DtoOptions ( false )
{
EnableImages = false
}
2016-03-25 03:53:42 +00:00
} ;
2014-02-21 05:04:11 +00:00
2016-03-25 03:53:42 +00:00
return _libraryManager . GetItemsResult ( query ) . TotalRecordCount ;
2014-02-21 05:04:11 +00:00
}
/// <summary>
/// Posts the specified request.
/// </summary>
/// <param name="request">The request.</param>
2014-04-03 22:50:04 +00:00
public void Post ( RefreshLibrary request )
2014-02-21 05:04:11 +00:00
{
2016-11-27 00:40:15 +00:00
Task . Run ( ( ) = >
2014-02-21 05:04:11 +00:00
{
2016-11-27 00:40:15 +00:00
try
{
2017-06-23 16:04:45 +00:00
_libraryManager . ValidateMediaLibrary ( new SimpleProgress < double > ( ) , CancellationToken . None ) ;
2016-11-27 00:40:15 +00:00
}
catch ( Exception ex )
{
Logger . ErrorException ( "Error refreshing library" , ex ) ;
}
} ) ;
2014-02-21 05:04:11 +00:00
}
/// <summary>
/// Deletes the specified request.
/// </summary>
/// <param name="request">The request.</param>
2016-01-19 19:03:46 +00:00
public void Delete ( DeleteItems request )
2014-02-21 05:04:11 +00:00
{
2016-01-19 19:03:46 +00:00
var ids = string . IsNullOrWhiteSpace ( request . Ids )
? new string [ ] { }
: request . Ids . Split ( ',' ) ;
2014-11-19 02:45:12 +00:00
2016-01-19 19:03:46 +00:00
var tasks = ids . Select ( i = >
2014-11-19 02:45:12 +00:00
{
2016-01-19 19:03:46 +00:00
var item = _libraryManager . GetItemById ( i ) ;
var auth = _authContext . GetAuthorizationInfo ( Request ) ;
var user = _userManager . GetUserById ( auth . UserId ) ;
2014-11-19 02:45:12 +00:00
2016-01-19 19:03:46 +00:00
if ( ! item . CanDelete ( user ) )
{
if ( ids . Length > 1 )
{
throw new SecurityException ( "Unauthorized access" ) ;
}
return Task . FromResult ( true ) ;
}
2016-02-12 04:54:00 +00:00
return item . Delete ( new DeleteOptions
2016-01-19 19:03:46 +00:00
{
2016-02-12 04:54:00 +00:00
DeleteFileLocation = true
} ) ;
2017-08-09 19:56:38 +00:00
} ) . ToArray ( ids . Length ) ;
2016-01-19 19:03:46 +00:00
Task . WaitAll ( tasks ) ;
}
/// <summary>
/// Deletes the specified request.
/// </summary>
/// <param name="request">The request.</param>
public void Delete ( DeleteItem request )
{
Delete ( new DeleteItems
2015-08-03 02:12:52 +00:00
{
2016-01-19 19:03:46 +00:00
Ids = request . Id
} ) ;
2014-02-21 05:04:11 +00:00
}
/// <summary>
/// Gets the critic reviews async.
/// </summary>
/// <param name="request">The request.</param>
/// <returns>Task{ItemReviewsResult}.</returns>
private QueryResult < ItemReview > GetCriticReviews ( GetCriticReviews request )
{
var reviews = _itemRepo . GetCriticReviews ( new Guid ( request . Id ) ) ;
2017-08-09 19:56:38 +00:00
var reviewsArray = reviews . ToArray ( reviews . Count ) ;
2014-02-21 05:04:11 +00:00
var result = new QueryResult < ItemReview >
{
TotalRecordCount = reviewsArray . Length
} ;
if ( request . StartIndex . HasValue )
{
reviewsArray = reviewsArray . Skip ( request . StartIndex . Value ) . ToArray ( ) ;
}
if ( request . Limit . HasValue )
{
reviewsArray = reviewsArray . Take ( request . Limit . Value ) . ToArray ( ) ;
}
result . Items = reviewsArray ;
return result ;
}
public object Get ( GetThemeMedia request )
{
var themeSongs = GetThemeSongs ( new GetThemeSongs
{
InheritFromParent = request . InheritFromParent ,
Id = request . Id ,
UserId = request . UserId
} ) ;
var themeVideos = GetThemeVideos ( new GetThemeVideos
{
InheritFromParent = request . InheritFromParent ,
Id = request . Id ,
UserId = request . UserId
} ) ;
return ToOptimizedSerializedResultUsingCache ( new AllThemeMediaResult
{
ThemeSongsResult = themeSongs ,
ThemeVideosResult = themeVideos ,
2015-04-26 03:25:07 +00:00
SoundtrackSongsResult = new ThemeMediaResult ( )
2014-02-21 05:04:11 +00:00
} ) ;
}
/// <summary>
/// Gets the specified request.
/// </summary>
/// <param name="request">The request.</param>
/// <returns>System.Object.</returns>
public object Get ( GetThemeSongs request )
{
var result = GetThemeSongs ( request ) ;
return ToOptimizedSerializedResultUsingCache ( result ) ;
}
private ThemeMediaResult GetThemeSongs ( GetThemeSongs request )
{
2015-05-29 23:51:33 +00:00
var user = ! string . IsNullOrWhiteSpace ( request . UserId ) ? _userManager . GetUserById ( request . UserId ) : null ;
2014-02-21 05:04:11 +00:00
var item = string . IsNullOrEmpty ( request . Id )
2015-05-29 23:51:33 +00:00
? ( ! string . IsNullOrWhiteSpace ( request . UserId )
2014-02-21 05:04:11 +00:00
? user . RootFolder
: ( Folder ) _libraryManager . RootFolder )
2014-04-25 20:15:50 +00:00
: _libraryManager . GetItemById ( request . Id ) ;
2014-02-21 05:04:11 +00:00
2017-06-11 20:40:25 +00:00
if ( item = = null )
{
throw new ResourceNotFoundException ( "Item not found." ) ;
}
2017-08-09 19:56:38 +00:00
while ( item . ThemeSongIds . Length = = 0 & & request . InheritFromParent & & item . GetParent ( ) ! = null )
2014-02-21 05:04:11 +00:00
{
2015-11-11 14:56:31 +00:00
item = item . GetParent ( ) ;
2014-02-21 05:04:11 +00:00
}
2016-11-10 14:41:24 +00:00
var dtoOptions = GetDtoOptions ( _authContext , request ) ;
2014-12-27 05:08:39 +00:00
2016-10-09 07:18:43 +00:00
var dtos = item . ThemeSongIds . Select ( _libraryManager . GetItemById )
2016-07-08 18:11:13 +00:00
. Where ( i = > i ! = null )
2014-02-21 05:04:11 +00:00
. OrderBy ( i = > i . SortName )
2014-12-27 05:08:39 +00:00
. Select ( i = > _dtoService . GetBaseItemDto ( i , dtoOptions , user , item ) ) ;
2014-02-21 05:04:11 +00:00
var items = dtos . ToArray ( ) ;
return new ThemeMediaResult
{
Items = items ,
TotalRecordCount = items . Length ,
OwnerId = _dtoService . GetDtoId ( item )
} ;
}
/// <summary>
/// Gets the specified request.
/// </summary>
/// <param name="request">The request.</param>
/// <returns>System.Object.</returns>
public object Get ( GetThemeVideos request )
{
var result = GetThemeVideos ( request ) ;
return ToOptimizedSerializedResultUsingCache ( result ) ;
}
public ThemeMediaResult GetThemeVideos ( GetThemeVideos request )
{
2015-05-29 23:51:33 +00:00
var user = ! string . IsNullOrWhiteSpace ( request . UserId ) ? _userManager . GetUserById ( request . UserId ) : null ;
2014-02-21 05:04:11 +00:00
var item = string . IsNullOrEmpty ( request . Id )
2015-05-29 23:51:33 +00:00
? ( ! string . IsNullOrWhiteSpace ( request . UserId )
2014-02-21 05:04:11 +00:00
? user . RootFolder
: ( Folder ) _libraryManager . RootFolder )
2014-04-25 20:15:50 +00:00
: _libraryManager . GetItemById ( request . Id ) ;
2014-02-21 05:04:11 +00:00
2017-06-11 20:40:25 +00:00
if ( item = = null )
{
throw new ResourceNotFoundException ( "Item not found." ) ;
}
2017-08-09 19:56:38 +00:00
while ( item . ThemeVideoIds . Length = = 0 & & request . InheritFromParent & & item . GetParent ( ) ! = null )
2014-02-21 05:04:11 +00:00
{
2015-11-11 14:56:31 +00:00
item = item . GetParent ( ) ;
2014-02-21 05:04:11 +00:00
}
2016-11-10 14:41:24 +00:00
var dtoOptions = GetDtoOptions ( _authContext , request ) ;
2014-12-27 05:08:39 +00:00
2016-10-09 07:18:43 +00:00
var dtos = item . ThemeVideoIds . Select ( _libraryManager . GetItemById )
2016-07-08 18:11:13 +00:00
. Where ( i = > i ! = null )
2014-02-21 05:04:11 +00:00
. OrderBy ( i = > i . SortName )
2014-12-27 05:08:39 +00:00
. Select ( i = > _dtoService . GetBaseItemDto ( i , dtoOptions , user , item ) ) ;
2014-02-21 05:04:11 +00:00
var items = dtos . ToArray ( ) ;
return new ThemeMediaResult
{
Items = items ,
TotalRecordCount = items . Length ,
OwnerId = _dtoService . GetDtoId ( item )
} ;
}
private readonly CultureInfo _usCulture = new CultureInfo ( "en-US" ) ;
public object Get ( GetYearIndex request )
{
2015-01-25 06:34:50 +00:00
var includeTypes = string . IsNullOrWhiteSpace ( request . IncludeItemTypes )
? new string [ ] { }
: request . IncludeItemTypes . Split ( ',' ) ;
2014-02-21 05:04:11 +00:00
2016-03-25 03:53:42 +00:00
var user = ! string . IsNullOrWhiteSpace ( request . UserId ) ? _userManager . GetUserById ( request . UserId ) : null ;
2017-08-27 00:32:33 +00:00
2016-03-25 03:53:42 +00:00
var query = new InternalItemsQuery ( user )
2014-02-21 05:04:11 +00:00
{
2016-03-25 03:53:42 +00:00
IncludeItemTypes = includeTypes ,
2017-05-21 07:25:49 +00:00
Recursive = true ,
DtoOptions = new DtoOptions ( false )
{
EnableImages = false
}
2015-01-25 06:34:50 +00:00
} ;
2016-03-25 03:53:42 +00:00
var items = _libraryManager . GetItemList ( query ) ;
2014-02-21 05:04:11 +00:00
var lookup = items
. ToLookup ( i = > i . ProductionYear ? ? - 1 )
. OrderBy ( i = > i . Key )
. Select ( i = > new ItemIndex
{
ItemCount = i . Count ( ) ,
Name = i . Key = = - 1 ? string . Empty : i . Key . ToString ( _usCulture )
} )
. ToList ( ) ;
return ToOptimizedSerializedResultUsingCache ( lookup ) ;
}
2013-02-21 01:33:05 +00:00
}
}