Browse Source

Cleanup external item data cleanup (#14072)

Tim Eisele 3 weeks ago
parent
commit
49c6a99e00
47 changed files with 295 additions and 374 deletions
  1. 15 12
      Emby.Server.Implementations/ApplicationHost.cs
  2. 58 0
      Emby.Server.Implementations/Library/ExternalDataManager.cs
  3. 15 46
      Emby.Server.Implementations/Library/LibraryManager.cs
  4. 2 1
      Emby.Server.Implementations/ScheduledTasks/Tasks/MediaSegmentExtractionTask.cs
  5. 3 3
      Emby.Server.Implementations/Sorting/DateLastMediaAddedComparer.cs
  6. 4 4
      Emby.Server.Implementations/Sorting/DatePlayedComparer.cs
  7. 3 3
      Emby.Server.Implementations/Sorting/IsFavoriteOrLikeComparer.cs
  8. 3 3
      Emby.Server.Implementations/Sorting/IsPlayedComparer.cs
  9. 3 3
      Emby.Server.Implementations/Sorting/IsUnplayedComparer.cs
  10. 4 4
      Emby.Server.Implementations/Sorting/PlayCountComparer.cs
  11. 2 1
      Jellyfin.Api/Controllers/MediaSegmentsController.cs
  12. 8 22
      Jellyfin.Server.Implementations/MediaSegments/MediaSegmentManager.cs
  13. 13 12
      Jellyfin.Server.Implementations/Trickplay/TrickplayManager.cs
  14. 1 1
      MediaBrowser.Controller/Entities/BaseItem.cs
  15. 38 1
      MediaBrowser.Controller/Entities/TV/Episode.cs
  16. 19 0
      MediaBrowser.Controller/IO/IExternalDataManager.cs
  17. 8 13
      MediaBrowser.Controller/MediaSegments/IMediaSegmentManager.cs
  18. 1 1
      MediaBrowser.Controller/Sorting/IUserBaseItemComparer.cs
  19. 10 2
      MediaBrowser.Controller/Trickplay/ITrickplayManager.cs
  20. 3 8
      MediaBrowser.Providers/Books/AudioBookMetadataService.cs
  21. 3 8
      MediaBrowser.Providers/Books/BookMetadataService.cs
  22. 3 8
      MediaBrowser.Providers/BoxSets/BoxSetMetadataService.cs
  23. 3 8
      MediaBrowser.Providers/Channels/ChannelMetadataService.cs
  24. 3 8
      MediaBrowser.Providers/Folders/CollectionFolderMetadataService.cs
  25. 3 8
      MediaBrowser.Providers/Folders/FolderMetadataService.cs
  26. 3 8
      MediaBrowser.Providers/Folders/UserViewMetadataService.cs
  27. 3 8
      MediaBrowser.Providers/Genres/GenreMetadataService.cs
  28. 3 8
      MediaBrowser.Providers/LiveTv/LiveTvMetadataService.cs
  29. 6 33
      MediaBrowser.Providers/Manager/MetadataService.cs
  30. 3 8
      MediaBrowser.Providers/Movies/MovieMetadataService.cs
  31. 3 8
      MediaBrowser.Providers/Movies/TrailerMetadataService.cs
  32. 3 8
      MediaBrowser.Providers/Music/AlbumMetadataService.cs
  33. 3 8
      MediaBrowser.Providers/Music/ArtistMetadataService.cs
  34. 3 8
      MediaBrowser.Providers/Music/AudioMetadataService.cs
  35. 3 8
      MediaBrowser.Providers/Music/MusicVideoMetadataService.cs
  36. 3 8
      MediaBrowser.Providers/MusicGenres/MusicGenreMetadataService.cs
  37. 3 8
      MediaBrowser.Providers/People/PersonMetadataService.cs
  38. 3 8
      MediaBrowser.Providers/Photos/PhotoAlbumMetadataService.cs
  39. 3 8
      MediaBrowser.Providers/Photos/PhotoMetadataService.cs
  40. 3 8
      MediaBrowser.Providers/Playlists/PlaylistMetadataService.cs
  41. 3 8
      MediaBrowser.Providers/Studios/StudioMetadataService.cs
  42. 3 8
      MediaBrowser.Providers/TV/EpisodeMetadataService.cs
  43. 3 8
      MediaBrowser.Providers/TV/SeasonMetadataService.cs
  44. 3 8
      MediaBrowser.Providers/TV/SeriesMetadataService.cs
  45. 1 1
      MediaBrowser.Providers/Trickplay/TrickplayProvider.cs
  46. 3 8
      MediaBrowser.Providers/Videos/VideoMetadataService.cs
  47. 3 8
      MediaBrowser.Providers/Years/YearMetadataService.cs

+ 15 - 12
Emby.Server.Implementations/ApplicationHost.cs

@@ -57,6 +57,7 @@ using MediaBrowser.Controller.Configuration;
 using MediaBrowser.Controller.Drawing;
 using MediaBrowser.Controller.Dto;
 using MediaBrowser.Controller.Entities;
+using MediaBrowser.Controller.Entities.TV;
 using MediaBrowser.Controller.IO;
 using MediaBrowser.Controller.Library;
 using MediaBrowser.Controller.LiveTv;
@@ -511,6 +512,7 @@ namespace Emby.Server.Implementations
             serviceCollection.AddSingleton<IMediaEncoder, MediaBrowser.MediaEncoding.Encoder.MediaEncoder>();
             serviceCollection.AddSingleton<EncodingHelper>();
             serviceCollection.AddSingleton<IPathManager, PathManager>();
+            serviceCollection.AddSingleton<IExternalDataManager, ExternalDataManager>();
 
             // TODO: Refactor to eliminate the circular dependencies here so that Lazy<T> isn't required
             serviceCollection.AddTransient(provider => new Lazy<ILibraryMonitor>(provider.GetRequiredService<ILibraryMonitor>));
@@ -627,24 +629,25 @@ namespace Emby.Server.Implementations
         private void SetStaticProperties()
         {
             // For now there's no real way to inject these properly
-            BaseItem.Logger = Resolve<ILogger<BaseItem>>();
+            BaseItem.ChapterManager = Resolve<IChapterManager>();
+            BaseItem.ChannelManager = Resolve<IChannelManager>();
             BaseItem.ConfigurationManager = ConfigurationManager;
+            BaseItem.FileSystem = Resolve<IFileSystem>();
+            BaseItem.ItemRepository = Resolve<IItemRepository>();
             BaseItem.LibraryManager = Resolve<ILibraryManager>();
-            BaseItem.ProviderManager = Resolve<IProviderManager>();
             BaseItem.LocalizationManager = Resolve<ILocalizationManager>();
-            BaseItem.ItemRepository = Resolve<IItemRepository>();
-            BaseItem.ChapterManager = Resolve<IChapterManager>();
-            BaseItem.FileSystem = Resolve<IFileSystem>();
-            BaseItem.UserDataManager = Resolve<IUserDataManager>();
-            BaseItem.ChannelManager = Resolve<IChannelManager>();
-            Video.RecordingsManager = Resolve<IRecordingsManager>();
-            Folder.UserViewManager = Resolve<IUserViewManager>();
-            UserView.TVSeriesManager = Resolve<ITVSeriesManager>();
-            UserView.CollectionManager = Resolve<ICollectionManager>();
-            BaseItem.MediaSourceManager = Resolve<IMediaSourceManager>();
+            BaseItem.Logger = Resolve<ILogger<BaseItem>>();
             BaseItem.MediaSegmentManager = Resolve<IMediaSegmentManager>();
+            BaseItem.MediaSourceManager = Resolve<IMediaSourceManager>();
+            BaseItem.ProviderManager = Resolve<IProviderManager>();
+            BaseItem.UserDataManager = Resolve<IUserDataManager>();
             CollectionFolder.XmlSerializer = _xmlSerializer;
             CollectionFolder.ApplicationHost = this;
+            Folder.UserViewManager = Resolve<IUserViewManager>();
+            Folder.CollectionManager = Resolve<ICollectionManager>();
+            Episode.MediaEncoder = Resolve<IMediaEncoder>();
+            UserView.TVSeriesManager = Resolve<ITVSeriesManager>();
+            Video.RecordingsManager = Resolve<IRecordingsManager>();
         }
 
         /// <summary>

+ 58 - 0
Emby.Server.Implementations/Library/ExternalDataManager.cs

@@ -0,0 +1,58 @@
+using System.IO;
+using System.Linq;
+using System.Threading;
+using System.Threading.Tasks;
+using MediaBrowser.Controller.Entities;
+using MediaBrowser.Controller.IO;
+using MediaBrowser.Controller.MediaSegments;
+using MediaBrowser.Controller.Trickplay;
+
+namespace Emby.Server.Implementations.Library;
+
+/// <summary>
+/// IExternalDataManager implementation.
+/// </summary>
+public class ExternalDataManager : IExternalDataManager
+{
+    private readonly IKeyframeManager _keyframeManager;
+    private readonly IMediaSegmentManager _mediaSegmentManager;
+    private readonly IPathManager _pathManager;
+    private readonly ITrickplayManager _trickplayManager;
+
+    /// <summary>
+    /// Initializes a new instance of the <see cref="ExternalDataManager"/> class.
+    /// </summary>
+    /// <param name="keyframeManager">The keyframe manager.</param>
+    /// <param name="mediaSegmentManager">The media segment manager.</param>
+    /// <param name="pathManager">The path manager.</param>
+    /// <param name="trickplayManager">The trickplay manager.</param>
+    public ExternalDataManager(
+        IKeyframeManager keyframeManager,
+        IMediaSegmentManager mediaSegmentManager,
+        IPathManager pathManager,
+        ITrickplayManager trickplayManager)
+    {
+        _keyframeManager = keyframeManager;
+        _mediaSegmentManager = mediaSegmentManager;
+        _pathManager = pathManager;
+        _trickplayManager = trickplayManager;
+    }
+
+    /// <inheritdoc/>
+    public async Task DeleteExternalItemDataAsync(BaseItem item, CancellationToken cancellationToken)
+    {
+        var validPaths = _pathManager.GetExtractedDataPaths(item).Where(Directory.Exists).ToList();
+        var itemId = item.Id;
+        if (validPaths.Count > 0)
+        {
+            foreach (var path in validPaths)
+            {
+                Directory.Delete(path, true);
+            }
+        }
+
+        await _keyframeManager.DeleteKeyframeDataAsync(itemId, cancellationToken).ConfigureAwait(false);
+        await _mediaSegmentManager.DeleteSegmentsAsync(itemId, cancellationToken).ConfigureAwait(false);
+        await _trickplayManager.DeleteTrickplayDataAsync(itemId, cancellationToken).ConfigureAwait(false);
+    }
+}

+ 15 - 46
Emby.Server.Implementations/Library/LibraryManager.cs

@@ -34,10 +34,12 @@ using MediaBrowser.Controller.IO;
 using MediaBrowser.Controller.Library;
 using MediaBrowser.Controller.LiveTv;
 using MediaBrowser.Controller.MediaEncoding;
+using MediaBrowser.Controller.MediaSegments;
 using MediaBrowser.Controller.Persistence;
 using MediaBrowser.Controller.Providers;
 using MediaBrowser.Controller.Resolvers;
 using MediaBrowser.Controller.Sorting;
+using MediaBrowser.Controller.Trickplay;
 using MediaBrowser.Model.Configuration;
 using MediaBrowser.Model.Dlna;
 using MediaBrowser.Model.Drawing;
@@ -66,11 +68,11 @@ namespace Emby.Server.Implementations.Library
         private readonly ILogger<LibraryManager> _logger;
         private readonly ITaskManager _taskManager;
         private readonly IUserManager _userManager;
-        private readonly IUserDataManager _userDataRepository;
+        private readonly IUserDataManager _userDataManager;
         private readonly IServerConfigurationManager _configurationManager;
         private readonly Lazy<ILibraryMonitor> _libraryMonitorFactory;
         private readonly Lazy<IProviderManager> _providerManagerFactory;
-        private readonly Lazy<IUserViewManager> _userviewManagerFactory;
+        private readonly Lazy<IUserViewManager> _userViewManagerFactory;
         private readonly IServerApplicationHost _appHost;
         private readonly IMediaEncoder _mediaEncoder;
         private readonly IFileSystem _fileSystem;
@@ -106,11 +108,11 @@ namespace Emby.Server.Implementations.Library
         /// <param name="taskManager">The task manager.</param>
         /// <param name="userManager">The user manager.</param>
         /// <param name="configurationManager">The configuration manager.</param>
-        /// <param name="userDataRepository">The user data repository.</param>
+        /// <param name="userDataManager">The user data manager.</param>
         /// <param name="libraryMonitorFactory">The library monitor.</param>
         /// <param name="fileSystem">The file system.</param>
         /// <param name="providerManagerFactory">The provider manager.</param>
-        /// <param name="userviewManagerFactory">The userview manager.</param>
+        /// <param name="userViewManagerFactory">The user view manager.</param>
         /// <param name="mediaEncoder">The media encoder.</param>
         /// <param name="itemRepository">The item repository.</param>
         /// <param name="imageProcessor">The image processor.</param>
@@ -124,11 +126,11 @@ namespace Emby.Server.Implementations.Library
             ITaskManager taskManager,
             IUserManager userManager,
             IServerConfigurationManager configurationManager,
-            IUserDataManager userDataRepository,
+            IUserDataManager userDataManager,
             Lazy<ILibraryMonitor> libraryMonitorFactory,
             IFileSystem fileSystem,
             Lazy<IProviderManager> providerManagerFactory,
-            Lazy<IUserViewManager> userviewManagerFactory,
+            Lazy<IUserViewManager> userViewManagerFactory,
             IMediaEncoder mediaEncoder,
             IItemRepository itemRepository,
             IImageProcessor imageProcessor,
@@ -142,11 +144,11 @@ namespace Emby.Server.Implementations.Library
             _taskManager = taskManager;
             _userManager = userManager;
             _configurationManager = configurationManager;
-            _userDataRepository = userDataRepository;
+            _userDataManager = userDataManager;
             _libraryMonitorFactory = libraryMonitorFactory;
             _fileSystem = fileSystem;
             _providerManagerFactory = providerManagerFactory;
-            _userviewManagerFactory = userviewManagerFactory;
+            _userViewManagerFactory = userViewManagerFactory;
             _mediaEncoder = mediaEncoder;
             _itemRepository = itemRepository;
             _imageProcessor = imageProcessor;
@@ -202,7 +204,7 @@ namespace Emby.Server.Implementations.Library
 
         private IProviderManager ProviderManager => _providerManagerFactory.Value;
 
-        private IUserViewManager UserViewManager => _userviewManagerFactory.Value;
+        private IUserViewManager UserViewManager => _userViewManagerFactory.Value;
 
         /// <summary>
         /// Gets or sets the postscan tasks.
@@ -1889,7 +1891,7 @@ namespace Emby.Server.Implementations.Library
 
                 userComparer.User = user;
                 userComparer.UserManager = _userManager;
-                userComparer.UserDataRepository = _userDataRepository;
+                userComparer.UserDataManager = _userDataManager;
 
                 return userComparer;
             }
