diff options
Diffstat (limited to 'MediaBrowser.Server.Implementations/LiveTv/LiveTvDtoService.cs')
| -rw-r--r-- | MediaBrowser.Server.Implementations/LiveTv/LiveTvDtoService.cs | 301 |
1 files changed, 226 insertions, 75 deletions
diff --git a/MediaBrowser.Server.Implementations/LiveTv/LiveTvDtoService.cs b/MediaBrowser.Server.Implementations/LiveTv/LiveTvDtoService.cs index f93821cc9..6552c6892 100644 --- a/MediaBrowser.Server.Implementations/LiveTv/LiveTvDtoService.cs +++ b/MediaBrowser.Server.Implementations/LiveTv/LiveTvDtoService.cs @@ -8,6 +8,9 @@ using MediaBrowser.Model.Entities; using MediaBrowser.Model.LiveTv; using MediaBrowser.Model.Logging; using System; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; namespace MediaBrowser.Server.Implementations.LiveTv { @@ -27,108 +30,151 @@ namespace MediaBrowser.Server.Implementations.LiveTv _logger = logger; } - public TimerInfoDto GetTimerInfoDto(TimerInfo info, ILiveTvService service) + public TimerInfoDto GetTimerInfoDto(TimerInfo info, ILiveTvService service, LiveTvProgram program, LiveTvChannel channel) { var dto = new TimerInfoDto { Id = GetInternalTimerId(service.Name, info.Id).ToString("N"), - ChannelName = info.ChannelName, Overview = info.Overview, EndDate = info.EndDate, Name = info.Name, StartDate = info.StartDate, ExternalId = info.Id, - ChannelId = GetInternalChannelId(service.Name, info.ChannelId, info.ChannelName).ToString("N"), + ChannelId = GetInternalChannelId(service.Name, info.ChannelId).ToString("N"), Status = info.Status, SeriesTimerId = string.IsNullOrEmpty(info.SeriesTimerId) ? null : GetInternalSeriesTimerId(service.Name, info.SeriesTimerId).ToString("N"), - RequestedPostPaddingSeconds = info.RequestedPostPaddingSeconds, - RequestedPrePaddingSeconds = info.RequestedPrePaddingSeconds, - RequiredPostPaddingSeconds = info.RequiredPostPaddingSeconds, - RequiredPrePaddingSeconds = info.RequiredPrePaddingSeconds, + PrePaddingSeconds = info.PrePaddingSeconds, + PostPaddingSeconds = info.PostPaddingSeconds, + IsPostPaddingRequired = info.IsPostPaddingRequired, + IsPrePaddingRequired = info.IsPrePaddingRequired, ExternalChannelId = info.ChannelId, - ExternalSeriesTimerId = info.SeriesTimerId + ExternalSeriesTimerId = info.SeriesTimerId, + ServiceName = service.Name, + ExternalProgramId = info.ProgramId, + Priority = info.Priority, + RunTimeTicks = (info.EndDate - info.StartDate).Ticks }; - var duration = info.EndDate - info.StartDate; - dto.DurationMs = Convert.ToInt32(duration.TotalMilliseconds); - if (!string.IsNullOrEmpty(info.ProgramId)) { dto.ProgramId = GetInternalProgramId(service.Name, info.ProgramId).ToString("N"); } + if (program != null) + { + dto.ProgramInfo = GetProgramInfoDto(program, channel.ChannelInfo.Name); + + dto.ProgramInfo.TimerId = dto.Id; + dto.ProgramInfo.SeriesTimerId = dto.SeriesTimerId; + } + + if (channel != null) + { + dto.ChannelName = channel.ChannelInfo.Name; + } + return dto; } - public SeriesTimerInfoDto GetSeriesTimerInfoDto(SeriesTimerInfo info, ILiveTvService service) + public SeriesTimerInfoDto GetSeriesTimerInfoDto(SeriesTimerInfo info, ILiveTvService service, string channelName) { var dto = new SeriesTimerInfoDto { Id = GetInternalSeriesTimerId(service.Name, info.Id).ToString("N"), - ChannelName = info.ChannelName, Overview = info.Overview, EndDate = info.EndDate, Name = info.Name, StartDate = info.StartDate, ExternalId = info.Id, - ChannelId = GetInternalChannelId(service.Name, info.ChannelId, info.ChannelName).ToString("N"), - RequestedPostPaddingSeconds = info.RequestedPostPaddingSeconds, - RequestedPrePaddingSeconds = info.RequestedPrePaddingSeconds, - RequiredPostPaddingSeconds = info.RequiredPostPaddingSeconds, - RequiredPrePaddingSeconds = info.RequiredPrePaddingSeconds, + PrePaddingSeconds = info.PrePaddingSeconds, + PostPaddingSeconds = info.PostPaddingSeconds, + IsPostPaddingRequired = info.IsPostPaddingRequired, + IsPrePaddingRequired = info.IsPrePaddingRequired, Days = info.Days, Priority = info.Priority, - RecurrenceType = info.RecurrenceType, + RecordAnyChannel = info.RecordAnyChannel, + RecordAnyTime = info.RecordAnyTime, + RecordNewOnly = info.RecordNewOnly, ExternalChannelId = info.ChannelId, - ExternalProgramId = info.ProgramId + ExternalProgramId = info.ProgramId, + ServiceName = service.Name, + ChannelName = channelName }; + if (!string.IsNullOrEmpty(info.ChannelId)) + { + dto.ChannelId = GetInternalChannelId(service.Name, info.ChannelId).ToString("N"); + } + if (!string.IsNullOrEmpty(info.ProgramId)) { dto.ProgramId = GetInternalProgramId(service.Name, info.ProgramId).ToString("N"); } + dto.DayPattern = info.Days == null ? null : GetDayPattern(info.Days); + + return dto; + } + + public DayPattern? GetDayPattern(List<DayOfWeek> days) + { DayPattern? pattern = null; - if (info.Days != null && info.Days.Count > 0) + if (days.Count > 0) { - if (info.Days.Count == 7) + if (days.Count == 7) { pattern = DayPattern.Daily; } - else if (info.Days.Count == 2) + else if (days.Count == 2) { - if (info.Days.Contains(DayOfWeek.Saturday) && info.Days.Contains(DayOfWeek.Sunday)) + if (days.Contains(DayOfWeek.Saturday) && days.Contains(DayOfWeek.Sunday)) { pattern = DayPattern.Weekends; } } - else if (info.Days.Count == 5) + else if (days.Count == 5) { - 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)) + if (days.Contains(DayOfWeek.Monday) && days.Contains(DayOfWeek.Tuesday) && days.Contains(DayOfWeek.Wednesday) && days.Contains(DayOfWeek.Thursday) && days.Contains(DayOfWeek.Friday)) { pattern = DayPattern.Weekdays; } } } - dto.DayPattern = pattern; + return pattern; + } - return dto; + /// <summary> + /// Convert the provider 0-5 scale to our 0-10 scale + /// </summary> + /// <param name="val"></param> + /// <returns></returns> + private float? GetClientCommunityRating(float? val) + { + if (!val.HasValue) + { + return null; + } + + return val.Value * 2; } - public RecordingInfoDto GetRecordingInfoDto(RecordingInfo info, ILiveTvService service, User user = null) + public RecordingInfoDto GetRecordingInfoDto(LiveTvRecording recording, LiveTvChannel channel, ILiveTvService service, User user = null) { + var info = recording.RecordingInfo; + var dto = new RecordingInfoDto { Id = GetInternalRecordingId(service.Name, info.Id).ToString("N"), - ChannelName = info.ChannelName, + SeriesTimerId = string.IsNullOrEmpty(info.SeriesTimerId) ? null : GetInternalSeriesTimerId(service.Name, info.SeriesTimerId).ToString("N"), + Type = recording.GetClientTypeName(), Overview = info.Overview, EndDate = info.EndDate, Name = info.Name, StartDate = info.StartDate, ExternalId = info.Id, - ChannelId = GetInternalChannelId(service.Name, info.ChannelId, info.ChannelName).ToString("N"), + ChannelId = GetInternalChannelId(service.Name, info.ChannelId).ToString("N"), Status = info.Status, Path = info.Path, Genres = info.Genres, @@ -136,25 +182,44 @@ namespace MediaBrowser.Server.Implementations.LiveTv EpisodeTitle = info.EpisodeTitle, ChannelType = info.ChannelType, MediaType = info.ChannelType == ChannelType.Radio ? MediaType.Audio : MediaType.Video, - CommunityRating = info.CommunityRating, + CommunityRating = GetClientCommunityRating(info.CommunityRating), OfficialRating = info.OfficialRating, Audio = info.Audio, - IsHD = info.IsHD + IsHD = info.IsHD, + ServiceName = service.Name, + Url = info.Url, + IsMovie = info.IsMovie, + IsSeries = info.IsSeries, + IsSports = info.IsSports, + IsLive = info.IsLive, + IsNews = info.IsNews, + IsKids = info.IsKids, + IsPremiere = info.IsPremiere, + RunTimeTicks = (info.EndDate - info.StartDate).Ticks }; - if (user != null) + var imageTag = GetImageTag(recording); + + if (imageTag.HasValue) { - //dto.UserData = _dtoService.GetUserItemDataDto(_userDataManager.GetUserData(user.Id, info.GetUserDataKey())); + dto.ImageTags[ImageType.Primary] = imageTag.Value; } - var duration = info.EndDate - info.StartDate; - dto.DurationMs = Convert.ToInt32(duration.TotalMilliseconds); + if (user != null) + { + dto.UserData = _dtoService.GetUserItemDataDto(_userDataManager.GetUserData(user.Id, recording.GetUserDataKey())); + } if (!string.IsNullOrEmpty(info.ProgramId)) { dto.ProgramId = GetInternalProgramId(service.Name, info.ProgramId).ToString("N"); } + if (channel != null) + { + dto.ChannelName = channel.ChannelInfo.Name; + } + return dto; } @@ -164,17 +229,20 @@ namespace MediaBrowser.Server.Implementations.LiveTv /// <param name="info">The info.</param> /// <param name="user">The user.</param> /// <returns>ChannelInfoDto.</returns> - public ChannelInfoDto GetChannelInfoDto(Channel info, User user = null) + public ChannelInfoDto GetChannelInfoDto(LiveTvChannel info, User user = null) { + var channelInfo = info.ChannelInfo; + var dto = new ChannelInfoDto { Name = info.Name, ServiceName = info.ServiceName, - ChannelType = info.ChannelType, - Number = info.ChannelNumber, - Type = info.GetType().Name, + ChannelType = channelInfo.ChannelType, + Number = channelInfo.Number, + Type = info.GetClientTypeName(), Id = info.Id.ToString("N"), - MediaType = info.MediaType + MediaType = info.MediaType, + ExternalId = channelInfo.Id }; if (user != null) @@ -182,7 +250,7 @@ namespace MediaBrowser.Server.Implementations.LiveTv dto.UserData = _dtoService.GetUserItemDataDto(_userDataManager.GetUserData(user.Id, info.GetUserDataKey())); } - var imageTag = GetLogoImageTag(info); + var imageTag = GetImageTag(info); if (imageTag.HasValue) { @@ -192,38 +260,49 @@ namespace MediaBrowser.Server.Implementations.LiveTv return dto; } - public ProgramInfoDto GetProgramInfoDto(ProgramInfo program, Channel channel, User user = null) + public ProgramInfoDto GetProgramInfoDto(LiveTvProgram item, string channelName, User user = null) { + var program = item.ProgramInfo; + var dto = new ProgramInfoDto { - Id = GetInternalProgramId(channel.ServiceName, program.Id).ToString("N"), - ChannelId = channel.Id.ToString("N"), + Id = GetInternalProgramId(item.ServiceName, program.Id).ToString("N"), + ChannelId = GetInternalChannelId(item.ServiceName, program.ChannelId).ToString("N"), Overview = program.Overview, EndDate = program.EndDate, Genres = program.Genres, ExternalId = program.Id, Name = program.Name, - ServiceName = channel.ServiceName, + ServiceName = item.ServiceName, StartDate = program.StartDate, OfficialRating = program.OfficialRating, IsHD = program.IsHD, OriginalAirDate = program.OriginalAirDate, Audio = program.Audio, - CommunityRating = program.CommunityRating, + CommunityRating = GetClientCommunityRating(program.CommunityRating), AspectRatio = program.AspectRatio, IsRepeat = program.IsRepeat, - EpisodeTitle = program.EpisodeTitle + EpisodeTitle = program.EpisodeTitle, + ChannelName = channelName, + IsMovie = program.IsMovie, + IsSeries = program.IsSeries, + IsSports = program.IsSports, + IsLive = program.IsLive, + IsNews = program.IsNews, + IsKids = program.IsKids, + IsPremiere = program.IsPremiere, + RunTimeTicks = (program.EndDate - program.StartDate).Ticks }; if (user != null) { - //dto.UserData = _dtoService.GetUserItemDataDto(_userDataManager.GetUserData(user.Id, info.GetUserDataKey())); + dto.UserData = _dtoService.GetUserItemDataDto(_userDataManager.GetUserData(user.Id, item.GetUserDataKey())); } return dto; } - private Guid? GetLogoImageTag(Channel info) + private Guid? GetImageTag(BaseItem info) { var path = info.PrimaryImagePath; @@ -238,17 +317,17 @@ namespace MediaBrowser.Server.Implementations.LiveTv } catch (Exception ex) { - _logger.ErrorException("Error getting channel image info for {0}", ex, info.Name); + _logger.ErrorException("Error getting image info for {0}", ex, info.Name); } return null; } - public Guid GetInternalChannelId(string serviceName, string externalId, string channelName) + public Guid GetInternalChannelId(string serviceName, string externalId) { - var name = serviceName + externalId + channelName; + var name = serviceName + externalId; - return name.ToLower().GetMBId(typeof(Channel)); + return name.ToLower().GetMBId(typeof(LiveTvChannel)); } public Guid GetInternalTimerId(string serviceName, string externalId) @@ -279,46 +358,118 @@ namespace MediaBrowser.Server.Implementations.LiveTv return name.ToLower().GetMD5(); } - public TimerInfo GetTimerInfo(TimerInfoDto dto) + public async Task<TimerInfo> GetTimerInfo(TimerInfoDto dto, bool isNew, ILiveTvManager liveTv, CancellationToken cancellationToken) { - return new TimerInfo + var info = new TimerInfo { - Id = dto.ExternalId, - ChannelName = dto.ChannelName, Overview = dto.Overview, EndDate = dto.EndDate, Name = dto.Name, StartDate = dto.StartDate, - ChannelId = dto.ExternalChannelId, Status = dto.Status, + PrePaddingSeconds = dto.PrePaddingSeconds, + PostPaddingSeconds = dto.PostPaddingSeconds, + IsPostPaddingRequired = dto.IsPostPaddingRequired, + IsPrePaddingRequired = dto.IsPrePaddingRequired, + Priority = dto.Priority, SeriesTimerId = dto.ExternalSeriesTimerId, - RequestedPostPaddingSeconds = dto.RequestedPostPaddingSeconds, - RequestedPrePaddingSeconds = dto.RequestedPrePaddingSeconds, - RequiredPostPaddingSeconds = dto.RequiredPostPaddingSeconds, - RequiredPrePaddingSeconds = dto.RequiredPrePaddingSeconds + ProgramId = dto.ExternalProgramId, + ChannelId = dto.ExternalChannelId, + Id = dto.ExternalId }; + + // Convert internal server id's to external tv provider id's + if (!isNew && !string.IsNullOrEmpty(dto.Id) && string.IsNullOrEmpty(info.Id)) + { + var timer = await liveTv.GetSeriesTimer(dto.Id, cancellationToken).ConfigureAwait(false); + + info.Id = timer.ExternalId; + } + + if (!string.IsNullOrEmpty(dto.ChannelId) && string.IsNullOrEmpty(info.ChannelId)) + { + var channel = await liveTv.GetChannel(dto.ChannelId, cancellationToken).ConfigureAwait(false); + + if (channel != null) + { + info.ChannelId = channel.ExternalId; + } + } + + if (!string.IsNullOrEmpty(dto.ProgramId) && string.IsNullOrEmpty(info.ProgramId)) + { + var program = await liveTv.GetProgram(dto.ProgramId, cancellationToken).ConfigureAwait(false); + + if (program != null) + { + info.ProgramId = program.ExternalId; + } + } + + if (!string.IsNullOrEmpty(dto.SeriesTimerId) && string.IsNullOrEmpty(info.SeriesTimerId)) + { + var timer = await liveTv.GetSeriesTimer(dto.SeriesTimerId, cancellationToken).ConfigureAwait(false); + + if (timer != null) + { + info.SeriesTimerId = timer.ExternalId; + } + } + + return info; } - public SeriesTimerInfo GetSeriesTimerInfo(SeriesTimerInfoDto dto) + public async Task<SeriesTimerInfo> GetSeriesTimerInfo(SeriesTimerInfoDto dto, bool isNew, ILiveTvManager liveTv, CancellationToken cancellationToken) { - return new SeriesTimerInfo + var info = new SeriesTimerInfo { - Id = dto.ExternalId, - ChannelName = dto.ChannelName, Overview = dto.Overview, EndDate = dto.EndDate, Name = dto.Name, StartDate = dto.StartDate, - ChannelId = dto.ExternalChannelId, - RequestedPostPaddingSeconds = dto.RequestedPostPaddingSeconds, - RequestedPrePaddingSeconds = dto.RequestedPrePaddingSeconds, - RequiredPostPaddingSeconds = dto.RequiredPostPaddingSeconds, - RequiredPrePaddingSeconds = dto.RequiredPrePaddingSeconds, + PrePaddingSeconds = dto.PrePaddingSeconds, + PostPaddingSeconds = dto.PostPaddingSeconds, + IsPostPaddingRequired = dto.IsPostPaddingRequired, + IsPrePaddingRequired = dto.IsPrePaddingRequired, Days = dto.Days, Priority = dto.Priority, - RecurrenceType = dto.RecurrenceType, - ProgramId = dto.ExternalProgramId + RecordAnyChannel = dto.RecordAnyChannel, + RecordAnyTime = dto.RecordAnyTime, + RecordNewOnly = dto.RecordNewOnly, + ProgramId = dto.ExternalProgramId, + ChannelId = dto.ExternalChannelId, + Id = dto.ExternalId }; + + // Convert internal server id's to external tv provider id's + if (!isNew && !string.IsNullOrEmpty(dto.Id) && string.IsNullOrEmpty(info.Id)) + { + var timer = await liveTv.GetSeriesTimer(dto.Id, cancellationToken).ConfigureAwait(false); + + info.Id = timer.ExternalId; + } + + if (!string.IsNullOrEmpty(dto.ChannelId) && string.IsNullOrEmpty(info.ChannelId)) + { + var channel = await liveTv.GetChannel(dto.ChannelId, cancellationToken).ConfigureAwait(false); + + if (channel != null) + { + info.ChannelId = channel.ExternalId; + } + } + + if (!string.IsNullOrEmpty(dto.ProgramId) && string.IsNullOrEmpty(info.ProgramId)) + { + var program = await liveTv.GetProgram(dto.ProgramId, cancellationToken).ConfigureAwait(false); + + if (program != null) + { + info.ProgramId = program.ExternalId; + } + } + + return info; } } } |
