package client import ( "net/http" "time" ) // These are constants taken from https://player.hulu.com/site/dash/308343-site-curiosity/js/app.js 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"` }