@@ -2586,7 +2588,6 @@ namespace Emby.Server.Implementations.Library
 
             var isFolder = episode.VideoType == VideoType.BluRay || episode.VideoType == VideoType.Dvd;
 
-            // TODO nullable - what are we trying to do there with empty episodeInfo?
             EpisodeInfo? episodeInfo = null;
             if (episode.IsFileProtocol)
             {
@@ -2604,44 +2605,12 @@ namespace Emby.Server.Implementations.Library
                 }
             }
 
-            episodeInfo ??= new EpisodeInfo(episode.Path);
-
-            try
-            {
-                var libraryOptions = GetLibraryOptions(episode);
-                if (libraryOptions.EnableEmbeddedEpisodeInfos && string.Equals(episodeInfo.Container, "mp4", StringComparison.OrdinalIgnoreCase))
-                {
-                    // Read from metadata
-                    var mediaInfo = _mediaEncoder.GetMediaInfo(
-                        new MediaInfoRequest
-                        {
-                            MediaSource = episode.GetMediaSources(false)[0],
-                            MediaType = DlnaProfileType.Video
-                        },
-                        CancellationToken.None).GetAwaiter().GetResult();
-                    if (mediaInfo.ParentIndexNumber > 0)
-                    {
-                        episodeInfo.SeasonNumber = mediaInfo.ParentIndexNumber;
-                    }
-
-                    if (mediaInfo.IndexNumber > 0)
-                    {
-                        episodeInfo.EpisodeNumber = mediaInfo.IndexNumber;
-                    }
-
-                    if (!string.IsNullOrEmpty(mediaInfo.ShowName))
-                    {
-                        episodeInfo.SeriesName = mediaInfo.ShowName;
-                    }
-                }
-            }
-            catch (Exception ex)
+            var changed = false;
+            if (episodeInfo is null)
             {
-                _logger.LogError(ex, "Error reading the episode information with ffprobe. Episode: {EpisodeInfo}", episodeInfo.Path);
+                return changed;
             }
 
-            var changed = false;
-
             if (episodeInfo.IsByDate)
             {
                 if (episode.IndexNumber.HasValue)

+ 2 - 1
Emby.Server.Implementations/ScheduledTasks/Tasks/MediaSegmentExtractionTask.cs

@@ -91,7 +91,8 @@ public class MediaSegmentExtractionTask : IScheduledTask
                 // Only local files supported
                 if (item.IsFileProtocol && File.Exists(item.Path))
                 {
-                    await _mediaSegmentManager.RunSegmentPluginProviders(item, false, cancellationToken).ConfigureAwait(false);
+                    var libraryOptions = _libraryManager.GetLibraryOptions(item);
+                    await _mediaSegmentManager.RunSegmentPluginProviders(item, libraryOptions, false, cancellationToken).ConfigureAwait(false);
                 }
 
                 // Update progress

+ 3 - 3
Emby.Server.Implementations/Sorting/DateLastMediaAddedComparer.cs

@@ -26,10 +26,10 @@ namespace Emby.Server.Implementations.Sorting
         public IUserManager UserManager { get; set; }
 
         /// <summary>
-        /// Gets or sets the user data repository.
+        /// Gets or sets the user data manager.
         /// </summary>
-        /// <value>The user data repository.</value>
-        public IUserDataManager UserDataRepository { get; set; }
+        /// <value>The user data manager.</value>
+        public IUserDataManager UserDataManager { get; set; }
 
         /// <summary>
         /// Gets the name.

+ 4 - 4
Emby.Server.Implementations/Sorting/DatePlayedComparer.cs

@@ -28,10 +28,10 @@ namespace Emby.Server.Implementations.Sorting
         public IUserManager UserManager { get; set; }
 
         /// <summary>
-        /// Gets or sets the user data repository.
+        /// Gets or sets the user data manager.
         /// </summary>
-        /// <value>The user data repository.</value>
-        public IUserDataManager UserDataRepository { get; set; }
+        /// <value>The user data manager.</value>
+        public IUserDataManager UserDataManager { get; set; }
 
         /// <summary>
         /// Gets the name.
@@ -57,7 +57,7 @@ namespace Emby.Server.Implementations.Sorting
         /// <returns>DateTime.</returns>
         private DateTime GetDate(BaseItem x)
         {
-            var userdata = UserDataRepository.GetUserData(User, x);
+            var userdata = UserDataManager.GetUserData(User, x);
 
             if (userdata is not null && userdata.LastPlayedDate.HasValue)
             {

+ 3 - 3
Emby.Server.Implementations/Sorting/IsFavoriteOrLikeComparer.cs

@@ -25,10 +25,10 @@ namespace Emby.Server.Implementations.Sorting
         public ItemSortBy Type => ItemSortBy.IsFavoriteOrLiked;
 
         /// <summary>
-        /// Gets or sets the user data repository.
+        /// Gets or sets the user data manager.
         /// </summary>
-        /// <value>The user data repository.</value>
-        public IUserDataManager UserDataRepository { get; set; }
+        /// <value>The user data manager.</value>
+        public IUserDataManager UserDataManager { get; set; }
 
         /// <summary>
         /// Gets or sets the user manager.

+ 3 - 3
Emby.Server.Implementations/Sorting/IsPlayedComparer.cs

@@ -26,10 +26,10 @@ namespace Emby.Server.Implementations.Sorting
         public ItemSortBy Type => ItemSortBy.IsUnplayed;
 
         /// <summary>
-        /// Gets or sets the user data repository.
+        /// Gets or sets the user data manager.
         /// </summary>
-        /// <value>The user data repository.</value>
-        public IUserDataManager UserDataRepository { get; set; }
+        /// <value>The user data manager.</value>
+        public IUserDataManager UserDataManager { get; set; }
 
         /// <summary>
         /// Gets or sets the user manager.

+ 3 - 3
Emby.Server.Implementations/Sorting/IsUnplayedComparer.cs

@@ -26,10 +26,10 @@ namespace Emby.Server.Implementations.Sorting
         public ItemSortBy Type => ItemSortBy.IsUnplayed;
 
         /// <summary>
-        /// Gets or sets the user data repository.
+        /// Gets or sets the user data manager.
         /// </summary>
-        /// <value>The user data repository.</value>
-        public IUserDataManager UserDataRepository { get; set; }
+        /// <value>The user data manager.</value>
+        public IUserDataManager UserDataManager { get; set; }
 
         /// <summary>
         /// Gets or sets the user manager.

+ 4 - 4
Emby.Server.Implementations/Sorting/PlayCountComparer.cs

@@ -27,10 +27,10 @@ namespace Emby.Server.Implementations.Sorting
         public ItemSortBy Type => ItemSortBy.PlayCount;
 
         /// <summary>
-        /// Gets or sets the user data repository.
+        /// Gets or sets the user data manager.
         /// </summary>
-        /// <value>The user data repository.</value>
-        public IUserDataManager UserDataRepository { get; set; }
+        /// <value>The user data manager.</value>
+        public IUserDataManager UserDataManager { get; set; }
 
         /// <summary>
         /// Gets or sets the user manager.
@@ -56,7 +56,7 @@ namespace Emby.Server.Implementations.Sorting
         /// <returns>DateTime.</returns>
         private int GetValue(BaseItem x)
         {
-            var userdata = UserDataRepository.GetUserData(User, x);
+            var userdata = UserDataManager.GetUserData(User, x);
 
             return userdata is null ? 0 : userdata.PlayCount;
         }

+ 2 - 1
Jellyfin.Api/Controllers/MediaSegmentsController.cs

@@ -55,7 +55,8 @@ public class MediaSegmentsController : BaseJellyfinApiController
             return NotFound();
         }
 
-        var items = await _mediaSegmentManager.GetSegmentsAsync(item, includeSegmentTypes).ConfigureAwait(false);
+        var libraryOptions = _libraryManager.GetLibraryOptions(item);
+        var items = await _mediaSegmentManager.GetSegmentsAsync(item, includeSegmentTypes, libraryOptions).ConfigureAwait(false);
         return Ok(new QueryResult<MediaSegmentDto>(items.ToArray()));
     }
 }

+ 8 - 22
Jellyfin.Server.Implementations/MediaSegments/MediaSegmentManager.cs

@@ -12,10 +12,10 @@ using Jellyfin.Extensions;
 using MediaBrowser.Common.Extensions;
 using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Entities.Audio;
-using MediaBrowser.Controller.Library;
 using MediaBrowser.Controller.MediaSegments;
 using MediaBrowser.Controller.Providers;
 using MediaBrowser.Model;
+using MediaBrowser.Model.Configuration;
 using MediaBrowser.Model.MediaSegments;
 using Microsoft.EntityFrameworkCore;
 using Microsoft.Extensions.Logging;
@@ -30,7 +30,6 @@ public class MediaSegmentManager : IMediaSegmentManager
     private readonly ILogger<MediaSegmentManager> _logger;
     private readonly IDbContextFactory<JellyfinDbContext> _dbProvider;
     private readonly IMediaSegmentProvider[] _segmentProviders;
-    private readonly ILibraryManager _libraryManager;
 
     /// <summary>
     /// Initializes a new instance of the <see cref="MediaSegmentManager"/> class.
@@ -38,12 +37,10 @@ public class MediaSegmentManager : IMediaSegmentManager
     /// <param name="logger">Logger.</param>
     /// <param name="dbProvider">EFCore Database factory.</param>
     /// <param name="segmentProviders">List of all media segment providers.</param>
