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] = &[
ProviderDef {
id: "pornxp",
module: "pornxp",
ty: "PornxpProvider",
},
ProviderDef {
id: "all",
module: "all",
@@ -261,6 +266,11 @@ const PROVIDERS: &[ProviderDef] = &[
module: "chaturbate",
ty: "ChaturbateProvider",
},
ProviderDef {
id: "archivebate",
module: "archivebate",
ty: "ArchivebateProvider",
},
];
fn main() {
@@ -360,7 +370,7 @@ fn main() {
let selection = match selected.as_deref() {
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(),
};

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 |
| --- | --- | --- | --- | --- |
| `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. |
| `chaturbate` | `live-cams` | no | no | Live cam channel. |
| `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.
@@ -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 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 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)`.
- 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
- at least one tag/uploader shortcut if implemented
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.
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 assume page URLs are playable media URLs.
- 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 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 error_chain::error_chain;
use htmlentity::entity::{ICodedDataTrait, decode};
// use std::sync::{Arc, RwLock};
// use std::thread;
use std::vec;
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)]
pub struct PornxpProvider {
url: String,

View File

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