Sulkta
|
0d08f12b3b
|
Phase 4 (complete) — stream_extractor orchestrator
Wire the Android-primary fetch path + JSON-walking + URL post-processing
into a single stream_info(video_id) entry point. Mirrors NPE
YoutubeStreamExtractor.onFetchPage() per audit Track C §1.2.
src/youtube/stream_extractor.rs
* stream_info(video_id) + stream_info_with(video_id, options)
* fetch_android — reel endpoint (anonymous) OR /player (with po_token)
* check_playability_status — maps to ContentUnavailable variants
(AgeRestricted, GeoRestricted, Paid, Private, YoutubeMusicPremium,
AccountTerminated, Other)
* is_player_response_not_valid — decoy-video detection
* populate_video_details + populate_microformat + populate_streams +
populate_manifests + populate_captions
* process_url — sig deobf path (signatureCipher → JS function call)
+ unconditional nsig deobf + cpn append + pot append
* build_video_progressive / build_video_only / build_audio +
push_*_dedup helpers (FIX: NPE bug — dedup by itag id, not by
mediaFormat.id which collides 140/141)
Consolidated stream_helper's local ExtractionError into the crate-wide
exceptions::ExtractionError with a new DownloaderMissing variant.
Tests: 73 lib unit pass (+9 since Phase 3) + 7 new Phase 4 offline
integration tests = 80 lib green. Live YT end-to-end smoke deferred
to Straw integration; the code path is in place.
|
2026-05-24 17:08:04 -07:00 |
|
Sulkta
|
589e7446c3
|
Phase 4 (partial) — stream value types + InnerTube /player helpers
Lands the data shapes + the HTTP layer for stream extraction. The
extractor orchestrator + DASH manifest creator are deferred to the
next session — the parsing logic is dense enough to want a focused
pass.
src/stream/
* mod.rs — StreamInfo + StreamInfoItem (full + 'card' shapes)
mirroring NPE StreamInfo.java + StreamInfoItem.java
* delivery.rs — DeliveryMethod (Progressive/Dash/Hls/Torrent)
* audio.rs — AudioStream (itag, format, url, bitrate, codec,
audio_track_id, content_length, etc.)
* video.rs — VideoStream (itag, format, url, resolution, fps,
bandwidth, codec, video_only flag)
* subtitles.rs — SubtitlesStream (url, lang, auto_generated, mime)
src/youtube/stream_helper.rs
* generate_content_playback_nonce() — 16-char LCG-shuffled cpn
* get_web_metadata_player_response (microformat + thumbnails only)
* get_web_embedded_player_response (embed-url + signatureTimestamp)
* get_android_player_response (full Android /player + poToken)
* get_android_reel_player_response (no-poToken fallback)
* get_ios_player_response (iOS — flagged with 917 KiB cap
warning in the doc comment)
Per-helper headers + URL shapes match audit Track C §2.7 verbatim:
Android/iOS hit gapis endpoint with mobile UA; WEB family hits
www.youtube.com with the WEB headers.
Tests: 64 lib unit pass (up from 62 in Phase 3).
Next session: full stream_extractor.rs orchestrator + dash_manifest/
creator + Phase 4 done-when smoke (extract NCS Spektrem).
|
2026-05-24 17:01:03 -07:00 |
|