-    /// <param name="libraryManager">Library manager.</param>
     public MediaSegmentManager(
         ILogger<MediaSegmentManager> logger,
         IDbContextFactory<JellyfinDbContext> dbProvider,
-        IEnumerable<IMediaSegmentProvider> segmentProviders,
-        ILibraryManager libraryManager)
+        IEnumerable<IMediaSegmentProvider> segmentProviders)
     {
         _logger = logger;
         _dbProvider = dbProvider;
@@ -51,13 +48,11 @@ public class MediaSegmentManager : IMediaSegmentManager
         _segmentProviders = segmentProviders
             .OrderBy(i => i is IHasOrder hasOrder ? hasOrder.Order : 0)
             .ToArray();
-        _libraryManager = libraryManager;
     }
 
     /// <inheritdoc/>
-    public async Task RunSegmentPluginProviders(BaseItem baseItem, bool overwrite, CancellationToken cancellationToken)
+    public async Task RunSegmentPluginProviders(BaseItem baseItem, LibraryOptions libraryOptions, bool overwrite, CancellationToken cancellationToken)
     {
-        var libraryOptions = _libraryManager.GetLibraryOptions(baseItem);
         var providers = _segmentProviders
             .Where(e => !libraryOptions.DisabledMediaSegmentProviders.Contains(GetProviderId(e.Name)))
             .OrderBy(i =>
@@ -140,29 +135,21 @@ public class MediaSegmentManager : IMediaSegmentManager
     }
 
     /// <inheritdoc />
-    public async Task DeleteSegmentsAsync(Guid itemId)
+    public async Task DeleteSegmentsAsync(Guid itemId, CancellationToken cancellationToken)
     {
-        using var db = await _dbProvider.CreateDbContextAsync().ConfigureAwait(false);
-        await db.MediaSegments.Where(e => e.ItemId.Equals(itemId)).ExecuteDeleteAsync().ConfigureAwait(false);
+        using var db = await _dbProvider.CreateDbContextAsync(cancellationToken).ConfigureAwait(false);
+        await db.MediaSegments.Where(e => e.ItemId.Equals(itemId)).ExecuteDeleteAsync(cancellationToken).ConfigureAwait(false);
     }
 
     /// <inheritdoc />
-    public async Task<IEnumerable<MediaSegmentDto>> GetSegmentsAsync(Guid itemId, IEnumerable<MediaSegmentType>? typeFilter, bool filterByProvider = true)
+    public async Task<IEnumerable<MediaSegmentDto>> GetSegmentsAsync(BaseItem? item, IEnumerable<MediaSegmentType>? typeFilter, LibraryOptions libraryOptions, bool filterByProvider = true)
     {
-        var baseItem = _libraryManager.GetItemById(itemId);
-
-        if (baseItem is null)
+        if (item is null)
         {
             _logger.LogError("Tried to request segments for an invalid item");
             return [];
         }
 
-        return await GetSegmentsAsync(baseItem, typeFilter, filterByProvider).ConfigureAwait(false);
-    }
-
-    /// <inheritdoc />
-    public async Task<IEnumerable<MediaSegmentDto>> GetSegmentsAsync(BaseItem item, IEnumerable<MediaSegmentType>? typeFilter, bool filterByProvider = true)
-    {
         using var db = await _dbProvider.CreateDbContextAsync().ConfigureAwait(false);
 
         var query = db.MediaSegments
@@ -175,7 +162,6 @@ public class MediaSegmentManager : IMediaSegmentManager
 
         if (filterByProvider)
         {
-            var libraryOptions = _libraryManager.GetLibraryOptions(item);
             var providerIds = _segmentProviders
                 .Where(e => !libraryOptions.DisabledMediaSegmentProviders.Contains(GetProviderId(e.Name)))
                 .Select(f => GetProviderId(f.Name))

+ 13 - 12
Jellyfin.Server.Implementations/Trickplay/TrickplayManager.cs

@@ -14,7 +14,6 @@ using MediaBrowser.Controller.Configuration;
 using MediaBrowser.Controller.Drawing;
 using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.IO;
-using MediaBrowser.Controller.Library;
 using MediaBrowser.Controller.MediaEncoding;
 using MediaBrowser.Controller.Trickplay;
 using MediaBrowser.Model.Configuration;
@@ -34,7 +33,6 @@ public class TrickplayManager : ITrickplayManager
     private readonly IMediaEncoder _mediaEncoder;
     private readonly IFileSystem _fileSystem;
     private readonly EncodingHelper _encodingHelper;
-    private readonly ILibraryManager _libraryManager;
     private readonly IServerConfigurationManager _config;
     private readonly IImageEncoder _imageEncoder;
     private readonly IDbContextFactory<JellyfinDbContext> _dbProvider;
@@ -51,7 +49,6 @@ public class TrickplayManager : ITrickplayManager
     /// <param name="mediaEncoder">The media encoder.</param>
     /// <param name="fileSystem">The file system.</param>
     /// <param name="encodingHelper">The encoding helper.</param>
-    /// <param name="libraryManager">The library manager.</param>
     /// <param name="config">The server configuration manager.</param>
     /// <param name="imageEncoder">The image encoder.</param>
     /// <param name="dbProvider">The database provider.</param>
@@ -62,7 +59,6 @@ public class TrickplayManager : ITrickplayManager
         IMediaEncoder mediaEncoder,
         IFileSystem fileSystem,
         EncodingHelper encodingHelper,
-        ILibraryManager libraryManager,
         IServerConfigurationManager config,
         IImageEncoder imageEncoder,
         IDbContextFactory<JellyfinDbContext> dbProvider,
@@ -73,7 +69,6 @@ public class TrickplayManager : ITrickplayManager
         _mediaEncoder = mediaEncoder;
         _fileSystem = fileSystem;
         _encodingHelper = encodingHelper;
-        _libraryManager = libraryManager;
         _config = config;
         _imageEncoder = imageEncoder;
         _dbProvider = dbProvider;
@@ -82,10 +77,10 @@ public class TrickplayManager : ITrickplayManager
     }
 
     /// <inheritdoc />
-    public async Task MoveGeneratedTrickplayDataAsync(Video video, LibraryOptions? libraryOptions, CancellationToken cancellationToken)
+    public async Task MoveGeneratedTrickplayDataAsync(Video video, LibraryOptions libraryOptions, CancellationToken cancellationToken)
     {
         var options = _config.Configuration.TrickplayOptions;
-        if (!CanGenerateTrickplay(video, options.Interval))
+        if (!CanGenerateTrickplay(video, options.Interval, libraryOptions))
         {
             return;
         }
@@ -140,7 +135,7 @@ public class TrickplayManager : ITrickplayManager
     }
 
     /// <inheritdoc />
-    public async Task RefreshTrickplayDataAsync(Video video, bool replace, LibraryOptions? libraryOptions, CancellationToken cancellationToken)
+    public async Task RefreshTrickplayDataAsync(Video video, bool replace, LibraryOptions libraryOptions, CancellationToken cancellationToken)
     {
         _logger.LogDebug("Trickplay refresh for {ItemId} (replace existing: {Replace})", video.Id, replace);
 
@@ -169,10 +164,10 @@ public class TrickplayManager : ITrickplayManager
         bool replace,
         int width,
         TrickplayOptions options,
-        LibraryOptions? libraryOptions,
+        LibraryOptions libraryOptions,
         CancellationToken cancellationToken)
     {
-        if (!CanGenerateTrickplay(video, options.Interval))
+        if (!CanGenerateTrickplay(video, options.Interval, libraryOptions))
         {
             return;
         }
@@ -407,7 +402,7 @@ public class TrickplayManager : ITrickplayManager
         return trickplayInfo;
     }
 
-    private bool CanGenerateTrickplay(Video video, int interval)
+    private bool CanGenerateTrickplay(Video video, int interval, LibraryOptions libraryOptions)
     {
         var videoType = video.VideoType;
         if (videoType == VideoType.Iso || videoType == VideoType.Dvd || videoType == VideoType.BluRay)
@@ -435,7 +430,6 @@ public class TrickplayManager : ITrickplayManager
             return false;
         }
 
-        var libraryOptions = _libraryManager.GetLibraryOptions(video);
         if (libraryOptions is null || !libraryOptions.EnableTrickplayImageExtraction)
         {
             return false;
@@ -506,6 +500,13 @@ public class TrickplayManager : ITrickplayManager
         }
     }
 
+    /// <inheritdoc />
+    public async Task DeleteTrickplayDataAsync(Guid itemId, CancellationToken cancellationToken)
+    {
+        var dbContext = await _dbProvider.CreateDbContextAsync(cancellationToken).ConfigureAwait(false);
+        await dbContext.TrickplayInfos.Where(i => i.ItemId.Equals(itemId)).ExecuteDeleteAsync(cancellationToken).ConfigureAwait(false);
+    }
+
     /// <inheritdoc />
     public async Task<Dictionary<string, Dictionary<int, TrickplayInfo>>> GetTrickplayManifest(BaseItem item)
     {

+ 1 - 1
MediaBrowser.Controller/Entities/BaseItem.cs

@@ -1436,7 +1436,7 @@ namespace MediaBrowser.Controller.Entities
                     return info.LastWriteTimeUtc != DateModified;
                 }
 
-                return info.LastWriteTimeUtc != DateModified && info.Length != (Size ?? 0);
+                return info.LastWriteTimeUtc != DateModified;
             }
 
             return false;

+ 38 - 1
MediaBrowser.Controller/Entities/TV/Episode.cs

@@ -7,12 +7,14 @@ using System.Collections.Generic;
 using System.Globalization;
 using System.Linq;
 using System.Text.Json.Serialization;
+using System.Threading;
 using Jellyfin.Data.Enums;
 using Jellyfin.Extensions;
+using MediaBrowser.Controller.MediaEncoding;
 using MediaBrowser.Controller.Providers;
+using MediaBrowser.Model.Dlna;
 using MediaBrowser.Model.Entities;
 using MediaBrowser.Model.IO;
-using MediaBrowser.Model.Providers;
 using Microsoft.Extensions.Logging;
 
 namespace MediaBrowser.Controller.Entities.TV
