update embytv

This commit is contained in:
Luke Pulverenti 2015-09-21 11:18:14 -04:00
parent fe430acfc9
commit 671b861193
4 changed files with 77 additions and 25 deletions

View file

@ -58,7 +58,7 @@ namespace MediaBrowser.Common.ScheduledTasks
{ {
if (isApplicationStartup) if (isApplicationStartup)
{ {
triggerDate = DateTime.UtcNow.AddMinutes(2); triggerDate = DateTime.UtcNow.AddMinutes(1);
} }
else else
{ {

View file

@ -364,7 +364,47 @@ namespace MediaBrowser.Server.Implementations.LiveTv.EmbyTV
return Task.FromResult((IEnumerable<SeriesTimerInfo>)_seriesTimerProvider.GetAll()); return Task.FromResult((IEnumerable<SeriesTimerInfo>)_seriesTimerProvider.GetAll());
} }
public async Task RefreshSeriesTimers(CancellationToken cancellationToken, IProgress<double> progress)
{
var timers = await GetSeriesTimersAsync(cancellationToken).ConfigureAwait(false);
List<ChannelInfo> channels = null;
foreach (var timer in timers)
{
List<ProgramInfo> epgData;
if (timer.RecordAnyChannel)
{
if (channels == null)
{
channels = (await GetChannelsAsync(true, CancellationToken.None).ConfigureAwait(false)).ToList();
}
var channelIds = channels.Select(i => i.Id).ToList();
epgData = GetEpgDataForChannels(channelIds);
}
else
{
epgData = GetEpgDataForChannel(timer.ChannelId);
}
await UpdateTimersForSeriesTimer(epgData, timer).ConfigureAwait(false);
}
}
public async Task<IEnumerable<ProgramInfo>> GetProgramsAsync(string channelId, DateTime startDateUtc, DateTime endDateUtc, CancellationToken cancellationToken) public async Task<IEnumerable<ProgramInfo>> GetProgramsAsync(string channelId, DateTime startDateUtc, DateTime endDateUtc, CancellationToken cancellationToken)
{
try
{
return await GetProgramsAsyncInternal(channelId, startDateUtc, endDateUtc, cancellationToken).ConfigureAwait(false);
}
catch (Exception ex)
{
_logger.ErrorException("Error getting programs", ex);
return GetEpgDataForChannel(channelId).Where(i => i.StartDate <= endDateUtc && i.EndDate >= startDateUtc);
}
}
private async Task<IEnumerable<ProgramInfo>> GetProgramsAsyncInternal(string channelId, DateTime startDateUtc, DateTime endDateUtc, CancellationToken cancellationToken)
{ {
var channels = await GetChannelsAsync(true, cancellationToken).ConfigureAwait(false); var channels = await GetChannelsAsync(true, cancellationToken).ConfigureAwait(false);
var channel = channels.First(i => string.Equals(i.Id, channelId, StringComparison.OrdinalIgnoreCase)); var channel = channels.First(i => string.Equals(i.Id, channelId, StringComparison.OrdinalIgnoreCase));
@ -373,6 +413,7 @@ namespace MediaBrowser.Server.Implementations.LiveTv.EmbyTV
{ {
var programs = await provider.Item1.GetProgramsAsync(provider.Item2, channel.Number, startDateUtc, endDateUtc, cancellationToken) var programs = await provider.Item1.GetProgramsAsync(provider.Item2, channel.Number, startDateUtc, endDateUtc, cancellationToken)
.ConfigureAwait(false); .ConfigureAwait(false);
var list = programs.ToList(); var list = programs.ToList();
// Replace the value that came from the provider with a normalized value // Replace the value that came from the provider with a normalized value
@ -483,7 +524,7 @@ namespace MediaBrowser.Server.Implementations.LiveTv.EmbyTV
var timer = e.Argument; var timer = e.Argument;
_logger.Info("Recording timer fired."); _logger.Info("Recording timer fired.");
try try
{ {
var cancellationTokenSource = new CancellationTokenSource(); var cancellationTokenSource = new CancellationTokenSource();
@ -500,14 +541,6 @@ namespace MediaBrowser.Server.Implementations.LiveTv.EmbyTV
catch (Exception ex) catch (Exception ex)
{ {
_logger.ErrorException("Error recording stream", ex); _logger.ErrorException("Error recording stream", ex);
if (DateTime.UtcNow < timer.EndDate)
{
const int retryIntervalSeconds = 60;
_logger.Info("Retrying recording in {0} seconds.", retryIntervalSeconds);
_timerProvider.StartTimer(timer, TimeSpan.FromSeconds(retryIntervalSeconds));
}
} }
} }
@ -626,15 +659,31 @@ namespace MediaBrowser.Server.Implementations.LiveTv.EmbyTV
_logger.ErrorException("Error recording", ex); _logger.ErrorException("Error recording", ex);
recording.Status = RecordingStatus.Error; recording.Status = RecordingStatus.Error;
} }
finally
{
CancellationTokenSource removed;
_activeRecordings.TryRemove(timer.Id, out removed);
}
recording.DateLastUpdated = DateTime.UtcNow; recording.DateLastUpdated = DateTime.UtcNow;
_recordingProvider.Update(recording); _recordingProvider.Update(recording);
_timerProvider.Delete(timer);
_logger.Info("Recording was a success");
if (recording.Status == RecordingStatus.Completed) if (recording.Status == RecordingStatus.Completed)
{ {
OnSuccessfulRecording(recording); OnSuccessfulRecording(recording);
_timerProvider.Delete(timer);
}
else if (DateTime.UtcNow < timer.EndDate)
{
const int retryIntervalSeconds = 60;
_logger.Info("Retrying recording in {0} seconds.", retryIntervalSeconds);
_timerProvider.StartTimer(timer, TimeSpan.FromSeconds(retryIntervalSeconds));
}
else
{
_timerProvider.Delete(timer);
_recordingProvider.Delete(recording);
} }
} }

View file

@ -216,20 +216,12 @@ namespace MediaBrowser.Server.Implementations.LiveTv.Listings
// Helper.logger.Info("Modifyin channel " + channel.Number); // Helper.logger.Info("Modifyin channel " + channel.Number);
if (_channelPair.ContainsKey(channel.Number)) if (_channelPair.ContainsKey(channel.Number))
{ {
string channelName;
if (_channelPair[channel.Number].logo != null) if (_channelPair[channel.Number].logo != null)
{ {
channel.ImageUrl = _channelPair[channel.Number].logo.URL; channel.ImageUrl = _channelPair[channel.Number].logo.URL;
channel.HasImage = true; channel.HasImage = true;
} }
if (_channelPair[channel.Number].affiliate != null) string channelName = _channelPair[channel.Number].name;
{
channelName = _channelPair[channel.Number].affiliate;
}
else
{
channelName = _channelPair[channel.Number].name;
}
channel.Name = channelName; channel.Name = channelName;
} }
else else
@ -245,8 +237,7 @@ namespace MediaBrowser.Server.Implementations.LiveTv.Listings
ScheduleDirect.ProgramDetails details) ScheduleDirect.ProgramDetails details)
{ {
//_logger.Debug("Show type is: " + (details.showType ?? "No ShowType")); //_logger.Debug("Show type is: " + (details.showType ?? "No ShowType"));
DateTime startAt = DateTime.ParseExact(programInfo.airDateTime, "yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'", DateTime startAt = GetDate(programInfo.airDateTime);
CultureInfo.InvariantCulture);
DateTime endAt = startAt.AddSeconds(programInfo.duration); DateTime endAt = startAt.AddSeconds(programInfo.duration);
ProgramAudio audioType = ProgramAudio.Stereo; ProgramAudio audioType = ProgramAudio.Stereo;
@ -369,6 +360,12 @@ namespace MediaBrowser.Server.Implementations.LiveTv.Listings
return info; return info;
} }
private DateTime GetDate(string value)
{
return DateTime.ParseExact(value, "yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'",
CultureInfo.InvariantCulture);
}
private string GetProgramLogo(string apiUrl, ScheduleDirect.ShowImages images) private string GetProgramLogo(string apiUrl, ScheduleDirect.ShowImages images)
{ {
string url = ""; string url = "";
@ -408,7 +405,6 @@ namespace MediaBrowser.Server.Implementations.LiveTv.Listings
{ {
imageIdString += "\"" + i.Substring(0, 10) + "\","; imageIdString += "\"" + i.Substring(0, 10) + "\",";
} }
;
}); });
imageIdString = imageIdString.TrimEnd(',') + "]"; imageIdString = imageIdString.TrimEnd(',') + "]";
@ -979,4 +975,4 @@ namespace MediaBrowser.Server.Implementations.LiveTv.Listings
} }
} }
} }

