diff --git a/metrics/routes.py b/metrics/routes.py index b290d9f..6d16898 100644 --- a/metrics/routes.py +++ b/metrics/routes.py @@ -82,8 +82,8 @@ async def get_torrents_by_sources(response: Response): {"name": source["_id"], "count": source["count"]} for source in results ] - # Cache the results for 5 minutes - await REDIS_ASYNC_CLIENT.set(cache_key, json.dumps(torrent_sources), ex=300) + # Cache the results for 30 minutes + await REDIS_ASYNC_CLIENT.set(cache_key, json.dumps(torrent_sources), ex=1800) return torrent_sources @@ -195,7 +195,8 @@ async def get_weekly_top_uploaders(response: Response): start_of_week = today - timedelta(days=today.weekday()) start_of_week = start_of_week.replace(hour=0, minute=0, second=0, microsecond=0) - results = await TorrentStreams.aggregate( + # Get raw aggregation results + raw_results = await TorrentStreams.aggregate( [ { "$match": { @@ -211,20 +212,63 @@ async def get_weekly_top_uploaders(response: Response): "latest_upload": {"$max": "$created_at"}, } }, - {"$sort": {"count": -1}}, - {"$limit": 20}, ] ).to_list() - uploaders_stats = [ - { - "name": stat["_id"], - "count": stat["count"], - "latest_upload": ( - stat["latest_upload"].isoformat() if stat["latest_upload"] else None - ), - } - for stat in results + # Process and clean the results + processed_results = [] + anonymous_total = 0 + anonymous_latest = None + + for stat in raw_results: + uploader_name = stat["_id"] + count = stat["count"] + latest_upload = stat["latest_upload"] + + # Skip invalid entries + if count <= 0: + continue + + # Combine all anonymous-like entries + if ( + uploader_name is None + or uploader_name.strip() == "" + or uploader_name.lower() == "anonymous" + ): + anonymous_total += count + if anonymous_latest is None or ( + latest_upload and latest_upload > anonymous_latest + ): + anonymous_latest = latest_upload + else: + processed_results.append( + { + "name": uploader_name.strip(), + "count": count, + "latest_upload": ( + latest_upload.strftime("%Y-%m-%d") if latest_upload else None + ), + } + ) + + # Add anonymous entry if we have any anonymous uploads + if anonymous_total > 0: + processed_results.append( + { + "name": "Anonymous", + "count": anonymous_total, + "latest_upload": ( + anonymous_latest.strftime("%Y-%m-%d") if anonymous_latest else None + ), + } + ) + + # Sort by count and limit to top 20 + final_results = sorted(processed_results, key=lambda x: x["count"], reverse=True)[ + :20 ] - return {"week_start": start_of_week.isoformat(), "uploaders": uploaders_stats} + return { + "week_start": start_of_week.strftime("%Y-%m-%d"), + "uploaders": final_results, + } diff --git a/resources/js/metrics.js b/resources/js/metrics.js index 7e6ff6b..e4f222d 100644 --- a/resources/js/metrics.js +++ b/resources/js/metrics.js @@ -341,7 +341,7 @@ document.addEventListener('DOMContentLoaded', function () { maintainAspectRatio: false, layout: { padding: { - right: 50 // Add padding to prevent label cutoff + right: 50 } }, plugins: { @@ -354,8 +354,8 @@ document.addEventListener('DOMContentLoaded', function () { const uploader = data.uploaders[context.dataIndex]; const lastUpload = new Date(uploader.latest_upload); return [ - `Torrents: ${context.raw.toLocaleString()}`, - `Last Upload: ${lastUpload.toLocaleString()}` + `Torrents: ${context.raw}`, + `Last Upload: ${lastUpload.toLocaleDateString()}` ]; } } @@ -364,8 +364,7 @@ document.addEventListener('DOMContentLoaded', function () { color: '#fff', anchor: 'end', align: 'right', - offset: 4, // Add a small offset from the end of the bar - formatter: (value) => value.toLocaleString(), + formatter: (value) => value, font: { weight: 'bold', size: 12 @@ -396,13 +395,15 @@ document.addEventListener('DOMContentLoaded', function () { }, y: { grid: { - display: false + display: false, + borderWidth: 0 }, ticks: { color: '#fff', font: { size: 12 - } + }, + padding: 10 } } }