@@ -22,6 +24,8 @@ namespace MediaBrowser.Controller.Entities.TV
     /// </summary>
     public class Episode : Video, IHasTrailers, IHasLookupInfo<EpisodeInfo>, IHasSeries
     {
+        public static IMediaEncoder MediaEncoder { get; set; }
+
         /// <inheritdoc />
         [JsonIgnore]
         public IReadOnlyList<BaseItem> LocalTrailers => GetExtras()
@@ -325,6 +329,39 @@ namespace MediaBrowser.Controller.Entities.TV
             {
                 if (SourceType == SourceType.Library || SourceType == SourceType.LiveTV)
                 {
+                    var libraryOptions = LibraryManager.GetLibraryOptions(this);
+                    if (libraryOptions.EnableEmbeddedEpisodeInfos && string.Equals(Container, "mp4", StringComparison.OrdinalIgnoreCase))
+                    {
+                        try
+                        {
+                            var mediaInfo = MediaEncoder.GetMediaInfo(
+                                new MediaInfoRequest
+                                {
+                                    MediaSource = GetMediaSources(false)[0],
+                                    MediaType = DlnaProfileType.Video
+                                },
+                                CancellationToken.None).GetAwaiter().GetResult();
+                            if (mediaInfo.ParentIndexNumber > 0)
+                            {
+                                ParentIndexNumber = mediaInfo.ParentIndexNumber;
+                            }
+
+                            if (mediaInfo.IndexNumber > 0)
+                            {
+                                IndexNumber = mediaInfo.IndexNumber;
+                            }
+
+                            if (!string.IsNullOrEmpty(mediaInfo.ShowName))
+                            {
+                                SeriesName = mediaInfo.ShowName;
+                            }
+                        }
+                        catch (Exception ex)
+                        {
+                            Logger.LogError(ex, "Error reading the episode information with ffprobe. Episode: {EpisodeInfo}", Path);
+                        }
+                    }
+
                     try
                     {
                         if (LibraryManager.FillMissingEpisodeNumbersFromPath(this, replaceAllMetadata))

+ 19 - 0
MediaBrowser.Controller/IO/IExternalDataManager.cs

@@ -0,0 +1,19 @@
+using System.Threading;
+using System.Threading.Tasks;
+using MediaBrowser.Controller.Entities;
+
+namespace MediaBrowser.Controller.IO;
+
+/// <summary>
+/// Interface IPathManager.
+/// </summary>
+public interface IExternalDataManager
+{
+    /// <summary>
+    /// Deletes all external item data.
+    /// </summary>
+    /// <param name="item">The item.</param>
+    /// <param name="cancellationToken">The cancellation token.</param>
+    /// <returns>Task.</returns>
+    Task DeleteExternalItemDataAsync(BaseItem item, CancellationToken cancellationToken);
+}

+ 8 - 13
MediaBrowser.Controller/MediaSegments/IMediaSegmentManager.cs

@@ -5,6 +5,7 @@ using System.Threading.Tasks;
 using Jellyfin.Database.Implementations.Entities;
 using Jellyfin.Database.Implementations.Enums;
 using MediaBrowser.Controller.Entities;
+using MediaBrowser.Model.Configuration;
 using MediaBrowser.Model.MediaSegments;
 
 namespace MediaBrowser.Controller.MediaSegments;
@@ -18,10 +19,11 @@ public interface IMediaSegmentManager
     /// Uses all segment providers enabled for the <see cref="BaseItem"/>'s library to get the Media Segments.
     /// </summary>
     /// <param name="baseItem">The Item to evaluate.</param>
+    /// <param name="libraryOptions">The library options.</param>
     /// <param name="overwrite">If set, will remove existing segments and replace it with new ones otherwise will check for existing segments and if found any, stops.</param>
-    /// <param name="cancellationToken">stop request token.</param>
+    /// <param name="cancellationToken">The cancellation token.</param>
     /// <returns>A task that indicates the Operation is finished.</returns>
-    Task RunSegmentPluginProviders(BaseItem baseItem, bool overwrite, CancellationToken cancellationToken);
+    Task RunSegmentPluginProviders(BaseItem baseItem, LibraryOptions libraryOptions, bool overwrite, CancellationToken cancellationToken);
 
     /// <summary>
     /// Returns if this item supports media segments.
@@ -49,26 +51,19 @@ public interface IMediaSegmentManager
     /// Deletes all media segments of an item.
     /// </summary>
     /// <param name="itemId">The <see cref="BaseItem.Id"/> to delete all segments for.</param>
+    /// <param name="cancellationToken">The cancellation token.</param>
     /// <returns>a task.</returns>
-    Task DeleteSegmentsAsync(Guid itemId);
-
-    /// <summary>
-    /// Obtains all segments associated with the itemId.
-    /// </summary>
-    /// <param name="itemId">The id of the <see cref="BaseItem"/>.</param>
-    /// <param name="typeFilter">filters all media segments of the given type to be included. If null all types are included.</param>
-    /// <param name="filterByProvider">When set filters the segments to only return those that which providers are currently enabled on their library.</param>
-    /// <returns>An enumerator of <see cref="MediaSegmentDto"/>'s.</returns>
-    Task<IEnumerable<MediaSegmentDto>> GetSegmentsAsync(Guid itemId, IEnumerable<MediaSegmentType>? typeFilter, bool filterByProvider = true);
+    Task DeleteSegmentsAsync(Guid itemId, CancellationToken cancellationToken);
 
     /// <summary>
     /// Obtains all segments associated with the itemId.
     /// </summary>
     /// <param name="item">The <see cref="BaseItem"/>.</param>
     /// <param name="typeFilter">filters all media segments of the given type to be included. If null all types are included.</param>
+    /// <param name="libraryOptions">The library options.</param>
     /// <param name="filterByProvider">When set filters the segments to only return those that which providers are currently enabled on their library.</param>
     /// <returns>An enumerator of <see cref="MediaSegmentDto"/>'s.</returns>
-    Task<IEnumerable<MediaSegmentDto>> GetSegmentsAsync(BaseItem item, IEnumerable<MediaSegmentType>? typeFilter, bool filterByProvider = true);
+    Task<IEnumerable<MediaSegmentDto>> GetSegmentsAsync(BaseItem item, IEnumerable<MediaSegmentType>? typeFilter, LibraryOptions libraryOptions, bool filterByProvider = true);
 
     /// <summary>
     /// Gets information about any media segments stored for the given itemId.

+ 1 - 1
MediaBrowser.Controller/Sorting/IUserBaseItemComparer.cs

@@ -26,6 +26,6 @@ namespace MediaBrowser.Controller.Sorting
         /// Gets or sets the user data repository.
         /// </summary>
         /// <value>The user data repository.</value>
-        IUserDataManager UserDataRepository { get; set; }
+        IUserDataManager UserDataManager { get; set; }
     }
 }

+ 10 - 2
MediaBrowser.Controller/Trickplay/ITrickplayManager.cs

@@ -21,7 +21,7 @@ public interface ITrickplayManager
     /// <param name="libraryOptions">The library options.</param>
     /// <param name="cancellationToken">CancellationToken to use for operation.</param>
     /// <returns>Task.</returns>
-    Task RefreshTrickplayDataAsync(Video video, bool replace, LibraryOptions? libraryOptions, CancellationToken cancellationToken);
+    Task RefreshTrickplayDataAsync(Video video, bool replace, LibraryOptions libraryOptions, CancellationToken cancellationToken);
 
     /// <summary>
     /// Creates trickplay tiles out of individual thumbnails.
@@ -58,6 +58,14 @@ public interface ITrickplayManager
     /// <returns>Task.</returns>
     Task SaveTrickplayInfo(TrickplayInfo info);
 
+    /// <summary>
+    /// Deletes all trickplay info for an item.
+    /// </summary>
+    /// <param name="itemId">The item id.</param>
+    /// <param name="cancellationToken">The cancellation token.</param>
+    /// <returns>Task.</returns>
+    Task DeleteTrickplayDataAsync(Guid itemId, CancellationToken cancellationToken);
+
     /// <summary>
     /// Gets all trickplay infos for all media streams of an item.
     /// </summary>
@@ -93,7 +101,7 @@ public interface ITrickplayManager
     /// <param name="libraryOptions">The library options.</param>
     /// <param name="cancellationToken">CancellationToken to use for operation.</param>
     /// <returns>Task.</returns>
-    Task MoveGeneratedTrickplayDataAsync(Video video, LibraryOptions? libraryOptions, CancellationToken cancellationToken);
+    Task MoveGeneratedTrickplayDataAsync(Video video, LibraryOptions libraryOptions, CancellationToken cancellationToken);
 
     /// <summary>
     /// Gets the trickplay HLS playlist.

+ 3 - 8
MediaBrowser.Providers/Books/AudioBookMetadataService.cs

@@ -2,7 +2,6 @@ using MediaBrowser.Controller.Configuration;
 using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.IO;
 using MediaBrowser.Controller.Library;
-using MediaBrowser.Controller.MediaSegments;
 using MediaBrowser.Controller.Providers;
 using MediaBrowser.Model.Entities;
 using MediaBrowser.Model.IO;
@@ -24,19 +23,15 @@ public class AudioBookMetadataService : MetadataService<AudioBook, SongInfo>
     /// <param name="providerManager">Instance of the <see cref="IProviderManager"/> interface.</param>
     /// <param name="fileSystem">Instance of the <see cref="IFileSystem"/> interface.</param>
     /// <param name="libraryManager">Instance of the <see cref="ILibraryManager"/> interface.</param>
-    /// <param name="pathManager">Instance of the <see cref="IPathManager"/> interface.</param>
-    /// <param name="keyframeManager">Instance of the <see cref="IKeyframeManager"/> interface.</param>
-    /// <param name="mediaSegmentManager">Instance of the <see cref="IMediaSegmentManager"/> interface.</param>
+    /// <param name="externalDataManager">Instance of the <see cref="IExternalDataManager"/> interface.</param>
     public AudioBookMetadataService(
         IServerConfigurationManager serverConfigurationManager,
         ILogger<AudioBookMetadataService> logger,
         IProviderManager providerManager,
         IFileSystem fileSystem,
         ILibraryManager libraryManager,
-        IPathManager pathManager,
-        IKeyframeManager keyframeManager,
-        IMediaSegmentManager mediaSegmentManager)
-        : base(serverConfigurationManager, logger, providerManager, fileSystem, libraryManager, pathManager, keyframeManager, mediaSegmentManager)
+        IExternalDataManager externalDataManager)
+        : base(serverConfigurationManager, logger, providerManager, fileSystem, libraryManager, externalDataManager)
     {
     }
 

+ 3 - 8
MediaBrowser.Providers/Books/BookMetadataService.cs

@@ -2,7 +2,6 @@ using MediaBrowser.Controller.Configuration;
 using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.IO;
 using MediaBrowser.Controller.Library;
-using MediaBrowser.Controller.MediaSegments;
 using MediaBrowser.Controller.Providers;
 using MediaBrowser.Model.Entities;
 using MediaBrowser.Model.IO;
@@ -24,19 +23,15 @@ public class BookMetadataService : MetadataService<Book, BookInfo>
     /// <param name="providerManager">Instance of the <see cref="IProviderManager"/> interface.</param>
     /// <param name="fileSystem">Instance of the <see cref="IFileSystem"/> interface.</param>
     /// <param name="libraryManager">Instance of the <see cref="ILibraryManager"/> interface.</param>
-    /// <param name="pathManager">Instance of the <see cref="IPathManager"/> interface.</param>
-    /// <param name="keyframeManager">Instance of the <see cref="IKeyframeManager"/> interface.</param>
-    /// <param name="mediaSegmentManager">Instance of the <see cref="IMediaSegmentManager"/> interface.</param>
+    /// <param name="externalDataManager">Instance of the <see cref="IExternalDataManager"/> interface.</param>
     public BookMetadataService(
         IServerConfigurationManager serverConfigurationManager,
         ILogger<BookMetadataService> logger,
         IProviderManager providerManager,
         IFileSystem fileSystem,
         ILibraryManager libraryManager,
-        IPathManager pathManager,
-        IKeyframeManager keyframeManager,
-        IMediaSegmentManager mediaSegmentManager)
-        : base(serverConfigurationManager, logger, providerManager, fileSystem, libraryManager, pathManager, keyframeManager, mediaSegmentManager)
+        IExternalDataManager externalDataManager)
+        : base(serverConfigurationManager, logger, providerManager, fileSystem, libraryManager, externalDataManager)
     {
     }
 

+ 3 - 8
MediaBrowser.Providers/BoxSets/BoxSetMetadataService.cs

@@ -5,7 +5,6 @@ using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Entities.Movies;
 using MediaBrowser.Controller.IO;
 using MediaBrowser.Controller.Library;
-using MediaBrowser.Controller.MediaSegments;
 using MediaBrowser.Controller.Providers;
 using MediaBrowser.Model.Entities;
 using MediaBrowser.Model.IO;
@@ -27,19 +26,15 @@ public class BoxSetMetadataService : MetadataService<BoxSet, BoxSetInfo>
     /// <param name="providerManager">Instance of the <see cref="IProviderManager"/> interface.</param>
     /// <param name="fileSystem">Instance of the <see cref="IFileSystem"/> interface.</param>
     /// <param name="libraryManager">Instance of the <see cref="ILibraryManager"/> interface.</param>
-    /// <param name="pathManager">Instance of the <see cref="IPathManager"/> interface.</param>
-    /// <param name="keyframeManager">Instance of the <see cref="IKeyframeManager"/> interface.</param>
-    /// <param name="mediaSegmentManager">Instance of the <see cref="IMediaSegmentManager"/> interface.</param>
+    /// <param name="externalDataManager">Instance of the <see cref="IExternalDataManager"/> interface.</param>
     public BoxSetMetadataService(
         IServerConfigurationManager serverConfigurationManager,
         ILogger<BoxSetMetadataService> logger,
         IProviderManager providerManager,
         IFileSystem fileSystem,
         ILibraryManager libraryManager,
-        IPathManager pathManager,
-        IKeyframeManager keyframeManager,
-        IMediaSegmentManager mediaSegmentManager)
-        : base(serverConfigurationManager, logger, providerManager, fileSystem, libraryManager, pathManager, keyframeManager, mediaSegmentManager)
+        IExternalDataManager externalDataManager)
+        : base(serverConfigurationManager, logger, providerManager, fileSystem, libraryManager, externalDataManager)
     {
     }
 

+ 3 - 8
MediaBrowser.Providers/Channels/ChannelMetadataService.cs

