/** * Returns the trackers for a torrent in JSON format. * * The return value is a JSON-formatted list of dictionaries. * The dictionary keys are: * - "url": Tracker URL * - "status": Tracker status * - "num_peers": Tracker peer count * - "msg": Tracker message (last) */ QByteArray btjson::getTrackersForTorrent(const QString& hash) { CACHED_VARIABLE_FOR_HASH(QVariantList, tracker_list, CACHE_DURATION_MS, hash); try { QTorrentHandle h = QBtSession::instance()->getTorrentHandle(hash); QHash<QString, TrackerInfos> trackers_data = QBtSession::instance()->getTrackersInfo(hash); std::vector<announce_entry> vect_trackers = h.trackers(); std::vector<announce_entry>::const_iterator it = vect_trackers.begin(); std::vector<announce_entry>::const_iterator end = vect_trackers.end(); for (; it != end; ++it) { QVariantMap tracker_dict; const QString tracker_url = misc::toQString(it->url); tracker_dict[KEY_TRACKER_URL] = tracker_url; const TrackerInfos data = trackers_data.value(tracker_url, TrackerInfos(tracker_url)); QString status; if (it->verified) { status = tr("Working"); } else { if (it->updating && it->fails == 0) status = tr("Updating..."); else status = it->fails > 0 ? tr("Not working") : tr("Not contacted yet"); } tracker_dict[KEY_TRACKER_STATUS] = status; tracker_dict[KEY_TRACKER_PEERS] = static_cast<qulonglong>(trackers_data.value(tracker_url, TrackerInfos(tracker_url)).num_peers); tracker_dict[KEY_TRACKER_MSG] = data.last_message.trimmed(); tracker_list.append(tracker_dict); } } catch (const std::exception& e) { qWarning() << Q_FUNC_INFO << "Invalid torrent: " << misc::toQStringU(e.what()); return QByteArray(); } return json::toJson(tracker_list); }