|
@@ -18,12 +18,14 @@ namespace MediaBrowser.Server.Implementations.Channels
|
|
private readonly IChannelManager _channelManager;
|
|
private readonly IChannelManager _channelManager;
|
|
private readonly IUserManager _userManager;
|
|
private readonly IUserManager _userManager;
|
|
private readonly ILogger _logger;
|
|
private readonly ILogger _logger;
|
|
|
|
+ private readonly ILibraryManager _libraryManager;
|
|
|
|
|
|
- public ChannelPostScanTask(IChannelManager channelManager, IUserManager userManager, ILogger logger)
|
|
|
|
|
|
+ public ChannelPostScanTask(IChannelManager channelManager, IUserManager userManager, ILogger logger, ILibraryManager libraryManager)
|
|
{
|
|
{
|
|
_channelManager = channelManager;
|
|
_channelManager = channelManager;
|
|
_userManager = userManager;
|
|
_userManager = userManager;
|
|
_logger = logger;
|
|
_logger = logger;
|
|
|
|
+ _libraryManager = libraryManager;
|
|
}
|
|
}
|
|
|
|
|
|
public async Task Run(IProgress<double> progress, CancellationToken cancellationToken)
|
|
public async Task Run(IProgress<double> progress, CancellationToken cancellationToken)
|
|
@@ -52,6 +54,8 @@ namespace MediaBrowser.Server.Implementations.Channels
|
|
progress.Report(percent * 100);
|
|
progress.Report(percent * 100);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ await CleanDatabase(cancellationToken).ConfigureAwait(false);
|
|
|
|
+
|
|
progress.Report(100);
|
|
progress.Report(100);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -63,7 +67,7 @@ namespace MediaBrowser.Server.Implementations.Channels
|
|
|
|
|
|
return string.Join("|", channels.ToArray());
|
|
return string.Join("|", channels.ToArray());
|
|
}
|
|
}
|
|
-
|
|
|
|
|
|
+
|
|
private async Task DownloadContent(string user, CancellationToken cancellationToken, IProgress<double> progress)
|
|
private async Task DownloadContent(string user, CancellationToken cancellationToken, IProgress<double> progress)
|
|
{
|
|
{
|
|
var channels = await _channelManager.GetChannelsInternal(new ChannelQuery
|
|
var channels = await _channelManager.GetChannelsInternal(new ChannelQuery
|
|
@@ -116,6 +120,59 @@ namespace MediaBrowser.Server.Implementations.Channels
|
|
progress.Report(100);
|
|
progress.Report(100);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ private async Task CleanDatabase(CancellationToken cancellationToken)
|
|
|
|
+ {
|
|
|
|
+ var allChannels = await _channelManager.GetChannelsInternal(new ChannelQuery { }, cancellationToken);
|
|
|
|
+
|
|
|
|
+ var allIds = _libraryManager.GetItemIds(new InternalItemsQuery
|
|
|
|
+ {
|
|
|
|
+ IncludeItemTypes = new[] { typeof(Channel).Name }
|
|
|
|
+ });
|
|
|
|
+
|
|
|
|
+ var invalidIds = allIds
|
|
|
|
+ .Except(allChannels.Items.Select(i => i.Id).ToList())
|
|
|
|
+ .ToList();
|
|
|
|
+
|
|
|
|
+ foreach (var id in invalidIds)
|
|
|
|
+ {
|
|
|
|
+ cancellationToken.ThrowIfCancellationRequested();
|
|
|
|
+
|
|
|
|
+ await CleanChannel(id, cancellationToken).ConfigureAwait(false);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private async Task CleanChannel(Guid id, CancellationToken cancellationToken)
|
|
|
|
+ {
|
|
|
|
+ _logger.Debug("Cleaning channel {0} from database", id);
|
|
|
|
+
|
|
|
|
+ // Delete all channel items
|
|
|
|
+ var allIds = _libraryManager.GetItemIds(new InternalItemsQuery
|
|
|
|
+ {
|
|
|
|
+ ChannelIds = new[] { id.ToString("N") }
|
|
|
|
+ });
|
|
|
|
+
|
|
|
|
+ foreach (var deleteId in allIds)
|
|
|
|
+ {
|
|
|
|
+ cancellationToken.ThrowIfCancellationRequested();
|
|
|
|
+
|
|
|
|
+ await DeleteItem(deleteId).ConfigureAwait(false);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // Finally, delete the channel itself
|
|
|
|
+ await DeleteItem(id).ConfigureAwait(false);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private Task DeleteItem(Guid id)
|
|
|
|
+ {
|
|
|
|
+ var item = _libraryManager.GetItemById(id);
|
|
|
|
+
|
|
|
|
+ return _libraryManager.DeleteItem(item, new DeleteOptions
|
|
|
|
+ {
|
|
|
|
+ DeleteFileLocation = false
|
|
|
|
+
|
|
|
|
+ });
|
|
|
|
+ }
|
|
|
|
+
|
|
private async Task GetAllItems(string user, string channelId, string folderId, int currentRefreshLevel, int maxRefreshLevel, IProgress<double> progress, CancellationToken cancellationToken)
|
|
private async Task GetAllItems(string user, string channelId, string folderId, int currentRefreshLevel, int maxRefreshLevel, IProgress<double> progress, CancellationToken cancellationToken)
|
|
{
|
|
{
|
|
var folderItems = new List<string>();
|
|
var folderItems = new List<string>();
|