@@ -2,7 +2,6 @@ using MediaBrowser.Controller.Channels;
 using MediaBrowser.Controller.Configuration;
 using MediaBrowser.Controller.IO;
 using MediaBrowser.Controller.Library;
-using MediaBrowser.Controller.MediaSegments;
 using MediaBrowser.Controller.Providers;
 using MediaBrowser.Model.IO;
 using MediaBrowser.Providers.Manager;
@@ -23,19 +22,15 @@ public class ChannelMetadataService : MetadataService<Channel, ItemLookupInfo>
     /// <param name="providerManager">Instance of the <see cref="IProviderManager"/> interface.</param>
     /// <param name="fileSystem">Instance of the <see cref="IFileSystem"/> interface.</param>
     /// <param name="libraryManager">Instance of the <see cref="ILibraryManager"/> interface.</param>
-    /// <param name="pathManager">Instance of the <see cref="IPathManager"/> interface.</param>
-    /// <param name="keyframeManager">Instance of the <see cref="IKeyframeManager"/> interface.</param>
-    /// <param name="mediaSegmentManager">Instance of the <see cref="IMediaSegmentManager"/> interface.</param>
+    /// <param name="externalDataManager">Instance of the <see cref="IExternalDataManager"/> interface.</param>
     public ChannelMetadataService(
         IServerConfigurationManager serverConfigurationManager,
         ILogger<ChannelMetadataService> logger,
         IProviderManager providerManager,
         IFileSystem fileSystem,
         ILibraryManager libraryManager,
-        IPathManager pathManager,
-        IKeyframeManager keyframeManager,
-        IMediaSegmentManager mediaSegmentManager)
-        : base(serverConfigurationManager, logger, providerManager, fileSystem, libraryManager, pathManager, keyframeManager, mediaSegmentManager)
+        IExternalDataManager externalDataManager)
+        : base(serverConfigurationManager, logger, providerManager, fileSystem, libraryManager, externalDataManager)
     {
     }
 }

+ 3 - 8
MediaBrowser.Providers/Folders/CollectionFolderMetadataService.cs

@@ -2,7 +2,6 @@ using MediaBrowser.Controller.Configuration;
 using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.IO;
 using MediaBrowser.Controller.Library;
-using MediaBrowser.Controller.MediaSegments;
 using MediaBrowser.Controller.Providers;
 using MediaBrowser.Model.IO;
 using MediaBrowser.Providers.Manager;
@@ -23,19 +22,15 @@ public class CollectionFolderMetadataService : MetadataService<CollectionFolder,
     /// <param name="providerManager">Instance of the <see cref="IProviderManager"/> interface.</param>
     /// <param name="fileSystem">Instance of the <see cref="IFileSystem"/> interface.</param>
     /// <param name="libraryManager">Instance of the <see cref="ILibraryManager"/> interface.</param>
-    /// <param name="pathManager">Instance of the <see cref="IPathManager"/> interface.</param>
-    /// <param name="keyframeManager">Instance of the <see cref="IKeyframeManager"/> interface.</param>
-    /// <param name="mediaSegmentManager">Instance of the <see cref="IMediaSegmentManager"/> interface.</param>
+    /// <param name="externalDataManager">Instance of the <see cref="IExternalDataManager"/> interface.</param>
     public CollectionFolderMetadataService(
         IServerConfigurationManager serverConfigurationManager,
         ILogger<CollectionFolderMetadataService> logger,
         IProviderManager providerManager,
         IFileSystem fileSystem,
         ILibraryManager libraryManager,
-        IPathManager pathManager,
-        IKeyframeManager keyframeManager,
-        IMediaSegmentManager mediaSegmentManager)
-        : base(serverConfigurationManager, logger, providerManager, fileSystem, libraryManager, pathManager, keyframeManager, mediaSegmentManager)
+        IExternalDataManager externalDataManager)
+        : base(serverConfigurationManager, logger, providerManager, fileSystem, libraryManager, externalDataManager)
     {
     }
 }

+ 3 - 8
MediaBrowser.Providers/Folders/FolderMetadataService.cs

@@ -2,7 +2,6 @@ using MediaBrowser.Controller.Configuration;
 using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.IO;
 using MediaBrowser.Controller.Library;
-using MediaBrowser.Controller.MediaSegments;
 using MediaBrowser.Controller.Providers;
 using MediaBrowser.Model.IO;
 using MediaBrowser.Providers.Manager;
@@ -23,19 +22,15 @@ public class FolderMetadataService : MetadataService<Folder, ItemLookupInfo>
     /// <param name="providerManager">Instance of the <see cref="IProviderManager"/> interface.</param>
     /// <param name="fileSystem">Instance of the <see cref="IFileSystem"/> interface.</param>
     /// <param name="libraryManager">Instance of the <see cref="ILibraryManager"/> interface.</param>
-    /// <param name="pathManager">Instance of the <see cref="IPathManager"/> interface.</param>
-    /// <param name="keyframeManager">Instance of the <see cref="IKeyframeManager"/> interface.</param>
-    /// <param name="mediaSegmentManager">Instance of the <see cref="IMediaSegmentManager"/> interface.</param>
+    /// <param name="externalDataManager">Instance of the <see cref="IExternalDataManager"/> interface.</param>
     public FolderMetadataService(
         IServerConfigurationManager serverConfigurationManager,
         ILogger<FolderMetadataService> logger,
         IProviderManager providerManager,
         IFileSystem fileSystem,
         ILibraryManager libraryManager,
-        IPathManager pathManager,
-        IKeyframeManager keyframeManager,
-        IMediaSegmentManager mediaSegmentManager)
-        : base(serverConfigurationManager, logger, providerManager, fileSystem, libraryManager, pathManager, keyframeManager, mediaSegmentManager)
+        IExternalDataManager externalDataManager)
+        : base(serverConfigurationManager, logger, providerManager, fileSystem, libraryManager, externalDataManager)
     {
     }
 

+ 3 - 8
MediaBrowser.Providers/Folders/UserViewMetadataService.cs

@@ -2,7 +2,6 @@ using MediaBrowser.Controller.Configuration;
 using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.IO;
 using MediaBrowser.Controller.Library;
-using MediaBrowser.Controller.MediaSegments;
 using MediaBrowser.Controller.Providers;
 using MediaBrowser.Model.IO;
 using MediaBrowser.Providers.Manager;
@@ -23,19 +22,15 @@ public class UserViewMetadataService : MetadataService<UserView, ItemLookupInfo>
     /// <param name="providerManager">Instance of the <see cref="IProviderManager"/> interface.</param>
     /// <param name="fileSystem">Instance of the <see cref="IFileSystem"/> interface.</param>
     /// <param name="libraryManager">Instance of the <see cref="ILibraryManager"/> interface.</param>
-    /// <param name="pathManager">Instance of the <see cref="IPathManager"/> interface.</param>
-    /// <param name="keyframeManager">Instance of the <see cref="IKeyframeManager"/> interface.</param>
-    /// <param name="mediaSegmentManager">Instance of the <see cref="IMediaSegmentManager"/> interface.</param>
+    /// <param name="externalDataManager">Instance of the <see cref="IExternalDataManager"/> interface.</param>
     public UserViewMetadataService(
         IServerConfigurationManager serverConfigurationManager,
         ILogger<UserViewMetadataService> logger,
         IProviderManager providerManager,
         IFileSystem fileSystem,
         ILibraryManager libraryManager,
-        IPathManager pathManager,
-        IKeyframeManager keyframeManager,
-        IMediaSegmentManager mediaSegmentManager)
-        : base(serverConfigurationManager, logger, providerManager, fileSystem, libraryManager, pathManager, keyframeManager, mediaSegmentManager)
+        IExternalDataManager externalDataManager)
+        : base(serverConfigurationManager, logger, providerManager, fileSystem, libraryManager, externalDataManager)
     {
     }
 }

+ 3 - 8
MediaBrowser.Providers/Genres/GenreMetadataService.cs

@@ -2,7 +2,6 @@ using MediaBrowser.Controller.Configuration;
 using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.IO;
 using MediaBrowser.Controller.Library;
-using MediaBrowser.Controller.MediaSegments;
 using MediaBrowser.Controller.Providers;
 using MediaBrowser.Model.IO;
 using MediaBrowser.Providers.Manager;
@@ -23,19 +22,15 @@ public class GenreMetadataService : MetadataService<Genre, ItemLookupInfo>
     /// <param name="providerManager">Instance of the <see cref="IProviderManager"/> interface.</param>
     /// <param name="fileSystem">Instance of the <see cref="IFileSystem"/> interface.</param>
     /// <param name="libraryManager">Instance of the <see cref="ILibraryManager"/> interface.</param>
-    /// <param name="pathManager">Instance of the <see cref="IPathManager"/> interface.</param>
-    /// <param name="keyframeManager">Instance of the <see cref="IKeyframeManager"/> interface.</param>
-    /// <param name="mediaSegmentManager">Instance of the <see cref="IMediaSegmentManager"/> interface.</param>
+    /// <param name="externalDataManager">Instance of the <see cref="IExternalDataManager"/> interface.</param>
     public GenreMetadataService(
         IServerConfigurationManager serverConfigurationManager,
         ILogger<GenreMetadataService> logger,
         IProviderManager providerManager,
         IFileSystem fileSystem,
         ILibraryManager libraryManager,
-        IPathManager pathManager,
-        IKeyframeManager keyframeManager,
-        IMediaSegmentManager mediaSegmentManager)
-        : base(serverConfigurationManager, logger, providerManager, fileSystem, libraryManager, pathManager, keyframeManager, mediaSegmentManager)
+        IExternalDataManager externalDataManager)
+        : base(serverConfigurationManager, logger, providerManager, fileSystem, libraryManager, externalDataManager)
     {
     }
 }

+ 3 - 8
MediaBrowser.Providers/LiveTv/LiveTvMetadataService.cs

@@ -2,7 +2,6 @@ using MediaBrowser.Controller.Configuration;
 using MediaBrowser.Controller.IO;
 using MediaBrowser.Controller.Library;
 using MediaBrowser.Controller.LiveTv;
-using MediaBrowser.Controller.MediaSegments;
 using MediaBrowser.Controller.Providers;
 using MediaBrowser.Model.IO;
 using MediaBrowser.Providers.Manager;
@@ -23,19 +22,15 @@ public class LiveTvMetadataService : MetadataService<LiveTvChannel, ItemLookupIn
     /// <param name="providerManager">Instance of the <see cref="IProviderManager"/> interface.</param>
     /// <param name="fileSystem">Instance of the <see cref="IFileSystem"/> interface.</param>
     /// <param name="libraryManager">Instance of the <see cref="ILibraryManager"/> interface.</param>
-    /// <param name="pathManager">Instance of the <see cref="IPathManager"/> interface.</param>
-    /// <param name="keyframeManager">Instance of the <see cref="IKeyframeManager"/> interface.</param>
-    /// <param name="mediaSegmentManager">Instance of the <see cref="IMediaSegmentManager"/> interface.</param>
+    /// <param name="externalDataManager">Instance of the <see cref="IExternalDataManager"/> interface.</param>
     public LiveTvMetadataService(
         IServerConfigurationManager serverConfigurationManager,
         ILogger<LiveTvMetadataService> logger,
         IProviderManager providerManager,
         IFileSystem fileSystem,
         ILibraryManager libraryManager,
-        IPathManager pathManager,
-        IKeyframeManager keyframeManager,
-        IMediaSegmentManager mediaSegmentManager)
-        : base(serverConfigurationManager, logger, providerManager, fileSystem, libraryManager, pathManager, keyframeManager, mediaSegmentManager)
+        IExternalDataManager externalDataManager)
+        : base(serverConfigurationManager, logger, providerManager, fileSystem, libraryManager, externalDataManager)
     {
     }
 }

+ 6 - 33
MediaBrowser.Providers/Manager/MetadataService.cs

@@ -4,7 +4,6 @@
 
 using System;
 using System.Collections.Generic;
-using System.IO;
 using System.Linq;
 using System.Net.Http;
 using System.Threading;
@@ -15,7 +14,6 @@ using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Entities.Audio;
 using MediaBrowser.Controller.IO;
 using MediaBrowser.Controller.Library;
-using MediaBrowser.Controller.MediaSegments;
 using MediaBrowser.Controller.Providers;
 using MediaBrowser.Model.Configuration;
 using MediaBrowser.Model.Entities;
