Greasy Fork

Greasy Fork is available in English.

Gaston's - Video/Image Downloader

Instagram/Youtube/tiktok Video/Audio Downloader alwayts updated

当前为 2024-06-03 提交的版本,查看 最新版本

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name Gaston's - Video/Image Downloader
// @namespace http://tampermonkey.net/
// @version 2.2
// @description Instagram/Youtube/tiktok Video/Audio Downloader alwayts updated
// @author gaston1799
// @match *://www.youtube.com/*
// @match *://www.instagram.com/*
// @match *://music.youtube.com/*
// @match *://onlymp3.app/*
// @match *://onlymp3.to/*
// @match *://fastdl.app/*
// @match *://en.onlymp3.app/*
// @match *://www.yt2conv.com/*
// @match *://www.tiktok.com/*
// @match *://en3.onlinevideoconverter.pro/*
// @match *://savetik.co/*
// @match *://yt5s.biz/*
// @match *://sss.instasaverpro.com/*
// @icon data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==

// @grant GM_info
// @grant GM_xmlhttpRequest
// @grant GM_getValue
// @grant GM_setValue
// @grant GM_deleteValue
// @grant GM_addValueChangeListener
// @grant GM_removeValueChangeListener
// @license MIT
// ==/UserScript==
//YT: https://www.youtube.com/channel/UCOA8lE9-0XnEIdHqjfQUz1A
function sleep(ms){return new Promise(a=>setTimeout(a,ms))}
GM_setValue_=GM_setValue
GM_getValue_=GM_getValue
GM_info_=GM_info
var UnmutePath='M3.15,3.85l4.17,4.17L6.16,9H3v6h3.16L12,19.93v-7.22l2.45,2.45c-0.15,0.07-0.3,0.13-0.45,0.18v1.04 c0.43-0.1,0.83-0.27,1.2-0.48l1.81,1.81c-0.88,0.62-1.9,1.04-3.01,1.2v1.01c1.39-0.17,2.66-0.71,3.73-1.49l2.42,2.42l0.71-0.71 l-17-17L3.15,3.85z M11,11.71v6.07L6.52,14H4v-4h2.52l1.5-1.27L11,11.71z M10.33,6.79L9.62,6.08L12,4.07v4.39l-1-1V6.22L10.33,6.79 z M14,8.66V7.62c2,0.46,3.5,2.24,3.5,4.38c0,0.58-0.13,1.13-0.33,1.64l-0.79-0.79c0.07-0.27,0.12-0.55,0.12-0.85 C16.5,10.42,15.44,9.1,14,8.66z M14,5.08V4.07c3.95,0.49,7,3.85,7,7.93c0,1.56-0.46,3.01-1.23,4.24l-0.73-0.73 C19.65,14.48,20,13.28,20,12C20,8.48,17.39,5.57,14,5.08z'
var mutePath='M17.5,12c0,2.14-1.5,3.92-3.5,4.38v-1.04c1.44-0.43,2.5-1.76,2.5-3.34c0-1.58-1.06-2.9-2.5-3.34V7.62 C16,8.08,17.5,9.86,17.5,12z M12,4.07v15.86L6.16,15H3V9h3.16L12,4.07z M11,6.22L6.52,10H4v4h2.52L11,17.78V6.22z M21,12 c0,4.08-3.05,7.44-7,7.93v-1.01c3.39-0.49,6-3.4,6-6.92s-2.61-6.43-6-6.92V4.07C17.95,4.56,21,7.92,21,12z'
downloadFileAsTitle=function (url, title,win,cb) {
    // Create a hidden anchor element
    const anchor = document.createElement('a');
    anchor.style.display = 'none';
    document.body.appendChild(anchor);

    // Fetch the file data
    return fetch(url)
        .then(response => response.blob())
        .then(blob => {
        // Create an object URL from the blob
        const objectUrl = URL.createObjectURL(blob);

        // Set anchor attributes
        anchor.href = objectUrl;
        anchor.download = title;
        anchor.target = '_blank';
        // Programmatically click the anchor element to trigger download
        anchor.click();

        // Clean up the object URL
        URL.revokeObjectURL(objectUrl);

        ;(win||opener||window).postMessage({url,title,s:true},'*');
        (typeof cb).includes('function')&&(cb());
    })
        .catch(error => {

        console.error('Error downloading file:', error);
        ;(win||opener||window).postMessage({url,title,s:false},'*')

    });
}
function downloadFile_(url, name) {
    // Create an 'a' element
    const a = document.createElement('a');

    // Set the 'href' attribute to the provided URL
    a.href = url;

    // Set the 'download' attribute to the provided name
    a.download = name;

    // Append the 'a' element to the document body
    document.body.appendChild(a);

    // Programmatically click the 'a' element to trigger the download
    a.click();

    // Remove the 'a' element from the document body
    document.body.removeChild(a);
}

