Browse Source

upgrade to dotnet 10 (#2667)

* upgrade to dotnet 10

* remove packages that would be pruned

* properly fix tests
pull/2668/head
Jason Dove 1 month ago committed by GitHub
parent
commit
6c635a4be9
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 4
      .config/dotnet-tools.json
  2. 6
      .github/workflows/artifacts.yml
  3. 6
      .github/workflows/pr.yml
  4. 1
      CHANGELOG.md
  5. 8
      ErsatzTV.Application/ErsatzTV.Application.csproj
  6. 14
      ErsatzTV.Core.Tests/ErsatzTV.Core.Tests.csproj
  7. 12
      ErsatzTV.Core/ErsatzTV.Core.csproj
  8. 6
      ErsatzTV.FFmpeg.Tests/ErsatzTV.FFmpeg.Tests.csproj
  9. 6
      ErsatzTV.FFmpeg/ErsatzTV.FFmpeg.csproj
  10. 2
      ErsatzTV.Infrastructure.MySql/ErsatzTV.Infrastructure.MySql.csproj
  11. 2
      ErsatzTV.Infrastructure.Sqlite/ErsatzTV.Infrastructure.Sqlite.csproj
  12. 2
      ErsatzTV.Infrastructure.Tests/ErsatzTV.Infrastructure.Tests.csproj
  13. 9
      ErsatzTV.Infrastructure/ErsatzTV.Infrastructure.csproj
  14. 14
      ErsatzTV.Scanner.Tests/Core/Metadata/LocalSubtitlesProviderTests.cs
  15. 2
      ErsatzTV.Scanner.Tests/ErsatzTV.Scanner.Tests.csproj
  16. 18
      ErsatzTV.Scanner/Core/Metadata/LocalSubtitlesProvider.cs
  17. 10
      ErsatzTV.Scanner/ErsatzTV.Scanner.csproj
  18. 3
      ErsatzTV/ErsatzTV.csproj
  19. 2
      ErsatzTV/Startup.cs
  20. 4
      docker/Dockerfile
  21. 4
      docker/arm32v7/Dockerfile
  22. 4
      docker/arm64/Dockerfile
  23. 2
      global.json

4
.config/dotnet-tools.json

@ -3,11 +3,11 @@
"isRoot": true, "isRoot": true,
"tools": { "tools": {
"jetbrains.resharper.globaltools": { "jetbrains.resharper.globaltools": {
"version": "2025.3.0", "version": "2025.3.0.2",
"commands": [ "commands": [
"jb" "jb"
], ],
"rollForward": false "rollForward": false
} }
} }
} }

6
.github/workflows/artifacts.yml

@ -48,7 +48,7 @@ jobs:
- name: Setup dotnet - name: Setup dotnet
uses: actions/setup-dotnet@v4 uses: actions/setup-dotnet@v4
with: with:
dotnet-version: 9.0.203 dotnet-version: '10.0.x'
- name: Clean - name: Clean
run: dotnet clean --configuration Release && dotnet nuget locals all --clear run: dotnet clean --configuration Release && dotnet nuget locals all --clear
@ -163,7 +163,7 @@ jobs:
- name: Setup dotnet - name: Setup dotnet
uses: actions/setup-dotnet@v4 uses: actions/setup-dotnet@v4
with: with:
dotnet-version: 9.0.203 dotnet-version: '10.0.x'
- name: Clean - name: Clean
run: dotnet clean --configuration Release && dotnet nuget locals all --clear run: dotnet clean --configuration Release && dotnet nuget locals all --clear
@ -220,7 +220,7 @@ jobs:
- name: Setup dotnet - name: Setup dotnet
uses: actions/setup-dotnet@v4 uses: actions/setup-dotnet@v4
with: with:
dotnet-version: 9.0.203 dotnet-version: '10.0.x'
- name: Clean - name: Clean
run: dotnet clean --configuration Release && dotnet nuget locals all --clear run: dotnet clean --configuration Release && dotnet nuget locals all --clear

6
.github/workflows/pr.yml

