@ -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 )
{