webui-aria2/js/script.js

1148 lines
29 KiB
JavaScript
Executable File

/* vim: set tabstop=4 shiftwidth=4 softtabstop=4 noexpandtab: */
Piecon.setOptions({fallback: 'force'});
var graphSize = 15;
var graphData = [];
var globalGraphData = null;
var modals = {};
var clear_dialogs = function() {
for(var i in modals) {
modals[i].modal('hide');
}
};
var server_conf = {
host: 'localhost',
port: 6800,
user: "",
pass: "",
encryption: false,
dirty: false
};
var ariaConnection;
var set_conf_cookie = function() {
setCookie('aria2_server_conf', JSON.stringify(server_conf), 30 * 12);
}
var get_conf_cookie = function() {
if (getCookie( $.trim('aria2_server_conf'))) {
server_conf = JSON.parse(getCookie('aria2_server_conf'));
server_conf.dirty = false;
}
}
var custom_aria2_connect = function() {
clear_dialogs();
$("#input_host").attr("placeholder", server_conf.host);
$("#input_port").attr("placeholder", server_conf.port);
if(server_conf.encryption) {
$("#input_encryption").addClass("active");
}
modals.change_conf.modal('show');
};
var update_server_conf = function() {
var host = $('#input_host').val().trim();
var port = $('#input_port').val().trim();
server_conf.user = $('#input_user').val().trim();
server_conf.pass = $('#input_pass').val().trim();
server_conf.encryption = $('#input_encryption').hasClass('active');
if(host.length !== 0) {
server_conf.host = host;
}
if(port.length !== 0) {
server_conf.port = port;
}
server_conf.dirty = false;
set_conf_cookie();
ariaConnection = new AriaConnection(server_conf);
clear_dialogs();
update_ui();
};
var aria_syscall = function(conf, multicall, old) {
conf.multicall = multicall;
ariaConnection.invoke(conf);
}
var update_ui = function() {
if (!server_conf.dirty)
updateDownloads();
};
$(function() {
if (window.location.protocol === "http:") {
server_conf.host = window.location.hostname;
}
get_conf_cookie();
var modal_conf = {
show: false,
backdrop: false
};
modals.err_connect = $('#error_connect').modal(modal_conf);
modals.change_conf = $('#change_conf').modal(modal_conf);
modals.newDownload_modal = $('#newDownload_modal').modal(modal_conf);
modals.global_settings_modal = $('#global_settings_modal').modal(modal_conf);
modals.download_settings_modal = $('#download_settings_modal').modal(modal_conf);
modals.torrent_info_modal = $('#torrent_info_modal').modal(modal_conf);
modals.global_statistics_modal = $('#global_statistics_modal').modal(modal_conf);
modals.about_modal = $('#about_modal').modal(modal_conf);
modals.err_file_api_modal = $('#error_file_api').modal(modal_conf);
modals.new_torrent_modal = $('#new_torrent').modal(modal_conf);
modals.new_metalink_modal = $('#new_metalink').modal(modal_conf);
ariaConnection = new AriaConnection(server_conf)
update_ui();
globalGraphData = {
downSpeed: [],
upSpeed: [],
add: function(arr, val) {
if (arr.length == graphSize) {
arr.shift();
}
arr.push([((new Date - this.start)/1000).toFixed(0), val]);
},
addDown: function(val) {
this.add(this.downSpeed, val);
return this;
},
addUp: function(val) {
this.add(this.upSpeed, val);
return this;
},
plot: createGraph('.stat_graph'),
start: new Date()
};
$('#newDownload').click(function() {
$('#newDownload_url').val("");
$('.download_urls').html("");
modals.newDownload_modal.modal('show');
});
$('#newDownload_torrent').click(function() {
$('#input_torrent').val("");
if(window.File && window.FileReader && window.FileList && window.Blob) {
modals.new_torrent_modal.modal('show');
}
else {
modals.err_file_api_modal.modal('show');
}
});
$('#newDownload_metalink').click(function() {
$('#input_metalink').val("");
if(window.File && window.FileReader && window.FileList && window.Blob) {
modals.new_metalink_modal.modal('show');
}
else {
modals.err_file_api_modal.modal('show');
}
});
$('#multiple_uris').click(function() {
if ($('#multiple_uris i').hasClass('icon-plus-sign')) {
var txt = $('#newDownload_url').val();
$('#newDownload_url').replaceWith('<textarea style="width: 270px" id="newDownload_url" rows="5"></textarea>');
if (txt.trim().length)
$('#newDownload_url').val(txt + '\n');
$('#multiple_uris i').removeClass('icon-plus-sign').addClass('icon-minus-sign');
}
else {
$('#newDownload_url').replaceWith('<input type="text" class="input-xlarge" id="newDownload_url" placeholder="http://example.com"/>');
$('#multiple_uris i').removeClass('icon-minus-sign').addClass('icon-plus-sign');
}
return false;
});
$('#addNewDownload').click(newDownload);
setInterval(update_ui, 1000);
});
function check_global(name) {
for(var i = 0; i < global_settings_exclude.length; i++) {
if(global_settings_exclude[i] === name) {
return false;
}
}
return true;
}
function merge_settings_data(sets, res) {
for(var i in res) {
for(var j = 0; j < sets.length; j++) {
if(sets[j].name === i) {
sets[j].value = res[i].trim();
sets[j].has_value = true;
if(sets[j].option) {
for(var k = 0; k < sets[j].options.length; k++) {
var tmp = {
val: sets[j].options[k],
disp: sets[j].options[k]
};
if(sets[j].options[k] === sets[j].value) {
tmp.val = sets[j].value + '" selected="true';
}
sets[j].options[k] = tmp;
}
}
}
}
}
}
function get_global_settings(cb) {
var sets = [];
var tmp_set = [];
for(var i = 0; i < input_file_settings.length; i++) {
tmp_set = $.extend(true, {}, input_file_settings[i]);
if(check_global(tmp_set)) {
sets.push(tmp_set);
}
}
for(var i = 0; i < global_settings.length; i++) {
tmp_set = $.extend(true, {}, global_settings[i]);
if(check_global(tmp_set)) {
sets.push(tmp_set);
}
}
aria_syscall({
func: 'getGlobalOption',
success: function(data) {
var res = data.result;
merge_settings_data(sets, res);
cb(sets);
},
error: function() {
alert("Connection to aria server failed");
}
});
}
function custom_global_settings() {
var gen = function(name) {
return { name: name, values: [] };
};
var general_settings = gen("General Settings");
var torrent_settings = gen("Bit-Torrent Settings");
var ftp_settings = gen("FTP Settings");
var http_settings = gen("HTTP(S) Settings");
var metalink_settings = gen("Metalink Settings");
get_global_settings(function(sets) {
for(var i = 0; i < sets.length; i++) {
var set = sets[i];
if(set.name.indexOf("bt") !== -1 || set.name.indexOf("torrent") !== -1) {
torrent_settings.values.push(set);
}
else if(set.name.indexOf("metalink") !== -1) {
metalink_settings.values.push(set);
}
else if(set.name.indexOf("http") !== -1) {
http_settings.values.push(set);
}
else if(set.name.indexOf("ftp") !== -1) {
ftp_settings.values.push(set);
}
else
general_settings.values.push(set);
}
var templ = $('#global_general_settings_template').text();
var item = Mustache.render(templ, {
settings: [
general_settings,
http_settings,
ftp_settings,
torrent_settings,
metalink_settings
]
});
$('#dynamic_global_settings').html(item);
modals.global_settings_modal.modal('show');
$("#save_global_settings").one('click',function() {
var settings = {};
for(var i = 0; i < sets.length; i++) {
var elem = $("#input_settings_" + sets[i].name);
if(sets[i].value) {
if(elem.val() !== sets[i].value) {
settings[sets[i].name] = elem.val();
}
}
else if(elem.val() !== "no_val" && elem.val() !== "") {
settings[sets[i].name] = elem.val();
}
}
if(!$.isEmptyObject(settings)) {
aria_syscall({
func: 'changeGlobalOption',
params: [settings],
success: function(data) {
clear_dialogs();
}
});
}
else {
clear_dialogs();
}
});
});
}
function addDownload(uris) {
console.log("adding download:");
console.log(uris);
aria_syscall({
func: 'addUri',
params: uris,
success: function() {
clear_dialogs();
update_ui();
}
});
}
function newDownload() {
var urls = $('#newDownload_url').val().split(/\s+/)
.map(function(e) {
return e.trim();
})
.filter(function(e) {
return e.length;
});
addDownload([urls]);
}
var d_files = {
active: [],
waiting: [],
stopped: []
};
function changeLength(len, pref) {
len = parseInt(len);
if(len <= (1<<10)) return len + " " + pref;
else if(len <= (1<<20)) return (len/(1<<10)).toFixed(1) + " K" + pref;
else if(len <= (1<<30)) return (len/(1<<20)).toFixed(1) + " M" + pref;
else return (len/(1<<30)).toFixed(1) + " G" + pref;
}
function changeTime(time) {
time = parseInt(time);
if(!time) return "infinite";
if(time < 60) return time + " s";
else if(time < 60*60) return (time/60).toFixed(2) + " min";
else if(time < 60*60*24) return (time/(60*60)).toFixed(2) + " hours";
else return (time/(60*60*24)).toFixed(2) + " days!!";
}
function getChunksFromHex(bitfield, numOfPieces) {
var chunks = [], len = 0, numPieces = parseInt(numOfPieces);
var totalDownloaded = 0;
if (numPieces > 1) {
var chunk_ratio = 1 / numPieces;
var piecesProcessed = 0;
for (var i = 0; i < bitfield.length; i++) {
var hex = parseInt(bitfield[i], 16);
for (var j = 1; j <= 4; j++) {
var bit = hex & (1 << (4 - j));
if (bit) totalDownloaded++;
var prog = !!bit;
if (len >= 1 && chunks[len - 1].show == prog) {
chunks[len - 1].ratio += chunk_ratio;
}
else {
chunks.push({
ratio: chunk_ratio,
show: prog
});
len++;
}
piecesProcessed++;
if (piecesProcessed == numPieces)
return chunks;
}
}
}
return chunks;
}
function getTemplateCtx(data) {
var obj = {
status: data.status,
gid: data.gid,
numPieces: data.numPieces,
connections: data.connections,
bittorrent: data.bittorrent
};
obj.files = data.files.map(function(e) {
e.length = changeLength(e.length, "B");
e.path = e.path.replace(/\\/g, '/').replace(obj.dir, '.');
return e;
});
_.each(['downloadSpeed', 'uploadSpeed'], function(e) {
obj[e] = changeLength(data[e], 'B/s');
});
_.each([
'totalLength', 'completedLength', 'uploadLength', 'pieceLength'
], function(e) {
obj[e] = changeLength(data[e], 'B');
});
obj.eta = changeTime((data.totalLength-data.completedLength)/data.downloadSpeed);
var percentage = (data.completedLength / data.totalLength)*100;
percentage = percentage.toFixed(2);
if(!percentage) percentage = 0;
obj.percentage = percentage;
if (obj.bittorrent && obj.bittorrent.info) {
obj.name = obj.bittorrent.info.name;
}
else {
var seed = (obj.files[0].path || obj.files[0].uris[0].uri).split(/[/\\]/);
obj.name = seed[seed.length - 1];
}
var type = data.status;
if (type == "paused") type = "waiting";
if (["error", "removed", "complete"].indexOf(type) != -1)
type = "stopped";
obj.type = type;
obj.dir = data.dir.replace(/\\/g, '/');
obj.chunks = percentage !== 100 && data.bitfield ? getChunksFromHex(data.bitfield, data.numPieces) : [];
obj.booleans = {
is_error: obj.status === "error",
is_complete: obj.status === "complete",
is_removed: obj.status === "removed",
has_settings: ["active", "waiting", "paused"].indexOf(obj.status) != -1,
can_pause: type == "active",
can_play: type == "waiting",
bittorrent: !!obj.bittorrent,
can_restart: type == "stopped"
};
return obj;
}
function updateDownloadTemplates(elem, ctx) {
elem = $(elem);
// update spans
for(var i in ctx) {
elem.find('.download-' + i).text(ctx[i]);
}
// update files
var html = '';
for (var i = 0; i < ctx.files.length; i++) {
html += '<li class="label">' + ctx.files[i].path + ' (' + ctx.files[i].size + ')</li>';
}
elem.find('.download-files').html(html);
// update progress bar
elem.find('.progress .bar').css('width', ctx.percentage + '%');
// update the chunks bar
var chunks = ctx.chunks;
if (!chunks || !chunks.length) {
return;
}
var canvas = elem.find(".chunk-canvas")[0];
if (!canvas) {
return;
}
var ctx = canvas.getContext('2d');
ctx.fillStyle = "#149BDF";
ctx.clearRect(0, 0, canvas.width, canvas.height);
var x = 0,
width = canvas.width,
height = canvas.height;
chunks.forEach(function(c) {
var dx = c.ratio * width;
if (c.show)
ctx.fillRect(x, 0, dx, height);
x += dx;
});
}
function deleteDownloadTemplates($top_elem, data) {
if(!data) {
graphData = [];
$top_elem.html("");
} else {
var elems = $top_elem.find('[data-gid]');
for(var i = 0; i < elems.length; i++) {
var elem = $(elems[i]);
var gid = elem.attr('data-gid').toString();
var found = false;
for(var j = 0; j < data.length; j++) {
if(gid === data[j].gid.toString())
found = true;
}
if(!found) {
for (var k = 0; k < graphData.length; k++) {
if (graphData[k].gid == gid) {
graphData.splice(k, 1);
break;
}
}
elem.remove();
}
}
}
}
function refreshDownloadTemplates(top_elem, data) {
var down_template = $('#download_template').text(),
new_items = [],
$top_elem = $('#' + top_elem + '_downloads');
deleteDownloadTemplates($top_elem, data);
for(var i = 0; i < data.length; i++) {
var ctx = getTemplateCtx(data[i]);
var elem = $top_elem.find('[data-gid=' + ctx.gid + ']');
if(elem.length) {
updateDownloadTemplates(elem, ctx);
} else {
var item = Mustache.render(down_template, ctx);
new_items.push(item);
}
}
if (new_items.length > 0) {
$top_elem.append(new_items);
}
$top_elem.children('.hero-unit').remove();
}
function updateGraph(gid) {
var elem = $('[data-gid=' + gid + ']');
for (var i = 0; i < graphData.length; i++) {
if (graphData[i].gid == gid) {
var moreInfo = $(elem).find(".more_info");
if (moreInfo.hasClass("in")) {
graphData[i].plot.setData([{
label: "Download Speed",
data: graphData[i].downSpeed,
color: "#ff0000",
lines: { show: true }
}, {
label: "Upload Speed",
data: graphData[i].upSpeed,
color: "#00ff00",
lines: { show: true }
}]);
graphData[i].plot.resize();
graphData[i].plot.setupGrid();
graphData[i].plot.draw();
}
}
}
}
function createGraph(selector) {
var elem = $(selector);
elem.height(elem.width() / 2);
return $.plot(elem, [{
label: "Download Speed",
data: [],
color: "#ff0000",
lines: { show: true }
}, {
label: "Upload Speed",
data: [],
color: "#00ff00",
lines: { show: true }
}], {
legend: { show: true },
xaxis: { show: true },
yaxis: {
tickFormatter: function(val, axis) {
return changeLength(val, "B/s");
},
min: 0
}
});
}
function updateGraphData(data) {
for (var i = 0; i < data.length; i++) {
var gid = data[i].gid;
var graph = null;
for (var k = 0; k < graphData.length; k++) {
if (graphData[k].gid == gid) {
graph = graphData[k];
break;
}
}
var downSpeed = data[i].downloadSpeed;
var upSpeed = data[i].uploadSpeed;
var that = this;
if (!graph) {
graphData.push((function() {
return {
gid: gid,
downSpeed: [],
upSpeed: [],
add: function(arr, val) {
if (arr.length == graphSize) {
arr.shift();
}
arr.push([((new Date - this.start)/1000).toFixed(0), val]);
},
addDown: function(val) {
this.add(this.downSpeed, val);
return this;
},
addUp: function(val) {
this.add(this.upSpeed, val);
return this;
},
plot: that.createGraph('[data-gid=' + gid + '] .download-graph'),
start: new Date()
}
})().addDown(downSpeed).addUp(upSpeed));
}
else {
graph.addDown(downSpeed).addUp(upSpeed);
}
this.updateGraph(gid);
}
}
function getActiveSettings(gid, cb) {
var sets = [];
var tmp_set = [];
for(var i = 0; i < download_active_settings.length; i++) {
tmp_set = $.extend(true, {}, download_active_settings[i]);
sets.push(tmp_set);
}
aria_syscall({
func: 'getOption',
params: [gid],
success: function(data) {
var res = data.result;
merge_settings_data(sets, res);
cb(sets);
},
error: function() {
alert("Connection to aria server failed");
}
});
}
function check_waiting(name) {
for(var i = 0; i < download_waiting_exclude.length; i++) {
if(download_waiting_exclude[i] === name) {
return false;
}
}
return true;
}
function getWaitingSettings(gid, cb) {
var sets = [];
var tmp_set = [];
for(var i = 0; i < input_file_settings.length; i++) {
tmp_set = $.extend(true, {}, input_file_settings[i]);
if(check_waiting(tmp_set)) {
sets.push(tmp_set);
}
}
for(var i = 0; i < download_active_settings.length; i++) {
tmp_set = $.extend(true, {}, download_active_settings[i]);
if(check_waiting(tmp_set)) {
sets.push(tmp_set);
}
}
aria_syscall({
func: 'getOption',
params: [gid],
success: function(data) {
var res = data.result;
merge_settings_data(sets, res);
cb(sets);
},
error: function() {
alert("Connection to aria server failed");
}
});
}
function empty_download_set(elem) {
var len = d_files.active.length;
len += d_files.waiting.length;
len += d_files.stopped.length;
if(len === 0) {
var html = '<div class="hero-unit"><h3>';
html += 'Currently no downloads in line to display, use the Add download button to start downloading files!';
html += '</h3></div>';
$(elem).html(html);
}
}
function updateActiveDownloads(data) {
refreshDownloadTemplates('active', data);
updateGraphData(data);
empty_download_set('#active_downloads');
$('.active-download .download_settings').unbind('click').click(function() {
var gid = $(this).parents('.active-download').attr('data-gid');
var settings_name = $(this).parents('.active-download').attr('data-settingsName');
var gen = function(name) {
return { name: name, values: [] };
};
var general_settings = gen("General Settings");
var torrent_settings = gen("Bit-Torrent Settings");
getActiveSettings(gid, function(sets) {
for(var i = 0; i < sets.length; i++) {
var set = sets[i];
if(set.name.indexOf("bt") !== -1 || set.name.indexOf("torrent") !== -1) {
torrent_settings.values.push(set);
}
else
general_settings.values.push(set);
}
var templ = $('#download_settings_template').text();
var item = Mustache.render(templ, {
settings_name: settings_name,
gid: gid,
settings: [
general_settings,
torrent_settings
]
});
$('#download_settings_modal').html(item);
modals.download_settings_modal.modal('show');
$("#save_download_settings").one('click',function() {
var settings = {};
for(var i = 0; i < sets.length; i++) {
var elem = $("#download_settings_" + sets[i].name);
if(sets[i].value) {
if(elem.val() !== sets[i].value) {
settings[sets[i].name] = elem.val();
}
}
else if(elem.val() !== "no_val" && elem.val() !== "") {
settings[sets[i].name] = elem.val();
}
}
if(!$.isEmptyObject(settings)) {
aria_syscall({
func: 'changeOption',
params: [gid, settings],
success: function(data) {
clear_dialogs();
}
});
}
else {
clear_dialogs();
}
});
});
});
$('.active-download .download_pause').unbind('click').click(function() {
var gid = $(this).parents('.active-download').attr('data-gid');
aria_syscall({
func: 'forcePause',
params: [gid],
success: function() {
update_ui();
},
error: function(err) {
console.log("error pausing active download!!!");
console.log(err);
}
});
});
$('.active-download .torrent_info').unbind('click').click(function() {
var info_name = $(this).parents('.active-download').attr('data-settingsName');
var gid = $(this).parents('.active-download').attr('data-gid');
aria_syscall({
func: 'getPeers',
params: [gid],
success: function(data) {
var peers = data.result.map(function(e) {
e.downloadSpeed = changeLength(e.downloadSpeed, "B/s");
e.uploadSpeed = changeLength(e.uploadSpeed, "B/s");
return e;
});
var download = d_files.active.filter(function(d) {
d.gid == gid
})[1];
var templ = $('#torrent_info_template').text();
var item = Mustache.render(templ, {
info_name: info_name,
gid: gid,
peers: peers
});
$('#torrent_info_modal').html(item);
modals.torrent_info_modal.modal('show');
console.log($('#torrent_info_modal'));
update_ui();
},
error: function(err) {
console.log("error pausing active download!!!");
console.log(err);
}
});
});
$('.active-download .download_remove').unbind('click').click(function() {
var gid = $(this).parents('.active-download').attr('data-gid');
aria_syscall({
func: 'remove',
params: [gid],
success: function() {
update_ui();
},
error: function(err) {
console.log("error removing active download!!!");
console.log(err);
}
});
});
}
function updateWaitingDownloads(data) {
refreshDownloadTemplates('waiting', data);
$('.waiting-download .download_settings').unbind('click').click(function() {
var gid = $(this).parents('.waiting-download').attr('data-gid');
var settings_name = $(this).parents('.waiting-download').attr('data-settingsName');
var gen = function(name) {
return { name: name, values: [] };
};
var general_settings = gen("General Settings");
var torrent_settings = gen("Bit-Torrent Settings");
var ftp_settings = gen("FTP Settings");
var http_settings = gen("HTTP(S) Settings");
var metalink_settings = gen("Metalink Settings");
getWaitingSettings(gid, function(sets) {
for(var i = 0; i < sets.length; i++) {
var set = sets[i];
if(set.name.indexOf("bt") !== -1 || set.name.indexOf("torrent") !== -1) {
torrent_settings.values.push(set);
}
else if(set.name.indexOf("metalink") !== -1) {
metalink_settings.values.push(set);
}
else if(set.name.indexOf("http") !== -1) {
http_settings.values.push(set);
}
else if(set.name.indexOf("ftp") !== -1) {
ftp_settings.values.push(set);
}
else
general_settings.values.push(set);
}
var templ = $('#download_settings_template').text();
var item = Mustache.render(templ, {
settings_name: settings_name,
gid: gid,
settings: [
general_settings,
http_settings,
ftp_settings,
torrent_settings,
metalink_settings
]
});
$('#download_settings_modal').html(item);
modals.download_settings_modal.modal('show');
$("#save_download_settings").one('click',function() {
var settings = {};
for(var i = 0; i < sets.length; i++) {
var elem = $("#download_settings_" + sets[i].name);
if(sets[i].value) {
if(elem.val() !== sets[i].value) {
settings[sets[i].name] = elem.val();
}
}
else if(elem.val() !== "no_val" && elem.val() !== "") {
settings[sets[i].name] = elem.val();
}
}
if(!$.isEmptyObject(settings)) {
aria_syscall({
func: 'changeOption',
params: [gid, settings],
success: function(data) {
clear_dialogs();
}
});
}
else {
clear_dialogs();
}
});
});
});
$('.waiting-download .download_play').unbind('click').click(function() {
var gid = $(this).parents('.waiting-download').attr('data-gid');
aria_syscall({
func: 'unpause',
params: [gid],
success: function(data) {
update_ui();
},
error: function(err) {
console.log("error playing waiting download!!!");
console.log(err);
}
});
});
$('.waiting-download .download_remove').unbind('click').click(function() {
var gid = $(this).parents('.waiting-download').attr('data-gid');
aria_syscall({
func: 'remove',
params: [gid],
success: function() {
update_ui();
},
error: function(err) {
console.log("error removing waiting download!!!");
console.log(err);
}
});
});
}
function updateStoppedDownloads(data) {
refreshDownloadTemplates('stopped', data);
$('.stopped-download .download_remove').unbind('click').click(function() {
var gid = $(this).parents('.stopped-download').attr('data-gid');
aria_syscall({
func: 'removeDownloadResult',
params: [gid],
success: function() {
update_ui();
},
error: function(err) {
console.log("error removing stopped download!!!");
console.log(err);
}
});
});
$('.stopped-download .download_restart').unbind('click').click(function() {
var gid = $(this).parents('.stopped-download').attr('data-gid');
var files;
var uris = [];
for(var i = 0; i < d_files.stopped.length; i++) {
if(d_files.stopped[i].gid === gid) {
files = d_files.stopped[i].files;
break;
}
}
for(var i = 0; i < files.length; i++) {
var tmp_uris = [];
for(var j = 0; j < files[i].uris.length; j++) {
tmp_uris.push(files[i].uris[j].uri);
}
uris.push(tmp_uris);
}
addDownload(uris);
aria_syscall({
func: 'removeDownloadResult',
params: [gid],
success: function() {
update_ui();
},
error: function(err) {
console.log("error removing stopped download!!!");
console.log(err);
}
});
});
}
function mergeDownloads(data) {
d_files.active = data[0][0];
d_files.waiting = data[1][0];
d_files.stopped = data[2][0];
}
function updateDownloads() {
aria_syscall({
func: 'system.multicall',
params:[[{
methodName: 'aria2.tellActive'
}, {
methodName: 'aria2.tellWaiting',
params: [0,100]
}, {
methodName: 'aria2.tellStopped',
params: [0, 100]
}, {
methodName: "aria2.getGlobalStat"
}]],
success: function(data) {
mergeDownloads(data.result);
updateStoppedDownloads(d_files.stopped);
updateWaitingDownloads(d_files.waiting);
updateActiveDownloads(d_files.active);
updateGlobalStatistics(data.result[3][0]);
},
error: function() {
server_conf.dirty = true;
modals.err_connect.modal('show');
}
}, true);
}
function calculateProg() {
var total = 0, done = 0;
_.forEach(d_files.active, function(d) {
total += d.totalLength;
done += d.completedLength;
});
return 100 * (done / total);
}
function updateGlobalStatistics(data) {
var title = "aria2 Web Client";
if (data.uploadSpeed > 0 || data.downloadSpeed > 0) {
title = "- " + title;
if (data.uploadSpeed > 0) {
title = "↑" + changeLength(data.uploadSpeed, "B/s") + " " + title;
}
if (data.downloadSpeed > 0) {
title = "↓" + changeLength(data.downloadSpeed, "B/s") + " " + title;
}
}
//title = '(' + calculateProg().toFixed(2) + '%) ' + title;
Piecon.setProgress(calculateProg());
document.title = title;
data.downloadSpeed = changeLength(data.downloadSpeed, "B/s");
data.uploadSpeed = changeLength(data.uploadSpeed, "B/s");
for(var i in data) {
$('.stat_' + i).text(data[i]);
}
if (globalGraphData) {
globalGraphData.addDown(parseFloat(data.downloadSpeed));
globalGraphData.addUp(parseFloat(data.uploadSpeed));
globalGraphData.plot.setData([{
label: "Download Speed",
data: globalGraphData.downSpeed,
color: "#ff0000",
lines: { show: true }
}, {
label: "Upload Speed",
data: globalGraphData.upSpeed,
color: "#00ff00",
lines: { show: true }
}]);
globalGraphData.plot.resize();
globalGraphData.plot.setupGrid();
globalGraphData.plot.draw();
}
}
function custom_global_statistics() {
var tmpl = $('#global_statistics_template').text();
modals.global_statistics_modal.modal('show');
}
function show_about() {
aria_syscall({
func: 'getVersion',
success: function(data) {
$('.about_aria_version').text(data.result.version);
$('.about_webclient_version').text('beta testing');
modals.about_modal.modal('show');
}
});
}
function force_pause_all() {
aria_syscall({
func: 'forcePauseAll',
success: update_ui
});
}
function force_remove_all() {
var remove_params = [];
var func = function(downs) {
for(var i = 0; i < downs.length; i++) {
remove_params.push({
methodName: 'aria2.remove',
params: [downs[i].gid]
});
}
}
func(d_files.active);
func(d_files.waiting);
aria_syscall({
func: 'system.multicall',
params:[remove_params],
success: purge_all
}, true);
}
function purge_all() {
aria_syscall({
func: "purgeDownloadResult",
success: update_ui
});
}
function resume_paused() {
aria_syscall({
func: "unpauseAll",
success: update_ui
});
}
function add_torrent() {
var file_node = $('#input_torrent')[0];
var files = file_node.files;
if (files.length) {
for (var i = 0, f; f = files[i]; i++) {
var reader = new FileReader();
reader.onload = function(e) {
var txt = e.target.result;
txt = txt.split(',')[1];
aria_syscall({
func: 'addTorrent',
params: [txt],
success: function() {
clear_dialogs();
update_ui();
}
});
};
reader.onerror = function(e) {
alert('error reading torrent, your browser policy does not allow to read local files, please change to firefox');
};
reader.readAsDataURL(f);
}
}
else {
alert("please select a torrent first!");
}
}
function add_metalink() {
var file_node = $('#input_metalink')[0];
var files = file_node.files;
if (files.length) {
for (var i = 0, f; f = files[i]; i++) {
var reader = new FileReader();
reader.onload = function(e) {
var txt = e.target.result;
txt = txt.split(',')[1];
aria_syscall({
func: 'addMetalink',
params: [txt],
success: function() {
clear_dialogs();
update_ui();
}
});
};
reader.onerror = function(e) {
alert('error reading metalink, your browser policy does not allow to read local files, please change to firefox');
};
reader.readAsDataURL(f);
}
}
else {
alert("please select a metalink first!");
}
}