aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.github/workflows/ci-openapi.yml4
-rw-r--r--Emby.Server.Implementations/Localization/Core/kw.json82
-rw-r--r--Emby.Server.Implementations/Localization/Core/nb.json4
-rw-r--r--Jellyfin.Api/Controllers/DynamicHlsController.cs6
-rw-r--r--MediaBrowser.Controller/MediaEncoding/EncodingHelper.cs13
-rw-r--r--MediaBrowser.MediaEncoding/Encoder/EncodingUtils.cs2
-rw-r--r--MediaBrowser.MediaEncoding/Encoder/MediaEncoder.cs12
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));
}