@ -11,7 +11,7 @@ jobs:
- name: Setup dotnet - name: Setup dotnet
uses: actions/setup-dotnet@v4 uses: actions/setup-dotnet@v4
with: with:
dotnet-version: 9.0.203 dotnet-version: '10.0.x'
- name: Clean - name: Clean
run: dotnet clean --configuration Release && dotnet nuget locals all --clear run: dotnet clean --configuration Release && dotnet nuget locals all --clear
@ -52,7 +52,7 @@ jobs:
- name: Setup dotnet - name: Setup dotnet
uses: actions/setup-dotnet@v4 uses: actions/setup-dotnet@v4
with: with:
dotnet-version: 9.0.203 dotnet-version: '10.0.x'
- name: Clean - name: Clean
run: dotnet clean --configuration Release && dotnet nuget locals all --clear run: dotnet clean --configuration Release && dotnet nuget locals all --clear
@ -80,7 +80,7 @@ jobs:
- name: Setup dotnet - name: Setup dotnet
uses: actions/setup-dotnet@v4 uses: actions/setup-dotnet@v4
with: with:
dotnet-version: 9.0.203 dotnet-version: '10.0.x'
- name: Clean - name: Clean
run: dotnet clean --configuration Release && dotnet nuget locals all --clear run: dotnet clean --configuration Release && dotnet nuget locals all --clear

1
CHANGELOG.md

@ -103,6 +103,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
- Template groups in template list - Template groups in template list
- Block groups and blocks in template editor - Block groups and blocks in template editor
- Replace template tree view with searchable table (like blocks) - Replace template tree view with searchable table (like blocks)
- Upgrade to dotnet 10
## [25.8.0] - 2025-10-26 ## [25.8.0] - 2025-10-26
### Added ### Added

8
ErsatzTV.Application/ErsatzTV.Application.csproj

@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<TargetFramework>net9.0</TargetFramework> <TargetFramework>net10.0</TargetFramework>
<NoWarn>VSTHRD200</NoWarn> <NoWarn>VSTHRD200</NoWarn>
<ImplicitUsings>enable</ImplicitUsings> <ImplicitUsings>enable</ImplicitUsings>
<AnalysisLevel>latest-Recommended</AnalysisLevel> <AnalysisLevel>latest-Recommended</AnalysisLevel>
@ -12,10 +12,10 @@
<ItemGroup> <ItemGroup>
<PackageReference Include="Bugsnag" Version="4.1.0" /> <PackageReference Include="Bugsnag" Version="4.1.0" />
<PackageReference Include="CliWrap" Version="3.10.0" /> <PackageReference Include="CliWrap" Version="3.10.0" />
<PackageReference Include="Humanizer.Core" Version="2.14.1" /> <PackageReference Include="Humanizer.Core" Version="3.0.1" />
<PackageReference Include="MediatR" Version="[12.5.0]" /> <PackageReference Include="MediatR" Version="[12.5.0]" />
<PackageReference Include="Microsoft.Extensions.Caching.Abstractions" Version="9.0.11" /> <PackageReference Include="Microsoft.Extensions.Caching.Abstractions" Version="10.0.0" />
<PackageReference Include="Microsoft.Extensions.Hosting.Abstractions" Version="9.0.11" /> <PackageReference Include="Microsoft.Extensions.Hosting.Abstractions" Version="10.0.0" />
<PackageReference Include="Microsoft.VisualStudio.Threading.Analyzers" Version="17.14.15"> <PackageReference Include="Microsoft.VisualStudio.Threading.Analyzers" Version="17.14.15">
<PrivateAssets>all</PrivateAssets> <PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>

14
ErsatzTV.Core.Tests/ErsatzTV.Core.Tests.csproj

