您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Show current location in title when using MEGA cloud storage.
- // ==UserScript==
- // @name MEGA Print Working Directory
- // @namespace net.myitian.js.mega.pwd
- // @description Show current location in title when using MEGA cloud storage.
- // @source https://github.com/Myitian/MEGA-PWD
- // @author Myitian
- // @license MIT
- // @version 0.3
- // @match https://mega.nz/*
- // @grant GM_registerMenuCommand
- // ==/UserScript==
- /** @param {string[]} selectors */
- function simpleCallback(...selectors) {
- const title = document.title.trim();
- if (title.length === 0) {
- return;
- }
- const dlkey = document.querySelector(".dlkey-dialog:not(.hidden)");
- if (dlkey) {
- /** @type {HTMLElement} */
- const element = dlkey.querySelector("#dlkey-dialog-title");
- mName = element?.innerText.replace("\n", "") ?? "";
- } else {
- mName = "";
- for (const selector of selectors) {
- /** @type {HTMLElement} */
- const element = document.querySelector(selector);
- if (element) {
- if (mName) {
- mName += "/";
- }
- mName += element.innerText.trim().replace("\n", "");
- }
- }
- }
- if (!mName) {
- return;
- }
- if (baseTitle === null || /^[^\|]+MEGA[^\|]+$/.test(title)) {
- baseTitle = title;
- }
- const newTitle = `${mName} | ${baseTitle}`.trim();
- if (title !== newTitle) {
- document.title = newTitle;
- }
- }
- function folderCallback() {
- const title = document.title.trim();
- if (title.length === 0) {
- return;
- }
- const dlkey = document.querySelector(".dlkey-dialog:not(.hidden)");
- if (dlkey) {
- /** @type {HTMLElement} */
- const dlkeyTitle = dlkey.querySelector("#dlkey-dialog-title");
- mName = dlkeyTitle?.innerText.replace("\n", "") ?? "";
- } else {
- mName = "";
- /** @type {NodeListOf<HTMLElement>} */
- const es = document.querySelectorAll(".fm-right-files-block .breadcrumb-dropdown span");
- if (es.length > 0) {
- for (const e of es) {
- mName = `${e.innerText.trim()}/${mName}`;
- }
- /** @type {HTMLElement} */
- const element = document.querySelector(".fm-right-files-block .fm-breadcrumbs-block a:last-child .simpletip-tc");
- mName += element?.innerText;
- } else {
- /** @type {NodeListOf<HTMLElement>} */
- const es2 = document.querySelectorAll(".fm-right-files-block .fm-breadcrumbs-block .simpletip-tc");
- for (let i = 0; i < es2.length; i++) {
- mName += es2[i].innerText.trim();
- if (i < es2.length - 1) {
- mName += "/";
- }
- }
- }
- }
- if (!mName) {
- return;
- }
- if (baseTitle === null || /^[^\|]+MEGA[^\|]+$/.test(title)) {
- baseTitle = title;
- }
- const newTitle = `${mName} | ${baseTitle}`.trim();
- if (title !== newTitle) {
- document.title = newTitle;
- }
- }
- /** @param {number} t */
- function delay(t) {
- return new Promise((rs, _) => setTimeout(rs, t));
- }
- /** @typedef {"password"|"file"|"folder"|"fm"|"fm-chat"|"fm-contacts"|"fm-pwm"|"fm-account"|"fm-shares"|"fm-media"|"fm-dashboard"|null} Mode */
- /** @type {MutationObserverInit} */
- const OBSERVER_CONFIG = { attributes: true, childList: true, subtree: true };
- GM_registerMenuCommand("PWD", () => prompt("Value", mName));
- let forceRefresh = false;
- let mName = null;
- let baseTitle = null;
- /** @type {MutationObserver|null} */
- let observer = null;
- /** @type {Mode} */
- let prevMode = null;
- window.addEventListener("hashchange", e => main(new URL(e.newURL)));
- const originalPushState = history.pushState;
- history.pushState = (data, unused, url) => {
- main(new URL(url, window.location.href));
- return originalPushState.call(history, data, unused, url);
- }
- main(window.location);
- /** @param {URL|Location} url */
- async function main(url) {
- /** @type {Mode} */
- let mode = null;
- if (url.hash.startsWith("#P!")) {
- mode = "password";
- } else if (url.pathname.startsWith("/file/")) {
- mode = "file";
- } else if (url.pathname.startsWith("/folder/")
- || url.pathname.match(/^\/fm(?:\/(?:[0-9A-Za-z]{8})?)?$/)) {
- mode = "folder";
- } else if (url.pathname.startsWith("/fm/chat/contacts")) {
- mode = "fm-contacts";
- } else if (url.pathname.startsWith("/fm/chat")) {
- mode = "fm-chat";
- } else if (url.pathname.startsWith("/fm/pwm")) {
- mode = "fm-pwm";
- } else if (url.pathname.startsWith("/fm/account")) {
- mode = "fm-account";
- } else if (url.pathname.startsWith("/fm/shares")
- || url.pathname.startsWith("/fm/out-shares")
- || url.pathname.startsWith("/fm/public-links")
- || url.pathname.startsWith("/fm/file-requests")) {
- mode = "fm-shares";
- } else if (url.pathname.startsWith("/fm/photos")
- || url.pathname.startsWith("/fm/albums")) {
- mode = "fm-media";
- } else if (url.pathname.startsWith("/fm/dashboard")) {
- mode = "fm-dashboard";
- } else if (url.pathname.startsWith("/fm/")) {
- mode = "fm";
- }
- if (mode !== prevMode || forceRefresh) {
- forceRefresh = false;
- observer?.disconnect();
- console.debug("[MEGA-PWD]", "SwitchMode:", prevMode, "->", mode);
- prevMode = mode;
- if (mode !== null) {
- /** @type {{callback:()=>void,selector:string}|null} */
- let config = null;
- switch (mode) {
- case "password":
- config = {
- selector: "#password-dialog-title",
- callback: () => simpleCallback("#password-dialog-title")
- };
- break;
- case "file":
- config = {
- selector: ".title-block",
- callback: () => simpleCallback(".title-block")
- };
- break;
- case "folder":
- config = {
- selector: ".fm-right-files-block .fm-breadcrumbs-wrapper",
- callback: folderCallback
- };
- break;
- case "fm-contacts":
- config = {
- selector: ".contacts-navigation",
- callback: () => simpleCallback(".contacts-navigation .active")
- };
- break;
- case "fm-chat":
- config = {
- selector: ".lhp-nav",
- callback: () => simpleCallback(".lhp-nav-container.active")
- };
- break;
- case "fm-pwm":
- config = {
- selector: ".top-nav .primary-text",
- callback: () => simpleCallback(".top-nav .primary-text")
- };
- break;
- case "fm-account":
- config = {
- selector: ".account .lp-content-wrap",
- callback: () => simpleCallback(".account .lp-header", ".account .settings-button.active .head-title")
- };
- break;
- case "fm-shares":
- config = {
- selector: ".shares-tabs-bl",
- callback: () => simpleCallback(".mega-component.active .primary-text", ".shares-tab-lnk.active")
- };
- break;
- case "fm-media":
- config = {
- selector: "#media-tabs",
- callback: () => simpleCallback(".mega-component.active .primary-text", "#media-tabs .active")
- };
- break;
- case "fm-dashboard":
- config = {
- selector: ".to-my-profile .primary-text",
- callback: () => simpleCallback(".to-my-profile .primary-text")
- };
- break;
- case "fm":
- config = {
- selector: ".menu.ps",
- callback: () => simpleCallback(".mega-component.active .primary-text")
- };
- break;
- }
- let element = null;
- observer = new MutationObserver(config.callback);
- if (mode === "file" || mode === "folder") {
- while (!(element = document.querySelector(".dlkey-dialog"))) {
- await delay(50);
- }
- config.callback();
- observer.observe(element, OBSERVER_CONFIG);
- if (mode === "file") {
- const largeChangeObserver = new MutationObserver(records => {
- if (records.find(
- it => Array.from(it.removedNodes).find(
- iit => iit instanceof Element && iit.classList.contains("bottom-page")))) {
- largeChangeObserver.disconnect();
- forceRefresh = true;
- }
- });
- largeChangeObserver.observe(document.querySelector("#startholder"), OBSERVER_CONFIG);
- }
- }
- while (!(element = document.querySelector(config.selector))) {
- await delay(50);
- }
- config.callback();
- observer.observe(document.querySelector("title"), OBSERVER_CONFIG);
- observer.observe(element, OBSERVER_CONFIG);
- }
- }
- }
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址