aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--MediaBrowser.MediaEncoding/Encoder/MediaEncoder.cs33
-rw-r--r--MediaBrowser.Model/Configuration/ServerConfiguration.cs19
-rw-r--r--MediaBrowser.Model/Drawing/ImageResolution.cs52
-rw-r--r--MediaBrowser.Providers/MediaInfo/FFProbeVideoInfo.cs11
4 files changed, 107 insertions, 8 deletions
diff --git a/MediaBrowser.MediaEncoding/Encoder/MediaEncoder.cs b/MediaBrowser.MediaEncoding/Encoder/MediaEncoder.cs
index ec3412f90..b7c49ed99 100644
--- a/MediaBrowser.MediaEncoding/Encoder/MediaEncoder.cs
+++ b/MediaBrowser.MediaEncoding/Encoder/MediaEncoder.cs
@@ -51,6 +51,7 @@ namespace MediaBrowser.MediaEncoding.Encoder
private readonly IFileSystem _fileSystem;
private readonly ILocalizationManager _localization;
private readonly IConfiguration _config;
+ private readonly IServerConfigurationManager _serverConfig;
private readonly string _startupOptionFFmpegPath;
private readonly SemaphoreSlim _thumbnailResourcePool = new SemaphoreSlim(2, 2);
@@ -93,13 +94,15 @@ namespace MediaBrowser.MediaEncoding.Encoder
IServerConfigurationManager configurationManager,
IFileSystem fileSystem,
ILocalizationManager localization,
- IConfiguration config)
+ IConfiguration config,
+ IServerConfigurationManager serverConfig)
{
_logger = logger;
_configurationManager = configurationManager;
_fileSystem = fileSystem;
_localization = localization;
_config = config;
+ _serverConfig = serverConfig;
_startupOptionFFmpegPath = config.GetValue<string>(Controller.Extensions.ConfigurationExtensions.FfmpegPathKey) ?? string.Empty;
_jsonSerializerOptions = JsonDefaults.Options;
}
@@ -606,6 +609,32 @@ namespace MediaBrowser.MediaEncoding.Encoder
return await ExtractImageInternal(inputArgument, container, videoStream, imageStreamIndex, threedFormat, offset, false, targetFormat, cancellationToken).ConfigureAwait(false);
}
+ private string GetImageResolutionParameter()
+ {
+ string imageResolutionParameter;
+
+ imageResolutionParameter = _serverConfig.Configuration.ChapterImageResolution switch
+ {
+ ImageResolution.P144 => "256x144",
+ ImageResolution.P240 => "426x240",
+ ImageResolution.P360 => "640x360",
+ ImageResolution.P480 => "854x480",
+ ImageResolution.P720 => "1280x720",
+ ImageResolution.P1080 => "1920x1080",
+ ImageResolution.P1440 => "2560x1440",
+ ImageResolution.P2160 => "3840x2160",
+ _ => string.Empty
+ };
+
+ if (!string.IsNullOrEmpty(imageResolutionParameter))
+ {
+ imageResolutionParameter = " -s " + imageResolutionParameter;
+ }
+
+ return imageResolutionParameter;
+ }
+
+
private async Task<string> ExtractImageInternal(string inputPath, string container, MediaStream videoStream, int? imageStreamIndex, Video3DFormat? threedFormat, TimeSpan? offset, bool useIFrame, ImageFormat? targetFormat, CancellationToken cancellationToken)
{
if (string.IsNullOrEmpty(inputPath))
@@ -676,7 +705,7 @@ namespace MediaBrowser.MediaEncoding.Encoder
var vf = string.Join(',', filters);
var mapArg = imageStreamIndex.HasValue ? (" -map 0:" + imageStreamIndex.Value.ToString(CultureInfo.InvariantCulture)) : string.Empty;
- var args = string.Format(CultureInfo.InvariantCulture, "-i {0}{3} -threads {4} -v quiet -vframes 1 -vf {2} -f image2 \"{1}\"", inputPath, tempExtractPath, vf, mapArg, _threads);
+ var args = string.Format(CultureInfo.InvariantCulture, "-i {0}{3} -threads {4} -v quiet -vframes 1 -vf {2}{5} -f image2 \"{1}\"", inputPath, tempExtractPath, vf, mapArg, _threads, GetImageResolutionParameter());
if (offset.HasValue)
{
diff --git a/MediaBrowser.Model/Configuration/ServerConfiguration.cs b/MediaBrowser.Model/Configuration/ServerConfiguration.cs
index e61b896b9..a07ab7121 100644
--- a/MediaBrowser.Model/Configuration/ServerConfiguration.cs
+++ b/MediaBrowser.Model/Configuration/ServerConfiguration.cs
@@ -3,6 +3,7 @@
using System;
using System.Collections.Generic;
+using MediaBrowser.Model.Drawing;
using MediaBrowser.Model.Dto;
using MediaBrowser.Model.Updates;
@@ -240,5 +241,23 @@ namespace MediaBrowser.Model.Configuration
/// Gets or sets a value indicating whether clients should be allowed to upload logs.
/// </summary>
public bool AllowClientLogUpload { get; set; } = true;
+
+ /// <summary>
+ /// Gets or sets the dummy chapters duration in seconds.
+ /// </summary>
+ /// <value>The dummy chapters duration.</value>
+ public int DummyChapterDuration { get; set; } = 300;
+
+ /// <summary>
+ /// Gets or sets the dummy chapter count.
+ /// </summary>
+ /// <value>The dummy chapter count.</value>
+ public int DummyChapterCount { get; set; } = 100;
+
+ /// <summary>
+ /// Gets or sets the chapter image resolution.
+ /// </summary>
+ /// <value>The chapter image resolution.</value>
+ public ImageResolution ChapterImageResolution { get; set; } = ImageResolution.MatchSource;
}
}
diff --git a/MediaBrowser.Model/Drawing/ImageResolution.cs b/MediaBrowser.Model/Drawing/ImageResolution.cs
new file mode 100644
index 000000000..34738b799
--- /dev/null
+++ b/MediaBrowser.Model/Drawing/ImageResolution.cs
@@ -0,0 +1,52 @@
+namespace MediaBrowser.Model.Drawing;
+
+/// <summary>
+/// Enum ImageResolution.
+/// </summary>
+public enum ImageResolution
+{
+ /// <summary>
+ /// MatchSource.
+ /// </summary>
+ MatchSource = 0,
+
+ /// <summary>
+ /// 144p.
+ /// </summary>
+ P144 = 1,
+
+ /// <summary>
+ /// 240p.
+ /// </summary>
+ P240 = 2,
+
+ /// <summary>
+ /// 360p.
+ /// </summary>
+ P360 = 3,
+
+ /// <summary>
+ /// 480p.
+ /// </summary>
+ P480 = 4,
+
+ /// <summary>
+ /// 720p.
+ /// </summary>
+ P720 = 5,
+
+ /// <summary>
+ /// 1080p.
+ /// </summary>
+ P1080 = 6,
+
+ /// <summary>
+ /// 1440p.
+ /// </summary>
+ P1440 = 7,
+
+ /// <summary>
+ /// 2160p.
+ /// </summary>
+ P2160 = 8
+}
diff --git a/MediaBrowser.Providers/MediaInfo/FFProbeVideoInfo.cs b/MediaBrowser.Providers/MediaInfo/FFProbeVideoInfo.cs
index f00023947..7412a10d0 100644
--- a/MediaBrowser.Providers/MediaInfo/FFProbeVideoInfo.cs
+++ b/MediaBrowser.Providers/MediaInfo/FFProbeVideoInfo.cs
@@ -48,8 +48,6 @@ namespace MediaBrowser.Providers.MediaInfo
private readonly SubtitleResolver _subtitleResolver;
private readonly IMediaSourceManager _mediaSourceManager;
- private readonly long _dummyChapterDuration = TimeSpan.FromMinutes(5).Ticks;
-
public FFProbeVideoInfo(
ILogger<FFProbeVideoInfo> logger,
IMediaSourceManager mediaSourceManager,
@@ -651,6 +649,7 @@ namespace MediaBrowser.Providers.MediaInfo
private ChapterInfo[] CreateDummyChapters(Video video)
{
var runtime = video.RunTimeTicks ?? 0;
+ long dummyChapterDuration = TimeSpan.FromSeconds(_config.Configuration.DummyChapterDuration).Ticks;
if (runtime < 0)
{
@@ -662,13 +661,13 @@ namespace MediaBrowser.Providers.MediaInfo
runtime));
}
- if (runtime < _dummyChapterDuration)
+ if (runtime < dummyChapterDuration)
{
return Array.Empty<ChapterInfo>();
}
- // Limit to 100 chapters just in case there's some incorrect metadata here
- int chapterCount = (int)Math.Min(runtime / _dummyChapterDuration, 100);
+ // Limit the chapters just in case there's some incorrect metadata here
+ int chapterCount = (int)Math.Min(runtime / dummyChapterDuration, _config.Configuration.DummyChapterCount);
var chapters = new ChapterInfo[chapterCount];
long currentChapterTicks = 0;
@@ -679,7 +678,7 @@ namespace MediaBrowser.Providers.MediaInfo
StartPositionTicks = currentChapterTicks
};
- currentChapterTicks += _dummyChapterDuration;
+ currentChapterTicks += dummyChapterDuration;
}
return chapters;