Compare commits

..

No commits in common. "a8fcb3ad6d459399674ff805db8d2c41c83193ab" and "1fb586608c819e4cb16e85cda723c1874162261c" have entirely different histories.

20 changed files with 259 additions and 405 deletions

View File

@ -1,9 +0,0 @@
root = true
[*]
indent_style = space
indent_size = 2
[*.json]
indent_style = space
indent_size = 4

4
.gitignore vendored
View File

@ -1,3 +1,3 @@
doc/ doc/
UrlToJD2.zip UrlToJD2.zip
git.sh git.sh

View File

@ -1,177 +1,133 @@
let JD2_API_URL = window.localStorage.getItem("jd2_api_url") ?? 'http://localhost:9666/flashgot?'; var JD2_API_URL = 'http://localhost:9666/flashgot?';
let JD2_REFERER = window.localStorage.getItem("jd2_referer") ?? 'localhost'; var JD2_REFERER = 'localhost';
let JD2_MATCH_URL = window.localStorage.getItem("jd2_match_url") ?? "*://*/flashgot?*"; var JD2_MATCH_URL = "*://*/flashgot?*";
// menu
const mnDlId = "JD2Dl"; function onError(error) {
const mnGrabberId = "JD2Grabber" console.log('UrlToJD2_error: ' + error);
}
function onError(error) { // On startup, check autostart option stored setting or default value
console.log('UrlToJD2 background error: ' + error); const gettingStoredSettings = browser.storage.local.get();
} gettingStoredSettings.then((item) => {
if (!item.autostart) {
function onCreated() { browser.storage.local.set({ autostart: true })
if (browser.runtime.lastError) { }
onError(browser.runtime.lastError); },
} onError);
}
function makeRequest(url) { function makeRequest(url) {
var req = new XMLHttpRequest(); var req = new XMLHttpRequest();
req.open('GET', url, true); req.open('GET', url, true);
req.send(null); req.send(null);
req.onerror = function () { req.onload = function () {
onError('Is JD2 on and ready ?'); // console.log(req.status);
} if (req.readyState === 4 && req.status === 200) {
req.onload = function () { // console.log(req.responseText);
if (req.readyState === XMLHttpRequest.DONE && req.status === 200) { // notify...
// console.log(req.responseText); } else {
// notify... onError(req.statusText);
} else { }
onError(req.statusText); }
} }
}
} function urlConstruct(url, autostart) {
return JD2_API_URL + "autostart=" + autostart + "&urls=" + url;
function urlConstruct(url, autostart) { }
return JD2_API_URL + "autostart=" + autostart + "&urls=" + encodeURIComponent(url);
}
function bool_to_int(bool) {
// Return an url from a text, good enought :-) return (bool == true) ? 1 : 0;
function linkify(text) { }
let urlRegex =/(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig;
let url = text.match(urlRegex); // main
return (url === null) ? '' : url[0]; function loadTabUrlToJD2Crawl(storedSettings) {
} var gettingActiveTab = browser.tabs.query({ active: true, currentWindow: true });
gettingActiveTab.then((tabs) => {
// MENU if (tabs[0]) {
browser.menus.create({ currentTabUrl = tabs[0].url;
id: mnGrabberId, url_for_JD2 = urlConstruct(currentTabUrl, bool_to_int(storedSettings.autostart));
title: "Linkgrabbler", // console.log(url_for_JD2);
contexts: ["link", "selection"], makeRequest(url_for_JD2);
icons: { }
"16": "icons/jd2linkgrabber-16.png", }, onError);
"32": "icons/jd2linkgrabber-32.png" }
}
}, onCreated);
browser.pageAction.onClicked.addListener(() => {
browser.menus.create({ const gettingStoredSettings = browser.storage.local.get();
id: mnDlId, gettingStoredSettings.then(loadTabUrlToJD2Crawl, onError);
title: "send to Download", });
contexts: ["link", "selection"],
icons: {
"16": "icons/jd2download-16.png", // menu
"32": "icons/jd2download-32.png" const sendToJD2Id = "send-to-JD2";
} function onCreated() {
}, onCreated); if (browser.runtime.lastError) {
onError(browser.runtime.lastError);
// Choose from info (object menus.OnClickData) }
// linkUrl over selectionText }
// return link or ''
function infoToUrl(info){ browser.menus.create({
var url = ''; id: sendToJD2Id,
if (typeof info.linkUrl !== 'undefined'){ title: "send to JD2",
url = info.linkUrl; contexts: ["link"]
} else { }, onCreated);
if (typeof info.selectionText !== 'undefined'){
url = linkify(info.selectionText);
} browser.menus.onClicked.addListener((info, tab) => {
} if (info.menuItemId === sendToJD2Id) {
return url; const gettingStoredSettings = browser.storage.local.get();
} gettingStoredSettings.then((storedSettings) => {
url_for_JD2 = urlConstruct(info.linkUrl, bool_to_int(storedSettings.autostart));
browser.menus.onClicked.addListener((info, tab) => { makeRequest(url_for_JD2);
var url = infoToUrl(info); }, onError);
if (url !== ''){ }
switch (info.menuItemId){ });
case mnGrabberId:
url_for_JD2 = urlConstruct(url, 0); function updateMenuItem(link) {
break; browser.menus.update(sendToJD2Id, {
case mnDlId: title: `Send to JD2: "${link}"`
url_for_JD2 = urlConstruct(url, 1); });
break; browser.menus.refresh();
} }
// console.log(url);
// console.log(url_for_JD2); browser.menus.onShown.addListener(info => {
makeRequest(url_for_JD2); if (!info.linkUrl) {
} return;
}); }
updateMenuItem(info.linkUrl);
function updateMenuItem(url) { });
browser.menus.update(mnDlId, {
title: 'Download: ' + url
}); // Some functions for a good referer !
browser.menus.update(mnGrabberId, {
title: 'Linkgrabber: ' + url // https://stackoverflow.com/a/11602753
}); function mod_headers(header_array, p_name, p_value) {
browser.menus.refresh(); var did_set = false;
} for (var i in header_array) {
var header = header_array[i];
function allMenusVisible(visible){ var name = header.name;
browser.menus.update(mnGrabberId, { // var value = header.value;
visible: visible // If the header is already present, change it:
}); if (name == p_name) {
browser.menus.update(mnDlId, { header.value = p_value;
visible: visible did_set = true;
}); }
} }
// if it is not, add it:
browser.menus.onShown.addListener(info => { if (!did_set) { header_array.push({ name: p_name, value: p_value }); }
var url = infoToUrl(info); }
// console.log(url);
if (url !== ''){ function rewriteHeader(e) {
allMenusVisible(true); mod_headers(e.requestHeaders, 'Referer', JD2_REFERER);
updateMenuItem(url); // for (var header of e.requestHeaders) { console.log(header.name + '::' + header.value); }
return; return { requestHeaders: e.requestHeaders };
} else { }
allMenusVisible(false);
browser.menus.refresh(); browser.webRequest.onBeforeSendHeaders.addListener(
} rewriteHeader,
}); { urls: [JD2_MATCH_URL] },
["blocking", "requestHeaders"]
// Handle message from 'popup' );
function handleMessageFromPopup(request, sender, sendResponse) {
if (request.message == "refresh") {
JD2_API_URL = window.localStorage.getItem("jd2_api_url");
JD2_REFERER = window.localStorage.getItem("jd2_referer");
JD2_MATCH_URL = window.localStorage.getItem("jd2_match_url");
} else {
let forJD2link = urlConstruct(request.jd2url, request.jd2action);
makeRequest(forJD2link);
return Promise.resolve({response: "done"});
}
}
browser.runtime.onMessage.addListener(handleMessageFromPopup);
// Some functions for a good referer !
// https://stackoverflow.com/a/11602753
function mod_headers(header_array, p_name, p_value) {
var did_set = false;
for (var i in header_array) {
var header = header_array[i];
var name = header.name;
// var value = header.value;
// If the header is already present, change it:
if (name == p_name) {
header.value = p_value;
did_set = true;
}
}
// if it is not, add it:
if (!did_set) { header_array.push({ name: p_name, value: p_value }); }
}
function rewriteHeader(e) {
mod_headers(e.requestHeaders, 'Referer', JD2_REFERER);
// for (var header of e.requestHeaders) { console.log(header.name + '::' + header.value); }
return { requestHeaders: e.requestHeaders };
}
browser.webRequest.onBeforeSendHeaders.addListener(
rewriteHeader,
{ urls: [JD2_MATCH_URL] },
["blocking", "requestHeaders"]
);

Binary file not shown.

Before

Width:  |  Height:  |  Size: 573 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 790 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 483 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 898 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.1 KiB

View File

@ -1,54 +1,51 @@
{ {
"manifest_version": 2, "manifest_version": 2,
"name": "UrlToJD2", "name": "UrlToJD2",
"version": "2.1", "version": "1.0",
"description": "Push an url to JDownloader 2 GrabberLink or Download", "description": "Push the current url navigator to JDownloader 2",
"developer": { "developer": {
"name": "GTeam", "name": "GTeam",
"url": "https://framagit.org/GTeam/UrlToJD2" "url": "https://framagit.org/GTeam/UrlToJD2"
}, },
"browser_specific_settings": { "browser_specific_settings": {
"gecko": { "gecko": {
"id": "urltojd2@gteam.fr", "id": "urltojd2@gteam.fr",
"strict_min_version": "60.0" "strict_min_version": "55.0"
} }
}, },
"icons": { "icons": {
"16": "icons/urltojd2-16.png", "48": "icons/urltojd2-48.png",
"32": "icons/urltojd2-32.png", "96": "icons/urltojd2-96.png"
"48": "icons/urltojd2-48.png", },
"96": "icons/urltojd2-96.png"
}, "background": {
"scripts": ["background.js"]
"background": { },
"scripts": ["background.js"]
}, "page_action": {
"default_icon": {
"page_action": { "19": "icons/urltojd2-19.png",
"default_icon": { "38": "icons/urltojd2-38.png"
"19": "icons/urltojd2-19.png", },
"38": "icons/urltojd2-38.png" "show_matches": ["<all_urls>"],
}, "default_title": "Send current url to JD2"
"show_matches": ["<all_urls>"], },
"default_title": "Send current url to JD2",
"browser_style": true, "permissions": [
"default_popup": "popup/popup.html" "activeTab",
"*://*/flashgot?*",
}, "webRequest",
"webRequestBlocking",
"permissions": [ "storage",
"activeTab", "menus"
"*://*/flashgot?*", ],
"webRequest",
"webRequestBlocking", "options_ui": {
"menus" "page": "options/options.html",
], "browser_style": true
}
"options_ui": {
"page": "options.html",
"browser_style": true
}
} }

View File

@ -1,21 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<script src="options.js"></script>
</head>
<body>
<label for="jd2_api_url">JD2 API URL: </label>
<input type="text" id="jd2_api_url" name="jd2_api_url" />
<br>
<label for="jd2_referer">JD2 Referer: </label>
<input type="text" id="jd2_referer" name="jd2_referer" />
<br>
<label for="jd2_match_url">JD2 API URL: </label>
<input type="text" id="jd2_match_url" name="jd2_match_url" />
<br>
<button id="save">Save</button>
</body>
</html>

View File

@ -1,15 +0,0 @@
document.addEventListener("DOMContentLoaded", () => {
document.getElementById("save").onclick = save;
document.getElementById("jd2_api_url").value = window.localStorage.getItem("jd2_api_url") ?? 'http://localhost:9666/flashgot?';
document.getElementById("jd2_referer").value = window.localStorage.getItem("jd2_referer") ?? 'localhost';
document.getElementById("jd2_match_url").value = window.localStorage.getItem("jd2_match_url") ?? "*://*/flashgot?*";
})
function save() {
window.localStorage.setItem("jd2_api_url", document.getElementById("jd2_api_url").value);
window.localStorage.setItem("jd2_referer", document.getElementById("jd2_referer").value);
window.localStorage.setItem("jd2_match_url", document.getElementById("jd2_match_url").value);
browser.runtime.sendMessage({message: "refresh"})
}

19
options/options.html Normal file
View File

@ -0,0 +1,19 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<div class="browser-style">
<h2>Autostart</h2>
<input type="checkbox" id="autostart" checked name="autostart">
<label for="autostart">pass directly from JD2 Linkgrabbler to download list</label>
</div>
<script src="options.js"></script>
</body>
</html>

29
options/options.js Normal file
View File

@ -0,0 +1,29 @@
function onError(error) {
console.log('UrlToJD2_options_error: ' + error);
}
// autostart
var chck_autostart = document.getElementById("autostart");
chck_autostart.onchange = function () {
if (chck_autostart.checked) {
browser.storage.local.set({ autostart: true });
} else {
browser.storage.local.set({ autostart: false });
}
}
// Update the options UI or default setting
function updateUI(restoredSettings) {
if (restoredSettings.autostart == undefined) {
chck_autostart.checked = true; //default
} else {
chck_autostart.checked = restoredSettings.autostart;
}
}
// On opening the options page
const gettingStoredSettings = browser.storage.local.get();
gettingStoredSettings.then(updateUI, onError);

View File

@ -1,21 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<style>
img {
margin: 0px 4px 0px 0px;
}
</style>
</head>
<body>
<div class="panel">
<div class="panel-section panel-section-list" id="jd2urlList">
</div>
</div>
<script src="popup.js"></script>
</body>
</html>

View File

@ -1,61 +0,0 @@
document.addEventListener("DOMContentLoaded", function(event) {
function onError(error) {
console.log(`jd2 popup error: ${error}`);
}
const jd2UrlList = document.getElementById('jd2urlList');
var gettingActiveTab = browser.tabs.query({ active: true, currentWindow: true });
gettingActiveTab.then((tabs) => {
if (tabs[0]) {
var currentTabUrl = tabs[0].url;
let li = document.createElement("div");
li.classList.add("panel-list-item");
li.setAttribute("data-href", currentTabUrl);
li.setAttribute("jd2", "0");
let img = document.createElement("img");
img.src = "../icons/jd2linkgrabber-16.png";
li.appendChild(img);
let txt = document.createElement("div");
txt.innerText = 'GrabberLink';
li.appendChild(txt);
jd2UrlList.appendChild(li);
let li2 = document.createElement("div");
li2.classList.add("panel-list-item");
li2.setAttribute("data-href", currentTabUrl);
li2.setAttribute("jd2", "1");
let img2 = document.createElement("img");
img2.src = "../icons/jd2download-16.png";
li2.appendChild(img2);
let txt2 = document.createElement("div");
txt2.innerText = 'Download';
li2.appendChild(txt2);
jd2UrlList.appendChild(li2);
}
var jd2SelectedAction;
document.querySelectorAll(".panel-list-item").forEach( (elem) => {
elem.addEventListener('click', (event) => {
jd2SelectedAction = elem.getAttribute("jd2");
notifyBackgroundPage(event);
});
});
function handleResponse(message) {
// console.log(`Message from the background script: ${message.response}`);
window.close();
}
function notifyBackgroundPage(e) {
var sending = browser.runtime.sendMessage({
jd2url: currentTabUrl,
jd2action : jd2SelectedAction
});
sending.then(handleResponse, onError);
}
}, onError);
});

View File

@ -1,31 +1,26 @@
# UrlToJD2 - A Firefox extension # UrlToJD2
Push an url from the browser or a link (right-click) to the download manager JDownloader 2. Push the current url navigator or an url in a link (right-click) to the download manager JDownloader 2.
This addons use the remote control API (externInterface: Flashgot) from JDownloader2. # Getting Started
This addons use the remote control API (externInterface: Flashgot) to send the url to JDownloader2.
## Prerequisites
Install [JDownloader2](http://beta.jdownloader.org/). ## Prerequisites
In "advanced parameters" search "RemoteAPI". Install [JDownloader2](http://beta.jdownloader.org/).
The value of "Authorized Website" must look like: ["127.0.0.1", "localhost"] In "advanced parameters" search "RemoteAPI".
JD2 is now ready to listen ! The value of "Authorized Website" must look like: ["127.0.0.1", "localhost"]
JD2 is now ready to listen !
## Usage
This extension add two things: ## Option
- A "pageAction" (a clickable icon inside the browser's address bar). "autostart" checked by default: pass directly from JD2 Linkgrabbler to download list.
- An item in the context menu
## Note
With url or link (or link/url in selection), choose to send to the Linkgrabber or to the Download list. If you want a more complete addons with JD2, try [the official one:](https://my.jdownloader.org/apps/)
## Note ## Code Source
If you want a more complete addons with JD2, try [the official one:](https://my.jdownloader.org/apps/) [UrlToJD2](https://framagit.org/GTeam/urltojd2)
## Code Source # License
[UrlToJD2](https://framagit.org/GTeam/urltojd2) This project is licensed under the Mozilla Public License, version 2.0
## Acknowledgments ##Acknowledgments
- Extension icon: [primofenax](https://www.deviantart.com/primofenax/art/icon-Minimal-JDownloader-Icon-313625363) icon: [primofenax](https://www.deviantart.com/primofenax/art/icon-Minimal-JDownloader-Icon-313625363)
- Context icons from JDownloader2
## Licence
This project is licensed under the Mozilla Public License, version 2.0

View File

@ -1,15 +0,0 @@
# Versions
## 2.1 (2021-12-30)
- fix the (undefined) url send to JD2 when text selection
## 2.0 (2021-12-20)
- Large Refactoring
- context menu and pageAction can send to Linkgrabber or Download JD2 list.
- remove "options" page
## 1.1 (2019-08-26)
- change (be better) the urlConstruct function for URL encode.
## 1.0 (2019-08-16)
- first release