@ -4,6 +4,18 @@ All notable changes to this project will be documented in this file.
@@ -4,6 +4,18 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
## [Unreleased]
### Added
- Add new collection type `Rerun Collection`
- This collection type will show up as *two* collection types in classic schedules
- `Rerun (First Run)`
- `Rerun (Rerun)`
- The playback order for each of these collection types can be set on the rerun collection itself
- e.g. `Season, Episode` order for first run, `Shuffle` for rerun
- When a first run item is added to a playout, it will immediately be made available in the rerun collection
- Rerun history is currently scoped to the playout, and only supported in classic schedules
- This means resetting the playout will reset the rerun history
- Items will still be scheduled from the rerun collection if it is used before the first run collection
- Otherwise, the rerun collection would be considered "empty" which prevents the playout build altogether
@ -25,7 +25,7 @@ public class AddEpisodeToPlaylistHandler(IDbContextFactory<TvContext> dbContextF
@@ -25,7 +25,7 @@ public class AddEpisodeToPlaylistHandler(IDbContextFactory<TvContext> dbContextF
@ -36,22 +36,22 @@ public class AddItemsToPlaylistHandler : IRequestHandler<AddItemsToPlaylist, Eit
@@ -36,22 +36,22 @@ public class AddItemsToPlaylistHandler : IRequestHandler<AddItemsToPlaylist, Eit
@ -25,7 +25,7 @@ public class AddMovieToPlaylistHandler(IDbContextFactory<TvContext> dbContextFac
@@ -25,7 +25,7 @@ public class AddMovieToPlaylistHandler(IDbContextFactory<TvContext> dbContextFac
@ -25,7 +25,7 @@ public class AddSeasonToPlaylistHandler(IDbContextFactory<TvContext> dbContextFa
@@ -25,7 +25,7 @@ public class AddSeasonToPlaylistHandler(IDbContextFactory<TvContext> dbContextFa
@ -25,7 +25,7 @@ public class AddShowToPlaylistHandler(IDbContextFactory<TvContext> dbContextFact
@@ -25,7 +25,7 @@ public class AddShowToPlaylistHandler(IDbContextFactory<TvContext> dbContextFact
@ -78,61 +78,61 @@ public class ReplacePlaylistItemsHandler(IDbContextFactory<TvContext> dbContextF
@@ -78,61 +78,61 @@ public class ReplacePlaylistItemsHandler(IDbContextFactory<TvContext> dbContextF
{
switch(item.CollectionType)
{
caseProgramScheduleItemCollectionType.Collection:
caseCollectionType.Collection:
if(item.CollectionIdisnull)
{
returnBaseError.New("[Collection] is required for collection type 'Collection'");
@ -28,6 +28,7 @@ public class BuildPlayoutHandler : IRequestHandler<BuildPlayout, Either<BaseErro
@@ -28,6 +28,7 @@ public class BuildPlayoutHandler : IRequestHandler<BuildPlayout, Either<BaseErro
@ -44,6 +45,7 @@ public class BuildPlayoutHandler : IRequestHandler<BuildPlayout, Either<BaseErro
@@ -44,6 +45,7 @@ public class BuildPlayoutHandler : IRequestHandler<BuildPlayout, Either<BaseErro
@ -57,6 +59,7 @@ public class BuildPlayoutHandler : IRequestHandler<BuildPlayout, Either<BaseErro
@@ -57,6 +59,7 @@ public class BuildPlayoutHandler : IRequestHandler<BuildPlayout, Either<BaseErro
_ffmpegSegmenterService=ffmpegSegmenterService;
_entityLocker=entityLocker;
_playoutTimeShifter=playoutTimeShifter;
_rerunHelper=rerunHelper;
_workerChannel=workerChannel;
}
@ -160,6 +163,19 @@ public class BuildPlayoutHandler : IRequestHandler<BuildPlayout, Either<BaseErro
@@ -160,6 +163,19 @@ public class BuildPlayoutHandler : IRequestHandler<BuildPlayout, Either<BaseErro
@ -120,6 +120,7 @@ public class ReplaceProgramScheduleItemsHandler : ProgramScheduleItemCommandBase
@@ -120,6 +120,7 @@ public class ReplaceProgramScheduleItemsHandler : ProgramScheduleItemCommandBase
@ -140,10 +141,11 @@ public class ReplaceProgramScheduleItemsHandler : ProgramScheduleItemCommandBase
@@ -140,10 +141,11 @@ public class ReplaceProgramScheduleItemsHandler : ProgramScheduleItemCommandBase
@ -16,10 +16,11 @@ public record ProgramScheduleItemDurationViewModel : ProgramScheduleItemViewMode
@@ -16,10 +16,11 @@ public record ProgramScheduleItemDurationViewModel : ProgramScheduleItemViewMode
StartTypestartType,
TimeSpan?startTime,
FixedStartTimeBehavior?fixedStartTimeBehavior,
ProgramScheduleItemCollectionTypecollectionType,
CollectionTypecollectionType,
MediaCollectionViewModelcollection,
MultiCollectionViewModelmultiCollection,
SmartCollectionViewModelsmartCollection,
RerunCollectionViewModelrerunCollection,
PlaylistViewModelplaylist,
NamedMediaItemViewModelmediaItem,
PlaybackOrderplaybackOrder,
@ -54,6 +55,7 @@ public record ProgramScheduleItemDurationViewModel : ProgramScheduleItemViewMode
@@ -54,6 +55,7 @@ public record ProgramScheduleItemDurationViewModel : ProgramScheduleItemViewMode
@ -16,10 +16,11 @@ public record ProgramScheduleItemFloodViewModel : ProgramScheduleItemViewModel
@@ -16,10 +16,11 @@ public record ProgramScheduleItemFloodViewModel : ProgramScheduleItemViewModel
StartTypestartType,
TimeSpan?startTime,
FixedStartTimeBehavior?fixedStartTimeBehavior,
ProgramScheduleItemCollectionTypecollectionType,
CollectionTypecollectionType,
MediaCollectionViewModelcollection,
MultiCollectionViewModelmultiCollection,
SmartCollectionViewModelsmartCollection,
RerunCollectionViewModelrerunCollection,
PlaylistViewModelplaylist,
NamedMediaItemViewModelmediaItem,
PlaybackOrderplaybackOrder,
@ -51,6 +52,7 @@ public record ProgramScheduleItemFloodViewModel : ProgramScheduleItemViewModel
@@ -51,6 +52,7 @@ public record ProgramScheduleItemFloodViewModel : ProgramScheduleItemViewModel
@ -16,10 +16,11 @@ public record ProgramScheduleItemMultipleViewModel : ProgramScheduleItemViewMode
@@ -16,10 +16,11 @@ public record ProgramScheduleItemMultipleViewModel : ProgramScheduleItemViewMode
StartTypestartType,
TimeSpan?startTime,
FixedStartTimeBehavior?fixedStartTimeBehavior,
ProgramScheduleItemCollectionTypecollectionType,
CollectionTypecollectionType,
MediaCollectionViewModelcollection,
MultiCollectionViewModelmultiCollection,
SmartCollectionViewModelsmartCollection,
RerunCollectionViewModelrerunCollection,
PlaylistViewModelplaylist,
NamedMediaItemViewModelmediaItem,
PlaybackOrderplaybackOrder,
@ -53,6 +54,7 @@ public record ProgramScheduleItemMultipleViewModel : ProgramScheduleItemViewMode
@@ -53,6 +54,7 @@ public record ProgramScheduleItemMultipleViewModel : ProgramScheduleItemViewMode
@ -16,10 +16,11 @@ public record ProgramScheduleItemOneViewModel : ProgramScheduleItemViewModel
@@ -16,10 +16,11 @@ public record ProgramScheduleItemOneViewModel : ProgramScheduleItemViewModel
StartTypestartType,
TimeSpan?startTime,
FixedStartTimeBehavior?fixedStartTimeBehavior,
ProgramScheduleItemCollectionTypecollectionType,
CollectionTypecollectionType,
MediaCollectionViewModelcollection,
MultiCollectionViewModelmultiCollection,
SmartCollectionViewModelsmartCollection,
RerunCollectionViewModelrerunCollection,
PlaylistViewModelplaylist,
NamedMediaItemViewModelmediaItem,
PlaybackOrderplaybackOrder,
@ -51,6 +52,7 @@ public record ProgramScheduleItemOneViewModel : ProgramScheduleItemViewModel
@@ -51,6 +52,7 @@ public record ProgramScheduleItemOneViewModel : ProgramScheduleItemViewModel
@ -23,6 +23,7 @@ public class GetProgramScheduleItemsHandler(IDbContextFactory<TvContext> dbConte
@@ -23,6 +23,7 @@ public class GetProgramScheduleItemsHandler(IDbContextFactory<TvContext> dbConte
.Include(i=>i.Collection)
.Include(i=>i.MultiCollection)
.Include(i=>i.SmartCollection)
.Include(i=>i.RerunCollection)
.Include(i=>i.Playlist)
.Include(i=>i.MediaItem)
.ThenInclude(i=>(iasMovie).MovieMetadata)
@ -74,6 +75,12 @@ public class GetProgramScheduleItemsHandler(IDbContextFactory<TvContext> dbConte
@@ -74,6 +75,12 @@ public class GetProgramScheduleItemsHandler(IDbContextFactory<TvContext> dbConte
@ -89,49 +89,49 @@ public class ReplaceBlockItemsHandler(IDbContextFactory<TvContext> dbContextFact
@@ -89,49 +89,49 @@ public class ReplaceBlockItemsHandler(IDbContextFactory<TvContext> dbContextFact
{
switch(item.CollectionType)
{
caseProgramScheduleItemCollectionType.Collection:
caseCollectionType.Collection:
if(item.CollectionIdisnull)
{
returnBaseError.New("[Collection] is required for collection type 'Collection'");
@ -92,13 +92,13 @@ public class UpdateDecoHandler(IDbContextFactory<TvContext> dbContextFactory)
@@ -92,13 +92,13 @@ public class UpdateDecoHandler(IDbContextFactory<TvContext> dbContextFactory)
@ -120,13 +120,13 @@ public class UpdateDecoHandler(IDbContextFactory<TvContext> dbContextFactory)
@@ -120,13 +120,13 @@ public class UpdateDecoHandler(IDbContextFactory<TvContext> dbContextFactory)
@ -849,7 +849,7 @@ public class GetPlayoutItemProcessByChannelNumberHandler : FFmpegProcessHandler<
@@ -849,7 +849,7 @@ public class GetPlayoutItemProcessByChannelNumberHandler : FFmpegProcessHandler<
@ -42,6 +42,7 @@ public class FakeMediaCollectionRepository : IMediaCollectionRepository
@@ -42,6 +42,7 @@ public class FakeMediaCollectionRepository : IMediaCollectionRepository
@ -69,6 +70,9 @@ public class FakeMediaCollectionRepository : IMediaCollectionRepository
@@ -69,6 +70,9 @@ public class FakeMediaCollectionRepository : IMediaCollectionRepository
@ -541,6 +541,7 @@ public class ContinuePlayoutTests : PlayoutBuilderTestBase
@@ -541,6 +541,7 @@ public class ContinuePlayoutTests : PlayoutBuilderTestBase
@ -548,6 +549,7 @@ public class ContinuePlayoutTests : PlayoutBuilderTestBase
@@ -548,6 +549,7 @@ public class ContinuePlayoutTests : PlayoutBuilderTestBase
artistRepo,
factory,
localFileSystem,
rerunHelper,
Logger);
DateTimeOffsetstart=HoursAfterMidnight(0);
@ -661,6 +663,7 @@ public class ContinuePlayoutTests : PlayoutBuilderTestBase
@@ -661,6 +663,7 @@ public class ContinuePlayoutTests : PlayoutBuilderTestBase
@ -668,6 +671,7 @@ public class ContinuePlayoutTests : PlayoutBuilderTestBase
@@ -668,6 +671,7 @@ public class ContinuePlayoutTests : PlayoutBuilderTestBase
artistRepo,
factory,
localFileSystem,
rerunHelper,
Logger);
DateTimeOffsetstart=HoursAfterMidnight(0);
@ -783,6 +787,7 @@ public class ContinuePlayoutTests : PlayoutBuilderTestBase
@@ -783,6 +787,7 @@ public class ContinuePlayoutTests : PlayoutBuilderTestBase
@ -790,6 +795,7 @@ public class ContinuePlayoutTests : PlayoutBuilderTestBase
@@ -790,6 +795,7 @@ public class ContinuePlayoutTests : PlayoutBuilderTestBase
@ -102,6 +102,7 @@ public class RefreshPlayoutTests : PlayoutBuilderTestBase
@@ -102,6 +102,7 @@ public class RefreshPlayoutTests : PlayoutBuilderTestBase
@ -109,6 +110,7 @@ public class RefreshPlayoutTests : PlayoutBuilderTestBase
@@ -109,6 +110,7 @@ public class RefreshPlayoutTests : PlayoutBuilderTestBase
@ -25,7 +25,7 @@ public class PlayoutModeSchedulerMultipleTests : SchedulerTestBase
@@ -25,7 +25,7 @@ public class PlayoutModeSchedulerMultipleTests : SchedulerTestBase
@ -127,7 +127,7 @@ public class PlayoutModeSchedulerMultipleTests : SchedulerTestBase
@@ -127,7 +127,7 @@ public class PlayoutModeSchedulerMultipleTests : SchedulerTestBase
@ -199,7 +199,7 @@ public class PlayoutModeSchedulerMultipleTests : SchedulerTestBase
@@ -199,7 +199,7 @@ public class PlayoutModeSchedulerMultipleTests : SchedulerTestBase
@ -45,7 +45,7 @@ public class BlockPlayoutShuffledMediaCollectionEnumerator : IMediaCollectionEnu
@@ -45,7 +45,7 @@ public class BlockPlayoutShuffledMediaCollectionEnumerator : IMediaCollectionEnu
@ -32,7 +32,7 @@ public sealed class ChronologicalMediaCollectionEnumerator : IMediaCollectionEnu
@@ -32,7 +32,7 @@ public sealed class ChronologicalMediaCollectionEnumerator : IMediaCollectionEnu
while(State.Index<state.Index)
{
MoveNext();
MoveNext(Option<DateTimeOffset>.None);
}
}
@ -45,7 +45,8 @@ public sealed class ChronologicalMediaCollectionEnumerator : IMediaCollectionEnu
@@ -45,7 +45,8 @@ public sealed class ChronologicalMediaCollectionEnumerator : IMediaCollectionEnu
@ -28,7 +28,7 @@ public class CustomOrderCollectionEnumerator : IMediaCollectionEnumerator
@@ -28,7 +28,7 @@ public class CustomOrderCollectionEnumerator : IMediaCollectionEnumerator
@ -41,7 +41,8 @@ public class CustomOrderCollectionEnumerator : IMediaCollectionEnumerator
@@ -41,7 +41,8 @@ public class CustomOrderCollectionEnumerator : IMediaCollectionEnumerator
@ -138,55 +138,55 @@ public class MarathonHelper(IMediaCollectionRepository mediaCollectionRepository
@@ -138,55 +138,55 @@ public class MarathonHelper(IMediaCollectionRepository mediaCollectionRepository
@ -211,7 +211,7 @@ public class MarathonHelper(IMediaCollectionRepository mediaCollectionRepository
@@ -211,7 +211,7 @@ public class MarathonHelper(IMediaCollectionRepository mediaCollectionRepository
@ -38,7 +38,7 @@ public class PlaylistHelper(IMediaCollectionRepository mediaCollectionRepository
@@ -38,7 +38,7 @@ public class PlaylistHelper(IMediaCollectionRepository mediaCollectionRepository
@ -58,14 +58,14 @@ public class PlaylistEnumerator : IMediaCollectionEnumerator
@@ -58,14 +58,14 @@ public class PlaylistEnumerator : IMediaCollectionEnumerator
@ -238,7 +238,7 @@ public class PlaylistEnumerator : IMediaCollectionEnumerator
@@ -238,7 +238,7 @@ public class PlaylistEnumerator : IMediaCollectionEnumerator
while(result.State.Index<state.Index)
{
result.MoveNext();
result.MoveNext(Option<DateTimeOffset>.None);
// previous state is no longer valid; playlist now has fewer items
@ -110,7 +110,7 @@ public class PlayoutModeSchedulerDuration : PlayoutModeSchedulerBase<ProgramSche
@@ -110,7 +110,7 @@ public class PlayoutModeSchedulerDuration : PlayoutModeSchedulerBase<ProgramSche
@ -137,7 +137,7 @@ public class PlayoutModeSchedulerDuration : PlayoutModeSchedulerBase<ProgramSche
@@ -137,7 +137,7 @@ public class PlayoutModeSchedulerDuration : PlayoutModeSchedulerBase<ProgramSche
@ -235,7 +235,7 @@ public class PlayoutModeSchedulerDuration : PlayoutModeSchedulerBase<ProgramSche
@@ -235,7 +235,7 @@ public class PlayoutModeSchedulerDuration : PlayoutModeSchedulerBase<ProgramSche
@ -145,7 +145,7 @@ public class PlayoutModeSchedulerFlood : PlayoutModeSchedulerBase<ProgramSchedul
@@ -145,7 +145,7 @@ public class PlayoutModeSchedulerFlood : PlayoutModeSchedulerBase<ProgramSchedul
@ -156,7 +156,7 @@ public class PlayoutModeSchedulerMultiple : PlayoutModeSchedulerBase<ProgramSche
@@ -156,7 +156,7 @@ public class PlayoutModeSchedulerMultiple : PlayoutModeSchedulerBase<ProgramSche
@ -96,7 +96,7 @@ public class PlayoutModeSchedulerOne : PlayoutModeSchedulerBase<ProgramScheduleI
@@ -96,7 +96,7 @@ public class PlayoutModeSchedulerOne : PlayoutModeSchedulerBase<ProgramScheduleI
@ -26,13 +26,13 @@ public class RandomizedMediaCollectionEnumerator : IMediaCollectionEnumerator
@@ -26,13 +26,13 @@ public class RandomizedMediaCollectionEnumerator : IMediaCollectionEnumerator
// because _index defaults to 0
if(State.Index==state.Index)
{
MoveNext();
MoveNext(Option<DateTimeOffset>.None);
}
else
{
while(State.Index<=state.Index)
{
MoveNext();
MoveNext(Option<DateTimeOffset>.None);
}
}
}
@ -46,7 +46,7 @@ public class RandomizedMediaCollectionEnumerator : IMediaCollectionEnumerator
@@ -46,7 +46,7 @@ public class RandomizedMediaCollectionEnumerator : IMediaCollectionEnumerator
@ -50,13 +50,13 @@ public class RandomizedRotatingMediaCollectionEnumerator : IMediaCollectionEnume
@@ -50,13 +50,13 @@ public class RandomizedRotatingMediaCollectionEnumerator : IMediaCollectionEnume
// because _index defaults to 0
if(State.Index==state.Index)
{
MoveNext();
MoveNext(Option<DateTimeOffset>.None);
}
else
{
while(State.Index<=state.Index)
{
MoveNext();
MoveNext(Option<DateTimeOffset>.None);
}
}
}
@ -70,7 +70,7 @@ public class RandomizedRotatingMediaCollectionEnumerator : IMediaCollectionEnume
@@ -70,7 +70,7 @@ public class RandomizedRotatingMediaCollectionEnumerator : IMediaCollectionEnume
@ -31,7 +31,7 @@ public sealed class SeasonEpisodeMediaCollectionEnumerator : IMediaCollectionEnu
@@ -31,7 +31,7 @@ public sealed class SeasonEpisodeMediaCollectionEnumerator : IMediaCollectionEnu
while(State.Index<state.Index)
{
MoveNext();
MoveNext(Option<DateTimeOffset>.None);
}
}
@ -44,7 +44,7 @@ public sealed class SeasonEpisodeMediaCollectionEnumerator : IMediaCollectionEnu
@@ -44,7 +44,7 @@ public sealed class SeasonEpisodeMediaCollectionEnumerator : IMediaCollectionEnu