< Summary - Jellyfin

Information
Class: Emby.Server.Implementations.Library.ExternalDataManager
Assembly: Emby.Server.Implementations
File(s): /srv/git/jellyfin/Emby.Server.Implementations/Library/ExternalDataManager.cs
Line coverage
31%
Covered lines: 7
Uncovered lines: 15
Coverable lines: 22
Total lines: 83
Line coverage: 31.8%
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 3/6/2026 - 12:14:09 AM Line coverage: 100% (7/7) Total lines: 774/19/2026 - 12:14:27 AM Line coverage: 33.3% (7/21) Branch coverage: 0% (0/4) Total lines: 776/8/2026 - 12:16:15 AM Line coverage: 31.8% (7/22) Branch coverage: 0% (0/4) Total lines: 83 4/19/2026 - 12:14:27 AM Line coverage: 33.3% (7/21) Branch coverage: 0% (0/4) Total lines: 776/8/2026 - 12:16:15 AM Line coverage: 31.8% (7/22) Branch coverage: 0% (0/4) Total lines: 83

Coverage delta

Coverage delta 67 -67

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
DeleteExternalItemDataAsync()100%210%
DeleteExternalItemFiles(...)0%2040%

File(s)

/srv/git/jellyfin/Emby.Server.Implementations/Library/ExternalDataManager.cs

#LineLine coverage
 1using System;
 2using System.IO;
 3using System.Threading;
 4using System.Threading.Tasks;
 5using MediaBrowser.Controller.Chapters;
 6using MediaBrowser.Controller.Entities;
 7using MediaBrowser.Controller.IO;
 8using MediaBrowser.Controller.MediaSegments;
 9using MediaBrowser.Controller.Trickplay;
 10using Microsoft.Extensions.Logging;
 11
 12namespace Emby.Server.Implementations.Library;
 13
 14/// <summary>
 15/// IExternalDataManager implementation.
 16/// </summary>
 17public class ExternalDataManager : IExternalDataManager
 18{
 19    private readonly IKeyframeManager _keyframeManager;
 20    private readonly IMediaSegmentManager _mediaSegmentManager;
 21    private readonly IPathManager _pathManager;
 22    private readonly ITrickplayManager _trickplayManager;
 23    private readonly IChapterManager _chapterManager;
 24    private readonly ILogger<ExternalDataManager> _logger;
 25
 26    /// <summary>
 27    /// Initializes a new instance of the <see cref="ExternalDataManager"/> class.
 28    /// </summary>
 29    /// <param name="keyframeManager">The keyframe manager.</param>
 30    /// <param name="mediaSegmentManager">The media segment manager.</param>
 31    /// <param name="pathManager">The path manager.</param>
 32    /// <param name="trickplayManager">The trickplay manager.</param>
 33    /// <param name="chapterManager">The chapter manager.</param>
 34    /// <param name="logger">The logger.</param>
 35    public ExternalDataManager(
 36        IKeyframeManager keyframeManager,
 37        IMediaSegmentManager mediaSegmentManager,
 38        IPathManager pathManager,
 39        ITrickplayManager trickplayManager,
 40        IChapterManager chapterManager,
 41        ILogger<ExternalDataManager> logger)
 42    {
 2143        _keyframeManager = keyframeManager;
 2144        _mediaSegmentManager = mediaSegmentManager;
 2145        _pathManager = pathManager;
 2146        _trickplayManager = trickplayManager;
 2147        _chapterManager = chapterManager;
 2148        _logger = logger;
 2149    }
 50
 51    /// <inheritdoc/>
 52    public async Task DeleteExternalItemDataAsync(BaseItem item, CancellationToken cancellationToken)
 53    {
 054        DeleteExternalItemFiles(item);
 55
 056        var itemId = item.Id;
 057        await _keyframeManager.DeleteKeyframeDataAsync(itemId, cancellationToken).ConfigureAwait(false);
 058        await _mediaSegmentManager.DeleteSegmentsAsync(itemId, cancellationToken).ConfigureAwait(false);
 059        await _trickplayManager.DeleteTrickplayDataAsync(itemId, cancellationToken).ConfigureAwait(false);
 060        await _chapterManager.DeleteChapterDataAsync(itemId, cancellationToken).ConfigureAwait(false);
 061    }
 62
 63    /// <inheritdoc/>
 64    public void DeleteExternalItemFiles(BaseItem item)
 65    {
 066        foreach (var path in _pathManager.GetExtractedDataPaths(item))
 67        {
 068            if (!Directory.Exists(path))
 69            {
 70                continue;
 71            }
 72
 73            try
 74            {
 075                Directory.Delete(path, true);
 076            }
 077            catch (Exception ex)
 78            {
 079                _logger.LogWarning("Unable to prune external item data at {Path}: {Exception}", path, ex);
 080            }
 81        }
 082    }
 83}