query=function(a){
    return ((b)=>Object.keys(b).length?b:null)($(a)?$(a).length?$(a)[0]:$(a):null)
}
getElementByAttribute=function getElementByAttribute(label,item='aria-label',doc=document.body){
    var res=[];
    function part2(e){
        if(e.getAttribute(item)==label){
            res.push(e);
        }else{
            if(e.children.length){
                e=e.children;
                e.forEach=[].forEach;
                e.forEach(e2=>{
                    part2(e2);
                })
            }
        }
    };
    part2(doc);
    return res.length==1?res[0]:res||false;
}
get_aria_label=function(label,doc=document.body){
    var res=[];
    function part2(e){
        if(e.getAttribute('aria-label')==label){
            res.push(e);
        }else{
            if(e.children.length){
                e=e.children;
                e.forEach=[].forEach;
                e.forEach(e2=>{
                    part2(e2);
                })
            }
        }
    };
    part2(doc);
    return res[0]||false;
}
getClass=function(name_){
    return document.getElementsByClassName("ehlq8k34")[0]
}
;(function() {
    //'use strict';
    class element {
        static get br() {
            return new element("br");
        }
        constructor(name, obj) {
            //findhref2(id('skin-message'))[0].constructor.name

            this.element = name.constructor.name.includes('HTML')&&(name)||(function () {
                for (let i in arguments[1]) {
                    arguments[0].setAttribute(i, arguments[1][i]);
                }
                return arguments[0];
            })(document.createElement(arguments[0]), arguments[1]);
        }
        style(obj) {
            for (let i in obj) {
                this.element.style[i] = obj[i];
            }
            return this;
        }
        append(target,...targets) {
            this.element.append(target.element || target);
            console.log("T:",{targets,fe:targets&&targets.forEach})
            for(let i=0;i<targets.length;i++){
                let a=targets[i];
                console.log('Appending:',{element:a,target:this})
                this.element.append(a.element || a);
            }
            return this;
        }
        appendTo(target) {
            (target.element || typeof target=='string'?document.querySelector(target):target).append(this.element);
            return this;
        }
        on(event, a) {
            this.element[`on${event}`] = a;
            return this;
        }
        set(prop, value) {
            this.element[prop] = value;
            return this;
        }
        remove() {
            this.element.remove();
            return this;
        }
        get() {
            return this.element[arguments[0]];
        }
        get children() {
            return new (class $ {
                constructor(arr) {
                    for (var i = 0; i < arr.length; i += 1) {
                        this[i] = arr[i];
                    }

                    // length is readonly
                    Object.defineProperty(this, "length", {
                        get: function () {
                            return arr.length;
                        }
                    });

                    // a HTMLCollection is immutable
                    Object.freeze(this);
                }
                item(i) {
                    return this[i] != null ? this[i] : null;
                }
                namedItem(name) {
                    for (var i = 0; i < this.length; i += 1) {
                        if (this[i].id === name || this[i].name === name) {
                            return this[i];
                        }
                    }
                    return null;
                }
                get toArray() {
                    return [...this];
                }
            })([...this.element.children]);
        }
    }
    function getTikTokTittle(){
        try{
            return document.querySelector("#app > div.css-14dcx2q-DivBodyContainer.e1irlpdw0 > div:nth-child(4) > div > div.css-1qjw4dg-DivContentContainer.e1mecfx00 > div.css-1stfops-DivCommentContainer.ekjxngi0 > div > div.css-1xlna7p-DivProfileWrapper.ekjxngi4 > div.css-1u3jkat-DivDescriptionContentWrapper.e1mecfx011 > div.css-1nst91u-DivMainContent.e1mecfx01 > div.css-bs495z-DivWrapper.e1mzilcj0 > div > div.css-1d7krfw-DivOverflowContainer.e1mzilcj5 > h1").innerText.replace('Replying to ','')
        }catch{
            try{
                return document.querySelector("#app > div.css-14dcx2q-DivBodyContainer.e1irlpdw0 > div:nth-child(4) > div > div.css-1qjw4dg-DivContentContainer.e1mecfx00 > div.css-1stfops-DivCommentContainer.ekjxngi0 > div > div.css-1xlna7p-DivProfileWrapper.ekjxngi4 > div.css-1u3jkat-DivDescriptionContentWrapper.e1mecfx011 > div.css-1nst91u-DivMainContent.e1mecfx01 > div.css-bs495z-DivWrapper.e1mzilcj0").innerText.replace('Replying to ','')
            }catch(err){
                return document.querySelector("#main-content-video_detail > div > div.css-12kupwv-DivContentContainer.ege8lhx2 > div.css-1senhbu-DivLeftContainer.ege8lhx3 > div.css-1sb4dwc-DivPlayerContainer.eqrezik4 > div.css-3lfoqn-DivDescriptionContentWrapper-StyledDetailContentWrapper.eqrezik15 > div.css-r4nwrj-DivVideoInfoContainer.eqrezik3 > div.css-bs495z-DivWrapper.e1mzilcj0 > div > h1").innerText.replace('Replying to ','')
            }
        }
    }
    function sk(){
        get_aria_label('Why this ad?').click();
        setTimeout(()=>{
            document.querySelector("#yDmH0d > c-wiz > div > div > div:nth-child(2) > div.LLEp8b > div > div.rTq3hb > div:nth-child(1) > div > div.ofmULb > div:nth-child(2) > div > button").click();
            setTimeout(()=>{document.querySelector("#VGHGFf > div > div.Eddif > div:nth-child(2) > button > div.VfPpkd-RLmnJb").click();},1000)
        },1000)
    }
    setElement2=function (string){return string.match(/(?<host>https?\:\/\/www\.tiktok\.com)\/(?<username>@[^\/]+)\/video\/(?<videoID>\d+)/i).groups}
    var Porigin='https://onlymp3.app'
    var Ppath='/watch?='
    function ad(listener,f,autoDelete=false){
        var _=addEventListener(listener,(...__)=>{f(...__);if(autoDelete)removeEventListener(_)},true)
        return _
    }
    function isElementInViewport(el) {

        // Special bonus for those using jQuery
        if (typeof jQuery === "function" && el instanceof jQuery) {
            el = el[0];
        }

        var rect = el.getBoundingClientRect();

        return (
            rect.top >= 0 - (((window.innerHeight || document.documentElement.clientHeight) / 2)) &&
            rect.left >= 0 &&
            rect.bottom <= ((window.innerHeight || document.documentElement.clientHeight) + ((window.innerHeight || document.documentElement.clientHeight) / 2)) && /* or $(window).height() */
            rect.right <= (window.innerWidth || document.documentElement.clientWidth) /* or $(window).width() */
        );
    }
    function tF(f,{callback,int}){
        !callback&&(callback=function(){});!int&&(int=100)
        console.log({f,callback,int})
        try{f();callback();return}catch(err){}
        var _=setInterval(()=>{try{f();callback();clearInterval(_);}catch(err){}},int||100)
        return _
    }
    function isHidden(el) {
        return (el.offsetParent === null)
    }
    setElement = function(url) {
        return (String(url).match(/^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\?)|(shorts\/))\??v?=?([^#\&\?]*).*/)&&String(url).match(/^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\?)|(shorts\/))\??v?=?([^#\&\?]*).*/)[8].length==11)? String(url).match(/^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\?)|(shorts\/))\??v?=?([^#\&\?]*).*/)[8]: false;
    };
    findhref2=function (a,b){
        var res=[];

        function part2(e){
            if(e.tagName.toLowerCase()==(b||'a')){
                res.push(e);
                if(e.children.length){
                    e=e.children;
                    e.forEach=[].forEach;
                    e.forEach(e2=>{
                        part2(e2);
                    })
                }
            }else{
                if(e.children.length){
                    e=e.children;
                    e.forEach=[].forEach;
                    e.forEach(e2=>{
                        part2(e2);
                    })
                }
            }
        };
        part2(a);
        return res
    }
    function parent(node){return node.parentNode}
    getInstalImages=function(){
        return document.querySelectorAll('._acaz')
    }
    getInstaVideo=function(){
        return document.querySelector('video.x1lliihq')
    }
    function GP(){
        return get_aria_label('Go back')?get_aria_label('Go back').click?get_aria_label('Go back'):document.querySelector('._afxv'):document.querySelector('._afxv')
    }
    function GN(){
        return get_aria_label('Next')?get_aria_label('Next').click?get_aria_label('Next'):document.querySelector('._afxw'):document.querySelector('._afxw')
    }
    function getTitle(){
        try{return document.querySelector("div.x78zum5.xdt5ytf.x1iyjqo2.xs83m0k.x2lwn1j.x1odjw0f.x1n2onr6.x9ek82g.x6ikm8r.xdj266r.x11i5rnm.x4ii5y1.x1mh8g0r.xexx8yu.x1pi30zi.x18d9i69.x1swvt13 > ul > div:nth-child(3) > div > div").children[0].innerText.split('\n')[1]}catch{
            return [...document.querySelectorAll('.xt0psk2.xvs91rp.xo1l8bm.x5n08af.x18hxmgj')].pop().innerText.split('\n')[0]
        }
    }
    downloadVideoFromBlob=function (videoElement,title) {
        if (videoElement && videoElement.src && videoElement.src.startsWith('blob:')) {
            // Create a MediaStream from the video element
            const stream = videoElement.captureStream();
            const mediaRecorder = new MediaRecorder(stream);
            const chunks = [];

            // Capture data when available
            mediaRecorder.ondataavailable = event => {
                if (event.data.size > 0) {
                    chunks.push(event.data);
                    console.log(event.data)
                }
            };

            // When the recording stops, create a download link
            mediaRecorder.onstop = () => {
                const blob = new Blob(chunks, { type: 'video/mp4' });
                const url = URL.createObjectURL(blob);
                const a = document.createElement('a');
                a.style.display = 'none';
                a.href = url;
                a.download = title+'.mp4';
                document.body.appendChild(a);
                a.click();
                document.body.removeChild(a);
                URL.revokeObjectURL(url);
            };

            // Start recording
            mediaRecorder.start();

            // Stop recording after the video duration
            setTimeout(() => {
                mediaRecorder.stop();
            }, videoElement.duration * 1000);
        } else {
            console.error('Invalid video element or source.');
        }
    }
    function DIV(){
        if(location.href.includes('reel')){
            let _=open('https://fastdl.app/en',location.href,`width=400,height=500`)
            var listener=GM_addValueChangeListener('instaURL',function(a,b,c,d){
                if(!!c){
                    console.log('Got',{a,b,c,d})
                    _.close()
                    GM_removeValueChangeListener(listener)
                    downloadFile_(c,document.title+'.mp4')
                    GM_setValue('instaURL',null)
                }
            })
        }
        //downloadVideoFromBlob(getInstaVideo(),getTitle())
    }
    async function DII_(){
        var sleep=(a)=>new Promise(b=>setTimeout(b,a))
        var srcs=new Set(),obj={}
        while(GP()){
            await sleep(100)
            if(GP())GP().click()
            else {
                await sleep(1000)
                break;
            };
        }
        var length=[...srcs].length
        ;[...getInstalImages()].forEach(e=>{
            let a=findhref2(e,'img')[0]
            srcs.add([a.src,a.getAttribute('alt')])
        })
        GN().click()
        try{GN().click()}catch(err){}

        while(GN()){
            await sleep(300)
            ;;[...getInstalImages()].forEach(e=>{
                let a=findhref2(e,'img')[0]
                srcs.add([a.src,a.getAttribute('alt')])
            })
            try{GN().click()}catch(err){}
            length=[...srcs].length
        }
        while(true){
            await sleep(100)
            if(GP())GP().click()
            else break;
        }
        ;[...srcs].forEach(e=>{
            obj[e[0]]=e[1]
        });
        srcs=Object.keys(obj).map(e=>({src:e,name:obj[e]}));
        srcs.forEach(e=>{
            var ext=new URL(e.src).pathname.split('.').pop()
            downloadFileAsTitle(e.src,`${e.name}.${ext}`)
        })
        console.log('done',srcs)
    }
    function DII(){
        DII_().then(console.log,console.warn)
    }
    if(document.domain=='fastdl.app'){
        onload=async function(){
            async function wfs(a){
                while(!document.querySelector(a))await sleep(0);
                return document.querySelector(a)
            }
            function DAIE(target, value) {
                const inputEvents = ['focus', 'input', 'change', 'blur'];

                inputEvents.forEach(eventName => {
                    let ev=new Event(eventName, { bubbles: true, isTrusted: true })
                    if(target[`on${eventName}`])target[`on${eventName}`](ev)

                    if (eventName === 'input') {
                        target.value = value;
                    }
                    target.dispatchEvent(ev);
                });
            }
            const info={
                url:name,
                input:null
            }
            var cancel=false
            const sleep=ms=>new Promise(a=>setTimeout(a,ms))
            var timeOut=setTimeout(()=>{
                cancel=true
            },20000)
            while(!document.querySelector('#search-form-input')){
                await sleep(0)
                if(cancel)throw "Cant find input"
            }
            info.input=document.querySelector('#search-form-input')
            console.log('Found a')
            DAIE(info.input,info.url);
            document.querySelector('.search-form__button').click()
            GM_setValue('instaURL',await wfs('.button--filled').then(e=>e.href))
        }
    }
    else if(document.domain=='www.instagram.com'){
        var int;
        function setButtons(){
            console.log('Appended buttons man')
            var container=new element(document.querySelectorAll('.xh8yej3.x1iyjqo2')[0])
            var button=new element('button',{id:"MediaButton"}).set('innerText','Get Images').on('click',DII)
            var button2=new element('button',{id:"MediaButton2"}).set('innerText','Get Videos').on('click',DIV)
            container.append(button,button2)
        }
        function setButtons2(){
            var container=new element(document.querySelector('._aaqy'))
            var button=new element('button',{id:"MediaButton"}).set('innerText','Get Images').on('click',DII)
            var button2=new element('button',{id:"MediaButton2"}).set('innerText','Get Videos').on('click',DIV)
            container.append(button,button2)
        }
        tF(function(){
            document.querySelectorAll('.xh8yej3.x1iyjqo2')[0].children
        },{callback:function(){
            setButtons();
            setInterval(()=>{
                if(!document.querySelector('#MediaButton'))setButtons()
                if(document.querySelector('._aaqy')&&!document.querySelector('._aaqy').querySelector('#MediaButton'))setButtons2();
            })
        }})
        console.log('Insta ballz')
        return
    }
    function getIds(){
        if(document.domain.includes("music")){alert('These button dont work on youtube music yet');throw "."}
        var list=[...document.getElementsByTagName('ytd-playlist-panel-renderer')].filter(isElementInViewport).filter(e=>!isHidden(e))[0]
        var ids=findhref2(list,'span').filter(e=>!isHidden(e)).filter(isElementInViewport).filter(e=>e.id=='video-title').map(parent).map(parent).map(e=>({id:setElement(findhref2(parent(e))[0].href),e}))
        return ids
    }
    _getIds=getIds
    info={}
    downloadT=function(id,force=false,useT=true,mp4=false,manual=false){
        let _=id+(mp4?"mp4":"mp3") + useT
        if((localStorage[_])&&!force&&(manual?!confirm(`You have already download this video as .${mp4?"mp4":"mp3"}\nStill download?`):true))return;
        var video={}
        var hash=`#url=https://www.youtube.com/watch?v=${id}`
        ad('unload',function(){info[id].close()},true)
        onmessage=function(e){
            if(e.origin==Porigin||e.origin.match(/https?:\/{2}onlymp3\.to/)||e.origin.match(/https?:\/{2}en\.onlymp3\.to/)||e.origin.match(/https?:\/{2}en(\d)\.onlinevideoconverter\.pro/)||e.origin=='https://sss.instasaverpro.com'){
                const {data:{href,title,length,id}}=e
                console.log('Handled',{href,title,length,id},e)
                //info[id].close()
                if(useT){
                    var a=document.createElement('a')
                    a.download=title+'.mp4'
                    a.href=href
                    //a.target='_blank'
                    document.body.appendChild(a)
                    a.click()
                    a.remove();
                }
                else open(href);
                localStorage[_]=href
            }else console.log('Unhandled Post',e)
        }
        //`https://downvideo.quora-wiki.com/tiktok-video-downloader#url=https://www.youtube.com/watch?v=${id}`
        var o=new URL(location.href)
        o.host=o.host.replace('.com','mz.com');
        //open([o.protocol,'//',o.host,o.pathname,'?v=',setElement(location.href)].join(''))
        return info[id]=mp4?
            open(location.pathname.startsWith('/shorts/')?"https://yt5s.biz/enxj100/":'https://en3.onlinevideoconverter.pro/112Ei/youtube-downloader-mp4',[id,location.pathname.startsWith('/shorts/')?1:0,mp4+false],`width=400,height=500`)
        :open([o.protocol,'//',o.host,o.pathname,'?v=',id].join(''),[id,location.pathname.startsWith('/shorts/')?1:0],`width=400,height=500`)
    }
    downloadTikTok=function(mp4,info){
        let id=info.videoID
        let user=info.username
        let title_=getTikTokTittle()
        var tiktikWin
        onmessage=function(e){
            if(e.origin==Porigin||e.origin.match(/https?:\/{2}savetik\.csavetik.coo/)||e.origin.match(/https?:\/{2}en\.onlymp3\.to/)||e.origin.match(/https?:\/{2}en(\d)\.onlinevideoconverter\.pro/)||e.origin=="https://savetik.co"){
                var {data:{href,links,title,length,id,mp4,info:{username}}}=e
                console.log('Handled',{href,title,length,id,links,mp4},e)
                //info[id].close()
                if(e.origin=="https://savetik.co"){
                    title=title_
                    downloadFileAsTitle(mp4?links[0]:links.pop(),username+" - "+title+(mp4?'.mp4':".mp3"),tiktikWin)
                }else{
                    if(useT){
                        let a=document.createElement('a')
                        a.download=title+'.mp3'
                        a.href=href
                        document.body.appendChild(a)
                        a.click()
                        a.remove();
                    }
                    else open(href);
                    localStorage[_]=href
                }
            }else console.log('Unhandled Post',e)
        }
        tiktikWin=open("https://savetik.co/en",[`https://www.tiktok.com/${user}/video/${id}`,mp4+false],`width=400,height=500`)
    }
    function abc(label, item = 'aria-label', doc = document.body) {
        var res = [];
        function part2(e) {
            var found=false
            if (!item) {
                [...e.attributes].map(e => {
                    const { name, value } = e;
                    return { name, value }
                }).filter(e => e.value == label).length ? (res.push(e),found=1) : null
            } else if (e.getAttribute(item) == label) {
                res.push(e);found=1;
            }
            if (e.children.length&&!found) {
                e = e.children;
                e.forEach = [].forEach;
                e.forEach(e2 => {
                    part2(e2);
                })
            }
        };
        part2(doc);
        return res.length?res.length == 1 ? res[0] : res || false :null
    }
    abc_=abc
    function getElementByAttribute(label,item='aria-label',doc=document.body){
        var res=[];
        function part2(e){
            if(e.getAttribute(item)==label){
                res.push(e);
            }else{
                if(e.children.length){
                    e=e.children;
                    e.forEach=[].forEach;
                    e.forEach(e2=>{
                        part2(e2);
                    })
                }
            }
        };
        part2(doc);
        return res.length==1?res[0]:res||false;
    }
    function mtoggle(){document.querySelector('.ytp-volume-area > .ytp-mute-button').click()}
    function Mute(){
        (abc('Mute','title')&&(abc('Mute','title')[0])||abc('Mute (m)','title')).click()
    }
    function Unmute(){
        ((query('#right-controls')&&query('#right-controls').querySelectorAll('path')[0].getAttribute('d')==UnmutePath&&(abc('Mute','title')[0]))||abc('Unmute','title')||abc('Unmute (m)','title')).click()
    }
    M=Mute
    Um=Unmute
    var didmute=0
    function ch3(i){
        if(!i){
            return false
        }else{
            if(!i.closed){
                return true
            }else{
                return false
            }
        }
    }
    window.ch3=ch3;
    async function getWin(list=[
        ['w1','win1'],
        ['w2','win2'],
        ['w3','win3'],
        ['w4','win4']
    ])
    {
        var e=false;
        var f
        await new Promise((g,h)=>{
            var i=setInterval(j=>{
                list.forEach(k=>{
                    this[k[0]]=ch3(window[k[1]])
                    if(!window[k[1]]&&!e){e=true;f=k[1];console.log(k)}
                })
                if(f){
                    g(f);
                    clearInterval(i)
                }
            },500);
        });
        return f
    };
    window.getWin=getWin
    function WIP(hmpd,mp4,force){
        if(!hmpd);
        var ids=_getIds()
        var list=[]
        for(let i=0;i<hmpd;i++){
            list.push(['w'+i,'win'+i])
        }
        ids.forEach(({id},index)=>{
            getWin(
                list
            ).then(b=>{
                if((info[id]||localStorage[id])&&!force)return;
                console.log('download',id,index)
                window[b]=downloadT(id,force,true,!!mp4)
                window.addEventListener('unload',function(e){window[b].close()})
                var rr=setInterval(e=>{
                    if(!window[b] || window[b].closed){window[b]=null;clearInterval(rr);console.log(b,'isclosed')}
                },300);
            })
        })
    }
    WIP_=WIP
    var button = (new element('button')).set("innerText","Get MP3").on('click',function(e){downloadT(setElement(location.href),true,true,false,true)})
    var button2 = (new element('button')).set("innerText","Get MP4").on('click',function(e){downloadT(setElement(location.href),true,true,true,true)})
    var button3 = (new element('button')).set("innerText","PlayList MP3").on('click',function(e){WIP_(2,false,false)})
    var button4 = (new element('button')).set("innerText","PlayList MP4").on('click',function(e){WIP_(2,true,false)})
    var tiktokButton=(new element('button')).set("innerText","Get MP4").on('click',function(e){downloadTikTok(true,setElement2(getClass("ehlq8k34")?getClass("ehlq8k34").innerText:location.href))})
    var tiktokButton3=(new element('button',{id:"tt1"})).set("innerText","Get MP4").on('click',function(e){downloadTikTok(true,setElement2(getClass("ehlq8k34")?getClass("ehlq8k34").innerText:location.href))})
    var tiktokButton2=(new element('button')).set("innerText","Get MP3").on('click',function(e){
        downloadTikTok(false,setElement2(getClass("ehlq8k34")?getClass("ehlq8k34").innerText:location.href))
    })
    function _ex_(){
        return query('#end')||query('#right-content')
    }
    function appendButtons(){
        const MainButtonContainer=_ex_()
        button.appendTo(MainButtonContainer)
        button2.appendTo(MainButtonContainer)
        console.log('Posted Buttons')
        function _ex(){
            try{

                if([...document.querySelectorAll('#header-description')].filter(isElementInViewport).filter(e=>!isHidden(e))[0]||query('.autoplay'))//.children[0].children[0].children[0].children[1].children[0].children[0].children[0].children[0]
                    return [...document.querySelectorAll('#header-description')].filter(isElementInViewport).filter(e=>!isHidden(e))[0]||query('.autoplay')
                else return false
            }
            catch(err){
                return false
            }
        }
        var exist=false
        setInterval(()=>{
            if(exist!=_ex() && _ex()){
                console.log("Added playlist buttons")
                setTimeout(()=>{
                    _ex().append(element.br.element);
                    _ex().append(button3.element);
                    _ex().append(button4.element)
                },100)
            }else
                if(exist!=_ex() && !_ex()){
                    console.log("buttons are gone?!?!")
                }
            exist=_ex()
        },100)
    }
    a1=[
        ["youtube",function(){tF(function(){if(!_ex_()) throw "Cant append buttons yet";return true},{callback:appendButtons})}],
        ["tiktok",function(){
            addEventListener("load",function(){
                tF(function(){

                    if(!abc_('browse-copy','data-e2e'))throw "Cant Append";
                    tiktokButton.appendTo(document.querySelectorAll('.e1mecfx011'))
                    tiktokButton2.appendTo(document.querySelectorAll('.e1mecfx011'))
                },{callback:function(){}})
                tF(function(){
                    if(!document.getElementsByClassName("e13wiwn60")[0])throw "Cant Append";
                    tiktokButton.appendTo(document.getElementsByClassName("e13wiwn60")[0])
                    tiktokButton2.appendTo(document.getElementsByClassName("e13wiwn60")[0])
                    console.log('Posted Buttons')
                    function _ex(){
                        try{

                            if(abc_('browse-copy','data-e2e').parentNode)//.children[0].children[0].children[0].children[1].children[0].children[0].children[0].children[0]
                                return abc_('browse-copy','data-e2e').parentNode
                            else return false
                        }
                        catch(err){
                            return false
                        }
                    }
                    var exist=false
                    setInterval(()=>{
                        if(exist!=_ex() && _ex()){
                            console.log("Added playlist buttons")
                            setTimeout(()=>{
                                _ex().append(element.br.element);
                                _ex().append(tiktokButton.element);
                                _ex().append(tiktokButton2.element)
                            },100)
                        }else
                            if(exist!=_ex() && !_ex()){
                                console.log("buttons are gone?!?!")
                            }
                        exist=_ex()
                    },100)

                },{callback:function(){}})
            })
        }]
    ].filter(e=>location.host.includes(e[0]))[0];a1&&a1[1]&&(a1[1]());delete a1;
    if(location.href.includes('onlymp3.app')||location.href.includes('onlymp3.to')){
        console.log('onlymp3.app')
        let callback=function(){};
        function b_(){
            var [id,shorts]=name.split(',')
            txtUrl.value=`https://www.youtube.com/${shorts=="1"?"shorts/":"watch?v="}${id}`
            getListFormats();
        }
        function a_(){
            var a=videoTitle.innerText.split('\n'),
                l=a.map(e=>e.match(/[:\d]+/gi)).filter(e=>!!e).pop().pop(),
                t=a[0].split('Title: ')[1],
                h=findhref2(videoTitle.parentNode)[0].href,
                f={
                    id:setElement(location.href),
                    href:h,
                    title:t
                    ,length:l
                };
            (opener||window).postMessage(f,'*')
            console.log('Poasted')
        }
        setInterval(()=>{
            if(document.getElementById('error-text').innerText.length>5)location.reload();
        },20000)
        console.log('Getting MP3')
        tF(function(f=function(){}){
            b_()
            tF(function(f=function(){}){
                a_()
            },{callback:close})
        },{callback:function(){}})
        return
    }
    if(location.href.includes("www.yt2conv.com")){
        console.log('Getting MP4')
        let [id,shorts]=name.split(',')
        tF(function(f=function(){}){
            var input=document.getElementById('search_txt')
            input.value=`https://www.youtube.com/${shorts=="1"?"shorts/":"watch?v="}${id}`
            document.getElementById('btn-submit').click()
            console.log(id,shorts)
        },{callback:function(){}})
        tF(function(f=function(){}){
            console.log(result.children.length)
            if(!result.children.length){document.getElementById('btn-submit').click();throw "no there"}
        },{int:1000,callback:function(){}})
        tF(function(){
            document.getElementById('btn-download').click()
        },{callback:function(){}})
        tF(function(){
            var title=$('.media-heading')[0].innerText
            var href=downloadbtn.href
            var f={id,href,title,length:{}};
            console.log('Posted')
            ;(opener||window).postMessage(f,'*')
        },{callback:close})
    }
    if(location.href.includes('yt5s.biz')){
        async function wfs(s){
            while(!document.querySelector(s)){
                await sleep(0)
            }
            return true
        }
        !async function(){
            let [id,shorts]=name.split(',')
            if(id.length&&shorts.length){}else return console.warn('No info Preset')
            var YTurl=`https://www.youtube.com/${shorts=="1"?"shorts/":"watch?v="}${id}`
            await wfs('#txt-url')
            console.log('Input Loaded')
            document.querySelector('#txt-url').value=YTurl
            await wfs('#btn-submit')
            console.log('GEtting res')
            await sleep(100)
            document.querySelector('#btn-submit').click()
            await wfs('#video_title')
            console.log('Got Res')
            var title=document.querySelector('#video_title').innerText
            var maxres=[0]
            ;[...document.querySelector('#result').querySelector('table').querySelectorAll('tr')].forEach(e=>{
                var res=e.innerText.match(/(?<res>\d+)(p|P)/i)||{}
                if(res.groups){
                    res=Number(res.groups.res)
                    if(maxres[0]<res)maxres[0]=res,maxres[1]=findhref2(e)[0].href,maxres[2]=e
                }
            })
            return {id,title,href:maxres[1],mp4:true,res:maxres[0]}
        }().then(function(e){
            ;(opener||window).postMessage(e,'*')
            location.href=e.href
        },console.warn)
    }
    if(location.href.includes("sss.instasaverpro.com")){
        !async function(){
            async function wfs(s){
                while(!document.querySelector(s)){
                    await sleep(0)
                }
                return true
            }
            await wfs('#A_downloadUrl')
            while(!document.querySelector('#A_downloadUrl').href.length)(await sleep(0));
            console.log('Done')
            var title=document.querySelector('#myModalLabel').innerText
            var e={href:document.querySelector('#A_downloadUrl').href,title}
            ;(opener||window).postMessage(e,'*')
        }().then(close,console.warn)
    }
    if(location.href.includes("en3.onlinevideoconverter.pro")){
        let [id,shorts]=name.split(',')
        if(id.length&&shorts.length){}else return console.Warn('NO info Preset')
        var YTurl=`https://www.youtube.com/${shorts=="1"?"shorts/":"watch?v="}${id}`
        let callback=function(){};
        tF(function(f=function(){}){
            var input=document.getElementById('texturl')
            input.value=`https://www.youtube.com/${shorts=="1"?"shorts/":"watch?v="}${id}`
            document.getElementById('convert1').click()
            console.log('Searched')
        },{callback})
        tF(function(){
            if(stepProcess.style.display=='none'){
                document.getElementById('convert1').click()
                throw "this"
            }
            console.log('Searching')
        },{callback})
        tF(function(){
            if(document.getElementById('form-app-root').children.length==0)throw ""
            console.log('loaded')
            var{title,href}=$('#download-720-MP4')?$('#download-720-MP4')[0]?$('#download-720-MP4')[0]:$('#download-720-MP4'):$('#download-720-MP4')
            var f={id,href,title,length:{}};
            console.log('Posted')
            ;(opener||window).postMessage(f,'*')
        },{callback:close})

    }
    if(location.href.includes("savetik.co")){
        var [id,mp4]=name.split(",")
        addEventListener("load",function(){
            tF(function(){
                s_input.value=id
                ksearchvideo()
                setTimeout(ksearchvideo,1000)
            },{callback(){}})
        })
        function Fin(){
            console.log("Found")
            let title=document.getElementsByClassName("clearfix")[0].innerText
            let links=findhref2(document.getElementsByClassName("tik-video")[0]).map(e=>e.href)
            let f={title,links,mp4:mp4==1,info:setElement2(id)}
            let Porigin='https://www.tiktok.com'
            onmessage=function(e){
                if(e.origin==Porigin){
                    var {data:{s,url,title}}=e
                    console.log('Handled',{s,url,title},e)
                    if(!s){
                        downloadFileAsTitle(url,title,null,close)
                    }else setTimeout(close,100)
                    //info[id].close()
                }else console.log('Unhandled Post',e)
            }
            ;(opener||window).postMessage(f,'*')
            //setTimeout(close,100)
        }

        tF(function(){document.getElementsByClassName("clearfix")[0].innerText;Fin()},{callback(){}})
    }
    if(document.domain.includes('music')){
        console.log('Added MiniPlayer Toggle with I')
        addEventListener('keypress',function({isTrusted,ctrlKey,shiftKey,code,target,target:{tagName}}){
            if(!['INPUT','TEXTAREA'].includes(tagName)&&!ctrlKey&&!shiftKey&&isTrusted&&code=='KeyI'){
                (abc_('Close player page')||abc_('Open player page')[1]).click()
            }
        })
    }
    setInterval(e=>{
        document.getElementsByClassName("ytp-ad-button-icon")[0]&&!didmute&&(console.log('muted ad'),didmute=1,Mute());
        !document.getElementsByClassName("ytp-ad-button-icon")[0]&&didmute&&(console.log('unmuted video'),!function(){try{Unmute()}catch(err){console.warn('Failed unmuting')}}(),didmute=0);
        ;([...document.querySelectorAll('#song-video'),...document.querySelectorAll('#ytd-player')].map(p=>[...p.querySelectorAll('button')].filter(e=>e.className.includes('skip'))[0]).filter(e=>!!e)[0]&&([...document.querySelectorAll('#song-video'),...document.querySelectorAll('#ytd-player')].map(p=>[...p.querySelectorAll('button')].filter(e=>e.className.includes('skip'))[0]).filter(e=>!!e)[0].click(),console.log('Skipped d :>')))
        document.getElementsByClassName('ytp-ad-overlay-close-button')[2]&&(document.getElementsByClassName('ytp-ad-overlay-close-button')[2].click(),console.log('Close ad card'))
    },10)
})();