From 00077fabbfaf237991e7d6296568dd5b86d0d865 Mon Sep 17 00:00:00 2001 From: John Donne Date: Sat, 4 Nov 2023 22:29:23 +0000 Subject: Translated using Weblate (French) Currently translated at 93.1% (27 of 29 strings) Translation: LibRedirect/extension Translate-URL: https://hosted.weblate.org/projects/libredirect/extension/fr/ --- src/_locales/fr/messages.json | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/_locales/fr/messages.json b/src/_locales/fr/messages.json index 6a5a5d05..7bda9165 100644 --- a/src/_locales/fr/messages.json +++ b/src/_locales/fr/messages.json @@ -99,5 +99,11 @@ }, "about": { "message": "À propos" + }, + "fetchPublicInstances": { + "message": "Rechercher des instances publiques" + }, + "disable": { + "message": "Désactiver" } } -- cgit 1.4.1 From b8766c413ea2c039a259f9881c8c566961b75d7f Mon Sep 17 00:00:00 2001 From: ManeraKai Date: Wed, 8 Nov 2023 19:55:49 +0300 Subject: Added Twineo https://codeberg.org/LibRedirect/browser_extension/issues/103 --- .../19-ekim-yet_8a72cdffcc924121a3a962b2a9794860.xlsx | Bin 19616 -> 0 bytes src/assets/javascripts/services.js | 2 ++ src/config.json | 7 +++++++ 3 files changed, 9 insertions(+) delete mode 100644 src/assets/images/19-ekim-yet_8a72cdffcc924121a3a962b2a9794860.xlsx diff --git a/src/assets/images/19-ekim-yet_8a72cdffcc924121a3a962b2a9794860.xlsx b/src/assets/images/19-ekim-yet_8a72cdffcc924121a3a962b2a9794860.xlsx deleted file mode 100644 index deb7381b..00000000 Binary files a/src/assets/images/19-ekim-yet_8a72cdffcc924121a3a962b2a9794860.xlsx and /dev/null differ diff --git a/src/assets/javascripts/services.js b/src/assets/javascripts/services.js index e56128c8..200645c1 100644 --- a/src/assets/javascripts/services.js +++ b/src/assets/javascripts/services.js @@ -532,6 +532,7 @@ function redirect(url, type, initiator, forceRedirection) { } return `${randomInstance}` } + case "twineo": case "safetwitch": { if (url.hostname.startsWith("clips.")) { return `${randomInstance}/clip${url.pathname}${url.search}` @@ -689,6 +690,7 @@ const defaultInstances = { 'indestructables': ['https://indestructables.private.coffee'], 'destructables': ['https://ds.vern.cc'], 'safetwitch': ['https://safetwitch.drgns.space'], + 'twineo': ['https://twineo.exozy.me'], 'proxigram': ['https://proxigram.privacyfrontends.repl.co'], 'tuboYoutube': ['https://tubo.migalmoreno.com'], 'tuboSoundcloud': ['https://tubo.migalmoreno.com'], diff --git a/src/config.json b/src/config.json index 0f799adc..4c535371 100644 --- a/src/config.json +++ b/src/config.json @@ -183,6 +183,13 @@ "instanceList": true, "url": "https://codeberg.org/dragongoose/safetwitch", "localhost": false + }, + "twineo": { + "name": "Twineo", + "embeddable": true, + "instanceList": true, + "url": "https://codeberg.org/CloudyyUw/twineo", + "localhost": false } }, "targets": [ -- cgit 1.4.1 From 62d10a2d0c6945e19f25eae9700e23c78a1a59f6 Mon Sep 17 00:00:00 2001 From: ManeraKai Date: Wed, 8 Nov 2023 23:34:19 +0300 Subject: Fixed AnonymousOverflow redirection bug https://codeberg.org/LibRedirect/browser_extension/issues/114 --- src/assets/javascripts/services.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/assets/javascripts/services.js b/src/assets/javascripts/services.js index 200645c1..1a1afa14 100644 --- a/src/assets/javascripts/services.js +++ b/src/assets/javascripts/services.js @@ -375,7 +375,7 @@ function redirect(url, type, initiator, forceRedirection) { } case "anonymousOverflow": { if (url.hostname == "stackoverflow.com") { - const threadID = /\/(\d+)\/?$/.exec(url.pathname) + const threadID = /^\/a\/(\d+)\/?/.exec(url.pathname) if (threadID) return `${randomInstance}/questions/${threadID[1]}${url.search}` return `${randomInstance}${url.pathname}${url.search}` } -- cgit 1.4.1 From b146ce07149c1920a273f85c23c8138632f89a8a Mon Sep 17 00:00:00 2001 From: Daniel Date: Sat, 11 Nov 2023 17:02:42 +0100 Subject: Add TekstoLibre, frontend for Tekstowo.pl --- src/assets/javascripts/services.js | 7 +++++++ src/assets/javascripts/utils.js | 2 ++ src/config.json | 20 ++++++++++++++++++++ 3 files changed, 29 insertions(+) diff --git a/src/assets/javascripts/services.js b/src/assets/javascripts/services.js index 1a1afa14..6da057fb 100644 --- a/src/assets/javascripts/services.js +++ b/src/assets/javascripts/services.js @@ -539,6 +539,9 @@ function redirect(url, type, initiator, forceRedirection) { } return `${randomInstance}${url.pathname}${url.search}` } + case "tekstoLibre": { + return `${randomInstance}/?${url.pathname.slice(1)}`; + } default: { return `${randomInstance}${url.pathname}${url.search}` } @@ -641,6 +644,9 @@ async function reverse(url) { } return } + case "tekstowo": { + return `${config.services[service].url}/${url.search.slice(1)}` + } default: return } @@ -694,6 +700,7 @@ const defaultInstances = { 'proxigram': ['https://proxigram.privacyfrontends.repl.co'], 'tuboYoutube': ['https://tubo.migalmoreno.com'], 'tuboSoundcloud': ['https://tubo.migalmoreno.com'], + 'tekstoLibre': ['https://davilarek.github.io/TekstoLibre'], } function initDefaults() { diff --git a/src/assets/javascripts/utils.js b/src/assets/javascripts/utils.js index e85b1115..6a420ee8 100644 --- a/src/assets/javascripts/utils.js +++ b/src/assets/javascripts/utils.js @@ -10,6 +10,8 @@ function camelCase(str) { function protocolHost(url) { if (url.username && url.password) return `${url.protocol}//${url.username}:${url.password}@${url.host}` + if (url.pathname == "/TekstoLibre/" && url.host.endsWith("github.io")) // workaround + return `${url.protocol}//${url.host}${url.pathname.slice(0, -1)}` return `${url.protocol}//${url.host}` } diff --git a/src/config.json b/src/config.json index 4c535371..2251cf2f 100644 --- a/src/config.json +++ b/src/config.json @@ -943,6 +943,26 @@ }, "imageType": "svg", "url": "https://www.wolframalpha.com" + }, + "tekstowo": { + "frontends": { + "tekstoLibre": { + "name": "TekstoLibre", + "instanceList": true, + "url": "https://github.com/Davilarek/TekstoLibre" + } + }, + "targets": [ + "^https?:\\/{2}(www\\.)?tekstowo\\.pl\\/" + ], + "name": "Tekstowo.pl", + "options": { + "enabled": false, + "unsupportedUrls": "bypass", + "frontend": "tekstoLibre" + }, + "imageType": "png", + "url": "https://www.tekstowo.pl" } } } \ No newline at end of file -- cgit 1.4.1 From 57c978b6483cb5d0655fe6b1d898be816c4f36df Mon Sep 17 00:00:00 2001 From: Daniel Date: Sat, 11 Nov 2023 18:12:36 +0100 Subject: Add jsdoc types for some functions For VSCode completion --- src/assets/javascripts/localise.js | 3 +++ src/assets/javascripts/services.js | 37 +++++++++++++++++++++++++++++++ src/assets/javascripts/utils.js | 45 ++++++++++++++++++++++++++++++++++++++ src/pages/options/index.js | 21 +++++++++++++++++- 4 files changed, 105 insertions(+), 1 deletion(-) diff --git a/src/assets/javascripts/localise.js b/src/assets/javascripts/localise.js index 34ccd66b..c0936873 100644 --- a/src/assets/javascripts/localise.js +++ b/src/assets/javascripts/localise.js @@ -1,6 +1,9 @@ window.browser = window.browser || window.chrome function localisePage() { + /** + * @param {string} tag + */ function getMessage(tag) { return tag.replace(/__MSG_(\w+)__/g, (_match, v1) => { return v1 ? browser.i18n.getMessage(v1) : null diff --git a/src/assets/javascripts/services.js b/src/assets/javascripts/services.js index 1a1afa14..7f00b7cf 100644 --- a/src/assets/javascripts/services.js +++ b/src/assets/javascripts/services.js @@ -30,6 +30,12 @@ function all(service, frontend, options, config) { return instances } +/** + * @param {string} service + * @param {URL} url + * @param {{}} config + * @param {string} frontend + */ function regexArray(service, url, config, frontend) { let targetList = config.services[service].targets if (frontend && 'excludeTargets' in config.services[service].frontends[frontend]) { @@ -44,11 +50,24 @@ function regexArray(service, url, config, frontend) { return false } +/** + * @param {URL} url + * @param {string} type + * @param {URL} initiator + * @param {boolean} forceRedirection + */ async function redirectAsync(url, type, initiator, forceRedirection) { await init() return redirect(url, type, initiator, forceRedirection) } +/** + * @param {URL} url + * @param {string} type + * @param {URL} initiator + * @param {boolean} forceRedirection + * @returns {string | undefined} + */ function redirect(url, type, initiator, forceRedirection) { if (type != "main_frame" && type != "sub_frame" && type != "image") return let randomInstance @@ -545,6 +564,10 @@ function redirect(url, type, initiator, forceRedirection) { } } +/** + * @param {URL} url + * @param {*} returnFrontend + */ function computeService(url, returnFrontend) { return new Promise(async resolve => { const config = await utils.getConfig() @@ -569,6 +592,10 @@ function computeService(url, returnFrontend) { }) } +/** + * @param {URL} url + * @param {string} customService + */ function switchInstance(url, customService) { return new Promise(async resolve => { let options = await utils.getOptions() @@ -599,6 +626,9 @@ function switchInstance(url, customService) { }) } +/** + * @param {URL} url + */ async function reverse(url) { let options = await utils.getOptions() let config = await utils.getConfig() @@ -774,6 +804,10 @@ function processUpdate() { }) } +/** + * @param {URL} url + * @param {boolean} test + */ async function copyRaw(url, test) { const newUrl = await reverse(url) if (newUrl) { @@ -794,6 +828,9 @@ async function copyRaw(url, test) { } } +/** + * @param {URL} url + */ function isException(url) { if (!options.exceptions) return false let exceptions = options.exceptions diff --git a/src/assets/javascripts/utils.js b/src/assets/javascripts/utils.js index e85b1115..f7b9fd73 100644 --- a/src/assets/javascripts/utils.js +++ b/src/assets/javascripts/utils.js @@ -1,18 +1,49 @@ window.browser = window.browser || window.chrome +/** + * @param {Array.} instances + * @returns {T} + */ function getRandomInstance(instances) { return instances[~~(instances.length * Math.random())] } +/** + * @param {string} str + */ function camelCase(str) { return str.charAt(0).toUpperCase() + str.slice(1) } +/** + * @param {URL} url + */ function protocolHost(url) { if (url.username && url.password) return `${url.protocol}//${url.username}:${url.password}@${url.host}` return `${url.protocol}//${url.host}` } +/** + * @typedef FrontendInfo + * @prop {boolean} instanceList + * @prop {string} name + * @prop {string} url + */ + +/** + * @typedef {Object} Service + * @prop {Object.} frontends + * @prop {Object} options + */ + +/** + * @typedef {Object} Config + * @prop {Object.} services + */ + +/** + * @returns {Promise} + */ function getConfig() { return new Promise(resolve => { fetch("/config.json") @@ -24,6 +55,14 @@ function getConfig() { }) } +/** + * @typedef {Object} Option + * @prop {string} frontend + */ + +/** + * @returns {Promise>} + */ function getOptions() { return new Promise(resolve => browser.storage.local.get("options", r => { @@ -106,6 +145,9 @@ function getList(options) { }) } +/** + * @param {string} href + */ function pingOnce(href) { return new Promise(async resolve => { let started @@ -130,6 +172,9 @@ function pingOnce(href) { }) } +/** + * @param {string} href + */ function ping(href) { return new Promise(async resolve => { let average = 0 diff --git a/src/pages/options/index.js b/src/pages/options/index.js index dd1a6ff8..fcc51298 100644 --- a/src/pages/options/index.js +++ b/src/pages/options/index.js @@ -17,6 +17,9 @@ for (const a of document.getElementById("links").getElementsByTagName("a")) { config = await utils.getConfig() options = await utils.getOptions() +/** + * @param {string} service + */ async function changeFrontendsSettings(service) { options = await utils.getOptions() const opacityDiv = document.getElementById(`${service}-opacity`) @@ -95,6 +98,9 @@ async function changeFrontendsSettings(service) { frontend_name_element.href = config.services[service].frontends[divs[service].frontend.value].url } +/** + * @param {string} path + */ async function loadPage(path) { options = await utils.getOptions() for (const section of document.getElementById("pages").getElementsByTagName("section")) section.style.display = "none" @@ -251,6 +257,13 @@ async function processCustomInstances(frontend, document) { }) } +/** + * @param {string} frontend + * @param {*} networks + * @param {*} document + * @param {*} redirects + * @param {*} blacklist + */ async function createList(frontend, networks, document, redirects, blacklist) { const pingCache = await utils.getPingCache() const options = await utils.getOptions() @@ -331,6 +344,9 @@ const r = window.location.href.match(/#(.*)/) if (r) loadPage(r[1]) else loadPage("general") +/** + * @param {string} frontend + */ async function ping(frontend) { const instanceElements = [ ...document.getElementById(frontend).getElementsByClassName("custom-checklist")[0].getElementsByTagName('x'), @@ -357,6 +373,9 @@ async function ping(frontend) { } } +/** + * @param {number} time + */ function processTime(time) { let text let color @@ -377,4 +396,4 @@ function processTime(time) { return { color, text } -} \ No newline at end of file +} -- cgit 1.4.1 From d9121aa5d8fc3df647ca5fe40cbd168b5a62dfdb Mon Sep 17 00:00:00 2001 From: Or <> Date: Sat, 18 Nov 2023 17:40:35 +0200 Subject: switchInstance returns next instance instead of random --- src/assets/javascripts/services.js | 4 ++-- src/assets/javascripts/utils.js | 18 ++++++++++++++++++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/src/assets/javascripts/services.js b/src/assets/javascripts/services.js index 7f00b7cf..6fa6767f 100644 --- a/src/assets/javascripts/services.js +++ b/src/assets/javascripts/services.js @@ -605,7 +605,7 @@ function switchInstance(url, customService) { if (customService) { const instancesList = options[options[customService].frontend] if (instancesList !== undefined) { - resolve(`${utils.getRandomInstance(instancesList)}${url.pathname}${url.search}`) + resolve(`${utils.getNextInstance(url.origin, instancesList)}${url.pathname}${url.search}`) } } else { for (const service in config.services) { @@ -618,7 +618,7 @@ function switchInstance(url, customService) { resolve() return } - resolve(`${utils.getRandomInstance(instancesList)}${url.pathname}${url.search}`) + resolve(`${utils.getNextInstance(url.origin, instancesList)}${url.pathname}${url.search}`) return } } diff --git a/src/assets/javascripts/utils.js b/src/assets/javascripts/utils.js index f7b9fd73..0cc5331b 100644 --- a/src/assets/javascripts/utils.js +++ b/src/assets/javascripts/utils.js @@ -8,6 +8,23 @@ function getRandomInstance(instances) { return instances[~~(instances.length * Math.random())] } +/** + * @param {string} currentInstanceUrl + * @param {Array.} instances + * @returns {T} + */ +function getNextInstance(currentInstanceUrl, instances) { + const currentInstanceIndex = instances.indexOf(currentInstanceUrl); + + if (currentInstanceIndex === -1){ + return getRandomInstance(instances); + } + + const nextInstanceIndex = (currentInstanceIndex + 1) % instances.length; + + return instances[nextInstanceIndex]; +} + /** * @param {string} str */ @@ -195,6 +212,7 @@ function ping(href) { export default { getRandomInstance, + getNextInstance, protocolHost, getList, getBlacklist, -- cgit 1.4.1 From 2bf39d2be19856e55b9d223e2b3ba847e056bfc8 Mon Sep 17 00:00:00 2001 From: ManeraKai Date: Sun, 19 Nov 2023 03:27:20 +0300 Subject: Added Tekstowo icon --- src/assets/images/tekstowo-icon.svg | 115 ++++++++++++++++++++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100644 src/assets/images/tekstowo-icon.svg diff --git a/src/assets/images/tekstowo-icon.svg b/src/assets/images/tekstowo-icon.svg new file mode 100644 index 00000000..90c3f4fd --- /dev/null +++ b/src/assets/images/tekstowo-icon.svg @@ -0,0 +1,115 @@ + + + + + + + + + + + + + + + + + + + + + + + + + -- cgit 1.4.1 From 3bb51d84e7e0ea144a8086b63e373720d6b761c9 Mon Sep 17 00:00:00 2001 From: ManeraKai Date: Sun, 19 Nov 2023 03:29:30 +0300 Subject: Updated Tekstowo icon --- src/assets/images/tekstowo-icon.svg | 12 ++++++------ src/config.json | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/assets/images/tekstowo-icon.svg b/src/assets/images/tekstowo-icon.svg index 90c3f4fd..c5bc024d 100644 --- a/src/assets/images/tekstowo-icon.svg +++ b/src/assets/images/tekstowo-icon.svg @@ -3,7 +3,7 @@ viewBox="0 0 100 100" version="1.1" id="svg12" - sodipodi:docname="icon.svg" + sodipodi:docname="tekstowo-icon.svg" width="100" height="100" inkscape:version="1.3 (0e150ed6c4, 2023-07-21)" @@ -24,7 +24,7 @@ inkscape:deskcolor="#d1d1d1" inkscape:zoom="3.3499322" inkscape:cx="35.821621" - inkscape:cy="41.045607" + inkscape:cy="41.34412" inkscape:window-width="1888" inkscape:window-height="1060" inkscape:window-x="32" @@ -68,10 +68,10 @@ id="stop8" /> + style="fill:#8fe132;fill-opacity:1;stroke-width:0.999999" /> + style="fill:#8fe132;fill-opacity:1;stroke-width:0.999999" /> Date: Sun, 19 Nov 2023 17:42:01 +0300 Subject: Fixed a bug in upgrading popupServices settings https://github.com/libredirect/browser_extension/issues/829 --- package.json | 6 +++--- src/assets/javascripts/services.js | 9 ++++++++- src/pages/options/widgets/general.js | 2 +- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 76eb63eb..139d4773 100644 --- a/package.json +++ b/package.json @@ -23,8 +23,8 @@ }, "homepage": "https://libredirect.github.io", "devDependencies": { - "web-ext": "^7.2.0", - "pug-cli": "^1.0.0-alpha6" + "pug-cli": "^1.0.0-alpha6", + "web-ext": "^7.2.0" }, "webExt": { "sourceDir": "./src/", @@ -35,4 +35,4 @@ "overwriteDest": true } } -} \ No newline at end of file +} diff --git a/src/assets/javascripts/services.js b/src/assets/javascripts/services.js index 8265a82e..dbbe7c9f 100644 --- a/src/assets/javascripts/services.js +++ b/src/assets/javascripts/services.js @@ -551,7 +551,7 @@ function redirect(url, type, initiator, forceRedirection) { } return `${randomInstance}` } - case "twineo": + case "twineo": case "safetwitch": { if (url.hostname.startsWith("clips.")) { return `${randomInstance}/clip${url.pathname}${url.search}` @@ -804,6 +804,13 @@ function processUpdate() { delete options[frontend] } } + + for (const frontend of options.popupServices) { + if (!Object.keys(config.services).includes(frontend)) { + const i = options.popupServices.indexOf(frontend); + if (i > -1) options.popupServices.splice(i, 1); + } + } } browser.storage.local.set({ options }, () => { resolve() diff --git a/src/pages/options/widgets/general.js b/src/pages/options/widgets/general.js index ed61440b..08e073f5 100644 --- a/src/pages/options/widgets/general.js +++ b/src/pages/options/widgets/general.js @@ -99,7 +99,7 @@ resetSettings.addEventListener("click", async () => { location.reload() }) -let fetchInstancesElement = document.getElementById('fetch-instances') +const fetchInstancesElement = document.getElementById('fetch-instances') fetchInstancesElement.addEventListener('change', event => { setOption('fetchInstances', 'select', event) location.reload() -- cgit 1.4.1 From 94bb758cdfcd1fb30fe91dc3aba70d44aa54487c Mon Sep 17 00:00:00 2001 From: Hin Weisner Date: Wed, 22 Nov 2023 03:25:07 +0000 Subject: Translated using Weblate (Spanish) Currently translated at 100.0% (29 of 29 strings) Translation: LibRedirect/extension Translate-URL: https://hosted.weblate.org/projects/libredirect/extension/es/ --- src/_locales/es/messages.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/_locales/es/messages.json b/src/_locales/es/messages.json index aa774032..8ebe7844 100644 --- a/src/_locales/es/messages.json +++ b/src/_locales/es/messages.json @@ -36,7 +36,7 @@ "description": "used in the settings page" }, "excludeFromRedirecting": { - "message": "Excluido de la redirección", + "message": "Excluidos del redireccionamiento", "description": "used in the settings page" }, "importSettings": { -- cgit 1.4.1 From 4ed67a3f73a63e6d680be9c1f8eccbe8ff570b4e Mon Sep 17 00:00:00 2001 From: ManeraKai Date: Fri, 24 Nov 2023 21:22:43 +0300 Subject: Added Skyview https://github.com/libredirect/browser_extension/issues/834 --- src/assets/images/bluesky-icon.svg | 63 ++++++++++++++++++++++++++++++++++++++ src/assets/javascripts/services.js | 9 ++++++ src/config.json | 30 ++++++++++++++++++ src/pages/stylesheets/styles.css | 2 +- 4 files changed, 103 insertions(+), 1 deletion(-) create mode 100644 src/assets/images/bluesky-icon.svg diff --git a/src/assets/images/bluesky-icon.svg b/src/assets/images/bluesky-icon.svg new file mode 100644 index 00000000..8e916784 --- /dev/null +++ b/src/assets/images/bluesky-icon.svg @@ -0,0 +1,63 @@ + + + + diff --git a/src/assets/javascripts/services.js b/src/assets/javascripts/services.js index dbbe7c9f..ac87cb67 100644 --- a/src/assets/javascripts/services.js +++ b/src/assets/javascripts/services.js @@ -166,6 +166,10 @@ function redirect(url, type, initiator, forceRedirection) { case "freetube": { return 'freetube://' + url.href } + case "freetubePwa": { + return 'freetube://' + url.href + } + case "poketube": { if (url.pathname.startsWith('/channel')) { const reg = /\/channel\/(.*)\/?$/.exec(url.pathname) @@ -561,6 +565,10 @@ function redirect(url, type, initiator, forceRedirection) { case "tekstoLibre": { return `${randomInstance}/?${url.pathname.slice(1)}`; } + case "skyview": { + if (url.pathname == '/') return randomInstance + return `${randomInstance}?url=${encodeURIComponent(url.href)}` + } default: { return `${randomInstance}${url.pathname}${url.search}` } @@ -731,6 +739,7 @@ const defaultInstances = { 'tuboYoutube': ['https://tubo.migalmoreno.com'], 'tuboSoundcloud': ['https://tubo.migalmoreno.com'], 'tekstoLibre': ['https://davilarek.github.io/TekstoLibre'], + 'skyview': ['https://skyview.social'], } function initDefaults() { diff --git a/src/config.json b/src/config.json index 6cc43776..f17ba8f5 100644 --- a/src/config.json +++ b/src/config.json @@ -97,6 +97,16 @@ "desktopApp": true, "instanceList": false, "url": "https://github.com/yattee/yattee" + }, + "freetubePwa": { + "excludeTargets": [ + 2, + 3 + ], + "name": "FreeTube PWA", + "embeddable": false, + "instanceList": false, + "url": "https://github.com/MarmadileManteater/FreeTubeCordova" } }, "targets": [ @@ -963,6 +973,26 @@ }, "imageType": "svg", "url": "https://www.tekstowo.pl" + }, + "bluesky": { + "frontends": { + "skyview": { + "name": "Skyview", + "instanceList": true, + "url": "https://github.com/badlogic/skyview" + } + }, + "targets": [ + "^https?:\\/{2}bsky\\.app\\/" + ], + "name": "Bluesky", + "options": { + "enabled": false, + "unsupportedUrls": "bypass", + "frontend": "skyview" + }, + "imageType": "svg", + "url": "https://bsky.app/" } } } \ No newline at end of file diff --git a/src/pages/stylesheets/styles.css b/src/pages/stylesheets/styles.css index 225023ec..2519a05f 100644 --- a/src/pages/stylesheets/styles.css +++ b/src/pages/stylesheets/styles.css @@ -131,7 +131,7 @@ section.links { flex-wrap: wrap; flex-direction: column; width: 350px; - max-height: 890px; + max-height: 930px; } section.links div { -- cgit 1.4.1 From 5e51ebd95a8c7f76a02f8180426ab18c9b22f7c0 Mon Sep 17 00:00:00 2001 From: ManeraKai Date: Fri, 24 Nov 2023 21:44:14 +0300 Subject: Added Redirect Only In Incognito https://github.com/libredirect/browser_extension/issues/858 --- src/assets/javascripts/services.js | 10 ++++++---- src/pages/background/background.js | 2 +- src/pages/options/widgets/general.js | 7 ++++++- src/pages/options/widgets/general.pug | 14 +++++++++----- 4 files changed, 22 insertions(+), 11 deletions(-) diff --git a/src/assets/javascripts/services.js b/src/assets/javascripts/services.js index ac87cb67..5b5f42a6 100644 --- a/src/assets/javascripts/services.js +++ b/src/assets/javascripts/services.js @@ -68,10 +68,11 @@ async function redirectAsync(url, type, initiator, forceRedirection) { * @param {boolean} forceRedirection * @returns {string | undefined} */ -function redirect(url, type, initiator, forceRedirection) { +function redirect(url, type, initiator, forceRedirection, incognito) { if (type != "main_frame" && type != "sub_frame" && type != "image") return let randomInstance let frontend + if (!forceRedirection && options.redirectOnlyInIncognito == true && !incognito) return for (const service in config.services) { if (!forceRedirection && !options[service].enabled) continue @@ -762,9 +763,10 @@ function initDefaults() { url: [], regex: [], } - options['theme'] = "detect" - options['popupServices'] = ["youtube", "twitter", "tiktok", "imgur", "reddit", "quora", "translate", "maps"] - options['fetchInstances'] = 'github' + options.theme = "detect" + options.popupServices = ["youtube", "twitter", "tiktok", "imgur", "reddit", "quora", "translate", "maps"] + options.fetchInstances = 'github' + options.redirectOnlyInIncognito = false options = { ...options, ...defaultInstances } diff --git a/src/pages/background/background.js b/src/pages/background/background.js index 542ef03b..4b8f1ca2 100644 --- a/src/pages/background/background.js +++ b/src/pages/background/background.js @@ -41,7 +41,7 @@ browser.webRequest.onBeforeRequest.addListener( return null } if (tabIdRedirects[details.tabId] == false) return null - let newUrl = servicesHelper.redirect(url, details.type, initiator, tabIdRedirects[details.tabId], details.tabId) + let newUrl = servicesHelper.redirect(url, details.type, initiator, tabIdRedirects[details.tabId], details.incognito) if (details.frameAncestors && details.frameAncestors.length > 0 && servicesHelper.isException(new URL(details.frameAncestors[0].url))) newUrl = null diff --git a/src/pages/options/widgets/general.js b/src/pages/options/widgets/general.js index 08e073f5..6d2d316c 100644 --- a/src/pages/options/widgets/general.js +++ b/src/pages/options/widgets/general.js @@ -64,7 +64,6 @@ importSettingsElement.addEventListener("change", () => { } }) - const exportSettingsSync = document.getElementById("export-settings-sync") const importSettingsSync = document.getElementById("import-settings-sync") const importSettingsSyncText = document.getElementById("import_settings_sync_text") @@ -105,6 +104,11 @@ fetchInstancesElement.addEventListener('change', event => { location.reload() }) +const redirectOnlyInIncognitoElement = document.getElementById('redirectOnlyInIncognito') +redirectOnlyInIncognitoElement.addEventListener('change', event => { + setOption('redirectOnlyInIncognito', 'checkbox', event) +}) + let themeElement = document.getElementById("theme") themeElement.addEventListener("change", event => { setOption("theme", "select", event) @@ -132,6 +136,7 @@ for (const service in config.services) { let options = await utils.getOptions() themeElement.value = options.theme fetchInstancesElement.value = options.fetchInstances +redirectOnlyInIncognitoElement.target.checked = options.redirectOnlyInIncognito for (const service in config.services) document.getElementById(service).checked = options.popupServices.includes(service) instanceTypeElement.addEventListener("change", event => { diff --git a/src/pages/options/widgets/general.pug b/src/pages/options/widgets/general.pug index 2e7c07da..6fa2a62b 100644 --- a/src/pages/options/widgets/general.pug +++ b/src/pages/options/widgets/general.pug @@ -17,6 +17,10 @@ section(class="block-option" id="general_page") option(value="codeberg") Codeberg option(value="disable" data-localise="__MSG_disable__") Disable + div(class="block block-option") + label(for='redirectOnlyInIncognito' data-localise="__MSG_redirectOnlyInIncognito__") Redirect Only in Incognito + input(id='redirectOnlyInIncognito' type="checkbox") + div(class="block block-option") label(data-localise="__MSG_excludeFromRedirecting__") Excluded from redirecting @@ -44,15 +48,15 @@ section(class="block-option" id="general_page") |  x(data-localise="__MSG_importSettings__") Import Settings input(id="import-settings" type="file" style="display: none") - + |   - + a(class="button button-inline" id="export-settings") svg(xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor") path(d="M10.09 15.59L11.5 17l5-5-5-5-1.41 1.41L12.67 11H3v2h9.67l-2.58 2.59zM19 3H5c-1.11 0-2 .9-2 2v4h2V5h14v14H5v-4H3v4c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2z") |  x(data-localise="__MSG_exportSettings__") Export Settings - + |   button(class="button button-inline" id="export-settings-sync") @@ -60,7 +64,7 @@ section(class="block-option" id="general_page") path(d="M10.09 15.59L11.5 17l5-5-5-5-1.41 1.41L12.67 11H3v2h9.67l-2.58 2.59zM19 3H5c-1.11 0-2 .9-2 2v4h2V5h14v14H5v-4H3v4c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2z") |  x() Export Settings to Sync - + |   button(class="button button-inline" id="import-settings-sync") @@ -70,7 +74,7 @@ section(class="block-option" id="general_page") x(id="import_settings_sync_text") Import Settings from Sync |   - + button(class="button button-inline" id="reset-settings") svg(xmlns="http://www.w3.org/2000/svg" enable-background="new 0 0 24 24" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor") path(d="M12,5V2L8,6l4,4V7c3.31,0,6,2.69,6,6c0,2.97-2.17,5.43-5,5.91v2.02c3.95-0.49,7-3.85,7-7.93C20,8.58,16.42,5,12,5z") -- cgit 1.4.1 From 811f8766eee28308817109a983fe86d87808f2e7 Mon Sep 17 00:00:00 2001 From: ManeraKai Date: Sat, 25 Nov 2023 12:27:09 +0300 Subject: Fixed Tubo SoundCloud not redirecting https://codeberg.org/LibRedirect/browser_extension/issues/116 --- src/assets/javascripts/services.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/assets/javascripts/services.js b/src/assets/javascripts/services.js index 5b5f42a6..13219abc 100644 --- a/src/assets/javascripts/services.js +++ b/src/assets/javascripts/services.js @@ -548,10 +548,11 @@ function redirect(url, type, initiator, forceRedirection, incognito) { return `${randomInstance}` } case "tuboSoundcloud": { - if (url.pathname.match(/\/user[^\/]+(\/$|$)/)) { + if (url.pathname == '/') return `${randomInstance}?kiosk?serviceId=1` + if (url.pathname.match(/^\/[^\/]+(\/$|$)/)) { return `${randomInstance}/channel?url=${encodeURIComponent(url.href)}` } - if (url.pathname.match(/\/user[^\/]+\/[^\/]+/)) { + if (url.pathname.match(/^\/[^\/]+\/[^\/]+/)) { return `${randomInstance}/stream?url=${encodeURIComponent(url.href)}` } return `${randomInstance}` -- cgit 1.4.1 From 51ffdebd1250323d3c06058af14f3812dd188cdf Mon Sep 17 00:00:00 2001 From: ManeraKai Date: Fri, 8 Dec 2023 22:49:02 +0300 Subject: Added superuser.com to AnonymousOverflow https://github.com/libredirect/browser_extension/issues/868 --- package.json | 2 +- src/config.json | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 139d4773..d388da1f 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ }, "scripts": { "start": "web-ext run", - "start_ar": "web-ext run --firefox=/home/esmail/Downloads/ar/firefox/firefox --pref font.language.group=ar", + "start-nightly": "web-ext run --firefox=/home/manerakai/Downloads/firefox/firefox", "build": "web-ext build", "test": "web-ext lint", "html": "pug --basedir ./ --obj ./src/config.json src/pages/options/index.pug --out src/pages/options/ && pug --basedir ./ --obj ./src/config.json src/pages/popup/popup.pug --out src/pages/popup/" diff --git a/src/config.json b/src/config.json index f17ba8f5..52358170 100644 --- a/src/config.json +++ b/src/config.json @@ -710,7 +710,8 @@ }, "targets": [ "^https?:\\/{2}(www\\.)?stackoverflow\\.com\\/", - "^https?:\\/{2}([a-zA-Z0-9-]+\\.)?stackexchange\\.com\\/" + "^https?:\\/{2}([a-zA-Z0-9-]+\\.)?stackexchange\\.com\\/", + "^https?:\\/{2}(www\\.)?superuser\\.com\\/" ], "name": "Stack Overflow", "options": { -- cgit 1.4.1 From 0babf9719dccedde5164b203a72fdc517f914cdb Mon Sep 17 00:00:00 2001 From: ManeraKai Date: Sat, 9 Dec 2023 01:57:25 +0300 Subject: Added toggle for bookmarks menu in settings https://github.com/libredirect/browser_extension/issues/861 --- src/pages/options/widgets/general.js | 15 ++++++++++++++- src/pages/options/widgets/general.pug | 4 ++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/pages/options/widgets/general.js b/src/pages/options/widgets/general.js index 6d2d316c..6f2852a9 100644 --- a/src/pages/options/widgets/general.js +++ b/src/pages/options/widgets/general.js @@ -109,6 +109,18 @@ redirectOnlyInIncognitoElement.addEventListener('change', event => { setOption('redirectOnlyInIncognito', 'checkbox', event) }) +const bookmarksMenuElement = document.getElementById('bookmarksMenu') +bookmarksMenuElement.addEventListener('change', async event => { + if (event.target.checked) + bookmarksMenuElement.checked = await browser.permissions.request({ + permissions: ["bookmarks"] + }) + else + bookmarksMenuElement.checked = !await browser.permissions.remove({ + permissions: ["bookmarks"] + }) +}) + let themeElement = document.getElementById("theme") themeElement.addEventListener("change", event => { setOption("theme", "select", event) @@ -136,7 +148,8 @@ for (const service in config.services) { let options = await utils.getOptions() themeElement.value = options.theme fetchInstancesElement.value = options.fetchInstances -redirectOnlyInIncognitoElement.target.checked = options.redirectOnlyInIncognito +redirectOnlyInIncognitoElement.checked = options.redirectOnlyInIncognito +bookmarksMenuElement.checked = await browser.permissions.contains({ permissions: ["bookmarks"] }) for (const service in config.services) document.getElementById(service).checked = options.popupServices.includes(service) instanceTypeElement.addEventListener("change", event => { diff --git a/src/pages/options/widgets/general.pug b/src/pages/options/widgets/general.pug index 6fa2a62b..70316473 100644 --- a/src/pages/options/widgets/general.pug +++ b/src/pages/options/widgets/general.pug @@ -21,6 +21,10 @@ section(class="block-option" id="general_page") label(for='redirectOnlyInIncognito' data-localise="__MSG_redirectOnlyInIncognito__") Redirect Only in Incognito input(id='redirectOnlyInIncognito' type="checkbox") + div(class="block block-option") + label(for='bookmarksMenu' data-localise="__MSG_bookmarksMenu__") Bookmarks menu + input(id='bookmarksMenu' type="checkbox") + div(class="block block-option") label(data-localise="__MSG_excludeFromRedirecting__") Excluded from redirecting -- cgit 1.4.1