From 3805b9e48c97a7b154e7a8d80c9c9e6254f4aaf5 Mon Sep 17 00:00:00 2001 From: Jason Dove <1695733+jasongdove@users.noreply.github.com> Date: Mon, 23 Jun 2025 08:49:24 -0500 Subject: [PATCH] update dependencies that require api migrations (#2063) * migrate system.commandline to 2.0.0-beta5 api * bump sixlabors.imagesharp * migrate skiasharp to 3.x api --- ErsatzTV.Core/ErsatzTV.Core.csproj | 4 +- ErsatzTV.Core/Images/ChannelLogoGenerator.cs | 22 +-- .../ErsatzTV.Infrastructure.csproj | 2 +- ErsatzTV.Scanner/ErsatzTV.Scanner.csproj | 2 +- ErsatzTV.Scanner/Worker.cs | 155 +++++++++--------- ErsatzTV/Shared/MainLayout.razor | 10 +- 6 files changed, 98 insertions(+), 97 deletions(-) diff --git a/ErsatzTV.Core/ErsatzTV.Core.csproj b/ErsatzTV.Core/ErsatzTV.Core.csproj index 498d1512..03abd0d9 100644 --- a/ErsatzTV.Core/ErsatzTV.Core.csproj +++ b/ErsatzTV.Core/ErsatzTV.Core.csproj @@ -27,8 +27,8 @@ - - + + diff --git a/ErsatzTV.Core/Images/ChannelLogoGenerator.cs b/ErsatzTV.Core/Images/ChannelLogoGenerator.cs index c3f507db..12d892ce 100644 --- a/ErsatzTV.Core/Images/ChannelLogoGenerator.cs +++ b/ErsatzTV.Core/Images/ChannelLogoGenerator.cs @@ -41,32 +41,34 @@ public class ChannelLogoGenerator : IChannelLogoGenerator //Custom Font string fontPath = Path.Combine(FileSystemLayout.ResourcesCacheFolder, "Sen.ttf"); using SKTypeface fontTypeface = SKTypeface.FromFile(fontPath); - int fontSize = 30; - SKPaint paint = new SKPaint + var fontSize = 30; + var font = new SKFont { Typeface = fontTypeface, - TextSize = fontSize, + Size = fontSize + }; + + var paint = new SKPaint + { IsAntialias = true, Color = SKColors.White, - Style = SKPaintStyle.Fill, - TextAlign = SKTextAlign.Center + Style = SKPaintStyle.Fill }; - SKRect textBounds = new SKRect(); - paint.MeasureText(text, ref textBounds); + font.MeasureText(text, out SKRect textBounds, paint); // Ajuster la taille de la police si nécessaire while (textBounds.Width > logoWidth - 10 && fontSize > 16) { fontSize -= 2; - paint.TextSize = fontSize; - paint.MeasureText(text, ref textBounds); + font.Size = fontSize; + font.MeasureText(text, out textBounds, paint); } // Dessiner le texte float x = logoWidth / 2f; float y = logoHeight / 2f - textBounds.MidY; - canvas.DrawText(text, x, y, paint); + canvas.DrawText(text, x, y, SKTextAlign.Center, font, paint); using SKImage image = surface.Snapshot(); using MemoryStream ms = new MemoryStream(); diff --git a/ErsatzTV.Infrastructure/ErsatzTV.Infrastructure.csproj b/ErsatzTV.Infrastructure/ErsatzTV.Infrastructure.csproj index dd502d45..0c550001 100644 --- a/ErsatzTV.Infrastructure/ErsatzTV.Infrastructure.csproj +++ b/ErsatzTV.Infrastructure/ErsatzTV.Infrastructure.csproj @@ -36,7 +36,7 @@ - + diff --git a/ErsatzTV.Scanner/ErsatzTV.Scanner.csproj b/ErsatzTV.Scanner/ErsatzTV.Scanner.csproj index 6b2670a5..fe113e91 100644 --- a/ErsatzTV.Scanner/ErsatzTV.Scanner.csproj +++ b/ErsatzTV.Scanner/ErsatzTV.Scanner.csproj @@ -33,7 +33,7 @@ - + diff --git a/ErsatzTV.Scanner/Worker.cs b/ErsatzTV.Scanner/Worker.cs index 2ec3e985..cdea96b0 100644 --- a/ErsatzTV.Scanner/Worker.cs +++ b/ErsatzTV.Scanner/Worker.cs @@ -33,202 +33,207 @@ public class Worker : BackgroundService // need to strip program name (head) from command line args string[] arguments = Environment.GetCommandLineArgs().Skip(1).ToArray(); - await rootCommand.InvokeAsync(arguments); + ParseResult parseResult = rootCommand.Parse(arguments); + await parseResult.InvokeAsync(stoppingToken); _appLifetime.StopApplication(); } private RootCommand ConfigureCommandLine() { - var forceOption = new System.CommandLine.Option( - "--force", - description: "Force scanning", - parseArgument: _ => true) + var forceOption = new System.CommandLine.Option("--force") { AllowMultipleArgumentsPerToken = true, - Arity = ArgumentArity.Zero + Arity = ArgumentArity.Zero, + Description = "Force scanning", + DefaultValueFactory = _ => false }; - var deepOption = new System.CommandLine.Option( - "--deep", - description: "Deep scan", - parseArgument: _ => true) + var deepOption = new System.CommandLine.Option("--deep") { AllowMultipleArgumentsPerToken = true, - Arity = ArgumentArity.Zero + Arity = ArgumentArity.Zero, + Description = "Deep scan", + DefaultValueFactory = _ => false }; - var libraryIdArgument = new Argument("library-id", "The library id to scan"); - var mediaSourceIdArgument = new Argument("media-source-id", "The media source id to scan"); + var libraryIdArgument = new Argument("library-id") + { + Description = "The library id to scan" + }; + var mediaSourceIdArgument = new Argument("media-source-id") + { + Description = "The media source id to scan" + }; var scanLocalCommand = new Command("scan-local", "Scan a local library"); - scanLocalCommand.AddArgument(libraryIdArgument); - scanLocalCommand.AddOption(forceOption); + scanLocalCommand.Arguments.Add(libraryIdArgument); + scanLocalCommand.Options.Add(forceOption); var scanPlexCommand = new Command("scan-plex", "Scan a Plex library"); - scanPlexCommand.AddArgument(libraryIdArgument); - scanPlexCommand.AddOption(forceOption); - scanPlexCommand.AddOption(deepOption); + scanPlexCommand.Arguments.Add(libraryIdArgument); + scanPlexCommand.Options.Add(forceOption); + scanPlexCommand.Options.Add(deepOption); var scanPlexCollectionsCommand = new Command("scan-plex-collections", "Scan Plex collections"); - scanPlexCollectionsCommand.AddArgument(mediaSourceIdArgument); - scanPlexCollectionsCommand.AddOption(forceOption); + scanPlexCollectionsCommand.Arguments.Add(mediaSourceIdArgument); + scanPlexCollectionsCommand.Options.Add(forceOption); var scanEmbyCommand = new Command("scan-emby", "Scan an Emby library"); - scanEmbyCommand.AddArgument(libraryIdArgument); - scanEmbyCommand.AddOption(forceOption); - scanEmbyCommand.AddOption(deepOption); + scanEmbyCommand.Arguments.Add(libraryIdArgument); + scanEmbyCommand.Options.Add(forceOption); + scanEmbyCommand.Options.Add(deepOption); var scanEmbyCollectionsCommand = new Command("scan-emby-collections", "Scan Emby collections"); - scanEmbyCollectionsCommand.AddArgument(mediaSourceIdArgument); - scanEmbyCollectionsCommand.AddOption(forceOption); + scanEmbyCollectionsCommand.Arguments.Add(mediaSourceIdArgument); + scanEmbyCollectionsCommand.Options.Add(forceOption); var scanJellyfinCommand = new Command("scan-jellyfin", "Scan a Jellyfin library"); - scanJellyfinCommand.AddArgument(libraryIdArgument); - scanJellyfinCommand.AddOption(forceOption); - scanJellyfinCommand.AddOption(deepOption); + scanJellyfinCommand.Arguments.Add(libraryIdArgument); + scanJellyfinCommand.Options.Add(forceOption); + scanJellyfinCommand.Options.Add(deepOption); var scanJellyfinCollectionsCommand = new Command("scan-jellyfin-collections", "Scan Jellyfin collections"); - scanJellyfinCollectionsCommand.AddArgument(mediaSourceIdArgument); - scanJellyfinCollectionsCommand.AddOption(forceOption); + scanJellyfinCollectionsCommand.Arguments.Add(mediaSourceIdArgument); + scanJellyfinCollectionsCommand.Options.Add(forceOption); - scanLocalCommand.SetHandler( - async context => + scanLocalCommand.SetAction( + async (parseResult, token) => { if (IsScanningEnabled()) { - bool force = context.ParseResult.GetValueForOption(forceOption); + bool force = parseResult.GetValue(forceOption); SetProcessPriority(force); - int libraryId = context.ParseResult.GetValueForArgument(libraryIdArgument); + int libraryId = parseResult.GetValue(libraryIdArgument); using IServiceScope scope = _serviceScopeFactory.CreateScope(); IMediator mediator = scope.ServiceProvider.GetRequiredService(); var scan = new ScanLocalLibrary(libraryId, force); - await mediator.Send(scan, context.GetCancellationToken()); + await mediator.Send(scan, token); } }); - scanPlexCommand.SetHandler( - async context => + scanPlexCommand.SetAction( + async (parseResult, token) => { if (IsScanningEnabled()) { - bool force = context.ParseResult.GetValueForOption(forceOption); + bool force = parseResult.GetValue(forceOption); SetProcessPriority(force); - bool deep = context.ParseResult.GetValueForOption(deepOption); - int libraryId = context.ParseResult.GetValueForArgument(libraryIdArgument); + bool deep = parseResult.GetValue(deepOption); + int libraryId = parseResult.GetValue(libraryIdArgument); using IServiceScope scope = _serviceScopeFactory.CreateScope(); IMediator mediator = scope.ServiceProvider.GetRequiredService(); var scan = new SynchronizePlexLibraryById(libraryId, force, deep); - await mediator.Send(scan, context.GetCancellationToken()); + await mediator.Send(scan, token); } }); - scanPlexCollectionsCommand.SetHandler( - async context => + scanPlexCollectionsCommand.SetAction( + async (parseResult, token) => { if (IsScanningEnabled()) { - bool force = context.ParseResult.GetValueForOption(forceOption); + bool force = parseResult.GetValue(forceOption); SetProcessPriority(force); - int mediaSourceId = context.ParseResult.GetValueForArgument(mediaSourceIdArgument); + int mediaSourceId = parseResult.GetValue(mediaSourceIdArgument); using IServiceScope scope = _serviceScopeFactory.CreateScope(); IMediator mediator = scope.ServiceProvider.GetRequiredService(); var scan = new SynchronizePlexCollections(mediaSourceId, force); - await mediator.Send(scan, context.GetCancellationToken()); + await mediator.Send(scan, token); } }); - scanEmbyCommand.SetHandler( - async context => + scanEmbyCommand.SetAction( + async (parseResult, token) => { if (IsScanningEnabled()) { - bool force = context.ParseResult.GetValueForOption(forceOption); + bool force = parseResult.GetValue(forceOption); SetProcessPriority(force); - bool deep = context.ParseResult.GetValueForOption(deepOption); - int libraryId = context.ParseResult.GetValueForArgument(libraryIdArgument); + bool deep = parseResult.GetValue(deepOption); + int libraryId = parseResult.GetValue(libraryIdArgument); using IServiceScope scope = _serviceScopeFactory.CreateScope(); IMediator mediator = scope.ServiceProvider.GetRequiredService(); var scan = new SynchronizeEmbyLibraryById(libraryId, force, deep); - await mediator.Send(scan, context.GetCancellationToken()); + await mediator.Send(scan, token); } }); - scanEmbyCollectionsCommand.SetHandler( - async context => + scanEmbyCollectionsCommand.SetAction( + async (parseResult, token) => { if (IsScanningEnabled()) { - bool force = context.ParseResult.GetValueForOption(forceOption); + bool force = parseResult.GetValue(forceOption); SetProcessPriority(force); - int mediaSourceId = context.ParseResult.GetValueForArgument(mediaSourceIdArgument); + int mediaSourceId = parseResult.GetValue(mediaSourceIdArgument); using IServiceScope scope = _serviceScopeFactory.CreateScope(); IMediator mediator = scope.ServiceProvider.GetRequiredService(); var scan = new SynchronizeEmbyCollections(mediaSourceId, force); - await mediator.Send(scan, context.GetCancellationToken()); + await mediator.Send(scan, token); } }); - scanJellyfinCommand.SetHandler( - async context => + scanJellyfinCommand.SetAction( + async (parseResult, token) => { if (IsScanningEnabled()) { - bool force = context.ParseResult.GetValueForOption(forceOption); + bool force = parseResult.GetValue(forceOption); SetProcessPriority(force); - bool deep = context.ParseResult.GetValueForOption(deepOption); - int libraryId = context.ParseResult.GetValueForArgument(libraryIdArgument); + bool deep = parseResult.GetValue(deepOption); + int libraryId = parseResult.GetValue(libraryIdArgument); using IServiceScope scope = _serviceScopeFactory.CreateScope(); IMediator mediator = scope.ServiceProvider.GetRequiredService(); var scan = new SynchronizeJellyfinLibraryById(libraryId, force, deep); - await mediator.Send(scan, context.GetCancellationToken()); + await mediator.Send(scan, token); } }); - scanJellyfinCollectionsCommand.SetHandler( - async context => + scanJellyfinCollectionsCommand.SetAction( + async (parseResult, token) => { if (IsScanningEnabled()) { - bool force = context.ParseResult.GetValueForOption(forceOption); + bool force = parseResult.GetValue(forceOption); SetProcessPriority(force); - int mediaSourceId = context.ParseResult.GetValueForArgument(mediaSourceIdArgument); + int mediaSourceId = parseResult.GetValue(mediaSourceIdArgument); using IServiceScope scope = _serviceScopeFactory.CreateScope(); IMediator mediator = scope.ServiceProvider.GetRequiredService(); var scan = new SynchronizeJellyfinCollections(mediaSourceId, force); - await mediator.Send(scan, context.GetCancellationToken()); + await mediator.Send(scan, token); } }); var rootCommand = new RootCommand(); - rootCommand.AddCommand(scanLocalCommand); - rootCommand.AddCommand(scanPlexCommand); - rootCommand.AddCommand(scanPlexCollectionsCommand); - rootCommand.AddCommand(scanEmbyCommand); - rootCommand.AddCommand(scanEmbyCollectionsCommand); - rootCommand.AddCommand(scanJellyfinCommand); - rootCommand.AddCommand(scanJellyfinCollectionsCommand); + rootCommand.Subcommands.Add(scanLocalCommand); + rootCommand.Subcommands.Add(scanPlexCommand); + rootCommand.Subcommands.Add(scanPlexCollectionsCommand); + rootCommand.Subcommands.Add(scanEmbyCommand); + rootCommand.Subcommands.Add(scanEmbyCollectionsCommand); + rootCommand.Subcommands.Add(scanJellyfinCommand); + rootCommand.Subcommands.Add(scanJellyfinCollectionsCommand); return rootCommand; } diff --git a/ErsatzTV/Shared/MainLayout.razor b/ErsatzTV/Shared/MainLayout.razor index 4c665292..f0726dec 100644 --- a/ErsatzTV/Shared/MainLayout.razor +++ b/ErsatzTV/Shared/MainLayout.razor @@ -75,8 +75,8 @@
@if (SystemStartup.IsDatabaseReady && SystemStartup.IsSearchIndexReady) { - M3U - XMLTV + M3U + XMLTV } @* API *@ @@ -291,12 +291,6 @@ _ => null }; - private string IptvUrl(string path) - { - var uri = new Uri(NavigationManager.Uri); - return $"{uri.Scheme}://{uri.Host}:{Settings.StreamingPort}/iptv/{path}"; - } - private void ToggleDrawer() { _drawerIsOpen = !_drawerIsOpen;