diff --git a/client/src/app/navbar/settings/settings.component.ts b/client/src/app/navbar/settings/settings.component.ts
index dc79e1c..cf8ee96 100644
--- a/client/src/app/navbar/settings/settings.component.ts
+++ b/client/src/app/navbar/settings/settings.component.ts
@@ -45,6 +45,7 @@ export class SettingsComponent implements OnInit {
public settingDownloadMaxSpeed: number;
public settingUnpackLimit: number;
public settingMinFileSize: number;
+ public settingOnlyDownloadAvailableFiles: boolean;
constructor(private settingsService: SettingsService) {}
@@ -66,6 +67,7 @@ export class SettingsComponent implements OnInit {
this.settingDownloadMaxSpeed = parseInt(this.getSetting(results, 'DownloadMaxSpeed'), 10);
this.settingUnpackLimit = parseInt(this.getSetting(results, 'UnpackLimit'), 10);
this.settingMinFileSize = parseInt(this.getSetting(results, 'MinFileSize'), 10);
+ this.settingOnlyDownloadAvailableFiles = this.getSetting(results, 'OnlyDownloadAvailableFiles') === 'true';
},
(err) => {
this.error = err.error;
@@ -118,6 +120,10 @@ export class SettingsComponent implements OnInit {
settingId: 'MinFileSize',
value: (this.settingMinFileSize ?? 0).toString(),
},
+ {
+ settingId: 'OnlyDownloadAvailableFiles',
+ value: (this.settingOnlyDownloadAvailableFiles ? '1' : '0').toString(),
+ },
];
this.settingsService.update(settings).subscribe(
diff --git a/server/RdtClient.Data/Data/DataContext.cs b/server/RdtClient.Data/Data/DataContext.cs
index 254991b..2296ca1 100644
--- a/server/RdtClient.Data/Data/DataContext.cs
+++ b/server/RdtClient.Data/Data/DataContext.cs
@@ -101,6 +101,12 @@ namespace RdtClient.Data.Data
Value = "0"
},
new Setting
+ {
+ SettingId = "OnlyDownloadAvailableFiles",
+ Type = "Int32",
+ Value = "1"
+ },
+ new Setting
{
SettingId = "DownloadChunkCount",
Type = "Int32",
diff --git a/server/RdtClient.Data/RdtClient.Data.csproj b/server/RdtClient.Data/RdtClient.Data.csproj
index c07459f..13f39be 100644
--- a/server/RdtClient.Data/RdtClient.Data.csproj
+++ b/server/RdtClient.Data/RdtClient.Data.csproj
@@ -14,7 +14,7 @@
runtime; build; native; contentfiles; analyzers; buildtransitive
-
+
diff --git a/server/RdtClient.Service/RdtClient.Service.csproj b/server/RdtClient.Service/RdtClient.Service.csproj
index d27b1ca..1ad7639 100644
--- a/server/RdtClient.Service/RdtClient.Service.csproj
+++ b/server/RdtClient.Service/RdtClient.Service.csproj
@@ -6,10 +6,10 @@
-
+
-
+
diff --git a/server/RdtClient.Service/Services/TorrentRunner.cs b/server/RdtClient.Service/Services/TorrentRunner.cs
index 434541f..0c457a8 100644
--- a/server/RdtClient.Service/Services/TorrentRunner.cs
+++ b/server/RdtClient.Service/Services/TorrentRunner.cs
@@ -77,7 +77,10 @@ namespace RdtClient.Service.Services
}
settingMinFileSize = settingMinFileSize * 1024 * 1024;
-
+
+ var settingOnlyDownloadAvailableFilesRaw = settings.GetNumber("OnlyDownloadAvailableFiles");
+ var settingOnlyDownloadAvailableFiles = settingOnlyDownloadAvailableFilesRaw == 1;
+
var settingDownloadLimit = settings.GetNumber("DownloadLimit");
if (settingDownloadLimit < 1)
{
@@ -264,18 +267,22 @@ namespace RdtClient.Service.Services
// RealDebrid is waiting for file selection, select which files to download.
if (torrent.AutoDownload && torrent.RdStatus == RealDebridStatus.WaitingForFileSelection)
{
- var fileIds = torrent.Files
- .Select(m => m.Id.ToString())
- .ToArray();
+ var files = torrent.Files;
+
+ if (settingOnlyDownloadAvailableFiles)
+ {
+ var availableFiles = await _torrents.GetAvailableFiles(torrent.Hash);
+
+ files = torrent.Files.Where(m => availableFiles.Any(f => m.Path.EndsWith(f))).ToList();
+ }
if (settingMinFileSize > 0)
{
- fileIds = torrent.Files
- .Where(m => m.Bytes > settingMinFileSize)
- .Select(m => m.Id.ToString())
- .ToArray();
+ files = files.Where(m => m.Bytes > settingMinFileSize).ToList();
}
+ var fileIds = files.Select(m => m.Id.ToString()).ToArray();
+
await _torrents.SelectFiles(torrent.RdId, fileIds);
}
diff --git a/server/RdtClient.Service/Services/Torrents.cs b/server/RdtClient.Service/Services/Torrents.cs
index 8cd1bec..37b0657 100644
--- a/server/RdtClient.Service/Services/Torrents.cs
+++ b/server/RdtClient.Service/Services/Torrents.cs
@@ -22,6 +22,7 @@ namespace RdtClient.Service.Services
Task UpdateCategory(String hash, String category);
Task UploadMagnet(String magnetLink, String category, Boolean autoDownload, Boolean autoUnpack, Boolean autoDelete);
Task UploadFile(Byte[] bytes, String category, Boolean autoDownload, Boolean autoUnpack, Boolean autoDelete);
+ Task> GetAvailableFiles(String hash);
Task SelectFiles(String torrentId, IList fileIds);
Task Delete(Guid torrentId, Boolean deleteData, Boolean deleteRdTorrent, Boolean deleteLocalFiles);
Task Unrestrict(Guid torrentId);
@@ -152,6 +153,17 @@ namespace RdtClient.Service.Services
await Add(rdTorrent.Id, torrent.InfoHash.ToHex(), category, autoDownload, autoUnpack, autoDelete);
}
+ public async Task> GetAvailableFiles(String hash)
+ {
+ var result = await GetRdNetClient().GetAvailableFiles(hash);
+
+ var files = result.SelectMany(m => m.Value).SelectMany(m => m.Value).SelectMany(m => m.Values);
+
+ var groups = files.GroupBy(m => m.Filename);
+
+ return groups.Select(m => m.Key).ToList();
+ }
+
public async Task SelectFiles(String torrentId, IList fileIds)
{
await GetRdNetClient().SelectTorrentFilesAsync(torrentId, fileIds.ToArray());
@@ -246,11 +258,6 @@ namespace RdtClient.Service.Services
public async Task GetProfile()
{
- if (_rdtNetClient == null)
- {
- return new Profile();
- }
-
var user = await GetRdNetClient().GetUserAsync();
var profile = new Profile
diff --git a/server/RdtClient.Web/Program.cs b/server/RdtClient.Web/Program.cs
index a0585a2..284b9f4 100644
--- a/server/RdtClient.Web/Program.cs
+++ b/server/RdtClient.Web/Program.cs
@@ -72,6 +72,7 @@ namespace RdtClient.Web
.Enrich.WithExceptionDetails()
.WriteTo.File(appSettings.Logging.File.Path, logLevel, rollOnFileSizeLimit: true, fileSizeLimitBytes: appSettings.Logging.File.FileSizeLimitBytes, retainedFileCountLimit: appSettings.Logging.File.MaxRollingFiles)
.WriteTo.Console()
+ .MinimumLevel.Override("Microsoft.EntityFrameworkCore.Database.Command", LogEventLevel.Warning)
.MinimumLevel.Information()
.CreateLogger();