dynamic base url

This commit is contained in:
Simon
2026-03-10 18:45:32 +00:00
parent 2ad131f38f
commit 96926563b8
10 changed files with 118 additions and 43 deletions

View File

@@ -172,12 +172,18 @@ impl SpankbangProvider {
format!("{}/{}", self.url, url.trim_start_matches("./"))
}
fn proxy_url(&self, url: &str) -> String {
fn proxy_url(&self, proxy_base_url: &str, url: &str) -> String {
let path = url
.strip_prefix(&self.url)
.unwrap_or(url)
.trim_start_matches('/');
format!("https://hottub.spacemoehre.de/proxy/spankbang/{path}")
if proxy_base_url.is_empty() {
return format!("/proxy/spankbang/{path}");
}
format!(
"{}/proxy/spankbang/{path}",
proxy_base_url.trim_end_matches('/')
)
}
fn decode_html(text: &str) -> String {
@@ -258,6 +264,7 @@ impl SpankbangProvider {
views_selector: &Selector,
rating_selector: &Selector,
meta_link_selector: &Selector,
proxy_base_url: &str,
) -> Option<VideoItem> {
let card_html = card.html();
let card_text = Self::collapse_whitespace(&card.text().collect::<Vec<_>>().join(" "));
@@ -312,7 +319,7 @@ impl SpankbangProvider {
let mut item = VideoItem::new(
id,
title,
self.proxy_url(&href),
self.proxy_url(proxy_base_url, &href),
"spankbang".to_string(),
thumb,
duration,
@@ -344,7 +351,7 @@ impl SpankbangProvider {
Some(item)
}
fn get_video_items_from_html(&self, html: String) -> Vec<VideoItem> {
fn get_video_items_from_html(&self, html: String, proxy_base_url: &str) -> Vec<VideoItem> {
let document = Html::parse_document(&html);
let video_list_selector = Selector::parse(r#"[data-testid="video-list"]"#).unwrap();
let card_selector = Selector::parse(r#"[data-testid="video-item"]"#).unwrap();
@@ -378,6 +385,7 @@ impl SpankbangProvider {
&views_selector,
&rating_selector,
&meta_link_selector,
proxy_base_url,
) {
items.push(item);
}
@@ -432,7 +440,8 @@ impl SpankbangProvider {
return Ok(old_items);
}
let video_items = self.get_video_items_from_html(text);
let proxy_base_url = options.public_url_base.as_deref().unwrap_or_default();
let video_items = self.get_video_items_from_html(text, proxy_base_url);
if !video_items.is_empty() {
cache.remove(&video_url);
cache.insert(video_url.clone(), video_items.clone());
@@ -489,7 +498,8 @@ impl SpankbangProvider {
return Ok(old_items);
}
let video_items = self.get_video_items_from_html(text);
let proxy_base_url = options.public_url_base.as_deref().unwrap_or_default();
let video_items = self.get_video_items_from_html(text, proxy_base_url);
if !video_items.is_empty() {
cache.remove(&video_url);
cache.insert(video_url.clone(), video_items.clone());
@@ -634,13 +644,13 @@ mod tests {
</div>
"#;
let items = provider.get_video_items_from_html(html.to_string());
let items = provider.get_video_items_from_html(html.to_string(), "https://example.com");
assert_eq!(items.len(), 1);
assert_eq!(items[0].id, "6597754");
assert_eq!(items[0].title, "Adriana's Fleshlight Insertion");
assert_eq!(
items[0].url,
"https://hottub.spacemoehre.de/proxy/spankbang/3xeuy/video/adriana+s+fleshlight+insertion"
"https://example.com/proxy/spankbang/3xeuy/video/adriana+s+fleshlight+insertion"
);
assert_eq!(
items[0].thumb,
@@ -691,7 +701,7 @@ mod tests {
</div>
"#;
let items = provider.get_video_items_from_html(html.to_string());
let items = provider.get_video_items_from_html(html.to_string(), "https://example.com");
assert_eq!(items.len(), 1);
assert_eq!(items[0].id, "2");
assert_eq!(items[0].title, "Free video");
@@ -728,7 +738,7 @@ mod tests {
</div>
"#;
let items = provider.get_video_items_from_html(html.to_string());
let items = provider.get_video_items_from_html(html.to_string(), "https://example.com");
assert_eq!(items.len(), 1);
assert_eq!(items[0].id, "222");
assert_eq!(items[0].title, "Right result");