@@ -35,18 +33,14 @@ namespace MediaBrowser.Providers.Manager
             IProviderManager providerManager,
             IFileSystem fileSystem,
             ILibraryManager libraryManager,
-            IPathManager pathManager,
-            IKeyframeManager keyframeManager,
-            IMediaSegmentManager mediaSegmentManager)
+            IExternalDataManager externalDataManager)
         {
             ServerConfigurationManager = serverConfigurationManager;
             Logger = logger;
             ProviderManager = providerManager;
             FileSystem = fileSystem;
             LibraryManager = libraryManager;
-            PathManager = pathManager;
-            KeyframeManager = keyframeManager;
-            MediaSegmentManager = mediaSegmentManager;
+            ExternalDataManager = externalDataManager;
             ImageProvider = new ItemImageProvider(Logger, ProviderManager, FileSystem);
         }
 
@@ -62,11 +56,7 @@ namespace MediaBrowser.Providers.Manager
 
         protected ILibraryManager LibraryManager { get; }
 
-        protected IPathManager PathManager { get; }
-
-        protected IKeyframeManager KeyframeManager { get; }
-
-        protected IMediaSegmentManager MediaSegmentManager { get; }
+        protected IExternalDataManager ExternalDataManager { get; }
 
         protected virtual bool EnableUpdatingPremiereDateFromChildren => false;
 
@@ -344,27 +334,10 @@ namespace MediaBrowser.Providers.Manager
                     if (item is Video video)
                     {
                         var videoType = video.VideoType;
-                        var sizeChanged = size != (video.Size ?? 0);
-                        if (videoType == VideoType.BluRay || video.VideoType == VideoType.Dvd || sizeChanged)
+                        if (videoType == VideoType.BluRay || video.VideoType == VideoType.Dvd)
                         {
-                            if (sizeChanged)
-                            {
-                                item.Size = size;
-                                Logger.LogDebug("File size changed from {Then} to {Now}: {Path}", video.Size, size, itemPath);
-                            }
-
-                            var validPaths = PathManager.GetExtractedDataPaths(video).Where(Directory.Exists).ToList();
-                            if (validPaths.Count > 0)
-                            {
-                                Logger.LogInformation("File changed, pruning extracted data: {Path}", itemPath);
-                                foreach (var path in validPaths)
-                                {
-                                    Directory.Delete(path, true);
-                                }
-                            }
-
-                            KeyframeManager.DeleteKeyframeDataAsync(video.Id, CancellationToken.None).GetAwaiter().GetResult();
-                            MediaSegmentManager.DeleteSegmentsAsync(item.Id).GetAwaiter().GetResult();
+                            Logger.LogInformation("File changed, pruning extracted data: {Path}", item.Path);
+                            ExternalDataManager.DeleteExternalItemDataAsync(video, CancellationToken.None).GetAwaiter().GetResult();
                         }
                     }
 

+ 3 - 8
MediaBrowser.Providers/Movies/MovieMetadataService.cs

@@ -2,7 +2,6 @@ using MediaBrowser.Controller.Configuration;
 using MediaBrowser.Controller.Entities.Movies;
 using MediaBrowser.Controller.IO;
 using MediaBrowser.Controller.Library;
-using MediaBrowser.Controller.MediaSegments;
 using MediaBrowser.Controller.Providers;
 using MediaBrowser.Model.Entities;
 using MediaBrowser.Model.IO;
@@ -24,19 +23,15 @@ public class MovieMetadataService : MetadataService<Movie, MovieInfo>
     /// <param name="providerManager">Instance of the <see cref="IProviderManager"/> interface.</param>
     /// <param name="fileSystem">Instance of the <see cref="IFileSystem"/> interface.</param>
     /// <param name="libraryManager">Instance of the <see cref="ILibraryManager"/> interface.</param>
-    /// <param name="pathManager">Instance of the <see cref="IPathManager"/> interface.</param>
-    /// <param name="keyframeManager">Instance of the <see cref="IKeyframeManager"/> interface.</param>
-    /// <param name="mediaSegmentManager">Instance of the <see cref="IMediaSegmentManager"/> interface.</param>
+    /// <param name="externalDataManager">Instance of the <see cref="IExternalDataManager"/> interface.</param>
     public MovieMetadataService(
         IServerConfigurationManager serverConfigurationManager,
         ILogger<MovieMetadataService> logger,
         IProviderManager providerManager,
         IFileSystem fileSystem,
         ILibraryManager libraryManager,
-        IPathManager pathManager,
-        IKeyframeManager keyframeManager,
-        IMediaSegmentManager mediaSegmentManager)
-        : base(serverConfigurationManager, logger, providerManager, fileSystem, libraryManager, pathManager, keyframeManager, mediaSegmentManager)
+        IExternalDataManager externalDataManager)
+        : base(serverConfigurationManager, logger, providerManager, fileSystem, libraryManager, externalDataManager)
     {
     }
 

+ 3 - 8
MediaBrowser.Providers/Movies/TrailerMetadataService.cs

@@ -3,7 +3,6 @@ using MediaBrowser.Controller.Configuration;
 using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.IO;
 using MediaBrowser.Controller.Library;
-using MediaBrowser.Controller.MediaSegments;
 using MediaBrowser.Controller.Providers;
 using MediaBrowser.Model.Entities;
 using MediaBrowser.Model.IO;
@@ -25,19 +24,15 @@ public class TrailerMetadataService : MetadataService<Trailer, TrailerInfo>
     /// <param name="providerManager">Instance of the <see cref="IProviderManager"/> interface.</param>
     /// <param name="fileSystem">Instance of the <see cref="IFileSystem"/> interface.</param>
     /// <param name="libraryManager">Instance of the <see cref="ILibraryManager"/> interface.</param>
-    /// <param name="pathManager">Instance of the <see cref="IPathManager"/> interface.</param>
-    /// <param name="keyframeManager">Instance of the <see cref="IKeyframeManager"/> interface.</param>
-    /// <param name="mediaSegmentManager">Instance of the <see cref="IMediaSegmentManager"/> interface.</param>
+    /// <param name="externalDataManager">Instance of the <see cref="IExternalDataManager"/> interface.</param>
     public TrailerMetadataService(
         IServerConfigurationManager serverConfigurationManager,
         ILogger<TrailerMetadataService> logger,
         IProviderManager providerManager,
         IFileSystem fileSystem,
         ILibraryManager libraryManager,
-        IPathManager pathManager,
-        IKeyframeManager keyframeManager,
-        IMediaSegmentManager mediaSegmentManager)
-        : base(serverConfigurationManager, logger, providerManager, fileSystem, libraryManager, pathManager, keyframeManager, mediaSegmentManager)
+        IExternalDataManager externalDataManager)
+        : base(serverConfigurationManager, logger, providerManager, fileSystem, libraryManager, externalDataManager)
     {
     }
 

+ 3 - 8
MediaBrowser.Providers/Music/AlbumMetadataService.cs

@@ -7,7 +7,6 @@ using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Entities.Audio;
 using MediaBrowser.Controller.IO;
 using MediaBrowser.Controller.Library;
-using MediaBrowser.Controller.MediaSegments;
 using MediaBrowser.Controller.Providers;
 using MediaBrowser.Model.Entities;
 using MediaBrowser.Model.IO;
@@ -29,19 +28,15 @@ public class AlbumMetadataService : MetadataService<MusicAlbum, AlbumInfo>
     /// <param name="providerManager">Instance of the <see cref="IProviderManager"/> interface.</param>
     /// <param name="fileSystem">Instance of the <see cref="IFileSystem"/> interface.</param>
     /// <param name="libraryManager">Instance of the <see cref="ILibraryManager"/> interface.</param>
-    /// <param name="pathManager">Instance of the <see cref="IPathManager"/> interface.</param>
-    /// <param name="keyframeManager">Instance of the <see cref="IKeyframeManager"/> interface.</param>
-    /// <param name="mediaSegmentManager">Instance of the <see cref="IMediaSegmentManager"/> interface.</param>
+    /// <param name="externalDataManager">Instance of the <see cref="IExternalDataManager"/> interface.</param>
     public AlbumMetadataService(
         IServerConfigurationManager serverConfigurationManager,
         ILogger<AlbumMetadataService> logger,
         IProviderManager providerManager,
         IFileSystem fileSystem,
         ILibraryManager libraryManager,
-        IPathManager pathManager,
-        IKeyframeManager keyframeManager,
-        IMediaSegmentManager mediaSegmentManager)
-        : base(serverConfigurationManager, logger, providerManager, fileSystem, libraryManager, pathManager, keyframeManager, mediaSegmentManager)
+        IExternalDataManager externalDataManager)
+        : base(serverConfigurationManager, logger, providerManager, fileSystem, libraryManager, externalDataManager)
     {
     }
 

+ 3 - 8
MediaBrowser.Providers/Music/ArtistMetadataService.cs

@@ -4,7 +4,6 @@ using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Entities.Audio;
 using MediaBrowser.Controller.IO;
 using MediaBrowser.Controller.Library;
-using MediaBrowser.Controller.MediaSegments;
 using MediaBrowser.Controller.Providers;
 using MediaBrowser.Model.IO;
 using MediaBrowser.Providers.Manager;
@@ -25,19 +24,15 @@ public class ArtistMetadataService : MetadataService<MusicArtist, ArtistInfo>
     /// <param name="providerManager">Instance of the <see cref="IProviderManager"/> interface.</param>
     /// <param name="fileSystem">Instance of the <see cref="IFileSystem"/> interface.</param>
     /// <param name="libraryManager">Instance of the <see cref="ILibraryManager"/> interface.</param>
-    /// <param name="pathManager">Instance of the <see cref="IPathManager"/> interface.</param>
-    /// <param name="keyframeManager">Instance of the <see cref="IKeyframeManager"/> interface.</param>
-    /// <param name="mediaSegmentManager">Instance of the <see cref="IMediaSegmentManager"/> interface.</param>
+    /// <param name="externalDataManager">Instance of the <see cref="IExternalDataManager"/> interface.</param>
     public ArtistMetadataService(
         IServerConfigurationManager serverConfigurationManager,
         ILogger<ArtistMetadataService> logger,
         IProviderManager providerManager,
         IFileSystem fileSystem,
         ILibraryManager libraryManager,
-        IPathManager pathManager,
-        IKeyframeManager keyframeManager,
-        IMediaSegmentManager mediaSegmentManager)
-        : base(serverConfigurationManager, logger, providerManager, fileSystem, libraryManager, pathManager, keyframeManager, mediaSegmentManager)
+        IExternalDataManager externalDataManager)
+        : base(serverConfigurationManager, logger, providerManager, fileSystem, libraryManager, externalDataManager)
     {
     }
 

+ 3 - 8
MediaBrowser.Providers/Music/AudioMetadataService.cs

@@ -4,7 +4,6 @@ using MediaBrowser.Controller.Configuration;
 using MediaBrowser.Controller.Entities.Audio;
 using MediaBrowser.Controller.IO;
 using MediaBrowser.Controller.Library;
-using MediaBrowser.Controller.MediaSegments;
 using MediaBrowser.Controller.Providers;
 using MediaBrowser.Model.Entities;
 using MediaBrowser.Model.IO;
@@ -26,19 +25,15 @@ public class AudioMetadataService : MetadataService<Audio, SongInfo>
     /// <param name="providerManager">Instance of the <see cref="IProviderManager"/> interface.</param>
     /// <param name="fileSystem">Instance of the <see cref="IFileSystem"/> interface.</param>
     /// <param name="libraryManager">Instance of the <see cref="ILibraryManager"/> interface.</param>
-    /// <param name="pathManager">Instance of the <see cref="IPathManager"/> interface.</param>
-    /// <param name="keyframeManager">Instance of the <see cref="IKeyframeManager"/> interface.</param>
-    /// <param name="mediaSegmentManager">Instance of the <see cref="IMediaSegmentManager"/> interface.</param>
+    /// <param name="externalDataManager">Instance of the <see cref="IExternalDataManager"/> interface.</param>
     public AudioMetadataService(
         IServerConfigurationManager serverConfigurationManager,
         ILogger<AudioMetadataService> logger,
         IProviderManager providerManager,
         IFileSystem fileSystem,
         ILibraryManager libraryManager,
-        IPathManager pathManager,
-        IKeyframeManager keyframeManager,
-        IMediaSegmentManager mediaSegmentManager)
-        : base(serverConfigurationManager, logger, providerManager, fileSystem, libraryManager, pathManager, keyframeManager, mediaSegmentManager)
+        IExternalDataManager externalDataManager)
+        : base(serverConfigurationManager, logger, providerManager, fileSystem, libraryManager, externalDataManager)
     {
     }
 

