mirror of
https://github.com/wabbajack-tools/wabbajack.git
synced 2024-08-30 18:42:17 +00:00
Add support for downloading via Yandex
This commit is contained in:
parent
8c70771f0e
commit
c443016638
@ -40,6 +40,7 @@ namespace Wabbajack.Lib.Downloaders
|
||||
typeof(TESAllianceDownloader.State),
|
||||
typeof(BethesdaNetDownloader.State),
|
||||
typeof(YouTubeDownloader.State),
|
||||
typeof(YandexDownloader.State),
|
||||
typeof(WabbajackCDNDownloader.State)
|
||||
};
|
||||
public static Dictionary<string, Type> NameToType { get; set; }
|
||||
|
@ -28,6 +28,7 @@ namespace Wabbajack.Lib.Downloaders
|
||||
new TESAllianceDownloader(),
|
||||
new YouTubeDownloader(),
|
||||
new WabbajackCDNDownloader(),
|
||||
new YandexDownloader(),
|
||||
new HTTPDownloader(),
|
||||
new ManualDownloader(),
|
||||
};
|
||||
|
85
Wabbajack.Lib/Downloaders/YandexDownloader.cs
Normal file
85
Wabbajack.Lib/Downloaders/YandexDownloader.cs
Normal file
@ -0,0 +1,85 @@
|
||||
using System;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using Wabbajack.Common;
|
||||
using Wabbajack.Common.Serialization.Json;
|
||||
using Wabbajack.Lib.Validation;
|
||||
|
||||
namespace Wabbajack.Lib.Downloaders
|
||||
{
|
||||
public class YandexDownloader : IUrlDownloader
|
||||
{
|
||||
public async Task<AbstractDownloadState?> GetDownloaderState(dynamic archiveINI, bool quickMode = false)
|
||||
{
|
||||
var uri = (Uri?)DownloaderUtils.GetDirectURL(archiveINI);
|
||||
if (uri == null) return null;
|
||||
|
||||
return uri.Host == "yadi.sk" ? new State(uri) : null;
|
||||
}
|
||||
|
||||
public async Task Prepare()
|
||||
{
|
||||
}
|
||||
|
||||
public AbstractDownloadState? GetDownloaderState(string url)
|
||||
{
|
||||
var uri = new Uri(url);
|
||||
if (uri.Host == "yadi.sk")
|
||||
{
|
||||
return new State(uri);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
[JsonName("YandexDownloader+State")]
|
||||
public class State : AbstractDownloadState
|
||||
{
|
||||
public Uri Url { get; set; }
|
||||
|
||||
public State(Uri url)
|
||||
{
|
||||
Url = url;
|
||||
}
|
||||
public override object[] PrimaryKey => new object[] {Url};
|
||||
public override bool IsWhitelisted(ServerWhitelist whitelist)
|
||||
{
|
||||
var url = Url.ToString();
|
||||
return whitelist.AllowedPrefixes.Any(p => url.StartsWith(p));
|
||||
}
|
||||
|
||||
public override async Task<bool> Download(Archive a, AbsolutePath destination)
|
||||
{
|
||||
using var driver = await WebAutomation.Driver.Create();
|
||||
var tcs = new TaskCompletionSource<Uri?>();
|
||||
driver.DownloadHandler = uri => tcs.SetResult(uri);
|
||||
await driver.NavigateTo(Url);
|
||||
await driver.EvalJavascript("document.getElementsByClassName(\"download-button\")[0].click();");
|
||||
var uri = await tcs.Task;
|
||||
return await new HTTPDownloader.State(uri!.ToString()).Download(destination);
|
||||
}
|
||||
|
||||
public override async Task<bool> Verify(Archive archive)
|
||||
{
|
||||
var client = new Common.Http.Client();
|
||||
var result = await client.GetAsync(Url, errorsAsExceptions: false);
|
||||
return result.IsSuccessStatusCode;
|
||||
}
|
||||
|
||||
public override IDownloader GetDownloader()
|
||||
{
|
||||
return DownloadDispatcher.GetInstance<YandexDownloader>();
|
||||
}
|
||||
|
||||
public override string? GetManifestURL(Archive a)
|
||||
{
|
||||
return Url.ToString();
|
||||
}
|
||||
|
||||
public override string[] GetMetaIni()
|
||||
{
|
||||
return new[] {"[General]", $"directURL={Url}"};
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -43,12 +43,21 @@ namespace Wabbajack.Lib.WebAutomation
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public Action<Uri?> DownloadHandler {
|
||||
set => _driver.DownloadHandler = value;
|
||||
}
|
||||
|
||||
public Task<string> GetAttr(string selector, string attr)
|
||||
{
|
||||
return _driver.EvaluateJavaScript($"document.querySelector(\"{selector}\").{attr}");
|
||||
}
|
||||
|
||||
public Task<string> EvalJavascript(string js)
|
||||
{
|
||||
return _driver.EvaluateJavaScript(js);
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
_browser.Dispose();
|
||||
|
@ -337,6 +337,30 @@ namespace Wabbajack.Test
|
||||
|
||||
Assert.Equal("Cheese for Everyone!", await filename.Path.ReadAllTextAsync());
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task YandexDownloader()
|
||||
{
|
||||
await DownloadDispatcher.GetInstance<YandexDownloader>().Prepare();
|
||||
var ini = @"[General]
|
||||
directURL=https://yadi.sk/d/jqwQT4ByYtC9Tw";
|
||||
|
||||
var state = (AbstractDownloadState)await DownloadDispatcher.ResolveArchive(ini.LoadIniString());
|
||||
|
||||
Assert.NotNull(state);
|
||||
|
||||
var converted = RoundTripState(state);
|
||||
Assert.True(await converted.Verify(new Archive(state: null!) { Size = 20}));
|
||||
await using var filename = new TempFile();
|
||||
|
||||
Assert.True(converted.IsWhitelisted(new ServerWhitelist { AllowedPrefixes = new List<string>() {"https://yadi.sk"} }));
|
||||
|
||||
await converted.Download(new Archive(state: null!) { Name = "WABBAJACK_TEST_FILE.txt" }, filename.Path);
|
||||
|
||||
Assert.Equal(Hash.FromBase64("eSIyd+KOG3s="), await filename.Path.FileHashAsync());
|
||||
|
||||
Assert.Equal("Cheese for Everyone!", await filename.Path.ReadAllTextAsync());
|
||||
}
|
||||
|
||||
|
||||
[Fact]
|
||||
|
Loading…
Reference in New Issue
Block a user