< Summary - Jellyfin

Information
Class: Jellyfin.MediaEncoding.Hls.Cache.CacheDecorator
Assembly: Jellyfin.MediaEncoding.Hls
File(s): /srv/git/jellyfin/src/Jellyfin.MediaEncoding.Hls/Cache/CacheDecorator.cs
Line coverage
39%
Covered lines: 9
Uncovered lines: 14
Coverable lines: 23
Total lines: 61
Line coverage: 39.1%
Branch coverage
0%
Covered branches: 0
Total branches: 4
Branch coverage: 0%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Coverage history

Coverage history 0 25 50 75 100

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
get_IsMetadataBased()100%11100%
TryExtractKeyframes(...)0%2040%

File(s)

/srv/git/jellyfin/src/Jellyfin.MediaEncoding.Hls/Cache/CacheDecorator.cs

#LineLine coverage
 1#pragma warning disable CA1826 // Do not use Enumerable methods on indexable collections
 2
 3using System;
 4using System.Diagnostics.CodeAnalysis;
 5using System.Linq;
 6using System.Threading;
 7using Jellyfin.MediaEncoding.Hls.Extractors;
 8using Jellyfin.MediaEncoding.Keyframes;
 9using MediaBrowser.Controller.Persistence;
 10using Microsoft.Extensions.Logging;
 11
 12namespace Jellyfin.MediaEncoding.Hls.Cache;
 13
 14/// <inheritdoc />
 15public class CacheDecorator : IKeyframeExtractor
 16{
 17    private readonly IKeyframeRepository _keyframeRepository;
 18    private readonly IKeyframeExtractor _keyframeExtractor;
 19    private readonly ILogger<CacheDecorator> _logger;
 20    private readonly string _keyframeExtractorName;
 21
 22    /// <summary>
 23    /// Initializes a new instance of the <see cref="CacheDecorator"/> class.
 24    /// </summary>
 25    /// <param name="keyframeRepository">An instance of the <see cref="IKeyframeRepository"/> interface.</param>
 26    /// <param name="keyframeExtractor">An instance of the <see cref="IKeyframeExtractor"/> interface.</param>
 27    /// <param name="logger">An instance of the <see cref="ILogger{CacheDecorator}"/> interface.</param>
 28    public CacheDecorator(IKeyframeRepository keyframeRepository, IKeyframeExtractor keyframeExtractor, ILogger<CacheDec
 4229    {
 4230        ArgumentNullException.ThrowIfNull(keyframeRepository);
 4231        ArgumentNullException.ThrowIfNull(keyframeExtractor);
 32
 4233        _keyframeRepository = keyframeRepository;
 4234        _keyframeExtractor = keyframeExtractor;
 4235        _logger = logger;
 4236        _keyframeExtractorName = keyframeExtractor.GetType().Name;
 4237    }
 38
 39    /// <inheritdoc />
 4240    public bool IsMetadataBased => _keyframeExtractor.IsMetadataBased;
 41
 42    /// <inheritdoc />
 43    public bool TryExtractKeyframes(Guid itemId, string filePath, [NotNullWhen(true)] out KeyframeData? keyframeData)
 044    {
 045        keyframeData = _keyframeRepository.GetKeyframeData(itemId).FirstOrDefault();
 046        if (keyframeData is null)
 047        {
 048            if (!_keyframeExtractor.TryExtractKeyframes(itemId, filePath, out var result))
 049            {
 050                _logger.LogDebug("Failed to extract keyframes using {ExtractorName}", _keyframeExtractorName);
 051                return false;
 52            }
 53
 054            _logger.LogDebug("Successfully extracted keyframes using {ExtractorName}", _keyframeExtractorName);
 055            keyframeData = result;
 056            _keyframeRepository.SaveKeyframeDataAsync(itemId, keyframeData, CancellationToken.None).GetAwaiter().GetResu
 057        }
 58
 059        return true;
 060    }
 61}