@ -21,84 +21,100 @@ public class GetChannelFramerateHandler : IRequestHandler<GetChannelFramerate, O
@@ -21,84 +21,100 @@ public class GetChannelFramerateHandler : IRequestHandler<GetChannelFramerate, O
public async Task < Option < int > > Handle ( GetChannelFramerate request , CancellationToken cancellationToken )
{
await using TvContext dbContext = await _d bContextFactory . CreateDbContextAsync ( cancellationToken ) ;
try
{
await using TvContext dbContext = await _d bContextFactory . CreateDbContextAsync ( cancellationToken ) ;
FFmpegProfile ffmpegProfile = await dbContext . Channels
. AsNoTracking ( )
. Filter ( c = > c . Number = = request . ChannelNumber )
. Include ( c = > c . FFmpegProfile )
. Map ( c = > c . FFmpegProfile )
. SingleAsync ( cancellationToken ) ;
FFmpegProfile ffmpegProfile = await dbContext . Channels
. AsNoTracking ( )
. Filter ( c = > c . Number = = request . ChannelNumber )
. Include ( c = > c . FFmpegProfile )
. Map ( c = > c . FFmpegProfile )
. SingleAsync ( cancellationToken ) ;
if ( ! ffmpegProfile . NormalizeFramerate )
{
return Option < int > . None ;
}
if ( ! ffmpegProfile . NormalizeFramerate )
{
return Option < int > . None ;
}
// TODO: expand to check everything in collection rather than what's scheduled?
_l ogger . LogDebug ( "Checking frame rates for channel {ChannelNumber}" , request . ChannelNumber ) ;
List < Playout > playouts = await dbContext . Playouts
. AsNoTracking ( )
. Include ( p = > p . Items )
. ThenInclude ( pi = > pi . MediaItem )
. ThenInclude ( mi = > ( mi as Movie ) . MediaVersions )
. Include ( p = > p . Items )
. ThenInclude ( pi = > pi . MediaItem )
. ThenInclude ( mi = > ( mi as Episode ) . MediaVersions )
. Include ( p = > p . Items )
. ThenInclude ( pi = > pi . MediaItem )
. ThenInclude ( mi = > ( mi as Song ) . MediaVersions )
. Include ( p = > p . Items )
. ThenInclude ( pi = > pi . MediaItem )
. ThenInclude ( mi = > ( mi as MusicVideo ) . MediaVersions )
. Include ( p = > p . Items )
. ThenInclude ( pi = > pi . MediaItem )
. ThenInclude ( mi = > ( mi as OtherVideo ) . MediaVersions )
. Filter ( p = > p . Channel . Number = = request . ChannelNumber )
. ToListAsync ( cancellationToken ) ;
var frameRates = playouts . Map ( p = > p . Items . Map ( i = > i . MediaItem . GetHeadVersion ( ) ) )
. Flatten ( )
. Map ( mv = > mv . RFrameRate )
. ToList ( ) ;
var distinct = frameRates . Distinct ( ) . ToList ( ) ;
if ( distinct . Count > 1 )
{
// TODO: something more intelligent than minimum framerate?
int result = frameRates . Map ( ParseFrameRate ) . Min ( ) ;
if ( result < 2 4 )
// TODO: expand to check everything in collection rather than what's scheduled?
_l ogger . LogDebug ( "Checking frame rates for channel {ChannelNumber}" , request . ChannelNumber ) ;
List < Playout > playouts = await dbContext . Playouts
. AsNoTracking ( )
. Include ( p = > p . Items )
. ThenInclude ( pi = > pi . MediaItem )
. ThenInclude ( mi = > ( mi as Movie ) . MediaVersions )
. Include ( p = > p . Items )
. ThenInclude ( pi = > pi . MediaItem )
. ThenInclude ( mi = > ( mi as Episode ) . MediaVersions )
. Include ( p = > p . Items )
. ThenInclude ( pi = > pi . MediaItem )
. ThenInclude ( mi = > ( mi as Song ) . MediaVersions )
. Include ( p = > p . Items )
. ThenInclude ( pi = > pi . MediaItem )
. ThenInclude ( mi = > ( mi as MusicVideo ) . MediaVersions )
. Include ( p = > p . Items )
. ThenInclude ( pi = > pi . MediaItem )
. ThenInclude ( mi = > ( mi as OtherVideo ) . MediaVersions )
. Include ( p = > p . Items )
. ThenInclude ( pi = > pi . MediaItem )
. ThenInclude ( mi = > ( mi as Image ) . MediaVersions )
. Include ( p = > p . Items )
. ThenInclude ( pi = > pi . MediaItem )
. ThenInclude ( mi = > ( mi as RemoteStream ) . MediaVersions )
. Filter ( p = > p . Channel . Number = = request . ChannelNumber )
. ToListAsync ( cancellationToken ) ;
var frameRates = playouts . Map ( p = > p . Items . Map ( i = > i . MediaItem . GetHeadVersion ( ) ) )
. Flatten ( )
. Map ( mv = > mv . RFrameRate )
. ToList ( ) ;
var distinct = frameRates . Distinct ( ) . ToList ( ) ;
if ( distinct . Count > 1 )
{
// TODO: something more intelligent than minimum framerate?
int result = frameRates . Map ( ParseFrameRate ) . Min ( ) ;
if ( result < 2 4 )
{
_l ogger . LogInformation (
"Normalizing frame rate for channel {ChannelNumber} from {Distinct} to {FrameRate} instead of min value {MinFrameRate}" ,
request . ChannelNumber ,
distinct ,
2 4 ,
result ) ;
return 2 4 ;
}
_l ogger . LogInformation (
"Normalizing frame rate for channel {ChannelNumber} from {Distinct} to {FrameRate} instead of min value {MinFrameRate}" ,
"Normalizing frame rate for channel {ChannelNumber} from {Distinct} to {FrameRate}" ,
request . ChannelNumber ,
distinct ,
2 4 ,
result ) ;
return 2 4 ;
return result ;
}
_l ogger . LogInformation (
"Normalizing frame rate for channel {ChannelNumber} from {Distinct} to {FrameRate}" ,
request . ChannelNumber ,
distinct ,
result ) ;
return result ;
}
if ( distinct . Count ! = 0 )
{
_l ogger . LogInformation (
"All content on channel {ChannelNumber} has the same frame rate of {FrameRate}; will not normalize" ,
request . ChannelNumber ,
distinct [ 0 ] ) ;
if ( distinct . Count ! = 0 )
{
_l ogger . LogInformation (
"All content on channel {ChannelNumber} has the same frame rate of {FrameRate}; will not normalize" ,
request . ChannelNumber ,
distinct [ 0 ] ) ;
}
else
{
_l ogger . LogInformation (
"No content on channel {ChannelNumber} has frame rate information; will not normalize" ,
request . ChannelNumber ) ;
}
}
els e
catch ( Exc eption ex )
{
_l ogger . LogInformation (
"No content on channel {ChannelNumber} has frame rate information; will not normalize" ,
_l ogger . LogWarning (
ex ,
"Unexpected error checking frame rates on channel {ChannelNumber}" ,
request . ChannelNumber ) ;
}