Skip to content

Instantly share code, notes, and snippets.

@aminomancer
Created April 11, 2024 02:21
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save aminomancer/9f3bab9497e6c6bdbbc7b52d9a8e740c to your computer and use it in GitHub Desktop.
Save aminomancer/9f3bab9497e6c6bdbbc7b52d9a8e740c to your computer and use it in GitHub Desktop.
fetchLangpacksFromFTP
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