From eaf96d5e3fb1cc3eb21c8e405b92cda7dc7c57aa Mon Sep 17 00:00:00 2001 From: "Abdulmohsen B. A. A." Date: Sun, 9 Mar 2025 00:43:41 +0300 Subject: [PATCH] initial version. --- .gitignore | 2 + CHANGELOG.md | 5 ++ LICENSE | 19 ++++++ README.md | 16 +++++ assets/options-menu.png | Bin 0 -> 25003 bytes assets/popup-action.png | Bin 0 -> 3858 bytes src/background.js | 135 ++++++++++++++++++++++++++++++++++++++++ src/css/pure.css | 11 ++++ src/icons/icon-128.png | Bin 0 -> 22399 bytes src/icons/icon-16.png | Bin 0 -> 1433 bytes src/icons/icon-32.png | Bin 0 -> 3299 bytes src/icons/icon-48.png | Bin 0 -> 5642 bytes src/manifest.json | 45 ++++++++++++++ src/options.html | 79 +++++++++++++++++++++++ src/options.js | 43 +++++++++++++ src/popup.html | 57 +++++++++++++++++ src/popup.js | 45 ++++++++++++++ 17 files changed, 457 insertions(+) create mode 100644 .gitignore create mode 100644 CHANGELOG.md create mode 100644 LICENSE create mode 100644 README.md create mode 100644 assets/options-menu.png create mode 100644 assets/popup-action.png create mode 100644 src/background.js create mode 100644 src/css/pure.css create mode 100644 src/icons/icon-128.png create mode 100644 src/icons/icon-16.png create mode 100644 src/icons/icon-32.png create mode 100644 src/icons/icon-48.png create mode 100644 src/manifest.json create mode 100644 src/options.html create mode 100644 src/options.js create mode 100644 src/popup.html create mode 100644 src/popup.js diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..429ae95 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +.idea +src/src.zip \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..159aff4 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,5 @@ +# CHANGELOG + +## 0.0.1 - 2025-03-08 + +- Initial release version diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..c8f664a --- /dev/null +++ b/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2025 ArabCoders + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..b6bf822 --- /dev/null +++ b/README.md @@ -0,0 +1,16 @@ +# A YTPTube extension + +This extension can be used in `Chrome/Chromium browsers` and `Firefox` to add URLs to [YTPTube](https://github.com/arabcoders/ytptube) instance. + +## Screenshots + +![options](./assets/options-menu.png) ![popup](./assets/popup-action.png) + +## Installation from store + +- Install from [Firefox]() +- Install from [Chrome]() + +## Usage + +Configure the extension to point to your YTPTube instance in addon preferences. diff --git a/assets/options-menu.png b/assets/options-menu.png new file mode 100644 index 0000000000000000000000000000000000000000..386a572d49cf86d16d755ccaba7267e2de379022 GIT binary patch literal 25003 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 &+1JjA;iJ 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 Dw4HB6 literal 0 HcmV?d00001 diff --git a/assets/popup-action.png b/assets/popup-action.png new file mode 100644 index 0000000000000000000000000000000000000000..3328049d5833326cf56eeae8a22311aa603f89b8 GIT binary patch literal 3858 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 M!}VmPebCMS1lto=)Bpeg literal 0 HcmV?d00001 diff --git a/src/background.js b/src/background.js new file mode 100644 index 0000000..4e92ff3 --- /dev/null +++ b/src/background.js @@ -0,0 +1,135 @@ +// noinspection JSUnresolvedReference + +const str_keys = ["instance_url", "preset", "template", "folder", "username", "password"] +const bool_keys = ["showContextMenu"] + +if (typeof chrome === 'undefined') { + let chrome = browser +} + +const notify = message => chrome.notifications.create({ + "type": "basic", + "iconUrl": chrome.runtime.getURL("icons/icon-128.png"), + "title": 'YTPTube Extension', + "message": message, +}); + +const onMenuCreated = () => { + if (chrome.runtime.lastError) { + console.log(`error creating menu item. ${chrome.runtime.lastError}`); + } + syncContextMenu().then(_ => '').catch(console.error); +} + +const shouldShowContextMenu = async () => { + let item = await chrome.storage.sync.get("showContextMenu"); + return 'showContextMenu' in item ? item.showContextMenu : true; +}; + +const syncContextMenu = async () => { + let showContextMenu = await shouldShowContextMenu(); + chrome.contextMenus.update("send-to-ytptube", {visible: showContextMenu}); +} + +chrome.contextMenus.create({ + id: "send-to-ytptube", + title: "Send to YTPTube", + contexts: ["link"] +}, onMenuCreated); + +const getCurrentUrl = async () => (await chrome.tabs.query({currentWindow: true, active: true}))[0].url + +const getOption = async key => { + let item = await chrome.storage.sync.get(key); + if (str_keys.includes(key)) { + return item[key] ?? ''; + } + if (bool_keys.includes(key)) { + return item[key] ?? false; + } +} + +const sendRequest = async user_url => { + const instanceUrl = await getOption("instance_url"); + if (!instanceUrl) { + notify('YTPTube instance url not configured.'); + return; + } + + let headers = {}; + let data = { + url: user_url, + } + + const auth_username = await getOption("username"); + const auth_password = await getOption("password"); + if (auth_username && auth_password) { + headers['Authorization'] = 'Basic ' + btoa(`${auth_username}:${auth_password}`); + } + + const preset = await getOption("preset"); + if (preset) { + data['preset'] = preset; + } + + const template = await getOption("template"); + if (template) { + data['template'] = template; + } + + const folder = await getOption("folder"); + if (folder) { + data['folder'] = folder; + } + + console.debug(`Sending to '${instanceUrl}'.`, data, headers.length > 0 ? 'with auth header' : 'without auth header'); + + const url = new URL(instanceUrl); + url.pathname = '/api/history'; + + const req = await fetch(url, { + method: 'POST', + headers: { + ...headers, + 'Content-Type': 'application/json', + }, + body: JSON.stringify(data) + }); + + if (200 === req.status) { + notify('Request sent successfully.'); + return + } + + notify(`Failed to send request. '${req.status}: ${req.statusText}'.`); +}; + +chrome.contextMenus.onClicked.addListener(async (info, _) => { + if (info.menuItemId !== "send-to-ytptube") { + return; + } + if (!info.linkUrl) { + notify('No link url found'); + return; + } + + await sendRequest(info.linkUrl); +}); + +chrome.runtime.onMessage.addListener(async (message) => { + if (message.command !== "send-to-ytptube") { + return; + } + + let url = message.url || await getCurrentUrl(); + + if (!url) { + await notify('No url found'); + return; + } + + await sendRequest(url); +}); + + + diff --git a/src/css/pure.css b/src/css/pure.css new file mode 100644 index 0000000..acdc431 --- /dev/null +++ b/src/css/pure.css @@ -0,0 +1,11 @@ +/*! +Pure v3.0.0 +Copyright 2013 Yahoo! +Licensed under the BSD License. +https://github.com/pure-css/pure/blob/master/LICENSE +*/ +/*! +normalize.css v | MIT License | https://necolas.github.io/normalize.css/ +Copyright (c) Nicolas Gallagher and Jonathan Neal +*/ +/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}main{display:block}h1{font-size:2em;margin:.67em 0}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}template{display:none}[hidden]{display:none}html{font-family:sans-serif}.hidden,[hidden]{display:none!important}.pure-img{max-width:100%;height:auto;display:block}.pure-g{display:flex;flex-flow:row wrap;align-content:flex-start}.pure-u{display:inline-block;vertical-align:top}.pure-u-1,.pure-u-1-1,.pure-u-1-12,.pure-u-1-2,.pure-u-1-24,.pure-u-1-3,.pure-u-1-4,.pure-u-1-5,.pure-u-1-6,.pure-u-1-8,.pure-u-10-24,.pure-u-11-12,.pure-u-11-24,.pure-u-12-24,.pure-u-13-24,.pure-u-14-24,.pure-u-15-24,.pure-u-16-24,.pure-u-17-24,.pure-u-18-24,.pure-u-19-24,.pure-u-2-24,.pure-u-2-3,.pure-u-2-5,.pure-u-20-24,.pure-u-21-24,.pure-u-22-24,.pure-u-23-24,.pure-u-24-24,.pure-u-3-24,.pure-u-3-4,.pure-u-3-5,.pure-u-3-8,.pure-u-4-24,.pure-u-4-5,.pure-u-5-12,.pure-u-5-24,.pure-u-5-5,.pure-u-5-6,.pure-u-5-8,.pure-u-6-24,.pure-u-7-12,.pure-u-7-24,.pure-u-7-8,.pure-u-8-24,.pure-u-9-24{display:inline-block;letter-spacing:normal;word-spacing:normal;vertical-align:top;text-rendering:auto}.pure-u-1-24{width:4.1667%}.pure-u-1-12,.pure-u-2-24{width:8.3333%}.pure-u-1-8,.pure-u-3-24{width:12.5%}.pure-u-1-6,.pure-u-4-24{width:16.6667%}.pure-u-1-5{width:20%}.pure-u-5-24{width:20.8333%}.pure-u-1-4,.pure-u-6-24{width:25%}.pure-u-7-24{width:29.1667%}.pure-u-1-3,.pure-u-8-24{width:33.3333%}.pure-u-3-8,.pure-u-9-24{width:37.5%}.pure-u-2-5{width:40%}.pure-u-10-24,.pure-u-5-12{width:41.6667%}.pure-u-11-24{width:45.8333%}.pure-u-1-2,.pure-u-12-24{width:50%}.pure-u-13-24{width:54.1667%}.pure-u-14-24,.pure-u-7-12{width:58.3333%}.pure-u-3-5{width:60%}.pure-u-15-24,.pure-u-5-8{width:62.5%}.pure-u-16-24,.pure-u-2-3{width:66.6667%}.pure-u-17-24{width:70.8333%}.pure-u-18-24,.pure-u-3-4{width:75%}.pure-u-19-24{width:79.1667%}.pure-u-4-5{width:80%}.pure-u-20-24,.pure-u-5-6{width:83.3333%}.pure-u-21-24,.pure-u-7-8{width:87.5%}.pure-u-11-12,.pure-u-22-24{width:91.6667%}.pure-u-23-24{width:95.8333%}.pure-u-1,.pure-u-1-1,.pure-u-24-24,.pure-u-5-5{width:100%}.pure-button{display:inline-block;line-height:normal;white-space:nowrap;vertical-align:middle;text-align:center;cursor:pointer;-webkit-user-drag:none;-webkit-user-select:none;user-select:none;box-sizing:border-box}.pure-button::-moz-focus-inner{padding:0;border:0}.pure-button-group{letter-spacing:-.31em;text-rendering:optimizespeed}.opera-only :-o-prefocus,.pure-button-group{word-spacing:-0.43em}.pure-button-group .pure-button{letter-spacing:normal;word-spacing:normal;vertical-align:top;text-rendering:auto}.pure-button{font-family:inherit;font-size:100%;padding:.5em 1em;color:rgba(0,0,0,.8);border:none transparent;background-color:#e6e6e6;text-decoration:none;border-radius:2px}.pure-button-hover,.pure-button:focus,.pure-button:hover{background-image:linear-gradient(transparent,rgba(0,0,0,.05) 40%,rgba(0,0,0,.1))}.pure-button:focus{outline:0}.pure-button-active,.pure-button:active{box-shadow:0 0 0 1px rgba(0,0,0,.15) inset,0 0 6px rgba(0,0,0,.2) inset;border-color:#000}.pure-button-disabled,.pure-button-disabled:active,.pure-button-disabled:focus,.pure-button-disabled:hover,.pure-button[disabled]{border:none;background-image:none;opacity:.4;cursor:not-allowed;box-shadow:none;pointer-events:none}.pure-button-hidden{display:none}.pure-button-primary,.pure-button-selected,a.pure-button-primary,a.pure-button-selected{background-color:#0078e7;color:#fff}.pure-button-group .pure-button{margin:0;border-radius:0;border-right:1px solid rgba(0,0,0,.2)}.pure-button-group .pure-button:first-child{border-top-left-radius:2px;border-bottom-left-radius:2px}.pure-button-group .pure-button:last-child{border-top-right-radius:2px;border-bottom-right-radius:2px;border-right:none}.pure-form input[type=color],.pure-form input[type=date],.pure-form input[type=datetime-local],.pure-form input[type=datetime],.pure-form input[type=email],.pure-form input[type=month],.pure-form input[type=number],.pure-form input[type=password],.pure-form input[type=search],.pure-form input[type=tel],.pure-form input[type=text],.pure-form input[type=time],.pure-form input[type=url],.pure-form input[type=week],.pure-form select,.pure-form textarea{padding:.5em .6em;display:inline-block;border:1px solid #ccc;box-shadow:inset 0 1px 3px #ddd;border-radius:4px;vertical-align:middle;box-sizing:border-box}.pure-form input:not([type]){padding:.5em .6em;display:inline-block;border:1px solid #ccc;box-shadow:inset 0 1px 3px #ddd;border-radius:4px;box-sizing:border-box}.pure-form input[type=color]{padding:.2em .5em}.pure-form input[type=color]:focus,.pure-form input[type=date]:focus,.pure-form input[type=datetime-local]:focus,.pure-form input[type=datetime]:focus,.pure-form input[type=email]:focus,.pure-form input[type=month]:focus,.pure-form input[type=number]:focus,.pure-form input[type=password]:focus,.pure-form input[type=search]:focus,.pure-form input[type=tel]:focus,.pure-form input[type=text]:focus,.pure-form input[type=time]:focus,.pure-form input[type=url]:focus,.pure-form input[type=week]:focus,.pure-form select:focus,.pure-form textarea:focus{outline:0;border-color:#129fea}.pure-form input:not([type]):focus{outline:0;border-color:#129fea}.pure-form input[type=checkbox]:focus,.pure-form input[type=file]:focus,.pure-form input[type=radio]:focus{outline:thin solid #129FEA;outline:1px auto #129FEA}.pure-form .pure-checkbox,.pure-form .pure-radio{margin:.5em 0;display:block}.pure-form input[type=color][disabled],.pure-form input[type=date][disabled],.pure-form input[type=datetime-local][disabled],.pure-form input[type=datetime][disabled],.pure-form input[type=email][disabled],.pure-form input[type=month][disabled],.pure-form input[type=number][disabled],.pure-form input[type=password][disabled],.pure-form input[type=search][disabled],.pure-form input[type=tel][disabled],.pure-form input[type=text][disabled],.pure-form input[type=time][disabled],.pure-form input[type=url][disabled],.pure-form input[type=week][disabled],.pure-form select[disabled],.pure-form textarea[disabled]{cursor:not-allowed;background-color:#eaeded;color:#cad2d3}.pure-form input:not([type])[disabled]{cursor:not-allowed;background-color:#eaeded;color:#cad2d3}.pure-form input[readonly],.pure-form select[readonly],.pure-form textarea[readonly]{background-color:#eee;color:#777;border-color:#ccc}.pure-form input:focus:invalid,.pure-form select:focus:invalid,.pure-form textarea:focus:invalid{color:#b94a48;border-color:#e9322d}.pure-form input[type=checkbox]:focus:invalid:focus,.pure-form input[type=file]:focus:invalid:focus,.pure-form input[type=radio]:focus:invalid:focus{outline-color:#e9322d}.pure-form select{height:2.25em;border:1px solid #ccc;background-color:#fff}.pure-form select[multiple]{height:auto}.pure-form label{margin:.5em 0 .2em}.pure-form fieldset{margin:0;padding:.35em 0 .75em;border:0}.pure-form legend{display:block;width:100%;padding:.3em 0;margin-bottom:.3em;color:#333;border-bottom:1px solid #e5e5e5}.pure-form-stacked input[type=color],.pure-form-stacked input[type=date],.pure-form-stacked input[type=datetime-local],.pure-form-stacked input[type=datetime],.pure-form-stacked input[type=email],.pure-form-stacked input[type=file],.pure-form-stacked input[type=month],.pure-form-stacked input[type=number],.pure-form-stacked input[type=password],.pure-form-stacked input[type=search],.pure-form-stacked input[type=tel],.pure-form-stacked input[type=text],.pure-form-stacked input[type=time],.pure-form-stacked input[type=url],.pure-form-stacked input[type=week],.pure-form-stacked label,.pure-form-stacked select,.pure-form-stacked textarea{display:block;margin:.25em 0}.pure-form-stacked input:not([type]){display:block;margin:.25em 0}.pure-form-aligned input,.pure-form-aligned select,.pure-form-aligned textarea,.pure-form-message-inline{display:inline-block;vertical-align:middle}.pure-form-aligned textarea{vertical-align:top}.pure-form-aligned .pure-control-group{margin-bottom:.5em}.pure-form-aligned .pure-control-group label{text-align:right;display:inline-block;vertical-align:middle;width:10em;margin:0 1em 0 0}.pure-form-aligned .pure-controls{margin:1.5em 0 0 11em}.pure-form .pure-input-rounded,.pure-form input.pure-input-rounded{border-radius:2em;padding:.5em 1em}.pure-form .pure-group fieldset{margin-bottom:10px}.pure-form .pure-group input,.pure-form .pure-group textarea{display:block;padding:10px;margin:0 0 -1px;border-radius:0;position:relative;top:-1px}.pure-form .pure-group input:focus,.pure-form .pure-group textarea:focus{z-index:3}.pure-form .pure-group input:first-child,.pure-form .pure-group textarea:first-child{top:1px;border-radius:4px 4px 0 0;margin:0}.pure-form .pure-group input:first-child:last-child,.pure-form .pure-group textarea:first-child:last-child{top:1px;border-radius:4px;margin:0}.pure-form .pure-group input:last-child,.pure-form .pure-group textarea:last-child{top:-2px;border-radius:0 0 4px 4px;margin:0}.pure-form .pure-group button{margin:.35em 0}.pure-form .pure-input-1{width:100%}.pure-form .pure-input-3-4{width:75%}.pure-form .pure-input-2-3{width:66%}.pure-form .pure-input-1-2{width:50%}.pure-form .pure-input-1-3{width:33%}.pure-form .pure-input-1-4{width:25%}.pure-form-message-inline{display:inline-block;padding-left:.3em;color:#666;vertical-align:middle;font-size:.875em}.pure-form-message{display:block;color:#666;font-size:.875em}@media only screen and (max-width :480px){.pure-form button[type=submit]{margin:.7em 0 0}.pure-form input:not([type]),.pure-form input[type=color],.pure-form input[type=date],.pure-form input[type=datetime-local],.pure-form input[type=datetime],.pure-form input[type=email],.pure-form input[type=month],.pure-form input[type=number],.pure-form input[type=password],.pure-form input[type=search],.pure-form input[type=tel],.pure-form input[type=text],.pure-form input[type=time],.pure-form input[type=url],.pure-form input[type=week],.pure-form label{margin-bottom:.3em;display:block}.pure-group input:not([type]),.pure-group input[type=color],.pure-group input[type=date],.pure-group input[type=datetime-local],.pure-group input[type=datetime],.pure-group input[type=email],.pure-group input[type=month],.pure-group input[type=number],.pure-group input[type=password],.pure-group input[type=search],.pure-group input[type=tel],.pure-group input[type=text],.pure-group input[type=time],.pure-group input[type=url],.pure-group input[type=week]{margin-bottom:0}.pure-form-aligned .pure-control-group label{margin-bottom:.3em;text-align:left;display:block;width:100%}.pure-form-aligned .pure-controls{margin:1.5em 0 0 0}.pure-form-message,.pure-form-message-inline{display:block;font-size:.75em;padding:.2em 0 .8em}}.pure-menu{box-sizing:border-box}.pure-menu-fixed{position:fixed;left:0;top:0;z-index:3}.pure-menu-item,.pure-menu-list{position:relative}.pure-menu-list{list-style:none;margin:0;padding:0}.pure-menu-item{padding:0;margin:0;height:100%}.pure-menu-heading,.pure-menu-link{display:block;text-decoration:none;white-space:nowrap}.pure-menu-horizontal{width:100%;white-space:nowrap}.pure-menu-horizontal .pure-menu-list{display:inline-block}.pure-menu-horizontal .pure-menu-heading,.pure-menu-horizontal .pure-menu-item,.pure-menu-horizontal .pure-menu-separator{display:inline-block;vertical-align:middle}.pure-menu-item .pure-menu-item{display:block}.pure-menu-children{display:none;position:absolute;left:100%;top:0;margin:0;padding:0;z-index:3}.pure-menu-horizontal .pure-menu-children{left:0;top:auto;width:inherit}.pure-menu-active>.pure-menu-children,.pure-menu-allow-hover:hover>.pure-menu-children{display:block;position:absolute}.pure-menu-has-children>.pure-menu-link:after{padding-left:.5em;content:"\25B8";font-size:small}.pure-menu-horizontal .pure-menu-has-children>.pure-menu-link:after{content:"\25BE"}.pure-menu-scrollable{overflow-y:scroll;overflow-x:hidden}.pure-menu-scrollable .pure-menu-list{display:block}.pure-menu-horizontal.pure-menu-scrollable .pure-menu-list{display:inline-block}.pure-menu-horizontal.pure-menu-scrollable{white-space:nowrap;overflow-y:hidden;overflow-x:auto;padding:.5em 0}.pure-menu-horizontal .pure-menu-children .pure-menu-separator,.pure-menu-separator{background-color:#ccc;height:1px;margin:.3em 0}.pure-menu-horizontal .pure-menu-separator{width:1px;height:1.3em;margin:0 .3em}.pure-menu-horizontal .pure-menu-children .pure-menu-separator{display:block;width:auto}.pure-menu-heading{text-transform:uppercase;color:#565d64}.pure-menu-link{color:#777}.pure-menu-children{background-color:#fff}.pure-menu-heading,.pure-menu-link{padding:.5em 1em}.pure-menu-disabled{opacity:.5}.pure-menu-disabled .pure-menu-link:hover{background-color:transparent;cursor:default}.pure-menu-active>.pure-menu-link,.pure-menu-link:focus,.pure-menu-link:hover{background-color:#eee}.pure-menu-selected>.pure-menu-link,.pure-menu-selected>.pure-menu-link:visited{color:#000}.pure-table{border-collapse:collapse;border-spacing:0;empty-cells:show;border:1px solid #cbcbcb}.pure-table caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.pure-table td,.pure-table th{border-left:1px solid #cbcbcb;border-width:0 0 0 1px;font-size:inherit;margin:0;overflow:visible;padding:.5em 1em}.pure-table thead{background-color:#e0e0e0;color:#000;text-align:left;vertical-align:bottom}.pure-table td{background-color:transparent}.pure-table-odd td{background-color:#f2f2f2}.pure-table-striped tr:nth-child(2n-1) td{background-color:#f2f2f2}.pure-table-bordered td{border-bottom:1px solid #cbcbcb}.pure-table-bordered tbody>tr:last-child>td{border-bottom-width:0}.pure-table-horizontal td,.pure-table-horizontal th{border-width:0 0 1px 0;border-bottom:1px solid #cbcbcb}.pure-table-horizontal tbody>tr:last-child>td{border-bottom-width:0} \ No newline at end of file diff --git a/src/icons/icon-128.png b/src/icons/icon-128.png new file mode 100644 index 0000000000000000000000000000000000000000..843d04188666b2d56b33ca6af8ce6005621c78ad GIT binary patch literal 22399 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 literal 0 HcmV?d00001 diff --git a/src/icons/icon-16.png b/src/icons/icon-16.png new file mode 100644 index 0000000000000000000000000000000000000000..ef04618d07170a3af80250bcff4f0baa6acbd021 GIT binary patch literal 1433 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 literal 0 HcmV?d00001 diff --git a/src/icons/icon-48.png b/src/icons/icon-48.png new file mode 100644 index 0000000000000000000000000000000000000000..be2a5ad32f53201f72fad692898d98a2cd059417 GIT binary patch literal 5642 zcmV+l7WL_gP)EX>4Tx04R}tkv&MmKpe$iQ>8^J4$UCqkfA!+MMWJ;6^me@v=v%)FuC*#nzSS- zE{=k0!NHHks)LKOt`4q(Aou~|E;uQ=NQwVT3N2zhIPS;0dyl(!fY7Qk&FqT-nr<2C zL|n?{SEax!{0Jfp5wkKg>&eVw7M|nl9zMR_MR}I@xj)CCS}+;llZa!iZdk+{#50># zo%24i$jY)xd`>)J&;^MfxvseU#<}FMz%xZ7o1P~YiKS8xD?QB0hDJP198oo$@`aqs zD(5ZETD8GC_v9}O74(%1*J+L-fh8o7f&>K(R8WP5D6KjvCepMY_wbK6{uH?sa#g^{ zv49#h$c`WU4}N!R7N;iNq);5_f3fY4F(9xDw41j5eQew96TtrrT zeE6^#>2!KhQBk_e_q+GrM-~+P(I- zYoA!P=C{vmTEDi5|BdTQr=C`|^r43z-oA5ZTURctPBdPsDykYf(T=W8ZER}N`uYa# zuG_D{fmV$=GwNKVDxywBBNcV3dbq1gH*DV0_V?G_`0%VR{bkkvw+PIfc~W}ji6>rt z!G#yxIAi+s(uD7!7*v&mEiJsidpFy5?qtK8Z}P#1AL3j@Rj52UauP{(NMRuyGZ<4n z8l5ze#JDje%F9t>5LG%mkMPRNzwY?S<3GE-JKOcZhBwxA{f{~D#aX9Lo_GG-Cu%OQ znKH1v+yFS|*z@5Yo?G!eD_5w+_p#O|kx1bAmJy-j$>C#21R1O<76T%v2tjcX z*_ksaoO3pbQI%jVBFe7ayY>G2@89;`yE|$&ZG2<<=W^h*lfP`l=%OpXdF8|N7c3}C z6(ms%b#?VT`Q$Qw_Vmw5Bz$~7iSH*#78H<5myk*okx2NA62l#yPa@ZaQN=3Y6mpK!C){3{39LMRcpxZ~ zQ>RY#_U+quM%}*p_R0}en;IJG{xk=MkEmR9!G&M_m&-1_G~xR`*=&{v9(a)3mfnZK zf+|FEgOLoS!d$mLSUEq6kzm7%+w+6)sMekc=G00b(!;M!-aZ2_uYi5QdmY zF;RrSVGG^H;Qz%0l0_+wn|z#oYs;21+S*z_Y-p^1@4s|l)`_zwkC{;Y{P%9SA)QVa z5rzQ|J@hd5J^Cmmsba>CtfaA_k>a94zA$MbFTeZ>TerRqvDuh>XEH`95#>@_OfnZh zC=dxam%o$5Z;TuoI*0`01Pgd?ZKpGppzzqgAYEEa_4x7LuYa@h^oojMuQWE+H~&!w zPCn`6w4Y4;@}^sF9$i≫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 k0=58qn(Fs{uCLqtUt + + + + + Options menu for YTPTube Extension + + + + + +
+
+ Settings + +
+ + + URL to your YTPTube instance
+
+ +
+ + + Preset to use for the URL
+
+ +
+ + + Filename template to use for the output file.
+
+ +
+ + + Where to save downloaded files.
+
+ +
+ + + Username to use for authentication.
+
+ +
+ + + Password to use for authentication.
+
+ +
+ + +
+
+ + + + diff --git a/src/options.js b/src/options.js new file mode 100644 index 0000000..104f015 --- /dev/null +++ b/src/options.js @@ -0,0 +1,43 @@ +// noinspection JSUnresolvedReference + +const str_keys = ["instance_url", "preset", "template", "folder", "username", "password"] + +const $ = s => document.querySelector(s) + +if (typeof chrome === 'undefined') { + let chrome = browser +} + +document.addEventListener("DOMContentLoaded", () => { + function onError(error) { + console.log(`Error: ${error}`); + } + + str_keys.forEach(k => { + chrome.storage.sync.get(k).then(r => document.querySelector(`#${k}`).value = r[k] || "", onError); + }); + + chrome.storage.sync.get("showContextMenu").then(r => document.querySelector("#showContextMenu").checked = r.showContextMenu || false); +}); + +document.getElementById("ytptube_options").addEventListener("submit", (e) => { + e.preventDefault(); + + let showContextMenu = document.querySelector("#showContextMenu").checked; + + let data = {} + + str_keys.forEach(key => data[key] = document.querySelector(`#${key}`).value) + data["showContextMenu"] = showContextMenu + chrome.storage.sync.set(data); + chrome.contextMenus.update("send-to-ytptube", {visible: showContextMenu}); + + chrome.notifications.create({ + "type": "basic", + "iconUrl": chrome.runtime.getURL("icons/icon-128.png"), + "title": 'YTPTube Extension', + "message": "Options saved." + }); + + setTimeout(() => window.close(), 1000); +}); \ No newline at end of file diff --git a/src/popup.html b/src/popup.html new file mode 100644 index 0000000..02b6429 --- /dev/null +++ b/src/popup.html @@ -0,0 +1,57 @@ + + + + + YTPTube Extension + + + + + +
+
+ + + The URL to send to YTPTube instance
+
+
+ +
+
+
+ +
+
+ + + + + diff --git a/src/popup.js b/src/popup.js new file mode 100644 index 0000000..0bf1bd7 --- /dev/null +++ b/src/popup.js @@ -0,0 +1,45 @@ +// noinspection JSUnresolvedReference + +const $ = s => document.querySelector(s) + +if (typeof chrome === 'undefined') { + let chrome = browser +} + +const notify = message => chrome.notifications.create({ + "type": "basic", + "iconUrl": chrome.runtime.getURL("icons/icon-128.png"), + "title": 'YTPTube Extension', + "message": message +}); + +$("#ytptube_popup").addEventListener("submit", async (e) => { + e.preventDefault() + const url = $('#user_url').value + if (!url) { + notify('URL is required.') + return + } + + await chrome.runtime.sendMessage({command: 'send-to-ytptube', url: url}) +}) + +const getCurrentUrl = async () => (await chrome.tabs.query({currentWindow: true, active: true}))[0].url + +addEventListener('DOMContentLoaded', async _ => { + let url = await getCurrentUrl() + + if (url && !url.startsWith('http')) { + url = "" + } + + $('#user_url').value = url || '' +}) + +$('#go-to-options').addEventListener('click', function () { + if (chrome.runtime.openOptionsPage) { + chrome.runtime.openOptionsPage(); + } else { + window.open(chrome.runtime.getURL('options.html')); + } +}); \ No newline at end of file