Пример #1
0
/**
 * 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);
}