Firefox 添加“鼠标中键点击下载按钮条用 you-get.exe 下载视频” 的功能

Firefox 2022-04-26 83℃ 0 0

如果你是 Chrome / Edge / 国产浏览器用户,不好意思,没办法直接调用,建议你使用 Video Download Helper

DownloadedHelper_7_6_0_0.crx
下载方式:免费下载更新时间:2022-04-26 09:04:33文件大小:843.41kB下载次数:42

前置条件

需要userChromeJS环境addMenuPlus.uc.js脚本以及 you-get.exe

userChromeJS 是玩 Firefox 必备的环境了,具体可以看这里

注意:这个 userChromeJS 里的 Chrome 和 Chrome 浏览器并没有关系, Firefox 浏览器的历史可是比 Chrome 要久啊。

addMenuPlus.uc.js是一个超级强的Firefox菜单定制脚本。

不过原作者和修改作者都不用 Firefox 了,最新可以使用的版本在这里:https://github.com/benzBrake/FirefoxCustomize/blob/master/userChromeJS/addMenuPlus/addMenuPlus.uc.js

不会使用没有关系,可以直接使用我的定制版的。

addMenuPlus 配置

把下面的内容丢到 addMenuPlus 的配置文件里就行。
如果是使用我的定制版,点右上角的两个齿轮按钮,然后右键点击自定义菜单就可以修改 addMenuPlus 配置。
如果是你自己安装的userChromeJS环境,可以按 alt 调出主菜单,选择工具,你就会看到菜单自定义的项目,右键点击就可以了。

