diff options
| -rw-r--r-- | .devcontainer/Dev - Server Ffmpeg/devcontainer.json | 28 | ||||
| -rw-r--r-- | .devcontainer/devcontainer.json | 4 | ||||
| -rw-r--r-- | .devcontainer/install-ffmpeg.sh (renamed from .devcontainer/Dev - Server Ffmpeg/install-ffmpeg.sh) | 2 | ||||
| -rw-r--r-- | .vscode/extensions.json | 11 | ||||
| -rw-r--r-- | CONTRIBUTORS.md | 1 | ||||
| -rw-r--r-- | Directory.Packages.props | 2 | ||||
| -rw-r--r-- | Emby.Server.Implementations/Localization/Core/mk.json | 3 | ||||
| -rw-r--r-- | Emby.Server.Implementations/Localization/Core/ro.json | 2 | ||||
| -rw-r--r-- | Emby.Server.Implementations/Localization/Ratings/us.csv | 32 | ||||
| -rw-r--r-- | Jellyfin.Api/Controllers/DynamicHlsController.cs | 13 | ||||
| -rw-r--r-- | Jellyfin.Api/Controllers/LiveTvController.cs | 4 | ||||
| -rw-r--r-- | Jellyfin.Server.Implementations/MediaSegments/MediaSegmentManager.cs | 2 | ||||
| -rw-r--r-- | Jellyfin.Server/Migrations/Routines/MigrateRatingLevels.cs | 2 | ||||
| -rw-r--r-- | MediaBrowser.Model/Configuration/LibraryOptions.cs | 4 | ||||
| -rw-r--r-- | tests/Jellyfin.LiveTv.Tests/Listings/ListingsManagerTests.cs | 50 |
15 files changed, 91 insertions, 69 deletions
diff --git a/.devcontainer/Dev - Server Ffmpeg/devcontainer.json b/.devcontainer/Dev - Server Ffmpeg/devcontainer.json deleted file mode 100644 index a934512f4..000000000 --- a/.devcontainer/Dev - Server Ffmpeg/devcontainer.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "name": "Development Jellyfin Server - FFmpeg", - "image":"mcr.microsoft.com/devcontainers/dotnet:9.0-jammy", - // restores nuget packages, installs the dotnet workloads and installs the dev https certificate - "postStartCommand": "dotnet restore; dotnet workload update; dotnet dev-certs https --trust; sudo bash \"./.devcontainer/Dev - Server Ffmpeg/install-ffmpeg.sh\"", - // reads the extensions list and installs them - "postAttachCommand": "cat .vscode/extensions.json | jq -r .recommendations[] | xargs -n 1 code --install-extension", - "features": { - "ghcr.io/devcontainers/features/dotnet:2": { - "version": "none", - "dotnetRuntimeVersions": "9.0", - "aspNetCoreRuntimeVersions": "9.0" - }, - "ghcr.io/devcontainers-contrib/features/apt-packages:1": { - "preserve_apt_list": false, - "packages": ["libfontconfig1"] - }, - "ghcr.io/devcontainers/features/docker-in-docker:2": { - "dockerDashComposeVersion": "v2" - }, - "ghcr.io/devcontainers/features/github-cli:1": {}, - "ghcr.io/eitsupi/devcontainer-features/jq-likes:2": {} - }, - "hostRequirements": { - "memory": "8gb", - "cpus": 4 - } -} diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 0cf768f1f..228d4a17c 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -1,8 +1,8 @@ { "name": "Development Jellyfin Server", - "image":"mcr.microsoft.com/devcontainers/dotnet:9.0-jammy", + "image":"mcr.microsoft.com/devcontainers/dotnet:9.0-bookworm", // restores nuget packages, installs the dotnet workloads and installs the dev https certificate - "postStartCommand": "dotnet restore; dotnet workload update; dotnet dev-certs https --trust", + "postStartCommand": "sudo dotnet restore; sudo dotnet workload update; sudo dotnet dev-certs https --trust; sudo bash \"./.devcontainer/install-ffmpeg.sh\"", // reads the extensions list and installs them "postAttachCommand": "cat .vscode/extensions.json | jq -r .recommendations[] | xargs -n 1 code --install-extension", "features": { diff --git a/.devcontainer/Dev - Server Ffmpeg/install-ffmpeg.sh b/.devcontainer/install-ffmpeg.sh index c867ef538..842a53255 100644 --- a/.devcontainer/Dev - Server Ffmpeg/install-ffmpeg.sh +++ b/.devcontainer/install-ffmpeg.sh @@ -29,4 +29,4 @@ Signed-By: /etc/apt/keyrings/jellyfin.gpg EOF sudo apt update -y -sudo apt install jellyfin-ffmpeg6 -y +sudo apt install jellyfin-ffmpeg7 -y diff --git a/.vscode/extensions.json b/.vscode/extensions.json index 3be946e44..e4205ce0b 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -1,12 +1,13 @@ { - "recommendations": [ + "recommendations": [ "ms-dotnettools.csharp", "editorconfig.editorconfig", "github.vscode-github-actions", "ms-dotnettools.vscode-dotnet-runtime", - "ms-dotnettools.csdevkit" - ], - "unwantedRecommendations": [ + "ms-dotnettools.csdevkit", + "alexcvzz.vscode-sqlite" + ], + "unwantedRecommendations": [ - ] + ] } diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index e44608135..eccc3b0ce 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -192,6 +192,7 @@ - [jaina heartles](https://github.com/heartles) - [oxixes](https://github.com/oxixes) - [elfalem](https://github.com/elfalem) + - [Kenneth Cochran](https://github.com/kennethcochran) - [benedikt257](https://github.com/benedikt257) - [revam](https://github.com/revam) diff --git a/Directory.Packages.props b/Directory.Packages.props index 7027f68c5..ae25df7b9 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -71,7 +71,7 @@ <PackageVersion Include="SkiaSharp.NativeAssets.Linux" Version="2.88.9" /> <PackageVersion Include="SmartAnalyzers.MultithreadingAnalyzer" Version="1.1.31" /> <PackageVersion Include="StyleCop.Analyzers" Version="1.2.0-beta.556" /> - <PackageVersion Include="Svg.Skia" Version="2.0.0.2" /> + <PackageVersion Include="Svg.Skia" Version="2.0.0.4" /> <PackageVersion Include="Swashbuckle.AspNetCore.ReDoc" Version="6.5.0" /> <PackageVersion Include="Swashbuckle.AspNetCore" Version="6.2.3" /> <PackageVersion Include="System.Globalization" Version="4.3.0" /> diff --git a/Emby.Server.Implementations/Localization/Core/mk.json b/Emby.Server.Implementations/Localization/Core/mk.json index e149f8adf..6da31227d 100644 --- a/Emby.Server.Implementations/Localization/Core/mk.json +++ b/Emby.Server.Implementations/Localization/Core/mk.json @@ -131,5 +131,6 @@ "TaskRefreshTrickplayImages": "Генерирај слики за прегледување (Trickplay)", "TaskAudioNormalization": "Нормализација на звукот", "TaskRefreshTrickplayImagesDescription": "Креира трикплеј прегледи за видеа во овозможените библиотеки.", - "TaskCleanCollectionsAndPlaylistsDescription": "Отстранува ставки од колекциите и плејлистите што веќе не постојат." + "TaskCleanCollectionsAndPlaylistsDescription": "Отстранува ставки од колекциите и плејлистите што веќе не постојат.", + "TaskExtractMediaSegments": "Скенирање на сегменти на содржина" } diff --git a/Emby.Server.Implementations/Localization/Core/ro.json b/Emby.Server.Implementations/Localization/Core/ro.json index bf59e1583..a873c157e 100644 --- a/Emby.Server.Implementations/Localization/Core/ro.json +++ b/Emby.Server.Implementations/Localization/Core/ro.json @@ -77,7 +77,7 @@ "HeaderAlbumArtists": "Artiști album", "Genres": "Genuri", "Folders": "Dosare", - "Favorites": "Favorite", + "Favorites": "Preferate", "FailedLoginAttemptWithUserName": "Încercare de conectare eșuată pentru {0}", "DeviceOnlineWithName": "{0} este conectat", "DeviceOfflineWithName": "{0} s-a deconectat", diff --git a/Emby.Server.Implementations/Localization/Ratings/us.csv b/Emby.Server.Implementations/Localization/Ratings/us.csv index d103ddf42..fc91edecd 100644 --- a/Emby.Server.Implementations/Localization/Ratings/us.csv +++ b/Emby.Server.Implementations/Localization/Ratings/us.csv @@ -5,23 +5,23 @@ TV-Y,0 TV-Y7,7 TV-Y7-FV,7 PG,10 +TV-PG,10 +TV-PG-D,10 +TV-PG-L,10 +TV-PG-S,10 +TV-PG-V,10 +TV-PG-DL,10 +TV-PG-DS,10 +TV-PG-DV,10 +TV-PG-LS,10 +TV-PG-LV,10 +TV-PG-SV,10 +TV-PG-DLS,10 +TV-PG-DLV,10 +TV-PG-DSV,10 +TV-PG-LSV,10 +TV-PG-DLSV,10 PG-13,13 -TV-PG,13 -TV-PG-D,13 -TV-PG-L,13 -TV-PG-S,13 -TV-PG-V,13 -TV-PG-DL,13 -TV-PG-DS,13 -TV-PG-DV,13 -TV-PG-LS,13 -TV-PG-LV,13 -TV-PG-SV,13 -TV-PG-DLS,13 -TV-PG-DLV,13 -TV-PG-DSV,13 -TV-PG-LSV,13 -TV-PG-DLSV,13 TV-14,14 TV-14-D,14 TV-14-L,14 diff --git a/Jellyfin.Api/Controllers/DynamicHlsController.cs b/Jellyfin.Api/Controllers/DynamicHlsController.cs index 54e0527c9..a641ec209 100644 --- a/Jellyfin.Api/Controllers/DynamicHlsController.cs +++ b/Jellyfin.Api/Controllers/DynamicHlsController.cs @@ -1819,16 +1819,13 @@ public class DynamicHlsController : BaseJellyfinApiController if (isActualOutputVideoCodecHevc || isActualOutputVideoCodecAv1) { var requestedRange = state.GetRequestedRangeTypes(state.ActualOutputVideoCodec); - var requestHasDOVI = requestedRange.Contains(VideoRangeType.DOVI.ToString(), StringComparison.OrdinalIgnoreCase); - var requestHasDOVIWithHDR10 = requestedRange.Contains(VideoRangeType.DOVIWithHDR10.ToString(), StringComparison.OrdinalIgnoreCase); - var requestHasDOVIWithHLG = requestedRange.Contains(VideoRangeType.DOVIWithHLG.ToString(), StringComparison.OrdinalIgnoreCase); - var requestHasDOVIWithSDR = requestedRange.Contains(VideoRangeType.DOVIWithSDR.ToString(), StringComparison.OrdinalIgnoreCase); + // Clients reporting Dolby Vision capabilities with fallbacks may only support the fallback layer. + // Only enable Dolby Vision remuxing if the client explicitly declares support for profiles without fallbacks. + var clientSupportsDoVi = requestedRange.Contains(VideoRangeType.DOVI.ToString(), StringComparison.OrdinalIgnoreCase); + var videoIsDoVi = state.VideoStream.VideoRangeType is VideoRangeType.DOVI or VideoRangeType.DOVIWithHDR10 or VideoRangeType.DOVIWithHLG or VideoRangeType.DOVIWithSDR; if (EncodingHelper.IsCopyCodec(codec) - && ((state.VideoStream.VideoRangeType == VideoRangeType.DOVI && requestHasDOVI) - || (state.VideoStream.VideoRangeType == VideoRangeType.DOVIWithHDR10 && requestHasDOVIWithHDR10) - || (state.VideoStream.VideoRangeType == VideoRangeType.DOVIWithHLG && requestHasDOVIWithHLG) - || (state.VideoStream.VideoRangeType == VideoRangeType.DOVIWithSDR && requestHasDOVIWithSDR))) + && (videoIsDoVi && clientSupportsDoVi)) { if (isActualOutputVideoCodecHevc) { diff --git a/Jellyfin.Api/Controllers/LiveTvController.cs b/Jellyfin.Api/Controllers/LiveTvController.cs index 0ae8baa67..421f23fa1 100644 --- a/Jellyfin.Api/Controllers/LiveTvController.cs +++ b/Jellyfin.Api/Controllers/LiveTvController.cs @@ -962,9 +962,9 @@ public class LiveTvController : BaseJellyfinApiController } /// <summary> - /// Get guid info. + /// Get guide info. /// </summary> - /// <response code="200">Guid info returned.</response> + /// <response code="200">Guide info returned.</response> /// <returns>An <see cref="OkResult"/> containing the guide info.</returns> [HttpGet("GuideInfo")] [Authorize(Policy = Policies.LiveTvAccess)] diff --git a/Jellyfin.Server.Implementations/MediaSegments/MediaSegmentManager.cs b/Jellyfin.Server.Implementations/MediaSegments/MediaSegmentManager.cs index a044fec0d..2d3a25357 100644 --- a/Jellyfin.Server.Implementations/MediaSegments/MediaSegmentManager.cs +++ b/Jellyfin.Server.Implementations/MediaSegments/MediaSegmentManager.cs @@ -61,7 +61,7 @@ public class MediaSegmentManager : IMediaSegmentManager .Where(e => !libraryOptions.DisabledMediaSegmentProviders.Contains(GetProviderId(e.Name))) .OrderBy(i => { - var index = libraryOptions.MediaSegmentProvideOrder.IndexOf(i.Name); + var index = libraryOptions.MediaSegmentProviderOrder.IndexOf(i.Name); return index == -1 ? int.MaxValue : index; }) .ToList(); diff --git a/Jellyfin.Server/Migrations/Routines/MigrateRatingLevels.cs b/Jellyfin.Server/Migrations/Routines/MigrateRatingLevels.cs index 247e1d845..9c2184029 100644 --- a/Jellyfin.Server/Migrations/Routines/MigrateRatingLevels.cs +++ b/Jellyfin.Server/Migrations/Routines/MigrateRatingLevels.cs @@ -30,7 +30,7 @@ namespace Jellyfin.Server.Migrations.Routines } /// <inheritdoc/> - public Guid Id => Guid.Parse("{67445D54-B895-4B24-9F4C-35CE0690EA07}"); + public Guid Id => Guid.Parse("{73DAB92A-178B-48CD-B05B-FE18733ACDC8}"); /// <inheritdoc/> public string Name => "MigrateRatingLevels"; diff --git a/MediaBrowser.Model/Configuration/LibraryOptions.cs b/MediaBrowser.Model/Configuration/LibraryOptions.cs index 6054ba34e..590b74304 100644 --- a/MediaBrowser.Model/Configuration/LibraryOptions.cs +++ b/MediaBrowser.Model/Configuration/LibraryOptions.cs @@ -15,7 +15,7 @@ namespace MediaBrowser.Model.Configuration TypeOptions = Array.Empty<TypeOptions>(); DisabledSubtitleFetchers = Array.Empty<string>(); DisabledMediaSegmentProviders = Array.Empty<string>(); - MediaSegmentProvideOrder = Array.Empty<string>(); + MediaSegmentProviderOrder = Array.Empty<string>(); SubtitleFetcherOrder = Array.Empty<string>(); DisabledLocalMetadataReaders = Array.Empty<string>(); DisabledLyricFetchers = Array.Empty<string>(); @@ -99,7 +99,7 @@ namespace MediaBrowser.Model.Configuration public string[] DisabledMediaSegmentProviders { get; set; } - public string[] MediaSegmentProvideOrder { get; set; } + public string[] MediaSegmentProviderOrder { get; set; } public bool SkipSubtitlesIfEmbeddedSubtitlesPresent { get; set; } diff --git a/tests/Jellyfin.LiveTv.Tests/Listings/ListingsManagerTests.cs b/tests/Jellyfin.LiveTv.Tests/Listings/ListingsManagerTests.cs new file mode 100644 index 000000000..40934d9c6 --- /dev/null +++ b/tests/Jellyfin.LiveTv.Tests/Listings/ListingsManagerTests.cs @@ -0,0 +1,50 @@ +using System; +using Jellyfin.LiveTv.Configuration; +using Jellyfin.LiveTv.Listings; +using MediaBrowser.Common.Configuration; +using MediaBrowser.Controller.LiveTv; +using MediaBrowser.Model.LiveTv; +using MediaBrowser.Model.Tasks; +using Microsoft.Extensions.Logging; +using Moq; +using Xunit; + +namespace Jellyfin.LiveTv.Tests.Listings; + +public class ListingsManagerTests +{ + private readonly IConfigurationManager _config; + private readonly IListingsProvider[] _listingsProviders; + private readonly ILogger<ListingsManager> _logger; + private readonly ITaskManager _taskManager; + private readonly ITunerHostManager _tunerHostManager; + + public ListingsManagerTests() + { + _logger = Mock.Of<ILogger<ListingsManager>>(); + _config = Mock.Of<IConfigurationManager>(); + _taskManager = Mock.Of<ITaskManager>(); + _tunerHostManager = Mock.Of<ITunerHostManager>(); + _listingsProviders = new[] { Mock.Of<IListingsProvider>() }; + } + + [Fact] + public void DeleteListingsProvider_DeletesProvider() + { + // Arrange + var id = "MockId"; + var manager = new ListingsManager(_logger, _config, _taskManager, _tunerHostManager, _listingsProviders); + + Mock.Get(_config) + .Setup(x => x.GetConfiguration(It.IsAny<string>())) + .Returns(new LiveTvOptions { ListingProviders = [new ListingsProviderInfo { Id = id }] }); + + // Act + manager.DeleteListingsProvider(id); + + // Assert + Assert.DoesNotContain( + _config.GetLiveTvConfiguration().ListingProviders, + p => p.Id.Equals(id, StringComparison.Ordinal)); + } +} |
