2025-10-09 10:06:29 +02:00
|
|
|
"use strict";
|
|
|
|
|
|
2025-10-09 15:42:31 +02:00
|
|
|
class trdom_torrentcontrol extends EventTarget {
|
2025-10-09 10:06:29 +02:00
|
|
|
#logcb;
|
|
|
|
|
#log(loglevel, msg) {
|
|
|
|
|
if (this.#logcb !== null) {
|
2025-10-09 15:42:31 +02:00
|
|
|
this.#logcb(`server:${this.#server.name}:${this.#hash}`, loglevel, msg);
|
2025-10-09 10:06:29 +02:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#element = document.createElement('div');
|
2025-10-09 15:42:31 +02:00
|
|
|
get element() {
|
2025-10-09 10:06:29 +02:00
|
|
|
return this.#element;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#hash;
|
|
|
|
|
#server;
|
|
|
|
|
|
2025-10-09 15:42:31 +02:00
|
|
|
#data;
|
|
|
|
|
get exists() {
|
|
|
|
|
return this.#data != null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
updateDOM() {
|
|
|
|
|
let control_element = this.#element;
|
|
|
|
|
let status = control_element.element_status;
|
|
|
|
|
|
|
|
|
|
control_element.classList.remove(
|
|
|
|
|
'trweb_status_asdf',
|
|
|
|
|
'trweb_status_offline',
|
|
|
|
|
'trweb_status_nonexistent',
|
|
|
|
|
'trweb_status_paused',
|
|
|
|
|
'trweb_status_verifqueued',
|
|
|
|
|
'trweb_status_verifying',
|
|
|
|
|
'trweb_status_downloading',
|
|
|
|
|
'trweb_status_seeding'
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
nukeChildren(status);
|
|
|
|
|
|
|
|
|
|
let statustext = 'Nothing to see here';
|
|
|
|
|
let statusclass = 'trweb_status_asdf'
|
|
|
|
|
let barwidth = 50;
|
|
|
|
|
if (!this.#server.isOnline()) {
|
|
|
|
|
statustext = "Server offline";
|
|
|
|
|
statusclass = 'trweb_status_offline';
|
|
|
|
|
barwidth = 0;
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
if (!this.exists) {
|
|
|
|
|
//this.#log(5, JSON.stringify(this.#data));
|
|
|
|
|
statustext = "Not available";
|
|
|
|
|
statusclass = 'trweb_status_nonexistent';
|
|
|
|
|
barwidth = 0;
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
let server_status = this.#data;
|
|
|
|
|
statustext = `${server_status.status}`;
|
|
|
|
|
barwidth = server_status.percentDone;
|
|
|
|
|
switch (server_status.status) {
|
|
|
|
|
case 0:
|
|
|
|
|
statustext = 'Paused';
|
|
|
|
|
statusclass = 'trweb_status_paused';
|
|
|
|
|
break;
|
|
|
|
|
case 1:
|
|
|
|
|
statustext = 'Queued for verification';
|
|
|
|
|
statusclass = 'trweb_status_verifqueued';
|
|
|
|
|
break;
|
|
|
|
|
case 2:
|
|
|
|
|
statustext = 'Verifying';
|
|
|
|
|
statusclass = 'trweb_status_verifying';
|
|
|
|
|
break;
|
|
|
|
|
case 3:
|
|
|
|
|
statustext = 'Queued';
|
|
|
|
|
break;
|
|
|
|
|
case 4:
|
|
|
|
|
statustext = 'Downloading';
|
|
|
|
|
statusclass = 'trweb_status_downloading';
|
|
|
|
|
break;
|
|
|
|
|
case 6:
|
|
|
|
|
statustext = 'Seeding';
|
|
|
|
|
statusclass = 'trweb_status_seeding';
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
statustext = `[${this.#server.name}]: ${statustext} - ${server_status.percentDone}%`;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
control_element.element_statusbar.style.width = `${barwidth}%`;
|
|
|
|
|
control_element.classList.add(statusclass);
|
|
|
|
|
status.appendChild(document.createTextNode(statustext));
|
|
|
|
|
}
|
2025-10-09 10:06:29 +02:00
|
|
|
|
2025-10-09 11:35:35 +02:00
|
|
|
handleEvent(e) {
|
2025-10-09 15:42:31 +02:00
|
|
|
this.#log(6, `Handling event of type ${e.type}`);
|
2025-10-09 10:06:29 +02:00
|
|
|
switch (e.type) {
|
|
|
|
|
case 'click':
|
|
|
|
|
if (e.currentTarget.hasAttributeNS('trweb', 'torrentlistfield')) {
|
|
|
|
|
switch (e.currentTarget.getAttributeNS('trweb', 'torrentlistfield')) {
|
|
|
|
|
case 'start':
|
2025-10-09 10:16:13 +02:00
|
|
|
this.#server.torrent_start(this.#hash);
|
2025-10-09 10:06:29 +02:00
|
|
|
e.stopPropagation();
|
|
|
|
|
break;
|
|
|
|
|
case 'pause':
|
2025-10-09 10:16:13 +02:00
|
|
|
this.#server.torrent_pause(this.#hash);
|
2025-10-09 10:06:29 +02:00
|
|
|
e.stopPropagation();
|
|
|
|
|
break;
|
|
|
|
|
case 'magnet':
|
2025-10-09 15:42:31 +02:00
|
|
|
/*let magneturl;
|
2025-10-09 10:16:13 +02:00
|
|
|
for (const [srv, data] of Object.entries(this.#getKnownTorrents()[this.#hash].servers)) {
|
2025-10-09 10:06:29 +02:00
|
|
|
if (data.magnetLink != null) {
|
|
|
|
|
magneturl = data.magnetLink;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (magneturl != null) {
|
|
|
|
|
this.#server.torrent_add_url(magneturl, false, null);
|
|
|
|
|
}
|
|
|
|
|
else {
|
2025-10-09 10:16:13 +02:00
|
|
|
this.#log(3, `Couldn't find magnet link! ${JSON.stringify(this.#getKnownTorrents()[this.#hash].servers)}`);
|
2025-10-09 15:42:31 +02:00
|
|
|
}*/
|
2025-10-09 10:06:29 +02:00
|
|
|
e.stopPropagation();
|
2025-10-09 15:42:31 +02:00
|
|
|
window.alert('not implemented');
|
2025-10-09 10:06:29 +02:00
|
|
|
break;
|
|
|
|
|
case 'download':
|
|
|
|
|
e.stopPropagation();
|
|
|
|
|
window.alert('not implemented');
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
2025-10-09 15:42:31 +02:00
|
|
|
break;
|
|
|
|
|
case 'torrent-deleted':
|
|
|
|
|
this.#log(6, 'we be delet');
|
|
|
|
|
this.#data = null;
|
|
|
|
|
this.updateDOM();
|
|
|
|
|
break;
|
|
|
|
|
case 'torrent-updated':
|
|
|
|
|
if (e.detail.torrentHash == this.#hash) {
|
|
|
|
|
this.#log(6, `Got data from server: ${JSON.stringify(e.detail.torrentInfo)}`);
|
|
|
|
|
this.#data = e.detail.torrentInfo;
|
|
|
|
|
this.updateDOM();
|
|
|
|
|
}
|
|
|
|
|
break;
|
2025-10-09 10:06:29 +02:00
|
|
|
}
|
2025-10-09 11:35:35 +02:00
|
|
|
}
|
2025-10-09 10:06:29 +02:00
|
|
|
|
2025-10-09 15:42:31 +02:00
|
|
|
constructor(hash, server, initdata = null, logcb = null) {
|
|
|
|
|
super();
|
2025-10-09 10:06:29 +02:00
|
|
|
this.#hash = hash;
|
|
|
|
|
this.#server = server;
|
|
|
|
|
this.#logcb = logcb;
|
|
|
|
|
|
|
|
|
|
let srv = server.name;
|
|
|
|
|
|
|
|
|
|
// statusbar
|
|
|
|
|
let element_statusbar = document.createElement('div');
|
|
|
|
|
element_statusbar.classList.add('trweb_torrentliststatusbar');
|
|
|
|
|
|
|
|
|
|
// Current status and percentage
|
|
|
|
|
let element_status = document.createElement('div');
|
|
|
|
|
element_status.classList.add('trweb_torrentliststatus', 'col-12');
|
|
|
|
|
element_status.setAttributeNS('trweb', 'server', srv);
|
|
|
|
|
element_status.setAttributeNS('trweb', 'torrentlistfield', 'status');
|
|
|
|
|
|
|
|
|
|
let element_start = document.createElement('div');
|
|
|
|
|
element_start.classList.add('trweb_torrentlistcontrol', 'col-4');
|
|
|
|
|
element_start.setAttributeNS('trweb', 'server', srv);
|
2025-10-09 10:16:13 +02:00
|
|
|
element_start.setAttributeNS('trweb', 'torrent', this.#hash);
|
2025-10-09 10:06:29 +02:00
|
|
|
element_start.setAttributeNS('trweb', 'torrentlistfield', 'start');
|
|
|
|
|
element_start.appendChild(document.createTextNode("Start"));
|
2025-10-09 11:35:35 +02:00
|
|
|
element_start.addEventListener("click", this);
|
2025-10-09 10:06:29 +02:00
|
|
|
|
|
|
|
|
let element_pause = document.createElement('div');
|
|
|
|
|
element_pause.classList.add('trweb_torrentlistcontrol', 'col-4');
|
|
|
|
|
element_pause.setAttributeNS('trweb', 'server', srv);
|
2025-10-09 10:16:13 +02:00
|
|
|
element_pause.setAttributeNS('trweb', 'torrent', this.#hash);
|
2025-10-09 10:06:29 +02:00
|
|
|
element_pause.setAttributeNS('trweb', 'torrentlistfield', 'pause');
|
|
|
|
|
element_pause.appendChild(document.createTextNode("Pause"));
|
2025-10-09 11:35:35 +02:00
|
|
|
element_pause.addEventListener("click", this);
|
2025-10-09 10:06:29 +02:00
|
|
|
|
|
|
|
|
// Download by magnet
|
|
|
|
|
let element_magnet = document.createElement('div');
|
|
|
|
|
element_magnet.classList.add('trweb_torrentlistmagnet', 'col');
|
|
|
|
|
element_magnet.setAttributeNS('trweb', 'server', srv);
|
2025-10-09 10:16:13 +02:00
|
|
|
element_magnet.setAttributeNS('trweb', 'torrent', this.#hash);
|
2025-10-09 10:06:29 +02:00
|
|
|
element_magnet.setAttributeNS('trweb', 'torrentlistfield', 'magnet');
|
|
|
|
|
element_magnet.appendChild(document.createTextNode(`[${srv}] Magnet`));
|
2025-10-09 11:35:35 +02:00
|
|
|
element_magnet.addEventListener("click", this);
|
2025-10-09 10:06:29 +02:00
|
|
|
|
|
|
|
|
// Download by torrent file
|
|
|
|
|
let element_download = document.createElement('div');
|
|
|
|
|
element_download.classList.add('trweb_torrentlistdownload', 'col');
|
|
|
|
|
element_download.setAttributeNS('trweb', 'server', srv);
|
2025-10-09 10:16:13 +02:00
|
|
|
element_download.setAttributeNS('trweb', 'torrent', this.#hash);
|
2025-10-09 10:06:29 +02:00
|
|
|
element_download.setAttributeNS('trweb', 'torrentlistfield', 'download');
|
|
|
|
|
element_download.appendChild(document.createTextNode(`[${srv}] Get torrent`));
|
2025-10-09 11:35:35 +02:00
|
|
|
element_download.addEventListener("click", this);
|
2025-10-09 10:06:29 +02:00
|
|
|
|
|
|
|
|
// row container
|
|
|
|
|
let element_serverrow = document.createElement('div');
|
|
|
|
|
element_serverrow.classList.add('trweb_torrentlistserverrow', 'row');
|
|
|
|
|
element_serverrow.appendChild(element_status);
|
|
|
|
|
element_serverrow.appendChild(element_start);
|
|
|
|
|
element_serverrow.appendChild(element_pause);
|
|
|
|
|
element_serverrow.appendChild(element_magnet);
|
|
|
|
|
element_serverrow.appendChild(element_download);
|
|
|
|
|
|
|
|
|
|
this.#element.classList.add('trweb_torrentlistserver', 'col-2', 'container');
|
|
|
|
|
this.#element.setAttributeNS('trweb', 'torrentlistfield', 'server');
|
|
|
|
|
this.#element.setAttributeNS('trweb', 'server', srv);
|
|
|
|
|
this.#element.element_statusbar = element_statusbar;
|
|
|
|
|
this.#element.appendChild(element_statusbar);
|
|
|
|
|
this.#element.element_row = element_serverrow;
|
|
|
|
|
this.#element.appendChild(element_serverrow);
|
|
|
|
|
this.#element.element_status = element_status;
|
|
|
|
|
this.#element.element_start = element_start;
|
|
|
|
|
this.#element.element_pause = element_pause;
|
|
|
|
|
this.#element.element_magnet = element_magnet;
|
|
|
|
|
this.#element.element_download = element_download;
|
2025-10-09 15:42:31 +02:00
|
|
|
|
|
|
|
|
this.#data = initdata;
|
|
|
|
|
|
|
|
|
|
this.updateDOM();
|
|
|
|
|
|
|
|
|
|
this.addEventListener('torrent-updated', this);
|
|
|
|
|
|
|
|
|
|
this.addEventListener('torrent-deleted', this);
|
|
|
|
|
|
|
|
|
|
server.addControl(hash, this);
|
2025-10-09 10:06:29 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|