using System.Threading;
using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.Persistence;
using MediaBrowser.Model.Querying;
using ServiceStack.ServiceHost;
using System;
using System.Linq;
using System.Threading.Tasks;
namespace MediaBrowser.Api
{
///
/// Class GetCriticReviews
///
[Route("/Items/{Id}/CriticReviews", "GET")]
[Api(Description = "Gets critic reviews for an item")]
public class GetCriticReviews : IReturn
{
///
/// Gets or sets the id.
///
/// The id.
[ApiMember(Name = "Id", Description = "Item Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "GET")]
public string Id { get; set; }
///
/// Skips over a given number of items within the results. Use for paging.
///
/// The start index.
[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; }
///
/// The maximum number of items to return
///
/// The limit.
[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; }
}
[Route("/Library/Refresh", "POST")]
[Api(Description = "Starts a library scan")]
public class RefreshLibrary : IReturnVoid
{
}
///
/// Class LibraryService
///
public class LibraryService : BaseApiService
{
///
/// The _item repo
///
private readonly IItemRepository _itemRepo;
private readonly ILibraryManager _libraryManager;
///
/// Initializes a new instance of the class.
///
/// The item repo.
/// The library manager.
public LibraryService(IItemRepository itemRepo, ILibraryManager libraryManager)
{
_itemRepo = itemRepo;
_libraryManager = libraryManager;
}
///
/// Gets the specified request.
///
/// The request.
/// System.Object.
public object Get(GetCriticReviews request)
{
var result = GetCriticReviewsAsync(request).Result;
return ToOptimizedResult(result);
}
///
/// Posts the specified request.
///
/// The request.
public void Post(RefreshLibrary request)
{
_libraryManager.ValidateMediaLibrary(new Progress(), CancellationToken.None);
}
///
/// Gets the critic reviews async.
///
/// The request.
/// Task{ItemReviewsResult}.
private async Task GetCriticReviewsAsync(GetCriticReviews request)
{
var reviews = await _itemRepo.GetCriticReviews(new Guid(request.Id)).ConfigureAwait(false);
var reviewsArray = reviews.ToArray();
var result = new ItemReviewsResult
{
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.ItemReviews = reviewsArray;
return result;
}
}
}