Add more checks for when torrents or downloads have been removed.

This commit is contained in:
Roger Far 2021-10-24 09:39:15 -06:00
parent 0f4d896e53
commit e9e16bedf0
4 changed files with 144 additions and 56 deletions

View file

@ -56,6 +56,11 @@ namespace RdtClient.Data.Data
var dbDownload = await _dataContext.Downloads var dbDownload = await _dataContext.Downloads
.FirstOrDefaultAsync(m => m.DownloadId == downloadId); .FirstOrDefaultAsync(m => m.DownloadId == downloadId);
if (dbDownload == null)
{
return;
}
dbDownload.Link = unrestrictedLink; dbDownload.Link = unrestrictedLink;
await _dataContext.SaveChangesAsync(); await _dataContext.SaveChangesAsync();
@ -68,6 +73,11 @@ namespace RdtClient.Data.Data
var dbDownload = await _dataContext.Downloads var dbDownload = await _dataContext.Downloads
.FirstOrDefaultAsync(m => m.DownloadId == downloadId); .FirstOrDefaultAsync(m => m.DownloadId == downloadId);
if (dbDownload == null)
{
return;
}
dbDownload.DownloadStarted = dateTime; dbDownload.DownloadStarted = dateTime;
await _dataContext.SaveChangesAsync(); await _dataContext.SaveChangesAsync();
@ -97,6 +107,11 @@ namespace RdtClient.Data.Data
var dbDownload = await _dataContext.Downloads var dbDownload = await _dataContext.Downloads
.FirstOrDefaultAsync(m => m.DownloadId == downloadId); .FirstOrDefaultAsync(m => m.DownloadId == downloadId);
if (dbDownload == null)
{
return;
}
dbDownload.UnpackingQueued = dateTime; dbDownload.UnpackingQueued = dateTime;
await _dataContext.SaveChangesAsync(); await _dataContext.SaveChangesAsync();
@ -109,6 +124,11 @@ namespace RdtClient.Data.Data
var dbDownload = await _dataContext.Downloads var dbDownload = await _dataContext.Downloads
.FirstOrDefaultAsync(m => m.DownloadId == downloadId); .FirstOrDefaultAsync(m => m.DownloadId == downloadId);
if (dbDownload == null)
{
return;
}
dbDownload.UnpackingStarted = dateTime; dbDownload.UnpackingStarted = dateTime;
await _dataContext.SaveChangesAsync(); await _dataContext.SaveChangesAsync();
@ -121,6 +141,11 @@ namespace RdtClient.Data.Data
var dbDownload = await _dataContext.Downloads var dbDownload = await _dataContext.Downloads
.FirstOrDefaultAsync(m => m.DownloadId == downloadId); .FirstOrDefaultAsync(m => m.DownloadId == downloadId);
if (dbDownload == null)
{
return;
}
dbDownload.UnpackingFinished = dateTime; dbDownload.UnpackingFinished = dateTime;
await _dataContext.SaveChangesAsync(); await _dataContext.SaveChangesAsync();
@ -133,6 +158,11 @@ namespace RdtClient.Data.Data
var dbDownload = await _dataContext.Downloads var dbDownload = await _dataContext.Downloads
.FirstOrDefaultAsync(m => m.DownloadId == downloadId); .FirstOrDefaultAsync(m => m.DownloadId == downloadId);
if (dbDownload == null)
{
return;
}
dbDownload.Completed = dateTime; dbDownload.Completed = dateTime;
await _dataContext.SaveChangesAsync(); await _dataContext.SaveChangesAsync();
@ -145,6 +175,11 @@ namespace RdtClient.Data.Data
var dbDownload = await _dataContext.Downloads var dbDownload = await _dataContext.Downloads
.FirstOrDefaultAsync(m => m.DownloadId == downloadId); .FirstOrDefaultAsync(m => m.DownloadId == downloadId);
if (dbDownload == null)
{
return;
}
dbDownload.Error = error; dbDownload.Error = error;
await _dataContext.SaveChangesAsync(); await _dataContext.SaveChangesAsync();
@ -157,6 +192,11 @@ namespace RdtClient.Data.Data
var dbDownload = await _dataContext.Downloads var dbDownload = await _dataContext.Downloads
.FirstOrDefaultAsync(m => m.DownloadId == downloadId); .FirstOrDefaultAsync(m => m.DownloadId == downloadId);
if (dbDownload == null)
{
return;
}
dbDownload.RetryCount = retryCount; dbDownload.RetryCount = retryCount;
await _dataContext.SaveChangesAsync(); await _dataContext.SaveChangesAsync();
@ -169,6 +209,11 @@ namespace RdtClient.Data.Data
var dbDownload = await _dataContext.Downloads var dbDownload = await _dataContext.Downloads
.FirstOrDefaultAsync(m => m.DownloadId == downloadId); .FirstOrDefaultAsync(m => m.DownloadId == downloadId);
if (dbDownload == null)
{
return;
}
dbDownload.RemoteId = remoteId; dbDownload.RemoteId = remoteId;
await _dataContext.SaveChangesAsync(); await _dataContext.SaveChangesAsync();

