Aria2 RPC

Aria2 RPC Library

目前为 2014-10-12 提交的版本。查看 最新版本

此脚本不应直接安装,它是一个供其他脚本使用的外部库。如果您需要使用该库,请在脚本元属性加入:// @require https://update.gf.qytechs.cn/scripts/5672/20993/Aria2%20RPC.js

  1. // Public Class Aria2 ( options )
  2. var Aria2 = (function (_merge, _format, _isFunction) {
  3. var jsonrpc_ver = '2.0';
  4.  
  5. // I'm lazy
  6. if (typeof GM_xmlhttpRequest == 'undefined') {
  7. console.error ('GM_xmlhttpRequest is required for `Aria2.jsonrpc` to work.');
  8. return null;
  9. }
  10.  
  11. var AriaBase = function ( options ) {
  12. this.options = _merge ({
  13. auth: {
  14. type: AriaBase.AUTH.noAuth,
  15. user: '',
  16. pass: ''
  17. },
  18. host: '127.0.0.1',
  19. port: 6800
  20. }, options || {});
  21.  
  22. this.id = parseInt (options, 10) || (0 + new Date());
  23. };
  24. // 静态常量
  25. AriaBase.AUTH = {
  26. noAuth: 0,
  27. user: 1,
  28. secret: 2
  29. };
  30.  
  31. // public 函数
  32. AriaBase.prototype = {
  33. getAuthString: function () {
  34. var user = this.options.auth.user,
  35. pass = this.options.auth.pass;
  36.  
  37. switch ( this.options.auth.type ) {
  38. case AriaBase.AUTH.noAuth:
  39. return '';
  40.  
  41. case AriaBase.AUTH.user:
  42. break;
  43. case AriaBase.AUTH.secret:
  44. user = 'token';
  45. break;
  46.  
  47. default:
  48. throw new Error('Undefined auth type: %s', this.options.auth.type);
  49. break;
  50. }
  51.  
  52. return btoa (_format('%s:%s', user, pass));
  53. },
  54.  
  55. send: function ( data, cbSuccess, cbError ) {
  56. var payload = {
  57.  
  58. method: 'POST',
  59. url: _format('http://%s:%s/jsonrpc', this.options.host, this.options.port),
  60. headers: {
  61. 'Content-Type': 'application/json; charset=UTF-8'
  62. },
  63. data: JSON.stringify ( _merge ({ jsonrpc: jsonrpc_ver, id: this.id }, data) ),
  64. onload: function (r) {
  65. if (cbSuccess)
  66. cbSuccess (JSON.parse (r.responseText));
  67. },
  68. onerror: cbError
  69. };
  70.  
  71. if (this.options.auth.type !== AriaBase.AUTH.noAuth) {
  72. payload.headers.Authorization = 'Basic ' + this.getAuthString();
  73. }
  74.  
  75. return GM_xmlhttpRequest (payload);
  76. }
  77. };
  78.  
  79.  
  80. // 添加各类函数
  81. var that = this;
  82. [
  83. "addUri", "addTorrent", "addMetalink", "remove", "forceRemove",
  84. "pause", "pauseAll", "forcePause", "forcePauseAll", "unpause",
  85. "unpauseAll", "tellStatus", "getUris", "getFiles", "getPeers",
  86. "getServers", "tellActive", "tellWaiting", "tellStopped",
  87. "changePosition", "changeUri", "getOption", "changeOption",
  88. "getGlobalOption", "changeGlobalOption", "getGlobalStat",
  89. "purgeDownloadResult", "removeDownloadResult", "getVersion",
  90. "getSessionInfo", "shutdown", "forceShutdown", "saveSession"
  91. ].forEach (function (sMethod) {
  92. // arg1, arg2, ... , [cbSuccess, [cbError]]
  93. AriaBase.prototype[sMethod] = function ( ) {
  94. var args = [].slice.call (arguments);
  95.  
  96. var cbSuccess, cbError;
  97. if (args.length && _isFunction(args[args.length - 1])) {
  98. cbSuccess = args[args.length - 1];
  99. args.splice (-1, 1);
  100.  
  101. if (args.length && _isFunction(args[args.length - 1])) {
  102. cbError = cbSuccess;
  103. cbSuccess =args[args.length - 1];
  104. args.splice (-1, 1);
  105. }
  106. }
  107.  
  108. return this.send ({
  109. method: 'aria2.' + sMethod,
  110. params: args
  111. }, cbSuccess, cbError);
  112. };
  113. });
  114. return AriaBase;
  115. })
  116. // private 函数
  117. ((function (base) {
  118. var _isObject = function (obj) {
  119. return obj instanceof Object;
  120. };
  121. var _merge = function (base) {
  122. var args = arguments,
  123. argL = args.length;
  124. for ( var i = 1; i < argL; i++ ) {
  125. Object.keys (args[i]).forEach (function (key) {
  126. if (_isObject(args[i][key]) && _isObject(base[key])) {
  127. base[key] = _merge (base[key], args[i][key]);
  128. } else {
  129. base[key] = args[i][key];
  130. }
  131. });
  132. }
  133. return base;
  134. };
  135. return _merge;
  136. })(), function (src) {
  137. var args = arguments,
  138. argL = args.length;
  139.  
  140. var ret = src.slice ();
  141. for ( var i = 1; i < argL; i++ )
  142. ret = ret.replace ('%s', args[i]);
  143. return ret;
  144. }, function (foo) {
  145. return typeof foo === 'function'
  146. });

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址