Add trackers

This commit is contained in:
Kieran 2023-03-04 20:31:53 +00:00
parent ef3ebb867d
commit 0a827651a2
Signed by: Kieran
GPG Key ID: DE71CEB3925BE941
4 changed files with 28 additions and 6 deletions

View File

@ -54,7 +54,7 @@ public class DownloadController : Controller
{ {
var t = await voidFile.Metadata!.MakeTorrent( var t = await voidFile.Metadata!.MakeTorrent(
await _storage.Open(new(gid, Enumerable.Empty<RangeRequest>()), CancellationToken.None), await _storage.Open(new(gid, Enumerable.Empty<RangeRequest>()), CancellationToken.None),
_settings.SiteUrl); _settings.SiteUrl, _settings.TorrentTrackers);
Response.Headers.ContentDisposition = $"inline; filename=\"{id}\""; Response.Headers.ContentDisposition = $"inline; filename=\"{id}\"";
Response.ContentType = "application/x-bittorent"; Response.ContentType = "application/x-bittorent";

View File

@ -49,6 +49,7 @@ public static class Extensions
base58 = Path.GetFileNameWithoutExtension(base58); base58 = Path.GetFileNameWithoutExtension(base58);
var guidBytes = enc.DecodeData(base58); var guidBytes = enc.DecodeData(base58);
if (guidBytes.Length != 16) throw new VoidInvalidIdException(base58); if (guidBytes.Length != 16) throw new VoidInvalidIdException(base58);
return new Guid(guidBytes); return new Guid(guidBytes);
} }
@ -275,7 +276,7 @@ public static class Extensions
public static bool HasGoogle(this VoidSettings settings) public static bool HasGoogle(this VoidSettings settings)
=> settings.Google != null; => settings.Google != null;
public static async Task<Torrent> MakeTorrent(this FileMeta meta, Stream fileStream, Uri baseAddress) public static async Task<Torrent> MakeTorrent(this FileMeta meta, Stream fileStream, Uri baseAddress, List<string> trackers)
{ {
const int pieceSize = 262_144; const int pieceSize = 262_144;
const int pieceHashLen = 20; const int pieceHashLen = 20;
@ -313,6 +314,8 @@ public static class Extensions
IsPrivate = false, IsPrivate = false,
PieceSize = pieceSize, PieceSize = pieceSize,
Pieces = await BuildPieces(), Pieces = await BuildPieces(),
// ReSharper disable once CoVariantArrayConversion
Trackers = trackers.Select(a => new[] {a}).ToArray(),
ExtraFields = new BDictionary ExtraFields = new BDictionary
{ {
{"url-list", webSeed.ToString()} {"url-list", webSeed.ToString()}

View File

@ -105,11 +105,23 @@ namespace VoidCat.Model
/// Discord application settings /// Discord application settings
/// </summary> /// </summary>
public OAuthDetails? Discord { get; init; } public OAuthDetails? Discord { get; init; }
/// <summary> /// <summary>
/// Google application settings /// Google application settings
/// </summary> /// </summary>
public OAuthDetails? Google { get; init; } public OAuthDetails? Google { get; init; }
/// <summary>
/// A list of trackers to attach to torrent files
/// </summary>
public List<string> TorrentTrackers { get; init; } = new()
{
"wss://tracker.btorrent.xyz",
"wss://tracker.openwebtorrent.com",
"udp://tracker.opentrackr.org:1337/announce",
"udp://tracker.openbittorrent.com:6969/announce",
"http://tracker.openbittorrent.com:80/announce"
};
} }
public sealed class TorSettings public sealed class TorSettings
@ -190,4 +202,4 @@ namespace VoidCat.Model
public string? ClientId { get; init; } public string? ClientId { get; init; }
public string? ClientSecret { get; init; } public string? ClientSecret { get; init; }
} }
} }

View File

@ -86,8 +86,15 @@ public class LocalDiskFileStore : StreamFileStore, IFileStore
if (payload.Segment == payload.TotalSegments) if (payload.Segment == payload.TotalSegments)
{ {
var t = await vf.Metadata!.MakeTorrent(new FileStream(finalPath, FileMode.Open), _settings.SiteUrl); var t = await vf.Metadata!.MakeTorrent(
vf.Metadata!.MagnetLink = t.GetMagnetLink(); new FileStream(finalPath, FileMode.Open),
_settings.SiteUrl,
_settings.TorrentTrackers);
var ub = new UriBuilder(_settings.SiteUrl);
ub.Path = $"/d/{vf.Id.ToBase58()}.torrent";
vf.Metadata!.MagnetLink = $"{t.GetMagnetLink()}&xs={Uri.EscapeDataString(ub.ToString())}";
} }
return vf; return vf;