@ -45,6 +45,7 @@ public class TemplatePlayoutBuilder(
@@ -45,6 +45,7 @@ public class TemplatePlayoutBuilder(
// load content and content enumerators on demand
Dictionary < string , IMediaCollectionEnumerator > enumerators = new ( ) ;
int itemsAfterRepeat = playout . Items . Count ;
var index = 0 ;
while ( currentTime < finish )
{
@ -60,13 +61,22 @@ public class TemplatePlayoutBuilder(
@@ -60,13 +61,22 @@ public class TemplatePlayoutBuilder(
if ( playoutItem is PlayoutTemplateRepeatItem )
{
index = 0 ;
if ( playout . Items . Count = = itemsAfterRepeat )
{
logger . LogWarning ( "Repeat encountered without adding any playout items; aborting" ) ;
break ;
}
itemsAfterRepeat = playout . Items . Count ;
continue ;
}
if ( ! enumerators . TryGetValue ( playoutItem . Content , out IMediaCollectionEnumerator enumerator ) )
{
Option < IMediaCollectionEnumerator > maybeEnumerator =
await GetEnumeratorForContent ( playout , playoutItem . Content , playoutTemplate , cancellationToken ) ;
Option < IMediaCollectionEnumerator > maybeEnumerator = await GetCachedEnumeratorForContent (
playout ,
playoutTemplate ,
enumerators ,
playoutItem . Content ,
cancellationToken ) ;
if ( maybeEnumerator . IsNone )
{
@ -74,12 +84,7 @@ public class TemplatePlayoutBuilder(
@@ -74,12 +84,7 @@ public class TemplatePlayoutBuilder(
continue ;
}
foreach ( IMediaCollectionEnumerator e in maybeEnumerator )
{
enumerator = maybeEnumerator . ValueUnsafe ( ) ;
enumerators . Add ( playoutItem . Content , enumerator ) ;
}
}
IMediaCollectionEnumerator enumerator = maybeEnumerator . ValueUnsafe ( ) ;
switch ( playoutItem )
{
@ -87,11 +92,18 @@ public class TemplatePlayoutBuilder(
@@ -87,11 +92,18 @@ public class TemplatePlayoutBuilder(
currentTime = PlayoutTemplateSchedulerCount . Schedule ( playout , currentTime , count , enumerator ) ;
break ;
case PlayoutTemplatePadToNextItem padToNext :
Option < IMediaCollectionEnumerator > fallbackEnumerator = await GetCachedEnumeratorForContent (
playout ,
playoutTemplate ,
enumerators ,
padToNext . Fallback ,
cancellationToken ) ;
currentTime = PlayoutTemplateSchedulerPadToNext . Schedule (
playout ,
currentTime ,
padToNext ,
enumerator ) ;
enumerator ,
fallbackEnumerator ) ;
break ;
}
@ -106,6 +118,38 @@ public class TemplatePlayoutBuilder(
@@ -106,6 +118,38 @@ public class TemplatePlayoutBuilder(
. GetValue < int > ( ConfigElementKey . PlayoutDaysToBuild )
. IfNoneAsync ( 2 ) ;
private async Task < Option < IMediaCollectionEnumerator > > GetCachedEnumeratorForContent (
Playout playout ,
PlayoutTemplate playoutTemplate ,
Dictionary < string , IMediaCollectionEnumerator > enumerators ,
string contentKey ,
CancellationToken cancellationToken )
{
if ( string . IsNullOrWhiteSpace ( contentKey ) )
{
return Option < IMediaCollectionEnumerator > . None ;
}
if ( ! enumerators . TryGetValue ( contentKey , out IMediaCollectionEnumerator enumerator ) )
{
Option < IMediaCollectionEnumerator > maybeEnumerator =
await GetEnumeratorForContent ( playout , contentKey , playoutTemplate , cancellationToken ) ;
if ( maybeEnumerator . IsNone )
{
return Option < IMediaCollectionEnumerator > . None ;
}
foreach ( IMediaCollectionEnumerator e in maybeEnumerator )
{
enumerator = maybeEnumerator . ValueUnsafe ( ) ;
enumerators . Add ( contentKey , enumerator ) ;
}
}
return Some ( enumerator ) ;
}
private async Task < Option < IMediaCollectionEnumerator > > GetEnumeratorForContent (
Playout playout ,
string contentKey ,
@ -156,6 +200,4 @@ public class TemplatePlayoutBuilder(
@@ -156,6 +200,4 @@ public class TemplatePlayoutBuilder(
return deserializer . Deserialize < PlayoutTemplate > ( yaml ) ;
}
}