Implement accurate and rough speed measure

This commit is contained in:
Aoran Zeng 2025-07-11 16:43:42 +08:00
parent 8dbf5625ee
commit 026c4e4b5b
No known key found for this signature in database
GPG Key ID: 8F8BA8488E10ED98
2 changed files with 79 additions and 30 deletions

View File

@ -648,15 +648,28 @@ measure_speed_for_every_source (Source_t sources[], int size, double speed_recor
SourceProvider_t *provider = src.provider;
ProviderSpeedMeasureInfo_t psmi = provider->psmi;
bool skip = psmi.skip;
bool provider_skip = psmi.skip;
const char *url = psmi.url;
bool has_dedicated_speed_url = false;
if (!skip && NULL==url)
// 这种情况应当被视为bug但是我们目前还是软处理
/**
*
* 1. **
* 2. **
*
*
*/
const char *provider_speed_url = psmi.url;
const char *dedicated_speed_url = src.speed_measure_url;
/* 最终用来测速的 URL */
char *url = NULL;
if (!provider_skip && !provider_speed_url)
/* 没有声明跳过,但是却没有提供 URL这是维护者维护时出了纰漏我们软处理 */
{
char *msg1 = ENGLISH ? "Maintainers don't offer " : "维护者未提供 ";
char *msg2 = ENGLISH ? " mirror site's speed measure link, so skip it" : " 镜像站测速链接,跳过该站点";
char *msg2 = ENGLISH ? " mirror site's speed measure link, so skip it" : " 镜像站测速链接,跳过该站点(需修复)";
chsrc_warn (xy_strjoin (3, msg1, provider->code, msg2));
speed = 0;
@ -664,17 +677,45 @@ measure_speed_for_every_source (Source_t sources[], int size, double speed_recor
// get_measured[i] = false;
measure_msgs[i] = NULL;
}
else if (!provider_skip && provider_speed_url)
{
if (is_url(provider_speed_url))
{
url = xy_strdup (provider_speed_url);
chsrc_debug ("m", xy_2strjoin ("使用镜像站整体测速链接: ", url));
}
}
else if (provider_skip)
{
/* Provider 被声明为跳过测速,下方判断精准测速链接有无提供,若也没有提供,将会输出跳过原因 */
}
if (skip)
if (dedicated_speed_url)
{
if (is_url(dedicated_speed_url))
{
url = xy_strdup (dedicated_speed_url);
has_dedicated_speed_url = true;
chsrc_debug ("m", xy_2strjoin ("使用专用测速链接: ", url));
}
else
{
// 一定是一个URL防止维护者没填这里有一些脏数据
xy_unreached();
}
}
if (provider_skip && !has_dedicated_speed_url)
{
if (xy_streql ("upstream", provider->code))
{
/* 上游源不测速但不置0因为要避免这种情况: 可能其他镜像站测速都为0最后反而选择了该 upstream */
/* 上游源不测速但不置0因为要避免这么一种情况: 可能其他镜像站测速都为0最后反而选择了该 upstream */
speed = -1024*1024*1024;
if (!src.url)
{
psmi.skip_reason_CN = "上游默认源URL未知请帮助补充";
psmi.skip_reason_EN = "The default upstream source URL is unknown, please help to add";
psmi.skip_reason_CN = "缺乏对上游默认源进行测速的URL请帮助补充";
psmi.skip_reason_EN = "Lack of URL to measure upstream default source provider, please help to add";
}
}
else if (xy_streql ("user", provider->code))
@ -696,34 +737,42 @@ measure_speed_for_every_source (Source_t sources[], int size, double speed_recor
{
skip_reason = ENGLISH ? "SKIP for no reason" : "无理由跳过";
}
measure_msgs[i] = xy_strjoin (4, " x ", msg, " ", yellow(skip_reason));
measure_msgs[i] = xy_strjoin (4, faint(" x "), msg, " ", yellow(faint(skip_reason)));
println (measure_msgs[i]);
/* 下一位 */
continue;
}
else
/* 此时,一定获得了一个用于测速的链接 */
if (url)
{
const char *msg = ENGLISH ? provider->abbr : provider->name;
bool is_accurate = provider->psmi.accurate;
char *accurate_msg = CHINESE ? (is_accurate ? "[精准测速]" : faint("[模糊测速]"))
: (is_accurate ? "[accurate]" : faint("[rough]"));
char *accurate_msg = CHINESE ? (is_accurate ? bdblue(faint("[精准测速]")) : faint("[模糊测速]"))
: (is_accurate ? bdblue(faint("[accurate]")) : faint("[rough]"));
if (xy_streql ("upstream", provider->code))
{
measure_msgs[i] = xy_strjoin (7, " ^ ", msg, " (", src.url, ") ", accurate_msg, " ... ");
measure_msgs[i] = xy_strjoin (7, faint(" ^ "), msg, " (", src.url, ") ", accurate_msg, faint(" ... "));
}
else
{
measure_msgs[i] = xy_strjoin (5, " - ", msg, " ", accurate_msg, " ... ");
measure_msgs[i] = xy_strjoin (5, faint(" - "), msg, " ", accurate_msg, faint(" ... "));
}
print (measure_msgs[i]);
fflush (stdout);
char *url_ = xy_strdup (url);
char *curl_result = measure_speed_for_url (url_);
char *curl_result = measure_speed_for_url (url);
double speed = parse_and_say_curl_result (curl_result);
speed_records[i] = speed;
}
else
{
xy_unreached();
}
}
}

View File

@ -69,8 +69,8 @@ typedef struct Source_t
/* 用于换源的 URL */
char *url;
/* 精准测速 URL*/
char *accurate_speed_measure_url;
/* 对该 source 的专用测速链接,这就是精准测速 */
char *speed_measure_url;
}
Source_t;