+ 3 - 8
MediaBrowser.Providers/Music/MusicVideoMetadataService.cs

@@ -4,7 +4,6 @@ using MediaBrowser.Controller.Configuration;
 using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.IO;
 using MediaBrowser.Controller.Library;
-using MediaBrowser.Controller.MediaSegments;
 using MediaBrowser.Controller.Providers;
 using MediaBrowser.Model.Entities;
 using MediaBrowser.Model.IO;
@@ -26,19 +25,15 @@ public class MusicVideoMetadataService : MetadataService<MusicVideo, MusicVideoI
     /// <param name="providerManager">Instance of the <see cref="IProviderManager"/> interface.</param>
     /// <param name="fileSystem">Instance of the <see cref="IFileSystem"/> interface.</param>
     /// <param name="libraryManager">Instance of the <see cref="ILibraryManager"/> interface.</param>
-    /// <param name="pathManager">Instance of the <see cref="IPathManager"/> interface.</param>
-    /// <param name="keyframeManager">Instance of the <see cref="IKeyframeManager"/> interface.</param>
-    /// <param name="mediaSegmentManager">Instance of the <see cref="IMediaSegmentManager"/> interface.</param>
+    /// <param name="externalDataManager">Instance of the <see cref="IExternalDataManager"/> interface.</param>
     public MusicVideoMetadataService(
         IServerConfigurationManager serverConfigurationManager,
         ILogger<MusicVideoMetadataService> logger,
         IProviderManager providerManager,
         IFileSystem fileSystem,
         ILibraryManager libraryManager,
-        IPathManager pathManager,
-        IKeyframeManager keyframeManager,
-        IMediaSegmentManager mediaSegmentManager)
-        : base(serverConfigurationManager, logger, providerManager, fileSystem, libraryManager, pathManager, keyframeManager, mediaSegmentManager)
+        IExternalDataManager externalDataManager)
+        : base(serverConfigurationManager, logger, providerManager, fileSystem, libraryManager, externalDataManager)
     {
     }
 

+ 3 - 8
MediaBrowser.Providers/MusicGenres/MusicGenreMetadataService.cs

@@ -2,7 +2,6 @@ using MediaBrowser.Controller.Configuration;
 using MediaBrowser.Controller.Entities.Audio;
 using MediaBrowser.Controller.IO;
 using MediaBrowser.Controller.Library;
-using MediaBrowser.Controller.MediaSegments;
 using MediaBrowser.Controller.Providers;
 using MediaBrowser.Model.IO;
 using MediaBrowser.Providers.Manager;
@@ -23,19 +22,15 @@ public class MusicGenreMetadataService : MetadataService<MusicGenre, ItemLookupI
     /// <param name="providerManager">Instance of the <see cref="IProviderManager"/> interface.</param>
     /// <param name="fileSystem">Instance of the <see cref="IFileSystem"/> interface.</param>
     /// <param name="libraryManager">Instance of the <see cref="ILibraryManager"/> interface.</param>
-    /// <param name="pathManager">Instance of the <see cref="IPathManager"/> interface.</param>
-    /// <param name="keyframeManager">Instance of the <see cref="IKeyframeManager"/> interface.</param>
-    /// <param name="mediaSegmentManager">Instance of the <see cref="IMediaSegmentManager"/> interface.</param>
+    /// <param name="externalDataManager">Instance of the <see cref="IExternalDataManager"/> interface.</param>
     public MusicGenreMetadataService(
         IServerConfigurationManager serverConfigurationManager,
         ILogger<MusicGenreMetadataService> logger,
         IProviderManager providerManager,
         IFileSystem fileSystem,
         ILibraryManager libraryManager,
-        IPathManager pathManager,
-        IKeyframeManager keyframeManager,
-        IMediaSegmentManager mediaSegmentManager)
-        : base(serverConfigurationManager, logger, providerManager, fileSystem, libraryManager, pathManager, keyframeManager, mediaSegmentManager)
+        IExternalDataManager externalDataManager)
+        : base(serverConfigurationManager, logger, providerManager, fileSystem, libraryManager, externalDataManager)
     {
     }
 }

+ 3 - 8
MediaBrowser.Providers/People/PersonMetadataService.cs

@@ -2,7 +2,6 @@ using MediaBrowser.Controller.Configuration;
 using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.IO;
 using MediaBrowser.Controller.Library;
-using MediaBrowser.Controller.MediaSegments;
 using MediaBrowser.Controller.Providers;
 using MediaBrowser.Model.IO;
 using MediaBrowser.Providers.Manager;
@@ -23,19 +22,15 @@ public class PersonMetadataService : MetadataService<Person, PersonLookupInfo>
     /// <param name="providerManager">Instance of the <see cref="IProviderManager"/> interface.</param>
     /// <param name="fileSystem">Instance of the <see cref="IFileSystem"/> interface.</param>
     /// <param name="libraryManager">Instance of the <see cref="ILibraryManager"/> interface.</param>
-    /// <param name="pathManager">Instance of the <see cref="IPathManager"/> interface.</param>
-    /// <param name="keyframeManager">Instance of the <see cref="IKeyframeManager"/> interface.</param>
-    /// <param name="mediaSegmentManager">Instance of the <see cref="IMediaSegmentManager"/> interface.</param>
+    /// <param name="externalDataManager">Instance of the <see cref="IExternalDataManager"/> interface.</param>
     public PersonMetadataService(
         IServerConfigurationManager serverConfigurationManager,
         ILogger<PersonMetadataService> logger,
         IProviderManager providerManager,
         IFileSystem fileSystem,
         ILibraryManager libraryManager,
-        IPathManager pathManager,
-        IKeyframeManager keyframeManager,
-        IMediaSegmentManager mediaSegmentManager)
-        : base(serverConfigurationManager, logger, providerManager, fileSystem, libraryManager, pathManager, keyframeManager, mediaSegmentManager)
+        IExternalDataManager externalDataManager)
+        : base(serverConfigurationManager, logger, providerManager, fileSystem, libraryManager, externalDataManager)
     {
     }
 }

+ 3 - 8
MediaBrowser.Providers/Photos/PhotoAlbumMetadataService.cs

@@ -2,7 +2,6 @@ using MediaBrowser.Controller.Configuration;
 using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.IO;
 using MediaBrowser.Controller.Library;
-using MediaBrowser.Controller.MediaSegments;
 using MediaBrowser.Controller.Providers;
 using MediaBrowser.Model.IO;
 using MediaBrowser.Providers.Manager;
@@ -23,19 +22,15 @@ public class PhotoAlbumMetadataService : MetadataService<PhotoAlbum, ItemLookupI
     /// <param name="providerManager">Instance of the <see cref="IProviderManager"/> interface.</param>
     /// <param name="fileSystem">Instance of the <see cref="IFileSystem"/> interface.</param>
     /// <param name="libraryManager">Instance of the <see cref="ILibraryManager"/> interface.</param>
-    /// <param name="pathManager">Instance of the <see cref="IPathManager"/> interface.</param>
-    /// <param name="keyframeManager">Instance of the <see cref="IKeyframeManager"/> interface.</param>
-    /// <param name="mediaSegmentManager">Instance of the <see cref="IMediaSegmentManager"/> interface.</param>
+    /// <param name="externalDataManager">Instance of the <see cref="IExternalDataManager"/> interface.</param>
     public PhotoAlbumMetadataService(
         IServerConfigurationManager serverConfigurationManager,
         ILogger<PhotoAlbumMetadataService> logger,
         IProviderManager providerManager,
         IFileSystem fileSystem,
         ILibraryManager libraryManager,
-        IPathManager pathManager,
-        IKeyframeManager keyframeManager,
-        IMediaSegmentManager mediaSegmentManager)
-        : base(serverConfigurationManager, logger, providerManager, fileSystem, libraryManager, pathManager, keyframeManager, mediaSegmentManager)
+        IExternalDataManager externalDataManager)
+        : base(serverConfigurationManager, logger, providerManager, fileSystem, libraryManager, externalDataManager)
     {
     }
 }

+ 3 - 8
MediaBrowser.Providers/Photos/PhotoMetadataService.cs

@@ -2,7 +2,6 @@ using MediaBrowser.Controller.Configuration;
 using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.IO;
 using MediaBrowser.Controller.Library;
-using MediaBrowser.Controller.MediaSegments;
 using MediaBrowser.Controller.Providers;
 using MediaBrowser.Model.IO;
 using MediaBrowser.Providers.Manager;
@@ -23,19 +22,15 @@ public class PhotoMetadataService : MetadataService<Photo, ItemLookupInfo>
     /// <param name="providerManager">Instance of the <see cref="IProviderManager"/> interface.</param>
     /// <param name="fileSystem">Instance of the <see cref="IFileSystem"/> interface.</param>
     /// <param name="libraryManager">Instance of the <see cref="ILibraryManager"/> interface.</param>
-    /// <param name="pathManager">Instance of the <see cref="IPathManager"/> interface.</param>
-    /// <param name="keyframeManager">Instance of the <see cref="IKeyframeManager"/> interface.</param>
-    /// <param name="mediaSegmentManager">Instance of the <see cref="IMediaSegmentManager"/> interface.</param>
+    /// <param name="externalDataManager">Instance of the <see cref="IExternalDataManager"/> interface.</param>
     public PhotoMetadataService(
         IServerConfigurationManager serverConfigurationManager,
         ILogger<PhotoMetadataService> logger,
         IProviderManager providerManager,
         IFileSystem fileSystem,
         ILibraryManager libraryManager,
-        IPathManager pathManager,
-        IKeyframeManager keyframeManager,
-        IMediaSegmentManager mediaSegmentManager)
-        : base(serverConfigurationManager, logger, providerManager, fileSystem, libraryManager, pathManager, keyframeManager, mediaSegmentManager)
+        IExternalDataManager externalDataManager)
+        : base(serverConfigurationManager, logger, providerManager, fileSystem, libraryManager, externalDataManager)
     {
     }
 }

+ 3 - 8
MediaBrowser.Providers/Playlists/PlaylistMetadataService.cs

@@ -4,7 +4,6 @@ using MediaBrowser.Controller.Configuration;
 using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.IO;
 using MediaBrowser.Controller.Library;
-using MediaBrowser.Controller.MediaSegments;
 using MediaBrowser.Controller.Playlists;
 using MediaBrowser.Controller.Providers;
 using MediaBrowser.Model.Entities;
@@ -27,19 +26,15 @@ public class PlaylistMetadataService : MetadataService<Playlist, ItemLookupInfo>
     /// <param name="providerManager">Instance of the <see cref="IProviderManager"/> interface.</param>
     /// <param name="fileSystem">Instance of the <see cref="IFileSystem"/> interface.</param>
     /// <param name="libraryManager">Instance of the <see cref="ILibraryManager"/> interface.</param>
-    /// <param name="pathManager">Instance of the <see cref="IPathManager"/> interface.</param>
-    /// <param name="keyframeManager">Instance of the <see cref="IKeyframeManager"/> interface.</param>
-    /// <param name="mediaSegmentManager">Instance of the <see cref="IMediaSegmentManager"/> interface.</param>
+    /// <param name="externalDataManager">Instance of the <see cref="IExternalDataManager"/> interface.</param>
     public PlaylistMetadataService(
         IServerConfigurationManager serverConfigurationManager,
         ILogger<PlaylistMetadataService> logger,
         IProviderManager providerManager,
         IFileSystem fileSystem,
         ILibraryManager libraryManager,
-        IPathManager pathManager,
-        IKeyframeManager keyframeManager,
-        IMediaSegmentManager mediaSegmentManager)
-        : base(serverConfigurationManager, logger, providerManager, fileSystem, libraryManager, pathManager, keyframeManager, mediaSegmentManager)
+        IExternalDataManager externalDataManager)
+        : base(serverConfigurationManager, logger, providerManager, fileSystem, libraryManager, externalDataManager)
     {
     }
 

+ 3 - 8
MediaBrowser.Providers/Studios/StudioMetadataService.cs

@@ -2,7 +2,6 @@ using MediaBrowser.Controller.Configuration;
 using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.IO;
 using MediaBrowser.Controller.Library;
