This commit is contained in:
LordMZTE 2022-10-09 00:24:52 +02:00
commit 1abb00314a
Signed by: LordMZTE
GPG key ID: B64802DC33A64FF6
9 changed files with 204 additions and 0 deletions

1
.gitignore vendored Normal file
View file

@ -0,0 +1 @@
build/

7
assets/header.txt Normal file
View file

@ -0,0 +1,7 @@
// ==UserScript==
// @name PipedYT
// @version 0.1.0
// @description Add a youtube link to piped's UI
// @author LordMZTE
// @include http*://piped.kavin.rocks/*
// ==/UserScript==

44
assets/yt.svg Normal file
View file

@ -0,0 +1,44 @@
<svg
width="32"
height="32"
viewBox="0 0 8.4666665 8.4666666"
version="1.1"
id="svg5"
inkscape:version="1.2.1 (9c6d41e410, 2022-07-14, custom)"
sodipodi:docname="yt.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview7"
pagecolor="#505050"
bordercolor="#ffffff"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="1"
inkscape:deskcolor="#505050"
inkscape:document-units="mm"
showgrid="false"
inkscape:zoom="9.0004138"
inkscape:cx="12.277213"
inkscape:cy="29.720856"
inkscape:window-width="1481"
inkscape:window-height="940"
inkscape:window-x="2115"
inkscape:window-y="129"
inkscape:window-maximized="1"
inkscape:current-layer="layer1" />
<defs
id="defs2" />
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1">
<path
id="rect412"
style="fill:#ffffff;stroke-width:6.35;stroke-linejoin:round;stroke-miterlimit:2"
d="M 1.9249471 2.1166667 C 1.3386311 2.1166667 0.86661377 2.588684 0.86661377 3.175 L 0.86661377 5.3950195 C 0.86661377 5.9813356 1.3386311 6.4533529 1.9249471 6.4533529 L 6.694165 6.4533529 C 7.2804811 6.4533529 7.7524984 5.9813356 7.7524984 5.3950195 L 7.7524984 3.175 C 7.7524984 2.588684 7.2804811 2.1166667 6.694165 2.1166667 L 1.9249471 2.1166667 z M 2.903182 2.5285278 L 5.7159302 4.1527181 L 2.9026652 5.7763916 L 2.903182 2.5285278 z " />
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

8
build.hxml Normal file
View file

@ -0,0 +1,8 @@
-cp src
-main Main
-D js_es=6
--macro Init.init()
-resource assets/yt.svg@icon
-js build/script.js

51
hxformat.json Normal file
View file

@ -0,0 +1,51 @@
{
"wrapping": {
"arrayWrap": {
"defaultWrap": "onePerLine",
"rules": [
{
"conditions": [
{
"cond": "totalItemLength <= n",
"value": 50
}
],
"type": "noWrap"
}
]
},
"methodChain": {
"rules": [
{
"conditions": [
{
"cond": "itemCount >= n",
"value": 3
}
],
"type": "onePerLine"
}
]
},
"callParameter": {
"rules": [
{
"conditions": [
{
"cond": "itemCount >= n",
"value": 3
},
{
"cond": "totalItemLength >= n",
"value": 50
}
],
"type": "onePerLine"
}
]
}
},
"indentation": {
"character": " "
}
}

44
src/ButtonAdder.hx Normal file
View file

@ -0,0 +1,44 @@
import haxe.Resource;
import js.Browser.window;
import js.Browser.document;
import js.Browser.console;
function addButton() {
console.log("looking for places to put PipedYT buttons...");
var buttonBar = document.querySelector("#app .w-full .flex .ml-auto");
if (!isVideoPage()) {
return;
}
if (buttonBar == null) {
console.warn("Button bar not found!");
return;
}
if (document.getElementById("pipedyt-button") != null) {
console.log("PipedYT button already exists, not adding another.");
return;
}
var button = document.createAnchorElement();
var urlSuffix = window.location.pathname + window.location.search;
button.href = 'https://youtube.com$urlSuffix';
button.target = "_blank";
button.id = "pipedyt-button";
button.classList.add("btn");
button.classList.add("flex-col");
button.innerHTML = Resource.getString("icon");
buttonBar.appendChild(button);
console.log('Added PipedYT button to ${button.href}');
}
function isVideoPage():Bool {
return window.location.pathname == "/watch" && StringTools.startsWith(window.location.search, "?v=");
}

9
src/Init.hx Normal file
View file

@ -0,0 +1,9 @@
import haxe.macro.Compiler;
import haxe.macro.Context;
import sys.io.File;
macro function init() {
var header = Std.string(File.read("assets/header.txt").readAll());
Compiler.define("source-header", header);
return macro {};
}

View file

@ -0,0 +1,30 @@
import js.html.MutationRecord;
import js.html.Node;
import js.html.MutationObserver;
import js.Browser.window;
class LocationChangeListener {
var handler:Void->Void;
var observer:MutationObserver;
var oldHref:String = window.location.href;
public function new(handler:Void->Void) {
this.handler = handler;
this.observer = new MutationObserver(onEvent);
}
public function register(node: Node) {
var conf = {
childList: true,
subtree: true,
};
this.observer.observe(node, conf);
}
function onEvent(_muts: Array<MutationRecord>, _obs:MutationObserver) {
if (this.oldHref == window.location.href)
return;
this.oldHref = window.location.href;
this.handler();
}
}

10
src/Main.hx Normal file
View file

@ -0,0 +1,10 @@
import ButtonAdder.addButton;
import js.Browser.window;
import js.Browser.document;
class Main {
static function main() {
window.addEventListener("load", addButton);
new LocationChangeListener(addButton).register(document.body);
}
}