diff --git a/Emby.Server.Implementations/Chapters/ChapterManager.cs b/Emby.Server.Implementations/Chapters/ChapterManager.cs
index b4daa2a143..fea05931d7 100644
--- a/Emby.Server.Implementations/Chapters/ChapterManager.cs
+++ b/Emby.Server.Implementations/Chapters/ChapterManager.cs
@@ -1,6 +1,5 @@
using System;
using System.Collections.Generic;
-using System.Globalization;
using System.IO;
using System.Linq;
using System.Threading;
@@ -251,23 +250,9 @@ public class ChapterManager : IChapterManager
}
///
- public void DeleteChapterImages(Video video)
+ public async Task DeleteChapterDataAsync(Guid itemId, CancellationToken cancellationToken)
{
- var path = _pathManager.GetChapterImageFolderPath(video);
- try
- {
- if (Directory.Exists(path))
- {
- _logger.LogInformation("Removing chapter images for {Name} [{Id}]", video.Name, video.Id);
- Directory.Delete(path, true);
- }
- }
- catch (Exception ex)
- {
- _logger.LogWarning("Failed to remove chapter image folder for {Item}: {Exception}", video.Id, ex);
- }
-
- _chapterRepository.DeleteChapters(video.Id);
+ await _chapterRepository.DeleteChaptersAsync(itemId, cancellationToken).ConfigureAwait(false);
}
private IReadOnlyList GetSavedChapterImages(Video video, IDirectoryService directoryService)
diff --git a/Emby.Server.Implementations/Library/ExternalDataManager.cs b/Emby.Server.Implementations/Library/ExternalDataManager.cs
index d3cfa1d256..4ad0f999bf 100644
--- a/Emby.Server.Implementations/Library/ExternalDataManager.cs
+++ b/Emby.Server.Implementations/Library/ExternalDataManager.cs
@@ -3,6 +3,7 @@ using System.IO;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
+using MediaBrowser.Controller.Chapters;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.IO;
using MediaBrowser.Controller.MediaSegments;
@@ -20,6 +21,7 @@ public class ExternalDataManager : IExternalDataManager
private readonly IMediaSegmentManager _mediaSegmentManager;
private readonly IPathManager _pathManager;
private readonly ITrickplayManager _trickplayManager;
+ private readonly IChapterManager _chapterManager;
private readonly ILogger _logger;
///
@@ -29,18 +31,21 @@ public class ExternalDataManager : IExternalDataManager
/// The media segment manager.
/// The path manager.
/// The trickplay manager.
+ /// The chapter manager.
/// The logger.
public ExternalDataManager(
IKeyframeManager keyframeManager,
IMediaSegmentManager mediaSegmentManager,
IPathManager pathManager,
ITrickplayManager trickplayManager,
+ IChapterManager chapterManager,
ILogger logger)
{
_keyframeManager = keyframeManager;
_mediaSegmentManager = mediaSegmentManager;
_pathManager = pathManager;
_trickplayManager = trickplayManager;
+ _chapterManager = chapterManager;
_logger = logger;
}
@@ -67,5 +72,6 @@ public class ExternalDataManager : IExternalDataManager
await _keyframeManager.DeleteKeyframeDataAsync(itemId, cancellationToken).ConfigureAwait(false);
await _mediaSegmentManager.DeleteSegmentsAsync(itemId, cancellationToken).ConfigureAwait(false);
await _trickplayManager.DeleteTrickplayDataAsync(itemId, cancellationToken).ConfigureAwait(false);
+ await _chapterManager.DeleteChapterDataAsync(itemId, cancellationToken).ConfigureAwait(false);
}
}
diff --git a/Jellyfin.Server.Implementations/Item/ChapterRepository.cs b/Jellyfin.Server.Implementations/Item/ChapterRepository.cs
index e0d23a2613..98700f3224 100644
--- a/Jellyfin.Server.Implementations/Item/ChapterRepository.cs
+++ b/Jellyfin.Server.Implementations/Item/ChapterRepository.cs
@@ -1,6 +1,8 @@
using System;
using System.Collections.Generic;
using System.Linq;
+using System.Threading;
+using System.Threading.Tasks;
using Jellyfin.Database.Implementations;
using Jellyfin.Database.Implementations.Entities;
using MediaBrowser.Controller.Drawing;
@@ -82,11 +84,14 @@ public class ChapterRepository : IChapterRepository
}
///
- public void DeleteChapters(Guid itemId)
+ public async Task DeleteChaptersAsync(Guid itemId, CancellationToken cancellationToken)
{
- using var context = _dbProvider.CreateDbContext();
- context.Chapters.Where(c => c.ItemId.Equals(itemId)).ExecuteDelete();
- context.SaveChanges();
+ var dbContext = await _dbProvider.CreateDbContextAsync(cancellationToken).ConfigureAwait(false);
+ await using (dbContext.ConfigureAwait(false))
+ {
+ await dbContext.Chapters.Where(c => c.ItemId.Equals(itemId)).ExecuteDeleteAsync(cancellationToken).ConfigureAwait(false);
+ await dbContext.SaveChangesAsync(cancellationToken).ConfigureAwait(false);
+ }
}
private Chapter Map(ChapterInfo chapterInfo, int index, Guid itemId)
diff --git a/MediaBrowser.Controller/Chapters/IChapterManager.cs b/MediaBrowser.Controller/Chapters/IChapterManager.cs
index 7532e56c60..25656fd625 100644
--- a/MediaBrowser.Controller/Chapters/IChapterManager.cs
+++ b/MediaBrowser.Controller/Chapters/IChapterManager.cs
@@ -48,8 +48,10 @@ public interface IChapterManager
Task RefreshChapterImages(Video video, IDirectoryService directoryService, IReadOnlyList chapters, bool extractImages, bool saveChapters, CancellationToken cancellationToken);
///
- /// Deletes the chapter images.
+ /// Deletes the chapter data.
///
- /// Video to use.
- void DeleteChapterImages(Video video);
+ /// The item id.
+ /// The cancellation token.
+ /// Task.
+ Task DeleteChapterDataAsync(Guid itemId, CancellationToken cancellationToken);
}
diff --git a/MediaBrowser.Controller/Persistence/IChapterRepository.cs b/MediaBrowser.Controller/Persistence/IChapterRepository.cs
index 0844ddb364..64b90fd638 100644
--- a/MediaBrowser.Controller/Persistence/IChapterRepository.cs
+++ b/MediaBrowser.Controller/Persistence/IChapterRepository.cs
@@ -1,5 +1,7 @@
using System;
using System.Collections.Generic;
+using System.Threading;
+using System.Threading.Tasks;
using MediaBrowser.Model.Entities;
namespace MediaBrowser.Controller.Persistence;
@@ -13,7 +15,9 @@ public interface IChapterRepository
/// Deletes the chapters.
///
/// The item.
- void DeleteChapters(Guid itemId);
+ /// The cancellation token.
+ /// Task.
+ Task DeleteChaptersAsync(Guid itemId, CancellationToken cancellationToken);
///
/// Saves the chapters.