wabbajack/Wabbajack.Lib/Downloaders/GoogleDriveDownloader.cs

85 lines
2.9 KiB
C#
Raw Normal View History

using System.Net.Http;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using Wabbajack.Common;
2020-01-07 13:50:11 +00:00
using Wabbajack.Lib.Exceptions;
using Wabbajack.Lib.Validation;
namespace Wabbajack.Lib.Downloaders
{
public class GoogleDriveDownloader : IDownloader, IUrlDownloader
{
2019-12-07 03:50:50 +00:00
public async Task<AbstractDownloadState> GetDownloaderState(dynamic archiveINI)
{
2019-11-21 15:51:57 +00:00
var url = archiveINI?.General?.directURL;
return GetDownloaderState(url);
}
public AbstractDownloadState GetDownloaderState(string url)
{
if (url != null && url.StartsWith("https://drive.google.com"))
{
var regex = new Regex("((?<=id=)[a-zA-Z0-9_-]*)|(?<=\\/file\\/d\\/)[a-zA-Z0-9_-]*");
var match = regex.Match(url);
return new State
{
Id = match.ToString()
};
}
return null;
}
2019-12-07 02:45:13 +00:00
public async Task Prepare()
{
}
public class State : AbstractDownloadState
{
public string Id { get; set; }
public override object[] PrimaryKey { get => new object[] {Id}; }
public override bool IsWhitelisted(ServerWhitelist whitelist)
{
return whitelist.GoogleIDs.Contains(Id);
}
public override async Task Download(Archive a, string destination)
{
2019-12-06 05:59:57 +00:00
var state = await ToHttpState();
await state.Download(a, destination);
}
2019-12-06 05:59:57 +00:00
private async Task<HTTPDownloader.State> ToHttpState()
{
2019-11-21 15:51:57 +00:00
var initialURL = $"https://drive.google.com/uc?id={Id}&export=download";
var client = new HttpClient();
var response = await client.GetAsync(initialURL);
if (!response.IsSuccessStatusCode)
throw new HttpException((int)response.StatusCode, response.ReasonPhrase);
var regex = new Regex("(?<=/uc\\?export=download&amp;confirm=).*(?=;id=)");
var confirm = regex.Match(await response.Content.ReadAsStringAsync());
var url = $"https://drive.google.com/uc?export=download&confirm={confirm}&id={Id}";
2019-11-21 15:51:57 +00:00
var httpState = new HTTPDownloader.State {Url = url, Client = client};
return httpState;
}
public override async Task<bool> Verify()
{
2019-12-06 05:59:57 +00:00
var state = await ToHttpState();
return await state.Verify();
}
public override IDownloader GetDownloader()
{
return DownloadDispatcher.GetInstance<GoogleDriveDownloader>();
}
public override string GetReportEntry(Archive a)
{
return $"* GoogleDrive - [{a.Name}](https://drive.google.com/uc?id={Id}&export=download)";
}
}
}
}