ignore specials when using season, episode order (#2399)
This commit is contained in:
@@ -47,6 +47,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
|
||||
- Entrypoint is at `/app/scripted-schedules/entrypoint.py`
|
||||
- Scripts folder should be mounted to `/app/scripted-schedules/scripts`
|
||||
- Playouts should be created with scripted schedule `/app/scripted-schedules/entrypoint.py script-name` (no trailing `.py`)
|
||||
- Automatically ignore Specials/Season 0 when using `Season, Episode` playback order
|
||||
|
||||
## [25.5.0] - 2025-09-01
|
||||
### Added
|
||||
|
||||
@@ -73,17 +73,41 @@ public class SeasonEpisodeContentTests
|
||||
chronologicalContent.State.Seed.ShouldBe(0);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Episodes_Should_Ignore_Specials()
|
||||
{
|
||||
List<MediaItem> contents = Episodes(10);
|
||||
for (int i = 0; i < 2; i++)
|
||||
{
|
||||
((Episode)contents[i]).Season = new Season { SeasonNumber = 0 };
|
||||
}
|
||||
|
||||
var state = new CollectionEnumeratorState();
|
||||
|
||||
var chronologicalContent = new SeasonEpisodeMediaCollectionEnumerator(contents, state);
|
||||
|
||||
for (var i = 0; i < 16; i++)
|
||||
{
|
||||
chronologicalContent.State.Index.ShouldBe(i % 8);
|
||||
chronologicalContent.MoveNext();
|
||||
}
|
||||
}
|
||||
|
||||
private static List<MediaItem> Episodes(int count) =>
|
||||
Range(1, count).Map(i => (MediaItem)new Episode
|
||||
{
|
||||
Id = i,
|
||||
EpisodeMetadata = new List<EpisodeMetadata>
|
||||
{
|
||||
new()
|
||||
EpisodeMetadata =
|
||||
[
|
||||
new EpisodeMetadata
|
||||
{
|
||||
ReleaseDate = new DateTime(2020, 1, 20 - i),
|
||||
EpisodeNumber = i
|
||||
}
|
||||
],
|
||||
Season = new Season
|
||||
{
|
||||
SeasonNumber = 1
|
||||
}
|
||||
})
|
||||
.Reverse()
|
||||
|
||||
@@ -15,7 +15,9 @@ public sealed class SeasonEpisodeMediaCollectionEnumerator : IMediaCollectionEnu
|
||||
{
|
||||
CurrentIncludeInProgramGuide = Option<bool>.None;
|
||||
|
||||
_sortedMediaItems = mediaItems.OrderBy(identity, new SeasonEpisodeMediaComparer()).ToList();
|
||||
_sortedMediaItems = mediaItems
|
||||
.Filter(mi => (mi is not Episode episode) || (episode.Season?.SeasonNumber ?? 0) > 0)
|
||||
.OrderBy(identity, new SeasonEpisodeMediaComparer()).ToList();
|
||||
_lazyMinimumDuration = new Lazy<Option<TimeSpan>>(() =>
|
||||
_sortedMediaItems.Bind(i => i.GetNonZeroDuration()).OrderBy(identity).HeadOrNone());
|
||||
|
||||
@@ -42,7 +44,15 @@ public sealed class SeasonEpisodeMediaCollectionEnumerator : IMediaCollectionEnu
|
||||
public Option<MediaItem> Current => _sortedMediaItems.Count != 0 ? _sortedMediaItems[State.Index] : None;
|
||||
public Option<bool> CurrentIncludeInProgramGuide { get; }
|
||||
|
||||
public void MoveNext() => State.Index = (State.Index + 1) % _sortedMediaItems.Count;
|
||||
public void MoveNext()
|
||||
{
|
||||
if (_sortedMediaItems.Count == 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
State.Index = (State.Index + 1) % _sortedMediaItems.Count;
|
||||
}
|
||||
|
||||
public Option<TimeSpan> MinimumDuration => _lazyMinimumDuration.Value;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user