Files
MIXBOX-ARCHIVE/apps/transmission/web/tr-web-control/script/transmission.js
2020-03-05 00:08:40 +08:00

335 lines
7.4 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// transmission RPC 操作类
// 栽培者
var transmission = {
SessionId: "",
isInitialized: false,
host: "",
port: "9091",
path: "/transmission/rpc",
rpcpath: "../rpc",
fullpath: "",
on: {
torrentCountChange: null,
postError: null
},
username: "",
password: "",
// 种子状态
_status: {
stopped: 0,
checkwait: 1,
check: 2,
downloadwait: 3,
download: 4,
seedwait: 5,
seed: 6,
// 自定义状态
actively: 101
},
// TrackerStats' announceState
_trackerStatus: {
inactive: 0,
waiting: 1,
queued: 2,
active: 3
},
options: {
getFolders: true,
getTarckers: true
},
headers: {},
trackers: {},
islocal: false,
// The list of directories that currently exist
downloadDirs: new Array(),
getSessionId: function(me, callback) {
var settings = {
type: "POST",
url: this.fullpath,
error: function(request, event, settings) {
var SessionId = "";
if (request.status === 409 && (SessionId = request.getResponseHeader('X-Transmission-Session-Id'))) {
me.isInitialized = true;
me.SessionId = SessionId;
me.headers["X-Transmission-Session-Id"] = SessionId;
if (callback) {
callback();
}
}
},
headers: this.headers
};
jQuery.ajax(settings);
},
init: function(config, callback) {
jQuery.extend(this, config);
/*
if (this.fullpath=="")
{
this.fullpath = this.host + (this.port?":"+this.port:"") + this.path;
}*/
if (this.username && this.password) {
this.headers["Authorization"] = "Basic " + (new Base64()).encode(this.username + ":" + this.password);
}
this.fullpath = this.rpcpath;
this.getSessionId(this, callback);
},
/**
* 执行指定的命令
* @param {[type]} config [description]
* @param {Function} callback [description]
* @param {[type]} tags [description]
* @return {[type]} [description]
*/
exec: function(config, callback, tags) {
if (!this.isInitialized) {
return false;
}
var data = {
method: "",
arguments: {},
tag: ""
};
jQuery.extend(data, config);
var settings = {
type: "POST",
url: this.fullpath,
dataType: 'json',
data: JSON.stringify(data),
success: function(resultData, textStatus) {
if (callback) {
callback(resultData, tags);
}
},
error: function(request, event, page) {
var SessionId = "";
if (request.status === 409 && (SessionId = request.getResponseHeader('X-Transmission-Session-Id'))) {
transmission.SessionId = SessionId;
transmission.headers["X-Transmission-Session-Id"] = SessionId;
jQuery.ajax(settings);
} else {
if (transmission.on.postError) {
transmission.on.postError(request);
}
}
},
headers: this.headers
};
jQuery.ajax(settings);
},
getStatus: function(callback) {
this.exec({
method: "session-stats"
}, function(data) {
if (data.result == "success") {
if (callback) {
callback(data.arguments);
}
if (transmission.torrents.count != data.arguments.torrentCount || transmission.torrents.activeTorrentCount != data.arguments.activeTorrentCount || transmission.torrents.pausedTorrentCount != data.arguments.pausedTorrentCount) {
// Current total number of torrents
transmission.torrents.count = data.arguments.torrentCount;
transmission.torrents.activeTorrentCount = data.arguments.activeTorrentCount;
transmission.torrents.pausedTorrentCount = data.arguments.pausedTorrentCount;
transmission._onTorrentCountChange();
}
}
});
},
getSession: function(callback) {
this.exec({
method: "session-get"
}, function(data) {
if (data.result == "success") {
if (callback) {
callback(data.arguments);
}
}
});
},
// 添加种子
addTorrentFromUrl: function(url, savepath, autostart, callback) {
// 磁性连接代码来自原版WEBUI
if (url.match(/^[0-9a-f]{40}$/i)) {
url = 'magnet:?xt=urn:btih:' + url;
}
var options = {
method: "torrent-add",
arguments: {
filename: url,
paused: (!autostart)
}
};
if (savepath) {
options.arguments["download-dir"] = savepath;
}
this.exec(options, function(data) {
switch (data.result) {
// 添加成功
case "success":
if (callback) {
if (data.arguments["torrent-added"]) {
callback(data.arguments["torrent-added"]);
}
// 重复的种子
else if (data.arguments["torrent-duplicate"]) {
callback({
status: "duplicate",
torrent: data.arguments["torrent-duplicate"]
});
}
}
break;
// 重复的种子
case "duplicate torrent":
default:
if (callback) {
callback(data.result);
}
break;
}
});
},
// 从文件内容增加种子
addTorrentFromFile: function(file, savePath, paused, callback, filecount) {
var fileReader = new FileReader();
fileReader.onload = function(e) {
var contents = e.target.result;
var key = "base64,";
var index = contents.indexOf(key);
if (index == -1) {
return;
}
var metainfo = contents.substring(index + key.length);
transmission.exec({
method: "torrent-add",
arguments: {
metainfo: metainfo,
"download-dir": savePath,
paused: paused
}
}, function(data) {
switch (data.result) {
// 添加成功
case "success":
if (callback) {
callback(data.arguments["torrent-added"], filecount);
}
break;
// 重复的种子
case "duplicate torrent":
if (callback) {
callback("duplicate");
}
break;
}
});
}
fileReader.readAsDataURL(file);
},
_onTorrentCountChange: function() {
this.torrents.loadSimpleInfo = false;
if (this.on.torrentCountChange) {
this.on.torrentCountChange();
}
},
// 删除种子
removeTorrent: function(ids, removeData, callback) {
this.exec({
method: "torrent-remove",
arguments: {
ids: ids,
"delete-local-data": removeData
}
}, function(data) {
if (callback)
callback(data.result);
});
},
// 獲取指定目錄的大小
getFreeSpace: function(path, callback) {
this.exec({
method: "free-space",
arguments: {
"path": path
}
}, function(result) {
if (callback)
callback(result);
});
},
// 更新黑名單
updateBlocklist: function(callback) {
this.exec({
method: "blocklist-update"
}, function(data) {
if (callback)
callback(data.result);
});
},
// 重命名指定的种子文件/目录名称
// torrentId 只能指定一个
// oldpath 原文件路径或目录opencd/info.txt 或 opencd/cd1
// newname 新的文件或目录名into1.txt 或 disc1
renameTorrent: function(torrentId, oldpath, newname, callback) {
var torrent = this.torrents.all[torrentId];
if (!torrent)
return false;
this.exec({
method: "torrent-rename-path",
arguments: {
ids: [torrentId],
path: oldpath || torrent.name,
name: newname
}
}, function(data) {
if (callback)
callback(data);
});
},
// 关闭连接?
closeSession: function(callback) {
this.exec({
method: "session-close"
}, function(result) {
if (callback)
callback(result);
});
}
};
/*
(function($){
var items = $("script");
var index = -1;
for (var i=0;i<items.length ;i++ )
{
var src = items[i].src.toLowerCase();
index = src.indexOf("min/transmission.js");
if (index!=-1)
{
// 种子相关信息
$.getScript("script/min/transmission.torrents.js");
break;
}
}
if (index==-1)
{
$.getScript("script/transmission.torrents.js");
}
})(jQuery);
*/