@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<TargetFramework>net9.0</TargetFramework> <TargetFramework>net10.0</TargetFramework>
<NoWarn>VSTHRD200</NoWarn> <NoWarn>VSTHRD200</NoWarn>
<ImplicitUsings>enable</ImplicitUsings> <ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup> </PropertyGroup>
@ -10,11 +10,11 @@
<PackageReference Include="Bugsnag" Version="4.1.0" /> <PackageReference Include="Bugsnag" Version="4.1.0" />
<PackageReference Include="CliWrap" Version="3.10.0" /> <PackageReference Include="CliWrap" Version="3.10.0" />
<PackageReference Include="LanguageExt.Core" Version="4.4.9" /> <PackageReference Include="LanguageExt.Core" Version="4.4.9" />
<PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="9.0.11" /> <PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="10.0.0" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="9.0.11" /> <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="10.0.0" />
<PackageReference Include="Microsoft.Extensions.Logging" Version="9.0.11" /> <PackageReference Include="Microsoft.Extensions.Logging" Version="10.0.0" />
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="9.0.11" /> <PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="10.0.0" />
<PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="9.0.11" /> <PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="10.0.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="18.0.1" /> <PackageReference Include="Microsoft.NET.Test.Sdk" Version="18.0.1" />
<PackageReference Include="Microsoft.VisualStudio.Threading.Analyzers" Version="17.14.15"> <PackageReference Include="Microsoft.VisualStudio.Threading.Analyzers" Version="17.14.15">
<PrivateAssets>all</PrivateAssets> <PrivateAssets>all</PrivateAssets>
@ -24,7 +24,7 @@
<PackageReference Include="NUnit" Version="4.4.0" /> <PackageReference Include="NUnit" Version="4.4.0" />
<PackageReference Include="NUnit3TestAdapter" Version="5.2.0" /> <PackageReference Include="NUnit3TestAdapter" Version="5.2.0" />
<PackageReference Include="Serilog" Version="4.3.0" /> <PackageReference Include="Serilog" Version="4.3.0" />
<PackageReference Include="Serilog.Extensions.Logging" Version="9.0.2" /> <PackageReference Include="Serilog.Extensions.Logging" Version="10.0.0" />
<PackageReference Include="Serilog.Sinks.Debug" Version="3.0.0" /> <PackageReference Include="Serilog.Sinks.Debug" Version="3.0.0" />
<PackageReference Include="Shouldly" Version="4.3.0" /> <PackageReference Include="Shouldly" Version="4.3.0" />
<PackageReference Include="Testably.Abstractions.Testing" Version="5.0.0" /> <PackageReference Include="Testably.Abstractions.Testing" Version="5.0.0" />

12
ErsatzTV.Core/ErsatzTV.Core.csproj

@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<TargetFramework>net9.0</TargetFramework> <TargetFramework>net10.0</TargetFramework>
<NoWarn>VSTHRD200</NoWarn> <NoWarn>VSTHRD200</NoWarn>
<ImplicitUsings>enable</ImplicitUsings> <ImplicitUsings>enable</ImplicitUsings>
<AnalysisLevel>latest-Recommended</AnalysisLevel> <AnalysisLevel>latest-Recommended</AnalysisLevel>
@ -12,14 +12,14 @@
<PackageReference Include="Bugsnag" Version="4.1.0" /> <PackageReference Include="Bugsnag" Version="4.1.0" />
<PackageReference Include="Destructurama.Attributed" Version="5.1.0" /> <PackageReference Include="Destructurama.Attributed" Version="5.1.0" />
<PackageReference Include="Flurl" Version="4.0.0" /> <PackageReference Include="Flurl" Version="4.0.0" />
<PackageReference Include="Humanizer.Core" Version="2.14.1" /> <PackageReference Include="Humanizer.Core" Version="3.0.1" />
<PackageReference Include="LanguageExt.Core" Version="4.4.9" /> <PackageReference Include="LanguageExt.Core" Version="4.4.9" />
<PackageReference Include="LanguageExt.Transformers" Version="4.4.8" /> <PackageReference Include="LanguageExt.Transformers" Version="4.4.8" />
<PackageReference Include="MediatR" Version="[12.5.0]" /> <PackageReference Include="MediatR" Version="[12.5.0]" />
<PackageReference Include="Microsoft.Extensions.Caching.Abstractions" Version="9.0.11" /> <PackageReference Include="Microsoft.Extensions.Caching.Abstractions" Version="10.0.0" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="9.0.11" /> <PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="10.0.0" />
<PackageReference Include="Microsoft.Extensions.Http" Version="9.0.11" /> <PackageReference Include="Microsoft.Extensions.Http" Version="10.0.0" />
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="9.0.11" /> <PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="10.0.0" />
<PackageReference Include="Microsoft.IO.RecyclableMemoryStream" Version="3.0.1" /> <PackageReference Include="Microsoft.IO.RecyclableMemoryStream" Version="3.0.1" />
<PackageReference Include="Microsoft.VisualStudio.Threading.Analyzers" Version="17.14.15"> <PackageReference Include="Microsoft.VisualStudio.Threading.Analyzers" Version="17.14.15">
<PrivateAssets>all</PrivateAssets> <PrivateAssets>all</PrivateAssets>

6
ErsatzTV.FFmpeg.Tests/ErsatzTV.FFmpeg.Tests.csproj

