debugging and single provider compime
This commit is contained in:
99
src/api.rs
99
src/api.rs
@@ -1,6 +1,6 @@
|
||||
use crate::providers::{
|
||||
ALL_PROVIDERS, DynProvider, build_status_response, panic_payload_to_string, report_provider_error,
|
||||
run_provider_guarded,
|
||||
ALL_PROVIDERS, DynProvider, build_status_response, panic_payload_to_string,
|
||||
report_provider_error, resolve_provider_for_build, run_provider_guarded,
|
||||
};
|
||||
use crate::util::cache::VideoCache;
|
||||
use crate::util::discord::send_discord_error_report;
|
||||
@@ -146,6 +146,7 @@ pub fn config(cfg: &mut web::ServiceConfig) {
|
||||
}
|
||||
|
||||
async fn status(req: HttpRequest) -> Result<impl web::Responder, web::Error> {
|
||||
let trace_id = crate::util::flow_debug::next_trace_id("status");
|
||||
let clientversion: ClientVersion = match req.headers().get("User-Agent") {
|
||||
Some(v) => match v.to_str() {
|
||||
Ok(useragent) => ClientVersion::parse(useragent)
|
||||
@@ -159,6 +160,12 @@ async fn status(req: HttpRequest) -> Result<impl web::Responder, web::Error> {
|
||||
"Received status request with client version: {:?}",
|
||||
clientversion
|
||||
);
|
||||
crate::flow_debug!(
|
||||
"trace={} status request host={} client={:?}",
|
||||
trace_id,
|
||||
req.connection_info().host(),
|
||||
&clientversion
|
||||
);
|
||||
|
||||
let host = req
|
||||
.headers()
|
||||
@@ -168,8 +175,14 @@ async fn status(req: HttpRequest) -> Result<impl web::Responder, web::Error> {
|
||||
.to_string();
|
||||
let public_url_base = format!("{}://{}", req.connection_info().scheme(), host);
|
||||
let mut status = Status::new();
|
||||
let mut channel_count = 0usize;
|
||||
|
||||
for (provider_name, provider) in ALL_PROVIDERS.iter() {
|
||||
crate::flow_debug!(
|
||||
"trace={} status inspecting provider={}",
|
||||
trace_id,
|
||||
provider_name
|
||||
);
|
||||
let channel_result = std::panic::catch_unwind(std::panic::AssertUnwindSafe(|| {
|
||||
provider.get_channel(clientversion.clone())
|
||||
}));
|
||||
@@ -178,17 +191,37 @@ async fn status(req: HttpRequest) -> Result<impl web::Responder, web::Error> {
|
||||
if channel.favicon.starts_with('/') {
|
||||
channel.favicon = format!("{}{}", public_url_base, channel.favicon);
|
||||
}
|
||||
channel_count += 1;
|
||||
crate::flow_debug!(
|
||||
"trace={} status added channel id={} provider={}",
|
||||
trace_id,
|
||||
channel.id.as_str(),
|
||||
provider_name
|
||||
);
|
||||
status.add_channel(channel)
|
||||
}
|
||||
Ok(None) => {}
|
||||
Err(payload) => {
|
||||
let panic_msg = panic_payload_to_string(payload);
|
||||
crate::flow_debug!(
|
||||
"trace={} status provider panic provider={} panic={}",
|
||||
trace_id,
|
||||
provider_name,
|
||||
&panic_msg
|
||||
);
|
||||
report_provider_error(provider_name, "status.get_channel", &panic_msg).await;
|
||||
}
|
||||
}
|
||||
}
|
||||
status.iconUrl = format!("{}/favicon.ico", public_url_base).to_string();
|
||||
Ok(web::HttpResponse::Ok().json(&build_status_response(status)))
|
||||
let response = build_status_response(status);
|
||||
crate::flow_debug!(
|
||||
"trace={} status response channels={} groups={}",
|
||||
trace_id,
|
||||
channel_count,
|
||||
response.channelGroups.len()
|
||||
);
|
||||
Ok(web::HttpResponse::Ok().json(&response))
|
||||
}
|
||||
|
||||
async fn videos_post(
|
||||
@@ -198,6 +231,7 @@ async fn videos_post(
|
||||
requester: web::types::State<Requester>,
|
||||
req: HttpRequest,
|
||||
) -> Result<impl web::Responder, web::Error> {
|
||||
let trace_id = crate::util::flow_debug::next_trace_id("videos");
|
||||
let clientversion: ClientVersion = match req.headers().get("User-Agent") {
|
||||
Some(v) => match v.to_str() {
|
||||
Ok(useragent) => ClientVersion::parse(useragent)
|
||||
@@ -235,11 +269,12 @@ async fn videos_post(
|
||||
},
|
||||
items: vec![],
|
||||
};
|
||||
let channel: String = video_request
|
||||
let requested_channel: String = video_request
|
||||
.channel
|
||||
.as_deref()
|
||||
.unwrap_or("all")
|
||||
.to_string();
|
||||
let channel = resolve_provider_for_build(requested_channel.as_str()).to_string();
|
||||
let sort: String = video_request.sort.as_deref().unwrap_or("date").to_string();
|
||||
let (query, literal_query) = normalize_query(video_request.query.as_deref());
|
||||
let page: u8 = video_request
|
||||
@@ -294,6 +329,22 @@ async fn videos_post(
|
||||
req.connection_info().scheme(),
|
||||
req.connection_info().host()
|
||||
);
|
||||
crate::flow_debug!(
|
||||
"trace={} videos request requested_channel={} resolved_channel={} sort={} query={:?} page={} per_page={} filter={} category={} sites={} client={:?}",
|
||||
trace_id,
|
||||
&requested_channel,
|
||||
&channel,
|
||||
&sort,
|
||||
&query,
|
||||
page,
|
||||
perPage,
|
||||
&filter,
|
||||
&category,
|
||||
&sites,
|
||||
&clientversion
|
||||
);
|
||||
let mut requester = requester;
|
||||
requester.set_debug_trace_id(Some(trace_id.clone()));
|
||||
let options = ServerOptions {
|
||||
featured: Some(featured),
|
||||
category: Some(category),
|
||||
@@ -309,6 +360,12 @@ async fn videos_post(
|
||||
sort: Some(sort.clone()),
|
||||
sexuality: Some(sexuality),
|
||||
};
|
||||
crate::flow_debug!(
|
||||
"trace={} videos provider dispatch provider={} literal_query={:?}",
|
||||
trace_id,
|
||||
&channel,
|
||||
&literal_query
|
||||
);
|
||||
let mut video_items = run_provider_guarded(
|
||||
&channel,
|
||||
"videos_post.get_videos",
|
||||
@@ -323,6 +380,11 @@ async fn videos_post(
|
||||
),
|
||||
)
|
||||
.await;
|
||||
crate::flow_debug!(
|
||||
"trace={} videos provider returned count={}",
|
||||
trace_id,
|
||||
video_items.len()
|
||||
);
|
||||
|
||||
// There is a bug in Hottub38 that makes the client error for a 403-url even though formats work fine
|
||||
if clientversion == ClientVersion::new(38, 0, "Hot%20Tub".to_string()) {
|
||||
@@ -345,7 +407,14 @@ async fn videos_post(
|
||||
}
|
||||
|
||||
if let Some(literal_query) = literal_query.as_deref() {
|
||||
let before = video_items.len();
|
||||
video_items.retain(|video| video_matches_literal_query(video, literal_query));
|
||||
crate::flow_debug!(
|
||||
"trace={} videos literal filter kept={} removed={}",
|
||||
trace_id,
|
||||
video_items.len(),
|
||||
before.saturating_sub(video_items.len())
|
||||
);
|
||||
}
|
||||
|
||||
videos.items = video_items.clone();
|
||||
@@ -365,7 +434,14 @@ async fn videos_post(
|
||||
let per_page_clone = perPage.to_string();
|
||||
let options_clone = options.clone();
|
||||
let channel_clone = channel.clone();
|
||||
let prefetch_trace_id = trace_id.clone();
|
||||
task::spawn_local(async move {
|
||||
crate::flow_debug!(
|
||||
"trace={} videos prefetch spawn next_page={} provider={}",
|
||||
prefetch_trace_id,
|
||||
next_page,
|
||||
&channel_clone
|
||||
);
|
||||
// if let AnyProvider::Spankbang(_) = provider_clone {
|
||||
// // Spankbang has a delay for the next page
|
||||
// ntex::time::sleep(ntex::time::Seconds(80)).await;
|
||||
@@ -399,11 +475,23 @@ async fn videos_post(
|
||||
}
|
||||
}
|
||||
|
||||
crate::flow_debug!(
|
||||
"trace={} videos response items={} has_next={}",
|
||||
trace_id,
|
||||
videos.items.len(),
|
||||
videos.pageInfo.hasNextPage
|
||||
);
|
||||
Ok(web::HttpResponse::Ok().json(&videos))
|
||||
}
|
||||
|
||||
pub fn get_provider(channel: &str) -> Option<DynProvider> {
|
||||
ALL_PROVIDERS.get(channel).cloned()
|
||||
let provider = ALL_PROVIDERS.get(channel).cloned();
|
||||
crate::flow_debug!(
|
||||
"provider lookup channel={} found={}",
|
||||
channel,
|
||||
provider.is_some()
|
||||
);
|
||||
provider
|
||||
}
|
||||
|
||||
pub async fn test() -> Result<impl web::Responder, web::Error> {
|
||||
@@ -424,6 +512,7 @@ pub async fn test() -> Result<impl web::Responder, web::Error> {
|
||||
|
||||
pub async fn proxies() -> Result<impl web::Responder, web::Error> {
|
||||
let proxies = all_proxies_snapshot().await.unwrap_or_default();
|
||||
crate::flow_debug!("proxies endpoint snapshot_count={}", proxies.len());
|
||||
let mut by_protocol: std::collections::BTreeMap<String, Vec<Proxy>> =
|
||||
std::collections::BTreeMap::new();
|
||||
for proxy in proxies {
|
||||
|
||||
Reference in New Issue
Block a user