diff --git a/.gitignore b/.gitignore index c42cbc5..5b8abc1 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,3 @@ -doc/ -UrlToJD2.zip +doc/ +UrlToJD2.zip git.sh \ No newline at end of file diff --git a/background.js b/background.js index 8da6141..b82b1e7 100644 --- a/background.js +++ b/background.js @@ -1,133 +1,162 @@ -var JD2_API_URL = 'http://localhost:9666/flashgot?'; -var JD2_REFERER = 'localhost'; -var JD2_MATCH_URL = "*://*/flashgot?*"; - - -function onError(error) { - console.log('UrlToJD2_error: ' + error); -} - -// On startup, check autostart option stored setting or default value -const gettingStoredSettings = browser.storage.local.get(); -gettingStoredSettings.then((item) => { - if (!item.autostart) { - browser.storage.local.set({ autostart: true }) - } -}, - onError); - - -function makeRequest(url) { - var req = new XMLHttpRequest(); - req.open('GET', url, true); - req.send(null); - req.onload = function () { - // console.log(req.status); - if (req.readyState === 4 && req.status === 200) { - // console.log(req.responseText); - // notify... - } else { - onError(req.statusText); - } - } -} - -function urlConstruct(url, autostart) { - return JD2_API_URL + "autostart=" + autostart + "&urls=" + encodeURIComponent(url); -} - - -function bool_to_int(bool) { - return (bool == true) ? 1 : 0; -} - -// main -function loadTabUrlToJD2Crawl(storedSettings) { - var gettingActiveTab = browser.tabs.query({ active: true, currentWindow: true }); - gettingActiveTab.then((tabs) => { - if (tabs[0]) { - currentTabUrl = tabs[0].url; - url_for_JD2 = urlConstruct(currentTabUrl, bool_to_int(storedSettings.autostart)); - // console.log(url_for_JD2); - makeRequest(url_for_JD2); - } - }, onError); -} - - -browser.pageAction.onClicked.addListener(() => { - const gettingStoredSettings = browser.storage.local.get(); - gettingStoredSettings.then(loadTabUrlToJD2Crawl, onError); -}); - - -// menu -const sendToJD2Id = "send-to-JD2"; -function onCreated() { - if (browser.runtime.lastError) { - onError(browser.runtime.lastError); - } -} - -browser.menus.create({ - id: sendToJD2Id, - title: "send to JD2", - contexts: ["link"] -}, onCreated); - - -browser.menus.onClicked.addListener((info, tab) => { - if (info.menuItemId === sendToJD2Id) { - const gettingStoredSettings = browser.storage.local.get(); - gettingStoredSettings.then((storedSettings) => { - url_for_JD2 = urlConstruct(info.linkUrl, bool_to_int(storedSettings.autostart)); - makeRequest(url_for_JD2); - }, onError); - } -}); - -function updateMenuItem(link) { - browser.menus.update(sendToJD2Id, { - title: `Send to JD2: "${link}"` - }); - browser.menus.refresh(); -} - -browser.menus.onShown.addListener(info => { - if (!info.linkUrl) { - return; - } - updateMenuItem(info.linkUrl); -}); - - -// 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"] -); +const JD2_API_URL = 'http://localhost:9666/flashgot?'; +const JD2_REFERER = 'localhost'; +const JD2_MATCH_URL = "*://*/flashgot?*"; + +// menu +const mnDlId = "JD2Dl"; +const mnGrabberId = "JD2Grabber" + + +function onError(error) { + console.log('UrlToJD2 background error: ' + error); +} + +function onCreated() { + if (browser.runtime.lastError) { + onError(browser.runtime.lastError); + } +} + +function makeRequest(url) { + var req = new XMLHttpRequest(); + req.open('GET', url, true); + req.send(null); + req.onerror = function () { + onError('Is JD2 on and ready ?'); + } + req.onload = function () { + if (req.readyState === XMLHttpRequest.DONE && req.status === 200) { + // console.log(req.responseText); + // notify... + } else { + onError(req.statusText); + } + } +} + +function urlConstruct(url, autostart) { + return JD2_API_URL + "autostart=" + autostart + "&urls=" + encodeURIComponent(url); +} + +function linkify(text) { + let urlRegex =/(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig; + let url = text.match(urlRegex); + return (url === null) ? '' : url[0]; +} + +// MENU +browser.menus.create({ + id: mnGrabberId, + title: "Linkgrabbler", + contexts: ["link", "selection"], + icons: { + "16": "icons/jd2linkgrabber-16.png", + "32": "icons/jd2linkgrabber-32.png" + } +}, onCreated); + +browser.menus.create({ + id: mnDlId, + title: "send to Download", + contexts: ["link", "selection"], + icons: { + "16": "icons/jd2download-16.png", + "32": "icons/jd2download-32.png" + } +}, onCreated); + +browser.menus.onClicked.addListener((info, tab) => { + switch (info.menuItemId){ + case mnGrabberId: + url_for_JD2 = urlConstruct(info.linkUrl, 0); + break; + case mnDlId: + url_for_JD2 = urlConstruct(info.linkUrl, 1); + break; + } + makeRequest(url_for_JD2); +}); + +function updateMenuItem(link) { + browser.menus.update(mnDlId, { + title: 'Download: ' + link + }); + browser.menus.update(mnGrabberId, { + title: 'Linkgrabber: ' + link + }); + browser.menus.refresh(); +} + +function allMenusVisible(visible){ + browser.menus.update(mnGrabberId, { + visible: visible + }); + browser.menus.update(mnDlId, { + visible: visible + }); +} + +browser.menus.onShown.addListener(info => { + // console.log('jd2 link: ' + info.linkUrl); + // console.log('jd2 selection: ' + info.selectionText); + + // linkUrl over selectionText + if (typeof info.linkUrl !== 'undefined'){ + allMenusVisible(true); + updateMenuItem(info.linkUrl); + return + } else { + if (typeof info.selectionText !== 'undefined'){ + var url = linkify(info.selectionText); + // console.log('jd2: url: ' + url); + if (url !== ''){ + allMenusVisible(true) + updateMenuItem(url); + return + } else { + allMenusVisible(false) + browser.menus.refresh(); + } + } + } +}); + +// Handle message from 'popup' +function handleMessageFromPopup(request, sender, sendResponse) { + 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"] +); diff --git a/icons/jd2download-16.png b/icons/jd2download-16.png new file mode 100644 index 0000000..862b34c Binary files /dev/null and b/icons/jd2download-16.png differ diff --git a/icons/jd2download-32.png b/icons/jd2download-32.png new file mode 100644 index 0000000..c96ab0e Binary files /dev/null and b/icons/jd2download-32.png differ diff --git a/icons/jd2linkgrabber-16.png b/icons/jd2linkgrabber-16.png new file mode 100644 index 0000000..45cc18a Binary files /dev/null and b/icons/jd2linkgrabber-16.png differ diff --git a/icons/jd2linkgrabber-32.png b/icons/jd2linkgrabber-32.png new file mode 100644 index 0000000..8562049 Binary files /dev/null and b/icons/jd2linkgrabber-32.png differ diff --git a/icons/urltojd2-16.png b/icons/urltojd2-16.png new file mode 100644 index 0000000..68af304 Binary files /dev/null and b/icons/urltojd2-16.png differ diff --git a/icons/urltojd2-32.png b/icons/urltojd2-32.png new file mode 100644 index 0000000..6299026 Binary files /dev/null and b/icons/urltojd2-32.png differ diff --git a/manifest.json b/manifest.json index 158848d..954fd0d 100644 --- a/manifest.json +++ b/manifest.json @@ -1,51 +1,50 @@ -{ - "manifest_version": 2, - "name": "UrlToJD2", - "version": "1.1", - "description": "Push the current url navigator to JDownloader 2", - - "developer": { - "name": "GTeam", - "url": "https://framagit.org/GTeam/UrlToJD2" - }, - - "browser_specific_settings": { - "gecko": { - "id": "urltojd2@gteam.fr", - "strict_min_version": "55.0" - } - }, - - "icons": { - "48": "icons/urltojd2-48.png", - "96": "icons/urltojd2-96.png" - }, - - "background": { - "scripts": ["background.js"] - }, - - "page_action": { - "default_icon": { - "19": "icons/urltojd2-19.png", - "38": "icons/urltojd2-38.png" - }, - "show_matches": [""], - "default_title": "Send current url to JD2" - }, - - "permissions": [ - "activeTab", - "*://*/flashgot?*", - "webRequest", - "webRequestBlocking", - "storage", - "menus" - ], - - "options_ui": { - "page": "options/options.html", - "browser_style": true - } - +{ + "manifest_version": 2, + "name": "UrlToJD2", + "version": "2.0", + "description": "Push the current url navigator to JDownloader 2 GrabberLink or Download", + + "developer": { + "name": "GTeam", + "url": "https://framagit.org/GTeam/UrlToJD2" + }, + + "browser_specific_settings": { + "gecko": { + "id": "urltojd2@gteam.fr", + "strict_min_version": "55.0" + } + }, + + "icons": { + "16": "icons/urltojd2-16.png", + "32": "icons/urltojd2-32.png", + "48": "icons/urltojd2-48.png", + "96": "icons/urltojd2-96.png" + }, + + "background": { + "scripts": ["background.js"] + }, + + "page_action": { + "default_icon": { + "19": "icons/urltojd2-19.png", + "38": "icons/urltojd2-38.png" + }, + "show_matches": [""], + "default_title": "Send current url to JD2", + "browser_style": true, + "default_popup": "popup/popup.html" + + }, + + "permissions": [ + "activeTab", + "*://*/flashgot?*", + "webRequest", + "webRequestBlocking", + "menus" + ] + } \ No newline at end of file diff --git a/options/options.html b/options/options.html deleted file mode 100644 index 3fae68e..0000000 --- a/options/options.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - -
-