-using MediaBrowser.Controller.MediaSegments;
 using MediaBrowser.Controller.Providers;
 using MediaBrowser.Model.IO;
 using MediaBrowser.Providers.Manager;
@@ -23,19 +22,15 @@ public class StudioMetadataService : MetadataService<Studio, ItemLookupInfo>
     /// <param name="providerManager">Instance of the <see cref="IProviderManager"/> interface.</param>
     /// <param name="fileSystem">Instance of the <see cref="IFileSystem"/> interface.</param>
     /// <param name="libraryManager">Instance of the <see cref="ILibraryManager"/> interface.</param>
-    /// <param name="pathManager">Instance of the <see cref="IPathManager"/> interface.</param>
-    /// <param name="keyframeManager">Instance of the <see cref="IKeyframeManager"/> interface.</param>
-    /// <param name="mediaSegmentManager">Instance of the <see cref="IMediaSegmentManager"/> interface.</param>
+    /// <param name="externalDataManager">Instance of the <see cref="IExternalDataManager"/> interface.</param>
     public StudioMetadataService(
         IServerConfigurationManager serverConfigurationManager,
         ILogger<StudioMetadataService> logger,
         IProviderManager providerManager,
         IFileSystem fileSystem,
         ILibraryManager libraryManager,
-        IPathManager pathManager,
-        IKeyframeManager keyframeManager,
-        IMediaSegmentManager mediaSegmentManager)
-        : base(serverConfigurationManager, logger, providerManager, fileSystem, libraryManager, pathManager, keyframeManager, mediaSegmentManager)
+        IExternalDataManager externalDataManager)
+        : base(serverConfigurationManager, logger, providerManager, fileSystem, libraryManager, externalDataManager)
     {
     }
 }

+ 3 - 8
MediaBrowser.Providers/TV/EpisodeMetadataService.cs

@@ -3,7 +3,6 @@ using MediaBrowser.Controller.Configuration;
 using MediaBrowser.Controller.Entities.TV;
 using MediaBrowser.Controller.IO;
 using MediaBrowser.Controller.Library;
-using MediaBrowser.Controller.MediaSegments;
 using MediaBrowser.Controller.Providers;
 using MediaBrowser.Model.Entities;
 using MediaBrowser.Model.IO;
@@ -25,19 +24,15 @@ public class EpisodeMetadataService : MetadataService<Episode, EpisodeInfo>
     /// <param name="providerManager">Instance of the <see cref="IProviderManager"/> interface.</param>
     /// <param name="fileSystem">Instance of the <see cref="IFileSystem"/> interface.</param>
     /// <param name="libraryManager">Instance of the <see cref="ILibraryManager"/> interface.</param>
-    /// <param name="pathManager">Instance of the <see cref="IPathManager"/> interface.</param>
-    /// <param name="keyframeManager">Instance of the <see cref="IKeyframeManager"/> interface.</param>
-    /// <param name="mediaSegmentManager">Instance of the <see cref="IMediaSegmentManager"/> interface.</param>
+    /// <param name="externalDataManager">Instance of the <see cref="IExternalDataManager"/> interface.</param>
     public EpisodeMetadataService(
         IServerConfigurationManager serverConfigurationManager,
         ILogger<EpisodeMetadataService> logger,
         IProviderManager providerManager,
         IFileSystem fileSystem,
         ILibraryManager libraryManager,
-        IPathManager pathManager,
-        IKeyframeManager keyframeManager,
-        IMediaSegmentManager mediaSegmentManager)
-        : base(serverConfigurationManager, logger, providerManager, fileSystem, libraryManager, pathManager, keyframeManager, mediaSegmentManager)
+        IExternalDataManager externalDataManager)
+        : base(serverConfigurationManager, logger, providerManager, fileSystem, libraryManager, externalDataManager)
     {
     }
 

+ 3 - 8
MediaBrowser.Providers/TV/SeasonMetadataService.cs

@@ -6,7 +6,6 @@ using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Entities.TV;
 using MediaBrowser.Controller.IO;
 using MediaBrowser.Controller.Library;
-using MediaBrowser.Controller.MediaSegments;
 using MediaBrowser.Controller.Providers;
 using MediaBrowser.Model.Entities;
 using MediaBrowser.Model.IO;
@@ -28,19 +27,15 @@ public class SeasonMetadataService : MetadataService<Season, SeasonInfo>
     /// <param name="providerManager">Instance of the <see cref="IProviderManager"/> interface.</param>
     /// <param name="fileSystem">Instance of the <see cref="IFileSystem"/> interface.</param>
     /// <param name="libraryManager">Instance of the <see cref="ILibraryManager"/> interface.</param>
-    /// <param name="pathManager">Instance of the <see cref="IPathManager"/> interface.</param>
-    /// <param name="keyframeManager">Instance of the <see cref="IKeyframeManager"/> interface.</param>
-    /// <param name="mediaSegmentManager">Instance of the <see cref="IMediaSegmentManager"/> interface.</param>
+    /// <param name="externalDataManager">Instance of the <see cref="IExternalDataManager"/> interface.</param>
     public SeasonMetadataService(
         IServerConfigurationManager serverConfigurationManager,
         ILogger<SeasonMetadataService> logger,
         IProviderManager providerManager,
         IFileSystem fileSystem,
         ILibraryManager libraryManager,
-        IPathManager pathManager,
-        IKeyframeManager keyframeManager,
-        IMediaSegmentManager mediaSegmentManager)
-        : base(serverConfigurationManager, logger, providerManager, fileSystem, libraryManager, pathManager, keyframeManager, mediaSegmentManager)
+        IExternalDataManager externalDataManager)
+        : base(serverConfigurationManager, logger, providerManager, fileSystem, libraryManager, externalDataManager)
     {
     }
 

+ 3 - 8
MediaBrowser.Providers/TV/SeriesMetadataService.cs

@@ -10,7 +10,6 @@ using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Entities.TV;
 using MediaBrowser.Controller.IO;
 using MediaBrowser.Controller.Library;
-using MediaBrowser.Controller.MediaSegments;
 using MediaBrowser.Controller.Providers;
 using MediaBrowser.Model.Entities;
 using MediaBrowser.Model.Globalization;
@@ -36,9 +35,7 @@ public class SeriesMetadataService : MetadataService<Series, SeriesInfo>
     /// <param name="fileSystem">Instance of the <see cref="IFileSystem"/> interface.</param>
     /// <param name="libraryManager">Instance of the <see cref="ILibraryManager"/> interface.</param>
     /// <param name="localizationManager">Instance of the <see cref="ILocalizationManager"/> interface.</param>
-    /// <param name="pathManager">Instance of the <see cref="IPathManager"/> interface.</param>
-    /// <param name="keyframeManager">Instance of the <see cref="IKeyframeManager"/> interface.</param>
-    /// <param name="mediaSegmentManager">Instance of the <see cref="IMediaSegmentManager"/> interface.</param>
+    /// <param name="externalDataManager">Instance of the <see cref="IExternalDataManager"/> interface.</param>
     public SeriesMetadataService(
         IServerConfigurationManager serverConfigurationManager,
         ILogger<SeriesMetadataService> logger,
@@ -46,10 +43,8 @@ public class SeriesMetadataService : MetadataService<Series, SeriesInfo>
         IFileSystem fileSystem,
         ILibraryManager libraryManager,
         ILocalizationManager localizationManager,
-        IPathManager pathManager,
-        IKeyframeManager keyframeManager,
-        IMediaSegmentManager mediaSegmentManager)
-        : base(serverConfigurationManager, logger, providerManager, fileSystem, libraryManager, pathManager, keyframeManager, mediaSegmentManager)
+        IExternalDataManager externalDataManager)
+        : base(serverConfigurationManager, logger, providerManager, fileSystem, libraryManager, externalDataManager)
     {
         _localizationManager = localizationManager;
     }

+ 1 - 1
MediaBrowser.Providers/Trickplay/TrickplayProvider.cs

@@ -101,7 +101,7 @@ public class TrickplayProvider : ICustomMetadataProvider<Episode>,
         bool? enableDuringScan = libraryOptions?.ExtractTrickplayImagesDuringLibraryScan;
         bool replace = options.RegenerateTrickplay && options.MetadataRefreshMode > MetadataRefreshMode.Default;
 
-        if (!enableDuringScan.GetValueOrDefault(false))
+        if (libraryOptions is null || !enableDuringScan.GetValueOrDefault(false))
         {
             return ItemUpdateType.None;
         }

+ 3 - 8
MediaBrowser.Providers/Videos/VideoMetadataService.cs

@@ -2,7 +2,6 @@ using MediaBrowser.Controller.Configuration;
 using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.IO;
 using MediaBrowser.Controller.Library;
-using MediaBrowser.Controller.MediaSegments;
 using MediaBrowser.Controller.Providers;
 using MediaBrowser.Model.IO;
 using MediaBrowser.Providers.Manager;
@@ -23,19 +22,15 @@ public class VideoMetadataService : MetadataService<Video, ItemLookupInfo>
     /// <param name="providerManager">Instance of the <see cref="IProviderManager"/> interface.</param>
     /// <param name="fileSystem">Instance of the <see cref="IFileSystem"/> interface.</param>
     /// <param name="libraryManager">Instance of the <see cref="ILibraryManager"/> interface.</param>
-    /// <param name="pathManager">Instance of the <see cref="IPathManager"/> interface.</param>
-    /// <param name="keyframeManager">Instance of the <see cref="IKeyframeManager"/> interface.</param>
-    /// <param name="mediaSegmentManager">Instance of the <see cref="IMediaSegmentManager"/> interface.</param>
+    /// <param name="externalDataManager">Instance of the <see cref="IExternalDataManager"/> interface.</param>
     public VideoMetadataService(
         IServerConfigurationManager serverConfigurationManager,
         ILogger<VideoMetadataService> logger,
         IProviderManager providerManager,
         IFileSystem fileSystem,
         ILibraryManager libraryManager,
-        IPathManager pathManager,
-        IKeyframeManager keyframeManager,
-        IMediaSegmentManager mediaSegmentManager)
-        : base(serverConfigurationManager, logger, providerManager, fileSystem, libraryManager, pathManager, keyframeManager, mediaSegmentManager)
+        IExternalDataManager externalDataManager)
+        : base(serverConfigurationManager, logger, providerManager, fileSystem, libraryManager, externalDataManager)
     {
     }
 

+ 3 - 8
MediaBrowser.Providers/Years/YearMetadataService.cs

@@ -2,7 +2,6 @@ using MediaBrowser.Controller.Configuration;
 using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.IO;
 using MediaBrowser.Controller.Library;
-using MediaBrowser.Controller.MediaSegments;
 using MediaBrowser.Controller.Providers;
 using MediaBrowser.Model.IO;
 using MediaBrowser.Providers.Manager;
@@ -23,19 +22,15 @@ public class YearMetadataService : MetadataService<Year, ItemLookupInfo>
     /// <param name="providerManager">Instance of the <see cref="IProviderManager"/> interface.</param>
     /// <param name="fileSystem">Instance of the <see cref="IFileSystem"/> interface.</param>
     /// <param name="libraryManager">Instance of the <see cref="ILibraryManager"/> interface.</param>
-    /// <param name="pathManager">Instance of the <see cref="IPathManager"/> interface.</param>
-    /// <param name="keyframeManager">Instance of the <see cref="IKeyframeManager"/> interface.</param>
-    /// <param name="mediaSegmentManager">Instance of the <see cref="IMediaSegmentManager"/> interface.</param>
+    /// <param name="externalDataManager">Instance of the <see cref="IExternalDataManager"/> interface.</param>
     public YearMetadataService(
         IServerConfigurationManager serverConfigurationManager,
         ILogger<YearMetadataService> logger,
         IProviderManager providerManager,
         IFileSystem fileSystem,
         ILibraryManager libraryManager,
-        IPathManager pathManager,
-        IKeyframeManager keyframeManager,
-        IMediaSegmentManager mediaSegmentManager)
-        : base(serverConfigurationManager, logger, providerManager, fileSystem, libraryManager, pathManager, keyframeManager, mediaSegmentManager)
+        IExternalDataManager externalDataManager)
+        : base(serverConfigurationManager, logger, providerManager, fileSystem, libraryManager, externalDataManager)
     {
     }
 }