archivebate work and pornxp returned

This commit is contained in:
Simon
2026-04-14 16:58:04 +00:00
parent 765a21c110
commit fe5cf9a42f
6 changed files with 1091 additions and 5 deletions

View File

@@ -11,6 +11,11 @@ struct ProviderDef {
} }
const PROVIDERS: &[ProviderDef] = &[ const PROVIDERS: &[ProviderDef] = &[
ProviderDef {
id: "pornxp",
module: "pornxp",
ty: "PornxpProvider",
},
ProviderDef { ProviderDef {
id: "all", id: "all",
module: "all", module: "all",
@@ -261,6 +266,11 @@ const PROVIDERS: &[ProviderDef] = &[
module: "chaturbate", module: "chaturbate",
ty: "ChaturbateProvider", ty: "ChaturbateProvider",
}, },
ProviderDef {
id: "archivebate",
module: "archivebate",
ty: "ArchivebateProvider",
},
]; ];
fn main() { fn main() {
@@ -360,7 +370,7 @@ fn main() {
let selection = match selected.as_deref() { let selection = match selected.as_deref() {
Some(selected_id) => format!( Some(selected_id) => format!(
"pub const COMPILE_TIME_SELECTED_PROVIDER: Option<&str> = Some(\"{selected_id}\");" "pub const COMPILE_TIME_SELECTED_PROVIDER: Option<&str> = Some(\"{selected_id}\");",
), ),
None => "pub const COMPILE_TIME_SELECTED_PROVIDER: Option<&str> = None;".to_string(), None => "pub const COMPILE_TIME_SELECTED_PROVIDER: Option<&str> = None;".to_string(),
}; };

View File

@@ -7,6 +7,7 @@ This is the current implementation inventory as of this snapshot of the repo. Us
| Provider | Group | `/api/uploaders` | Uses local `/proxy` | Notes | | Provider | Group | `/api/uploaders` | Uses local `/proxy` | Notes |
| --- | --- | --- | --- | --- | | --- | --- | --- | --- | --- |
| `all` | `meta-search` | no | no | Aggregates all compiled providers. | | `all` | `meta-search` | no | no | Aggregates all compiled providers. |
| `archivebate` | `live-cams` | no | no | Livewire-backed cam archive listings with platform/gender/profile shortcuts. |
| `beeg` | `mainstream-tube` | no | no | Basic mainstream tube pattern. | | `beeg` | `mainstream-tube` | no | no | Basic mainstream tube pattern. |
| `chaturbate` | `live-cams` | no | no | Live cam channel. | | `chaturbate` | `live-cams` | no | no | Live cam channel. |
| `freepornvideosxxx` | `studio-network` | no | no | Studio-style scraper. | | `freepornvideosxxx` | `studio-network` | no | no | Studio-style scraper. |

View File

@@ -1,4 +1,4 @@
Implement a new Hottub provider for `<SITE_NAME>` at `<BASE_URL>`. Implement a new Hottub provider for `archivebate1` at `https://archivebate1.com`.
You are working inside the Hottub Rust server. Your job is to add a functioning provider module that can survive handoff to another model with minimal guesswork. Do not stop at code generation. Carry the work through code, validation, and documentation updates. You are working inside the Hottub Rust server. Your job is to add a functioning provider module that can survive handoff to another model with minimal guesswork. Do not stop at code generation. Carry the work through code, validation, and documentation updates.
@@ -70,6 +70,7 @@ Implementation requirements:
- If uploader support is implemented, use a namespaced `uploaderId` such as `<channel>:<site-local-id>` so `/api/uploaders` can route directly. - If uploader support is implemented, use a namespaced `uploaderId` such as `<channel>:<site-local-id>` so `/api/uploaders` can route directly.
- If the query matches a known tag/uploader shortcut, use the direct archive URL instead of generic search. - If the query matches a known tag/uploader shortcut, use the direct archive URL instead of generic search.
- If the site exposes real media URLs or HLS manifests, populate `formats`. - If the site exposes real media URLs or HLS manifests, populate `formats`.
- If the video page URL can be directly downloaded by yt-dlp, set `video.url` to the page URL and do not populate `formats`, as yt-dlp will extract formats dynamically.
- If direct playback needs a referer/cookie transform, use a local `/proxy/...` route built with `build_proxy_url(&options, "...", target)`. - If direct playback needs a referer/cookie transform, use a local `/proxy/...` route built with `build_proxy_url(&options, "...", target)`.
- Keep the first version small and reliable. Add extra filters only after the default feed, search, and pagination are working. - Keep the first version small and reliable. Add extra filters only after the default feed, search, and pagination are working.
@@ -85,7 +86,7 @@ Validation requirements:
- page 2 - page 2
- at least one tag/uploader shortcut if implemented - at least one tag/uploader shortcut if implemented
6. Verify thumbnails load. 6. Verify thumbnails load.
7. Verify `yt-dlp` can resolve `video.url` or one of `formats[*].url`. 7. Verify `yt-dlp` can resolve `video.url` (if formats are not populated) or one of `formats[*].url` (if formats are populated).
8. If a proxy route exists, verify it directly with `curl -I` or equivalent. 8. If a proxy route exists, verify it directly with `curl -I` or equivalent.
Testing commands to run: Testing commands to run:
@@ -115,6 +116,7 @@ Important Hottub-specific rules:
- Do not create a brand-new requester in normal provider fetches unless you have a strong reason. - Do not create a brand-new requester in normal provider fetches unless you have a strong reason.
- Do not assume page URLs are playable media URLs. - Do not assume page URLs are playable media URLs.
- Do not expose status filters that you did not implement in `get_videos`. - Do not expose status filters that you did not implement in `get_videos`.
- Do not populate `formats` if the page URL is yt-dlp compatible; instead, set `video.url` to the page URL.
- Do not finish without checking at least one returned media URL with `yt-dlp`. - Do not finish without checking at least one returned media URL with `yt-dlp`.
- Do not claim pagination works unless page 2 was verified. - Do not claim pagination works unless page 2 was verified.

1067
src/providers/archivebate.rs Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -8,8 +8,6 @@ use crate::videos::{ServerOptions, VideoItem};
use async_trait::async_trait; use async_trait::async_trait;
use error_chain::error_chain; use error_chain::error_chain;
use htmlentity::entity::{ICodedDataTrait, decode}; use htmlentity::entity::{ICodedDataTrait, decode};
// use std::sync::{Arc, RwLock};
// use std::thread;
use std::vec; use std::vec;
error_chain! { error_chain! {
@@ -19,6 +17,12 @@ error_chain! {
} }
} }
pub const CHANNEL_METADATA: crate::providers::ProviderChannelMetadata =
crate::providers::ProviderChannelMetadata {
group_id: "mainstream-tube",
tags: &["tube", "mainstream"],
};
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
pub struct PornxpProvider { pub struct PornxpProvider {
url: String, url: String,

View File

@@ -174,6 +174,7 @@ impl Requester {
#[cfg(any( #[cfg(any(
not(hottub_single_provider), not(hottub_single_provider),
hottub_provider = "archivebate",
hottub_provider = "hypnotube", hottub_provider = "hypnotube",
hottub_provider = "vjav", hottub_provider = "vjav",
))] ))]
@@ -381,6 +382,7 @@ impl Requester {
#[cfg(any( #[cfg(any(
not(hottub_single_provider), not(hottub_single_provider),
hottub_provider = "archivebate",
hottub_provider = "hypnotube", hottub_provider = "hypnotube",
hottub_provider = "freeuseporn", hottub_provider = "freeuseporn",
hottub_provider = "vjav", hottub_provider = "vjav",