// ==UserScript== // @name PipedYT // @version 0.1.0 // @description Add a youtube link to piped's UI // @author LordMZTE // @include http*://piped.kavin.rocks/* // ==/UserScript== (function ($global) { "use strict"; var $estr = function() { return js_Boot.__string_rec(this,''); },$hxEnums = $hxEnums || {},$_; function ButtonAdder_addButton() { $global.console.log("looking for places to put PipedYT buttons..."); let buttonBar = window.document.querySelector("#app .w-full .flex .ml-auto"); if(!ButtonAdder_isVideoPage()) { return; } if(buttonBar == null) { $global.console.warn("Button bar not found!"); return; } if(window.document.getElementById("pipedyt-button") != null) { $global.console.log("PipedYT button already exists, not adding another."); return; } let button = window.document.createElement("a"); let 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 = haxe_Resource.getString("icon"); buttonBar.appendChild(button); $global.console.log("Added PipedYT button to " + button.href); } function ButtonAdder_isVideoPage() { if(window.location.pathname == "/watch") { return window.location.search.startsWith("?v="); } else { return false; } } class HxOverrides { static cca(s,index) { let x = s.charCodeAt(index); if(x != x) { return undefined; } return x; } static substr(s,pos,len) { if(len == null) { len = s.length; } else if(len < 0) { if(pos == 0) { len = s.length + len; } else { return ""; } } return s.substr(pos,len); } static now() { return Date.now(); } } HxOverrides.__name__ = true; class LocationChangeListener { constructor(handler) { this.oldHref = window.location.href; this.handler = handler; this.observer = new MutationObserver($bind(this,this.onEvent)); } register(node) { let conf = { childList : true, subtree : true}; this.observer.observe(node,conf); } onEvent(_muts,_obs) { if(this.oldHref == window.location.href) { return; } this.oldHref = window.location.href; this.handler(); } } LocationChangeListener.__name__ = true; class Main { static main() { window.addEventListener("load",ButtonAdder_addButton); new LocationChangeListener(ButtonAdder_addButton).register(window.document.body); } } Main.__name__ = true; Math.__name__ = true; class haxe_Exception extends Error { constructor(message,previous,native) { super(message); this.message = message; this.__previousException = previous; this.__nativeException = native != null ? native : this; } get_native() { return this.__nativeException; } static thrown(value) { if(((value) instanceof haxe_Exception)) { return value.get_native(); } else if(((value) instanceof Error)) { return value; } else { let e = new haxe_ValueException(value); return e; } } } haxe_Exception.__name__ = true; class haxe_Resource { static getString(name) { let _g = 0; let _g1 = haxe_Resource.content; while(_g < _g1.length) { let x = _g1[_g]; ++_g; if(x.name == name) { if(x.str != null) { return x.str; } let b = haxe_crypto_Base64.decode(x.data); return b.toString(); } } return null; } } haxe_Resource.__name__ = true; class haxe_ValueException extends haxe_Exception { constructor(value,previous,native) { super(String(value),previous,native); this.value = value; } } haxe_ValueException.__name__ = true; class haxe_io_Bytes { constructor(data) { this.length = data.byteLength; this.b = new Uint8Array(data); this.b.bufferValue = data; data.hxBytes = this; data.bytes = this.b; } getString(pos,len,encoding) { if(pos < 0 || len < 0 || pos + len > this.length) { throw haxe_Exception.thrown(haxe_io_Error.OutsideBounds); } if(encoding == null) { encoding = haxe_io_Encoding.UTF8; } let s = ""; let b = this.b; let i = pos; let max = pos + len; switch(encoding._hx_index) { case 0: let debug = pos > 0; while(i < max) { let c = b[i++]; if(c < 128) { if(c == 0) { break; } s += String.fromCodePoint(c); } else if(c < 224) { let code = (c & 63) << 6 | b[i++] & 127; s += String.fromCodePoint(code); } else if(c < 240) { let c2 = b[i++]; let code = (c & 31) << 12 | (c2 & 127) << 6 | b[i++] & 127; s += String.fromCodePoint(code); } else { let c2 = b[i++]; let c3 = b[i++]; let u = (c & 15) << 18 | (c2 & 127) << 12 | (c3 & 127) << 6 | b[i++] & 127; s += String.fromCodePoint(u); } } break; case 1: while(i < max) { let c = b[i++] | b[i++] << 8; s += String.fromCodePoint(c); } break; } return s; } toString() { return this.getString(0,this.length); } static ofString(s,encoding) { if(encoding == haxe_io_Encoding.RawNative) { let buf = new Uint8Array(s.length << 1); let _g = 0; let _g1 = s.length; while(_g < _g1) { let i = _g++; let c = s.charCodeAt(i); buf[i << 1] = c & 255; buf[i << 1 | 1] = c >> 8; } return new haxe_io_Bytes(buf.buffer); } let a = []; let i = 0; while(i < s.length) { let c = s.charCodeAt(i++); if(55296 <= c && c <= 56319) { c = c - 55232 << 10 | s.charCodeAt(i++) & 1023; } if(c <= 127) { a.push(c); } else if(c <= 2047) { a.push(192 | c >> 6); a.push(128 | c & 63); } else if(c <= 65535) { a.push(224 | c >> 12); a.push(128 | c >> 6 & 63); a.push(128 | c & 63); } else { a.push(240 | c >> 18); a.push(128 | c >> 12 & 63); a.push(128 | c >> 6 & 63); a.push(128 | c & 63); } } return new haxe_io_Bytes(new Uint8Array(a).buffer); } } haxe_io_Bytes.__name__ = true; var haxe_io_Encoding = $hxEnums["haxe.io.Encoding"] = { __ename__:true,__constructs__:null ,UTF8: {_hx_name:"UTF8",_hx_index:0,__enum__:"haxe.io.Encoding",toString:$estr} ,RawNative: {_hx_name:"RawNative",_hx_index:1,__enum__:"haxe.io.Encoding",toString:$estr} }; haxe_io_Encoding.__constructs__ = [haxe_io_Encoding.UTF8,haxe_io_Encoding.RawNative]; class haxe_crypto_Base64 { static decode(str,complement) { if(complement == null) { complement = true; } if(complement) { while(HxOverrides.cca(str,str.length - 1) == 61) str = HxOverrides.substr(str,0,-1); } return new haxe_crypto_BaseCode(haxe_crypto_Base64.BYTES).decodeBytes(haxe_io_Bytes.ofString(str)); } } haxe_crypto_Base64.__name__ = true; class haxe_crypto_BaseCode { constructor(base) { let len = base.length; let nbits = 1; while(len > 1 << nbits) ++nbits; if(nbits > 8 || len != 1 << nbits) { throw haxe_Exception.thrown("BaseCode : base length must be a power of two."); } this.base = base; this.nbits = nbits; } initTable() { let tbl = []; let _g = 0; while(_g < 256) { let i = _g++; tbl[i] = -1; } let _g1 = 0; let _g2 = this.base.length; while(_g1 < _g2) { let i = _g1++; tbl[this.base.b[i]] = i; } this.tbl = tbl; } decodeBytes(b) { let nbits = this.nbits; let base = this.base; if(this.tbl == null) { this.initTable(); } let tbl = this.tbl; let size = b.length * nbits >> 3; let out = new haxe_io_Bytes(new ArrayBuffer(size)); let buf = 0; let curbits = 0; let pin = 0; let pout = 0; while(pout < size) { while(curbits < 8) { curbits += nbits; buf <<= nbits; let i = tbl[b.b[pin++]]; if(i == -1) { throw haxe_Exception.thrown("BaseCode : invalid encoded char"); } buf |= i; } curbits -= 8; out.b[pout++] = buf >> curbits & 255; } return out; } } haxe_crypto_BaseCode.__name__ = true; var haxe_io_Error = $hxEnums["haxe.io.Error"] = { __ename__:true,__constructs__:null ,Blocked: {_hx_name:"Blocked",_hx_index:0,__enum__:"haxe.io.Error",toString:$estr} ,Overflow: {_hx_name:"Overflow",_hx_index:1,__enum__:"haxe.io.Error",toString:$estr} ,OutsideBounds: {_hx_name:"OutsideBounds",_hx_index:2,__enum__:"haxe.io.Error",toString:$estr} ,Custom: ($_=function(e) { return {_hx_index:3,e:e,__enum__:"haxe.io.Error",toString:$estr}; },$_._hx_name="Custom",$_.__params__ = ["e"],$_) }; haxe_io_Error.__constructs__ = [haxe_io_Error.Blocked,haxe_io_Error.Overflow,haxe_io_Error.OutsideBounds,haxe_io_Error.Custom]; class haxe_iterators_ArrayIterator { constructor(array) { this.current = 0; this.array = array; } hasNext() { return this.current < this.array.length; } next() { return this.array[this.current++]; } } haxe_iterators_ArrayIterator.__name__ = true; class js_Boot { static __string_rec(o,s) { if(o == null) { return "null"; } if(s.length >= 5) { return "<...>"; } let t = typeof(o); if(t == "function" && (o.__name__ || o.__ename__)) { t = "object"; } switch(t) { case "function": return ""; case "object": if(o.__enum__) { let e = $hxEnums[o.__enum__]; let con = e.__constructs__[o._hx_index]; let n = con._hx_name; if(con.__params__) { s = s + "\t"; return n + "(" + ((function($this) { var $r; let _g = []; { let _g1 = 0; let _g2 = con.__params__; while(true) { if(!(_g1 < _g2.length)) { break; } let p = _g2[_g1]; _g1 = _g1 + 1; _g.push(js_Boot.__string_rec(o[p],s)); } } $r = _g; return $r; }(this))).join(",") + ")"; } else { return n; } } if(((o) instanceof Array)) { let str = "["; s += "\t"; let _g = 0; let _g1 = o.length; while(_g < _g1) { let i = _g++; str += (i > 0 ? "," : "") + js_Boot.__string_rec(o[i],s); } str += "]"; return str; } let tostr; try { tostr = o.toString; } catch( _g ) { return "???"; } if(tostr != null && tostr != Object.toString && typeof(tostr) == "function") { let s2 = o.toString(); if(s2 != "[object Object]") { return s2; } } let str = "{\n"; s += "\t"; let hasp = o.hasOwnProperty != null; let k = null; for( k in o ) { if(hasp && !o.hasOwnProperty(k)) { continue; } if(k == "prototype" || k == "__class__" || k == "__super__" || k == "__interfaces__" || k == "__properties__") { continue; } if(str.length != 2) { str += ", \n"; } str += s + k + " : " + js_Boot.__string_rec(o[k],s); } s = s.substring(1); str += "\n" + s + "}"; return str; case "string": return o; default: return String(o); } } } js_Boot.__name__ = true; function $bind(o,m) { if( m == null ) return null; if( m.__id__ == null ) m.__id__ = $global.$haxeUID++; var f; if( o.hx__closures__ == null ) o.hx__closures__ = {}; else f = o.hx__closures__[m.__id__]; if( f == null ) { f = m.bind(o); o.hx__closures__[m.__id__] = f; } return f; } $global.$haxeUID |= 0; if(typeof(performance) != "undefined" ? typeof(performance.now) == "function" : false) { HxOverrides.now = performance.now.bind(performance); } if( String.fromCodePoint == null ) String.fromCodePoint = function(c) { return c < 0x10000 ? String.fromCharCode(c) : String.fromCharCode((c>>10)+0xD7C0)+String.fromCharCode((c&0x3FF)+0xDC00); } { String.__name__ = true; Array.__name__ = true; } haxe_Resource.content = [{ name : "icon", data : "PHN2ZwogICB3aWR0aD0iMzIiCiAgIGhlaWdodD0iMzIiCiAgIHZpZXdCb3g9IjAgMCA4LjQ2NjY2NjUgOC40NjY2NjY2IgogICB2ZXJzaW9uPSIxLjEiCiAgIGlkPSJzdmc1IgogICBpbmtzY2FwZTp2ZXJzaW9uPSIxLjIuMSAoOWM2ZDQxZTQxMCwgMjAyMi0wNy0xNCwgY3VzdG9tKSIKICAgc29kaXBvZGk6ZG9jbmFtZT0ieXQuc3ZnIgogICB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKICAgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIgogICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxzb2RpcG9kaTpuYW1lZHZpZXcKICAgICBpZD0ibmFtZWR2aWV3NyIKICAgICBwYWdlY29sb3I9IiM1MDUwNTAiCiAgICAgYm9yZGVyY29sb3I9IiNmZmZmZmYiCiAgICAgYm9yZGVyb3BhY2l0eT0iMSIKICAgICBpbmtzY2FwZTpzaG93cGFnZXNoYWRvdz0iMCIKICAgICBpbmtzY2FwZTpwYWdlb3BhY2l0eT0iMCIKICAgICBpbmtzY2FwZTpwYWdlY2hlY2tlcmJvYXJkPSIxIgogICAgIGlua3NjYXBlOmRlc2tjb2xvcj0iIzUwNTA1MCIKICAgICBpbmtzY2FwZTpkb2N1bWVudC11bml0cz0ibW0iCiAgICAgc2hvd2dyaWQ9ImZhbHNlIgogICAgIGlua3NjYXBlOnpvb209IjkuMDAwNDEzOCIKICAgICBpbmtzY2FwZTpjeD0iMTIuMjc3MjEzIgogICAgIGlua3NjYXBlOmN5PSIyOS43MjA4NTYiCiAgICAgaW5rc2NhcGU6d2luZG93LXdpZHRoPSIxNDgxIgogICAgIGlua3NjYXBlOndpbmRvdy1oZWlnaHQ9Ijk0MCIKICAgICBpbmtzY2FwZTp3aW5kb3cteD0iMjExNSIKICAgICBpbmtzY2FwZTp3aW5kb3cteT0iMTI5IgogICAgIGlua3NjYXBlOndpbmRvdy1tYXhpbWl6ZWQ9IjEiCiAgICAgaW5rc2NhcGU6Y3VycmVudC1sYXllcj0ibGF5ZXIxIiAvPgogIDxkZWZzCiAgICAgaWQ9ImRlZnMyIiAvPgogIDxnCiAgICAgaW5rc2NhcGU6bGFiZWw9IkxheWVyIDEiCiAgICAgaW5rc2NhcGU6Z3JvdXBtb2RlPSJsYXllciIKICAgICBpZD0ibGF5ZXIxIj4KICAgIDxwYXRoCiAgICAgICBpZD0icmVjdDQxMiIKICAgICAgIHN0eWxlPSJmaWxsOiNmZmZmZmY7c3Ryb2tlLXdpZHRoOjYuMzU7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjIiCiAgICAgICBkPSJNIDEuOTI0OTQ3MSAyLjExNjY2NjcgQyAxLjMzODYzMTEgMi4xMTY2NjY3IDAuODY2NjEzNzcgMi41ODg2ODQgMC44NjY2MTM3NyAzLjE3NSBMIDAuODY2NjEzNzcgNS4zOTUwMTk1IEMgMC44NjY2MTM3NyA1Ljk4MTMzNTYgMS4zMzg2MzExIDYuNDUzMzUyOSAxLjkyNDk0NzEgNi40NTMzNTI5IEwgNi42OTQxNjUgNi40NTMzNTI5IEMgNy4yODA0ODExIDYuNDUzMzUyOSA3Ljc1MjQ5ODQgNS45ODEzMzU2IDcuNzUyNDk4NCA1LjM5NTAxOTUgTCA3Ljc1MjQ5ODQgMy4xNzUgQyA3Ljc1MjQ5ODQgMi41ODg2ODQgNy4yODA0ODExIDIuMTE2NjY2NyA2LjY5NDE2NSAyLjExNjY2NjcgTCAxLjkyNDk0NzEgMi4xMTY2NjY3IHogTSAyLjkwMzE4MiAyLjUyODUyNzggTCA1LjcxNTkzMDIgNC4xNTI3MTgxIEwgMi45MDI2NjUyIDUuNzc2MzkxNiBMIDIuOTAzMTgyIDIuNTI4NTI3OCB6ICIgLz4KICA8L2c+Cjwvc3ZnPgo"}]; js_Boot.__toStr = ({ }).toString; haxe_crypto_Base64.CHARS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; haxe_crypto_Base64.BYTES = haxe_io_Bytes.ofString(haxe_crypto_Base64.CHARS); Main.main(); })(typeof window != "undefined" ? window : typeof global != "undefined" ? global : typeof self != "undefined" ? self : this);