Phase 3 — InnerTube + itag
Port the YT client matrix + request envelope + itag lookup table.
src/youtube/
* constants.rs — ClientsConstants.java verbatim. All six live
clients (WEB, WEB_EMBEDDED_PLAYER,
WEB_MUSIC_ANALYTICS, ANDROID, IOS, plus the
WEB_REMIX values for completeness). Base URLs
+ prettyPrint=false suffix.
* client_request.rs — ClientInfo / DeviceInfo / InnertubeClientRequestInfo
+ the 5 factory constructors NPE exposes
(ofWebClient, ofWebEmbeddedPlayer, ofCharts,
ofAndroid, ofIos). build_envelope() emits the
InnerTube JSON in NPE's exact insertion order;
build_desktop_envelope() is the WEB-fast-path
used by search/browse/next/resolve_url/comments.
* itag.rs — 57-entry itag table (14 progressive + 10 audio +
33 video-only). MediaFormat enum + ItagType
enum + ItagItem struct + lookup().
* parsing.rs — consent toggle + cookie generator (SOCS=CAE= /
SOCS=CAISAiAD), WEB client-version cache + sw.js
scrape, WEB/mobile header builders (mobile
deliberately strips X-YouTube-Client-Name +
Origin/Referer + Cookie per audit Track A §6.2),
android/ios UA templates, visitor_data bootstrap
POST to /youtubei/v1/visitor_id.
PARITY notes flagged in code:
* androidSdkVersion=36 + osVersion=16 but Android-15 in UA — NPE-intentional
* mobile clients send NO X-YouTube-Client-* headers
* audit doc says "53 entries" but tallies + NPE source = 57 ItagItems
Tests: 62 lib unit pass (up from 43 in Phase 2). All Phase 1 + Phase 2
smoke still green. Live InnerTube POSTs (visitor_data bootstrap +
/player) deferred to Phase 4 integration.
This commit is contained in:
parent
6ad0c52aaf
commit
fb70166f5d
5 changed files with 863 additions and 3 deletions
53
src/youtube/constants.rs
Normal file
53
src/youtube/constants.rs
Normal file
|
|
@ -0,0 +1,53 @@
|
|||
// ClientsConstants — mirrors NPE services/youtube/ClientsConstants.java.
|
||||
//
|
||||
// Six live InnerTube clients: WEB, WEB_EMBEDDED_PLAYER, WEB_MUSIC_ANALYTICS,
|
||||
// WEB_REMIX, ANDROID, IOS. NPE's tree also mentions TVHTML5 + MWEB in
|
||||
// comments — not actively used; skipped per audit Track A §1.3.
|
||||
|
||||
pub const DESKTOP_CLIENT_PLATFORM: &str = "DESKTOP";
|
||||
pub const MOBILE_CLIENT_PLATFORM: &str = "MOBILE";
|
||||
pub const WATCH_CLIENT_SCREEN: &str = "WATCH";
|
||||
pub const EMBED_CLIENT_SCREEN: &str = "EMBED";
|
||||
|
||||
pub const WEB_CLIENT_ID: &str = "1";
|
||||
pub const WEB_CLIENT_NAME: &str = "WEB";
|
||||
pub const WEB_HARDCODED_CLIENT_VERSION: &str = "2.20260120.01.00";
|
||||
|
||||
pub const WEB_REMIX_CLIENT_ID: &str = "67";
|
||||
pub const WEB_REMIX_CLIENT_NAME: &str = "WEB_REMIX";
|
||||
pub const WEB_REMIX_HARDCODED_CLIENT_VERSION: &str = "1.20260121.03.00";
|
||||
|
||||
pub const WEB_EMBEDDED_CLIENT_ID: &str = "56";
|
||||
pub const WEB_EMBEDDED_CLIENT_NAME: &str = "WEB_EMBEDDED_PLAYER";
|
||||
pub const WEB_EMBEDDED_CLIENT_VERSION: &str = "1.20260122.01.00";
|
||||
|
||||
pub const WEB_MUSIC_ANALYTICS_CLIENT_ID: &str = "31";
|
||||
pub const WEB_MUSIC_ANALYTICS_CLIENT_NAME: &str = "WEB_MUSIC_ANALYTICS";
|
||||
pub const WEB_MUSIC_ANALYTICS_CLIENT_VERSION: &str = "2.0";
|
||||
|
||||
// iPhone 15 Pro Max — chosen explicitly for 60fps tags per ItagItem.java:26
|
||||
// note and the gist referenced in NPE source.
|
||||
pub const IOS_CLIENT_ID: &str = "5";
|
||||
pub const IOS_CLIENT_NAME: &str = "IOS";
|
||||
pub const IOS_CLIENT_VERSION: &str = "21.03.2";
|
||||
pub const IOS_DEVICE_MODEL: &str = "iPhone16,2";
|
||||
pub const IOS_OS_VERSION: &str = "18.7.2.22H124";
|
||||
pub const IOS_USER_AGENT_VERSION: &str = "18_7_2";
|
||||
|
||||
pub const ANDROID_CLIENT_ID: &str = "3";
|
||||
pub const ANDROID_CLIENT_NAME: &str = "ANDROID";
|
||||
pub const ANDROID_CLIENT_VERSION: &str = "21.03.36";
|
||||
|
||||
// PARITY: NPE hard-codes androidSdkVersion=36 + osVersion=16 even though
|
||||
// the User-Agent advertises Android 15. DroidGuard doesn't check the
|
||||
// InnerTube context so this mismatch is intentional and not a bug.
|
||||
pub const ANDROID_SDK_VERSION: u32 = 36;
|
||||
pub const ANDROID_OS_VERSION: &str = "16";
|
||||
|
||||
// Base URLs (NPE YoutubeParsingHelper.java:91,96).
|
||||
pub const YOUTUBEI_V1_URL: &str = "https://www.youtube.com/youtubei/v1/";
|
||||
pub const YOUTUBEI_V1_GAPIS_URL: &str = "https://youtubei.googleapis.com/youtubei/v1/";
|
||||
pub const YOUTUBE_MUSIC_INNERTUBE_URL: &str = "https://music.youtube.com/youtubei/v1/";
|
||||
|
||||
// All InnerTube calls carry this query suffix to shrink responses.
|
||||
pub const DISABLE_PRETTY_PRINT_PARAM: &str = "?prettyPrint=false";
|
||||
Loading…
Add table
Add a link
Reference in a new issue