tool([{
    id: 'downloads-button',
    tooltiptext: Services.locale.appLocaleAsBCP47.includes("zh-") ? '左键:显示下载进度\n中键:下载视频\n右键:打开下载历史(CTRL + J)' : 'Left click: show download progress\nMiddle click: download video\nRight click: open download management(CTRL + J)',
    onclick: function (e) {
        if (e.button == 1) {
            e.preventDefault();
            e.stopPropagation();
            let binPath, savePath, uri = gBrowser.selectedBrowser.currentURI;

            // 自定修改 cookies 存储路径
            const cookiesPath = FileUtils.getDir("UChrm", ["resources", "cookies"], true);

            // 非网页不响应,可以细化为匹配 you-get.exe 支持的网站,我懒得写正则了
            if (uri.spec.startsWith('http')) {

                binPath = Services.prefs.getStringPref("userChromeJS.addMenuPlus.youGetPath", "");
                savePath = Services.prefs.getStringPref("userChromeJS.addMenuPlus.youGetSavePath", "");

                function setYouGetPath() {
                    alert(Services.locale.appLocaleAsBCP47.includes("zh-") ? "请先设置 you-get.exe 的路径!!!" : "Please set you-get.exe path first!!!");
                    if (Services.locale.appLocaleAsBCP47.includes("zh-")) {
                        addMenu.openCommand({ 'target': this }, 'https://lussac.lanzoui.com/b00nc5aab', 'tab');
                    } else {
                        addMenu.openCommand({ 'target': this }, 'https://github.com/LussacZheng/you-get.exe/releases', 'tab');
                    }
                    let fp = Cc['@mozilla.org/filepicker;1'].createInstance(Ci.nsIFilePicker);
                    fp.init(window, Services.locale.appLocaleAsBCP47.includes("zh-") ? "设置 you-get.exe 路径" : "Set you-get.exe path", Ci.nsIFilePicker.modeOpen);
                    fp.appendFilter(Services.locale.appLocaleAsBCP47.includes("zh-") ? "执行文件" : "Executable file", "*.exe");
                    fp.open(res => {
                        if (res != Ci.nsIFilePicker.returnOK) return;
                        Services.prefs.setStringPref("userChromeJS.addMenuPlus.youGetPath", fp.file.path);
                    });
                }

                function setSavePath() {
                    let fp = Cc['@mozilla.org/filepicker;1'].createInstance(Ci.nsIFilePicker);
                    fp.init(window, Services.locale.appLocaleAsBCP47.includes("zh-") ? "设置视频保存路径" : "Set video save path", Ci.nsIFilePicker.modeGetFolder);
                    fp.open(res => {
                        if (res != Ci.nsIFilePicker.returnOK) return;
                        Services.prefs.setStringPref("userChromeJS.addMenuPlus.youGetSavePath", fp.file.path + '\\');
                    });
                }

                // 转换成 netscape 格式,抄袭自 cookie_txt 扩展
                function formatCookie(co) {
                    return [
                        [
                            co.isHttpOnly ? '#HttpOnly_' : '',
                            co.host
                        ].join(''),
                        co.isDomain ? 'TRUE' : 'FALSE',
                        co.path,
                        co.isSecure ? 'TRUE' : 'FALSE',
                        co.expires,
                        co.name,
                        co.value + '\n'
                    ].join('\t');
                }

                // 保存 cookie 并返回路径
                function getCookiePathForSite(host) {
                    if (!host) return;
                    let cookies = Services.cookies.getCookiesFromHost(host, {});
                    let string = cookies.map(formatCookie).join('');

                    let file = cookiesPath.clone();
                    file.append(`${host}.txt`);
                    if (file.exists()) {
                        file.remove(0);
                    }
                    file.createUnique(Ci.nsIFile.NORMAL_FILE_TYPE, 0o666);

                    // 保存文件,抄袭自 saveUCJS.uc.js
                    const charset = 'UTF-8';
                    const fileStream = Components.classes['@mozilla.org/network/file-output-stream;1']
                        .createInstance(Components.interfaces.nsIFileOutputStream);
                    fileStream.init(file, 0x02 | 0x08 | 0x20, -1, 0);

                    const converterStream = Components.classes['@mozilla.org/intl/converter-output-stream;1']
                        .createInstance(Components.interfaces.nsIConverterOutputStream);
                    converterStream.init(
                        fileStream,
                        charset,
                        string.length,
                        Components.interfaces.nsIConverterInputStream.DEFAULT_REPLACEMENT_CHARACTER
                    );

                    converterStream.writeString(string);
                    converterStream.close();
                    fileStream.close();
                    return file.path;
                }


                if (!binPath) {
                    setYouGetPath();
                    binPath = Services.prefs.getStringPref("userChromeJS.addMenuPlus.youGetPath", "");
                    return;
                }
                if (!savePath) {
                    setSavePath();
                    savePath = Services.prefs.getStringPref("userChromeJS.addMenuPlus.youGetSavePath", "");
                    return;
                }
                let youGet = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsIFile);
                try {
                    youGet.initWithPath(binPath);
                } catch (E) {
                    alert(Services.locale.appLocaleAsBCP47.includes("zh-") ? "you-get.exe 不存在,需要重新设置 you-get.exe 路径" : "you-get.exe not exists, please reset you-get.exe path");
                    setYouGetPath();
                    return;
                }
                let p = Components.classes["@mozilla.org/process/util;1"].createInstance(Components.interfaces.nsIProcess);

                // 自行修改系统编码 Please change text encoding
                if (Services.locale.appLocaleAsBCP47.includes("zh-CN")) {
                    let converter = Cc['@mozilla.org/intl/scriptableunicodeconverter'].createInstance(Ci.nsIScriptableUnicodeConverter);
                    converter.charset = 'gbk';
                    savePath = converter.ConvertFromUnicode(savePath) + converter.Finish();
                }
                let commandArgs = ['-c', getCookiePathForSite(uri.host), '-o', savePath, uri.spec];

                p.init(youGet);
                p.run(false, commandArgs, commandArgs.length);
            }
        } else if (e.button == 2) {
            // 右键打开下载历史
            e.preventDefault();
            e.stopPropagation();
            DownloadsPanel.showDownloadsHistory();
        }
    },
    clone: false
}]);

效果预览

一键下载视频.gif一键下载视频.gif

评论 (0)

Top