using System; using System.Diagnostics.CodeAnalysis; using System.IO; using Emby.Naming.Common; using Jellyfin.Extensions; using Jellyfin.MediaEncoding.Keyframes; using MediaBrowser.Controller.MediaEncoding; using Microsoft.Extensions.Logging; using Extractor = Jellyfin.MediaEncoding.Keyframes.FfProbe.FfProbeKeyframeExtractor; namespace Jellyfin.MediaEncoding.Hls.Extractors; /// public class FfProbeKeyframeExtractor : IKeyframeExtractor { private readonly IMediaEncoder _mediaEncoder; private readonly NamingOptions _namingOptions; private readonly ILogger _logger; /// /// Initializes a new instance of the class. /// /// An instance of the interface. /// An instance of . /// An instance of the interface. public FfProbeKeyframeExtractor(IMediaEncoder mediaEncoder, NamingOptions namingOptions, ILogger logger) { _mediaEncoder = mediaEncoder; _namingOptions = namingOptions; _logger = logger; } /// public bool IsMetadataBased => false; /// public bool TryExtractKeyframes(Guid itemId, string filePath, [NotNullWhen(true)] out KeyframeData? keyframeData) { if (!_namingOptions.VideoFileExtensions.Contains(Path.GetExtension(filePath.AsSpan()), StringComparison.OrdinalIgnoreCase)) { keyframeData = null; return false; } try { keyframeData = Extractor.GetKeyframeData(_mediaEncoder.ProbePath, filePath); return keyframeData.KeyframeTicks.Count > 0; } catch (Exception ex) { _logger.LogError(ex, "Extracting keyframes from {FilePath} using ffprobe failed", filePath); } keyframeData = null; return false; } }