@ -1,21 +1,19 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<TargetFramework>net9.0</TargetFramework> <TargetFramework>net10.0</TargetFramework>
<Nullable>enable</Nullable> <Nullable>enable</Nullable>
<IsPackable>false</IsPackable> <IsPackable>false</IsPackable>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="9.0.11" /> <PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="10.0.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="18.0.1" /> <PackageReference Include="Microsoft.NET.Test.Sdk" Version="18.0.1" />
<PackageReference Include="NSubstitute" Version="5.3.0" /> <PackageReference Include="NSubstitute" Version="5.3.0" />
<PackageReference Include="NUnit" Version="4.4.0" /> <PackageReference Include="NUnit" Version="4.4.0" />
<PackageReference Include="NUnit3TestAdapter" Version="5.2.0" /> <PackageReference Include="NUnit3TestAdapter" Version="5.2.0" />
<PackageReference Include="Shouldly" Version="4.3.0" /> <PackageReference Include="Shouldly" Version="4.3.0" />
<PackageReference Include="System.IO.FileSystem.Primitives" Version="4.3.0" />
<PackageReference Include="System.Text.Encoding.Extensions" Version="4.3.0" />
<PackageReference Include="coverlet.collector" Version="6.0.4"> <PackageReference Include="coverlet.collector" Version="6.0.4">
<PrivateAssets>all</PrivateAssets> <PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>

6
ErsatzTV.FFmpeg/ErsatzTV.FFmpeg.csproj

@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<TargetFramework>net9.0</TargetFramework> <TargetFramework>net10.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings> <ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable> <Nullable>enable</Nullable>
<AnalysisLevel>latest-Recommended</AnalysisLevel> <AnalysisLevel>latest-Recommended</AnalysisLevel>
@ -14,8 +14,8 @@
<PackageReference Include="Hardware.Info" Version="101.1.0.1" /> <PackageReference Include="Hardware.Info" Version="101.1.0.1" />
<PackageReference Include="LanguageExt.Core" Version="4.4.9" /> <PackageReference Include="LanguageExt.Core" Version="4.4.9" />
<PackageReference Include="Lennox.NvEncSharp" Version="2.0.0" /> <PackageReference Include="Lennox.NvEncSharp" Version="2.0.0" />
<PackageReference Include="Microsoft.Extensions.Caching.Abstractions" Version="9.0.11" /> <PackageReference Include="Microsoft.Extensions.Caching.Abstractions" Version="10.0.0" />
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="9.0.11" /> <PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="10.0.0" />
</ItemGroup> </ItemGroup>

2
ErsatzTV.Infrastructure.MySql/ErsatzTV.Infrastructure.MySql.csproj

@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<TargetFramework>net9.0</TargetFramework> <TargetFramework>net10.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings> <ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable> <Nullable>enable</Nullable>
</PropertyGroup> </PropertyGroup>

2
ErsatzTV.Infrastructure.Sqlite/ErsatzTV.Infrastructure.Sqlite.csproj

@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<TargetFramework>net9.0</TargetFramework> <TargetFramework>net10.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings> <ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable> <Nullable>enable</Nullable>
</PropertyGroup> </PropertyGroup>

2
ErsatzTV.Infrastructure.Tests/ErsatzTV.Infrastructure.Tests.csproj

@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<TargetFramework>net9.0</TargetFramework> <TargetFramework>net10.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings> <ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable> <Nullable>enable</Nullable>

9
ErsatzTV.Infrastructure/ErsatzTV.Infrastructure.csproj

@ -1,12 +1,13 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<TargetFramework>net9.0</TargetFramework> <TargetFramework>net10.0</TargetFramework>
<GenerateRuntimeConfigurationFiles>true</GenerateRuntimeConfigurationFiles> <GenerateRuntimeConfigurationFiles>true</GenerateRuntimeConfigurationFiles>
<NoWarn>VSTHRD200</NoWarn> <NoWarn>VSTHRD200</NoWarn>
<ImplicitUsings>enable</ImplicitUsings> <ImplicitUsings>enable</ImplicitUsings>
<AnalysisLevel>latest-Recommended</AnalysisLevel> <AnalysisLevel>latest-Recommended</AnalysisLevel>
<TreatWarningsAsErrors>true</TreatWarningsAsErrors> <TreatWarningsAsErrors>true</TreatWarningsAsErrors>
<DockerDefaultTargetOS>Linux</DockerDefaultTargetOS>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
@ -52,4 +53,10 @@
</AssemblyAttribute> </AssemblyAttribute>
</ItemGroup> </ItemGroup>
<ItemGroup>
<Content Include="..\.dockerignore">
<Link>.dockerignore</Link>
</Content>
</ItemGroup>
</Project> </Project>

14
ErsatzTV.Scanner.Tests/Core/Metadata/LocalSubtitlesProviderTests.cs