View file

@ -1082,6 +1082,13 @@ namespace MediaBrowser.Server.Implementations.LiveTv
await CleanDatabaseInternal(newChannelIdList, new[] { typeof(LiveTvChannel).Name }, progress, cancellationToken).ConfigureAwait(false); await CleanDatabaseInternal(newChannelIdList, new[] { typeof(LiveTvChannel).Name }, progress, cancellationToken).ConfigureAwait(false);
await CleanDatabaseInternal(newProgramIdList, new[] { typeof(LiveTvProgram).Name }, progress, cancellationToken).ConfigureAwait(false); await CleanDatabaseInternal(newProgramIdList, new[] { typeof(LiveTvProgram).Name }, progress, cancellationToken).ConfigureAwait(false);
var coreService = _services.OfType<EmbyTV.EmbyTV>().FirstOrDefault();
if (coreService != null)
{
await coreService.RefreshSeriesTimers(cancellationToken, new Progress<double>()).ConfigureAwait(false);
}
// Load these now which will prefetch metadata // Load these now which will prefetch metadata
var dtoOptions = new DtoOptions(); var dtoOptions = new DtoOptions();
dtoOptions.Fields.Remove(ItemFields.SyncInfo); dtoOptions.Fields.Remove(ItemFields.SyncInfo);