diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
index 0000000..5793caa
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,17 @@
+### v1.2更新内容:
+1. 优化代码结构,修复包含iframe页面下载重复问题
+2. 图片下载
+
+### v1.1.2:
+1. 增加自动更新
+
+### v1.1:
+1. 增加快捷键来切换默认rpc服务 (option+shift+[123456789])
+2. 增加快捷键展示当前默认rpc服务(option+shift+`)
+3. 设置界面可以设置默认rpc服务
+4. 增加快捷键临时禁制拦截 (按着cmd点击链接)
+
+### v1.0:
+1. 自动拦截指定后缀文件的下载事件并通过aria2c来下载该文件
+2. 可配置多个aria2c服务地址
+3. 右键链接后可选择指定aria2c服务进行下载)
\ No newline at end of file
diff --git a/README.md b/README.md
index 600ec85..1479c92 100644
--- a/README.md
+++ b/README.md
@@ -1,18 +1,18 @@
-# # safari2aria
+# safari2aria
+
+用 aria2c 来替代你的 safari 默认下载
请搭配mac下的safari进行食用
-### v1.1.2更新内容:
-增加自动更新
-### v1.1更新内容:
-1. 增加快捷键来切换默认rpc服务 (option+shift+[123456789])
-2. 增加快捷键展示当前默认rpc服务(option+shift+`)
-3. 设置界面可以设置默认rpc服务
-4. 增加快捷键临时禁制拦截 (按着cmd点击链接)
-
-### 暂时实现了一些基础功能:
-1. 自动拦截指定后缀文件的下载事件并通过aria2c来下载该文件
-2. 可配置多个aria2c地址
-3. 右键链接后可选择指定aria2c服务进行下载
+
+### 已有功能:
+1. 拦截指定后缀文件下载
+2. 多aria2c服务支持
+3. 右键菜单指定aria2c服务
+
+### 快捷键:
+1. 切换默认rpc服务 (option+shift+[123456789])
+2. 展示当前默认rpc服务(option+shift+`)
+3. 临时禁用或启用拦截(按着cmd点击链接)
[下载链接](https://github.com/miniers/safari2aria/releases)
@@ -25,8 +25,8 @@
![image](https://user-images.githubusercontent.com/2039910/27039821-b4518ce6-4fc1-11e7-8dc2-a9b9c1621ae0.png)
-### 已知问题:
-1. 如果aria2c端没有配置ssl证书,则https网站的下载请求无法发送至aria2c
+### 注意事项:
+如果aria2c端没有配置ssl证书,则https网站的下载请求无法发送至aria2c
该问题为safari的安全策略,暂时没有思路修复
@@ -49,3 +49,12 @@ rpc-secure=true
rpc-certificate=01 01 01 01 01 01 01
```
+## 友情福利
+
+鉴于有些用户没有申请域名或者证书,现提供一套自用ssl证书用以搭建本地aria2c https支持
+域名: aria2.zc.ci
+解析: 127.0.0.1
+证书下载地址:[aria2.zc.ci.zip](https://github.com/miniers/safari2aria/files/1070942/aria2.zc.ci.zip)
+
+请参照注意事项在aria2c的配置文件中添加证书
+
diff --git a/safari2aria.safariextension/Info.plist b/safari2aria.safariextension/Info.plist
index 153ef7b..a544c28 100644
--- a/safari2aria.safariextension/Info.plist
+++ b/safari2aria.safariextension/Info.plist
@@ -13,9 +13,9 @@
CFBundleInfoDictionaryVersion
1.0
CFBundleShortVersionString
- 1.1.2
+ 1.2
CFBundleVersion
- 1.1.2
+ 1.2
Chrome
Database Quota
@@ -56,7 +56,7 @@
Update From Gallery
Update Manifest URL
- https://gist.githubusercontent.com/miniers/c62891753a2b9c05a154ea5d53efebee/raw/cdbfd3126f0b1120517039e6b15709b6fdd7b07d/update.plist
+ http://miniers.github.io/safari2aria/update.plist?t=1.1.3
Website
https://github.com/miniers/safari2aria
diff --git a/safari2aria.safariextension/js/endscript.js b/safari2aria.safariextension/js/endscript.js
index 4973bf4..f5abdb5 100644
--- a/safari2aria.safariextension/js/endscript.js
+++ b/safari2aria.safariextension/js/endscript.js
@@ -1,56 +1,16 @@
-var ARIA2 = (function() {
- var jsonrpc_version = '2.0';
- function get_auth(url) {
- return url.match(/^(?:(?![^:@]+:[^:@\/]*@)[^:\/?#.]+:)?(?:\/\/)?(?:([^:@]*(?::[^:@]*)?)?@)?/)[1];
- };
-
- function request(jsonrpc_path, method, params,cb) {
- var xhr = new XMLHttpRequest();
- var auth = get_auth(jsonrpc_path);
- jsonrpc_path = jsonrpc_path.replace(/^((?![^:@]+:[^:@\/]*@)[^:\/?#.]+:)?(\/\/)?(?:(?:[^:@]*(?::[^:@]*)?)?@)?(.*)/, '$1$2$3'); // auth string not allowed in url for firefox
-
- var request_obj = {
- jsonrpc: jsonrpc_version,
- method: method,
- id: (new Date()).getTime().toString(),
- };
- if (params) request_obj['params'] = params;
- if (auth && auth.indexOf('token:') == 0) params.unshift(auth);
-
- xhr.open("POST", jsonrpc_path+"?tm="+(new Date()).getTime().toString(), true);
- xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
- if (auth && auth.indexOf('token:') != 0) {
- xhr.setRequestHeader("Authorization", "Basic "+btoa(auth));
- }
- xhr.send(JSON.stringify(request_obj));
- xhr.onreadystatechange = function() {
- if (xhr.readyState === 4) {
- if (xhr.status === 200) {
- cb&&cb()
- } else {
- console.log('failed');
- cb&cb("err");
- }
- }
- }
- };
-
- return function(jsonrpc_path) {
- this.jsonrpc_path = jsonrpc_path;
- this.addUri = function (uri, options,cb) {
- request(this.jsonrpc_path, 'aria2.addUri', [[uri, ], options],cb);
- };
- return this;
- }
-})();
-
-
-safe_title = function safe_title(title) {
- return title.replace(/[\\\|\:\*\"\?\<\>]/g, "_");
-};
function linkForTarget (e) {
- return "BODY" === e.tagName ? null : e.href ? e.href : e.parentNode ? linkForTarget(e.parentNode) : void 0
+ var result = null;
+ if ("BODY" === e.tagName) {
+ result = null
+ } else if (e.tagName === "IMG" && e.src) {
+ result = e.src
+ } else if (e.href) {
+ result = e.href
+ } else if (e.parentNode) {
+ result = linkForTarget(e.parentNode)
+ }
+ return result
}
function linksFromContainer (e) {
@@ -88,33 +48,16 @@ function selectedLinks () {
}
return null
}
-function sendToAria2 (e) {
- var aria = ARIA2(e[0]);
- if (e[1]) {
- aria.addUri(e[1], {
- header: 'Cookie: ' + document.cookie
- },function (err) {
- if(err){
- miniToastr.error('添加到aria2失败')
- }else{
- miniToastr.success('添加到aria2成功')
- }
- });
- }
-}
function handleMessage (e) {
- if ("sendToAria2" === e.name && e.message[2] === document.location.href){
- sendToAria2(e.message);
- }
- if(e.name === "changeRpc"){
- miniToastr.success('成功切换默认下载服务至'+e.message);
+if (e.name === "changeRpc") {
+ miniToastr.success('成功切换默认下载服务至' + e.message);
}
- if(e.name === "currentRpc"){
- miniToastr.success('当前下载服务为'+e.message);
+ if (e.name === "currentRpc") {
+ miniToastr.success('当前下载服务为' + e.message);
}
- if(e.name === "showMassage"){
- miniToastr[e.message.action](e.message.text);
+ if (e.name === "showMassage") {
+ miniToastr[e.message.action || "success"](e.message.text);
}
}
@@ -129,38 +72,30 @@ function handleContextMenu (e) {
//handle command key
-document.onkeydown=function(event){
- var unicode=event.charCode ? event.charCode : event.keyCode;
- if(unicode === 91) //chrome:COMMAND
- {
- isCommandKeyPressed = true;
- }
- keyPressed[unicode]=true;
+document.onkeydown = function (event) {
+ var unicode = event.charCode ? event.charCode : event.keyCode;
+ keyPressed[unicode] = true;
sendKeyPressEvent()
};
-document.onkeyup=function (event){
- var unicode=event.charCode ? event.charCode : event.keyCode;
- if(unicode === 91){
- isCommandKeyPressed = false;
- }
- keyPressed[unicode]=false;
+document.onkeyup = function (event) {
+ var unicode = event.charCode ? event.charCode : event.keyCode;
+ keyPressed[unicode] = false;
sendKeyPressEvent()
};
function sendKeyPressEvent () {
safari.self.tab.dispatchMessage("keyPress", {
- keyPressed:keyPressed
+ keyPressed: keyPressed
});
}
-var isCommandKeyPressed,isShiftPressd; //cmd键是否被按压
-var keyPressed={};
-var rpcList=[];
+var keyPressed = {};
miniToastr.init({
appendTarget: document.body,
timeout: 5000
});
+sendKeyPressEvent();
document.addEventListener("contextmenu", handleContextMenu, !1);
safari.self.addEventListener("message", handleMessage, !1);
\ No newline at end of file
diff --git a/safari2aria.safariextension/js/global.js b/safari2aria.safariextension/js/global.js
index 7844522..cdfe99a 100644
--- a/safari2aria.safariextension/js/global.js
+++ b/safari2aria.safariextension/js/global.js
@@ -1,3 +1,71 @@
+var ARIA2 = (function () {
+ var jsonrpc_version = '2.0';
+
+ function get_auth (url) {
+ return url.match(/^(?:(?![^:@]+:[^:@\/]*@)[^:\/?#.]+:)?(?:\/\/)?(?:([^:@]*(?::[^:@]*)?)?@)?/)[1];
+ }
+
+ function request (jsonrpc_path, method, params, cb) {
+ var xhr = new XMLHttpRequest();
+ var auth = get_auth(jsonrpc_path);
+ jsonrpc_path = jsonrpc_path.replace(/^((?![^:@]+:[^:@\/]*@)[^:\/?#.]+:)?(\/\/)?(?:(?:[^:@]*(?::[^:@]*)?)?@)?(.*)/, '$1$2$3'); // auth string not allowed in url for firefox
+
+ var request_obj = {
+ jsonrpc: jsonrpc_version,
+ method: method,
+ id: (new Date()).getTime().toString(),
+ };
+ if (params) request_obj['params'] = params;
+ if (auth && auth.indexOf('token:') == 0) params.unshift(auth);
+
+ xhr.open("POST", jsonrpc_path + "?tm=" + (new Date()).getTime().toString(), true);
+ xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
+ if (auth && auth.indexOf('token:') != 0) {
+ xhr.setRequestHeader("Authorization", "Basic " + btoa(auth));
+ }
+ xhr.send(JSON.stringify(request_obj));
+ xhr.onreadystatechange = function () {
+ if (xhr.readyState === 4) {
+ if (xhr.status === 200) {
+ cb && cb()
+ } else {
+ console.log('failed');
+ cb & cb("err");
+ }
+ }
+ }
+ }
+
+ return function (jsonrpc_path) {
+ this.jsonrpc_path = jsonrpc_path;
+ this.addUri = function (uri, options, cb) {
+ request(this.jsonrpc_path, 'aria2.addUri', [[uri,], options], cb);
+ };
+ return this;
+ }
+})();
+
+function sendToAria2 (e) {
+ var aria = ARIA2(e[0].url);
+ if (e[1]) {
+ aria.addUri(e[1], {
+ header: 'Cookie: ' + document.cookie
+ }, function (err) {
+ if (err) {
+ showToast("showMassage", {
+ action:'error',
+ text:['添加到',e[0].name,'失败'].join('')
+ });
+ } else {
+ showToast("showMassage", {
+ action:'success',
+ text:['添加到',e[0].name,'成功'].join('')
+ });
+ }
+ });
+ }
+}
+
function openPreferences (e) {
"showOptions" === e.key && (safari.application.activeBrowserWindow.openTab().url = safari.extension.baseURI + "options.html", optionsEvent = e)
}
@@ -23,8 +91,11 @@ function messageHandler (e) {
keyPressAction(e.message)
}
}
+function showToast (type,msg) {
+ safari.application.activeBrowserWindow.activeTab.page.dispatchMessage(type, msg);
+}
function keyPressAction (keys) {
- keyPressed = keys.keyPressed || {};
+ var keyPressed = keys.keyPressed || {};
isCommandPressed = keyPressed[91];
isShiftPressd = keyPressed[16];
isOptionPressd = keyPressed[18];
@@ -36,22 +107,25 @@ function keyPressAction (keys) {
name:'updateSafari2Aria',
message:config
});
- safari.application.activeBrowserWindow.activeTab.page.dispatchMessage("changeRpc", rpcList[config.defaultRpcIndex].name);
+ showToast("changeRpc", rpcList[config.defaultRpcIndex].name);
break;
}
}
if(keyPressed[192]){
- safari.application.activeBrowserWindow.activeTab.page.dispatchMessage("currentRpc", rpcList[config.defaultRpcIndex].name);
+ showToast("currentRpc", rpcList[config.defaultRpcIndex].name);
}
}
}
function handleCommand (e) {
- var n = [e.command].concat(e.userInfo);
- safari.application.activeBrowserWindow.activeTab.page.dispatchMessage("sendToAria2", n)
+ var index = e.command.split('.')[1];
+ var rpc = index&&rpcList[index]?rpcList[index]:rpcList[0];
+ var n = [rpc].concat(e.userInfo);
+ sendToAria2(n)
}
function validateCommand (e) {
- if ("DownloadWithAria2" === e.command) {
+ var match = e.command&&e.command.match(/^DownloadWithAria2/);
+ if (match&&match.length>=0) {
var a = e.userInfo;
(a && a.length && a[0]) || (e.target.disabled = !0)
}
@@ -63,11 +137,11 @@ function handleNavigation (e) {
for (var n = 0; n < fileTypes.length; n++)if (a === fileTypes[n]) {
e.preventDefault();
var t = [
- rpcList[config.defaultRpcIndex].url,
+ rpcList[config.defaultRpcIndex],
e.url,
e.target.url
];
- safari.application.activeBrowserWindow.activeTab.page.dispatchMessage("sendToAria2", t);
+ sendToAria2(t);
break
}
}
@@ -75,7 +149,7 @@ function handleNavigation (e) {
function handleContextMenu(event) {
rpcList.forEach(function (rpc,index) {
- event.contextMenu.appendContextMenuItem(rpc.url, ['下载至',rpc.name].join(''));
+ event.contextMenu.appendContextMenuItem(["DownloadWithAria2",index].join("."), ['下载至',rpc.name].join(''));
});
}
diff --git a/safari2aria.safariextz b/safari2aria.safariextz
index 7300551..5598d75 100644
Binary files a/safari2aria.safariextz and b/safari2aria.safariextz differ