@ -28,8 +28,6 @@ public class LocalSubtitlesProviderTests
// Avatar (2009).de.srt // Avatar (2009).de.srt
// Avatar (2009).de.sdh.forced.srt // Avatar (2009).de.sdh.forced.srt
private readonly string _prefix = OperatingSystem.IsWindows() ? "C:\\" : "/";
[Test] [Test]
public void Should_Find_All_Languages_Codecs_And_Flags_With_Full_Paths() public void Should_Find_All_Languages_Codecs_And_Flags_With_Full_Paths()
{ {
@ -52,7 +50,7 @@ public class LocalSubtitlesProviderTests
new(@"/Movies/Avatar (2009)/Avatar (2009).DE.SDH.FORCED.SRT") new(@"/Movies/Avatar (2009)/Avatar (2009).DE.SDH.FORCED.SRT")
}; };
var fileSystem = new MockFileSystem(); var fileSystem = new MockFileSystem(o => o.SimulatingOperatingSystem(SimulationMode.Linux));
IFileSystemInitializer<MockFileSystem> init = fileSystem.Initialize(); IFileSystemInitializer<MockFileSystem> init = fileSystem.Initialize();
foreach (var file in fakeFiles) foreach (var file in fakeFiles)
{ {
@ -62,6 +60,7 @@ public class LocalSubtitlesProviderTests
var provider = new LocalSubtitlesProvider( var provider = new LocalSubtitlesProvider(
Substitute.For<IMediaItemRepository>(), Substitute.For<IMediaItemRepository>(),
Substitute.For<IMetadataRepository>(), Substitute.For<IMetadataRepository>(),
fileSystem,
new LocalFileSystem(fileSystem, Substitute.For<IClient>(), Substitute.For<ILogger<LocalFileSystem>>()), new LocalFileSystem(fileSystem, Substitute.For<IClient>(), Substitute.For<ILogger<LocalFileSystem>>()),
Substitute.For<ILogger<LocalSubtitlesProvider>>()); Substitute.For<ILogger<LocalSubtitlesProvider>>());
@ -78,8 +77,7 @@ public class LocalSubtitlesProviderTests
result.Count(s => s.Codec == "subrip").ShouldBe(4); result.Count(s => s.Codec == "subrip").ShouldBe(4);
result.Count(s => s.Codec == "ass").ShouldBe(1); result.Count(s => s.Codec == "ass").ShouldBe(1);
string path = Path.Combine(_prefix, "Movies", "Avatar (2009)"); result.All(s => s.Path.Contains("/Movies/Avatar (2009)")).ShouldBeTrue();
result.All(s => s.Path.Contains(path)).ShouldBeTrue();
} }
[Test] [Test]
@ -106,7 +104,7 @@ public class LocalSubtitlesProviderTests
new(@"/Movies/Avatar (2009)/Avatar (2009).DE.SDH.FORCED.SRT") new(@"/Movies/Avatar (2009)/Avatar (2009).DE.SDH.FORCED.SRT")
}; };
var fileSystem = new MockFileSystem(); var fileSystem = new MockFileSystem(o => o.SimulatingOperatingSystem(SimulationMode.Linux));
IFileSystemInitializer<MockFileSystem> init = fileSystem.Initialize(); IFileSystemInitializer<MockFileSystem> init = fileSystem.Initialize();
foreach (var file in fakeFiles) foreach (var file in fakeFiles)
{ {
@ -116,6 +114,7 @@ public class LocalSubtitlesProviderTests
var provider = new LocalSubtitlesProvider( var provider = new LocalSubtitlesProvider(
Substitute.For<IMediaItemRepository>(), Substitute.For<IMediaItemRepository>(),
Substitute.For<IMetadataRepository>(), Substitute.For<IMetadataRepository>(),
fileSystem,
new LocalFileSystem(fileSystem, Substitute.For<IClient>(), Substitute.For<ILogger<LocalFileSystem>>()), new LocalFileSystem(fileSystem, Substitute.For<IClient>(), Substitute.For<ILogger<LocalFileSystem>>()),
Substitute.For<ILogger<LocalSubtitlesProvider>>()); Substitute.For<ILogger<LocalSubtitlesProvider>>());
@ -132,7 +131,6 @@ public class LocalSubtitlesProviderTests
result.Count(s => s.Codec == "subrip").ShouldBe(5); result.Count(s => s.Codec == "subrip").ShouldBe(5);
result.Count(s => s.Codec == "ass").ShouldBe(2); result.Count(s => s.Codec == "ass").ShouldBe(2);
string path = Path.Combine(_prefix, "Movies", "Avatar (2009)"); result.Count(s => s.Path.Contains("/Movies/Avatar (2009)")).ShouldBe(0);
result.Count(s => s.Path.Contains(path)).ShouldBe(0);
} }
} }

2
ErsatzTV.Scanner.Tests/ErsatzTV.Scanner.Tests.csproj

@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<TargetFramework>net9.0</TargetFramework> <TargetFramework>net10.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings> <ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable> <Nullable>enable</Nullable>

18
ErsatzTV.Scanner/Core/Metadata/LocalSubtitlesProvider.cs

@ -1,4 +1,5 @@
using System.Globalization; using System.Globalization;
using System.IO.Abstractions;
using ErsatzTV.Core.Domain; using ErsatzTV.Core.Domain;
using ErsatzTV.Core.Extensions; using ErsatzTV.Core.Extensions;
using ErsatzTV.Core.Interfaces.Metadata; using ErsatzTV.Core.Interfaces.Metadata;
@ -15,6 +16,7 @@ public class LocalSubtitlesProvider : ILocalSubtitlesProvider
private readonly ILogger<LocalSubtitlesProvider> _logger; private readonly ILogger<LocalSubtitlesProvider> _logger;
private readonly IMediaItemRepository _mediaItemRepository; private readonly IMediaItemRepository _mediaItemRepository;
private readonly IMetadataRepository _metadataRepository; private readonly IMetadataRepository _metadataRepository;
private readonly IFileSystem _fileSystem;
private readonly SemaphoreSlim _slim = new(1, 1); private readonly SemaphoreSlim _slim = new(1, 1);
private bool _disposedValue; private bool _disposedValue;
@ -22,11 +24,13 @@ public class LocalSubtitlesProvider : ILocalSubtitlesProvider
public LocalSubtitlesProvider( public LocalSubtitlesProvider(
IMediaItemRepository mediaItemRepository, IMediaItemRepository mediaItemRepository,
IMetadataRepository metadataRepository, IMetadataRepository metadataRepository,
IFileSystem fileSystem,
ILocalFileSystem localFileSystem, ILocalFileSystem localFileSystem,
ILogger<LocalSubtitlesProvider> logger) ILogger<LocalSubtitlesProvider> logger)
{ {
_mediaItemRepository = mediaItemRepository; _mediaItemRepository = mediaItemRepository;
_metadataRepository = metadataRepository; _metadataRepository = metadataRepository;
_fileSystem = fileSystem;
_localFileSystem = localFileSystem; _localFileSystem = localFileSystem;
_logger = logger; _logger = logger;
} }
@ -108,19 +112,19 @@ public class LocalSubtitlesProvider : ILocalSubtitlesProvider
{ {
var result = new List<Subtitle>(); var result = new List<Subtitle>();
string? folder = Path.GetDirectoryName(mediaItemPath); string? folder = _fileSystem.Path.GetDirectoryName(mediaItemPath);
string withoutExtension = Path.GetFileNameWithoutExtension(mediaItemPath); string withoutExtension = _fileSystem.Path.GetFileNameWithoutExtension(mediaItemPath);
foreach (string file in _localFileSystem.ListFiles(folder, $"{withoutExtension}*")) foreach (string file in _localFileSystem.ListFiles(folder, $"{withoutExtension}*"))
{ {
string lowerFile = file.ToLowerInvariant(); string lowerFile = file.ToLowerInvariant();
string fileName = Path.GetFileName(file); string fileName = _fileSystem.Path.GetFileName(file);
if (!fileName.StartsWith(withoutExtension, StringComparison.OrdinalIgnoreCase)) if (!fileName.StartsWith(withoutExtension, StringComparison.OrdinalIgnoreCase))
{ {
continue; continue;
} }
string extension = Path.GetExtension(lowerFile); string extension = _fileSystem.Path.GetExtension(lowerFile);
string codec = extension switch string codec = extension switch
{ {
".ssa" or ".ass" => "ass", ".ssa" or ".ass" => "ass",
@ -134,7 +138,7 @@ public class LocalSubtitlesProvider : ILocalSubtitlesProvider
continue; continue;
} }
string language = Path.GetFileName(lowerFile); string language = _fileSystem.Path.GetFileName(lowerFile);
var forced = false; var forced = false;
var sdh = false; var sdh = false;
@ -181,7 +185,7 @@ public class LocalSubtitlesProvider : ILocalSubtitlesProvider
Forced = forced, Forced = forced,
SDH = sdh, SDH = sdh,
Language = language, Language = language,
Path = saveFullPath ? file : Path.GetFileName(file), Path = saveFullPath ? file : _fileSystem.Path.GetFileName(file),
DateAdded = DateTime.UtcNow, DateAdded = DateTime.UtcNow,
DateUpdated = _localFileSystem.GetLastWriteTime(file) DateUpdated = _localFileSystem.GetLastWriteTime(file)
}); });
@ -200,7 +204,7 @@ public class LocalSubtitlesProvider : ILocalSubtitlesProvider
Forced = forced, Forced = forced,
SDH = sdh, SDH = sdh,
Language = culture.ThreeLetterISOLanguageName, Language = culture.ThreeLetterISOLanguageName,
Path = saveFullPath ? file : Path.GetFileName(file), Path = saveFullPath ? file : _fileSystem.Path.GetFileName(file),
DateAdded = DateTime.UtcNow, DateAdded = DateTime.UtcNow,
DateUpdated = _localFileSystem.GetLastWriteTime(file) DateUpdated = _localFileSystem.GetLastWriteTime(file)
}); });

