fix bug scheduling duration filler (#1510)
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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 };
|
||||||
|
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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 };
|
||||||
|
|||||||
@@ -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 };
|
||||||
|
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user