1
0
mirror of https://github.com/chris124567/hulu synced 2024-11-22 08:07:30 +00:00
hulu/client/types.go

983 lines
42 KiB
Go
Raw Normal View History

2021-11-25 17:25:49 +00:00
package client
2021-11-20 18:53:30 +00:00
import (
"net/http"
"time"
)
// These are constants taken from https://player.hulu.com/site/dash/308343-site-curiosity/js/app.js
2021-11-20 18:53:30 +00:00
var (
deejayKey = []byte{110, 191, 200, 79, 60, 48, 66, 23, 178, 15, 217, 166, 108, 181, 149, 127}
)
const (
deejayDeviceID = 190
deejayKeyVersion = 1
)
func StandardHeaders() http.Header {
return http.Header{
http.CanonicalHeaderKey("sec-ch-ua"): []string{`" Not A;Brand";v="99"}, "Chromium";v="96"}, "Google Chrome";v="96"`},
http.CanonicalHeaderKey("sec-ch-ua-mobile"): []string{"?0"},
http.CanonicalHeaderKey("User-Agent"): []string{"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36"},
http.CanonicalHeaderKey("sec-ch-ua-platform"): []string{`"Linux"`},
http.CanonicalHeaderKey("Accept"): []string{"*/*"},
http.CanonicalHeaderKey("Origin"): []string{"https://www.hulu.com"},
http.CanonicalHeaderKey("Sec-Fetch-Site"): []string{"same-site"},
http.CanonicalHeaderKey("Sec-Fetch-Mode"): []string{"cors"},
http.CanonicalHeaderKey("Sec-Fetch-Dest"): []string{"empty"},
http.CanonicalHeaderKey("Referer"): []string{"https://www.hulu.com/"},
http.CanonicalHeaderKey("Accept-Language"): []string{"en-US,en;q=0.9"},
}
}
type SearchResults struct {
Groups []struct {
Category string `json:"category"`
Results []struct {
Type string `json:"_type"`
MetricsInfo struct {
TargetID string `json:"target_id"`
TargetType string `json:"target_type"`
TargetName string `json:"target_name"`
SelectionTrackingID string `json:"selection_tracking_id"`
} `json:"metrics_info"`
Personalization struct {
BowieContext string `json:"bowie_context"`
Eab string `json:"eab"`
} `json:"personalization"`
DeviceContextFailure bool `json:"device_context_failure"`
ViewTemplate string `json:"view_template"`
Visuals struct {
Artwork struct {
Type string `json:"_type"`
Horizontal struct {
Type string `json:"_type"`
ArtworkType string `json:"artwork_type"`
Image struct {
Path string `json:"path"`
Accent struct {
Hue int `json:"hue"`
Classification string `json:"classification"`
} `json:"accent"`
ImageID string `json:"image_id"`
} `json:"image"`
Text string `json:"text"`
} `json:"horizontal"`
} `json:"artwork"`
Headline struct {
Text string `json:"text"`
Index [][]int `json:"index"`
} `json:"headline"`
Body struct {
Text string `json:"text"`
Index [][]int `json:"index"`
} `json:"body"`
ActionText string `json:"action_text"`
PrimaryBranding struct {
ID string `json:"id"`
Name string `json:"name"`
Artwork struct {
BrandWatermarkBottomRight struct {
Path string `json:"path"`
Accent struct {
Hue int `json:"hue"`
Classification string `json:"classification"`
} `json:"accent"`
ImageType string `json:"image_type"`
ImageID string `json:"image_id"`
} `json:"brand.watermark.bottom.right"`
BrandLogoBottomRight struct {
Path string `json:"path"`
Accent struct {
Hue int `json:"hue"`
Classification string `json:"classification"`
} `json:"accent"`
ImageType string `json:"image_type"`
ImageID string `json:"image_id"`
} `json:"brand.logo.bottom.right"`
} `json:"artwork"`
} `json:"primary_branding"`
ShortSubtitle struct {
Text string `json:"text"`
Index []interface{} `json:"index"`
} `json:"short_subtitle"`
} `json:"visuals"`
Actions struct {
Browse struct {
TargetType string `json:"target_type"`
TargetID string `json:"target_id"`
TargetName string `json:"target_name"`
TargetTheme string `json:"target_theme"`
Params struct {
} `json:"params"`
Href string `json:"href"`
BrowseTheme string `json:"browse_theme"`
MetricsInfo struct {
ActionType string `json:"action_type"`
TargetID string `json:"target_id"`
TargetType string `json:"target_type"`
TargetDisplayName string `json:"target_display_name"`
} `json:"metrics_info"`
Type string `json:"type"`
} `json:"browse"`
ContextMenu struct {
Actions []struct {
ActionType string `json:"action_type"`
EntityName string `json:"entity_name"`
EntityType string `json:"entity_type"`
MetricsInfo struct {
TargetID string `json:"target_id"`
TargetType string `json:"target_type"`
TargetDisplayName string `json:"target_display_name"`
Eab string `json:"eab"`
Type string `json:"_type"`
} `json:"metrics_info"`
Eab string `json:"eab"`
} `json:"actions"`
Header struct {
Title string `json:"title"`
Artwork struct {
Type string `json:"_type"`
Horizontal struct {
Type string `json:"_type"`
ArtworkType string `json:"artwork_type"`
Image struct {
Path string `json:"path"`
Accent struct {
Hue int `json:"hue"`
Classification string `json:"classification"`
} `json:"accent"`
ImageID string `json:"image_id"`
} `json:"image"`
Text string `json:"text"`
} `json:"horizontal"`
Vertical struct {
Type string `json:"_type"`
ArtworkType string `json:"artwork_type"`
Text string `json:"text"`
} `json:"vertical"`
} `json:"artwork"`
PrimaryBranding struct {
ID string `json:"id"`
Name string `json:"name"`
Artwork struct {
BrandWatermarkBottomRight struct {
Path string `json:"path"`
Accent struct {
Hue int `json:"hue"`
Classification string `json:"classification"`
} `json:"accent"`
ImageType string `json:"image_type"`
ImageID string `json:"image_id"`
} `json:"brand.watermark.bottom.right"`
BrandLogoBottomRight struct {
Path string `json:"path"`
Accent struct {
Hue int `json:"hue"`
Classification string `json:"classification"`
} `json:"accent"`
ImageType string `json:"image_type"`
ImageID string `json:"image_id"`
} `json:"brand.logo.bottom.right"`
} `json:"artwork"`
} `json:"primary_branding"`
Action struct {
ActionType string `json:"action_type"`
EntityName string `json:"entity_name"`
EntityType string `json:"entity_type"`
MetricsInfo struct {
TargetID string `json:"target_id"`
TargetType string `json:"target_type"`
TargetDisplayName string `json:"target_display_name"`
Eab string `json:"eab"`
Type string `json:"_type"`
} `json:"metrics_info"`
Browse struct {
TargetType string `json:"target_type"`
TargetID string `json:"target_id"`
TargetTheme string `json:"target_theme"`
Params struct {
} `json:"params"`
Type string `json:"type"`
} `json:"browse"`
TargetName string `json:"target_name"`
Href string `json:"href"`
} `json:"action"`
} `json:"header"`
} `json:"context_menu"`
} `json:"actions"`
EntityMetadata struct {
GenreNames []string `json:"genre_names"`
PremiereDate time.Time `json:"premiere_date"`
Rating struct {
Code string `json:"code"`
} `json:"rating"`
TargetName string `json:"target_name"`
IsWarm bool `json:"is_warm"`
} `json:"entity_metadata"`
} `json:"results"`
} `json:"groups"`
Metadata struct {
SearchResultType string `json:"search_result_type"`
Explanation string `json:"explanation"`
SelectionTrackingID string `json:"selection_tracking_id"`
} `json:"metadata"`
DeviceContextFailure bool `json:"device_context_failure"`
}
type Season struct {
Type string `json:"_type"`
ID string `json:"id"`
Href string `json:"href"`
P13NHref string `json:"p13n_href"`
Name string `json:"name"`
Theme string `json:"theme"`
Artwork struct {
} `json:"artwork"`
DeviceContextFailure bool `json:"device_context_failure"`
Items []struct {
Type string `json:"_type"`
ID string `json:"id"`
Href string `json:"href"`
Name string `json:"name"`
Description string `json:"description"`
Artwork struct {
VideoHorizontalHero struct {
Path string `json:"path"`
Accent struct {
Hue int `json:"hue"`
Classification string `json:"classification"`
} `json:"accent"`
ImageType string `json:"image_type"`
ImageID string `json:"image_id"`
} `json:"video.horizontal.hero"`
} `json:"artwork"`
MetricsInfo struct {
Type string `json:"_type"`
MetricsAssetName string `json:"metrics_asset_name"`
AiringType string `json:"airing_type"`
ExternalIdentifiers []struct {
Namespace string `json:"namespace"`
ID string `json:"id"`
} `json:"external_identifiers"`
} `json:"metrics_info"`
Personalization struct {
Eab string `json:"eab"`
} `json:"personalization"`
DeviceContextFailure bool `json:"device_context_failure"`
Browse struct {
TargetType string `json:"target_type"`
TargetID string `json:"target_id"`
TargetTheme string `json:"target_theme"`
Params struct {
} `json:"params"`
Href string `json:"href"`
BrowseTheme string `json:"browse_theme"`
Type string `json:"type"`
} `json:"browse"`
SeriesID string `json:"series_id"`
SeriesName string `json:"series_name"`
Season string `json:"season"`
SeasonShortDisplayName string `json:"season_short_display_name"`
Bundle struct {
Type string `json:"_type"`
ID int `json:"id"`
EabID string `json:"eab_id"`
NetworkID string `json:"network_id"`
NetworkName string `json:"network_name"`
Duration int `json:"duration"`
Availability struct {
Type string `json:"_type"`
StartDate time.Time `json:"start_date"`
EndDate time.Time `json:"end_date"`
LocationRequirement string `json:"location_requirement"`
IsAvailable bool `json:"is_available"`
} `json:"availability"`
BundleType string `json:"bundle_type"`
Rating string `json:"rating"`
OpenCreditEndPos int `json:"open_credit_end_pos"`
CloseCreditStartPos int `json:"close_credit_start_pos"`
Rights struct {
Startover bool `json:"startover"`
Recordable bool `json:"recordable"`
Offline bool `json:"offline"`
ClientOverride bool `json:"client_override"`
} `json:"rights"`
CpID int `json:"cp_id"`
AllEtag string `json:"all_etag"`
RightsEtag string `json:"rights_etag"`
AiringsEtag string `json:"airings_etag"`
StreamEtag string `json:"stream_etag"`
RightsTTL int `json:"rights_ttl"`
AiringsTTL int `json:"airings_ttl"`
StreamTTL int `json:"stream_ttl"`
PackageID int `json:"package_id"`
AvFeatures []string `json:"av_features"`
} `json:"bundle"`
Number string `json:"number"`
PrimaryBranding struct {
ID string `json:"id"`
Name string `json:"name"`
Artwork struct {
BrandWatermark struct {
Path string `json:"path"`
Accent struct {
Hue int `json:"hue"`
Classification string `json:"classification"`
} `json:"accent"`
ImageType string `json:"image_type"`
ImageID string `json:"image_id"`
} `json:"brand.watermark"`
BrandWatermarkDark struct {
Path string `json:"path"`
Accent struct {
Hue int `json:"hue"`
Classification string `json:"classification"`
} `json:"accent"`
ImageType string `json:"image_type"`
ImageID string `json:"image_id"`
} `json:"brand.watermark.dark"`
BrandWatermarkTopRight struct {
Path string `json:"path"`
Accent struct {
Hue int `json:"hue"`
Classification string `json:"classification"`
} `json:"accent"`
ImageType string `json:"image_type"`
ImageID string `json:"image_id"`
} `json:"brand.watermark.top.right"`
BrandLogo struct {
Path string `json:"path"`
Accent struct {
Hue int `json:"hue"`
Classification string `json:"classification"`
} `json:"accent"`
ImageType string `json:"image_type"`
ImageID string `json:"image_id"`
} `json:"brand.logo"`
NetworkTile struct {
Path string `json:"path"`
Accent struct {
Hue int `json:"hue"`
Classification string `json:"classification"`
} `json:"accent"`
ImageType string `json:"image_type"`
ImageID string `json:"image_id"`
} `json:"network.tile"`
BrandWatermarkBottomRight struct {
Path string `json:"path"`
Accent struct {
Hue int `json:"hue"`
Classification string `json:"classification"`
} `json:"accent"`
ImageType string `json:"image_type"`
ImageID string `json:"image_id"`
} `json:"brand.watermark.bottom.right"`
BrandLogoTopRight struct {
Path string `json:"path"`
Accent struct {
Hue int `json:"hue"`
Classification string `json:"classification"`
} `json:"accent"`
ImageType string `json:"image_type"`
ImageID string `json:"image_id"`
} `json:"brand.logo.top.right"`
BrandLogoBottomRight struct {
Path string `json:"path"`
Accent struct {
Hue int `json:"hue"`
Classification string `json:"classification"`
} `json:"accent"`
ImageType string `json:"image_type"`
ImageID string `json:"image_id"`
} `json:"brand.logo.bottom.right"`
} `json:"artwork"`
} `json:"primary_branding"`
Rating struct {
Code string `json:"code"`
} `json:"rating"`
GenreNames []string `json:"genre_names"`
PremiereDate time.Time `json:"premiere_date"`
Duration int `json:"duration"`
IsFirstRun bool `json:"is_first_run"`
SeriesArtwork struct {
DetailVerticalHero struct {
Path string `json:"path"`
Accent struct {
Hue int `json:"hue"`
Classification string `json:"classification"`
} `json:"accent"`
ImageType string `json:"image_type"`
ImageID string `json:"image_id"`
} `json:"detail.vertical.hero"`
TitleTreatmentHorizontal struct {
Path string `json:"path"`
Accent struct {
Hue int `json:"hue"`
Classification string `json:"classification"`
} `json:"accent"`
ImageType string `json:"image_type"`
ImageID string `json:"image_id"`
} `json:"title.treatment.horizontal"`
ProgramTile struct {
Path string `json:"path"`
Accent struct {
Hue int `json:"hue"`
Classification string `json:"classification"`
} `json:"accent"`
ImageType string `json:"image_type"`
ImageID string `json:"image_id"`
} `json:"program.tile"`
ProgramVerticalTile struct {
Path string `json:"path"`
Accent struct {
Hue int `json:"hue"`
Classification string `json:"classification"`
} `json:"accent"`
ImageType string `json:"image_type"`
ImageID string `json:"image_id"`
} `json:"program.vertical.tile"`
TitleTreatmentStacked struct {
Path string `json:"path"`
Accent struct {
Hue int `json:"hue"`
Classification string `json:"classification"`
} `json:"accent"`
ImageType string `json:"image_type"`
ImageID string `json:"image_id"`
} `json:"title.treatment.stacked"`
DetailHorizontalHero struct {
Path string `json:"path"`
Accent struct {
Hue int `json:"hue"`
Classification string `json:"classification"`
} `json:"accent"`
ImageType string `json:"image_type"`
ImageID string `json:"image_id"`
} `json:"detail.horizontal.hero"`
} `json:"series_artwork"`
RestrictionLevel string `json:"restriction_level"`
Exclusivity string `json:"exclusivity"`
Actions []interface{} `json:"actions"`
} `json:"items"`
Pagination struct {
CurrentOffset int `json:"current_offset"`
TotalCount int `json:"total_count"`
} `json:"pagination"`
SeriesGroupingMetadata struct {
SeriesGroupingType string `json:"series_grouping_type"`
SeasonNumber int `json:"season_number"`
GroupingName string `json:"groupingName"`
Unknown bool `json:"unknown"`
} `json:"series_grouping_metadata"`
}
type PlaybackInformation struct {
Type string `json:"_type"`
Browse struct {
TargetType string `json:"target_type"`
TargetID string `json:"target_id"`
TargetTheme string `json:"target_theme"`
Params struct {
} `json:"params"`
Type string `json:"type"`
} `json:"browse"`
EabID string `json:"eab_id"`
Href string `json:"href"`
ID string `json:"id"`
HrefType string `json:"href_type"`
RestrictionLevel string `json:"restriction_level"`
}
type PlaylistRequest struct {
DeviceIdentifier string `json:"device_identifier"`
DeejayDeviceID int `json:"deejay_device_id"`
Version int `json:"version"`
AllCdn bool `json:"all_cdn"`
ContentEabID string `json:"content_eab_id"`
Region string `json:"region"`
XlinkSupport bool `json:"xlink_support"`
DeviceAdID string `json:"device_ad_id"`
LimitAdTracking bool `json:"limit_ad_tracking"`
IgnoreKidsBlock bool `json:"ignore_kids_block"`
Language string `json:"language"`
GUID string `json:"guid"`
Rv int `json:"rv"`
Kv int `json:"kv"`
Unencrypted bool `json:"unencrypted"`
IncludeT2RevenueBeacon string `json:"include_t2_revenue_beacon"`
CpSessionID string `json:"cp_session_id"`
InterfaceVersion string `json:"interface_version"`
NetworkMode string `json:"network_mode"`
PlayIntent string `json:"play_intent"`
Playback PlaylistRequestPlayback `json:"playback"`
}
type PlaylistRequestValues struct {
Type string `json:"type,omitempty"`
Profile string `json:"profile,omitempty"`
Level string `json:"level,omitempty"`
Framerate int `json:"framerate,omitempty"`
Version string `json:"version,omitempty"`
SecurityLevel string `json:"security_level,omitempty"`
Encryption *PlaylistRequestEncryption `json:"encryption,omitempty"`
HTTPS bool `json:"https,omitempty"`
}
type PlaylistRequestCodecs struct {
Values []PlaylistRequestValues `json:"values"`
SelectionMode string `json:"selection_mode"`
}
type PlaylistRequestVideo struct {
Codecs PlaylistRequestCodecs `json:"codecs"`
}
type PlaylistRequestAudio struct {
Codecs PlaylistRequestCodecs `json:"codecs"`
}
type PlaylistRequestDRM struct {
Values []PlaylistRequestValues `json:"values"`
SelectionMode string `json:"selection_mode"`
}
type PlaylistRequestManifest struct {
Type string `json:"type"`
HTTPS bool `json:"https"`
MultipleCdns bool `json:"multiple_cdns"`
PatchUpdates bool `json:"patch_updates"`
HuluTypes bool `json:"hulu_types"`
LiveDai bool `json:"live_dai"`
MultiplePeriods bool `json:"multiple_periods"`
Xlink bool `json:"xlink"`
SecondaryAudio bool `json:"secondary_audio"`
LiveFragmentDelay int `json:"live_fragment_delay"`
}
type PlaylistRequestEncryption struct {
Mode string `json:"mode"`
Type string `json:"type"`
}
type PlaylistRequestSegments struct {
Values []PlaylistRequestValues `json:"values"`
SelectionMode string `json:"selection_mode"`
}
type PlaylistRequestPlayback struct {
Version int `json:"version"`
Video PlaylistRequestVideo `json:"video"`
Audio PlaylistRequestAudio `json:"audio"`
DRM PlaylistRequestDRM `json:"drm"`
Manifest PlaylistRequestManifest `json:"manifest"`
Segments PlaylistRequestSegments `json:"segments"`
}
type Playlist struct {
UseManifestBreaks bool `json:"use_manifest_breaks"`
Adstate string `json:"adstate"`
Breaks []interface{} `json:"breaks"`
ContentEabID string `json:"content_eab_id"`
TranscriptsUrls struct {
Smi struct {
En string `json:"en"`
} `json:"smi"`
Webvtt struct {
En string `json:"en"`
} `json:"webvtt"`
Ttml struct {
En string `json:"en"`
} `json:"ttml"`
} `json:"transcripts_urls"`
TranscriptsEncryptionKey string `json:"transcripts_encryption_key"`
VideoMetadata struct {
AspectRatio string `json:"aspect_ratio"`
EndCreditsTime string `json:"end_credits_time"`
FrameRate int `json:"frame_rate"`
HasBug string `json:"has_bug"`
HasCaptions bool `json:"has_captions"`
HasNetworkPreRoll bool `json:"has_network_pre_roll"`
Interstitials string `json:"interstitials"`
Language string `json:"language"`
Length int `json:"length"`
Segments string `json:"segments"`
ID int `json:"id"`
AssetID int `json:"asset_id"`
Markers interface{} `json:"markers"`
TranscriptsDefaultOn bool `json:"transcripts_default_on"`
RatingBugBig string `json:"rating_bug_big"`
RatingBugSmall string `json:"rating_bug_small"`
} `json:"video_metadata"`
TranscriptsEncryptionIv string `json:"transcripts_encryption_iv"`
Breakhash string `json:"breakhash"`
AdBreakTimes []int `json:"ad_break_times"`
TranscriptsDefaultOn bool `json:"transcripts_default_on"`
ResumePosition int `json:"resume_position"`
RecordingOffset int `json:"recording_offset"`
InitialPosition int `json:"initial_position"`
DashPrServer string `json:"dash_pr_server"`
WvServer string `json:"wv_server"`
AudioTracks []struct {
Language string `json:"language"`
Role string `json:"role"`
CodecsString string `json:"codecs_string"`
Channels int `json:"channels"`
} `json:"audio_tracks"`
MbrManifest string `json:"mbr_manifest"`
StreamURL string `json:"stream_url"`
ThumbnailEndpoint string `json:"thumbnail_endpoint"`
AssetPlaybackType string `json:"asset_playback_type"`
SauronID string `json:"sauron_id"`
ViewTTLMillis int `json:"view_ttl_millis"`
SauronToken string `json:"sauron_token"`
SauronTokenTTL int `json:"sauron_token_ttl"`
SauronTokenTTLMs int `json:"sauron_token_ttl_ms"`
}
type Config struct {
PassThroughQos string `json:"pass_through_qos"`
Kinko string `json:"kinko"`
PackageID int `json:"package_id"`
API string `json:"api"`
QosBeacon string `json:"qos_beacon"`
NielsenAppName string `json:"nielsen_app_name"`
FeedbackCategory int `json:"feedbackCategory"`
PlusPlanID int `json:"plus_plan_id"`
FirehoseEndpoint string `json:"firehose_endpoint"`
PbAutoresumeTimeout int `json:"pb_autoresume_timeout"`
SashProductDescription string `json:"sash_product_description"`
PlaylistEndpoint string `json:"playlist_endpoint"`
NielsenAppID string `json:"nielsen_app_id"`
PackageGroupID int `json:"package_group_id"`
FlexActionEndpoint string `json:"flex_action_endpoint"`
PlaybackRequestTimeout int `json:"playback_request_timeout"`
Asset string `json:"asset"`
NoahSignupExceptionMessage []string `json:"noah_signup_exception_message"`
PbInterval int `json:"pb_interval"`
PackageGroupIDFrontPorch int `json:"package_group_id_front_porch"`
FlagsContext struct {
FlagStateValid bool `json:"flag_state_valid"`
UILink string `json:"ui_link"`
Key string `json:"key"`
SealTokenState string `json:"seal_token_state"`
} `json:"flags_context"`
SashProductTitle string `json:"sash_product_title"`
TrackTiersDeepPlayerState int `json:"track_tiers_deep_player_state"`
UserAccountURL string `json:"userAccountURL"`
Pgid int `json:"pgid"`
GeokResponse string `json:"geok_response"`
UserInfoURL string `json:"user_info_url"`
ChangePlanURL string `json:"changePlanURL"`
Profiles struct {
PromptAfterIdleMs int `json:"prompt_after_idle_ms"`
} `json:"profiles"`
AutoplayIdleTimeout int `json:"autoplay_idle_timeout"`
NielsenSfCode string `json:"nielsen_sf_code"`
PlusLandingURL string `json:"plusLandingURL"`
NielsenAppVersion string `json:"nielsen_app_version"`
PlayerProgressReportInterval int `json:"player_progress_report_interval"`
ProductInstrumentationV2 struct {
MetricsAgent struct {
Endpoint string `json:"endpoint"`
MaxHitRetries int `json:"max_hit_retries"`
SamplingRatios struct {
ServiceCall float64 `json:"service_call"`
} `json:"sampling_ratios"`
MsPerEvent int `json:"ms_per_event"`
Enabled bool `json:"enabled"`
MaxHitQueueMs int `json:"max_hit_queue_ms"`
EventFilterConfig struct {
} `json:"event_filter_config"`
OnlineAssetMaxBeaconQueueMs int `json:"online_asset_max_beacon_queue_ms"`
DownloadedAssetMaxBeaconQueueMs int `json:"downloaded_asset_max_beacon_queue_ms"`
EventWhitelist []string `json:"event_whitelist"`
NonInteractiveEvents []string `json:"non_interactive_events"`
BucketSize int `json:"bucket_size"`
} `json:"metrics_agent"`
ConvivaAgent struct {
FatalErrors []string `json:"fatal_errors"`
Staging bool `json:"staging"`
Token string `json:"token"`
Enabled bool `json:"enabled"`
GatewayURL string `json:"gateway_url"`
} `json:"conviva_agent"`
MetricsTracker struct {
} `json:"metrics_tracker"`
RateLimiting struct {
SegmentDownloadHit int `json:"segment_download_hit"`
} `json:"rate_limiting"`
AdobeAgent struct {
AppMeasurementTrackingServer string `json:"app_measurement_tracking_server"`
VisitorMcid string `json:"visitor_mcid"`
Enabled bool `json:"enabled"`
AppMeasurementRsid string `json:"app_measurement_rsid"`
VisitorTrackingServer string `json:"visitor_tracking_server"`
HeartbeatTrackingServer string `json:"heartbeat_tracking_server"`
} `json:"adobe_agent"`
MoatAgent struct {
Enabled bool `json:"enabled"`
} `json:"moat_agent"`
AdobeAgentV2 struct {
AppMeasurementTrackingServer string `json:"app_measurement_tracking_server"`
VisitorMcid string `json:"visitor_mcid"`
Enabled bool `json:"enabled"`
AppMeasurementRsid string `json:"app_measurement_rsid"`
VisitorTrackingServer string `json:"visitor_tracking_server"`
HeartbeatTrackingServer string `json:"heartbeat_tracking_server"`
} `json:"adobe_agent_v2"`
} `json:"product_instrumentation_v2"`
FeedbackURL string `json:"feedbackURL"`
IsAnonProxy bool `json:"is_anon_proxy"`
NielsenEnabled string `json:"nielsen_enabled"`
EurekaNamespace string `json:"eureka_namespace"`
ReportGeocheckURL string `json:"reportGeocheckURL"`
PbTracker string `json:"pb_tracker"`
MetricsAgent struct {
MaxBatchesBuffered int `json:"max_batches_buffered"`
MaxBatchSize int `json:"max_batch_size"`
Enabled bool `json:"enabled"`
EventFilterConfig struct {
ServiceCall struct {
EventRules []struct {
RuleType string `json:"rule_type"`
RuleFilter struct {
Type string `json:"type,omitempty"`
Dimension string `json:"dimension,omitempty"`
Value string `json:"value,omitempty"`
Filters []struct {
Type string `json:"type,omitempty"`
Dimension string `json:"dimension,omitempty"`
Value string `json:"value,omitempty"`
} `json:"filters,omitempty"`
} `json:"rule_filter,omitempty"`
} `json:"event_rules"`
} `json:"service_call"`
Log struct {
EventRules []struct {
RuleType string `json:"rule_type"`
RuleFilter struct {
Filter struct {
Type string `json:"type"`
Filters []struct {
Type string `json:"type"`
Dimension string `json:"dimension"`
Value string `json:"value"`
} `json:"filters"`
} `json:"filter"`
Type string `json:"type"`
} `json:"rule_filter"`
} `json:"event_rules"`
} `json:"log"`
} `json:"event_filter_config"`
Endpoint string `json:"endpoint"`
FlushInterval int `json:"flush_interval"`
} `json:"metrics_agent"`
Iball string `json:"iball"`
HuluMbr string `json:"hulu_mbr"`
NoahSignupExceptionShows []struct {
ID int `json:"id"`
Title string `json:"title"`
} `json:"noah_signup_exception_shows"`
BeaconConfig string `json:"beacon_config"`
Sapi string `json:"sapi"`
Csel string `json:"csel"`
ProfileBitrates []int `json:"profile_bitrates"`
PlusLearnMoreURL string `json:"plusLearnMoreURL"`
NoahProductDescription string `json:"noah_product_description"`
SauronAccessToken string `json:"sauron_access_token"`
EurekaApplicationID string `json:"eureka_application_id"`
GeokLocation string `json:"geok_location"`
PlusInviteURL string `json:"plusInviteURL"`
HothHost string `json:"hoth_host"`
PlaybackRequestRetries int `json:"playback_request_retries"`
BadgingConfig []struct {
Text string `json:"text"`
State string `json:"state"`
Style string `json:"style"`
} `json:"badging_config"`
AdServer string `json:"ad_server"`
RtBeacon string `json:"rt_beacon"`
EndpointUrls struct {
PlaylistV4 string `json:"playlist_v4"`
PlaylistV5 string `json:"playlist_v5"`
PlaylistV6 string `json:"playlist_v6"`
UserStateV5 string `json:"user_state_v5"`
WatchDownloadV1 string `json:"watch_download_v1"`
DvrRecordingsV1 string `json:"dvr_recordings_v1"`
UserV1 string `json:"user_v1"`
FlexActionV1 string `json:"flex_action_v1"`
BrowseV5 string `json:"browse_v5"`
UserBookmarksV1 string `json:"user_bookmarks_v1"`
GuideV0 string `json:"guide_v0"`
UserTastesV5 string `json:"user_tastes_v5"`
VortexV0 string `json:"vortex_v0"`
ConvivaV0 string `json:"conviva_v0"`
DvrRecordingSettingsV1 string `json:"dvr_recording_settings_v1"`
DvrV1 string `json:"dvr_v1"`
ConfigV0 string `json:"config_v0"`
EmuV0 string `json:"emu_v0"`
SauronV1 string `json:"sauron_v1"`
PlaybackFeaturesV0 string `json:"playback_features_v0"`
OfflinePlaylistV1 string `json:"offline_playlist_v1"`
AuthV1 string `json:"auth_v1"`
AuthV2 string `json:"auth_v2"`
OnboardingV5 string `json:"onboarding_v5"`
AuthAppleAuthnRequestV0 string `json:"auth_apple_authn_request_v0"`
GlobalNavV1 string `json:"global_nav_v1"`
} `json:"endpoint_urls"`
IapGracefulDegradationEnabled bool `json:"iap_graceful_degradation_enabled"`
KeyExpiration int `json:"key_expiration"`
Beacon string `json:"beacon"`
Key string `json:"key"`
EurekaApplicationName string `json:"eureka_application_name"`
DeviceID int `json:"device_id"`
PackageIDFrontPorch int `json:"package_id_front_porch"`
PlaybackFeaturesEndpoint string `json:"playback_features_endpoint"`
NoahSignupExceptionURL string `json:"noah_signup_exception_url"`
ExpirationNoticeHours int `json:"expiration_notice_hours"`
ForgotPasswordURL string `json:"forgotPasswordURL"`
SauronEndpoint string `json:"sauron_endpoint"`
GlobalNavEndpoint string `json:"global_nav_endpoint"`
PassThroughMetric string `json:"pass_through_metric"`
BanyaSec string `json:"banya_sec"`
Nydus string `json:"nydus"`
Flags struct {
HuluClientStandardPromptTheme bool `json:"hulu-client-standard-prompt-theme"`
HuluClientTwoFactorVerify bool `json:"hulu-client-two-factor-verify"`
HuluClientGatewayDeviceRanking bool `json:"hulu-client-gateway-device-ranking"`
HuluWebDemoPlayerVersion struct {
HitchMobilePlaybackProdHuluCom string `json:"hitch-mobile-playback.prod.hulu.com"`
CoviewingProdHuluCom string `json:"coviewing.prod.hulu.com"`
EndcardProdHuluCom string `json:"endcard.prod.hulu.com"`
LocalhostProdHuluCom string `json:"localhost.prod.hulu.com"`
OneplayerProdHuluCom string `json:"oneplayer.prod.hulu.com"`
DevelopProdHuluCom string `json:"develop.prod.hulu.com"`
} `json:"hulu-web-demo-player-version"`
HuluWebChromecastSdkPlayerVersion struct {
Player string `json:"player"`
Options struct {
MultiKey bool `json:"multi-key"`
Hdr bool `json:"hdr"`
Touchstone bool `json:"touchstone"`
} `json:"options"`
Sdk string `json:"sdk"`
} `json:"hulu-web-chromecast-sdk-player-version"`
HuluClientRokuInstantSignupEnabled bool `json:"hulu-client-roku-instant-signup-enabled"`
HuluClientEndCardFg1 bool `json:"hulu-client-end-card-fg1"`
HuluClientPinProtectionEnabled bool `json:"hulu-client-pin-protection-enabled"`
HuluClientPerformanceTracking bool `json:"hulu-client-performance-tracking"`
HuluWebSmokeSitePlayerVersion struct {
Nonsub string `json:"nonsub"`
Sub string `json:"sub"`
} `json:"hulu-web-smoke-site-player-version"`
HuluWebSmokeChromecastSdkPlayerVersion struct {
Player string `json:"player"`
Options struct {
MultipleKey bool `json:"multiple-key"`
MultiKey bool `json:"multi-key"`
Touchstone bool `json:"touchstone"`
} `json:"options"`
Sdk string `json:"sdk"`
} `json:"hulu-web-smoke-chromecast-sdk-player-version"`
HuluClientNeverBlockSvodEnabled bool `json:"hulu-client-never-block-svod-enabled"`
HuluClientUpdatedLocationPrompt bool `json:"hulu-client-updated-location-prompt"`
HuluClientFlexWelcomeEnabled bool `json:"hulu-client-flex-welcome-enabled"`
HuluClientEventPurchaseEnabled bool `json:"hulu-client-event-purchase-enabled"`
HuluWebDevelopProdSitePlayerOptions struct {
CreditEndCardDuration string `json:"credit_end_card_duration"`
SkipButtonDuration string `json:"skip_button_duration"`
EnablePinchZoom bool `json:"enable_pinch_zoom"`
EnabledAdobeAgent bool `json:"enabled_adobe_agent"`
EnabledQueuedSeek bool `json:"enabled_queued_seek"`
} `json:"hulu-web-develop-prod-site-player-options"`
HuluClientExperienceBrandedPageThemeSupport string `json:"hulu-client-experience-branded-page-theme-support"`
HuluClientSignupOnDeviceEnabled bool `json:"hulu-client-signup-on-device-enabled"`
HuluClientNonNumericSeasons bool `json:"hulu-client-non-numeric-seasons"`
HuluClientFlexTimeoutsMs int `json:"hulu-client-flex-timeouts-ms"`
HuluClientDvrRecordingsGroups bool `json:"hulu-client-dvr-recordings-groups"`
HuluClientPlayerBasicsFg1 bool `json:"hulu-client-player-basics-fg-1"`
HuluClientEventPurchasePollingTimeout int `json:"hulu-client-event-purchase-polling-timeout"`
HuluClientNewDvrFeatures bool `json:"hulu-client-new-dvr-features"`
HuluClientFeatureMultikey bool `json:"hulu-client-feature-multikey"`
HuluClientPostPurchaseCollectionID int `json:"hulu-client-post-purchase-collection-id"`
HuluClientPlanSelectExtraCopy struct {
ShowExtraCopy bool `json:"showExtraCopy"`
} `json:"hulu-client-plan-select-extra-copy"`
HuluWebSmokeChromecastPlayerOptions struct {
Touchstone bool `json:"touchstone"`
} `json:"hulu-web-smoke-chromecast-player-options"`
HuluClientCompassViewAllEnabled bool `json:"hulu-client-compass-view-all-enabled"`
HuluClientForcedDcsCapabilities []string `json:"hulu-client-forced-dcs-capabilities"`
HuluWebSitePlayerOptions struct {
CreditEndCardDuration string `json:"credit_end_card_duration"`
EnabledBrightline bool `json:"enabled_brightline"`
EnabledAdobeAgent bool `json:"enabled_adobe_agent"`
EnabledQueuedSeek bool `json:"enabled_queued_seek"`
} `json:"hulu-web-site-player-options"`
HuluClientInAppAccountManagementAddOnsEnabled bool `json:"hulu-client-in-app-account-management-add-ons-enabled"`
HuluClientCompassEnabled bool `json:"hulu-client-compass-enabled"`
HuluClientFeaturePxsSurveyEnabled bool `json:"hulu-client-feature-pxs-survey-enabled"`
HuluClientTrailheadBannerTheme bool `json:"hulu-client-trailhead-banner-theme"`
HuluClientAvMetadataBadgingEnabled bool `json:"hulu-client-av-metadata-badging-enabled"`
HuluClientIdleTimeMs int `json:"hulu-client-idle-time-ms"`
HuluWebDevelopProdSitePlayerVersion struct {
Nonsub string `json:"nonsub"`
Sub string `json:"sub"`
} `json:"hulu-web-develop-prod-site-player-version"`
HuluClientPlayerProgressReportInterval int `json:"hulu-client-player-progress-report-interval"`
HuluClientDeviceTokenLoggingEnabled bool `json:"hulu-client-device-token-logging-enabled"`
HuluClientInAppAccountManagementEnabled bool `json:"hulu-client-in-app-account-management-enabled"`
HuluClientEventPurchaseIdentityVerificationPollingInterval int `json:"hulu-client-event-purchase-identity-verification-polling-interval"`
HuluClientCheckProgramRecordability bool `json:"hulu-client-check-program-recordability"`
HuluClientAutoAccountLinkEnabled bool `json:"hulu-client-auto-account-link-enabled"`
HuluWebSmokeSitePlayerOptions struct {
CreditEndCardDuration string `json:"credit_end_card_duration"`
EnabledAdobeAgent bool `json:"enabled_adobe_agent"`
EnabledQueuedSeek bool `json:"enabled_queued_seek"`
} `json:"hulu-web-smoke-site-player-options"`
HuluClientFliptray2 bool `json:"hulu-client-fliptray-2"`
HuluClientOneplayer bool `json:"hulu-client-oneplayer"`
HuluClientFeaturePxsSurveyConfig struct {
PxsShowPercentage float64 `json:"pxs_show_percentage"`
PxsAutoDismissSeconds int `json:"pxs_auto_dismiss_seconds"`
PxsShowFrequencyDays int `json:"pxs_show_frequency_days"`
} `json:"hulu-client-feature-pxs-survey-config"`
HuluWebBrowseFlags struct {
EditorialActionsEnabled bool `json:"editorialActionsEnabled"`
ContextMenuActionV2Enabled bool `json:"contextMenuActionV2Enabled"`
VideoTileEnabled bool `json:"videoTileEnabled"`
EnableWebp bool `json:"enableWebp"`
VariationName string `json:"variationName"`
} `json:"hulu-web-browse-flags"`
HuluClientDetailsCastAndCrew bool `json:"hulu-client-details-cast-and-crew"`
HuluClientPlanSelectChartEnabled bool `json:"hulu-client-plan-select-chart-enabled"`
HuluClientEndpointURLConfiguration bool `json:"hulu-client-endpoint-url-configuration"`
HuluClientDvrMsbd bool `json:"hulu-client-dvr-msbd"`
HuluClientMyStuffDecoupled bool `json:"hulu-client-my-stuff-decoupled"`
HuluWebSitePlayerVersion struct {
Nonsub string `json:"nonsub"`
Sub string `json:"sub"`
} `json:"hulu-web-site-player-version"`
HuluClientTealiumEventsEnabled bool `json:"hulu-client-tealium-events-enabled"`
HuluWebChromecastPlayerOptions struct {
OverrideAdUnits string `json:"overrideAdUnits"`
Touchstone bool `json:"touchstone"`
} `json:"hulu-web-chromecast-player-options"`
HuluClientEventPurchasePollingBaseInterval int `json:"hulu-client-event-purchase-polling-base-interval"`
HuluClientBrandedCollections bool `json:"hulu-client-branded-collections"`
HuluClientSignupOnWebEnabled bool `json:"hulu-client-signup-on-web-enabled"`
HuluClientCompassSitemapEnabled bool `json:"hulu-client-compass-sitemap-enabled"`
HuluClientAdobeMetrics bool `json:"hulu-client-adobe-metrics"`
HuluClientGatewayAdLegalDisclaimer string `json:"hulu-client-gateway-ad-legal-disclaimer"`
HuluClientFeatureChannelFlipping bool `json:"hulu-client-feature-channel-flipping"`
HuluClientFeaturePlaybackCdnSorting bool `json:"hulu-client-feature-playback-cdn-sorting"`
HuluClientLoginMfa bool `json:"hulu-client-login-mfa"`
HuluClientLinksharingAppsflyer bool `json:"hulu-client-linksharing-appsflyer"`
HuluClientFeatureHdr bool `json:"hulu-client-feature-hdr"`
} `json:"flags"`
NoahProductTitle string `json:"noah_product_title"`
CriterionCollection int `json:"criterion_collection"`
KeyID int `json:"key_id"`
}