diff --git a/MediaBrowser.Api/Library/LibraryService.cs b/MediaBrowser.Api/Library/LibraryService.cs
index 50c4ad14fc..945e803b2a 100644
--- a/MediaBrowser.Api/Library/LibraryService.cs
+++ b/MediaBrowser.Api/Library/LibraryService.cs
@@ -1,4 +1,7 @@
-using MediaBrowser.Controller.Activity;
+using MediaBrowser.Api.Movies;
+using MediaBrowser.Api.Music;
+using MediaBrowser.Controller.Activity;
+using MediaBrowser.Controller.Channels;
using MediaBrowser.Controller.Dto;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Entities.Audio;
@@ -9,7 +12,9 @@ using MediaBrowser.Controller.LiveTv;
using MediaBrowser.Controller.Localization;
using MediaBrowser.Controller.Net;
using MediaBrowser.Controller.Persistence;
+using MediaBrowser.Controller.TV;
using MediaBrowser.Model.Activity;
+using MediaBrowser.Model.Channels;
using MediaBrowser.Model.Dto;
using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Querying;
@@ -238,6 +243,12 @@ namespace MediaBrowser.Api.Library
public string Id { get; set; }
}
+ [Route("/Items/{Id}/Similar", "GET", Summary = "Downloads item media")]
+ [Authenticated(Roles = "download")]
+ public class GetSimilarItems : BaseGetSimilarItemsFromItem
+ {
+ }
+
///
/// Class LibraryService
///
@@ -257,12 +268,14 @@ namespace MediaBrowser.Api.Library
private readonly IActivityManager _activityManager;
private readonly ILocalizationManager _localization;
private readonly ILiveTvManager _liveTv;
+ private readonly IChannelManager _channelManager;
+ private readonly ITVSeriesManager _tvManager;
///
/// Initializes a new instance of the class.
///
public LibraryService(IItemRepository itemRepo, ILibraryManager libraryManager, IUserManager userManager,
- IDtoService dtoService, IUserDataManager userDataManager, IAuthorizationContext authContext, IActivityManager activityManager, ILocalizationManager localization, ILiveTvManager liveTv)
+ IDtoService dtoService, IUserDataManager userDataManager, IAuthorizationContext authContext, IActivityManager activityManager, ILocalizationManager localization, ILiveTvManager liveTv, IChannelManager channelManager, ITVSeriesManager tvManager)
{
_itemRepo = itemRepo;
_libraryManager = libraryManager;
@@ -273,6 +286,115 @@ namespace MediaBrowser.Api.Library
_activityManager = activityManager;
_localization = localization;
_liveTv = liveTv;
+ _channelManager = channelManager;
+ _tvManager = tvManager;
+ }
+
+ 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)
+ {
+ return new GamesService(_userManager, _userDataManager, _libraryManager, _itemRepo, _dtoService)
+ {
+ AuthorizationContext = AuthorizationContext,
+ Logger = Logger,
+ Request = Request,
+ SessionContext = SessionContext,
+ ResultFactory = ResultFactory
+
+ }.Get(new GetSimilarGames
+ {
+ Fields = request.Fields,
+ Id = request.Id,
+ Limit = request.Limit,
+ UserId = request.UserId
+ });
+ }
+ if (item is MusicAlbum)
+ {
+ return new AlbumsService(_userManager, _userDataManager, _libraryManager, _itemRepo, _dtoService)
+ {
+ AuthorizationContext = AuthorizationContext,
+ Logger = Logger,
+ Request = Request,
+ SessionContext = SessionContext,
+ ResultFactory = ResultFactory
+
+ }.Get(new GetSimilarAlbums
+ {
+ Fields = request.Fields,
+ Id = request.Id,
+ Limit = request.Limit,
+ UserId = request.UserId
+ });
+ }
+ if (item is MusicArtist)
+ {
+ return new AlbumsService(_userManager, _userDataManager, _libraryManager, _itemRepo, _dtoService)
+ {
+ AuthorizationContext = AuthorizationContext,
+ Logger = Logger,
+ Request = Request,
+ SessionContext = SessionContext,
+ ResultFactory = ResultFactory
+
+ }.Get(new GetSimilarArtists
+ {
+ Fields = request.Fields,
+ Id = request.Id,
+ Limit = request.Limit,
+ UserId = request.UserId
+ });
+ }
+
+ var program = item as IHasProgramAttributes;
+ var channelItem = item as ChannelVideoItem;
+
+ if (item is Movie || (program != null && program.IsMovie) || (channelItem != null && channelItem.ContentType == ChannelMediaContentType.Movie && channelItem.ContentType == ChannelMediaContentType.MovieExtra))
+ {
+ return new MoviesService(_userManager, _userDataManager, _libraryManager, _itemRepo, _dtoService, _channelManager)
+ {
+ AuthorizationContext = AuthorizationContext,
+ Logger = Logger,
+ Request = Request,
+ SessionContext = SessionContext,
+ ResultFactory = ResultFactory
+
+ }.Get(new GetSimilarMovies
+ {
+ Fields = request.Fields,
+ Id = request.Id,
+ Limit = request.Limit,
+ UserId = request.UserId
+ });
+ }
+
+ if (item is Series || (program != null && program.IsSeries) || (channelItem != null && channelItem.ContentType == ChannelMediaContentType.Episode))
+ {
+ return new TvShowsService(_userManager, _userDataManager, _libraryManager, _itemRepo, _dtoService, _tvManager)
+ {
+ AuthorizationContext = AuthorizationContext,
+ Logger = Logger,
+ Request = Request,
+ SessionContext = SessionContext,
+ ResultFactory = ResultFactory
+
+ }.Get(new GetSimilarShows
+ {
+ Fields = request.Fields,
+ Id = request.Id,
+ Limit = request.Limit,
+ UserId = request.UserId
+ });
+ }
+
+ return new ItemsResult();
}
public object Get(GetMediaFolders request)
diff --git a/MediaBrowser.Api/Movies/MoviesService.cs b/MediaBrowser.Api/Movies/MoviesService.cs
index 97e9aa9c8f..fe8bae1a51 100644
--- a/MediaBrowser.Api/Movies/MoviesService.cs
+++ b/MediaBrowser.Api/Movies/MoviesService.cs
@@ -28,6 +28,14 @@ namespace MediaBrowser.Api.Movies
{
}
+ ///
+ /// Class GetSimilarTrailers
+ ///
+ [Route("/Trailers/{Id}/Similar", "GET", Summary = "Finds movies and trailers similar to a given trailer.")]
+ public class GetSimilarTrailers : BaseGetSimilarItemsFromItem
+ {
+ }
+
[Route("/Movies/Recommendations", "GET", Summary = "Gets movie recommendations")]
public class GetMovieRecommendations : IReturn, IHasItemFields
{
@@ -117,6 +125,17 @@ namespace MediaBrowser.Api.Movies
return ToOptimizedSerializedResultUsingCache(result);
}
+ public async Task