Greasy Fork is available in English.

Pikpak エンハンス

Violentmonkey スクリプト

このスクリプトの質問や評価の投稿はこちら通報はこちらへお寄せください。
// ==UserScript==
// @name        Pikpak Enhance
// @name:en     Pikpak Enhance
// @name:zh-CN  Pikpak 增强
// @name:zh-TW  Pikpak 增強
// @name:ja     Pikpak エンハンス
// @name:ko     Pikpak 개선
// @name:de     Pikpak Verbessern
// @name:fr     Pikpak Améliorer
// @name:es     Mejora de Pikpak
// @name:pt     Aumentar o pikpak
// @name:ru     Pikpak Улучшить
// @name:it     Miglioramento di Pikpak
// @name:tr     Pikpak Geliştirmek
// @name:ar     تعزيز Pikpak
// @name:th     Pikpak เสริม
// @name:vi     Nâng cao Pikpak
// @name:id     Tingkatkan Pikpak
// @namespace   Violentmonkey Scripts
// @match       *://mypikpak.com/drive/*
// @version     XiaoYing_2024.09.12.1
// @grant       GM_info
// @grant       GM_getValue
// @grant       GM_setValue
// @grant       GM_addStyle
// @grant       GM_deleteValue
// @grant       GM_xmlhttpRequest
// @grant       GM_setClipboard
// @grant       GM_registerMenuCommand
// @grant       GM_unregisterMenuCommand
// @grant       GM_getResourceText
// @grant       GM_getResourceURL
// @grant       GM_openInTab
// @grant       unsafeWindow
// @run-at      document-start
// @author      github.com @XiaoYingYo
// @require     https://greasyfork.org/scripts/464929-module-jquery-xiaoying/code/module_jquery_XiaoYing.js
// @require     https://greasyfork.org/scripts/464780-global-module/code/global_module.js
// @require     https://greasyfork.org/scripts/465483-hookfetch/code/hookFetch.js
// @description Violentmonkey Scripts
// @description:en Violentmonkey Scripts
// @description:zh-CN Violentmonkey 脚本
// @description:zh-TW Violentmonkey 腳本
// @description:ja Violentmonkey スクリプト
// @description:ko Violentmonkey 스크립트
// @description:de Violentmonkey Skripte
// @description:fr Violentmonkey Scripts
// @description:es Violentmonkey Scripts
// @description:pt Violentmonkey Scripts
// @description:ru Violentmonkey Сценарии
// @description:it Violentmonkey Scripts
// @description:tr Violentmonkey Scripts
// @description:ar Violentmonkey Scripts
// @description:th Violentmonkey Scripts
// @description:vi Violentmonkey Scripts
// @description:id Violentmonkey Scripts
// ==/UserScript==

var GlobalVariable = {};

async function DealWithoverlay(i, callback) {
    return new Promise(async (resolve) => {
        let overlay = await global_module.waitForElement('div.el-overlay:not([style*="display"])', null, null, 100, 3 * 1000);
        if (overlay.length === 0) {
            resolve();
            return;
        }
        let Target = null;
        if (i != null) {
            switch (i) {
                case 0:
                    Target = overlay.find('button[class*="is-text"]').eq(0);
                    break;
                case 1:
                    Target = overlay.find('button[class*="--primary"]').eq(0);
                    break;
                case 2:
                    Target = overlay.find('label[class^="el-checkbox"]').eq(0);
                    break;
            }
        }
        if (typeof callback == 'function') {
            callback(overlay, Target);
        } else {
            if (Target != null) {
                Target.click();
            }
            overlay.hide();
        }
        resolve();
    });
}

async function LiClick() {
    let activeLiHref = GlobalVariable.activeLi.attr('href');
    let that = $(this).find('a').eq(0);
    let thisHref = that.attr('href');
    if (activeLiHref == thisHref) {
        return;
    }
    GlobalVariable.activeLi = that;
    clearInterval(GlobalVariable.FindLiActiveInterval);
    $('ul[class^="context-menu"]').remove();
    await new Promise((resolve) => {
        GlobalVariable.FindLiActiveInterval = setInterval(() => {
            if (that.attr('class').indexOf('active') != -1) {
                clearInterval(GlobalVariable.FindLiActiveInterval);
                resolve();
            }
        }, 100);
    });
    MonitorMenu();
}