10
ErsatzTV.Scanner/ErsatzTV.Scanner.csproj

@ -2,7 +2,7 @@
<PropertyGroup> <PropertyGroup>
<OutputType>Exe</OutputType> <OutputType>Exe</OutputType>
<TargetFramework>net9.0</TargetFramework> <TargetFramework>net10.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings> <ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable> <Nullable>enable</Nullable>
<Configurations>Debug;Release;Debug No Sync</Configurations> <Configurations>Debug;Release;Debug No Sync</Configurations>
@ -21,12 +21,12 @@
<ItemGroup> <ItemGroup>
<PackageReference Include="CliWrap" Version="3.10.0" /> <PackageReference Include="CliWrap" Version="3.10.0" />
<PackageReference Include="Humanizer.Core" Version="2.14.1" /> <PackageReference Include="Humanizer.Core" Version="3.0.1" />
<PackageReference Include="LanguageExt.Core" Version="4.4.9" /> <PackageReference Include="LanguageExt.Core" Version="4.4.9" />
<PackageReference Include="MediatR" Version="[12.5.0]" /> <PackageReference Include="MediatR" Version="[12.5.0]" />
<PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="9.0.11" /> <PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="10.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration" Version="9.0.11" /> <PackageReference Include="Microsoft.Extensions.Configuration" Version="10.0.0" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="9.0.11" /> <PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="10.0.0" />
<PackageReference Include="Serilog" Version="4.3.0" /> <PackageReference Include="Serilog" Version="4.3.0" />
<PackageReference Include="Serilog.AspNetCore" Version="9.0.0" /> <PackageReference Include="Serilog.AspNetCore" Version="9.0.0" />
<PackageReference Include="Serilog.Extensions.Hosting" Version="9.0.0" /> <PackageReference Include="Serilog.Extensions.Hosting" Version="9.0.0" />

3
ErsatzTV/ErsatzTV.csproj

@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk.Web"> <Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup> <PropertyGroup>
<TargetFramework>net9.0</TargetFramework> <TargetFramework>net10.0</TargetFramework>
<TypeScriptCompileBlocked>true</TypeScriptCompileBlocked> <TypeScriptCompileBlocked>true</TypeScriptCompileBlocked>
<TypeScriptToolsVersion>Latest</TypeScriptToolsVersion> <TypeScriptToolsVersion>Latest</TypeScriptToolsVersion>
<IsPackable>false</IsPackable> <IsPackable>false</IsPackable>
@ -62,7 +62,6 @@
<PackageReference Include="Serilog" Version="4.3.0" /> <PackageReference Include="Serilog" Version="4.3.0" />
<PackageReference Include="Serilog.AspNetCore" Version="9.0.0" /> <PackageReference Include="Serilog.AspNetCore" Version="9.0.0" />
<PackageReference Include="Serilog.Settings.Configuration" Version="9.0.0" /> <PackageReference Include="Serilog.Settings.Configuration" Version="9.0.0" />
<PackageReference Include="System.IO.FileSystem.Primitives" Version="4.3.0" />
<PackageReference Include="VueCliMiddleware" Version="6.0.0" /> <PackageReference Include="VueCliMiddleware" Version="6.0.0" />
</ItemGroup> </ItemGroup>

2
ErsatzTV/Startup.cs

