Use richer GetDownloadInfos instead of GetDownloadLinks
*Most* debrid providers know the filename as soon as they know the restricted links. By allowing them to tell the program this at an earlier stage, we don't need the `GetFileName` call for most debrid providers
This commit is contained in:
parent
a366328472
commit
e776236270
7 changed files with 46 additions and 18 deletions
|
|
@ -1,4 +1,5 @@
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
using RdtClient.Data.Models.Data;
|
||||||
using Download = RdtClient.Data.Models.Data.Download;
|
using Download = RdtClient.Data.Models.Data.Download;
|
||||||
|
|
||||||
namespace RdtClient.Data.Data;
|
namespace RdtClient.Data.Data;
|
||||||
|
|
@ -29,13 +30,14 @@ public class DownloadData(DataContext dataContext)
|
||||||
.FirstOrDefaultAsync(m => m.TorrentId == torrentId && m.Path == path);
|
.FirstOrDefaultAsync(m => m.TorrentId == torrentId && m.Path == path);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<Download> Add(Guid torrentId, String path)
|
public async Task<Download> Add(Guid torrentId, DownloadInfo downloadInfo)
|
||||||
{
|
{
|
||||||
var download = new Download
|
var download = new Download
|
||||||
{
|
{
|
||||||
DownloadId = Guid.NewGuid(),
|
DownloadId = Guid.NewGuid(),
|
||||||
TorrentId = torrentId,
|
TorrentId = torrentId,
|
||||||
Path = path,
|
FileName = downloadInfo.FileName,
|
||||||
|
Path = downloadInfo.RestrictedLink,
|
||||||
Added = DateTimeOffset.UtcNow,
|
Added = DateTimeOffset.UtcNow,
|
||||||
DownloadQueued = DateTimeOffset.UtcNow,
|
DownloadQueued = DateTimeOffset.UtcNow,
|
||||||
RetryCount = 0
|
RetryCount = 0
|
||||||
|
|
|
||||||
|
|
@ -26,7 +26,7 @@ public class Download
|
||||||
public DateTimeOffset? Completed { get; set; }
|
public DateTimeOffset? Completed { get; set; }
|
||||||
|
|
||||||
public Int32 RetryCount { get; set; }
|
public Int32 RetryCount { get; set; }
|
||||||
|
|
||||||
public String? Error { get; set; }
|
public String? Error { get; set; }
|
||||||
|
|
||||||
public String? RemoteId { get; set; }
|
public String? RemoteId { get; set; }
|
||||||
|
|
@ -41,4 +41,20 @@ public class Download
|
||||||
|
|
||||||
[NotMapped]
|
[NotMapped]
|
||||||
public Int64 Speed { get; set; }
|
public Int64 Speed { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Used to create <see cref="Download"/>s
|
||||||
|
/// </summary>
|
||||||
|
public class DownloadInfo
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// The name of the file. Should not include directory.
|
||||||
|
/// If the filename is not known, set tn null and `GetFileName` will be called with the unrestricted link.
|
||||||
|
/// </summary>
|
||||||
|
public required String? FileName;
|
||||||
|
/// <summary>
|
||||||
|
/// The restricted link to download this download. If the debrid serice in question does not have restricted links, use either a fake or the unrestricted link
|
||||||
|
/// </summary>
|
||||||
|
public required String RestrictedLink;
|
||||||
}
|
}
|
||||||
|
|
@ -1,4 +1,5 @@
|
||||||
using RdtClient.Data.Data;
|
using RdtClient.Data.Data;
|
||||||
|
using RdtClient.Data.Models.Data;
|
||||||
using Download = RdtClient.Data.Models.Data.Download;
|
using Download = RdtClient.Data.Models.Data.Download;
|
||||||
|
|
||||||
namespace RdtClient.Service.Services;
|
namespace RdtClient.Service.Services;
|
||||||
|
|
@ -20,9 +21,9 @@ public class Downloads(DownloadData downloadData) : IDownloads
|
||||||
return await downloadData.Get(torrentId, path);
|
return await downloadData.Get(torrentId, path);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<Download> Add(Guid torrentId, String path)
|
public async Task<Download> Add(Guid torrentId, DownloadInfo downloadInfo)
|
||||||
{
|
{
|
||||||
return await downloadData.Add(torrentId, path);
|
return await downloadData.Add(torrentId, downloadInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task UpdateUnrestrictedLink(Guid downloadId, String unrestrictedLink)
|
public async Task UpdateUnrestrictedLink(Guid downloadId, String unrestrictedLink)
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,7 @@ public interface IDownloads
|
||||||
Task<List<Download>> GetForTorrent(Guid torrentId);
|
Task<List<Download>> GetForTorrent(Guid torrentId);
|
||||||
Task<Download?> GetById(Guid downloadId);
|
Task<Download?> GetById(Guid downloadId);
|
||||||
Task<Download?> Get(Guid torrentId, String path);
|
Task<Download?> Get(Guid torrentId, String path);
|
||||||
Task<Download> Add(Guid torrentId, String path);
|
Task<Download> Add(Guid torrentId, DownloadInfo downloadInfo);
|
||||||
Task UpdateUnrestrictedLink(Guid downloadId, String unrestrictedLink);
|
Task UpdateUnrestrictedLink(Guid downloadId, String unrestrictedLink);
|
||||||
Task UpdateFileName(Guid downloadId, String fileName);
|
Task UpdateFileName(Guid downloadId, String fileName);
|
||||||
Task UpdateDownloadStarted(Guid downloadId, DateTimeOffset? dateTime);
|
Task UpdateDownloadStarted(Guid downloadId, DateTimeOffset? dateTime);
|
||||||
|
|
|
||||||
|
|
@ -14,6 +14,12 @@ public interface ITorrentClient
|
||||||
Task Delete(String torrentId);
|
Task Delete(String torrentId);
|
||||||
Task<String> Unrestrict(String link);
|
Task<String> Unrestrict(String link);
|
||||||
Task<Torrent> UpdateData(Torrent torrent, TorrentClientTorrent? torrentClientTorrent);
|
Task<Torrent> UpdateData(Torrent torrent, TorrentClientTorrent? torrentClientTorrent);
|
||||||
Task<IList<String>?> GetDownloadLinks(Torrent torrent);
|
Task<IList<DownloadInfo>?> GetDownloadInfos(Torrent torrent);
|
||||||
Task<String> GetFileName(String downloadUrl);
|
/// <summary>
|
||||||
|
/// To be called only when <see cref="Data.Models.Data.Download" />.<see cref="Data.Models.Data.Download.FileName" /> is not set by
|
||||||
|
/// <see cref="GetDownloadInfos" />
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="download">The download to get the filename of</param>
|
||||||
|
/// <returns>The filename of the download</returns>
|
||||||
|
Task<String> GetFileName(Download download);
|
||||||
}
|
}
|
||||||
|
|
@ -363,8 +363,11 @@ public class TorrentRunner(ILogger<TorrentRunner> logger, Torrents torrents, Dow
|
||||||
var downloadLink = await torrents.UnrestrictLink(download.DownloadId);
|
var downloadLink = await torrents.UnrestrictLink(download.DownloadId);
|
||||||
download.Link = downloadLink;
|
download.Link = downloadLink;
|
||||||
|
|
||||||
var fileName = await torrents.RetrieveFileName(download.DownloadId);
|
if (download.FileName == null)
|
||||||
download.FileName = fileName;
|
{
|
||||||
|
var fileName = await torrents.RetrieveFileName(download.DownloadId);
|
||||||
|
download.FileName = fileName;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
|
|
|
||||||
|
|
@ -235,14 +235,14 @@ public class Torrents(
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var downloadLinks = await TorrentClient.GetDownloadLinks(torrent);
|
var downloadInfos = await TorrentClient.GetDownloadInfos(torrent);
|
||||||
|
|
||||||
if (downloadLinks == null)
|
if (downloadInfos == null)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (downloadLinks.Count == 0)
|
if (downloadInfos.Count == 0)
|
||||||
{
|
{
|
||||||
logger.LogInformation("All files excluded by filters (IncludeRegex: {includeRegex}, ExcludeRegex: {excludeRegex}, DownloadMinSize: {downloadMinSize} {torrentInfo}",
|
logger.LogInformation("All files excluded by filters (IncludeRegex: {includeRegex}, ExcludeRegex: {excludeRegex}, DownloadMinSize: {downloadMinSize} {torrentInfo}",
|
||||||
torrent.IncludeRegex,
|
torrent.IncludeRegex,
|
||||||
|
|
@ -256,14 +256,14 @@ public class Torrents(
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach (var downloadLink in downloadLinks)
|
foreach (var downloadInfo in downloadInfos)
|
||||||
{
|
{
|
||||||
// Make sure downloads don't get added multiple times
|
// Make sure downloads don't get added multiple times
|
||||||
var downloadExists = await downloads.Get(torrent.TorrentId, downloadLink);
|
var downloadExists = await downloads.Get(torrent.TorrentId, downloadInfo.RestrictedLink);
|
||||||
|
|
||||||
if (downloadExists == null && !String.IsNullOrWhiteSpace(downloadLink))
|
if (downloadExists == null && !String.IsNullOrWhiteSpace(downloadInfo.RestrictedLink))
|
||||||
{
|
{
|
||||||
await downloads.Add(torrent.TorrentId, downloadLink);
|
await downloads.Add(torrent.TorrentId, downloadInfo);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -396,7 +396,7 @@ public class Torrents(
|
||||||
|
|
||||||
Log($"Retrieving filename for", download, download.Torrent);
|
Log($"Retrieving filename for", download, download.Torrent);
|
||||||
|
|
||||||
var fileName = await TorrentClient.GetFileName(download.Link!);
|
var fileName = await TorrentClient.GetFileName(download!);
|
||||||
|
|
||||||
await downloads.UpdateFileName(downloadId, fileName);
|
await downloads.UpdateFileName(downloadId, fileName);
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue