@@ -203,7 +203,7 @@ jobs:
|
|||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: dotnet restore -r "${{ matrix.target }}"
|
run: dotnet restore -r "${{ matrix.target }}"
|
||||||
|
|
||||||
- uses: suisei-cn/actions-download-file@v1
|
- uses: suisei-cn/actions-download-file@v1.3.0
|
||||||
if: ${{ matrix.kind == 'windows' }}
|
if: ${{ matrix.kind == 'windows' }}
|
||||||
id: downloadffmpeg
|
id: downloadffmpeg
|
||||||
name: Download ffmpeg
|
name: Download ffmpeg
|
||||||
|
|||||||
@@ -15,6 +15,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
|
|||||||
- Fix fallback filler looping
|
- Fix fallback filler looping
|
||||||
- Fix bug where some libraries would never scan
|
- Fix bug where some libraries would never scan
|
||||||
- Fix filler ordering so post-roll is properly scheduled after padded mid-roll
|
- Fix filler ordering so post-roll is properly scheduled after padded mid-roll
|
||||||
|
- Fix pre/post-roll filler padding when used with mid-roll
|
||||||
|
- This caused overlapping schedule items, fallback filler that was too long, etc.
|
||||||
|
|
||||||
### Changed
|
### Changed
|
||||||
- Merge generated `Other Video` folder tags with tags from sidecar NFO
|
- Merge generated `Other Video` folder tags with tags from sidecar NFO
|
||||||
|
|||||||
@@ -12,7 +12,7 @@
|
|||||||
<PackageReference Include="Humanizer.Core" Version="2.14.1" />
|
<PackageReference Include="Humanizer.Core" Version="2.14.1" />
|
||||||
<PackageReference Include="MediatR" Version="11.1.0" />
|
<PackageReference Include="MediatR" Version="11.1.0" />
|
||||||
<PackageReference Include="Microsoft.Extensions.Caching.Abstractions" Version="7.0.0" />
|
<PackageReference Include="Microsoft.Extensions.Caching.Abstractions" Version="7.0.0" />
|
||||||
<PackageReference Include="Microsoft.VisualStudio.Threading.Analyzers" Version="17.4.33">
|
<PackageReference Include="Microsoft.VisualStudio.Threading.Analyzers" Version="17.5.22">
|
||||||
<PrivateAssets>all</PrivateAssets>
|
<PrivateAssets>all</PrivateAssets>
|
||||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||||
</PackageReference>
|
</PackageReference>
|
||||||
|
|||||||
@@ -10,14 +10,14 @@
|
|||||||
<PackageReference Include="Bugsnag" Version="3.1.0" />
|
<PackageReference Include="Bugsnag" Version="3.1.0" />
|
||||||
<PackageReference Include="CliWrap" Version="3.6.0" />
|
<PackageReference Include="CliWrap" Version="3.6.0" />
|
||||||
<PackageReference Include="FluentAssertions" Version="6.9.0" />
|
<PackageReference Include="FluentAssertions" Version="6.9.0" />
|
||||||
<PackageReference Include="LanguageExt.Core" Version="4.4.0" />
|
<PackageReference Include="LanguageExt.Core" Version="4.4.2" />
|
||||||
<PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="7.0.0" />
|
<PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="7.0.0" />
|
||||||
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="7.0.0" />
|
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="7.0.0" />
|
||||||
<PackageReference Include="Microsoft.Extensions.Logging" Version="7.0.0" />
|
<PackageReference Include="Microsoft.Extensions.Logging" Version="7.0.0" />
|
||||||
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="7.0.0" />
|
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="7.0.0" />
|
||||||
<PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="7.0.0" />
|
<PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="7.0.0" />
|
||||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.4.1" />
|
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.4.1" />
|
||||||
<PackageReference Include="Microsoft.VisualStudio.Threading.Analyzers" Version="17.4.33">
|
<PackageReference Include="Microsoft.VisualStudio.Threading.Analyzers" Version="17.5.22">
|
||||||
<PrivateAssets>all</PrivateAssets>
|
<PrivateAssets>all</PrivateAssets>
|
||||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||||
</PackageReference>
|
</PackageReference>
|
||||||
|
|||||||
@@ -460,6 +460,110 @@ public class PlayoutModeSchedulerBaseTests : SchedulerTestBase
|
|||||||
playoutItems[4].MediaItemId.Should().Be(5);
|
playoutItems[4].MediaItemId.Should().Be(5);
|
||||||
playoutItems[4].StartOffset.Should().Be(startState.CurrentTime + TimeSpan.FromMinutes(55));
|
playoutItems[4].StartOffset.Should().Be(startState.CurrentTime + TimeSpan.FromMinutes(55));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void Should_Schedule_Padded_Post_Roll_After_Mid_Roll_Count()
|
||||||
|
{
|
||||||
|
// content 45 min, mid roll 5 min, post roll pad to 60
|
||||||
|
// content + mid = 50 min, post roll will add two 5 min items
|
||||||
|
// content + mid + post = 60 min
|
||||||
|
|
||||||
|
Collection collectionOne = TwoItemCollection(1, 2, TimeSpan.FromMinutes(45));
|
||||||
|
Collection collectionTwo = TwoItemCollection(3, 4, TimeSpan.FromMinutes(5));
|
||||||
|
Collection collectionThree = TwoItemCollection(5, 6, TimeSpan.FromMinutes(5));
|
||||||
|
|
||||||
|
var scheduleItem = new ProgramScheduleItemOne
|
||||||
|
{
|
||||||
|
Id = 1,
|
||||||
|
Index = 1,
|
||||||
|
Collection = collectionOne,
|
||||||
|
CollectionId = collectionOne.Id,
|
||||||
|
StartTime = null,
|
||||||
|
PlaybackOrder = PlaybackOrder.Chronological,
|
||||||
|
TailFiller = null,
|
||||||
|
FallbackFiller = null,
|
||||||
|
MidRollFiller = new FillerPreset
|
||||||
|
{
|
||||||
|
FillerKind = FillerKind.MidRoll,
|
||||||
|
FillerMode = FillerMode.Count,
|
||||||
|
Count = 1,
|
||||||
|
CollectionId = 2,
|
||||||
|
Collection = collectionTwo
|
||||||
|
},
|
||||||
|
PostRollFiller = new FillerPreset
|
||||||
|
{
|
||||||
|
FillerKind = FillerKind.PostRoll,
|
||||||
|
FillerMode = FillerMode.Pad,
|
||||||
|
PadToNearestMinute = 60,
|
||||||
|
CollectionId = 3,
|
||||||
|
Collection = collectionThree
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
var scheduleItemsEnumerator = new OrderedScheduleItemsEnumerator(
|
||||||
|
new List<ProgramScheduleItem> { scheduleItem },
|
||||||
|
new CollectionEnumeratorState());
|
||||||
|
|
||||||
|
var enumerator = new ChronologicalMediaCollectionEnumerator(
|
||||||
|
collectionOne.MediaItems,
|
||||||
|
new CollectionEnumeratorState());
|
||||||
|
|
||||||
|
var midRollFillerEnumerator = new ChronologicalMediaCollectionEnumerator(
|
||||||
|
collectionTwo.MediaItems,
|
||||||
|
new CollectionEnumeratorState());
|
||||||
|
|
||||||
|
var postRollFillerEnumerator = new ChronologicalMediaCollectionEnumerator(
|
||||||
|
collectionThree.MediaItems,
|
||||||
|
new CollectionEnumeratorState());
|
||||||
|
|
||||||
|
PlayoutBuilderState startState = StartState(scheduleItemsEnumerator);
|
||||||
|
|
||||||
|
Dictionary<CollectionKey, IMediaCollectionEnumerator> enumerators = CollectionEnumerators(
|
||||||
|
scheduleItem,
|
||||||
|
enumerator);
|
||||||
|
|
||||||
|
enumerators.Add(CollectionKey.ForFillerPreset(scheduleItem.MidRollFiller), midRollFillerEnumerator);
|
||||||
|
enumerators.Add(CollectionKey.ForFillerPreset(scheduleItem.PostRollFiller), postRollFillerEnumerator);
|
||||||
|
|
||||||
|
List<PlayoutItem> playoutItems = Scheduler()
|
||||||
|
.AddFiller(
|
||||||
|
startState,
|
||||||
|
enumerators,
|
||||||
|
scheduleItem,
|
||||||
|
new PlayoutItem
|
||||||
|
{
|
||||||
|
MediaItemId = 1,
|
||||||
|
Start = startState.CurrentTime.UtcDateTime,
|
||||||
|
Finish = startState.CurrentTime.AddHours(1).UtcDateTime
|
||||||
|
},
|
||||||
|
new List<MediaChapter>
|
||||||
|
{
|
||||||
|
new() { StartTime = TimeSpan.Zero, EndTime = TimeSpan.FromMinutes(6) },
|
||||||
|
new() { StartTime = TimeSpan.FromMinutes(6), EndTime = TimeSpan.FromMinutes(45) }
|
||||||
|
});
|
||||||
|
|
||||||
|
playoutItems.Count.Should().Be(5);
|
||||||
|
|
||||||
|
// content chapter 1
|
||||||
|
playoutItems[0].MediaItemId.Should().Be(1);
|
||||||
|
playoutItems[0].StartOffset.Should().Be(startState.CurrentTime);
|
||||||
|
|
||||||
|
// mid-roll 1
|
||||||
|
playoutItems[1].MediaItemId.Should().Be(3);
|
||||||
|
playoutItems[1].StartOffset.Should().Be(startState.CurrentTime + TimeSpan.FromMinutes(6));
|
||||||
|
|
||||||
|
// content chapter 2
|
||||||
|
playoutItems[2].MediaItemId.Should().Be(1);
|
||||||
|
playoutItems[2].StartOffset.Should().Be(startState.CurrentTime + TimeSpan.FromMinutes(11));
|
||||||
|
|
||||||
|
// post-roll 1
|
||||||
|
playoutItems[3].MediaItemId.Should().Be(5);
|
||||||
|
playoutItems[3].StartOffset.Should().Be(startState.CurrentTime + TimeSpan.FromMinutes(50));
|
||||||
|
|
||||||
|
// post-roll 2
|
||||||
|
playoutItems[4].MediaItemId.Should().Be(6);
|
||||||
|
playoutItems[4].StartOffset.Should().Be(startState.CurrentTime + TimeSpan.FromMinutes(55));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
[TestFixture]
|
[TestFixture]
|
||||||
|
|||||||
@@ -10,15 +10,15 @@
|
|||||||
<PackageReference Include="Bugsnag" Version="3.1.0" />
|
<PackageReference Include="Bugsnag" Version="3.1.0" />
|
||||||
<PackageReference Include="Destructurama.Attributed" Version="3.0.0" />
|
<PackageReference Include="Destructurama.Attributed" Version="3.0.0" />
|
||||||
<PackageReference Include="Flurl" Version="3.0.7" />
|
<PackageReference Include="Flurl" Version="3.0.7" />
|
||||||
<PackageReference Include="LanguageExt.Core" Version="4.4.0" />
|
<PackageReference Include="LanguageExt.Core" Version="4.4.2" />
|
||||||
<PackageReference Include="LanguageExt.Transformers" Version="4.4.0" />
|
<PackageReference Include="LanguageExt.Transformers" Version="4.4.2" />
|
||||||
<PackageReference Include="MediatR" Version="11.1.0" />
|
<PackageReference Include="MediatR" Version="11.1.0" />
|
||||||
<PackageReference Include="Microsoft.Extensions.Caching.Abstractions" Version="7.0.0" />
|
<PackageReference Include="Microsoft.Extensions.Caching.Abstractions" Version="7.0.0" />
|
||||||
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="7.0.0" />
|
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="7.0.0" />
|
||||||
<PackageReference Include="Microsoft.Extensions.Http" Version="7.0.0" />
|
<PackageReference Include="Microsoft.Extensions.Http" Version="7.0.0" />
|
||||||
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="7.0.0" />
|
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="7.0.0" />
|
||||||
<PackageReference Include="Microsoft.IO.RecyclableMemoryStream" Version="2.2.1" />
|
<PackageReference Include="Microsoft.IO.RecyclableMemoryStream" Version="2.3.1" />
|
||||||
<PackageReference Include="Microsoft.VisualStudio.Threading.Analyzers" Version="17.4.33">
|
<PackageReference Include="Microsoft.VisualStudio.Threading.Analyzers" Version="17.5.22">
|
||||||
<PrivateAssets>all</PrivateAssets>
|
<PrivateAssets>all</PrivateAssets>
|
||||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||||
</PackageReference>
|
</PackageReference>
|
||||||
|
|||||||
@@ -461,10 +461,14 @@ public abstract class PlayoutModeSchedulerBase<T> : IPlayoutModeScheduler<T> whe
|
|||||||
foreach (FillerPreset padFiller in Optional(
|
foreach (FillerPreset padFiller in Optional(
|
||||||
allFiller.FirstOrDefault(f => f.FillerMode == FillerMode.Pad && f.PadToNearestMinute.HasValue)))
|
allFiller.FirstOrDefault(f => f.FillerMode == FillerMode.Pad && f.PadToNearestMinute.HasValue)))
|
||||||
{
|
{
|
||||||
var totalDuration =
|
var totalDuration = TimeSpan.FromMilliseconds(result.Sum(pi => (pi.Finish - pi.Start).TotalMilliseconds));
|
||||||
TimeSpan.FromMilliseconds(
|
|
||||||
result.Sum(pi => (pi.Finish - pi.Start).TotalMilliseconds) +
|
// add primary content to totalDuration only if it hasn't already been added
|
||||||
|
if (result.All(pi => pi.MediaItemId != playoutItem.MediaItemId))
|
||||||
|
{
|
||||||
|
totalDuration += TimeSpan.FromMilliseconds(
|
||||||
effectiveChapters.Sum(c => (c.EndTime - c.StartTime).TotalMilliseconds));
|
effectiveChapters.Sum(c => (c.EndTime - c.StartTime).TotalMilliseconds));
|
||||||
|
}
|
||||||
|
|
||||||
int currentMinute = (playoutItem.StartOffset + totalDuration).Minute;
|
int currentMinute = (playoutItem.StartOffset + totalDuration).Minute;
|
||||||
// ReSharper disable once PossibleInvalidOperationException
|
// ReSharper disable once PossibleInvalidOperationException
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="CliWrap" Version="3.6.0" />
|
<PackageReference Include="CliWrap" Version="3.6.0" />
|
||||||
<PackageReference Include="LanguageExt.Core" Version="4.4.0" />
|
<PackageReference Include="LanguageExt.Core" Version="4.4.2" />
|
||||||
<PackageReference Include="Microsoft.Extensions.Caching.Abstractions" Version="7.0.0" />
|
<PackageReference Include="Microsoft.Extensions.Caching.Abstractions" Version="7.0.0" />
|
||||||
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="7.0.0" />
|
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="7.0.0" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|||||||
@@ -21,14 +21,14 @@
|
|||||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||||
</PackageReference>
|
</PackageReference>
|
||||||
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="7.0.2" />
|
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="7.0.2" />
|
||||||
<PackageReference Include="Microsoft.VisualStudio.Threading.Analyzers" Version="17.4.33">
|
<PackageReference Include="Microsoft.VisualStudio.Threading.Analyzers" Version="17.5.22">
|
||||||
<PrivateAssets>all</PrivateAssets>
|
<PrivateAssets>all</PrivateAssets>
|
||||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||||
</PackageReference>
|
</PackageReference>
|
||||||
<PackageReference Include="Refit" Version="6.3.2" />
|
<PackageReference Include="Refit" Version="6.3.2" />
|
||||||
<PackageReference Include="Refit.Newtonsoft.Json" Version="6.3.2" />
|
<PackageReference Include="Refit.Newtonsoft.Json" Version="6.3.2" />
|
||||||
<PackageReference Include="Refit.Xml" Version="6.3.2" />
|
<PackageReference Include="Refit.Xml" Version="6.3.2" />
|
||||||
<PackageReference Include="Scriban.Signed" Version="5.5.2" />
|
<PackageReference Include="Scriban.Signed" Version="5.6.0" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|||||||
@@ -10,7 +10,7 @@
|
|||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="FluentAssertions" Version="6.9.0" />
|
<PackageReference Include="FluentAssertions" Version="6.9.0" />
|
||||||
<PackageReference Include="LanguageExt.Core" Version="4.4.0" />
|
<PackageReference Include="LanguageExt.Core" Version="4.4.2" />
|
||||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.4.1" />
|
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.4.1" />
|
||||||
<PackageReference Include="Moq" Version="4.18.4" />
|
<PackageReference Include="Moq" Version="4.18.4" />
|
||||||
<PackageReference Include="NUnit" Version="3.13.3" />
|
<PackageReference Include="NUnit" Version="3.13.3" />
|
||||||
|
|||||||
@@ -17,7 +17,7 @@
|
|||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="CliWrap" Version="3.6.0" />
|
<PackageReference Include="CliWrap" Version="3.6.0" />
|
||||||
<PackageReference Include="Humanizer.Core" Version="2.14.1" />
|
<PackageReference Include="Humanizer.Core" Version="2.14.1" />
|
||||||
<PackageReference Include="LanguageExt.Core" Version="4.4.0" />
|
<PackageReference Include="LanguageExt.Core" Version="4.4.2" />
|
||||||
<PackageReference Include="MediatR" Version="11.1.0" />
|
<PackageReference Include="MediatR" Version="11.1.0" />
|
||||||
<PackageReference Include="MediatR.Extensions.Microsoft.DependencyInjection" Version="11.0.0" />
|
<PackageReference Include="MediatR.Extensions.Microsoft.DependencyInjection" Version="11.0.0" />
|
||||||
<PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="7.0.0" />
|
<PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="7.0.0" />
|
||||||
|
|||||||
@@ -57,7 +57,7 @@
|
|||||||
<PackageReference Include="FluentValidation" Version="11.4.0" />
|
<PackageReference Include="FluentValidation" Version="11.4.0" />
|
||||||
<PackageReference Include="FluentValidation.AspNetCore" Version="11.2.2" />
|
<PackageReference Include="FluentValidation.AspNetCore" Version="11.2.2" />
|
||||||
<PackageReference Include="HtmlSanitizer" Version="8.0.645" />
|
<PackageReference Include="HtmlSanitizer" Version="8.0.645" />
|
||||||
<PackageReference Include="LanguageExt.Core" Version="4.4.0" />
|
<PackageReference Include="LanguageExt.Core" Version="4.4.2" />
|
||||||
<PackageReference Include="Markdig" Version="0.30.4" />
|
<PackageReference Include="Markdig" Version="0.30.4" />
|
||||||
<PackageReference Include="MediatR.Courier.DependencyInjection" Version="5.0.0" />
|
<PackageReference Include="MediatR.Courier.DependencyInjection" Version="5.0.0" />
|
||||||
<PackageReference Include="MediatR.Extensions.Microsoft.DependencyInjection" Version="11.0.0" />
|
<PackageReference Include="MediatR.Extensions.Microsoft.DependencyInjection" Version="11.0.0" />
|
||||||
@@ -68,7 +68,7 @@
|
|||||||
<PrivateAssets>all</PrivateAssets>
|
<PrivateAssets>all</PrivateAssets>
|
||||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||||
</PackageReference>
|
</PackageReference>
|
||||||
<PackageReference Include="Microsoft.VisualStudio.Threading.Analyzers" Version="17.4.33">
|
<PackageReference Include="Microsoft.VisualStudio.Threading.Analyzers" Version="17.5.22">
|
||||||
<PrivateAssets>all</PrivateAssets>
|
<PrivateAssets>all</PrivateAssets>
|
||||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||||
</PackageReference>
|
</PackageReference>
|
||||||
|
|||||||
Reference in New Issue
Block a user