Created
April 11, 2024 02:21
-
-
Save aminomancer/9f3bab9497e6c6bdbbc7b52d9a8e740c to your computer and use it in GitHub Desktop.
fetchLangpacksFromFTP
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git a/toolkit/mozapps/extensions/internal/AddonRepository.sys.mjs b/toolkit/mozapps/extensions/internal/AddonRepository.sys.mjs | |
index 8d4d178924eba..cceed36adf210 100644 | |
--- a/toolkit/mozapps/extensions/internal/AddonRepository.sys.mjs | |
+++ b/toolkit/mozapps/extensions/internal/AddonRepository.sys.mjs | |
@@ -3,6 +3,7 @@ | |
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */ | |
import { XPCOMUtils } from "resource://gre/modules/XPCOMUtils.sys.mjs"; | |
+import { AppConstants } from "resource://gre/modules/AppConstants.sys.mjs"; | |
const lazy = {}; | |
@@ -816,6 +817,15 @@ export var AddonRepository = { | |
}, | |
async getAvailableLangpacks() { | |
+ let appVersion = Services.appinfo.version; | |
+ // If a local development build, try to fetch from FTP instead of AMO. | |
+ if (appVersion.endsWith("a1") && !AppConstants.MOZILLA_OFFICIAL) { | |
+ let ftpResult = await this._getAvailableLangpacksFromFTP(); | |
+ if (ftpResult.length) { | |
+ return ftpResult; | |
+ } | |
+ } | |
+ | |
// This should be the API endpoint documented at: | |
// http://addons-server.readthedocs.io/en/latest/topics/api/addons.html#language-tools | |
let url = this._formatURLPref(PREF_GET_LANGPACKS); | |
@@ -852,6 +862,40 @@ export var AddonRepository = { | |
return result; | |
}, | |
+ | |
+ async _getAvailableLangpacksFromFTP() { | |
+ let result = []; | |
+ let dirURL = Services.prefs.getCharPref( | |
+ "extensions.getAddons.langpacks.nightly.url", | |
+ "" | |
+ ); | |
+ if (!dirURL) { | |
+ return result; | |
+ } | |
+ try { | |
+ let response = await fetch(dirURL, { credentials: "omit" }); | |
+ // FTP returns an HTML directory listing, so we need to parse it. | |
+ let text = await response.text(); | |
+ let parser = new DOMParser(); | |
+ let doc = parser.parseFromString(text, "text/html"); | |
+ let links = [...doc.querySelectorAll("a")]; | |
+ let regex = /^firefox-(\d+\.\d+(?:a\d)?)\.(\w+(?:-\w+)?)\.langpack\.xpi$/; | |
+ for (let link of links) { | |
+ let match = link.textContent.match(regex); | |
+ if (!match) { | |
+ continue; | |
+ } | |
+ let [, version, target_locale] = match; | |
+ if (Services.vc.compare(version, Services.appinfo.version) < 1) { | |
+ let url = new URL(link.href, dirURL).href; | |
+ result.push({ target_locale, url }); | |
+ } | |
+ } | |
+ } catch (e) { | |
+ logger.debug("Error fetching langpacks from FTP: " + e); | |
+ } | |
+ return result; | |
+ }, | |
}; | |
var AddonDatabase = { |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment