Browse Source

ignore specials when using season, episode order (#2399)

pull/2400/head
Jason Dove 4 months ago committed by GitHub
parent
commit
79e8fa0877
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 1
      CHANGELOG.md
  2. 30
      ErsatzTV.Core.Tests/Scheduling/SeasonEpisodeContentTests.cs
  3. 14
      ErsatzTV.Core/Scheduling/SeasonEpisodeMediaCollectionEnumerator.cs

1
CHANGELOG.md

@ -47,6 +47,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). @@ -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

30
ErsatzTV.Core.Tests/Scheduling/SeasonEpisodeContentTests.cs

@ -73,17 +73,41 @@ public class SeasonEpisodeContentTests @@ -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()

14
ErsatzTV.Core/Scheduling/SeasonEpisodeMediaCollectionEnumerator.cs

@ -15,7 +15,9 @@ public sealed class SeasonEpisodeMediaCollectionEnumerator : IMediaCollectionEnu @@ -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 @@ -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;

Loading…
Cancel
Save