mirror of
https://github.com/jellyfin/jellyfin.git
synced 2025-04-24 14:08:44 -04:00
Chapter Images:
- chapter image extraction intervals, limit count and resolutions can be set by the user from the server general settings;
This commit is contained in:
parent
c2902dd108
commit
12ec0e285d
4 changed files with 93 additions and 7 deletions
|
@ -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);
|
||||
|
@ -81,13 +82,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;
|
||||
}
|
||||
|
@ -598,6 +601,29 @@ namespace MediaBrowser.MediaEncoding.Encoder
|
|||
_ => ".jpg"
|
||||
};
|
||||
|
||||
bool enumConversionStatus = Enum.TryParse(_serverConfig.Configuration.ChapterImageResolution, out ImageResolution resolution);
|
||||
var outputResolution = string.Empty;
|
||||
|
||||
if (enumConversionStatus)
|
||||
{
|
||||
outputResolution = resolution switch
|
||||
{
|
||||
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(outputResolution))
|
||||
{
|
||||
outputResolution = " -s " + outputResolution;
|
||||
}
|
||||
}
|
||||
|
||||
var tempExtractPath = Path.Combine(_configurationManager.ApplicationPaths.TempDirectory, Guid.NewGuid() + outputExtension);
|
||||
Directory.CreateDirectory(Path.GetDirectoryName(tempExtractPath));
|
||||
|
||||
|
@ -651,7 +677,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, outputResolution);
|
||||
|
||||
if (offset.HasValue)
|
||||
{
|
||||
|
|
|
@ -240,5 +240,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 string ChapterImageResolution { get; set; } = "Match Source";
|
||||
}
|
||||
}
|
||||
|
|
43
MediaBrowser.Model/Drawing/ImageResolution.cs
Normal file
43
MediaBrowser.Model/Drawing/ImageResolution.cs
Normal file
|
@ -0,0 +1,43 @@
|
|||
namespace MediaBrowser.Model.Drawing
|
||||
{
|
||||
/// <summary>
|
||||
/// Enum ImageResolution.
|
||||
/// </summary>
|
||||
public enum ImageResolution
|
||||
{
|
||||
/// <summary>
|
||||
/// 240p.
|
||||
/// </summary>
|
||||
P240,
|
||||
|
||||
/// <summary>
|
||||
/// 360p.
|
||||
/// </summary>
|
||||
P360,
|
||||
|
||||
/// <summary>
|
||||
/// 480p.
|
||||
/// </summary>
|
||||
P480,
|
||||
|
||||
/// <summary>
|
||||
/// 720p.
|
||||
/// </summary>
|
||||
P720,
|
||||
|
||||
/// <summary>
|
||||
/// 1080p.
|
||||
/// </summary>
|
||||
P1080,
|
||||
|
||||
/// <summary>
|
||||
/// 1440p.
|
||||
/// </summary>
|
||||
P1440,
|
||||
|
||||
/// <summary>
|
||||
/// 2160p.
|
||||
/// </summary>
|
||||
P2160
|
||||
}
|
||||
}
|
|
@ -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 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);
|
||||
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;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue