From 49aa08f4c66052881e3266e488c29bd24849c6a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Feh=C3=A9r=20Roland?= Date: Wed, 8 Oct 2025 15:44:46 +0200 Subject: [PATCH] REVERT: save status --- index.html | 5 +- js/trdom_torrentcontrol.js | 138 +++++++++++++++++++++++++++++++ js/trdom_torrentmanager.js | 12 +++ js/trtorrent.js | 53 ++++++++++++ js/trweb.js | 162 +++++-------------------------------- 5 files changed, 226 insertions(+), 144 deletions(-) create mode 100644 js/trdom_torrentcontrol.js create mode 100644 js/trdom_torrentmanager.js create mode 100644 js/trtorrent.js diff --git a/index.html b/index.html index 4b41945..764b9f5 100644 --- a/index.html +++ b/index.html @@ -19,9 +19,12 @@ crossorigin="anonymous" /> - + + + + diff --git a/js/trdom_torrentcontrol.js b/js/trdom_torrentcontrol.js new file mode 100644 index 0000000..0998a76 --- /dev/null +++ b/js/trdom_torrentcontrol.js @@ -0,0 +1,138 @@ +"use strict"; + +class trdom_torrentcontrol { + #logcb; + #log(loglevel, msg) { + if (this.#logcb !== null) { + this.#logcb('trdom_servermanager', loglevel, msg); + } + } + + #element = document.createElement('div'); + getElement() { + return this.#element; + } + + #hash; + #server; + + //TODO: remove + #getKnownTorrents; + + #handler(e) { + switch (e.type) { + case 'click': + if (e.currentTarget.hasAttributeNS('trweb', 'torrentlistfield')) { + switch (e.currentTarget.getAttributeNS('trweb', 'torrentlistfield')) { + case 'start': + hash = e.currentTarget.getAttributeNS('trweb', 'torrent'); + this.#server.torrent_start(hash); + e.stopPropagation(); + break; + case 'pause': + hash = e.currentTarget.getAttributeNS('trweb', 'torrent'); + this.#server.torrent_pause(hash); + e.stopPropagation(); + break; + case 'magnet': + let magneturl; + hash = e.currentTarget.getAttributeNS('trweb', 'torrent'); + for (const [srv, data] of Object.entries(this.#getKnownTorrents()[hash].servers)) { + if (data.magnetLink != null) { + magneturl = data.magnetLink; + break; + } + } + if (magneturl != null) { + this.#server.torrent_add_url(magneturl, false, null); + } + else { + this.#log(3, `Couldn't find magnet link! ${JSON.stringify(this.#getKnownTorrents()[hash].servers)}`); + } + e.stopPropagation(); + break; + case 'download': + e.stopPropagation(); + window.alert('not implemented'); + break; + } + } + } + } + + constructor(hash, server, logcb, getKnownTorrents) { + this.#hash = hash; + this.#server = server; + this.#logcb = logcb; + this.#getKnownTorrents = getKnownTorrents; + + 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); + element_start.setAttributeNS('trweb', 'torrent', hash); + element_start.setAttributeNS('trweb', 'torrentlistfield', 'start'); + element_start.appendChild(document.createTextNode("Start")); + element_start.addEventListener("click", this.#handler.bind(this)); + + let element_pause = document.createElement('div'); + element_pause.classList.add('trweb_torrentlistcontrol', 'col-4'); + element_pause.setAttributeNS('trweb', 'server', srv); + element_pause.setAttributeNS('trweb', 'torrent', hash); + element_pause.setAttributeNS('trweb', 'torrentlistfield', 'pause'); + element_pause.appendChild(document.createTextNode("Pause")); + element_pause.addEventListener("click", this.#handler.bind(this)); + + // Download by magnet + let element_magnet = document.createElement('div'); + element_magnet.classList.add('trweb_torrentlistmagnet', 'col'); + element_magnet.setAttributeNS('trweb', 'server', srv); + element_magnet.setAttributeNS('trweb', 'torrent', hash); + element_magnet.setAttributeNS('trweb', 'torrentlistfield', 'magnet'); + element_magnet.appendChild(document.createTextNode(`[${srv}] Magnet`)); + element_magnet.addEventListener("click", this.#handler.bind(this)); + + // Download by torrent file + let element_download = document.createElement('div'); + element_download.classList.add('trweb_torrentlistdownload', 'col'); + element_download.setAttributeNS('trweb', 'server', srv); + element_download.setAttributeNS('trweb', 'torrent', hash); + element_download.setAttributeNS('trweb', 'torrentlistfield', 'download'); + element_download.appendChild(document.createTextNode(`[${srv}] Get torrent`)); + element_download.addEventListener("click", this.#handler.bind(this)); + + // 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; + } + +} \ No newline at end of file diff --git a/js/trdom_torrentmanager.js b/js/trdom_torrentmanager.js new file mode 100644 index 0000000..7311581 --- /dev/null +++ b/js/trdom_torrentmanager.js @@ -0,0 +1,12 @@ +"use strict"; + +class trdom_torrentmanager { + #element = document.createElement('div'); + getElement() { + return this.#element; + } + + constructor() { + this.#element.classList.add('trweb_torrentlistview', 'container-fluid'); + } +} diff --git a/js/trtorrent.js b/js/trtorrent.js new file mode 100644 index 0000000..37cb7df --- /dev/null +++ b/js/trtorrent.js @@ -0,0 +1,53 @@ +"use strict"; + +class trtorrent { + #element = document.createElement('div'); + getElement() { + return this.#element; + } + + #hash; + #name = '## NAME NOT SET ##'; + + #element_server = {}; + addControl(srv, control) { + this.#element_server[srv] = control; + this.#element.appendChild(control.getElement()); + } + getControl(srv) { + return this.#element_server[srv]; + } + + #servers = {}; + + #handler(e) { + switch (e.type) { + case 'click': + if (e.currentTarget.hasAttributeNS('trweb', 'torrentlistfield')) { + switch (e.currentTarget.getAttributeNS('trweb', 'torrentlistfield')) { + case 'entry': + e.currentTarget.classList.toggle('trweb_hide_buttons'); + e.stopPropagation(); + break; + } + } + break; + } + } + + constructor(hash) { + this.#hash = hash; + + // set up DOM structure + let element_name = document.createElement('div'); + element_name.classList.add('trweb_torrentlistname', 'col'); + element_name.setAttributeNS('trweb', 'fieldid', 'displayname'); + + this.#element.torrent = this; + this.#element.classList.add('trweb_torrentlistentry', 'trweb_hide_buttons', 'row'); + this.#element.setAttributeNS('trweb', 'torrentlistfield', 'entry'); + this.#element.addEventListener('click', this.#handler.bind(this)); + this.#element.element_name = element_name; + this.#element.appendChild(element_name); + } +} diff --git a/js/trweb.js b/js/trweb.js index cd2351d..deacf35 100644 --- a/js/trweb.js +++ b/js/trweb.js @@ -8,16 +8,17 @@ class trweb { #loadcb = function(key) {return localStorage.getItem(`trweb.${key}`)}; #savecb = function(key, value) {localStorage.setItem(`trweb.${key}`, value)}; #logger = function(msg) {}; + #logcb = function(module, loglevel, msg) {this.#logger(`${module}: ${msg}`)}; #timer; #container; - #torrentListView; #guiFooter; #dom_menubar = new trdom_menubar(); #dom_servermanager; + #dom_torrentmanagger = new trdom_torrentmanager(); constructor (container, loadcb, savecb, logger) { this.#container = container; @@ -29,10 +30,7 @@ class trweb { this.#logger = logger; } - this.#dom_servermanager = new trdom_servermanager(this.#loadcb, this.#savecb, function(module, loglevel, msg) {this.#logger(`${module}: ${msg}`)}.bind(this), this.#registerServer.bind(this)) - - this.#torrentListView = document.createElement('div'); - this.#torrentListView.classList.add('trweb_torrentlistview', 'container-fluid'); + this.#dom_servermanager = new trdom_servermanager(this.#loadcb, this.#savecb, this.#logcb.bind(this), this.#registerServer.bind(this)) this.#guiFooter = document.createElement('div'); this.#guiFooter.classList.add('trweb_footer'); @@ -64,117 +62,37 @@ class trweb { } #createTorrentEntry(hash) { - let entry = { - 'element': document.createElement('div'), - 'element_name': document.createElement('div'), - 'element_server': {}, - 'hash': hash, - 'name': '## NAME NOT SET ##', - 'servers': {} - }; + let torrent = new trtorrent(hash); - this.#knownTorrents[hash] = entry; + this.#knownTorrents[hash] = torrent; - // set up DOM structure - entry.element.torrent = entry; - entry.element.classList.add('trweb_torrentlistentry', 'trweb_hide_buttons', 'row'); - entry.element.setAttributeNS('trweb', 'torrentlistfield', 'entry'); - entry.element.addEventListener('click', this.#handler.bind(this)); - entry.element_name.classList.add('trweb_torrentlistname', 'col'); - entry.element_name.setAttributeNS('trweb', 'fieldid', 'displayname'); - entry.element.appendChild(entry.element_name); for (const srv of Object.keys(this.#dom_servermanager.getServers())) { this.#createServerEntryForTorrent(hash, srv); } - this.#torrentListView.appendChild(entry.element); + this.#dom_torrentmanagger.getElement().appendChild(torrent.getElement()); - this.#updateTorrentDisplay(entry); + this.#updateTorrentDisplay(torrent); - return entry; + return torrent; } #createServerEntryForTorrent(hash, srv) { this.#needsSort = true; - let entry = this.#knownTorrents[hash]; + let control = new trdom_torrentcontrol(hash, this.#dom_servermanager.getServers()[srv], this.#logcb.bind(this), function() {return this.#knownTorrents}.bind(this)); - let element_server = document.createElement('div'); - element_server.classList.add('trweb_torrentlistserver', 'col-2', 'container'); - element_server.setAttributeNS('trweb', 'torrentlistfield', 'server'); - element_server.setAttributeNS('trweb', 'server', srv); - entry.element_server[srv] = element_server; - entry.element.appendChild(entry.element_server[srv]); + let torrent = this.#knownTorrents[hash]; - // statusbar - let element_statusbar = document.createElement('div'); - element_statusbar.classList.add('trweb_torrentliststatusbar'); - element_server.element_statusbar = element_statusbar; - element_server.appendChild(element_statusbar); - - // row container - let element_serverrow = document.createElement('div'); - element_serverrow.classList.add('trweb_torrentlistserverrow', 'row'); - element_server.element_row = element_serverrow; - element_server.appendChild(element_serverrow); - - // 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'); - element_server.element_status = element_status; - element_serverrow.appendChild(element_status); - - let element_start = document.createElement('div'); - element_start.classList.add('trweb_torrentlistcontrol', 'col-4'); - element_start.setAttributeNS('trweb', 'server', srv); - element_start.setAttributeNS('trweb', 'torrent', hash); - element_start.setAttributeNS('trweb', 'torrentlistfield', 'start'); - element_start.appendChild(document.createTextNode("Start")); - element_start.addEventListener("click", this.#handler.bind(this)); - element_server.element_start = element_start; - element_serverrow.appendChild(element_start); - - let element_pause = document.createElement('div'); - element_pause.classList.add('trweb_torrentlistcontrol', 'col-4'); - element_pause.setAttributeNS('trweb', 'server', srv); - element_pause.setAttributeNS('trweb', 'torrent', hash); - element_pause.setAttributeNS('trweb', 'torrentlistfield', 'pause'); - element_pause.appendChild(document.createTextNode("Pause")); - element_pause.addEventListener("click", this.#handler.bind(this)); - element_server.element_pause = element_pause; - element_serverrow.appendChild(element_pause); - - // Download by magnet - let element_magnet = document.createElement('div'); - element_magnet.classList.add('trweb_torrentlistmagnet', 'col'); - element_magnet.setAttributeNS('trweb', 'server', srv); - element_magnet.setAttributeNS('trweb', 'torrent', hash); - element_magnet.setAttributeNS('trweb', 'torrentlistfield', 'magnet'); - element_magnet.appendChild(document.createTextNode(`[${srv}] Magnet`)); - element_magnet.addEventListener("click", this.#handler.bind(this)); - element_server.element_magnet = element_magnet; - element_serverrow.appendChild(element_magnet); - - // Download by torrent file - let element_download = document.createElement('div'); - element_download.classList.add('trweb_torrentlistdownload', 'col'); - element_download.setAttributeNS('trweb', 'server', srv); - element_download.setAttributeNS('trweb', 'torrent', hash); - element_download.setAttributeNS('trweb', 'torrentlistfield', 'download'); - element_download.appendChild(document.createTextNode(`[${srv}] Get torrent`)); - element_download.addEventListener("click", this.#handler.bind(this)); - element_server.element_download = element_download; - element_serverrow.appendChild(element_download); + torrent.addControl(srv, control); } #updateTorrentDisplay(torrent) { - let txt_name = torrent.element_name; + let txt_name = torrent.getElement().element_name; nukeChildren(txt_name); txt_name.appendChild(document.createTextNode(torrent.name)); for (const srv of Object.keys(this.#dom_servermanager.getServers())) { - let server = torrent.element_server[srv]; + let server = torrent.getControl(srv); let status = server.element_status; server.classList.remove( @@ -242,55 +160,13 @@ class trweb { #handler(e) { switch (e.type) { - case 'click': - if (e.currentTarget.hasAttributeNS('trweb', 'torrentlistfield')) { - let hash; - switch (e.currentTarget.getAttributeNS('trweb', 'torrentlistfield')) { - case 'entry': - e.currentTarget.classList.toggle('trweb_hide_buttons'); - e.stopPropagation(); - break; - case 'start': - hash = e.currentTarget.getAttributeNS('trweb', 'torrent'); - this.#dom_servermanager.getServers()[e.currentTarget.getAttributeNS('trweb', 'server')].torrent_start(hash); - e.stopPropagation(); - break; - case 'pause': - hash = e.currentTarget.getAttributeNS('trweb', 'torrent'); - this.#dom_servermanager.getServers()[e.currentTarget.getAttributeNS('trweb', 'server')].torrent_pause(hash); - e.stopPropagation(); - break; - case 'magnet': - let magneturl; - hash = e.currentTarget.getAttributeNS('trweb', 'torrent'); - for (const [srv, data] of Object.entries(this.#knownTorrents[hash].servers)) { - if (data.magnetLink != null) { - magneturl = data.magnetLink; - break; - } - } - if (magneturl != null) { - this.#dom_servermanager.getServers()[e.currentTarget.getAttributeNS('trweb', 'server')].torrent_add_url(magneturl, false, null); - } - else { - this.#logger(`Couldn't find magnet link! ${JSON.stringify(this.#knownTorrents[hash].servers)}`); - } - e.stopPropagation(); - break; - case 'download': - e.stopPropagation(); - window.alert('not implemented'); - break; - } - } - break; case 'DOMContentLoaded': this.#logger('Activating TRWEB instance'); this.#container = document.getElementById(this.#container); this.#container.classList.add('trweb_container'); this.#container.appendChild(this.#dom_menubar.getElement()); - this.#container.appendChild(this.#torrentListView); + this.#container.appendChild(this.#dom_torrentmanagger.getElement()); this.#container.appendChild(this.#guiFooter); this.#dom_servermanager.loadServers(); @@ -311,8 +187,8 @@ class trweb { let list = Object.values(this.#knownTorrents); list.sort((a, b) => a.name.localeCompare(b.name)); - for (const node of list) { - this.#torrentListView.appendChild(node.element); + for (const torrent of list) { + this.#dom_torrentmanagger.getElement().appendChild(torrent.getElement()); } return list; } @@ -351,8 +227,8 @@ class trweb { this.#dom_servermanager.saveServers(); } - /*removeServer(name) { - delete this.#servers[name]; + removeServer(name) { + delete this.#dom_servermanager.getServers()[name]; for (const [hash, entry] of Object.entries(this.#knownTorrents)) { entry.element.removeChild(entry.element_server[name]); @@ -361,7 +237,7 @@ class trweb { } this.#dom_servermanager.saveServers(); - }*/ + } } var trinstance = new trweb('trcontainer', null, null, function(msg) {console.info(`TRWEB: ${msg}`)});