diff --git a/src/webui/api/torrentscontroller.cpp b/src/webui/api/torrentscontroller.cpp index bb210bffd..6c3da9ca3 100644 --- a/src/webui/api/torrentscontroller.cpp +++ b/src/webui/api/torrentscontroller.cpp @@ -67,14 +67,19 @@ // Tracker keys const QString KEY_TRACKER_URL = u"url"_s; +const QString KEY_TRACKER_NAME = u"name"_s; const QString KEY_TRACKER_UPDATING = u"updating"_s; const QString KEY_TRACKER_STATUS = u"status"_s; const QString KEY_TRACKER_TIER = u"tier"_s; const QString KEY_TRACKER_MSG = u"msg"_s; +const QString KEY_TRACKER_BT_VERSION = u"bt_version"_s; const QString KEY_TRACKER_PEERS_COUNT = u"num_peers"_s; const QString KEY_TRACKER_SEEDS_COUNT = u"num_seeds"_s; const QString KEY_TRACKER_LEECHES_COUNT = u"num_leeches"_s; const QString KEY_TRACKER_DOWNLOADED_COUNT = u"num_downloaded"_s; +const QString KEY_TRACKER_NEXT_ANNOUNCE = u"next_announce"_s; +const QString KEY_TRACKER_MIN_ANNOUNCE = u"min_announce"_s; +const QString KEY_TRACKER_ENDPOINTS = u"endpoints"_s; // Web seed keys const QString KEY_WEBSEED_URL = u"url"_s; @@ -269,24 +274,49 @@ namespace QJsonArray getTrackers(const BitTorrent::Torrent *const torrent) { + auto now = BitTorrent::AnnounceTimePoint::clock::now(); QJsonArray trackerList; for (const BitTorrent::TrackerEntryStatus &tracker : asConst(torrent->trackers())) { - const bool isNotWorking = (tracker.state == BitTorrent::TrackerEndpointState::NotWorking) - || (tracker.state == BitTorrent::TrackerEndpointState::TrackerError) - || (tracker.state == BitTorrent::TrackerEndpointState::Unreachable); + QJsonArray endpointsList; + + for (const BitTorrent::TrackerEndpointStatus &endpoint : tracker.endpoints) + { + endpointsList << QJsonObject + { + {KEY_TRACKER_NAME, endpoint.name}, + {KEY_TRACKER_UPDATING, endpoint.isUpdating}, + {KEY_TRACKER_STATUS, static_cast(endpoint.state)}, + {KEY_TRACKER_MSG, endpoint.message}, + {KEY_TRACKER_BT_VERSION, static_cast(endpoint.btVersion)}, + {KEY_TRACKER_PEERS_COUNT, endpoint.numPeers}, + {KEY_TRACKER_SEEDS_COUNT, endpoint.numSeeds}, + {KEY_TRACKER_LEECHES_COUNT, endpoint.numLeeches}, + {KEY_TRACKER_DOWNLOADED_COUNT, endpoint.numDownloaded}, + {KEY_TRACKER_NEXT_ANNOUNCE, std::max(0, + std::chrono::duration_cast(endpoint.nextAnnounceTime - now).count())}, + {KEY_TRACKER_MIN_ANNOUNCE, std::max(0, + std::chrono::duration_cast(endpoint.minAnnounceTime - now).count())} + }; + } + trackerList << QJsonObject { {KEY_TRACKER_URL, tracker.url}, {KEY_TRACKER_TIER, tracker.tier}, {KEY_TRACKER_UPDATING, tracker.isUpdating}, - {KEY_TRACKER_STATUS, static_cast((isNotWorking ? BitTorrent::TrackerEndpointState::NotWorking : tracker.state))}, + {KEY_TRACKER_STATUS, static_cast(tracker.state)}, {KEY_TRACKER_MSG, tracker.message}, {KEY_TRACKER_PEERS_COUNT, tracker.numPeers}, {KEY_TRACKER_SEEDS_COUNT, tracker.numSeeds}, {KEY_TRACKER_LEECHES_COUNT, tracker.numLeeches}, - {KEY_TRACKER_DOWNLOADED_COUNT, tracker.numDownloaded} + {KEY_TRACKER_DOWNLOADED_COUNT, tracker.numDownloaded}, + {KEY_TRACKER_NEXT_ANNOUNCE, std::max(0, + std::chrono::duration_cast(tracker.nextAnnounceTime - now).count())}, + {KEY_TRACKER_MIN_ANNOUNCE, std::max(0, + std::chrono::duration_cast(tracker.minAnnounceTime - now).count())}, + {KEY_TRACKER_ENDPOINTS, endpointsList} }; }