Browse Source

fix bug scheduling duration filler (#1510)

pull/1511/head
Jason Dove 2 years ago committed by GitHub
parent
commit
97674cff89
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 1
      CHANGELOG.md
  2. 9
      ErsatzTV.Core/Extensions/MediaItemExtensions.cs
  3. 2
      ErsatzTV.Core/Scheduling/ChronologicalMediaCollectionEnumerator.cs
  4. 2
      ErsatzTV.Core/Scheduling/CustomOrderCollectionEnumerator.cs
  5. 2
      ErsatzTV.Core/Scheduling/RandomizedMediaCollectionEnumerator.cs
  6. 2
      ErsatzTV.Core/Scheduling/SeasonEpisodeMediaCollectionEnumerator.cs
  7. 2
      ErsatzTV.Core/Scheduling/ShuffleInOrderCollectionEnumerator.cs
  8. 2
      ErsatzTV.Core/Scheduling/ShuffledMediaCollectionEnumerator.cs
  9. 2
      ErsatzTV.Infrastructure/Scheduling/MultiEpisodeShuffleCollectionEnumerator.cs

1
CHANGELOG.md

@ -36,6 +36,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
- Fix MySQL queries that could fail during media server library scans - Fix MySQL queries that could fail during media server library scans
- Fix scanning Jellyfin libraries when library options and/or path infos are not returned from Jellyfin API - Fix scanning Jellyfin libraries when library options and/or path infos are not returned from Jellyfin API
- Fix error indexing music videos in `File Not Found` state - Fix error indexing music videos in `File Not Found` state
- Fix bug scheduling duration filler when filler collection contains item with zero duration
### Changed ### Changed
- Upgrade ffmpeg to 6.1, which is now *required* for all installs - Upgrade ffmpeg to 6.1, which is now *required* for all installs

9
ErsatzTV.Core/Extensions/MediaItemExtensions.cs

@ -7,8 +7,9 @@ namespace ErsatzTV.Core.Extensions;
public static class MediaItemExtensions public static class MediaItemExtensions
{ {
public static Option<TimeSpan> GetDuration(this MediaItem mediaItem) => public static Option<TimeSpan> GetNonZeroDuration(this MediaItem mediaItem)
mediaItem switch {
Option<TimeSpan> maybeDuration = mediaItem switch
{ {
Movie m => m.MediaVersions.HeadOrNone().Map(v => v.Duration), Movie m => m.MediaVersions.HeadOrNone().Map(v => v.Duration),
Episode e => e.MediaVersions.HeadOrNone().Map(v => v.Duration), Episode e => e.MediaVersions.HeadOrNone().Map(v => v.Duration),
@ -18,6 +19,10 @@ public static class MediaItemExtensions
_ => None _ => None
}; };
// zero duration is invalid, so return none in that case
return maybeDuration.Any(duration => duration == TimeSpan.Zero) ? Option<TimeSpan>.None : maybeDuration;
}
public static MediaVersion GetHeadVersion(this MediaItem mediaItem) => public static MediaVersion GetHeadVersion(this MediaItem mediaItem) =>
mediaItem switch mediaItem switch
{ {

2
ErsatzTV.Core/Scheduling/ChronologicalMediaCollectionEnumerator.cs

@ -15,7 +15,7 @@ public sealed class ChronologicalMediaCollectionEnumerator : IMediaCollectionEnu
{ {
_sortedMediaItems = mediaItems.OrderBy(identity, new ChronologicalMediaComparer()).ToList(); _sortedMediaItems = mediaItems.OrderBy(identity, new ChronologicalMediaComparer()).ToList();
_lazyMinimumDuration = new Lazy<Option<TimeSpan>>( _lazyMinimumDuration = new Lazy<Option<TimeSpan>>(
() => _sortedMediaItems.Bind(i => i.GetDuration()).OrderBy(identity).HeadOrNone()); () => _sortedMediaItems.Bind(i => i.GetNonZeroDuration()).OrderBy(identity).HeadOrNone());
State = new CollectionEnumeratorState { Seed = state.Seed }; State = new CollectionEnumeratorState { Seed = state.Seed };

2
ErsatzTV.Core/Scheduling/CustomOrderCollectionEnumerator.cs

@ -26,7 +26,7 @@ public class CustomOrderCollectionEnumerator : IMediaCollectionEnumerator
.Map(ci => mediaItems.First(mi => mi.Id == ci.MediaItemId)) .Map(ci => mediaItems.First(mi => mi.Id == ci.MediaItemId))
.ToList(); .ToList();
_lazyMinimumDuration = new Lazy<Option<TimeSpan>>( _lazyMinimumDuration = new Lazy<Option<TimeSpan>>(
() => _sortedMediaItems.Bind(i => i.GetDuration()).OrderBy(identity).HeadOrNone()); () => _sortedMediaItems.Bind(i => i.GetNonZeroDuration()).OrderBy(identity).HeadOrNone());
State = new CollectionEnumeratorState { Seed = state.Seed }; State = new CollectionEnumeratorState { Seed = state.Seed };
while (State.Index < state.Index) while (State.Index < state.Index)

2
ErsatzTV.Core/Scheduling/RandomizedMediaCollectionEnumerator.cs

@ -15,7 +15,7 @@ public class RandomizedMediaCollectionEnumerator : IMediaCollectionEnumerator
{ {
_mediaItems = mediaItems; _mediaItems = mediaItems;
_lazyMinimumDuration = _lazyMinimumDuration =
new Lazy<Option<TimeSpan>>(() => _mediaItems.Bind(i => i.GetDuration()).OrderBy(identity).HeadOrNone()); new Lazy<Option<TimeSpan>>(() => _mediaItems.Bind(i => i.GetNonZeroDuration()).OrderBy(identity).HeadOrNone());
_random = new Random(state.Seed); _random = new Random(state.Seed);
State = new CollectionEnumeratorState { Seed = state.Seed }; State = new CollectionEnumeratorState { Seed = state.Seed };

2
ErsatzTV.Core/Scheduling/SeasonEpisodeMediaCollectionEnumerator.cs

@ -15,7 +15,7 @@ public sealed class SeasonEpisodeMediaCollectionEnumerator : IMediaCollectionEnu
{ {
_sortedMediaItems = mediaItems.OrderBy(identity, new SeasonEpisodeMediaComparer()).ToList(); _sortedMediaItems = mediaItems.OrderBy(identity, new SeasonEpisodeMediaComparer()).ToList();
_lazyMinimumDuration = new Lazy<Option<TimeSpan>>( _lazyMinimumDuration = new Lazy<Option<TimeSpan>>(
() => _sortedMediaItems.Bind(i => i.GetDuration()).OrderBy(identity).HeadOrNone()); () => _sortedMediaItems.Bind(i => i.GetNonZeroDuration()).OrderBy(identity).HeadOrNone());
State = new CollectionEnumeratorState { Seed = state.Seed }; State = new CollectionEnumeratorState { Seed = state.Seed };

2
ErsatzTV.Core/Scheduling/ShuffleInOrderCollectionEnumerator.cs

@ -34,7 +34,7 @@ public class ShuffleInOrderCollectionEnumerator : IMediaCollectionEnumerator
_random = new Random(state.Seed); _random = new Random(state.Seed);
_shuffled = Shuffle(_collections, _random); _shuffled = Shuffle(_collections, _random);
_lazyMinimumDuration = _lazyMinimumDuration =
new Lazy<Option<TimeSpan>>(() => _shuffled.Bind(i => i.GetDuration()).OrderBy(identity).HeadOrNone()); new Lazy<Option<TimeSpan>>(() => _shuffled.Bind(i => i.GetNonZeroDuration()).OrderBy(identity).HeadOrNone());
State = new CollectionEnumeratorState { Seed = state.Seed }; State = new CollectionEnumeratorState { Seed = state.Seed };
while (State.Index < state.Index) while (State.Index < state.Index)

2
ErsatzTV.Core/Scheduling/ShuffledMediaCollectionEnumerator.cs

@ -31,7 +31,7 @@ public class ShuffledMediaCollectionEnumerator : IMediaCollectionEnumerator
_random = new CloneableRandom(state.Seed); _random = new CloneableRandom(state.Seed);
_shuffled = Shuffle(_mediaItems, _random); _shuffled = Shuffle(_mediaItems, _random);
_lazyMinimumDuration = _lazyMinimumDuration =
new Lazy<Option<TimeSpan>>(() => _shuffled.Bind(i => i.GetDuration()).OrderBy(identity).HeadOrNone()); new Lazy<Option<TimeSpan>>(() => _shuffled.Bind(i => i.GetNonZeroDuration()).OrderBy(identity).HeadOrNone());
State = new CollectionEnumeratorState { Seed = state.Seed }; State = new CollectionEnumeratorState { Seed = state.Seed };
while (State.Index < state.Index) while (State.Index < state.Index)

2
ErsatzTV.Infrastructure/Scheduling/MultiEpisodeShuffleCollectionEnumerator.cs

@ -78,7 +78,7 @@ public class MultiEpisodeShuffleCollectionEnumerator : IMediaCollectionEnumerato
_random = new CloneableRandom(state.Seed); _random = new CloneableRandom(state.Seed);
_shuffled = Shuffle(_random); _shuffled = Shuffle(_random);
_lazyMinimumDuration = _lazyMinimumDuration =
new Lazy<Option<TimeSpan>>(() => _shuffled.Bind(i => i.GetDuration()).OrderBy(identity).HeadOrNone()); new Lazy<Option<TimeSpan>>(() => _shuffled.Bind(i => i.GetNonZeroDuration()).OrderBy(identity).HeadOrNone());
State = new CollectionEnumeratorState { Seed = state.Seed }; State = new CollectionEnumeratorState { Seed = state.Seed };
while (State.Index < state.Index) while (State.Index < state.Index)

Loading…
Cancel
Save