View file

@ -104,6 +104,14 @@ namespace RdtClient.Service.Services
Log.Debug($"Processing active download {downloadId}: error {downloadClient.Error}"); Log.Debug($"Processing active download {downloadId}: error {downloadClient.Error}");
var download = await _downloads.GetById(downloadId); var download = await _downloads.GetById(downloadId);
if (download == null)
{
ActiveDownloadClients.TryRemove(downloadId, out _);
Log.Debug($"Download with ID {downloadId} not found! Removed from queue");
continue;
}
if (download.RetryCount < DownloadRetryCount) if (download.RetryCount < DownloadRetryCount)
{ {
Log.Debug($"Processing active download {downloadId}: error {downloadClient.Error}, download retry count {download.RetryCount}/{DownloadRetryCount}, torrent retry count {download.Torrent.RetryCount}/{TorrentRetryCount}, retrying download"); Log.Debug($"Processing active download {downloadId}: error {downloadClient.Error}, download retry count {download.RetryCount}/{DownloadRetryCount}, torrent retry count {download.Torrent.RetryCount}/{TorrentRetryCount}, retrying download");

View file

@ -164,6 +164,11 @@ namespace RdtClient.Service.Services
{ {
var torrent = await GetById(torrentId); var torrent = await GetById(torrentId);
if (torrent == null)
{
return;
}
await GetRdNetClient().Torrents.SelectFilesAsync(torrent.RdId, fileIds.ToArray()); await GetRdNetClient().Torrents.SelectFilesAsync(torrent.RdId, fileIds.ToArray());
} }
@ -171,6 +176,11 @@ namespace RdtClient.Service.Services
{ {
var torrent = await GetById(torrentId); var torrent = await GetById(torrentId);
if (torrent == null)
{
return;
}
var rdTorrent = await GetRdNetClient().Torrents.GetInfoAsync(torrent.RdId); var rdTorrent = await GetRdNetClient().Torrents.GetInfoAsync(torrent.RdId);
var torrentLinks = rdTorrent.Links.Where(m => !String.IsNullOrWhiteSpace(m)).ToList(); var torrentLinks = rdTorrent.Links.Where(m => !String.IsNullOrWhiteSpace(m)).ToList();
@ -199,61 +209,63 @@ namespace RdtClient.Service.Services
{ {
var torrent = await GetById(torrentId); var torrent = await GetById(torrentId);
if (torrent != null) if (torrent == null)
{ {
foreach (var download in torrent.Downloads) return;
{ }
if (TorrentRunner.ActiveUnpackClients.TryRemove(download.DownloadId, out var activeUnpack))
{
activeUnpack.Cancel();
}
if (TorrentRunner.ActiveDownloadClients.TryRemove(download.DownloadId, out var activeDownload)) foreach (var download in torrent.Downloads)
{ {
activeDownload.Cancel(); if (TorrentRunner.ActiveUnpackClients.TryRemove(download.DownloadId, out var activeUnpack))
} {
activeUnpack.Cancel();
} }
if (deleteData) if (TorrentRunner.ActiveDownloadClients.TryRemove(download.DownloadId, out var activeDownload))
{ {
await _torrentData.UpdateComplete(torrent.TorrentId, DateTimeOffset.UtcNow); activeDownload.Cancel();
await _downloads.DeleteForTorrent(torrent.TorrentId);
await _torrentData.Delete(torrentId);
} }
}
if (deleteRdTorrent) if (deleteData)
{
await _torrentData.UpdateComplete(torrent.TorrentId, DateTimeOffset.UtcNow);
await _downloads.DeleteForTorrent(torrent.TorrentId);
await _torrentData.Delete(torrentId);
}
if (deleteRdTorrent)
{
await GetRdNetClient().Torrents.DeleteAsync(torrent.RdId);
}
if (deleteLocalFiles)
{
var downloadPath = DownloadPath(torrent);
downloadPath = Path.Combine(downloadPath, torrent.RdName);
if (Directory.Exists(downloadPath))
{ {
await GetRdNetClient().Torrents.DeleteAsync(torrent.RdId); var retry = 0;
}
if (deleteLocalFiles) while (true)
{
var downloadPath = DownloadPath(torrent);
downloadPath = Path.Combine(downloadPath, torrent.RdName);
if (Directory.Exists(downloadPath))
{ {
var retry = 0; try
while (true)
{ {
try Directory.Delete(downloadPath, true);
break;
}
catch
{
retry++;
if (retry >= 3)
{ {
Directory.Delete(downloadPath, true); throw;
break;
} }
catch
{
retry++;
if (retry >= 3) await Task.Delay(1000);
{
throw;
}
await Task.Delay(1000);
}
} }
} }
} }
@ -263,7 +275,18 @@ namespace RdtClient.Service.Services
private async Task DeleteDownload(Guid torrentId, Guid downloadId) private async Task DeleteDownload(Guid torrentId, Guid downloadId)
{ {
var torrent = await GetById(torrentId); var torrent = await GetById(torrentId);
if (torrent == null)
{
return;
}
var download = await _downloads.GetById(downloadId); var download = await _downloads.GetById(downloadId);
if (download == null)
{
return;
}
var downloadPath = DownloadPath(torrent); var downloadPath = DownloadPath(torrent);
@ -305,6 +328,11 @@ namespace RdtClient.Service.Services
{ {
var download = await _downloads.GetById(downloadId); var download = await _downloads.GetById(downloadId);
if (download == null)
{
throw new Exception($"Download with ID {downloadId} not found");
}
var unrestrictedLink = await GetRdNetClient().Unrestrict.LinkAsync(download.Path); var unrestrictedLink = await GetRdNetClient().Unrestrict.LinkAsync(download.Path);
await _downloads.UpdateUnrestrictedLink(downloadId, unrestrictedLink.Download); await _downloads.UpdateUnrestrictedLink(downloadId, unrestrictedLink.Download);
@ -388,6 +416,11 @@ namespace RdtClient.Service.Services
{ {
var torrent = await _torrentData.GetById(torrentId); var torrent = await _torrentData.GetById(torrentId);
if (torrent == null)
{
return;
}
var newRetryCount = torrent.RetryCount + 1; var newRetryCount = torrent.RetryCount + 1;
foreach (var download in torrent.Downloads) foreach (var download in torrent.Downloads)
@ -498,24 +531,26 @@ namespace RdtClient.Service.Services
{ {
var torrent = await _torrentData.GetById(torrentId); var torrent = await _torrentData.GetById(torrentId);
if (torrent != null) if (torrent == null)
{ {
await Update(torrent); return null;
}
foreach (var download in torrent.Downloads) await Update(torrent);
foreach (var download in torrent.Downloads)
{
if (TorrentRunner.ActiveDownloadClients.TryGetValue(download.DownloadId, out var downloadClient))
{ {
if (TorrentRunner.ActiveDownloadClients.TryGetValue(download.DownloadId, out var downloadClient)) download.Speed = downloadClient.Speed;
{ download.BytesTotal = downloadClient.BytesTotal;
download.Speed = downloadClient.Speed; download.BytesDone = downloadClient.BytesDone;
download.BytesTotal = downloadClient.BytesTotal; }
download.BytesDone = downloadClient.BytesDone;
}
if (TorrentRunner.ActiveUnpackClients.TryGetValue(download.DownloadId, out var unpackClient)) if (TorrentRunner.ActiveUnpackClients.TryGetValue(download.DownloadId, out var unpackClient))
{ {
download.BytesTotal = unpackClient.BytesTotal; download.BytesTotal = unpackClient.BytesTotal;
download.BytesDone = unpackClient.BytesDone; download.BytesDone = unpackClient.BytesDone;
}
} }
} }

View file

@ -4,7 +4,7 @@
<TargetFramework>net5.0</TargetFramework> <TargetFramework>net5.0</TargetFramework>
<OutputType>Exe</OutputType> <OutputType>Exe</OutputType>
<UserSecretsId>94c24cba-f03f-4453-a671-3640b517c573</UserSecretsId> <UserSecretsId>94c24cba-f03f-4453-a671-3640b517c573</UserSecretsId>
<Version>1.8.8</Version> <Version>1.8.9</Version>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>