From ed10c630ee9df3706284b16f57a1cc42858ffaf2 Mon Sep 17 00:00:00 2001 From: Roger Far Date: Fri, 5 Feb 2021 20:54:37 -0700 Subject: [PATCH] Add option to only download the files that are available on RD. --- .../navbar/settings/settings.component.html | 13 +++++++++++ .../app/navbar/settings/settings.component.ts | 6 +++++ server/RdtClient.Data/Data/DataContext.cs | 6 +++++ server/RdtClient.Data/RdtClient.Data.csproj | 2 +- .../RdtClient.Service.csproj | 4 ++-- .../Services/TorrentRunner.cs | 23 ++++++++++++------- server/RdtClient.Service/Services/Torrents.cs | 17 ++++++++++---- server/RdtClient.Web/Program.cs | 1 + 8 files changed, 56 insertions(+), 16 deletions(-) diff --git a/client/src/app/navbar/settings/settings.component.html b/client/src/app/navbar/settings/settings.component.html index f6c6d5c..29bae0f 100644 --- a/client/src/app/navbar/settings/settings.component.html +++ b/client/src/app/navbar/settings/settings.component.html @@ -112,6 +112,19 @@ +
+
+ +
+ When selected, it will only download files in the torrent that have been download by Real Debrid. You can + use this in combination with the Min File size setting above. +
+
+
+
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();