LiveTvService.cs 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. using MediaBrowser.Controller.LiveTv;
  2. using MediaBrowser.Model.LiveTv;
  3. using ServiceStack.ServiceHost;
  4. using System.Collections.Generic;
  5. using System.Linq;
  6. using System.Threading;
  7. using System.Threading.Tasks;
  8. namespace MediaBrowser.Api.LiveTv
  9. {
  10. [Route("/LiveTv/Services", "GET")]
  11. [Api(Description = "Gets available live tv services.")]
  12. public class GetServices : IReturn<List<LiveTvServiceInfo>>
  13. {
  14. [ApiMember(Name = "ServiceName", Description = "Optional filter by service.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
  15. public string ServiceName { get; set; }
  16. }
  17. [Route("/LiveTv/Channels", "GET")]
  18. [Api(Description = "Gets available live tv channels.")]
  19. public class GetChannels : IReturn<List<ChannelInfoDto>>
  20. {
  21. [ApiMember(Name = "ServiceName", Description = "Optional filter by service.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
  22. public string ServiceName { get; set; }
  23. [ApiMember(Name = "Type", Description = "Optional filter by channel type.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
  24. public ChannelType? Type { get; set; }
  25. [ApiMember(Name = "UserId", Description = "Optional filter by channel user id.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
  26. public string UserId { get; set; }
  27. }
  28. [Route("/LiveTv/Channels/{Id}", "GET")]
  29. [Api(Description = "Gets a live tv channel")]
  30. public class GetChannel : IReturn<ChannelInfoDto>
  31. {
  32. /// <summary>
  33. /// Gets or sets the id.
  34. /// </summary>
  35. /// <value>The id.</value>
  36. [ApiMember(Name = "Id", Description = "Channel Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "GET")]
  37. public string Id { get; set; }
  38. }
  39. [Route("/LiveTv/Recordings", "GET")]
  40. [Api(Description = "Gets available live tv recordings.")]
  41. public class GetRecordings : IReturn<List<RecordingInfo>>
  42. {
  43. [ApiMember(Name = "ServiceName", Description = "Optional filter by service.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
  44. public string ServiceName { get; set; }
  45. }
  46. [Route("/LiveTv/Guide", "GET")]
  47. [Api(Description = "Gets available live tv epgs..")]
  48. public class GetGuide : IReturn<List<ChannelGuide>>
  49. {
  50. [ApiMember(Name = "ServiceName", Description = "Live tv service name", IsRequired = true, DataType = "string", ParameterType = "query", Verb = "GET")]
  51. public string ServiceName { get; set; }
  52. [ApiMember(Name = "ChannelIds", Description = "The channels to return guide information for.", IsRequired = true, DataType = "string", ParameterType = "query", Verb = "GET")]
  53. public string ChannelIds { get; set; }
  54. }
  55. public class LiveTvService : BaseApiService
  56. {
  57. private readonly ILiveTvManager _liveTvManager;
  58. public LiveTvService(ILiveTvManager liveTvManager)
  59. {
  60. _liveTvManager = liveTvManager;
  61. }
  62. private IEnumerable<ILiveTvService> GetServices(string serviceName)
  63. {
  64. IEnumerable<ILiveTvService> services = _liveTvManager.Services;
  65. if (!string.IsNullOrEmpty(serviceName))
  66. {
  67. services = services.Where(i => string.Equals(i.Name, serviceName, System.StringComparison.OrdinalIgnoreCase));
  68. }
  69. return services;
  70. }
  71. public object Get(GetServices request)
  72. {
  73. var services = GetServices(request.ServiceName)
  74. .Select(GetServiceInfo)
  75. .ToList();
  76. return ToOptimizedResult(services);
  77. }
  78. private LiveTvServiceInfo GetServiceInfo(ILiveTvService service)
  79. {
  80. return new LiveTvServiceInfo
  81. {
  82. Name = service.Name
  83. };
  84. }
  85. public object Get(GetChannels request)
  86. {
  87. var result = _liveTvManager.GetChannels(new ChannelQuery
  88. {
  89. ChannelType = request.Type,
  90. ServiceName = request.ServiceName,
  91. UserId = request.UserId
  92. })
  93. .Select(_liveTvManager.GetChannelInfoDto);
  94. return ToOptimizedResult(result.ToList());
  95. }
  96. public object Get(GetChannel request)
  97. {
  98. var result = _liveTvManager.GetChannel(request.Id);
  99. return ToOptimizedResult(_liveTvManager.GetChannelInfoDto(result));
  100. }
  101. public object Get(GetRecordings request)
  102. {
  103. var result = GetRecordingsAsync(request).Result;
  104. return ToOptimizedResult(result.ToList());
  105. }
  106. private async Task<IEnumerable<RecordingInfo>> GetRecordingsAsync(GetRecordings request)
  107. {
  108. var services = GetServices(request.ServiceName);
  109. var query = new RecordingQuery
  110. {
  111. };
  112. var tasks = services.Select(i => i.GetRecordingsAsync(query, CancellationToken.None));
  113. var recordings = await Task.WhenAll(tasks).ConfigureAwait(false);
  114. return recordings.SelectMany(i => i);
  115. }
  116. public object Get(GetGuide request)
  117. {
  118. var result = GetGuideAsync(request).Result;
  119. return ToOptimizedResult(result);
  120. }
  121. private async Task<IEnumerable<ChannelGuide>> GetGuideAsync(GetGuide request)
  122. {
  123. var service = GetServices(request.ServiceName)
  124. .First();
  125. var channels = request.ChannelIds.Split(',');
  126. return await service.GetChannelGuidesAsync(channels, CancellationToken.None).ConfigureAwait(false);
  127. }
  128. }
  129. }