GlobalVariable.MonitorMenuClickFun = global_module.debounce(MonitorMenuClick, 100);
GlobalVariable.InterfacelanguageList = ['en', 'zh-CN', 'zh-TW', 'ja', 'ko', 'de', 'fr', 'es', 'pt', 'ru', 'it', 'tr', 'ar', 'th', 'vi', 'id'];
GlobalVariable.Navigatorlanguage = GlobalVariable.InterfacelanguageList.indexOf(navigator.language) != -1 ? navigator.language : 'en';
GlobalVariable.Pikpaklanguage = localStorage.getItem('pp_locale') || 'en';
GlobalVariable.Interfacelanguage = {
    login: {
        '001': {
            en: 'preferred use Sign in or Register with Email',
            'zh-CN': '首选使用邮箱登录或注册',
            'zh-TW': '首選使用郵箱登錄或註冊',
            ja: 'メールでログインまたは登録することを好む',
            ko: '이메일로 로그인 또는 등록하는 것을 선호합니다',
            de: 'Bevorzugte Anmeldung oder Registrierung per E-Mail',
            fr: 'Préférez-vous vous connecter ou vous inscrire par e-mail',
            es: 'Preferencia para iniciar sesión o registrarse con correo electrónico',
            pt: 'Preferência para fazer login ou registrar com e-mail',
            ru: 'Предпочтительный вход или регистрация по электронной почте',
            it: 'Preferenza per accedere o registrarsi con e-mail',
            tr: 'E-posta ile oturum açın veya kaydolun',
            ar: 'تفضيل تسجيل الدخول أو التسجيل باستخدام البريد الإلكتروني',
            th: 'การเข้าสู่ระบบหรือลงทะเบียนด้วยอีเมลที่ต้องการ',
            vi: 'Ưu tiên sử dụng Đăng nhập hoặc Đăng ký bằng Email',
            id: 'Pilihan untuk masuk atau mendaftar dengan email'
        },
        '002': {
            en: 'Enter your email address and password here to automatically try to log in',
            'zh-CN': '在此输入您的电子邮件地址和密码,以自动尝试登录',
            'zh-TW': '在此輸入您的電子郵件地址和密碼,以自動嘗試登錄',
            ja: 'ここにメールアドレスとパスワードを入力して、自動的にログインを試みます',
            ko: '이메일 주소와 비밀번호를 입력하여 자동으로 로그인하십시오',
            de: 'Geben Sie hier Ihre E-Mail-Adresse und Ihr Passwort ein, um sich automatisch anzumelden',
            fr: 'Entrez votre adresse e-mail et votre mot de passe ici pour vous connecter automatiquement',
            es: 'Ingrese su dirección de correo electrónico y contraseña aquí para iniciar sesión automáticamente',
            pt: 'Insira seu endereço de e-mail e senha aqui para fazer login automaticamente',
            ru: 'Введите здесь свой адрес электронной почты и пароль, чтобы автоматически войти в систему',
            it: 'Inserisci qui il tuo indirizzo email e la tua password per accedere automaticamente',
            tr: 'E-posta adresinizi ve şifrenizi buraya girin ve otomatik olarak oturum açmaya çalışın',
            ar: 'أدخل عنوان بريدك الإلكتروني وكلمة المرور هنا للمحاولة تسجيل الدخول تلقائيًا',
            th: 'ป้อนที่อยู่อีเมลและรหัสผ่านของคุณที่นี่เพื่อล็อกอินโดยอัตโนมัติ',
            vi: 'Nhập địa chỉ email và mật khẩu của bạn ở đây để tự động đăng nhập',
            id: 'Masukkan alamat email dan kata sandi Anda di sini untuk masuk secara otomatis'
        },
        '003': {
            en: 'Register new account with one click and log in immediately',
            'zh-CN': '一键注册新的账号并立即登录',
            'zh-TW': '一鍵註冊新的賬號並立即登錄',
            ja: 'ワンクリックで新しいアカウントを登録してすぐにログインする',
            ko: '한 번의 클릭으로 새 계정을 등록하고 즉시 로그인하십시오',
            de: 'Registrieren Sie ein neues Konto mit einem Klick und melden Sie sich sofort an',
            fr: 'Enregistrez un nouveau compte en un clic et connectez-vous immédiatement',
            es: 'Registre una nueva cuenta con un clic e inicie sesión de inmediato',
            pt: 'Registre uma nova conta com um clique e faça login imediatamente',
            ru: 'Зарегистрируйте новую учетную запись одним щелчком и войдите в систему немедленно',
            it: 'Registra un nuovo account con un clic e accedi immediatamente',
            tr: 'Bir tıklamayla yeni bir hesabı kaydedin ve hemen oturum açın',
            ar: 'سجل حساب جديد بنقرة واحدة وسجل الدخول على الفور',
            th: 'ลงทะเบียนบัญชี ใหม่ด้วยคลิกเดียวและเข้าสู่ระบบทันที',
            vi: 'Đăng ký tài khoản mới chỉ với một cú nhấp chuột và đăng nhập ngay lập tức',
            id: 'Daftar akun baru dengan satu klik dan masuk segera'
        }
    },
    main: {
        '001': {
            en: 'Auto confirm all delete tasks',
            'zh-CN': '自动确认全部删除任务',
            'zh-TW': '自動確認全部刪除任務',
            ja: 'すべての削除タスクを自動確認する',
            ko: '모든 삭제 작업 자동 확인',
            de: 'Alle Löschvorgänge automatisch bestätigen',
            fr: 'Confirmer automatiquement toutes les tâches de suppression',
            es: 'Confirmar automáticamente todas las tareas de eliminación',
            pt: 'Confirmar automaticamente todas as tarefas de exclusão',
            ru: 'Автоматически подтверждать все задачи на удаление',
            it: 'Conferma automaticamente tutti i compiti di eliminazione',
            tr: 'Tüm silme görevlerini otomatik olarak onaylayın',
            ar: 'تأكيد جميع مهام الحذف تلقائيًا',
            th: 'ยืนยันงานลบทั้งหมดโดยอัตโนมัติ',
            vi: 'Tự động xác nhận tất cả các tác vụ xóa',
            id: 'Konfirmasi otomatis semua tugas penghapusan'
        }
    }
};

