Files
tubular/docs/anilist-direct-provider-feasibility.md
T

13 KiB
Raw Blame History

AniList catalog and direct streaming feasibility

Observed 2026-10-25. Research only: no application/player implementation, browser automation, GUI playback, protection bypass, remote mutation, or persisted stream URLs. This investigation follows the proposed AniList catalog → independently resolved episode path, not another Miruro mirror change.

Decision

The catalog-to-native-media path works for a sample without Miruro. AniList's native GraphQL interface returned catalog metadata, and ZokoAnime accepted both the returned MAL ID and its working AniList-ID route. Fresh HLS and English subtitles were retrieved; FFmpeg decoded a video frame at the start and after seeking to ten minutes.

This is not yet a drop-in Terebi integration. The sampled playlist crosses CDN origins that Terebi deliberately rejects, and no authoritative ZokoAnime episode-inventory interface was found in the inspected documentation/selector. Do not replace the browsing UI, synthesize available episodes from AniList totals, or disable the player's origin checks on the strength of this sample.

Evidence labels: Observed = executed bounded native requests/media probes; Source = inspected first-party documentation/JavaScript or maintained extractor code; [INFERENCE] = recommendation or implication not exercised in Tubular/Terebi.

Discovery and exact identity mapping

Source: current ani-cli master identifies itself as version 5.1.6 and uses hianime.at, not the historical AllAnime interface. Its search/episode/server flow selects a ZokoAnime embed and reads its static source configuration. This is extractor-source evidence, not a recommendation to execute ani-cli or use its browser User-Agent/cipher configuration.

Observed: default native ureq search for Cowboy Bebop returned separate series, movie and special entries. Selecting the exact TV-series entry yielded 26 actual episode links. Episode 1's declared sub server pointed to:

https://zokoanime.video/stream/mal/1/1/sub

The ZokoAnime site and documentation advertise MAL/AniList-ID embeds. Their deployed selector implementation emits source values mal and ani, whereas the documentation implementation describes anilist.

Observed discrepancy: /stream/anilist/1/1/sub returned HTTP 404 JSON, Route GET:/stream/anilist/1/1/sub not found. /stream/ani/1/1/sub returned a playable configuration. Use the demonstrated ani route or AniList's idMal, not the prose's broken anilist route.

AniList's media interface exposes both identifiers. The exact first catalog query was:

query {
  Media(id: 1, type: ANIME) {
    id
    idMal
    title { romaji english }
    format
    status
    episodes
  }
}

Observed: unauthenticated POST https://graphql.anilist.co returned HTTP 200 application/json, with AniList ID 1, MAL ID 1, title Cowboy Bebop, format TV, status FINISHED and total 26. After this query, the direct ZokoAnime lookup used only the returned identifier; no Miruro or HiAnime request participated in that lookup.

A second native GraphQL query established the split-season and movie identifiers below. Route success means a source configuration was returned, not that every episode or the semantic content was visually verified.

Catalog entry AniList ID MAL ID Catalog total Direct lookup observed
Cowboy Bebop 1 1 26 ani and mal, episode 1: source + English subtitle; ani, episode 26: configuration present
Attack on Titan Season 3 Part 2 104578 38524 10 ani, episode 1: source + English/Spanish/Portuguese subtitles
Cowboy Bebop: The Movie 5 5 1 ani, episode 1: configuration present

[INFERENCE]: no external mapping dataset or title matching is needed for these routes. Fribb/anime-lists offers catalog-ID and TVDB/TMDB season/offset mappings, but it is unnecessary for this demonstrated direct-ID path and does not establish ZokoAnime's episode availability. No dataset was downloaded/adopted or its license relied on.

Native request and media evidence

The temporary Rust probe used the project's existing ureq 3.4.2/rustls transport, normal certificate verification, default User-Agent, a 20-second global timeout, zero automatic redirects and a 2 MiB text-body limit. No cookies, authentication, browser impersonation, cipher tuning, challenge solution or proxy was supplied. Resource requests used Referer: https://zokoanime.video/; whether that header is mandatory was not tested.

Bodies were captured in memory; only metadata and redacted summaries were surfaced. Player JavaScript was inspected, never executed. The embed's window.__P configuration uses the Base64/XOR JSON transform explicitly implemented in its own decoder; no DRM, challenge or ad-verification protocol was implemented. Advertising scripts and view/telemetry actions were not requested.

Resource HTTP Content-Type Body bytes / result
HiAnime title search 200 text/html 250238 bytes; series/movie/special candidates
Selected series 200 text/html 186932 bytes
Actual episode list 200 application/json 25926 bytes; 26 links; episode 1 ID 21418, title Asteroid Blues
Episode 1 servers 200 application/json 1936 bytes; ZokoAnime and HD-1 for sub/dub
Direct MAL episode embed 200 text/html 1832 bytes; source + English subtitle configuration
Direct AniList episode embed 200 text/html 1832 bytes; source + English subtitle configuration
Fresh HLS master, URL redacted 200 application/vnd.apple.mpegurl 98 bytes; one advertised variant
HLS variant, URL redacted 200 application/vnd.apple.mpegurl 38193 bytes; 353 segments; ENDLIST; no EXT-X-KEY tags
English subtitle, URL redacted 200 text/vtt 14466 bytes; WEBVTT; 217 cue arrows