@ -125,7 +125,7 @@ public class Startup
{ {
options.ForwardedHeaders = ForwardedHeaders.All; options.ForwardedHeaders = ForwardedHeaders.All;
options.ForwardLimit = 2; options.ForwardLimit = 2;
options.KnownNetworks.Clear(); options.KnownIPNetworks.Clear();
options.KnownProxies.Clear(); options.KnownProxies.Clear();
}); });

4
docker/Dockerfile

@ -1,4 +1,4 @@
FROM mcr.microsoft.com/dotnet/aspnet:9.0-noble-amd64 AS dotnet-runtime FROM mcr.microsoft.com/dotnet/aspnet:10.0-noble-amd64 AS dotnet-runtime
FROM --platform=linux/amd64 ghcr.io/ersatztv/ersatztv-ffmpeg:7.1.1 AS runtime-base FROM --platform=linux/amd64 ghcr.io/ersatztv/ersatztv-ffmpeg:7.1.1 AS runtime-base
COPY --from=dotnet-runtime /usr/share/dotnet /usr/share/dotnet COPY --from=dotnet-runtime /usr/share/dotnet /usr/share/dotnet
@ -9,7 +9,7 @@ RUN apt-get update && \
rm -rf /var/lib/apt/lists/* rm -rf /var/lib/apt/lists/*
# https://hub.docker.com/_/microsoft-dotnet # https://hub.docker.com/_/microsoft-dotnet
FROM mcr.microsoft.com/dotnet/sdk:9.0-noble-amd64 AS build FROM mcr.microsoft.com/dotnet/sdk:10.0-noble-amd64 AS build
RUN apt-get update && apt-get install -y ca-certificates gnupg default-jre-headless python3-pip RUN apt-get update && apt-get install -y ca-certificates gnupg default-jre-headless python3-pip
WORKDIR /source WORKDIR /source

4
docker/arm32v7/Dockerfile

@ -1,10 +1,10 @@
FROM mcr.microsoft.com/dotnet/aspnet:9.0-noble-arm32v7 AS dotnet-runtime FROM mcr.microsoft.com/dotnet/aspnet:10.0-noble-arm32v7 AS dotnet-runtime
FROM --platform=linux/arm/v7 ghcr.io/ersatztv/ersatztv-ffmpeg:7.1.1 AS runtime-base FROM --platform=linux/arm/v7 ghcr.io/ersatztv/ersatztv-ffmpeg:7.1.1 AS runtime-base
COPY --from=dotnet-runtime /usr/share/dotnet /usr/share/dotnet COPY --from=dotnet-runtime /usr/share/dotnet /usr/share/dotnet
# https://hub.docker.com/_/microsoft-dotnet # https://hub.docker.com/_/microsoft-dotnet
FROM mcr.microsoft.com/dotnet/sdk:9.0-noble-amd64 AS build FROM mcr.microsoft.com/dotnet/sdk:10.0-noble-amd64 AS build
RUN apt-get update && apt-get install -y ca-certificates gnupg RUN apt-get update && apt-get install -y ca-certificates gnupg
WORKDIR /source WORKDIR /source

4
docker/arm64/Dockerfile

@ -1,10 +1,10 @@
FROM mcr.microsoft.com/dotnet/aspnet:9.0-noble-arm64v8 AS dotnet-runtime FROM mcr.microsoft.com/dotnet/aspnet:10.0-noble-arm64v8 AS dotnet-runtime
FROM --platform=linux/arm64 ghcr.io/ersatztv/ersatztv-ffmpeg:7.1.1 AS runtime-base FROM --platform=linux/arm64 ghcr.io/ersatztv/ersatztv-ffmpeg:7.1.1 AS runtime-base
COPY --from=dotnet-runtime /usr/share/dotnet /usr/share/dotnet COPY --from=dotnet-runtime /usr/share/dotnet /usr/share/dotnet
# https://hub.docker.com/_/microsoft-dotnet # https://hub.docker.com/_/microsoft-dotnet
FROM mcr.microsoft.com/dotnet/sdk:9.0-noble-arm64v8 AS build FROM mcr.microsoft.com/dotnet/sdk:10.0-noble-arm64v8 AS build
RUN apt-get update && apt-get install -y ca-certificates gnupg RUN apt-get update && apt-get install -y ca-certificates gnupg
WORKDIR /source WORKDIR /source

2
global.json

@ -1,6 +1,6 @@
{ {
"sdk": { "sdk": {
"version": "9.0.100", "version": "10.0.0",
"rollForward": "latestMinor", "rollForward": "latestMinor",
"allowPrerelease": false "allowPrerelease": false
} }

Loading…
Cancel
Save