async function MonitorMenuClick() {
    let Download = GlobalVariable.language['download'];
    let Delete = GlobalVariable.language['i18n-delete'];
    let DeletePermanently = GlobalVariable.language['delete-permanently'];
    let DownloadElement = GlobalVariable.menu.find('li[aria-label="' + Download + '"]').eq(0);
    let DeleteElement = GlobalVariable.menu.find('li[aria-label="' + Delete + '"]').eq(0);
    let DeletePermanentlyElement = GlobalVariable.menu.find('li[aria-label="' + DeletePermanently + '"]').eq(0);
    if (DownloadElement.length != 0) {
        DownloadElement.on('click', () => {
            DealWithoverlay(0);
        });
    }
    if (DeleteElement.length != 0) {
        DeleteElement.on('click', () => {
            DealWithoverlay(1);
        });
    }
    if (DeletePermanentlyElement.length != 0) {
        DeletePermanentlyElement.on('click', () => {
            DealWithoverlay(1);
        });
    }
}

async function MonitorMenu() {
    let menu = await global_module.waitForElement('ul[class^="context-menu"]', null, null, 100);
    if (menu.html() != '') {
        return;
    }
    GlobalVariable.menu = menu;
    $(menu).on('DOMSubtreeModified', GlobalVariable.MonitorMenuClickFun);
}

function FindStr(obj) {
    global_module.objectDepthEnumerate(obj, function (key, obj) {
        if (key == null) {
            return false;
        }
        if (typeof obj === 'function') {
            let scriptStr = obj.toString();
            if (scriptStr.indexOf('.exports=JSON.parse') != -1 && GlobalVariable['allFileText'] && scriptStr.indexOf(GlobalVariable['allFileText']) != -1) {
                let index = scriptStr.indexOf('.exports=JSON.parse') - 1;
                let char = scriptStr[index];
                scriptStr = scriptStr.replace(char + '.exports=', 'window["__language__"]=');
                scriptStr = '(' + scriptStr + ')()';
                let func = new Function(scriptStr);
                func();
                GlobalVariable.language = unsafeWindow.__language__;
                unsafeWindow.GlobalVariable = GlobalVariable;
                return true;
            }
        }
        return false;
    });
}

