< 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
100%
Covered lines: 7
Uncovered lines: 0
Coverable lines: 7
Total lines: 77
Line coverage: 100%
Branch coverage
N/A
Covered branches: 0
Total branches: 0
Branch coverage: N/A
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Coverage history

Coverage history 0 25 50 75 100 7/22/2025 - 12:11:20 AM Line coverage: 100% (6/6) Total lines: 7110/14/2025 - 12:11:23 AM Line coverage: 100% (7/7) Total lines: 77

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%

File(s)

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

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