Observed native media: ffprobe 9.0.2 exited 0 and reported H.264 video at 1448×1080, AAC audio at 48000 Hz, and duration 1483.145982 seconds. The manifest advertised 1920×1080; the decoded stream dimensions are the stronger evidence. No audio track/language equivalence across other items was verified.

Two bounded ffmpeg runs, each capped at 30 seconds, requested one video frame with input seeks of 0 and 600 seconds. Both exited 0 with frame=1 and progress=end. Final ffprobe and decode checks explicitly set tls_verify=1 and max_redirects=0, used http,https,tcp,tls protocols only, five-second socket timeouts, 1 MiB probe size, two-second analysis duration, and extension_picky=0. The latter permits segment-content probing rather than trusting CDN filename extensions; Terebi already uses the same setting. No whole-episode download or GUI playback occurred.

Missing episodes are not HTTP errors

Observed: episode 27 of the finished 26-episode sample returned HTTP 200 text/html, but no window.__P configuration. Its visible page said “Error 404 / Not found” and that there was nothing to play. Status/MIME alone cannot establish availability. The resolver must recognize missing configuration as unavailable, not a successful empty source.

Source: AniList's episodes field is the amount when complete; its streamingEpisodes links are legal streaming-site links, not a general native-stream inventory. The inspected ZokoAnime documentation exposes a numbered embed lookup, and the player selector takes a manually entered episode number. No authoritative episode-list interface was established. The HiAnime listing proves the sample's inventory but would add another aggregation dependency if used in production.

[INFERENCE]: episodic browsing needs a separate availability decision: obtain a supported inventory, or explicitly distinguish catalog episode numbers from provider-confirmed playable episodes and resolve on demand. This report does not choose or silently change Tubular's current available-episodes-only behavior. Split seasons, movies and specials still need explicit mapping semantics; the sampled routes are not universal proof.

Terebi compatibility and security

Observed: the master and variant were on hls.dramahot.top, while their segment URLs named hls1.drama1.cfd. URLs/query tokens are deliberately not retained here.

Source: current resolvedIOOpen rejects any resource whose origin differs from the initial source's origin, and rejects redirects before forwarding custom headers. StreamURL.parse has a dedicated Miruro case only; other hosts enter the YouTube path, not a ZokoAnime resolver. Existing Miruro identity/progress/state must not be reused to disguise this provider.

[INFERENCE]: the sampled manifest would fail the current protected HLS path despite generic FFmpeg being able to decode it. Native FFmpeg success is not Terebi acceptance, subtitle rendering, resume/progress, or complete playback proof. No Terebi source or security policy was changed or exercised with this provider.

A future integration needs a separately reviewed, origin-scoped resource/header policy for the concrete CDN relationships, or a demonstrably compatible source. Do not simply remove the origin comparison, globally allow cross-origin redirects, or forward headers to arbitrary manifest hosts.

Recommendation and remaining prerequisites

  • Go for a focused implementation design: AniList catalog → exact AniList/MAL ID → ZokoAnime native resolver is demonstrated independently of Miruro. Keep catalog/selection in Tubular and fresh source/subtitle resolution in Terebi. Do not add a general multi-provider framework or mapping database for this one path.
  • Before replacing browsing: settle authoritative episode availability versus explicitly labeled on-demand resolution. Keep unknown/missing distinct from zero and from network/protection errors.
  • Before native player integration: decide the narrow cross-origin policy and provider-correct identity/progress contract; map or explicitly retain existing Miruro-keyed collections rather than reinterpreting them.
  • Before distribution: review AniList's terms. They prohibit mass collection, API use as backup/storage, and competing non-complementary list/tracker services. Tubular's local watched-state makes applicability worth clarifying; this investigation does not establish permission. ZokoAnime advertises iframe integration, but no stable documented raw-media/native interface or distribution-rights guarantee was established.
  • Known limits: small point-in-time sample; no ongoing-series inventory, dub media decode, special-numbering coverage, full episode playback, source expiry/IP-binding, uptime, geographical availability or rights verification. ZokoAnime may itself have upstream dependencies; only independence from Miruro on the exercised path is proven.

Reproduction record

The executed temporary harness was built with cargo build --locked --example direct_provider_probe and called as target/debug/examples/direct_provider_probe URL; AniList POST payloads and resource Referer values were passed through environment variables. A Python subprocess driver kept response bodies and fresh URLs in memory, applied the first-party static config decoder and invoked ffprobe/ffmpeg directly. The temporary Rust source, binary and driver state were removed after this report; that Cargo example is not a retained runnable command. No permanent tests were added for research-only work.

For a fresh ordinary-HTTPS metadata/status check, the following requests reproduce the public request shapes; the native results above were obtained with ureq, not these curl commands:

curl --silent --show-error --max-time 20 \
  -H 'Content-Type: application/json' \
  --data '{"query":"query { Media(id: 1, type: ANIME) { id idMal title { romaji } episodes } }"}' \
  https://graphql.anilist.co

curl --silent --show-error --max-time 20 --output /dev/null \
  --write-out 'HTTP %{http_code}; %{content_type}\n' \
  https://zokoanime.video/stream/ani/1/1/sub

Re-run source resolution before any media check; never save or publish resolved tokenized URLs. The first-party configuration decoder and native media flags above document the exercised method without retaining credentials or stale media URLs.