GlobalVariable.registerEdMenu = [];

function OverloadMenu() {
    for (let i = 0; i < GlobalVariable.registerEdMenu.length; i++) {
        GM_unregisterMenuCommand(GlobalVariable.registerEdMenu[i]);
    }
    let L001 = GlobalVariable.Interfacelanguage['login']['001'][GlobalVariable.Navigatorlanguage];
    let V001 = GM_getValue('loginForEmail', false) ? '√' : '×';
    GlobalVariable.registerEdMenu.push(
        GM_registerMenuCommand(L001 + ' ' + V001, () => {
            GM_setValue('loginForEmail', !GM_getValue('loginForEmail', false));
            OverloadMenu();
        })
    );
    let L002 = GlobalVariable.Interfacelanguage['main']['001'][GlobalVariable.Navigatorlanguage];
    let V002 = GM_getValue('autoConfirmAllDeleteTasks', false) ? '√' : '×';
    GlobalVariable.registerEdMenu.push(
        GM_registerMenuCommand(L002 + ' ' + V002, () => {
            GM_setValue('autoConfirmAllDeleteTasks', !GM_getValue('autoConfirmAllDeleteTasks', false));
            OverloadMenu();
        })
    );
    let L003 = GlobalVariable.Interfacelanguage['login']['003'][GlobalVariable.Navigatorlanguage];
    GlobalVariable.registerEdMenu.push(
        GM_registerMenuCommand(L003, () => {
            RegisterNewAccount();
        })
    );
}

async function _sleep(ms) {
    return new Promise((resolve) => {
        setTimeout(() => {
            resolve();
        }, ms);
    });
}

async function RegisterNewAccount() {
    let QuickInput = $('div#QuickInput').eq(0);
    if (QuickInput.length === 0) {
        alert('Not in the login interface, unable to continue');
        return;
    }
    if ($('input[class*="-login"][class*="password-repeat"][type="password"]').eq(0).length === 0) {
        let tipsLink = $('span[class*="tips-link"]').eq(0);
        global_module.clickElement(tipsLink[0]);
    }
    let email = await global_module.Mail.Change();
    await _sleep(1000);
    let formEmail = $('input[class*="-login"][class*="email"][type="text"]').eq(0);
    global_module.AnalogInput.AnalogInput(formEmail[0], email);
    let sendCode = $('div[class*="-login"][class*="send-message"]').eq(0);
    global_module.clickElement(sendCode[0]);
    while (true) {
        let Mails = await global_module.Mail.getMails();
        if (Mails.length !== 0) {
            let r = await handlingPikpakCaptchasAndLogin(Mails);
            if (r) {
                break;
            }
        }
        await _sleep(1000);
    }
}

function extractNumbers(str) {
    let reg = /\d{6}/g;
    str = str.match(reg);
    if (str == null) {
        return null;
    }
    return str[0];
}

async function handlingPikpakCaptchasAndLogin(Mails) {
    return new Promise((resolve) => {
        let code = null;
        for (let i = 0; i < Mails.length; i++) {
            let Mail = Mails[i];
            let sender = Mail.sender;
            if (sender.search(/Pikpak/i) === -1) {
                continue;
            }
            let text = Mail.text;
            code = extractNumbers(text);
            if (code === null) {
                continue;
            }
            break;
        }
        if (code == null) {
            resolve(false);
            return false;
        }
        let formCode = $('input[class*="-login"][class*="code"][type="text"]').eq(0);
        let formPassword = $('input[class*="-login"][class*="password"][type="password"]').eq(0);
        let formPasswordRepeat = $('input[class*="-login"][class*="password-repeat"][type="password"]').eq(0);
        global_module.AnalogInput.AnalogInput(formCode[0], code);
        let pass = global_module.getRandomString(16);
        global_module.AnalogInput.AnalogInput(formPassword[0], pass);
        global_module.AnalogInput.AnalogInput(formPasswordRepeat[0], pass);
        let loginBtn = $('div[class*="-login"][class*="button"]').eq(0);
        setTimeout(() => {
            global_module.clickElement(loginBtn[0]);
            let now = Date.now();
            let t = setInterval(() => {
                if (Date.now() - now > 30000) {
                    clearInterval(t);
                    resolve(false);
                    return false;
                }
                if (window.location.href.search(/login/i) === -1) {
                    clearInterval(t);
                    alert('Your password is:' + pass);
                    MonitorUrl(1);
                }
            }, 1000);
            resolve(true);
        }, 200);
    });
}

function analyzeLoginInfo(item, text) {
    let emailReg = /([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(.[a-zA-Z0-9_-])+/g;
    let email = text.match(emailReg);
    if (email == null) {
        return;
    }
    let password = '';
    text = text.replace(/:/g, '-');
    text = text.replace(/:/g, ':');
    text = text.replace(emailReg, '');
    // text = text.replace(/\n/g, '');
    email = email[0];
    if (text.indexOf(':') != -1) {
        let index = text.indexOf(':');
        password = text.substring(index + 1);
        if (password.indexOf('\n') != -1) {
            password = password.substring(0, password.indexOf('\n'));
        }
    } else if (!/\s/.test(text)) {
        password = text.replace(/[^a-zA-Z0-9\!\@\#\$\%\^\&\*\(\)\_\+\-\=\[\]\{\}\|\\\:\;\"\'\,\.\/\<\>\?]/g, '');
    } else {
        let index = text.lastIndexOf(' ');
        password = text.substring(index + 1);
    }
    if (email != '' && password != '') {
        let inputList = item.find('input[class][placeholder]');
        email = email.replace(/\s/g, '');
        password = password.replace(/\s/g, '');
        global_module.AnalogInput.AnalogInput(inputList.eq(0)[0], email);
        global_module.AnalogInput.AnalogInput(inputList.eq(1)[0], password);
        MonitorUrl(1);
        setTimeout(() => {
            $('[class="pp-button"]').eq(0).click();
        }, 200);
    }
}

function loginPaneleModified() {
    let forgetPasswordElement = GlobalVariable.loginPanel.find('div[class*="forget-password"]').eq(0);
    if (forgetPasswordElement.length == 0) {
        return;
    }
    let item = forgetPasswordElement.parent();
    let form = item.parent().eq(0);
    if (form.find('div#QuickInput').length != 0) {
        return;
    }
    let QuickInputHeight = 188;
    let div = $(`<div id="QuickInput"><textarea placeholder="` + GlobalVariable.Interfacelanguage['login']['002'][GlobalVariable.Navigatorlanguage] + `" style="width: 100%; height:` + QuickInputHeight + `px;"></textarea></div>`);
    form.append(div);
    // let formHeight = form.height();
    // form.css('height', formHeight + QuickInputHeight + 'px');
    form.find('div[class="agreement"]').eq(0).css('display', 'none');
    let textarea = div.find('textarea').eq(0);
    textarea.on(
        'input propertychange',
        global_module.debounce(() => {
            let text = $(textarea).val();
            analyzeLoginInfo(item, text);
        }, 200)
    );
    if (unsafeWindow['_autoLoginInfo_']) {
        analyzeLoginInfo(item, unsafeWindow['_autoLoginInfo_']());
    }
}

function StopMonitorUrl() {
    if (GlobalVariable.MonitorUrlInterval != null) {
        for (let i = 0; i < GlobalVariable.MonitorUrlInterval.length; i++) {
            clearInterval(GlobalVariable.MonitorUrlInterval[i]);
        }
        GlobalVariable.MonitorUrlInterval = [];
    }
}

function MonitorUrl(to) {
    GlobalVariable.HistoricalUrlPath = unsafeWindow.location.pathname;
    if (GlobalVariable.MonitorUrlInterval == null) {
        GlobalVariable.MonitorUrlInterval = [];
    }
    StopMonitorUrl();
    GlobalVariable.MonitorUrlInterval.push(
        setInterval(() => {
            let path = unsafeWindow.location.pathname;
            if (path == GlobalVariable.HistoricalUrlPath) {
                return;
            }
            if (path.indexOf('/drive/login') != -1 && to == 0) {
                login();
            } else if (to == 1) {
                main();
            }
            StopMonitorUrl();
        }, 500)
    );
}

async function login() {
    let loginPanel = await global_module.waitForElement('div[class*="login-panel"]', null, null, 100, -1);
    loginPanel = loginPanel.eq(0);
    GlobalVariable.loginPanel = loginPanel;
    loginPanel.on('DOMSubtreeModified', global_module.debounce(loginPaneleModified, 200));
    if (GM_getValue('loginForEmail', false)) {
        let emailBtn = await global_module.waitForElement('div[class*="icon-email"]', null, null, 100, -1);
        emailBtn.eq(0).click();
    }
    Init(0);
}

async function MonitorLogout() {
    let nav = await global_module.waitForElement('ul[class="user-nav"]', null, null, 100, -1);
    let li = nav.find('li').eq(-1);
    li.on('click', () => {
        $('body').remove();
        for (let key in localStorage) {
            localStorage.removeItem(key);
        }
        global_module.Cookie.clear();
        unsafeWindow.location.href = '/drive/login';
    });
}

async function ListenControlButtonClick() {
    let controlButton = await global_module.waitForElement('div[class="menu-box"]', null, null, 1000, 60 * 1000);
    GlobalVariable.controlButton = {
        controlButton
    };
    let globalActionClick = () => {
        DealWithoverlay(2, (overlay, Target) => {
            if (Target.hasClass('is-checked')) {
                Target.click();
            }
            setTimeout(() => {
                DealWithoverlay(1);
            }, 100);
        });
    };
    let Btn = controlButton;
    controlButton.click(() => {
        if (!GM_getValue('autoConfirmAllDeleteTasks', false)) {
            return;
        }
        if (GlobalVariable.controlButton.transferContent == null || GlobalVariable.controlButton.transferContent.length == 0) {
            GlobalVariable.controlButton.transferContent = $(Btn).parent().eq(0).parent().eq(0).find('div[class^="transfer-content"]').eq(0);
        }
        let transferContent = GlobalVariable.controlButton.transferContent;
        let clearTimes = () => {
            if (GlobalVariable.controlButton.FindTime != null) {
                clearTimeout(GlobalVariable.controlButton.FindTime);
            }
            if (GlobalVariable.controlButton.FindGlobalActionTime != null) {
                clearInterval(GlobalVariable.controlButton.FindGlobalActionTime);
            }
        };
        clearTimes();
        GlobalVariable.controlButton.FindTime = setTimeout(() => {
            let isShow = transferContent.css('display') != 'none';
            if (!isShow) {
                if (GlobalVariable.controlButton.globalAction != null) {
                    GlobalVariable.controlButton.globalAction.off('click', globalActionClick);
                }
                clearTimes();
                return;
            }
            let _class = 'global-action';
            let transferContentFather = transferContent.find('div[class="' + _class + '"]').eq(0);
            let FindGlobalAction = () => {
                let globalAction = transferContentFather.find('div[class^="' + _class + '"]').eq(0);
                GlobalVariable.controlButton.globalAction = globalAction;
                globalAction.on('click', globalActionClick);
            };
            if (transferContentFather.length > 0) {
                FindGlobalAction();
            } else {
                GlobalVariable.controlButton.FindGlobalActionTime = setInterval(() => {
                    transferContentFather = transferContent.find('div[class="' + _class + '"]').eq(0);
                    if (transferContentFather.length == 0) {
                        return;
                    }
                    clearTimes();
                    FindGlobalAction();
                }, 200);
            }
        }, 260);
    });
}

function hideIntrojs() {
    return new Promise(async (resolve) => {
        await global_module.waitForElement('div[class^="introjs-"]', null, null, 100, 10 * 1000);
        $('div[class^="introjs-"]').remove();
        resolve();
    });
}

async function main() {
    hideIntrojs();
    MonitorUrl(0);
    MonitorLogout();
    let nav = await global_module.waitForElement('ul[class="nav"]', null, null, 100, 60 * 1000);
    if (nav == null) {
        for (let i = 0; i < 5; i++) {
            new Error('nav is null');
        }
        return;
    }
    await new Promise((resolve) => {
        let timer = setInterval(() => {
            try {
                let text = $('span[class="nav-item-name"]').eq(0).text();
                if (text == null || text == '') {
                    return;
                }
                clearInterval(timer);
                GlobalVariable['allFileText'] = text;
                resolve();
            } catch (e) {}
        }, 200);
    });
    FindStr(unsafeWindow.webpackChunkxlco_pikpak_web);
    if (GlobalVariable.language == null) {
        GlobalVariable.language = {
            'my-vip-days': 'Vip remaining {0} days',
            download: 'Download',
            'i18n-delete': 'Delete',
            'delete-permanently': 'Delete permanently'
        };
    }
    GlobalVariable.nav = nav;
    let activeLi = await global_module.waitForElement('a[class^="active"]', null, null, 100, 60 * 1000, nav);
    if (activeLi == null) {
        for (let i = 0; i < 5; i++) {
            new Error('activeLi is null');
        }
        return;
    }
    ListenControlButtonClick();
    StopMonitorUrl();
    GlobalVariable.activeLi = activeLi;
    nav.find('li').on('click', LiClick);
    $('svg[class="safety"]').eq(0).remove();
    MonitorMenu();
    Init(1);
}

unsafeWindow['__hookRequest__'].FetchCallback.add('/vip/v1/vip/info', (_object, period) => {
    if (period === 'preRequest') {
        return null;
    } else if (period === 'done') {
        (async () => {
            let json = JSON.parse(_object.text);
            let data = json.data;
            let expire = data.expire;
            let day = 0;
            if (expire && expire != '') {
                let now = new Date();
                let expireDate = new Date(expire);
                day = (expireDate.getTime() - now.getTime()) / (24 * 60 * 60 * 1000);
                day = Math.ceil(day);
            }
            if (unsafeWindow['Pikpak_Archive'] != null) {
                try {
                    unsafeWindow['Pikpak_Archive']();
                } catch (e) {}
            }
            await new Promise((resolve) => {
                let Time = setInterval(() => {
                    if (GlobalVariable.language == null) {
                        return;
                    }
                    if (GlobalVariable.language['my-vip-days'] == null) {
                        return;
                    }
                    clearInterval(Time);
                    resolve();
                }, 500);
            });
            let title = GlobalVariable.language['my-vip-days'].replace('{0}', day);
            if (GlobalVariable.vipDaysDom != null) {
                GlobalVariable.vipDaysDom.text(title);
                return;
            }
            let cloneDom = await global_module.waitForElement('div[class*="header-bar-right"]', null, null, 100, -1);
            cloneDom = cloneDom.eq(0).find('a').eq(0);
            let newDom = $(global_module.cloneAndHide(cloneDom[0], 1));
            newDom.attr('id', '_vipdays_');
            GlobalVariable.vipDaysDom = newDom;
            cloneDom.show();
            $(newDom).text(title);
        })();
    }
});

function Init(index) {
    SaveStorage('pp_access_to_visit', 'true');
    SaveStorage('allow_analysis', 'true');
    if (index == 0) {
    } else if (index == 1) {
        for (let i = 0; i < localStorage.length; i++) {
            let key = localStorage.key(i);
            let value = localStorage.getItem(key);
            if (key.indexOf('credentials_') != -1) {
                let json = JSON.parse(value);
                let sub = json.sub;
                let token = json.access_token;
                GlobalVariable.Token = token;
                if (sub == null) {
                    new Error(json);
                    return;
                }
                SaveStorage('pp_disabled_speed_save_dialog_' + sub, 'true');
                break;
            }
        }
    }
}

function SaveStorage(key, value) {
    global_module.Cookie.set(key, value, 365);
    localStorage.setItem(key, value);
}

function Preload() {
    OverloadMenu();
    Init();
    let href = unsafeWindow.location.href;
    if (href.indexOf('/drive/login') != -1) {
        login();
    } else {
        main();
    }
}

Preload();