Index: Scheduler/Scheduler.cs =================================================================== --- Scheduler/Scheduler.cs (revision 28246) +++ Scheduler/Scheduler.cs (working copy) @@ -544,13 +544,9 @@ } if (pastRecordEpisode.Equals(ToRecordEpisode, StringComparison.CurrentCultureIgnoreCase)) { - // How to handle "interrupted" recordings? - // E.g. Windows reboot because of update installation: Previously the tvservice restarted to record the episode - // and simply took care of creating a unique filename. - // Now we need to check whether Recording's and Scheduling's Starttime are identical. If they are we expect that - // the recording process should be resume because of previous failures. - if (pastRecordings[i].StartTime <= newRecording.Program.EndTime.AddMinutes(newRecording.Schedule.PostRecordInterval) && - pastRecordings[i].EndTime >= newRecording.Program.StartTime.AddMinutes(-newRecording.Schedule.PreRecordInterval)) + // Check if new program overlaps with existing recording + // if so assume previous failure and recording needs to be resumed + if (!ProgramOverlaps(pastRecordings[i], newRecording)) { // Check whether the file itself does really exist // There could be faulty drivers @@ -603,6 +599,12 @@ } else { + Log.Info("DUP: pastRecordings[i].StartTime: {0}", pastRecordings[i].StartTime.ToLongDateString() + " " + pastRecordings[i].StartTime.ToLongTimeString()); + Log.Info("DUP: pastRecordings[i].EndTime: {0}", pastRecordings[i].EndTime.ToLongDateString() + " " + pastRecordings[i].EndTime.ToLongTimeString()); + Log.Info("DUP: newRecording.Program.StartTime: {0}", newRecording.Program.StartTime.ToLongDateString() + " " + newRecording.Program.StartTime.ToLongTimeString()); + Log.Info("DUP: newRecording.Program.EndTime: {0}", newRecording.Program.EndTime.ToLongDateString() + " " + newRecording.Program.EndTime.ToLongTimeString()); + Log.Info("DUP: newRecording.Schedule.PreRecordInterval: {0}", newRecording.Schedule.PreRecordInterval.ToString()); + Log.Info("DUP: newRecording.Schedule.PostRecordInterval: {0}", newRecording.Schedule.PostRecordInterval.ToString()); Log.Info( "Scheduler: Schedule {0} ({1}) had already been started - expect previous failure and try to resume...", ToRecordTitle, ToRecordEpisode); @@ -620,6 +622,18 @@ return NewRecordingNeeded; } + private static bool ProgramOverlaps(Recording rec, RecordingDetail newRec) + { + var startExisting = rec.StartTime; + var endExisting = rec.EndTime; + var startNew = newRec.Program.StartTime.AddMinutes(-newRec.Schedule.PreRecordInterval); + var endNew = newRec.Program.EndTime.AddMinutes(newRec.Schedule.PostRecordInterval); + var isOverlap = (startNew >= startExisting && startNew < endExisting) || + (startNew <= startExisting && endNew >= endExisting) || + (endNew > startExisting && endNew <= endExisting); + return isOverlap; + } + private void CancelSchedule(RecordingDetail newRecording, int scheduleId) { CanceledSchedule canceled = new CanceledSchedule(scheduleId,