// ==UserScript== // @name PipedYT // @version 0.2.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 $extend(from, fields) { var proto = Object.create(from); for (var name in fields) proto[name] = fields[name]; if( fields.toString !== Object.prototype.toString ) proto.toString = fields.toString; return proto; } var BigPipedytButton = {}; BigPipedytButton._new = function(href) { var this1 = PipedytButton._new(href); this1.classList.add("btn"); this1.classList.add("flex-col"); return this1; }; var PageType = $hxEnums["PageType"] = { __ename__:true,__constructs__:null ,Video: {_hx_name:"Video",_hx_index:0,__enum__:"PageType",toString:$estr} ,Feed: {_hx_name:"Feed",_hx_index:1,__enum__:"PageType",toString:$estr} ,Other: {_hx_name:"Other",_hx_index:2,__enum__:"PageType",toString:$estr} }; PageType.__constructs__ = [PageType.Video,PageType.Feed,PageType.Other]; function ButtonAdder_getPageType() { if(window.location.pathname == "/watch" && StringTools.startsWith(window.location.search,"?v=")) { return PageType.Video; } else if(window.location.pathname == "/feed") { return PageType.Feed; } return PageType.Other; } function ButtonAdder_addButton() { $global.console.log("looking for places to put PipedYT buttons..."); switch(ButtonAdder_getPageType()._hx_index) { case 0: ButtonAdder_addButtonToVideoPage(); break; case 1: ButtonAdder_addButtonToFeedPage(); break; default: } } function ButtonAdder_addButtonToVideoPage() { var buttonBar = window.document.querySelector("#app .w-full .flex .ml-auto"); if(buttonBar == null) { $global.console.warn("Button bar not found!"); return; } if(window.document.querySelector(".pipedyt-button") != null) { $global.console.log("PipedYT button already exists, not adding another."); return; } var urlSuffix = window.location.pathname + window.location.search; var url = "https://youtube.com" + urlSuffix; buttonBar.appendChild(BigPipedytButton._new(url)); $global.console.log("Added PipedYT button to " + url); } function ButtonAdder_addButtonToFeedPage() { var videoGrid = window.document.querySelector(".video-grid"); if(videoGrid == null) { return; } var _g = 0; var _g1 = videoGrid.children; while(_g < _g1.length) { var child = _g1[_g]; ++_g; if(child.querySelector(".pipedyt-button") != null) { continue; } var urlSuffix = child.getElementsByTagName("a")[0].getAttribute("href"); var url = "https://youtube.com" + urlSuffix; child.querySelector("div.float-right").appendChild(PipedytButton._new(url)); } } var HxOverrides = function() { }; HxOverrides.__name__ = true; HxOverrides.cca = function(s,index) { var x = s.charCodeAt(index); if(x != x) { return undefined; } return x; }; HxOverrides.substr = function(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); }; HxOverrides.now = function() { return Date.now(); }; var LocationChangeListener = function(handler) { this.oldHref = window.location.href; this.handler = handler; this.observer = new MutationObserver($bind(this,this.onEvent)); }; LocationChangeListener.__name__ = true; LocationChangeListener.prototype = { register: function(node) { var conf = { childList : true, subtree : true}; this.observer.observe(node,conf); } ,onEvent: function(_muts,_obs) { if(this.oldHref == window.location.href) { return; } this.oldHref = window.location.href; this.handler(); } }; function Main_main() { window.addEventListener("load",Main_onload); new LocationChangeListener(ButtonAdder_addButton).register(window.document.body); } function Main_onload() { var videoGrid = window.document.querySelector(".video-grid"); if(videoGrid != null) { var observer = new MutationObserver(function(_,_1) { ButtonAdder_addButton(); }); var conf = { childList : true, subtree : true}; observer.observe(videoGrid,conf); } ButtonAdder_addButton(); } Math.__name__ = true; var PipedytButton = {}; PipedytButton._new = function(href) { var this1 = window.document.createElement("a"); this1.href = href; this1.target = "_blank"; this1.classList.add("pipedyt-button"); this1.innerHTML = haxe_Resource.getString("icon"); return this1; }; var StringTools = function() { }; StringTools.__name__ = true; StringTools.startsWith = function(s,start) { if(s.length >= start.length) { return s.lastIndexOf(start,0) == 0; } else { return false; } }; var haxe_Exception = function(message,previous,native) { Error.call(this,message); this.message = message; this.__previousException = previous; this.__nativeException = native != null ? native : this; }; haxe_Exception.__name__ = true; haxe_Exception.thrown = function(value) { if(((value) instanceof haxe_Exception)) { return value.get_native(); } else if(((value) instanceof Error)) { return value; } else { var e = new haxe_ValueException(value); return e; } }; haxe_Exception.__super__ = Error; haxe_Exception.prototype = $extend(Error.prototype,{ get_native: function() { return this.__nativeException; } }); var haxe_Resource = function() { }; haxe_Resource.__name__ = true; haxe_Resource.getString = function(name) { var _g = 0; var _g1 = haxe_Resource.content; while(_g < _g1.length) { var x = _g1[_g]; ++_g; if(x.name == name) { if(x.str != null) { return x.str; } var b = haxe_crypto_Base64.decode(x.data); return b.toString(); } } return null; }; var haxe_ValueException = function(value,previous,native) { haxe_Exception.call(this,String(value),previous,native); this.value = value; }; haxe_ValueException.__name__ = true; haxe_ValueException.__super__ = haxe_Exception; haxe_ValueException.prototype = $extend(haxe_Exception.prototype,{ }); var haxe_io_Bytes = function(data) { this.length = data.byteLength; this.b = new Uint8Array(data); this.b.bufferValue = data; data.hxBytes = this; data.bytes = this.b; }; haxe_io_Bytes.__name__ = true; haxe_io_Bytes.ofString = function(s,encoding) { if(encoding == haxe_io_Encoding.RawNative) { var buf = new Uint8Array(s.length << 1); var _g = 0; var _g1 = s.length; while(_g < _g1) { var i = _g++; var c = s.charCodeAt(i); buf[i << 1] = c & 255; buf[i << 1 | 1] = c >> 8; } return new haxe_io_Bytes(buf.buffer); } var a = []; var i = 0; while(i < s.length) { var 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.prototype = { getString: function(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; } var s = ""; var b = this.b; var i = pos; var max = pos + len; switch(encoding._hx_index) { case 0: var debug = pos > 0; while(i < max) { var c = b[i++]; if(c < 128) { if(c == 0) { break; } s += String.fromCodePoint(c); } else if(c < 224) { var code = (c & 63) << 6 | b[i++] & 127; s += String.fromCodePoint(code); } else if(c < 240) { var c2 = b[i++]; var code1 = (c & 31) << 12 | (c2 & 127) << 6 | b[i++] & 127; s += String.fromCodePoint(code1); } else { var c21 = b[i++]; var c3 = b[i++]; var u = (c & 15) << 18 | (c21 & 127) << 12 | (c3 & 127) << 6 | b[i++] & 127; s += String.fromCodePoint(u); } } break; case 1: while(i < max) { var c = b[i++] | b[i++] << 8; s += String.fromCodePoint(c); } break; } return s; } ,toString: function() { return this.getString(0,this.length); } }; 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]; var haxe_crypto_Base64 = function() { }; haxe_crypto_Base64.__name__ = true; haxe_crypto_Base64.decode = function(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)); }; var haxe_crypto_BaseCode = function(base) { var len = base.length; var 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; }; haxe_crypto_BaseCode.__name__ = true; haxe_crypto_BaseCode.prototype = { initTable: function() { var tbl = []; var _g = 0; while(_g < 256) { var i = _g++; tbl[i] = -1; } var _g = 0; var _g1 = this.base.length; while(_g < _g1) { var i = _g++; tbl[this.base.b[i]] = i; } this.tbl = tbl; } ,decodeBytes: function(b) { var nbits = this.nbits; var base = this.base; if(this.tbl == null) { this.initTable(); } var tbl = this.tbl; var size = b.length * nbits >> 3; var out = new haxe_io_Bytes(new ArrayBuffer(size)); var buf = 0; var curbits = 0; var pin = 0; var pout = 0; while(pout < size) { while(curbits < 8) { curbits += nbits; buf <<= nbits; var 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; } }; 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]; var haxe_iterators_ArrayIterator = function(array) { this.current = 0; this.array = array; }; haxe_iterators_ArrayIterator.__name__ = true; haxe_iterators_ArrayIterator.prototype = { hasNext: function() { return this.current < this.array.length; } ,next: function() { return this.array[this.current++]; } }; var js_Boot = function() { }; js_Boot.__name__ = true; js_Boot.__string_rec = function(o,s) { if(o == null) { return "null"; } if(s.length >= 5) { return "<...>"; } var t = typeof(o); if(t == "function" && (o.__name__ || o.__ename__)) { t = "object"; } switch(t) { case "function": return ""; case "object": if(o.__enum__) { var e = $hxEnums[o.__enum__]; var con = e.__constructs__[o._hx_index]; var n = con._hx_name; if(con.__params__) { s = s + "\t"; return n + "(" + ((function($this) { var $r; var _g = []; { var _g1 = 0; var _g2 = con.__params__; while(true) { if(!(_g1 < _g2.length)) { break; } var 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)) { var str = "["; s += "\t"; var _g = 0; var _g1 = o.length; while(_g < _g1) { var i = _g++; str += (i > 0 ? "," : "") + js_Boot.__string_rec(o[i],s); } str += "]"; return str; } var tostr; try { tostr = o.toString; } catch( _g ) { return "???"; } if(tostr != null && tostr != Object.toString && typeof(tostr) == "function") { var s2 = o.toString(); if(s2 != "[object Object]") { return s2; } } var str = "{\n"; s += "\t"; var hasp = o.hasOwnProperty != null; var 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); } }; 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);