LiveTvDtoService.cs 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393
  1. using System.Threading;
  2. using System.Threading.Tasks;
  3. using MediaBrowser.Common.Extensions;
  4. using MediaBrowser.Controller.Drawing;
  5. using MediaBrowser.Controller.Dto;
  6. using MediaBrowser.Controller.Entities;
  7. using MediaBrowser.Controller.Library;
  8. using MediaBrowser.Controller.LiveTv;
  9. using MediaBrowser.Model.Entities;
  10. using MediaBrowser.Model.LiveTv;
  11. using MediaBrowser.Model.Logging;
  12. using System;
  13. namespace MediaBrowser.Server.Implementations.LiveTv
  14. {
  15. public class LiveTvDtoService
  16. {
  17. private readonly ILogger _logger;
  18. private readonly IImageProcessor _imageProcessor;
  19. private readonly IUserDataManager _userDataManager;
  20. private readonly IDtoService _dtoService;
  21. public LiveTvDtoService(IDtoService dtoService, IUserDataManager userDataManager, IImageProcessor imageProcessor, ILogger logger)
  22. {
  23. _dtoService = dtoService;
  24. _userDataManager = userDataManager;
  25. _imageProcessor = imageProcessor;
  26. _logger = logger;
  27. }
  28. public TimerInfoDto GetTimerInfoDto(TimerInfo info, ILiveTvService service)
  29. {
  30. var dto = new TimerInfoDto
  31. {
  32. Id = GetInternalTimerId(service.Name, info.Id).ToString("N"),
  33. ChannelName = info.ChannelName,
  34. Overview = info.Overview,
  35. EndDate = info.EndDate,
  36. Name = info.Name,
  37. StartDate = info.StartDate,
  38. ExternalId = info.Id,
  39. ChannelId = GetInternalChannelId(service.Name, info.ChannelId, info.ChannelName).ToString("N"),
  40. Status = info.Status,
  41. SeriesTimerId = string.IsNullOrEmpty(info.SeriesTimerId) ? null : GetInternalSeriesTimerId(service.Name, info.SeriesTimerId).ToString("N"),
  42. RequestedPostPaddingSeconds = info.RequestedPostPaddingSeconds,
  43. RequestedPrePaddingSeconds = info.RequestedPrePaddingSeconds,
  44. RequiredPostPaddingSeconds = info.RequiredPostPaddingSeconds,
  45. RequiredPrePaddingSeconds = info.RequiredPrePaddingSeconds,
  46. ExternalChannelId = info.ChannelId,
  47. ExternalSeriesTimerId = info.SeriesTimerId,
  48. ServiceName = service.Name,
  49. ExternalProgramId = info.ProgramId,
  50. Priority = info.Priority
  51. };
  52. var duration = info.EndDate - info.StartDate;
  53. dto.DurationMs = Convert.ToInt32(duration.TotalMilliseconds);
  54. if (!string.IsNullOrEmpty(info.ProgramId))
  55. {
  56. dto.ProgramId = GetInternalProgramId(service.Name, info.ProgramId).ToString("N");
  57. }
  58. return dto;
  59. }
  60. public SeriesTimerInfoDto GetSeriesTimerInfoDto(SeriesTimerInfo info, ILiveTvService service)
  61. {
  62. var dto = new SeriesTimerInfoDto
  63. {
  64. Id = GetInternalSeriesTimerId(service.Name, info.Id).ToString("N"),
  65. ChannelName = info.ChannelName,
  66. Overview = info.Overview,
  67. EndDate = info.EndDate,
  68. Name = info.Name,
  69. StartDate = info.StartDate,
  70. ExternalId = info.Id,
  71. RequestedPostPaddingSeconds = info.RequestedPostPaddingSeconds,
  72. RequestedPrePaddingSeconds = info.RequestedPrePaddingSeconds,
  73. RequiredPostPaddingSeconds = info.RequiredPostPaddingSeconds,
  74. RequiredPrePaddingSeconds = info.RequiredPrePaddingSeconds,
  75. Days = info.Days,
  76. Priority = info.Priority,
  77. RecordAnyChannel = info.RecordAnyChannel,
  78. RecordAnyTime = info.RecordAnyTime,
  79. RecordNewOnly = info.RecordNewOnly,
  80. ExternalChannelId = info.ChannelId,
  81. ExternalProgramId = info.ProgramId,
  82. ServiceName = service.Name
  83. };
  84. if (!string.IsNullOrEmpty(info.ChannelId))
  85. {
  86. dto.ChannelId = GetInternalChannelId(service.Name, info.ChannelId, info.ChannelName).ToString("N");
  87. }
  88. if (!string.IsNullOrEmpty(info.ProgramId))
  89. {
  90. dto.ProgramId = GetInternalProgramId(service.Name, info.ProgramId).ToString("N");
  91. }
  92. DayPattern? pattern = null;
  93. if (info.Days != null && info.Days.Count > 0)
  94. {
  95. if (info.Days.Count == 7)
  96. {
  97. pattern = DayPattern.Daily;
  98. }
  99. else if (info.Days.Count == 2)
  100. {
  101. if (info.Days.Contains(DayOfWeek.Saturday) && info.Days.Contains(DayOfWeek.Sunday))
  102. {
  103. pattern = DayPattern.Weekends;
  104. }
  105. }
  106. else if (info.Days.Count == 5)
  107. {
  108. if (info.Days.Contains(DayOfWeek.Monday) && info.Days.Contains(DayOfWeek.Tuesday) && info.Days.Contains(DayOfWeek.Wednesday) && info.Days.Contains(DayOfWeek.Thursday) && info.Days.Contains(DayOfWeek.Friday))
  109. {
  110. pattern = DayPattern.Weekdays;
  111. }
  112. }
  113. }
  114. dto.DayPattern = pattern;
  115. return dto;
  116. }
  117. public RecordingInfoDto GetRecordingInfoDto(RecordingInfo info, ILiveTvService service, User user = null)
  118. {
  119. var dto = new RecordingInfoDto
  120. {
  121. Id = GetInternalRecordingId(service.Name, info.Id).ToString("N"),
  122. ChannelName = info.ChannelName,
  123. Overview = info.Overview,
  124. EndDate = info.EndDate,
  125. Name = info.Name,
  126. StartDate = info.StartDate,
  127. ExternalId = info.Id,
  128. ChannelId = GetInternalChannelId(service.Name, info.ChannelId, info.ChannelName).ToString("N"),
  129. Status = info.Status,
  130. Path = info.Path,
  131. Genres = info.Genres,
  132. IsRepeat = info.IsRepeat,
  133. EpisodeTitle = info.EpisodeTitle,
  134. ChannelType = info.ChannelType,
  135. MediaType = info.ChannelType == ChannelType.Radio ? MediaType.Audio : MediaType.Video,
  136. CommunityRating = info.CommunityRating,
  137. OfficialRating = info.OfficialRating,
  138. Audio = info.Audio,
  139. IsHD = info.IsHD,
  140. ServiceName = service.Name,
  141. Url = info.Url
  142. };
  143. if (user != null)
  144. {
  145. //dto.UserData = _dtoService.GetUserItemDataDto(_userDataManager.GetUserData(user.Id, info.GetUserDataKey()));
  146. }
  147. var duration = info.EndDate - info.StartDate;
  148. dto.DurationMs = Convert.ToInt32(duration.TotalMilliseconds);
  149. if (!string.IsNullOrEmpty(info.ProgramId))
  150. {
  151. dto.ProgramId = GetInternalProgramId(service.Name, info.ProgramId).ToString("N");
  152. }
  153. return dto;
  154. }
  155. /// <summary>
  156. /// Gets the channel info dto.
  157. /// </summary>
  158. /// <param name="info">The info.</param>
  159. /// <param name="user">The user.</param>
  160. /// <returns>ChannelInfoDto.</returns>
  161. public ChannelInfoDto GetChannelInfoDto(Channel info, User user = null)
  162. {
  163. var dto = new ChannelInfoDto
  164. {
  165. Name = info.Name,
  166. ServiceName = info.ServiceName,
  167. ChannelType = info.ChannelType,
  168. Number = info.ChannelNumber,
  169. Type = info.GetType().Name,
  170. Id = info.Id.ToString("N"),
  171. MediaType = info.MediaType,
  172. ExternalId = info.ChannelId
  173. };
  174. if (user != null)
  175. {
  176. dto.UserData = _dtoService.GetUserItemDataDto(_userDataManager.GetUserData(user.Id, info.GetUserDataKey()));
  177. }
  178. var imageTag = GetLogoImageTag(info);
  179. if (imageTag.HasValue)
  180. {
  181. dto.ImageTags[ImageType.Primary] = imageTag.Value;
  182. }
  183. return dto;
  184. }
  185. public ProgramInfoDto GetProgramInfoDto(ProgramInfo program, Channel channel, User user = null)
  186. {
  187. var dto = new ProgramInfoDto
  188. {
  189. Id = GetInternalProgramId(channel.ServiceName, program.Id).ToString("N"),
  190. ChannelId = channel.Id.ToString("N"),
  191. Overview = program.Overview,
  192. EndDate = program.EndDate,
  193. Genres = program.Genres,
  194. ExternalId = program.Id,
  195. Name = program.Name,
  196. ServiceName = channel.ServiceName,
  197. StartDate = program.StartDate,
  198. OfficialRating = program.OfficialRating,
  199. IsHD = program.IsHD,
  200. OriginalAirDate = program.OriginalAirDate,
  201. Audio = program.Audio,
  202. CommunityRating = program.CommunityRating,
  203. AspectRatio = program.AspectRatio,
  204. IsRepeat = program.IsRepeat,
  205. EpisodeTitle = program.EpisodeTitle,
  206. ChannelName = program.ChannelName
  207. };
  208. if (user != null)
  209. {
  210. //dto.UserData = _dtoService.GetUserItemDataDto(_userDataManager.GetUserData(user.Id, info.GetUserDataKey()));
  211. }
  212. return dto;
  213. }
  214. private Guid? GetLogoImageTag(Channel info)
  215. {
  216. var path = info.PrimaryImagePath;
  217. if (string.IsNullOrEmpty(path))
  218. {
  219. return null;
  220. }
  221. try
  222. {
  223. return _imageProcessor.GetImageCacheTag(info, ImageType.Primary, path);
  224. }
  225. catch (Exception ex)
  226. {
  227. _logger.ErrorException("Error getting channel image info for {0}", ex, info.Name);
  228. }
  229. return null;
  230. }
  231. public Guid GetInternalChannelId(string serviceName, string externalId, string channelName)
  232. {
  233. var name = serviceName + externalId + channelName;
  234. return name.ToLower().GetMBId(typeof(Channel));
  235. }
  236. public Guid GetInternalTimerId(string serviceName, string externalId)
  237. {
  238. var name = serviceName + externalId;
  239. return name.ToLower().GetMD5();
  240. }
  241. public Guid GetInternalSeriesTimerId(string serviceName, string externalId)
  242. {
  243. var name = serviceName + externalId;
  244. return name.ToLower().GetMD5();
  245. }
  246. public Guid GetInternalProgramId(string serviceName, string externalId)
  247. {
  248. var name = serviceName + externalId;
  249. return name.ToLower().GetMD5();
  250. }
  251. public Guid GetInternalRecordingId(string serviceName, string externalId)
  252. {
  253. var name = serviceName + externalId;
  254. return name.ToLower().GetMD5();
  255. }
  256. public async Task<TimerInfo> GetTimerInfo(TimerInfoDto dto, bool isNew, ILiveTvManager liveTv, CancellationToken cancellationToken)
  257. {
  258. var info = new TimerInfo
  259. {
  260. ChannelName = dto.ChannelName,
  261. Overview = dto.Overview,
  262. EndDate = dto.EndDate,
  263. Name = dto.Name,
  264. StartDate = dto.StartDate,
  265. Status = dto.Status,
  266. SeriesTimerId = dto.ExternalSeriesTimerId,
  267. RequestedPostPaddingSeconds = dto.RequestedPostPaddingSeconds,
  268. RequestedPrePaddingSeconds = dto.RequestedPrePaddingSeconds,
  269. RequiredPostPaddingSeconds = dto.RequiredPostPaddingSeconds,
  270. RequiredPrePaddingSeconds = dto.RequiredPrePaddingSeconds,
  271. Priority = dto.Priority
  272. };
  273. // Convert internal server id's to external tv provider id's
  274. if (!isNew && !string.IsNullOrEmpty(dto.Id))
  275. {
  276. var timer = await liveTv.GetTimer(dto.Id, cancellationToken).ConfigureAwait(false);
  277. info.Id = timer.ExternalId;
  278. }
  279. if (!string.IsNullOrEmpty(dto.SeriesTimerId))
  280. {
  281. var timer = await liveTv.GetSeriesTimer(dto.SeriesTimerId, cancellationToken).ConfigureAwait(false);
  282. info.SeriesTimerId = timer.ExternalId;
  283. }
  284. if (!string.IsNullOrEmpty(dto.ChannelId))
  285. {
  286. var channel = await liveTv.GetChannel(dto.ChannelId, cancellationToken).ConfigureAwait(false);
  287. info.ChannelId = channel.ExternalId;
  288. }
  289. if (!string.IsNullOrEmpty(dto.ProgramId))
  290. {
  291. var program = await liveTv.GetProgram(dto.ProgramId, cancellationToken).ConfigureAwait(false);
  292. info.ProgramId = program.ExternalId;
  293. }
  294. return info;
  295. }
  296. public async Task<SeriesTimerInfo> GetSeriesTimerInfo(SeriesTimerInfoDto dto, bool isNew, ILiveTvManager liveTv, CancellationToken cancellationToken)
  297. {
  298. var info = new SeriesTimerInfo
  299. {
  300. ChannelName = dto.ChannelName,
  301. Overview = dto.Overview,
  302. EndDate = dto.EndDate,
  303. Name = dto.Name,
  304. StartDate = dto.StartDate,
  305. RequestedPostPaddingSeconds = dto.RequestedPostPaddingSeconds,
  306. RequestedPrePaddingSeconds = dto.RequestedPrePaddingSeconds,
  307. RequiredPostPaddingSeconds = dto.RequiredPostPaddingSeconds,
  308. RequiredPrePaddingSeconds = dto.RequiredPrePaddingSeconds,
  309. Days = dto.Days,
  310. Priority = dto.Priority,
  311. RecordAnyChannel = dto.RecordAnyChannel,
  312. RecordAnyTime = dto.RecordAnyTime,
  313. RecordNewOnly = dto.RecordNewOnly
  314. };
  315. // Convert internal server id's to external tv provider id's
  316. if (!isNew && !string.IsNullOrEmpty(dto.Id))
  317. {
  318. var timer = await liveTv.GetSeriesTimer(dto.Id, cancellationToken).ConfigureAwait(false);
  319. info.Id = timer.ExternalId;
  320. }
  321. if (!string.IsNullOrEmpty(dto.ChannelId))
  322. {
  323. var channel = await liveTv.GetChannel(dto.ChannelId, cancellationToken).ConfigureAwait(false);
  324. info.ChannelId = channel.ExternalId;
  325. }
  326. if (!string.IsNullOrEmpty(dto.ProgramId))
  327. {
  328. var program = await liveTv.GetProgram(dto.ProgramId, cancellationToken).ConfigureAwait(false);
  329. info.ProgramId = program.ExternalId;
  330. }
  331. return info;
  332. }
  333. }
  334. }