Autostart

- - -
- - - - - - \ No newline at end of file diff --git a/options/options.js b/options/options.js deleted file mode 100644 index 51846b7..0000000 --- a/options/options.js +++ /dev/null @@ -1,29 +0,0 @@ -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); \ No newline at end of file diff --git a/popup/popup.html b/popup/popup.html new file mode 100644 index 0000000..f4c606f --- /dev/null +++ b/popup/popup.html @@ -0,0 +1,21 @@ + + + + + + + + + +
+
+
+
+ + + + \ No newline at end of file diff --git a/popup/popup.js b/popup/popup.js new file mode 100644 index 0000000..adffc30 --- /dev/null +++ b/popup/popup.js @@ -0,0 +1,61 @@ +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); +}); \ No newline at end of file diff --git a/readme.md b/readme.md index 4233597..747335b 100644 --- a/readme.md +++ b/readme.md @@ -1,26 +1,31 @@ -# UrlToJD2 -Push the current url navigator or an url in a link (right-click) to the download manager JDownloader 2. - -# Getting Started -This addons use the remote control API (externInterface: Flashgot) to send the url to JDownloader2. - -## Prerequisites -Install [JDownloader2](http://beta.jdownloader.org/). -In "advanced parameters" search "RemoteAPI". -The value of "Authorized Website" must look like: ["127.0.0.1", "localhost"] -JD2 is now ready to listen ! - -## Option -"autostart" checked by default: pass directly from JD2 Linkgrabbler to download list. - -## Note -If you want a more complete addons with JD2, try [the official one:](https://my.jdownloader.org/apps/) - -## Code Source -[UrlToJD2](https://framagit.org/GTeam/urltojd2) - -# License -This project is licensed under the Mozilla Public License, version 2.0 - -## Acknowledgments -icon: [primofenax](https://www.deviantart.com/primofenax/art/icon-Minimal-JDownloader-Icon-313625363) +# UrlToJD2 - A Firefox extension +Push an url from the browser or in a link (right-click) to the download manager JDownloader 2. + +This addons use the remote control API (externInterface: Flashgot) from JDownloader2. + +## Prerequisites +Install [JDownloader2](http://beta.jdownloader.org/). +In "advanced parameters" search "RemoteAPI". +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: +- A "pageAction" (a clickable icon inside the browser's address bar). +- An item in the context menu + +With url or link (or link in selection), choose to send to the Linkgrabber ou to the Download list. + +## Note +If you want a more complete addons with JD2, try [the official one:](https://my.jdownloader.org/apps/) + +## Code Source +[UrlToJD2](https://framagit.org/GTeam/urltojd2) + +## Acknowledgments +- Extension 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 + diff --git a/versions.md b/versions.md new file mode 100644 index 0000000..a40ec40 --- /dev/null +++ b/versions.md @@ -0,0 +1,12 @@ +# Versions + +## 2.0 2021-12-20 +- Large Refactoring +- 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