如果你是 Chrome / Edge / 国产浏览器用户,不好意思,没办法直接调用,建议你使用 Video Download Helper
前置条件
需要userChromeJS
环境addMenuPlus.uc.js
脚本以及 you-get.exe
userChromeJS 是玩 Firefox 必备的环境了,具体可以看这里
背景12017年Firefox的“量子”版本(57)发布,中止了所有旧扩展(Addon/Extension,又称附加组件,与“插件 Plugins 不同)的支持。XUL、XPCOM、XBL等旧的被称为Legacy的技术被宣称要废弃。5...
注意:这个 userChromeJS 里的 Chrome 和 Chrome 浏览器并没有关系, Firefox 浏览器的历史可是比 Chrome 要久啊。
而addMenuPlus.uc.js
是一个超级强的Firefox菜单定制脚本。
addMenuPlus 是一个非常强大的定制菜单的 uc 脚本。通过配置文件可添加、修改、隐藏菜单,修改后无需重启生效。ywzhaiqi 基于 Griever/addMenu.uc.js 修改增强新增修改原有菜单的功能新增参数 %FA...
不过原作者和修改作者都不用 Firefox 了,最新可以使用的版本在这里:https://github.com/benzBrake/FirefoxCustomize/blob/master/userChromeJS/addMenuPlus/addMenuPlus.uc.js
不会使用没有关系,可以直接使用我的定制版的。
很久之前就在卡饭分享过,然后因为卡饭的老账号被封了,就一段时间不整FF定制版了,直到昨天不小心启用FF自动更新被清新到98b2后,才不得不重新折腾一下,花了一天时间折腾好了,这里感谢各位大佬可以让我抄袭。100b9 开始使用 Gree...
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
}]);