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();