diff options
| -rw-r--r-- | .github/workflows/ci-codeql-analysis.yml | 6 | ||||
| -rw-r--r-- | CONTRIBUTORS.md | 1 | ||||
| -rw-r--r-- | Emby.Server.Implementations/Localization/Core/de.json | 2 | ||||
| -rw-r--r-- | Emby.Server.Implementations/Localization/Core/gl.json | 3 | ||||
| -rw-r--r-- | Emby.Server.Implementations/Localization/Core/pr.json | 4 | ||||
| -rw-r--r-- | Jellyfin.Api/Controllers/ImageController.cs | 137 | ||||
| -rw-r--r-- | Jellyfin.Server.Implementations/Item/BaseItemRepository.cs | 2 | ||||
| -rw-r--r-- | Jellyfin.Server/Migrations/Stages/CodeMigration.cs | 8 | ||||
| -rw-r--r-- | MediaBrowser.MediaEncoding/Probing/ProbeResultNormalizer.cs | 34 |
9 files changed, 70 insertions, 127 deletions
diff --git a/.github/workflows/ci-codeql-analysis.yml b/.github/workflows/ci-codeql-analysis.yml index c7f7bea35..83f45c2ea 100644 --- a/.github/workflows/ci-codeql-analysis.yml +++ b/.github/workflows/ci-codeql-analysis.yml @@ -27,11 +27,11 @@ jobs: dotnet-version: '9.0.x' - name: Initialize CodeQL - uses: github/codeql-action/init@df559355d593797519d70b90fc8edd5db049e7a2 # v3.29.9 + uses: github/codeql-action/init@3c3833e0f8c1c83d449a7478aa59c036a9165498 # v3.29.11 with: languages: ${{ matrix.language }} queries: +security-extended - name: Autobuild - uses: github/codeql-action/autobuild@df559355d593797519d70b90fc8edd5db049e7a2 # v3.29.9 + uses: github/codeql-action/autobuild@3c3833e0f8c1c83d449a7478aa59c036a9165498 # v3.29.11 - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@df559355d593797519d70b90fc8edd5db049e7a2 # v3.29.9 + uses: github/codeql-action/analyze@3c3833e0f8c1c83d449a7478aa59c036a9165498 # v3.29.11 diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index d2895cabe..66ef2a07e 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -202,6 +202,7 @@ - [Shoham Peller](https://github.com/spellr) - [theshoeshiner](https://github.com/theshoeshiner) - [TokerX](https://github.com/TokerX) + - [GeneMarks](https://github.com/GeneMarks) # Emby Contributors diff --git a/Emby.Server.Implementations/Localization/Core/de.json b/Emby.Server.Implementations/Localization/Core/de.json index 664da8249..e60d03e46 100644 --- a/Emby.Server.Implementations/Localization/Core/de.json +++ b/Emby.Server.Implementations/Localization/Core/de.json @@ -138,5 +138,5 @@ "TaskMoveTrickplayImages": "Verzeichnis für Trickplay-Bilder migrieren", "TaskMoveTrickplayImagesDescription": "Trickplay-Bilder werden entsprechend der Bibliothekseinstellungen verschoben.", "CleanupUserDataTask": "Aufgabe zur Bereinigung von Benutzerdaten", - "CleanupUserDataTaskDescription": "Löscht alle Benutzerdaten (Anschaustatus, Favoritenstatus, usw.) von Medien, die seit mindestens 90 Tagen nicht mehr vorhanden sind." + "CleanupUserDataTaskDescription": "Löscht alle Benutzerdaten (Abspielstatus, Favoritenstatus, usw.) von Medien, die seit mindestens 90 Tagen nicht mehr vorhanden sind." } diff --git a/Emby.Server.Implementations/Localization/Core/gl.json b/Emby.Server.Implementations/Localization/Core/gl.json index ff6f6d232..0e7c9dc3a 100644 --- a/Emby.Server.Implementations/Localization/Core/gl.json +++ b/Emby.Server.Implementations/Localization/Core/gl.json @@ -136,5 +136,6 @@ "TaskMoveTrickplayImagesDescription": "Move os ficheiros de reprodución con trickplay existentes segundo a configuración da biblioteca.", "TaskRefreshTrickplayImages": "Xerar imaxes de Trickplay", "TaskAudioNormalizationDescription": "Analiza ficheiros para obter datos de normalización de audio.", - "CleanupUserDataTask": "Tarefa de limpeza de datos do usuario" + "CleanupUserDataTask": "Tarefa de limpeza de datos do usuario", + "CleanupUserDataTaskDescription": "Limpa todos os datos do usuario (Estado de visualización, estado de favorito, etc) da multimedia que leve non presente polo menos durante 90 días." } diff --git a/Emby.Server.Implementations/Localization/Core/pr.json b/Emby.Server.Implementations/Localization/Core/pr.json index c5ca6b64a..f7d1b112e 100644 --- a/Emby.Server.Implementations/Localization/Core/pr.json +++ b/Emby.Server.Implementations/Localization/Core/pr.json @@ -41,5 +41,7 @@ "MixedContent": "Jumbled loot", "Music": "Tunes", "NameInstallFailed": "Ye couldn't bring {0} aboard yer ship", - "MessageApplicationUpdatedTo": "Yer Map of the Seas has been scribbled with {0}" + "MessageApplicationUpdatedTo": "Yer Map of the Seas has been scribbled with {0}", + "MessageNamedServerConfigurationUpdatedWithValue": "Yer Map Drawer has been rescribbled to {0}", + "MessageServerConfigurationUpdated": "Yer Map drawer has been rescribbled" } diff --git a/Jellyfin.Api/Controllers/ImageController.cs b/Jellyfin.Api/Controllers/ImageController.cs index abda053d3..cd8132d21 100644 --- a/Jellyfin.Api/Controllers/ImageController.cs +++ b/Jellyfin.Api/Controllers/ImageController.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Collections.Immutable; using System.ComponentModel.DataAnnotations; using System.Diagnostics.CodeAnalysis; +using System.Drawing; using System.Globalization; using System.IO; using System.Linq; @@ -1458,19 +1459,6 @@ public class ImageController : BaseJellyfinApiController /// <param name="userId">User id.</param> /// <param name="tag">Optional. Supply the cache tag from the item object to receive strong caching headers.</param> /// <param name="format">Determines the output format of the image - original,gif,jpg,png.</param> - /// <param name="maxWidth">The maximum image width to return.</param> - /// <param name="maxHeight">The maximum image height to return.</param> - /// <param name="percentPlayed">Optional. Percent to render for the percent played overlay.</param> - /// <param name="unplayedCount">Optional. Unplayed count overlay to render.</param> - /// <param name="width">The fixed image width to return.</param> - /// <param name="height">The fixed image height to return.</param> - /// <param name="quality">Optional. Quality setting, from 0-100. Defaults to 90 and should suffice in most cases.</param> - /// <param name="fillWidth">Width of box to fill.</param> - /// <param name="fillHeight">Height of box to fill.</param> - /// <param name="blur">Optional. Blur image.</param> - /// <param name="backgroundColor">Optional. Apply a background color for transparent images.</param> - /// <param name="foregroundLayer">Optional. Apply a foreground layer on top of the image.</param> - /// <param name="imageIndex">Image index.</param> /// <response code="200">Image stream returned.</response> /// <response code="400">User id not provided.</response> /// <response code="404">Item not found.</response> @@ -1487,20 +1475,7 @@ public class ImageController : BaseJellyfinApiController public async Task<ActionResult> GetUserImage( [FromQuery] Guid? userId, [FromQuery] string? tag, - [FromQuery] ImageFormat? format, - [FromQuery] int? maxWidth, - [FromQuery] int? maxHeight, - [FromQuery] double? percentPlayed, - [FromQuery] int? unplayedCount, - [FromQuery] int? width, - [FromQuery] int? height, - [FromQuery] int? quality, - [FromQuery] int? fillWidth, - [FromQuery] int? fillHeight, - [FromQuery] int? blur, - [FromQuery] string? backgroundColor, - [FromQuery] string? foregroundLayer, - [FromQuery] int? imageIndex) + [FromQuery] ImageFormat? format) { var requestUserId = userId ?? User.GetUserId(); if (requestUserId.IsEmpty()) @@ -1521,34 +1496,24 @@ public class ImageController : BaseJellyfinApiController DateModified = user.ProfileImage.LastModified }; - if (width.HasValue) - { - info.Width = width.Value; - } - - if (height.HasValue) - { - info.Height = height.Value; - } - return await GetImageInternal( user.Id, ImageType.Profile, - imageIndex, + null, tag, format, - maxWidth, - maxHeight, - percentPlayed, - unplayedCount, - width, - height, - quality, - fillWidth, - fillHeight, - blur, - backgroundColor, - foregroundLayer, + null, + null, + null, + null, + null, + null, + 90, + null, + null, + null, + null, + null, null, info) .ConfigureAwait(false); @@ -1608,20 +1573,7 @@ public class ImageController : BaseJellyfinApiController => GetUserImage( userId, tag, - format, - maxWidth, - maxHeight, - percentPlayed, - unplayedCount, - width, - height, - quality, - fillWidth, - fillHeight, - blur, - backgroundColor, - foregroundLayer, - imageIndex); + format); /// <summary> /// Get user profile image. @@ -1677,36 +1629,13 @@ public class ImageController : BaseJellyfinApiController => GetUserImage( userId, tag, - format, - maxWidth, - maxHeight, - percentPlayed, - unplayedCount, - width, - height, - quality, - fillWidth, - fillHeight, - blur, - backgroundColor, - foregroundLayer, - imageIndex); + format); /// <summary> /// Generates or gets the splashscreen. /// </summary> /// <param name="tag">Supply the cache tag from the item object to receive strong caching headers.</param> /// <param name="format">Determines the output format of the image - original,gif,jpg,png.</param> - /// <param name="maxWidth">The maximum image width to return.</param> - /// <param name="maxHeight">The maximum image height to return.</param> - /// <param name="width">The fixed image width to return.</param> - /// <param name="height">The fixed image height to return.</param> - /// <param name="fillWidth">Width of box to fill.</param> - /// <param name="fillHeight">Height of box to fill.</param> - /// <param name="blur">Blur image.</param> - /// <param name="backgroundColor">Apply a background color for transparent images.</param> - /// <param name="foregroundLayer">Apply a foreground layer on top of the image.</param> - /// <param name="quality">Quality setting, from 0-100.</param> /// <response code="200">Splashscreen returned successfully.</response> /// <returns>The splashscreen.</returns> [HttpGet("Branding/Splashscreen")] @@ -1714,17 +1643,7 @@ public class ImageController : BaseJellyfinApiController [ProducesImageFile] public async Task<ActionResult> GetSplashscreen( [FromQuery] string? tag, - [FromQuery] ImageFormat? format, - [FromQuery] int? maxWidth, - [FromQuery] int? maxHeight, - [FromQuery] int? width, - [FromQuery] int? height, - [FromQuery] int? fillWidth, - [FromQuery] int? fillHeight, - [FromQuery] int? blur, - [FromQuery] string? backgroundColor, - [FromQuery] string? foregroundLayer, - [FromQuery, Range(0, 100)] int quality = 90) + [FromQuery] ImageFormat? format) { var brandingOptions = _serverConfigurationManager.GetConfiguration<BrandingOptions>("branding"); var isAdmin = User.IsInRole(Constants.UserRoles.Administrator); @@ -1763,16 +1682,16 @@ public class ImageController : BaseJellyfinApiController { Path = splashscreenPath }, - Height = height, - MaxHeight = maxHeight, - MaxWidth = maxWidth, - FillHeight = fillHeight, - FillWidth = fillWidth, - Quality = quality, - Width = width, - Blur = blur, - BackgroundColor = backgroundColor, - ForegroundLayer = foregroundLayer, + Height = null, + MaxHeight = null, + MaxWidth = null, + FillHeight = null, + FillWidth = null, + Quality = 90, + Width = null, + Blur = null, + BackgroundColor = null, + ForegroundLayer = null, SupportedOutputFormats = outputFormats }; diff --git a/Jellyfin.Server.Implementations/Item/BaseItemRepository.cs b/Jellyfin.Server.Implementations/Item/BaseItemRepository.cs index ecde48406..cf4f405ee 100644 --- a/Jellyfin.Server.Implementations/Item/BaseItemRepository.cs +++ b/Jellyfin.Server.Implementations/Item/BaseItemRepository.cs @@ -1967,7 +1967,7 @@ public sealed class BaseItemRepository if (filter.AlbumArtistIds.Length > 0) { - baseQuery = baseQuery.WhereReferencedItem(context, ItemValueType.Artist, filter.AlbumArtistIds); + baseQuery = baseQuery.WhereReferencedItem(context, ItemValueType.AlbumArtist, filter.AlbumArtistIds); } if (filter.ContributingArtistIds.Length > 0) diff --git a/Jellyfin.Server/Migrations/Stages/CodeMigration.cs b/Jellyfin.Server/Migrations/Stages/CodeMigration.cs index 264710bce..971b47608 100644 --- a/Jellyfin.Server/Migrations/Stages/CodeMigration.cs +++ b/Jellyfin.Server/Migrations/Stages/CodeMigration.cs @@ -34,12 +34,8 @@ internal class CodeMigration(Type migrationType, JellyfinMigrationAttribute meta { if (service.Lifetime == ServiceLifetime.Singleton && !service.ServiceType.IsGenericTypeDefinition) { - object? serviceInstance = serviceProvider.GetService(service.ServiceType); - if (serviceInstance != null) - { - childServiceCollection.AddSingleton(service.ServiceType, serviceInstance); - continue; - } + childServiceCollection.AddSingleton(service.ServiceType, _ => serviceProvider.GetService(service.ServiceType)!); + continue; } childServiceCollection.Add(service); diff --git a/MediaBrowser.MediaEncoding/Probing/ProbeResultNormalizer.cs b/MediaBrowser.MediaEncoding/Probing/ProbeResultNormalizer.cs index 5784deacd..997c7d2a4 100644 --- a/MediaBrowser.MediaEncoding/Probing/ProbeResultNormalizer.cs +++ b/MediaBrowser.MediaEncoding/Probing/ProbeResultNormalizer.cs @@ -850,12 +850,36 @@ namespace MediaBrowser.MediaEncoding.Probing } } - // stream.IsAnamorphic = string.Equals(streamInfo.sample_aspect_ratio, "0:1", StringComparison.OrdinalIgnoreCase) || - // string.Equals(stream.AspectRatio, "2.35:1", StringComparison.OrdinalIgnoreCase) || - // string.Equals(stream.AspectRatio, "2.40:1", StringComparison.OrdinalIgnoreCase); - // http://stackoverflow.com/questions/17353387/how-to-detect-anamorphic-video-with-ffprobe - stream.IsAnamorphic = string.Equals(streamInfo.SampleAspectRatio, "0:1", StringComparison.OrdinalIgnoreCase); + if (string.Equals(streamInfo.SampleAspectRatio, "1:1", StringComparison.OrdinalIgnoreCase)) + { + stream.IsAnamorphic = false; + } + else if (!string.Equals(streamInfo.SampleAspectRatio, "0:1", StringComparison.OrdinalIgnoreCase)) + { + stream.IsAnamorphic = true; + } + else if (string.Equals(streamInfo.DisplayAspectRatio, "0:1", StringComparison.OrdinalIgnoreCase)) + { + stream.IsAnamorphic = false; + } + else if (!string.Equals( + streamInfo.DisplayAspectRatio, + // Force GetAspectRatio() to derive ratio from Width/Height directly by using null DAR + GetAspectRatio(new MediaStreamInfo + { + Width = streamInfo.Width, + Height = streamInfo.Height, + DisplayAspectRatio = null + }), + StringComparison.OrdinalIgnoreCase)) + { + stream.IsAnamorphic = true; + } + else + { + stream.IsAnamorphic = false; + } if (streamInfo.Refs > 0) { |
