浏览代码

update search

Luke Pulverenti 9 年之前
父节点
当前提交
c1e83beeac

+ 41 - 45
MediaBrowser.Server.Implementations/LiveTv/EmbyTV/EmbyTV.cs

@@ -979,67 +979,57 @@ namespace MediaBrowser.Server.Implementations.LiveTv.EmbyTV
 
             var recordPath = GetRecordingPath(timer, info);
             var recordingStatus = RecordingStatus.New;
+            var isResourceOpen = false;
+            SemaphoreSlim semaphore = null;
 
             try
             {
                 var result = await GetChannelStreamInternal(timer.ChannelId, null, CancellationToken.None).ConfigureAwait(false);
+                isResourceOpen = true;
+                semaphore = result.Item3;
                 var mediaStreamInfo = result.Item1;
-                var isResourceOpen = true;
 
-                // Unfortunately due to the semaphore we have to have a nested try/finally
-                try
-                {
-                    // HDHR doesn't seem to release the tuner right away after first probing with ffmpeg
-                    //await Task.Delay(3000, cancellationToken).ConfigureAwait(false);
-
-                    var recorder = await GetRecorder().ConfigureAwait(false);
+                // HDHR doesn't seem to release the tuner right away after first probing with ffmpeg
+                //await Task.Delay(3000, cancellationToken).ConfigureAwait(false);
 
-                    recordPath = recorder.GetOutputPath(mediaStreamInfo, recordPath);
-                    recordPath = EnsureFileUnique(recordPath, timer.Id);
+                var recorder = await GetRecorder().ConfigureAwait(false);
 
-                    _libraryMonitor.ReportFileSystemChangeBeginning(recordPath);
-                    _fileSystem.CreateDirectory(Path.GetDirectoryName(recordPath));
-                    activeRecordingInfo.Path = recordPath;
+                recordPath = recorder.GetOutputPath(mediaStreamInfo, recordPath);
+                recordPath = EnsureFileUnique(recordPath, timer.Id);
 
-                    var duration = recordingEndDate - DateTime.UtcNow;
+                _libraryMonitor.ReportFileSystemChangeBeginning(recordPath);
+                _fileSystem.CreateDirectory(Path.GetDirectoryName(recordPath));
+                activeRecordingInfo.Path = recordPath;
 
-                    _logger.Info("Beginning recording. Will record for {0} minutes.", duration.TotalMinutes.ToString(CultureInfo.InvariantCulture));
+                var duration = recordingEndDate - DateTime.UtcNow;
 
-                    _logger.Info("Writing file to path: " + recordPath);
-                    _logger.Info("Opening recording stream from tuner provider");
+                _logger.Info("Beginning recording. Will record for {0} minutes.", duration.TotalMinutes.ToString(CultureInfo.InvariantCulture));
 
-                    Action onStarted = () =>
-                    {
-                        timer.Status = RecordingStatus.InProgress;
-                        _timerProvider.AddOrUpdate(timer, false);
-
-                        result.Item3.Release();
-                        isResourceOpen = false;
-                    };
+                _logger.Info("Writing file to path: " + recordPath);
+                _logger.Info("Opening recording stream from tuner provider");
 
-                    var pathWithDuration = result.Item2.ApplyDuration(mediaStreamInfo.Path, duration);
+                Action onStarted = () =>
+                {
+                    timer.Status = RecordingStatus.InProgress;
+                    _timerProvider.AddOrUpdate(timer, false);
 
-                    // If it supports supplying duration via url
-                    if (!string.Equals(pathWithDuration, mediaStreamInfo.Path, StringComparison.OrdinalIgnoreCase))
-                    {
-                        mediaStreamInfo.Path = pathWithDuration;
-                        mediaStreamInfo.RunTimeTicks = duration.Ticks;
-                    }
+                    result.Item3.Release();
+                    isResourceOpen = false;
+                };
 
-                    await recorder.Record(mediaStreamInfo, recordPath, duration, onStarted, cancellationToken).ConfigureAwait(false);
+                var pathWithDuration = result.Item2.ApplyDuration(mediaStreamInfo.Path, duration);
 
-                    recordingStatus = RecordingStatus.Completed;
-                    _logger.Info("Recording completed: {0}", recordPath);
-                }
-                finally
+                // If it supports supplying duration via url
+                if (!string.Equals(pathWithDuration, mediaStreamInfo.Path, StringComparison.OrdinalIgnoreCase))
                 {
-                    if (isResourceOpen)
-                    {
-                        result.Item3.Release();
-                    }
-
-                    _libraryMonitor.ReportFileSystemChangeComplete(recordPath, true);
+                    mediaStreamInfo.Path = pathWithDuration;
+                    mediaStreamInfo.RunTimeTicks = duration.Ticks;
                 }
+
+                await recorder.Record(mediaStreamInfo, recordPath, duration, onStarted, cancellationToken).ConfigureAwait(false);
+
+                recordingStatus = RecordingStatus.Completed;
+                _logger.Info("Recording completed: {0}", recordPath);
             }
             catch (OperationCanceledException)
             {
@@ -1053,6 +1043,13 @@ namespace MediaBrowser.Server.Implementations.LiveTv.EmbyTV
             }
             finally
             {
+                if (isResourceOpen && semaphore != null)
+                {
+                    semaphore.Release();
+                }
+
+                _libraryMonitor.ReportFileSystemChangeComplete(recordPath, true);
+
                 ActiveRecordingInfo removed;
                 _activeRecordings.TryRemove(timer.Id, out removed);
             }
@@ -1060,10 +1057,9 @@ namespace MediaBrowser.Server.Implementations.LiveTv.EmbyTV
             if (recordingStatus == RecordingStatus.Completed)
             {
                 timer.Status = RecordingStatus.Completed;
-                _timerProvider.AddOrUpdate(timer, false);
+                _timerProvider.Delete(timer);
 
                 OnSuccessfulRecording(info.IsSeries, recordPath);
-                _timerProvider.Delete(timer);
             }
             else if (DateTime.UtcNow < timer.EndDate)
             {

+ 8 - 1
MediaBrowser.Server.Implementations/LiveTv/EmbyTV/EncodedRecorder.cs

@@ -62,7 +62,14 @@ namespace MediaBrowser.Server.Implementations.LiveTv.EmbyTV
             }
             finally
             {
-                File.Delete(tempfile);
+                try
+                {
+                    File.Delete(tempfile);
+                }
+                catch (Exception ex)
+                {
+                    _logger.ErrorException("Error deleting recording temp file", ex);
+                }
             }
         }