From b08333c5ea912944467328246d3cbe4c77bcd7d2 Mon Sep 17 00:00:00 2001 From: Zlatin Balevsky Date: Sun, 15 Dec 2019 11:34:04 +0000 Subject: [PATCH] download details view --- .../muwire/core/download/Downloader.groovy | 4 + .../com/muwire/webui/DownloadServlet.java | 86 ++++++++++++------- .../src/main/java/com/muwire/webui/Util.java | 6 ++ webui/src/main/js/download.js | 54 ++++++++++-- 4 files changed, 115 insertions(+), 35 deletions(-) diff --git a/core/src/main/groovy/com/muwire/core/download/Downloader.groovy b/core/src/main/groovy/com/muwire/core/download/Downloader.groovy index a2b1eb1f..f4df59c6 100644 --- a/core/src/main/groovy/com/muwire/core/download/Downloader.groovy +++ b/core/src/main/groovy/com/muwire/core/download/Downloader.groovy @@ -265,6 +265,10 @@ public class Downloader { } active } + + public int getTotalWorkers() { + return activeWorkers.size(); + } public void resume() { paused = false diff --git a/webui/src/main/java/com/muwire/webui/DownloadServlet.java b/webui/src/main/java/com/muwire/webui/DownloadServlet.java index 3f1c8ccc..9b93c79a 100644 --- a/webui/src/main/java/com/muwire/webui/DownloadServlet.java +++ b/webui/src/main/java/com/muwire/webui/DownloadServlet.java @@ -7,6 +7,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; +import java.util.Optional; import java.util.Set; import java.util.UUID; @@ -54,38 +55,65 @@ public class DownloadServlet extends HttpServlet { resp.sendError(403, "Not initialized"); return; } - - List downloads = new ArrayList<>(); - downloadManager.getDownloaders().forEach(d -> { - - int speed = d.speed(); - long ETA = Long.MAX_VALUE; - if (speed > 0) - ETA = (d.getNPieces() - d.donePieces()) * d.getPieceSize() * 1000 / speed; - - int percent = -1; - if (d.getNPieces() != 0) - percent = (int)(d.donePieces() * 100 / d.getNPieces()); - - Download download = new Download(d.getInfoHash(), - d.getFile().getName(), - d.getCurrentState(), - speed, - ETA, - percent, - d.getLength()); - - downloads.add(download); - }); - COMPARATORS.sort(downloads, req); - + String section = req.getParameter("section"); StringBuilder sb = new StringBuilder(); sb.append(""); - sb.append(""); - downloads.forEach(d -> d.toXML(sb)); - sb.append(""); - + if (section.equals("list")) { + List downloads = new ArrayList<>(); + downloadManager.getDownloaders().forEach(d -> { + + int speed = d.speed(); + long ETA = Long.MAX_VALUE; + if (speed > 0) + ETA = (d.getNPieces() - d.donePieces()) * d.getPieceSize() * 1000 / speed; + + int percent = -1; + if (d.getNPieces() != 0) + percent = (int)(d.donePieces() * 100 / d.getNPieces()); + + Download download = new Download(d.getInfoHash(), + d.getFile().getName(), + d.getCurrentState(), + speed, + ETA, + percent, + d.getLength()); + + downloads.add(download); + }); + COMPARATORS.sort(downloads, req); + + + sb.append(""); + downloads.forEach(d -> d.toXML(sb)); + sb.append(""); + } else if (section.equals("details")) { + String infoHashB64 = req.getParameter("infoHash"); + InfoHash infoHash; + try { + infoHash = new InfoHash(Base64.decode(infoHashB64)); + } catch (Exception bad) { + resp.sendError(403, "Bad param"); + return; + } + Optional optional = downloadManager.getDownloaders().filter(d -> d.getInfoHash().equals(infoHash)).findFirst(); + if (optional.isPresent()) { + Downloader downloader = optional.get(); + + sb.append("
"); + sb.append("").append(Util.escapeHTMLinXML(downloader.getFile().getAbsolutePath())).append(""); + sb.append("").append(downloader.getPieceSize()).append(""); + sb.append("").append(downloader.getTotalWorkers()).append(""); + sb.append("").append(downloader.activeWorkers()).append(""); + sb.append("").append(downloader.getNPieces()).append(""); + sb.append("").append(downloader.donePieces()).append(""); + sb.append("
"); + } else { + resp.sendError(404, "Not found"); + return; + } + } resp.setContentType("text/xml"); resp.setCharacterEncoding("UTF-8"); diff --git a/webui/src/main/java/com/muwire/webui/Util.java b/webui/src/main/java/com/muwire/webui/Util.java index 9594133b..ce4e4b74 100644 --- a/webui/src/main/java/com/muwire/webui/Util.java +++ b/webui/src/main/java/com/muwire/webui/Util.java @@ -24,6 +24,7 @@ public class Util { private static final String[] jsStrings = { // alphabetical please _x("Actions"), + _x("Active Sources"), _x("Allow browsing"), _x("Allow only trusted connections"), _x("Allow others to view my trust list"), @@ -35,9 +36,11 @@ public class Util { _x("Clear Finished"), _x("Comment"), _x("Details for {0}"), + _x("Done Pieces"), _x("Down"), _x("Download"), _x("Download Settings"), + _x("Download Location"), _x("Downloader"), _x("Downloading"), _x("Enter Reason (Optional)"), @@ -52,6 +55,7 @@ public class Util { _x("Imported"), _x("Inbound tunnel length"), _x("Inbound tunnel quantity"), + _x("Known Sources"), _x("Last Updated"), _x("Mark Distrusted"), _x("Mark Neutral"), @@ -60,6 +64,7 @@ public class Util { _x("Outbound tunnel length"), _x("Outbound tunnel quantity"), _x("Pause"), + _x("Piece Size"), _x("Progress"), _x("Query"), _x("Reason"), @@ -91,6 +96,7 @@ public class Util { _x("Store incomplete files in"), _x("Subscribe"), _x("Subscribed"), + _x("Total Pieces"), _x("Total upload slots (-1 means unlimited)"), _x("Trust"), _x("Trust Settings"), diff --git a/webui/src/main/js/download.js b/webui/src/main/js/download.js index 4c71a016..65dfe40d 100644 --- a/webui/src/main/js/download.js +++ b/webui/src/main/js/download.js @@ -91,10 +91,49 @@ function cancelDownload(infoHash) { } function updateDownloader(infoHash) { - var selected = downloaders.get(infoHash); - - var downloadDetailsDiv = document.getElementById("downloadDetails"); - downloadDetailsDiv.innerHTML = "

" + _t("Details for {0}", selected.name) + "

" + downloader = infoHash + var xmlhttp = new XMLHttpRequest() + xmlhttp.onreadystatechange = function() { + if (this.readyState == 4 && this.status == 200) { + var path = this.responseXML.getElementsByTagName("Path")[0].childNodes[0].nodeValue + var pieceSize = this.responseXML.getElementsByTagName("PieceSize")[0].childNodes[0].nodeValue + var knownSources = this.responseXML.getElementsByTagName("KnownSources")[0].childNodes[0].nodeValue + var activeSources = this.responseXML.getElementsByTagName("ActiveSources")[0].childNodes[0].nodeValue + var totalPieces = this.responseXML.getElementsByTagName("TotalPieces")[0].childNodes[0].nodeValue + var donePieces = this.responseXML.getElementsByTagName("DonePieces")[0].childNodes[0].nodeValue + + var html = "" + html += "" + html += "" + html += "" + html += "" + html += "" + html += "" + html += "" + html += "" + html += "" + html += "" + html += "" + html += "" + html += "" + html += "" + html += "" + html += "" + html += "" + html += "" + html += "" + html += "" + html += "" + html += "" + html += "" + html += "" + html += "
" + _t("Download Location") + "" + "

" + path + "

" + "
" + _t("Known Sources") + "" + "

" + knownSources + "

" + "
" + _t("Active Location") + "" + "

" + activeSources + "

" + "
" + _t("Piece Size") + "" + "

" + pieceSize + "

" + "
" + _t("Total Pieces") + "" + "

" + totalPieces + "

" + "
" + _t("Done Pieces") + "" + "

" + donePieces + "

" + "
" + var downloadDetailsDiv = document.getElementById("downloadDetails"); + downloadDetailsDiv.innerHTML = html + } + } + xmlhttp.open("GET", "/MuWire/Download?section=details&infoHash=" + infoHash) + xmlhttp.send() } function refreshDownloader() { @@ -134,13 +173,16 @@ function refreshDownloader() { } else { downloadsDiv.innerHTML = "" clearDiv.innerHTML = "" + downloader = null + var downloadDetailsDiv = document.getElementById("downloadDetails"); + downloadDetailsDiv.innerHTML = "" } if (downloader != null) updateDownloader(downloader); } } - var sortParam = "key=" + downloadsSortKey + "&order=" + downloadsSortOrder - xmlhttp.open("GET", "/MuWire/Download?" + sortParam, true); + var sortParam = "&key=" + downloadsSortKey + "&order=" + downloadsSortOrder + xmlhttp.open("GET", "/MuWire/Download?section=list" + sortParam, true); xmlhttp.send(); }