using MediaBrowser.Controller.Dto; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Net; using MediaBrowser.Controller.Persistence; using MediaBrowser.Model.Dto; using System; using System.Collections.Generic; using System.Globalization; using System.IO; using System.Linq; using System.Threading.Tasks; using MediaBrowser.Model.Querying; using MediaBrowser.Model.Services; using MediaBrowser.Model.Extensions; namespace MediaBrowser.Api { /// /// Class GetSimilarGames /// [Route("/Games/{Id}/Similar", "GET", Summary = "Finds games similar to a given game.")] public class GetSimilarGames : BaseGetSimilarItemsFromItem { } /// /// Class GetGameSystemSummaries /// [Route("/Games/SystemSummaries", "GET", Summary = "Finds games similar to a given game.")] public class GetGameSystemSummaries : IReturn { /// /// Gets or sets the user id. /// /// The user id. [ApiMember(Name = "UserId", Description = "Optional. Filter by user id", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")] public string UserId { get; set; } } /// /// Class GamesService /// [Authenticated] public class GamesService : BaseApiService { /// /// The _user manager /// private readonly IUserManager _userManager; /// /// The _user data repository /// private readonly IUserDataManager _userDataRepository; /// /// The _library manager /// private readonly ILibraryManager _libraryManager; /// /// The _item repo /// private readonly IItemRepository _itemRepo; /// /// The _dto service /// private readonly IDtoService _dtoService; private readonly IAuthorizationContext _authContext; /// /// Initializes a new instance of the class. /// /// The user manager. /// The user data repository. /// The library manager. /// The item repo. /// The dto service. public GamesService(IUserManager userManager, IUserDataManager userDataRepository, ILibraryManager libraryManager, IItemRepository itemRepo, IDtoService dtoService, IAuthorizationContext authContext) { _userManager = userManager; _userDataRepository = userDataRepository; _libraryManager = libraryManager; _itemRepo = itemRepo; _dtoService = dtoService; _authContext = authContext; } /// /// Gets the specified request. /// /// The request. /// System.Object. public object Get(GetGameSystemSummaries request) { var user = request.UserId == null ? null : _userManager.GetUserById(request.UserId); var query = new InternalItemsQuery(user) { IncludeItemTypes = new[] { typeof(GameSystem).Name }, DtoOptions = new DtoOptions(false) { EnableImages = false } }; var result = _libraryManager.GetItemList(query) .Cast() .Select(i => GetSummary(i, user)) .ToArray(); return ToOptimizedSerializedResultUsingCache(result); } private static readonly CultureInfo UsCulture = new CultureInfo("en-US"); /// /// Gets the summary. /// /// The system. /// The user. /// GameSystemSummary. private GameSystemSummary GetSummary(GameSystem system, User user) { var summary = new GameSystemSummary { Name = system.GameSystemName, DisplayName = system.Name }; var items = user == null ? system.GetRecursiveChildren(i => i is Game) : system.GetRecursiveChildren(user, new InternalItemsQuery(user) { IncludeItemTypes = new[] { typeof(Game).Name }, DtoOptions = new DtoOptions(false) { EnableImages = false } }); var games = items.Cast().ToArray(); summary.ClientInstalledGameCount = games.Count(i => i.IsPlaceHolder); summary.GameCount = games.Length; summary.GameFileExtensions = games.Where(i => !i.IsPlaceHolder).Select(i => Path.GetExtension(i.Path)) .Distinct(StringComparer.OrdinalIgnoreCase) .ToArray(); return summary; } /// /// Gets the specified request. /// /// The request. /// System.Object. public object Get(GetSimilarGames request) { var result = GetSimilarItemsResult(request); return ToOptimizedSerializedResultUsingCache(result); } private QueryResult GetSimilarItemsResult(BaseGetSimilarItemsFromItem 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); var dtoOptions = GetDtoOptions(_authContext, request); var itemsResult = _libraryManager.GetItemList(new InternalItemsQuery(user) { Limit = request.Limit, IncludeItemTypes = new[] { typeof(Game).Name }, SimilarTo = item, DtoOptions = dtoOptions }); var returnList = _dtoService.GetBaseItemDtos(itemsResult, dtoOptions, user); var result = new QueryResult { Items = returnList, TotalRecordCount = itemsResult.Count }; return result; } } }