feat(web): add webseeds list (#8421)

* Add webseeds list to web ui

* Better webseed url column title

* Apply suggestions

* Follow existing table row creation style

* Fix webseed table speed-down column

* Fix empty class error

* Add webseeds_ex to rpc changelogs

* Apply suggestions from CI

* Fix webseeds_ex rpc spec
This commit is contained in:
Ivan Kara
2026-02-13 22:16:35 +07:00
committed by GitHub
parent 93a65c9c66
commit eac1f24f0b
7 changed files with 147 additions and 19 deletions

View File

@@ -142,6 +142,7 @@ auto constexpr MyStatic = std::array<std::string_view, TR_N_KEYS>{
"downloadLimit"sv, // rpc
"downloadLimited"sv, // rpc
"downloadSpeed"sv, // rpc
"download_bytes_per_second"sv, // rpc
"download_count"sv, // rpc
"download_dir"sv, // daemon, gtk app, rpc, tr_session::Settings
"download_dir_free_space"sv, // rpc
@@ -263,6 +264,7 @@ auto constexpr MyStatic = std::array<std::string_view, TR_N_KEYS>{
"isUTP"sv, // rpc
"isUploadingTo"sv, // rpc
"is_backup"sv, // rpc
"is_downloading"sv, // rpc
"is_downloading_from"sv, // rpc
"is_encrypted"sv, // rpc
"is_finished"sv, // rpc
@@ -708,6 +710,7 @@ auto constexpr MyStatic = std::array<std::string_view, TR_N_KEYS>{
"uploadedEver"sv, // rpc
"uploaded_bytes"sv, // rpc, stats.json
"uploaded_ever"sv, // rpc
"url"sv, // rpc
"url-list"sv, // .torrent
"use-global-speed-limit"sv, // .resume
"use-speed-limit"sv, // .resume
@@ -729,6 +732,7 @@ auto constexpr MyStatic = std::array<std::string_view, TR_N_KEYS>{
"watch_dir_force_generic"sv, // daemon
"webseeds"sv, // rpc
"webseedsSendingToUs"sv, // rpc
"webseeds_ex"sv, // rpc
"webseeds_sending_to_us"sv, // rpc
"yourip"sv, // BEP0010; BT protocol
};

View File

@@ -155,6 +155,7 @@ enum // NOLINT(performance-enum-size)
TR_KEY_download_limit_camel_APICOMPAT,
TR_KEY_download_limited_camel_APICOMPAT,
TR_KEY_download_speed_camel_APICOMPAT,
TR_KEY_download_bytes_per_second,
TR_KEY_download_count,
TR_KEY_download_dir,
TR_KEY_download_dir_free_space,
@@ -276,6 +277,7 @@ enum // NOLINT(performance-enum-size)
TR_KEY_is_utp_camel_APICOMPAT,
TR_KEY_is_uploading_to_camel_APICOMPAT,
TR_KEY_is_backup,
TR_KEY_is_downloading,
TR_KEY_is_downloading_from,
TR_KEY_is_encrypted,
TR_KEY_is_finished,
@@ -721,6 +723,7 @@ enum // NOLINT(performance-enum-size)
TR_KEY_uploaded_ever_camel_APICOMPAT,
TR_KEY_uploaded_bytes,
TR_KEY_uploaded_ever,
TR_KEY_url,
TR_KEY_url_list,
TR_KEY_use_global_speed_limit_kebab_APICOMPAT,
TR_KEY_use_speed_limit_kebab_APICOMPAT,
@@ -742,6 +745,7 @@ enum // NOLINT(performance-enum-size)
TR_KEY_watch_dir_force_generic,
TR_KEY_webseeds,
TR_KEY_webseeds_sending_to_us_camel_APICOMPAT,
TR_KEY_webseeds_ex,
TR_KEY_webseeds_sending_to_us,
TR_KEY_yourip,
TR_N_KEYS

View File

@@ -554,6 +554,23 @@ namespace make_torrent_field_helpers
return tr_variant{ std::move(vec) };
}
[[nodiscard]] auto make_webseed_ex_vec(tr_torrent const& tor)
{
auto const n_webseeds = tor.webseed_count();
auto vec = tr_variant::Vector{};
vec.reserve(n_webseeds);
for (size_t idx = 0U; idx != n_webseeds; ++idx)
{
auto const webseed = tr_torrentWebseed(&tor, idx);
auto webseed_map = tr_variant::Map{ 3U };
webseed_map.try_emplace(TR_KEY_url, webseed.url);
webseed_map.try_emplace(TR_KEY_is_downloading, webseed.is_downloading);
webseed_map.try_emplace(TR_KEY_download_bytes_per_second, webseed.download_bytes_per_second);
vec.emplace_back(std::move(webseed_map));
}
return tr_variant{ std::move(vec) };
}
[[nodiscard]] auto make_tracker_vec(tr_torrent const& tor)
{
auto const& trackers = tor.announce_list();
@@ -768,6 +785,7 @@ namespace make_torrent_field_helpers
case TR_KEY_uploaded_ever:
case TR_KEY_wanted:
case TR_KEY_webseeds:
case TR_KEY_webseeds_ex:
case TR_KEY_webseeds_sending_to_us:
return true;
@@ -942,6 +960,8 @@ namespace make_torrent_field_helpers
return make_file_wanted_vec(tor);
case TR_KEY_webseeds:
return make_webseed_vec(tor);
case TR_KEY_webseeds_ex:
return make_webseed_ex_vec(tor);
case TR_KEY_webseeds_sending_to_us:
return st.webseeds_sending_to_us;
default: