diff options
| -rw-r--r-- | .github/workflows/ci-openapi.yml | 4 | ||||
| -rw-r--r-- | Emby.Server.Implementations/Localization/Core/kw.json | 82 | ||||
| -rw-r--r-- | Emby.Server.Implementations/Localization/Core/nb.json | 4 | ||||
| -rw-r--r-- | Jellyfin.Api/Controllers/DynamicHlsController.cs | 6 | ||||
| -rw-r--r-- | MediaBrowser.Controller/MediaEncoding/EncodingHelper.cs | 13 | ||||
| -rw-r--r-- | MediaBrowser.MediaEncoding/Encoder/EncodingUtils.cs | 2 | ||||
| -rw-r--r-- | MediaBrowser.MediaEncoding/Encoder/MediaEncoder.cs | 12 |
7 files changed, 91 insertions, 32 deletions
diff --git a/.github/workflows/ci-openapi.yml b/.github/workflows/ci-openapi.yml index 93bfc83a2..d01c506db 100644 --- a/.github/workflows/ci-openapi.yml +++ b/.github/workflows/ci-openapi.yml @@ -27,7 +27,7 @@ jobs: - name: Generate openapi.json run: dotnet test tests/Jellyfin.Server.Integration.Tests/Jellyfin.Server.Integration.Tests.csproj -c Release --filter "Jellyfin.Server.Integration.Tests.OpenApiSpecTests" - name: Upload openapi.json - uses: actions/upload-artifact@834a144ee995460fba8ed112a2fc961b36a5ec5a # v4.3.6 + uses: actions/upload-artifact@50769540e7f4bd5e21e526ee35c689e35e0d6874 # v4.4.0 with: name: openapi-head retention-days: 14 @@ -61,7 +61,7 @@ jobs: - name: Generate openapi.json run: dotnet test tests/Jellyfin.Server.Integration.Tests/Jellyfin.Server.Integration.Tests.csproj -c Release --filter "Jellyfin.Server.Integration.Tests.OpenApiSpecTests" - name: Upload openapi.json - uses: actions/upload-artifact@834a144ee995460fba8ed112a2fc961b36a5ec5a # v4.3.6 + uses: actions/upload-artifact@50769540e7f4bd5e21e526ee35c689e35e0d6874 # v4.4.0 with: name: openapi-base retention-days: 14 diff --git a/Emby.Server.Implementations/Localization/Core/kw.json b/Emby.Server.Implementations/Localization/Core/kw.json index d6ff58785..ffb4345c8 100644 --- a/Emby.Server.Implementations/Localization/Core/kw.json +++ b/Emby.Server.Implementations/Localization/Core/kw.json @@ -26,13 +26,13 @@ "NotificationOptionPluginUninstalled": "Ystynnans anynstallys", "NotificationOptionPluginUpdateInstalled": "Nowedheans ystynnans ynstallys", "Application": "Gweythres", - "Favorites": "Drudh", + "Favorites": "Moyha Kerys", "Forced": "Konstrynys", "Albums": "Albomow", "Books": "Lyvrow", - "Channels": "Gothi", + "Channels": "Kanolyow", "AppDeviceValues": "App: {0}, Devis: {1}", - "Artists": "Artydhyon", + "Artists": "Artyhdyon", "HeaderAlbumArtists": "Albom artydhyon", "HeaderNextUp": "Nessa", "CameraImageUploadedFrom": "Skeusen kamera nowydh re beu ughkargys a-dhyworth {0}", @@ -44,7 +44,7 @@ "ItemRemovedWithName": "{0} a veu dileys a-dhyworth an lyverva", "LabelIpAddressValue": "Trigva PK: {)}", "Music": "Ilow", - "HeaderContinueWatching": "Pesya ow kweles", + "HeaderContinueWatching": "Pesya Ow Kweles", "NameSeasonNumber": "Seson {0}", "NotificationOptionApplicationUpdateInstalled": "Nowedheans gweythres ynstallys", "NotificationOptionCameraImageUploaded": "Skeusen kamera ughkargys", @@ -59,5 +59,77 @@ "NotificationOptionInstallationFailed": "Defowt ynstallyans", "Genres": "Eghennow", "NotificationOptionPluginInstalled": "Ystynnans ynstallys", - "NotificationOptionServerRestartRequired": "Dastalleth servell yw res" + "NotificationOptionServerRestartRequired": "Dastalleth servell yw res", + "StartupEmbyServerIsLoading": "Yma Servell Jellyfin ow kargya. Assay arta yn berr mar pleg.", + "SubtitleDownloadFailureFromForItem": "Istitlow a fyllis iskarga a-dhyworth {0] rag {1}", + "System": "Kevreyth", + "User": "Devnydhyer", + "UserDeletedWithName": "Devnydhyer {0} re beu dileys", + "UserLockedOutWithName": "Devnydhyer {0} re beu alhwedhys yn-mes", + "UserStoppedPlayingItemWithValues": "{0} re worfennas gwari {1} war {2}", + "UserOfflineFromDevice": "{0} re anjunyas a-dhyworth {1}", + "UserOnlineFromDevice": "{0} yw warlinen a-dhyworth {1}", + "NotificationOptionUserLockedOut": "Devnydhyer yw alhwedhys yn-mes", + "Photos": "Skeusennow", + "Playlists": "Rolyow-gwari", + "Plugin": "Ystynnans", + "PluginInstalledWithName": "{0} a veu ynstallys", + "UserPolicyUpdatedWithName": "Polici devnydhyer re beu nowedhys rag {0}", + "PluginUpdatedWithName": "{0} a veu nowedhys", + "ScheduledTaskFailedWithName": "{0} a fyllis", + "Songs": "Kanow", + "Sync": "Kesseni", + "TvShows": "Towlennow PW", + "Undefined": "Anstyrys", + "UserCreatedWithName": "Devnydhyer {0} re beu gwruthys", + "UserDownloadingItemWithValues": "Yma {0} owth iskarga {1}", + "UserPasswordChangedWithName": "Ger-tremena re beu chanjys rag devnydhyer {0}", + "UserStartedPlayingItemWithValues": "Yma {0} ow kwari {1} war {2}", + "ValueHasBeenAddedToLibrary": "{0} re beu keworrys dhe'th lyverva media", + "VersionNumber": "Versyon {0}", + "TasksLibraryCategory": "Lyverva", + "TaskCleanActivityLog": "Glanhe Kovlyver Gwrians", + "TaskRefreshPeople": "Disegha Tus", + "TaskRefreshLibrary": "Arhwilas Lyverva Media", + "TaskCleanTranscodeDescription": "Y hwra dilea restrennow treylya neg a veu gwrys kyns nans yw dydh.", + "NotificationOptionVideoPlaybackStopped": "Gwareans gwydhyow yw hedhys", + "NotificationOptionVideoPlayback": "Gwareans gwydhyow yw dallethys", + "PluginUninstalledWithName": "{0} a veu anynstallys", + "NotificationOptionTaskFailed": "Defowt oberen towlennys", + "ProviderValue": "Provier: {0}", + "ScheduledTaskStartedWithName": "{0} a dhallathas", + "ServerNameNeedsToBeRestarted": "Yma edhom dhe {0} a vos dastallathys", + "ValueSpecialEpisodeName": "Arbennik - {0}", + "TasksMaintenanceCategory": "Mentons", + "TasksApplicationCategory": "Gweythres", + "TasksChannelsCategory": "Kanolyow Kesrosweyth", + "TaskCleanLogs": "Glanhe Kevarwodhyador Kovlyver", + "TaskAudioNormalization": "Normalheans Klewans", + "TaskRefreshChannels": "Disegha Kanolyow", + "TaskCleanTranscode": "Glanhe Kevarwodhyador Treylya", + "TaskUpdatePlugins": "Nowedhi Ystynansow", + "Shows": "Diskwedhyansow", + "TaskCleanCache": "Glanhe Kevarwodhyador Gwithva", + "TaskCleanActivityLogDescription": "Y hwra dilea lin kovlyver gwrians kottha ages an bloodh dewisys.", + "TaskCleanCacheDescription": "Y hwra dilea restrennow gwithva nag yw res rag an kevreyth.", + "TaskRefreshPeopleDescription": "Y hwra nowedhi metadata rag gwarioryon ha kevarwodhoryon yn dha lyverva media.", + "TaskRefreshChapterImages": "Kuntel Imajys Chaptra", + "TaskRefreshChapterImagesDescription": "Y hwra ewines meus rag gwydhyowyow gans chaptraow.", + "TaskRefreshTrickplayImagesDescription": "Y hwra kynwelyow trickplay rag gwydhyowyow yn lyvervaow gallosegys.", + "TaskRefreshTrickplayImages": "Dinythi Imajys Trickplay", + "TaskCleanLogsDescription": "Y hwra dilea restrennow kovlyver a veu gwrys kyns nans yw {0} dydh.", + "TaskDownloadMissingLyrics": "Iskarga geryow kellys", + "TaskUpdatePluginsDescription": "Y hwra iskarga hag ynstallya nowedheansow rag ystynansow neb yw dewisys dhe nowedhi yn awtomatek.", + "TaskDownloadMissingSubtitles": "Iskarga istitlow kellys", + "TaskRefreshChannelsDescription": "Y hwra disegha kedhlow kanolyow kesrosweyth.", + "TaskDownloadMissingLyricsDescription": "Y hwra iskarga geryow rag kanow", + "TaskDownloadMissingSubtitlesDescription": "Y hwra hwilas an kesrosweyth rag istitlow kellys a-dhywoth dewisyans metadata.", + "TaskOptimizeDatabase": "Gwellhe selvanylyon", + "TaskOptimizeDatabaseDescription": "Y hwra kesstrotha ha berrhe efander rydh. Martesen y hwra gwellhe gwryth mar kwre'ta an oberen ma wosa ty dhe arhwilas an lyverva, po neb chanj aral neb a brof chanjyansow selvanylyon.", + "TaskAudioNormalizationDescription": "Y hwra arhwilas restrennow rag manylyon normalheans klewans.", + "TaskRefreshLibraryDescription": "Y hwra arhwilas dha lyverva media rag restrennow nowydh ha disegha metamanylyon.", + "TaskCleanCollectionsAndPlaylists": "Glanhe kuntellow ha rolyow-gwari", + "TaskKeyframeExtractor": "Estennell Framalhwedh", + "TaskCleanCollectionsAndPlaylistsDescription": "Y hwra dilea taklow a-dhyworth kuntellow ha rolyow-gwari na vos na moy.", + "TaskKeyframeExtractorDescription": "Y hwra kuntel framyowalhwedh a-dhyworth restrennow gwydhyowyow rag gul rolyow-gwari HLS moy poran. Martesen y hwra an oberen ma ow ponya rag termyn hir." } diff --git a/Emby.Server.Implementations/Localization/Core/nb.json b/Emby.Server.Implementations/Localization/Core/nb.json index b66818ddc..747652538 100644 --- a/Emby.Server.Implementations/Localization/Core/nb.json +++ b/Emby.Server.Implementations/Localization/Core/nb.json @@ -130,5 +130,7 @@ "TaskCleanCollectionsAndPlaylists": "Rydd kolleksjoner og spillelister", "TaskAudioNormalization": "Lyd Normalisering", "TaskAudioNormalizationDescription": "Skan filer for lyd normaliserende data", - "TaskCleanCollectionsAndPlaylistsDescription": "Fjerner elementer fra kolleksjoner og spillelister som ikke lengere finnes" + "TaskCleanCollectionsAndPlaylistsDescription": "Fjerner elementer fra kolleksjoner og spillelister som ikke lengere finnes", + "TaskDownloadMissingLyrics": "Last ned manglende tekster", + "TaskDownloadMissingLyricsDescription": "Last ned sangtekster" } diff --git a/Jellyfin.Api/Controllers/DynamicHlsController.cs b/Jellyfin.Api/Controllers/DynamicHlsController.cs index 016c5b163..662e2acbc 100644 --- a/Jellyfin.Api/Controllers/DynamicHlsController.cs +++ b/Jellyfin.Api/Controllers/DynamicHlsController.cs @@ -45,6 +45,7 @@ public class DynamicHlsController : BaseJellyfinApiController private const TranscodingJobType TranscodingJobType = MediaBrowser.Controller.MediaEncoding.TranscodingJobType.Hls; private readonly Version _minFFmpegFlacInMp4 = new Version(6, 0); + private readonly Version _minFFmpegX265BframeInFmp4 = new Version(7, 0, 1); private readonly ILibraryManager _libraryManager; private readonly IUserManager _userManager; @@ -1851,13 +1852,12 @@ public class DynamicHlsController : BaseJellyfinApiController args += _encodingHelper.GetHlsVideoKeyFrameArguments(state, codec, state.SegmentLength, isEventPlaylist, startNumber); // Currently b-frames in libx265 breaks the FMP4-HLS playback on iOS, disable it for now. - if (string.Equals(codec, "libx265", StringComparison.OrdinalIgnoreCase)) + if (string.Equals(codec, "libx265", StringComparison.OrdinalIgnoreCase) + && _mediaEncoder.EncoderVersion < _minFFmpegX265BframeInFmp4) { args += " -bf 0"; } - // args += " -mixed-refs 0 -refs 3 -x264opts b_pyramid=0:weightb=0:weightp=0"; - // video processing filters. var videoProcessParam = _encodingHelper.GetVideoProcessingFilterParam(state, _encodingOptions, codec); diff --git a/MediaBrowser.Controller/MediaEncoding/EncodingHelper.cs b/MediaBrowser.Controller/MediaEncoding/EncodingHelper.cs index 22f58ad70..db86a49f6 100644 --- a/MediaBrowser.Controller/MediaEncoding/EncodingHelper.cs +++ b/MediaBrowser.Controller/MediaEncoding/EncodingHelper.cs @@ -1484,7 +1484,6 @@ namespace MediaBrowser.Controller.MediaEncoding } } - // TODO: Perhaps also use original_size=1920x800 ?? return string.Format( CultureInfo.InvariantCulture, "subtitles=f='{0}'{1}{2}{3}{4}{5}", @@ -1506,7 +1505,6 @@ namespace MediaBrowser.Controller.MediaEncoding alphaParam, sub2videoParam, fontParam, - // fallbackFontParam, setPtsParam); } @@ -1780,12 +1778,6 @@ namespace MediaBrowser.Controller.MediaEncoding { param += " -preset veryfast"; } - - // Only h264_qsv has look_ahead option - if (string.Equals(videoEncoder, "h264_qsv", StringComparison.OrdinalIgnoreCase)) - { - param += " -look_ahead 0"; - } } else if (string.Equals(videoEncoder, "h264_nvenc", StringComparison.OrdinalIgnoreCase) // h264 (h264_nvenc) || string.Equals(videoEncoder, "hevc_nvenc", StringComparison.OrdinalIgnoreCase) // hevc (hevc_nvenc) @@ -2072,7 +2064,7 @@ namespace MediaBrowser.Controller.MediaEncoding if (string.Equals(videoEncoder, "libx264", StringComparison.OrdinalIgnoreCase)) { - param += " -x264opts:0 subme=0:me_range=4:rc_lookahead=10:me=dia:no_chroma_me:8x8dct=0:partitions=none"; + param += " -x264opts:0 subme=0:me_range=16:rc_lookahead=10:me=hex:open_gop=0"; } if (string.Equals(videoEncoder, "libx265", StringComparison.OrdinalIgnoreCase)) @@ -2080,8 +2072,7 @@ namespace MediaBrowser.Controller.MediaEncoding // libx265 only accept level option in -x265-params. // level option may cause libx265 to fail. // libx265 cannot adjust the given level, just throw an error. - // TODO: set fine tuned params. - param += " -x265-params:0 no-info=1"; + param += " -x265-params:0 subme=3:merange=25:rc-lookahead=10:me=star:ctu=32:max-tu-size=32:min-cu-size=16:rskip=2:rskip-edge-threshold=2:no-sao=1:no-strong-intra-smoothing=1:no-scenecut=1:no-open-gop=1:no-info=1"; } if (string.Equals(videoEncoder, "libsvtav1", StringComparison.OrdinalIgnoreCase) diff --git a/MediaBrowser.MediaEncoding/Encoder/EncodingUtils.cs b/MediaBrowser.MediaEncoding/Encoder/EncodingUtils.cs index c5f500e76..2daeac734 100644 --- a/MediaBrowser.MediaEncoding/Encoder/EncodingUtils.cs +++ b/MediaBrowser.MediaEncoding/Encoder/EncodingUtils.cs @@ -42,7 +42,7 @@ namespace MediaBrowser.MediaEncoding.Encoder // If there's more than one we'll need to use the concat command if (inputFiles.Count > 1) { - var files = string.Join("|", inputFiles.Select(NormalizePath)); + var files = string.Join('|', inputFiles.Select(NormalizePath)); return string.Format(CultureInfo.InvariantCulture, "concat:\"{0}\"", files); } diff --git a/MediaBrowser.MediaEncoding/Encoder/MediaEncoder.cs b/MediaBrowser.MediaEncoding/Encoder/MediaEncoder.cs index d9fe0594f..ba7a14344 100644 --- a/MediaBrowser.MediaEncoding/Encoder/MediaEncoder.cs +++ b/MediaBrowser.MediaEncoding/Encoder/MediaEncoder.cs @@ -719,8 +719,6 @@ namespace MediaBrowser.MediaEncoding.Encoder using (var processWrapper = new ProcessWrapper(process, this)) { - bool ranToCompletion; - using (await _thumbnailResourcePool.LockAsync(cancellationToken).ConfigureAwait(false)) { StartProcess(processWrapper); @@ -734,22 +732,18 @@ namespace MediaBrowser.MediaEncoding.Encoder try { await process.WaitForExitAsync(TimeSpan.FromMilliseconds(timeoutMs)).ConfigureAwait(false); - ranToCompletion = true; } - catch (OperationCanceledException) + catch (OperationCanceledException ex) { process.Kill(true); - ranToCompletion = false; + throw new FfmpegException(string.Format(CultureInfo.InvariantCulture, "ffmpeg image extraction timed out for {0} after {1}ms", inputPath, timeoutMs), ex); } } - var exitCode = ranToCompletion ? processWrapper.ExitCode ?? 0 : -1; var file = _fileSystem.GetFileInfo(tempExtractPath); - if (exitCode == -1 || !file.Exists || file.Length == 0) + if (processWrapper.ExitCode > 0 || !file.Exists || file.Length == 0) { - _logger.LogError("ffmpeg image extraction failed for {Path}", inputPath); - throw new FfmpegException(string.Format(CultureInfo.InvariantCulture, "ffmpeg image extraction failed for {0}", inputPath)); } |
