diff --git a/Wabbajack.Lib/Downloaders/DownloadDispatcher.cs b/Wabbajack.Lib/Downloaders/DownloadDispatcher.cs
index e1ae2b3f..c91c712b 100644
--- a/Wabbajack.Lib/Downloaders/DownloadDispatcher.cs
+++ b/Wabbajack.Lib/Downloaders/DownloadDispatcher.cs
@@ -37,5 +37,16 @@ namespace Wabbajack.Lib.Downloaders
return Downloaders.Select(d => d.GetDownloaderState(ini)).FirstOrDefault(result => result != null);
}
+ ///
+ /// Reduced version of Resolve archive that requires less information, but only works
+ /// with a single URL string
+ ///
+ ///
+ ///
+ public static AbstractDownloadState ResolveArchive(string url)
+ {
+ return Downloaders.OfType().Select(d => d.GetDownloaderState(url)).FirstOrDefault(result => result != null);
+ }
+
}
}
diff --git a/Wabbajack.Lib/Downloaders/DropboxDownloader.cs b/Wabbajack.Lib/Downloaders/DropboxDownloader.cs
index efe2b822..32952e7e 100644
--- a/Wabbajack.Lib/Downloaders/DropboxDownloader.cs
+++ b/Wabbajack.Lib/Downloaders/DropboxDownloader.cs
@@ -7,13 +7,18 @@ using System.Web;
namespace Wabbajack.Lib.Downloaders
{
- public class DropboxDownloader : IDownloader
+ public class DropboxDownloader : IDownloader, IUrlDownloader
{
public AbstractDownloadState GetDownloaderState(dynamic archive_ini)
{
var urlstring = archive_ini?.General?.directURL;
- if (urlstring == null) return null;
- var uri = new UriBuilder((string)urlstring);
+ return GetDownloaderState(urlstring);
+ }
+
+ public AbstractDownloadState GetDownloaderState(string url)
+ {
+ if (url == null) return null;
+ var uri = new UriBuilder(url);
if (uri.Host != "www.dropbox.com") return null;
var query = HttpUtility.ParseQueryString(uri.Query);
diff --git a/Wabbajack.Lib/Downloaders/GoogleDriveDownloader.cs b/Wabbajack.Lib/Downloaders/GoogleDriveDownloader.cs
index 2b7df253..294d8017 100644
--- a/Wabbajack.Lib/Downloaders/GoogleDriveDownloader.cs
+++ b/Wabbajack.Lib/Downloaders/GoogleDriveDownloader.cs
@@ -11,14 +11,19 @@ using Wabbajack.Lib.Validation;
namespace Wabbajack.Lib.Downloaders
{
- public class GoogleDriveDownloader : IDownloader
+ public class GoogleDriveDownloader : IDownloader, IUrlDownloader
{
public AbstractDownloadState GetDownloaderState(dynamic archive_ini)
{
var url = archive_ini?.General?.directURL;
- var regex = new Regex("((?<=id=)[a-zA-Z0-9_-]*)|(?<=\\/file\\/d\\/)[a-zA-Z0-9_-]*");
+ 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
{
diff --git a/Wabbajack.Lib/Downloaders/HTTPDownloader.cs b/Wabbajack.Lib/Downloaders/HTTPDownloader.cs
index 40bdc6f4..a2cd836f 100644
--- a/Wabbajack.Lib/Downloaders/HTTPDownloader.cs
+++ b/Wabbajack.Lib/Downloaders/HTTPDownloader.cs
@@ -9,13 +9,23 @@ using File = Alphaleonis.Win32.Filesystem.File;
namespace Wabbajack.Lib.Downloaders
{
- public class HTTPDownloader : IDownloader
+ public class HTTPDownloader : IDownloader, IUrlDownloader
{
public AbstractDownloadState GetDownloaderState(dynamic archive_ini)
{
var url = archive_ini?.General?.directURL;
+ return GetDownloaderState(url, archive_ini);
+ }
+
+ public AbstractDownloadState GetDownloaderState(string uri)
+ {
+ return GetDownloaderState(uri, null);
+ }
+
+ public AbstractDownloadState GetDownloaderState(string url, dynamic archive_ini)
+ {
if (url != null)
{
var tmp = new State
diff --git a/Wabbajack.Lib/Downloaders/IDownloader.cs b/Wabbajack.Lib/Downloaders/IDownloader.cs
index ada53760..6bca05fd 100644
--- a/Wabbajack.Lib/Downloaders/IDownloader.cs
+++ b/Wabbajack.Lib/Downloaders/IDownloader.cs
@@ -16,4 +16,5 @@ namespace Wabbajack.Lib.Downloaders
///
void Prepare();
}
+
}
diff --git a/Wabbajack.Lib/Downloaders/IUrlDownloader.cs b/Wabbajack.Lib/Downloaders/IUrlDownloader.cs
new file mode 100644
index 00000000..46d60124
--- /dev/null
+++ b/Wabbajack.Lib/Downloaders/IUrlDownloader.cs
@@ -0,0 +1,13 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Wabbajack.Lib.Downloaders
+{
+ public interface IUrlDownloader : IDownloader
+ {
+ AbstractDownloadState GetDownloaderState(string url);
+ }
+}
diff --git a/Wabbajack.Lib/Downloaders/MEGADownloader.cs b/Wabbajack.Lib/Downloaders/MEGADownloader.cs
index 7bb77c64..617304ae 100644
--- a/Wabbajack.Lib/Downloaders/MEGADownloader.cs
+++ b/Wabbajack.Lib/Downloaders/MEGADownloader.cs
@@ -13,14 +13,19 @@ using Wabbajack.Lib.Validation;
namespace Wabbajack.Lib.Downloaders
{
- public class MegaDownloader : IDownloader
+ public class MegaDownloader : IDownloader, IUrlDownloader
{
public AbstractDownloadState GetDownloaderState(dynamic archive_ini)
{
var url = archive_ini?.General?.directURL;
+ return GetDownloaderState(url);
+ }
+
+ public AbstractDownloadState GetDownloaderState(string url)
+ {
if (url != null && url.StartsWith(Consts.MegaPrefix))
- return new State {Url = url};
+ return new State { Url = url };
return null;
}
diff --git a/Wabbajack.Lib/Downloaders/ModDBDownloader.cs b/Wabbajack.Lib/Downloaders/ModDBDownloader.cs
index 6433309b..fa7d0697 100644
--- a/Wabbajack.Lib/Downloaders/ModDBDownloader.cs
+++ b/Wabbajack.Lib/Downloaders/ModDBDownloader.cs
@@ -10,12 +10,16 @@ using Wabbajack.Lib.Validation;
namespace Wabbajack.Lib.Downloaders
{
- public class ModDBDownloader : IDownloader
+ public class ModDBDownloader : IDownloader, IUrlDownloader
{
public AbstractDownloadState GetDownloaderState(dynamic archive_ini)
{
var url = archive_ini?.General?.directURL;
+ return GetDownloaderState(url);
+ }
+ public AbstractDownloadState GetDownloaderState(string url)
+ {
if (url != null && url.StartsWith("https://www.moddb.com/downloads/start"))
{
return new State
diff --git a/Wabbajack.Lib/Wabbajack.Lib.csproj b/Wabbajack.Lib/Wabbajack.Lib.csproj
index 9c311b55..1863233f 100644
--- a/Wabbajack.Lib/Wabbajack.Lib.csproj
+++ b/Wabbajack.Lib/Wabbajack.Lib.csproj
@@ -115,6 +115,7 @@
+
diff --git a/Wabbajack.Test/DownloaderTests.cs b/Wabbajack.Test/DownloaderTests.cs
index 7084491e..3b864b4d 100644
--- a/Wabbajack.Test/DownloaderTests.cs
+++ b/Wabbajack.Test/DownloaderTests.cs
@@ -31,6 +31,13 @@ namespace Wabbajack.Test
Assert.IsNotNull(state);
+ var url_state = DownloadDispatcher.ResolveArchive(
+ "https://mega.nz/#!CsMSFaaJ!-uziC4mbJPRy2e4pPk8Gjb3oDT_38Be9fzZ6Ld4NL-k");
+
+ Assert.AreEqual("https://mega.nz/#!CsMSFaaJ!-uziC4mbJPRy2e4pPk8Gjb3oDT_38Be9fzZ6Ld4NL-k",
+ ((MegaDownloader.State)url_state).Url);
+
+
var converted = state.ViaJSON();
Assert.IsTrue(converted.Verify());
var filename = Guid.NewGuid().ToString();
@@ -55,6 +62,12 @@ namespace Wabbajack.Test
Assert.IsNotNull(state);
+ var url_state = DownloadDispatcher.ResolveArchive(
+ "https://www.dropbox.com/s/5hov3m2pboppoc2/WABBAJACK_TEST_FILE.txt?dl=0");
+
+ Assert.AreEqual("https://www.dropbox.com/s/5hov3m2pboppoc2/WABBAJACK_TEST_FILE.txt?dl=1",
+ ((HTTPDownloader.State)url_state).Url);
+
var converted = state.ViaJSON();
Assert.IsTrue(converted.Verify());
var filename = Guid.NewGuid().ToString();
@@ -79,6 +92,12 @@ namespace Wabbajack.Test
Assert.IsNotNull(state);
+ var url_state = DownloadDispatcher.ResolveArchive(
+ "https://drive.google.com/file/d/1grLRTrpHxlg7VPxATTFNfq2OkU_Plvh_/view?usp=sharing");
+
+ Assert.AreEqual("1grLRTrpHxlg7VPxATTFNfq2OkU_Plvh_",
+ ((GoogleDriveDownloader.State)url_state).Id);
+
var converted = state.ViaJSON();
Assert.IsTrue(converted.Verify());
var filename = Guid.NewGuid().ToString();
@@ -103,6 +122,12 @@ namespace Wabbajack.Test
Assert.IsNotNull(state);
+ var url_state = DownloadDispatcher.ResolveArchive(
+ "https://raw.githubusercontent.com/wabbajack-tools/opt-out-lists/master/ServerWhitelist.yml");
+
+ Assert.AreEqual("https://raw.githubusercontent.com/wabbajack-tools/opt-out-lists/master/ServerWhitelist.yml",
+ ((HTTPDownloader.State)url_state).Url);
+
var converted = state.ViaJSON();
Assert.IsTrue(converted.Verify());
var filename = Guid.NewGuid().ToString();
@@ -127,6 +152,7 @@ namespace Wabbajack.Test
Assert.IsNotNull(state);
+
var converted = state.ViaJSON();
Assert.IsTrue(converted.Verify());
// Exercise the cache code
@@ -150,6 +176,12 @@ namespace Wabbajack.Test
Assert.IsNotNull(state);
+ var url_state = DownloadDispatcher.ResolveArchive(
+ "https://www.moddb.com/downloads/start/124908?referer=https%3A%2F%2Fwww.moddb.com%2Fmods%2Fautopause");
+
+ Assert.AreEqual("https://www.moddb.com/downloads/start/124908?referer=https%3A%2F%2Fwww.moddb.com%2Fmods%2Fautopause",
+ ((ModDBDownloader.State)url_state).Url);
+
var converted = state.ViaJSON();
Assert.IsTrue(converted.Verify());
var filename = Guid.NewGuid().ToString();