heavyfetish fix
This commit is contained in:
@@ -11,13 +11,13 @@ use crate::util::time::parse_time_to_seconds;
|
|||||||
use crate::videos::{ServerOptions, VideoFormat, VideoItem};
|
use crate::videos::{ServerOptions, VideoFormat, VideoItem};
|
||||||
use async_trait::async_trait;
|
use async_trait::async_trait;
|
||||||
use error_chain::error_chain;
|
use error_chain::error_chain;
|
||||||
use futures::stream::{self, StreamExt};
|
|
||||||
use htmlentity::entity::{ICodedDataTrait, decode};
|
use htmlentity::entity::{ICodedDataTrait, decode};
|
||||||
use regex::Regex;
|
use regex::Regex;
|
||||||
use scraper::{ElementRef, Html, Selector};
|
use scraper::{ElementRef, Html, Selector};
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
use std::sync::{Arc, RwLock};
|
use std::sync::{Arc, RwLock};
|
||||||
use std::{thread, vec};
|
use std::{thread, vec};
|
||||||
|
use url::Url;
|
||||||
|
|
||||||
pub const CHANNEL_METADATA: crate::providers::ProviderChannelMetadata =
|
pub const CHANNEL_METADATA: crate::providers::ProviderChannelMetadata =
|
||||||
crate::providers::ProviderChannelMetadata {
|
crate::providers::ProviderChannelMetadata {
|
||||||
@@ -354,6 +354,31 @@ impl HeavyfetishProvider {
|
|||||||
.to_string()
|
.to_string()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn video_id_from_page_url(page_url: &str) -> String {
|
||||||
|
let Ok(parsed_url) = Url::parse(page_url) else {
|
||||||
|
return String::new();
|
||||||
|
};
|
||||||
|
|
||||||
|
let segments = parsed_url
|
||||||
|
.path_segments()
|
||||||
|
.map(|value| value.collect::<Vec<_>>())
|
||||||
|
.unwrap_or_default();
|
||||||
|
|
||||||
|
if segments.is_empty() {
|
||||||
|
return String::new();
|
||||||
|
}
|
||||||
|
|
||||||
|
if let Some(index) = segments.iter().position(|segment| *segment == "videos") {
|
||||||
|
if let Some(primary) = segments.get(index + 1) {
|
||||||
|
if !primary.is_empty() {
|
||||||
|
return (*primary).to_string();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
segments.last().copied().unwrap_or_default().to_string()
|
||||||
|
}
|
||||||
|
|
||||||
fn push_unique(target: &Arc<RwLock<Vec<FilterOption>>>, item: FilterOption) {
|
fn push_unique(target: &Arc<RwLock<Vec<FilterOption>>>, item: FilterOption) {
|
||||||
if item.id.is_empty() || item.title.is_empty() {
|
if item.id.is_empty() || item.title.is_empty() {
|
||||||
return;
|
return;
|
||||||
@@ -698,12 +723,7 @@ impl HeavyfetishProvider {
|
|||||||
};
|
};
|
||||||
let href = link.value().attr("href").unwrap_or_default();
|
let href = link.value().attr("href").unwrap_or_default();
|
||||||
let page_url = self.normalize_url(href);
|
let page_url = self.normalize_url(href);
|
||||||
let id = page_url
|
let id = Self::video_id_from_page_url(&page_url);
|
||||||
.trim_end_matches('/')
|
|
||||||
.split('/')
|
|
||||||
.nth_back(1)
|
|
||||||
.unwrap_or_default()
|
|
||||||
.to_string();
|
|
||||||
|
|
||||||
if id.is_empty() || page_url.is_empty() {
|
if id.is_empty() || page_url.is_empty() {
|
||||||
continue;
|
continue;
|
||||||
@@ -885,11 +905,6 @@ impl HeavyfetishProvider {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let formats = self.build_formats(html, page_url)?;
|
|
||||||
if !formats.is_empty() {
|
|
||||||
item = item.formats(formats);
|
|
||||||
}
|
|
||||||
|
|
||||||
let uploader_link = document.select(&uploader_selector).next();
|
let uploader_link = document.select(&uploader_selector).next();
|
||||||
let uploader = uploader_link
|
let uploader = uploader_link
|
||||||
.as_ref()
|
.as_ref()
|
||||||
@@ -1072,20 +1087,11 @@ impl HeavyfetishProvider {
|
|||||||
return Ok(vec![]);
|
return Ok(vec![]);
|
||||||
}
|
}
|
||||||
|
|
||||||
let limited_items = list_items
|
let items = list_items
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.take(per_page_limit.max(1))
|
.take(per_page_limit.max(1))
|
||||||
.collect::<Vec<_>>();
|
.collect::<Vec<_>>();
|
||||||
|
|
||||||
let items = stream::iter(limited_items.into_iter().map(|item| {
|
|
||||||
let provider = self.clone();
|
|
||||||
let options = options.clone();
|
|
||||||
async move { provider.enrich_video(item, &options).await }
|
|
||||||
}))
|
|
||||||
.buffer_unordered(4)
|
|
||||||
.collect::<Vec<_>>()
|
|
||||||
.await;
|
|
||||||
|
|
||||||
if !items.is_empty() {
|
if !items.is_empty() {
|
||||||
cache.insert(url, items.clone());
|
cache.insert(url, items.clone());
|
||||||
}
|
}
|
||||||
@@ -1239,4 +1245,20 @@ mod tests {
|
|||||||
Some("https://heavyfetish.com/list-preview.mp4")
|
Some("https://heavyfetish.com/list-preview.mp4")
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn extracts_video_id_from_slug_only_layout() {
|
||||||
|
let id = HeavyfetishProvider::video_id_from_page_url(
|
||||||
|
"https://heavyfetish.com/videos/mistress-gaia-silky-feet-sniffer/",
|
||||||
|
);
|
||||||
|
assert_eq!(id, "mistress-gaia-silky-feet-sniffer");
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn extracts_video_id_from_legacy_numeric_layout() {
|
||||||
|
let id = HeavyfetishProvider::video_id_from_page_url(
|
||||||
|
"https://heavyfetish.com/videos/120660/example/",
|
||||||
|
);
|
||||||
|
assert_eq!(id, "120660");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user