diff --git a/comet/api/endpoints/admin.py b/comet/api/endpoints/admin.py index 7df0206..95301af 100644 --- a/comet/api/endpoints/admin.py +++ b/comet/api/endpoints/admin.py @@ -223,25 +223,20 @@ async def admin_api_metrics(admin_session: str = Cookie(None)): # Torrents by tracker top_trackers = await database.fetch_all(""" - SELECT tracker, COUNT(*) as count + SELECT tracker, COUNT(*) as count, AVG(seeders) as avg_seeders, AVG(size) as avg_size FROM torrents GROUP BY tracker ORDER BY count DESC - LIMIT 5 """) tracker_stats = [] for row in top_trackers: - stats = await database.fetch_one( - "SELECT AVG(seeders) as avg_seeders, AVG(size) as avg_size FROM torrents WHERE tracker = :tracker", - {"tracker": row["tracker"]}, - ) tracker_stats.append( { "tracker": row["tracker"], "count": row["count"], - "avg_seeders": stats["avg_seeders"], - "avg_size": stats["avg_size"], + "avg_seeders": row["avg_seeders"], + "avg_size": row["avg_size"], } ) diff --git a/comet/core/database.py b/comet/core/database.py index d8585b3..a2eefad 100644 --- a/comet/core/database.py +++ b/comet/core/database.py @@ -631,6 +631,8 @@ async def setup_database(): await database.execute("DELETE FROM active_connections") + await database.execute("DELETE FROM metrics_cache") + except Exception as e: logger.error(f"Error setting up the database: {e}") logger.exception(traceback.format_exc()) diff --git a/comet/templates/admin_dashboard.html b/comet/templates/admin_dashboard.html index fcbbf12..0720e53 100644 --- a/comet/templates/admin_dashboard.html +++ b/comet/templates/admin_dashboard.html @@ -956,7 +956,16 @@

Torrents Analysis

-

Top Trackers

+
+

Top Trackers

+ + Top 5 + Top 10 + Top 20 + Top 50 + All + +
@@ -1075,6 +1084,7 @@ initializeDashboard(); }); + let currentMetricsData = null; let connectionsInterval; let logsInterval; let lastLogTimestamp = 0; @@ -1103,6 +1113,13 @@ document .getElementById("hide-api-logs") .addEventListener("sl-change", toggleApiLogsVisibility); + document + .getElementById("tracker-limit") + .addEventListener("sl-change", () => { + if (currentMetricsData) { + updateTorrentsSection(currentMetricsData.torrents); + } + }); // Tab change handler document @@ -1390,6 +1407,7 @@ try { const response = await fetch("/admin/api/metrics"); const data = await response.json(); + currentMetricsData = data; updateMetricsOverview(data); updateTorrentsSection(data.torrents); @@ -1414,11 +1432,19 @@ function updateTorrentsSection(torrentsData) { // Update tracker statistics const trackerContainer = document.getElementById("tracker-stats"); - if (torrentsData.by_tracker.length === 0) { + const limitSelect = document.getElementById("tracker-limit"); + const limit = limitSelect ? limitSelect.value : "5"; + + let displayTrackers = torrentsData.by_tracker; + if (limit !== "all") { + displayTrackers = displayTrackers.slice(0, parseInt(limit)); + } + + if (displayTrackers.length === 0) { trackerContainer.innerHTML = '

No tracker data available

'; } else { - trackerContainer.innerHTML = torrentsData.by_tracker + trackerContainer.innerHTML = displayTrackers .map( (tracker) => `