Skip to content

Development Notes

d21spike edited this page May 20, 2021 · 1 revision

Initial Login

POST https://www.philo.com/auth/init/login_code HTTP/1.1
Host: www.philo.com
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36
Content-Type: application/json
Accept: */*
Origin: https://www.philo.com
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9

{"ident":"***user_email***","device":"web","device_ident":"web-***unique_device_uuid***","location":"***city***","send_token":true,"send_confirm_link":false}

Token Code Validation

POST https://www.philo.com/auth/update/login_code HTTP/1.1
Host: www.philo.com
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36
Content-Type: application/json
Accept: */*
Origin: https://www.philo.com
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9
Cookie: ***cookie_jar***

{"token":"***six_digit_code***"}

User Profiles Listing

GET https://www.philo.com/user/profiles/list.json HTTP/1.1
Host: www.philo.com
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36
Accept: */*
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9
Cookie: ***cookie_jar***

GraphQL Query Endpoint (Notification Query Below)

POST https://www.philo.com/graphql HTTP/1.1
Host: www.philo.com
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36
Content-Type: application/json
Origin: https://www.philo.com
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9
Cookie: ***cookie_jar***

***query_as_payload***

GraphQl Player Register Query

[{"query":"mutation ($captionsEnabled: Boolean!, $deviceName: String!, $deviceType: DeviceType!, $deviceIcon: DeviceIconType!, $uuid: String!, $volume: UnitInterval!) {\n  registerPlayer(captionsEnabled: $captionsEnabled, deviceName: $deviceName, deviceType: $deviceType, deviceIcon: $deviceIcon, uuid: $uuid, volume: $volume) {\n    nickname\n    id\n    lastUpdatedAt\n    deviceType\n    uuid\n    user {\n      id\n      displayName\n      __typename\n    }\n    __typename\n  }\n}\n","variables":{"deviceName":"Chrome on Windows","deviceIcon":"PC","deviceType":"WEB","uuid":"***unique_device_uuid***","captionsEnabled":false,"volume":0.75},"operationName":null},{"query":"query userSubscription {\n  userSubscription {\n    ...subscriptionFields\n    __typename\n  }\n}\n\nfragment subscriptionFields on UserSubscription {\n  hasContentAccess\n  state\n  subscriptionProvider\n  trialEndsAt\n  updatedAt\n  __typename\n}\n","operationName":"userSubscription"},{"query":"{\n  user {\n    id\n    __typename\n  }\n}\n","operationName":null}]

GraphQL Notification Query

[{"query":"query notifications($unacknowledgedOnly: Boolean!, $first: Int!, $after: String, $types: [NotificationType!]) {\n  notifications(unacknowledgedOnly: $unacknowledgedOnly, first: $first, after: $after, types: $types) {\n    summary {\n      totalCount\n      unacknowledgedCount\n      __typename\n    }\n    edges {\n      node {\n        ...notificationTypesFields\n        __typename\n      }\n      cursor\n      __typename\n    }\n    pageInfo {\n      hasNextPage\n      __typename\n    }\n    __typename\n  }\n}\n\nfragment notificationTypesFields on Notification {\n  typename: __typename\n  id\n  createdAt\n  acknowledgedAt\n  ... on SendShowNotification {\n    ...sendShowNotificationFields\n    __typename\n  }\n  ... on FriendRequestNotification {\n    ...friendRequestNotificationFields\n    __typename\n  }\n  ... on SurveyNotification {\n    ...surveyNotificationFields\n    __typename\n  }\n  ... on EmailVerificationNotification {\n    ...emailVerificationNotificationFields\n    __typename\n  }\n  ... on GenericNotification {\n    ...genericNotificationFields\n    __typename\n  }\n  ... on NavigationNotification {\n    ...navigationNotificationFields\n    __typename\n  }\n}\n\nfragment sendShowNotificationFields on SendShowNotification {\n  message\n  user {\n    id\n    displayName\n    images {\n      s\n      __typename\n    }\n    __typename\n  }\n  show {\n    id\n    title\n    description\n    hasFollow\n    image(maxSize: S, orientation: HORIZONTAL, preferredType: ICONIC) {\n      url\n      size\n      type\n      __typename\n    }\n    ...showColorFields\n    __typename\n  }\n  __typename\n}\n\nfragment showColorFields on Show {\n  imageColors: image(maxSize: L, orientation: HORIZONTAL, preferredType: BANNER) {\n    colors(deviceType: WEB) {\n      key {\n        all {\n          r\n          g\n          b\n          __typename\n        }\n        __typename\n      }\n      __typename\n    }\n    __typename\n  }\n  __typename\n}\n\nfragment friendRequestNotificationFields on FriendRequestNotification {\n  user {\n    id\n    displayName\n    friendStatus\n    images {\n      s\n      __typename\n    }\n    __typename\n  }\n  __typename\n}\n\nfragment surveyNotificationFields on SurveyNotification {\n  pollName\n  questions {\n    id\n    name\n    answers {\n      id\n      name\n      __typename\n    }\n    __typename\n  }\n  __typename\n}\n\nfragment emailVerificationNotificationFields on EmailVerificationNotification {\n  action\n  __typename\n}\n\nfragment navigationNotificationFields on NavigationNotification {\n  navigationAction: action {\n    url\n    iconURL(type: LINK, format: SVG)\n    label\n    __typename\n  }\n  __typename\n}\n\nfragment genericNotificationFields on GenericNotification {\n  title\n  body\n  imageURL\n  __typename\n}\n","variables":{"unacknowledgedOnly":true,"types":["MESSAGE","NAVIGATION","SURVEY","EMAIL_VERIFICATION","FRIEND_REQUEST","SEND_SHOW"],"first":12,"after":null,"last":null,"before":null},"operationName":"notifications"},{"query":"{\n  user {\n    id\n    displayName\n    images {\n      s\n      m\n      l\n      __typename\n    }\n    __typename\n  }\n}\n","operationName":null},{"query":"query page($pageType: PageType!, $typeId: ID, $filterId: ID, $filter: String, $endCursor: String, $first: Int!, $initialTiles: Int!, $sorterId: ID) {\n  page(type: $pageType, typeId: $typeId, filterId: $filterId, filter: $filter, sorterId: $sorterId) {\n    id\n    title\n    showProfileType: node {\n      ... on Show {\n        showId: id\n        showType: type\n        showTitle: title\n        shareURL\n        __typename\n      }\n      __typename\n    }\n    channelProfile: node {\n      ... on Channel {\n        __typename\n        channelId: id\n        images {\n          smallWhite\n          largeWhite\n          small\n          large\n          preview\n          largePreview\n          __typename\n        }\n        displayName\n        isInPlan\n        shareURL\n        isFavorite\n        currentBroadcast {\n          show {\n            imageHero: image(maxSize: L, orientation: HORIZONTAL, preferredType: ICONIC) {\n              url\n              ...colorPalette\n              size\n              type\n              __typename\n            }\n            image(maxSize: L, orientation: HORIZONTAL, preferredType: ICONIC) {\n              url\n              ...colorPalette\n              size\n              type\n              __typename\n            }\n            __typename\n          }\n          episode {\n            imageHero: image(maxSize: L, orientation: HORIZONTAL, preferredType: ICONIC) {\n              url\n              ...colorPalette\n              size\n              type\n              __typename\n            }\n            image(maxSize: L, orientation: HORIZONTAL, preferredType: ICONIC) {\n              url\n              ...colorPalette\n              size\n              type\n              __typename\n            }\n            __typename\n          }\n          __typename\n        }\n      }\n      __typename\n    }\n    showProfile: tile {\n      ...TileBasicsFragment\n      show {\n        ...ShowTileCommonFragment\n        ...MovieProfileFragment\n        __typename\n      }\n      episode {\n        ...EpisodeHeroImageFragment\n        __typename\n      }\n      __typename\n    }\n    filters {\n      id\n      title\n      __typename\n    }\n    sorters {\n      id\n      title\n      selected\n      __typename\n    }\n    groups(first: $first, after: $endCursor) {\n      pageInfo {\n        ...PaginationPageInfoFragment\n        __typename\n      }\n      edges {\n        cursor\n        node {\n          id\n          title\n          header {\n            title\n            iconURL(type: DEFAULT, format: SVG)\n            __typename\n          }\n          iconURL(type: DEFAULT, format: SVG)\n          linkIconURL: iconURL(type: LINK, format: SVG)\n          link {\n            type\n            typeId\n            filterId\n            filter\n            __typename\n          }\n          type\n          channel {\n            channelId\n            displayName\n            isFavorite\n            images {\n              smallWhite\n              small\n              __typename\n            }\n            __typename\n          }\n          behaviors\n          tiles(initialTiles: $initialTiles) {\n            status\n            pageInfo {\n              ...PaginationPageInfoFragment\n              __typename\n            }\n            summary {\n              initialRelativeIndex\n              totalCount\n              __typename\n            }\n            edges {\n              node {\n                ...PresentationTile\n                __typename\n              }\n              cursor\n              __typename\n            }\n            __typename\n          }\n          __typename\n        }\n        cursor\n        __typename\n      }\n      summary {\n        totalCount\n        __typename\n      }\n      status\n      __typename\n    }\n    __typename\n  }\n}\n\nfragment PresentationTile on Tile {\n  ...TileBasicsFragment\n  header {\n    title\n    iconURL(type: DEFAULT, format: SVG)\n    __typename\n  }\n  show {\n    ...ShowTileCommonFragment\n    imageBanner: image(orientation: HORIZONTAL, maxSize: S, preferredType: BANNER, strictMatch: true) {\n      url\n      size\n      ...colorPalette\n      type\n      __typename\n    }\n    imageIconic: image(orientation: HORIZONTAL, maxSize: S, preferredType: ICONIC) {\n      url\n      size\n      ...colorPalette\n      type\n      __typename\n    }\n    imageHero: image(maxSize: M, orientation: HORIZONTAL, preferredType: ICONIC) {\n      url\n      ...colorPalette\n      size\n      type\n      __typename\n    }\n    imageBannerMovie: image(orientation: HORIZONTAL, maxSize: S, preferredType: BANNER, strictMatch: true) {\n      url\n      ...colorPalette\n      size\n      type\n      __typename\n    }\n    __typename\n  }\n  episode {\n    id\n    episodeId\n    episodeNum\n    seasonNum\n    imageBanner: image(orientation: HORIZONTAL, maxSize: S, preferredType: BANNER) {\n      url\n      size\n      ...colorPalette\n      type\n      __typename\n    }\n    imageIconic: image(orientation: HORIZONTAL, maxSize: S, preferredType: ICONIC) {\n      url\n      size\n      ...colorPalette\n      type\n      __typename\n    }\n    imageHero: image(maxSize: M, orientation: HORIZONTAL, preferredType: ICONIC) {\n      url\n      ...colorPalette\n      size\n      type\n      __typename\n    }\n    __typename\n  }\n  __typename\n}\n\nfragment colorPalette on Image {\n  colors(deviceType: WEB) {\n    key {\n      all {\n        r\n        g\n        b\n        __typename\n      }\n      __typename\n    }\n    __typename\n  }\n  __typename\n}\n\nfragment TileBasicsFragment on Tile {\n  title\n  subtitle\n  description\n  longDescription\n  isInPlan\n  isBlackout\n  isDVR\n  isWatched\n  hasPlayable\n  hasUpcoming\n  durationInSeconds\n  newForUser\n  playableAssetId\n  playableAssetType\n  playbackPercentage\n  previewURL\n  largePreviewURL\n  airingTime\n  availabilityStartsAt\n  availabilityEndsAt\n  ratings {\n    classification\n    value\n    __typename\n  }\n  channel {\n    id\n    channelId\n    displayName\n    isFavorite\n    images {\n      smallWhite\n      small\n      largeWhite\n      large\n      __typename\n    }\n    __typename\n  }\n  notInPlanProducts {\n    id\n    displayName\n    keyImage\n    __typename\n  }\n  behaviors\n  __typename\n}\n\nfragment ShowTileCommonFragment on ShowTile {\n  id\n  showId\n  type\n  hasFollow\n  movieReleaseYear\n  movieRunTimeInSeconds\n  __typename\n}\n\nfragment PaginationPageInfoFragment on PageInfo {\n  hasPreviousPage\n  hasNextPage\n  endCursor\n  startCursor\n  __typename\n}\n\nfragment MovieProfileFragment on ShowTile {\n  imageHero: image(maxSize: XL, orientation: HORIZONTAL, preferredType: ICONIC) {\n    url\n    ...colorPalette\n    size\n    type\n    __typename\n  }\n  imageBanner: image(maxSize: S, orientation: HORIZONTAL, preferredType: BANNER) {\n    url\n    ...colorPalette\n    size\n    type\n    __typename\n  }\n  moviePoster: image(maxSize: S, orientation: VERTICAL, preferredType: BANNER) {\n    url\n    __typename\n  }\n  __typename\n}\n\nfragment EpisodeHeroImageFragment on EpisodeTile {\n  imageHero: image(maxSize: L, orientation: HORIZONTAL, preferredType: ICONIC) {\n    url\n    ...colorPalette\n    size\n    type\n    __typename\n  }\n  image(maxSize: L, orientation: HORIZONTAL, preferredType: ICONIC) {\n    url\n    ...colorPalette\n    size\n    type\n    __typename\n  }\n  __typename\n}\n","variables":{"pageType":"HOME","initialTiles":8,"first":8,"after":null,"last":null,"before":null},"operationName":"page"}]

GraphQL Guide Query

[{"query":"query page($pageType: PageType!, $typeId: ID, $filterId: ID, $filter: String, $endCursor: String, $first: Int!, $initialTiles: Int!, $sorterId: ID) {\n  page(type: $pageType, typeId: $typeId, filterId: $filterId, filter: $filter, sorterId: $sorterId) {\n    id\n    title\n    showProfileType: node {\n      ... on Show {\n        showId: id\n        showType: type\n        showTitle: title\n        shareURL\n        __typename\n      }\n      __typename\n    }\n    channelProfile: node {\n      ... on Channel {\n        __typename\n        channelId: id\n        images {\n          smallWhite\n          largeWhite\n          small\n          large\n          preview\n          largePreview\n          __typename\n        }\n        displayName\n        isInPlan\n        shareURL\n        isFavorite\n        currentBroadcast {\n          show {\n            imageHero: image(maxSize: L, orientation: HORIZONTAL, preferredType: ICONIC) {\n              url\n              ...colorPalette\n              size\n              type\n              __typename\n            }\n            image(maxSize: L, orientation: HORIZONTAL, preferredType: ICONIC) {\n              url\n              ...colorPalette\n              size\n              type\n              __typename\n            }\n            __typename\n          }\n          episode {\n            imageHero: image(maxSize: L, orientation: HORIZONTAL, preferredType: ICONIC) {\n              url\n              ...colorPalette\n              size\n              type\n              __typename\n            }\n            image(maxSize: L, orientation: HORIZONTAL, preferredType: ICONIC) {\n              url\n              ...colorPalette\n              size\n              type\n              __typename\n            }\n            __typename\n          }\n          __typename\n        }\n      }\n      __typename\n    }\n    showProfile: tile {\n      ...TileBasicsFragment\n      show {\n        ...ShowTileCommonFragment\n        ...MovieProfileFragment\n        __typename\n      }\n      episode {\n        ...EpisodeHeroImageFragment\n        __typename\n      }\n      __typename\n    }\n    filters {\n      id\n      title\n      __typename\n    }\n    sorters {\n      id\n      title\n      selected\n      __typename\n    }\n    groups(first: $first, after: $endCursor) {\n      pageInfo {\n        ...PaginationPageInfoFragment\n        __typename\n      }\n      edges {\n        cursor\n        node {\n          id\n          title\n          header {\n            title\n            iconURL(type: DEFAULT, format: SVG)\n            __typename\n          }\n          iconURL(type: DEFAULT, format: SVG)\n          linkIconURL: iconURL(type: LINK, format: SVG)\n          link {\n            type\n            typeId\n            filterId\n            filter\n            __typename\n          }\n          type\n          channel {\n            channelId\n            displayName\n            isFavorite\n            images {\n              smallWhite\n              small\n              __typename\n            }\n            __typename\n          }\n          behaviors\n          tiles(initialTiles: $initialTiles) {\n            status\n            pageInfo {\n              ...PaginationPageInfoFragment\n              __typename\n            }\n            summary {\n              initialRelativeIndex\n              totalCount\n              __typename\n            }\n            edges {\n              node {\n                ...PresentationTile\n                __typename\n              }\n              cursor\n              __typename\n            }\n            __typename\n          }\n          __typename\n        }\n        cursor\n        __typename\n      }\n      summary {\n        totalCount\n        __typename\n      }\n      status\n      __typename\n    }\n    __typename\n  }\n}\n\nfragment PresentationTile on Tile {\n  ...TileBasicsFragment\n  header {\n    title\n    iconURL(type: DEFAULT, format: SVG)\n    __typename\n  }\n  show {\n    ...ShowTileCommonFragment\n    imageBanner: image(orientation: HORIZONTAL, maxSize: S, preferredType: BANNER, strictMatch: true) {\n      url\n      size\n      ...colorPalette\n      type\n      __typename\n    }\n    imageIconic: image(orientation: HORIZONTAL, maxSize: S, preferredType: ICONIC) {\n      url\n      size\n      ...colorPalette\n      type\n      __typename\n    }\n    imageHero: image(maxSize: M, orientation: HORIZONTAL, preferredType: ICONIC) {\n      url\n      ...colorPalette\n      size\n      type\n      __typename\n    }\n    imageBannerMovie: image(orientation: HORIZONTAL, maxSize: S, preferredType: BANNER, strictMatch: true) {\n      url\n      ...colorPalette\n      size\n      type\n      __typename\n    }\n    __typename\n  }\n  episode {\n    id\n    episodeId\n    episodeNum\n    seasonNum\n    imageBanner: image(orientation: HORIZONTAL, maxSize: S, preferredType: BANNER) {\n      url\n      size\n      ...colorPalette\n      type\n      __typename\n    }\n    imageIconic: image(orientation: HORIZONTAL, maxSize: S, preferredType: ICONIC) {\n      url\n      size\n      ...colorPalette\n      type\n      __typename\n    }\n    imageHero: image(maxSize: M, orientation: HORIZONTAL, preferredType: ICONIC) {\n      url\n      ...colorPalette\n      size\n      type\n      __typename\n    }\n    __typename\n  }\n  __typename\n}\n\nfragment colorPalette on Image {\n  colors(deviceType: WEB) {\n    key {\n      all {\n        r\n        g\n        b\n        __typename\n      }\n      __typename\n    }\n    __typename\n  }\n  __typename\n}\n\nfragment TileBasicsFragment on Tile {\n  title\n  subtitle\n  description\n  longDescription\n  isInPlan\n  isBlackout\n  isDVR\n  isWatched\n  hasPlayable\n  hasUpcoming\n  durationInSeconds\n  newForUser\n  playableAssetId\n  playableAssetType\n  playbackPercentage\n  previewURL\n  largePreviewURL\n  airingTime\n  availabilityStartsAt\n  availabilityEndsAt\n  ratings {\n    classification\n    value\n    __typename\n  }\n  channel {\n    id\n    channelId\n    displayName\n    isFavorite\n    images {\n      smallWhite\n      small\n      largeWhite\n      large\n      __typename\n    }\n    __typename\n  }\n  notInPlanProducts {\n    id\n    displayName\n    keyImage\n    __typename\n  }\n  behaviors\n  __typename\n}\n\nfragment ShowTileCommonFragment on ShowTile {\n  id\n  showId\n  type\n  hasFollow\n  movieReleaseYear\n  movieRunTimeInSeconds\n  __typename\n}\n\nfragment PaginationPageInfoFragment on PageInfo {\n  hasPreviousPage\n  hasNextPage\n  endCursor\n  startCursor\n  __typename\n}\n\nfragment MovieProfileFragment on ShowTile {\n  imageHero: image(maxSize: XL, orientation: HORIZONTAL, preferredType: ICONIC) {\n    url\n    ...colorPalette\n    size\n    type\n    __typename\n  }\n  imageBanner: image(maxSize: S, orientation: HORIZONTAL, preferredType: BANNER) {\n    url\n    ...colorPalette\n    size\n    type\n    __typename\n  }\n  moviePoster: image(maxSize: S, orientation: VERTICAL, preferredType: BANNER) {\n    url\n    __typename\n  }\n  __typename\n}\n\nfragment EpisodeHeroImageFragment on EpisodeTile {\n  imageHero: image(maxSize: L, orientation: HORIZONTAL, preferredType: ICONIC) {\n    url\n    ...colorPalette\n    size\n    type\n    __typename\n  }\n  image(maxSize: L, orientation: HORIZONTAL, preferredType: ICONIC) {\n    url\n    ...colorPalette\n    size\n    type\n    __typename\n  }\n  __typename\n}\n","variables":{"pageType":"GUIDE","initialTiles":8,"first":8,"after":null,"last":null,"before":null},"operationName":"page"}]

GraphQL Playback Request Query

[{"query":"mutation createPlaybackSession($id: ID!, $pid: String!, $code: String, $playerId: ID) {\n  createPlaybackSession(id: $id, pid: $pid, code: $code, playerId: $playerId) {\n    ...playbackSessionFields\n    sharedPlaybackSession {\n      ...sharedPlaybackSessionFields\n      __typename\n    }\n    __typename\n  }\n}\n\nfragment sharedPlaybackSessionFields on SharedPlaybackSession {\n  id\n  lastUpdatedAt\n  lastUpdatedBy {\n    ...playerFields\n    __typename\n  }\n  partyPlayState {\n    ...playStateFields\n    __typename\n  }\n  requestedAsset {\n    id\n    __typename\n  }\n  syncedPlayers(first: 5) {\n    edges {\n      node {\n        ...playerFields\n        __typename\n      }\n      __typename\n    }\n    summary {\n      totalCount\n      __typename\n    }\n    __typename\n  }\n  __typename\n}\n\nfragment playStateFields on PlayState {\n  isInParty\n  lastUpdatedAt\n  playbackRate\n  playerStatus\n  positionInMs\n  serverTime\n  version\n  __typename\n}\n\nfragment playerFields on Player {\n  id\n  nickname\n  deviceName\n  user {\n    id\n    displayName\n    __typename\n  }\n  settings {\n    captionsEnabled\n    volume\n    version\n    __typename\n  }\n  __typename\n}\n\nfragment playbackSessionFields on PlaybackSession {\n  node {\n    id\n    typename: __typename\n    ...playbackSessionChannelFields\n    ...playbackSessionRecordingFields\n    ...playbackSessionVODFields\n  }\n  pid\n  checkAt\n  dashJSONURL\n  dashURL\n  drm(drmType: CASTLABS)\n  drmURL(drmType: CASTLABS)\n  hlsURL\n  meta\n  thumbsURL\n  reportingIntervalInMs\n  __typename\n}\n\nfragment playbackSessionChannelFields on Channel {\n  callsign\n  currentBroadcast {\n    id\n    show {\n      id\n      title\n      __typename\n    }\n    episode {\n      id\n      subtitle\n      __typename\n    }\n    playhead {\n      positionInSeconds\n      watchedRanges {\n        start\n        end\n        __typename\n      }\n      __typename\n    }\n    __typename\n  }\n  __typename\n}\n\nfragment playbackSessionRecordingFields on Recording {\n  corruptedAt\n  lookbackEndsAt\n  durationInSeconds\n  broadcast {\n    ...playerBroadcastFields\n    playhead {\n      positionInSeconds\n      watchedRanges {\n        start\n        end\n        __typename\n      }\n      __typename\n    }\n    channel {\n      ...playerChannelFields\n      __typename\n    }\n    show {\n      ...playerShowFields\n      __typename\n    }\n    episode {\n      ...playerEpisodeFields\n      __typename\n    }\n    __typename\n  }\n  __typename\n}\n\nfragment playerBroadcastFields on Broadcast {\n  id\n  startsAt\n  endsAt\n  hasAdPositionMarkers\n  hasSeekRestrictions\n  __typename\n}\n\nfragment playerChannelFields on Channel {\n  id\n  isActive\n  displayName\n  callsign\n  images {\n    small\n    smallWhite\n    smallDark\n    __typename\n  }\n  __typename\n}\n\nfragment playerShowFields on Show {\n  id\n  title\n  type\n  description\n  longDescription\n  movieReleaseYear\n  hasFollow\n  image(maxSize: M, orientation: HORIZONTAL, preferredType: ICONIC) {\n    url\n    type\n    __typename\n  }\n  __typename\n}\n\nfragment playerEpisodeFields on Episode {\n  id\n  subtitle\n  seasonNum\n  episodeNum\n  description\n  longDescription\n  image(maxSize: M, orientation: HORIZONTAL, preferredType: ICONIC) {\n    url\n    type\n    __typename\n  }\n  __typename\n}\n\nfragment playbackSessionVODFields on VOD {\n  durationInSeconds\n  licenseEndsAt\n  playhead {\n    positionInSeconds\n    watchedRanges {\n      start\n      end\n      __typename\n    }\n    __typename\n  }\n  channel {\n    ...playerChannelFields\n    __typename\n  }\n  show {\n    ...playerShowFields\n    __typename\n  }\n  episode {\n    ...playerEpisodeFields\n    __typename\n  }\n  hasAdPositionMarkers\n  hasSeekRestrictions\n  __typename\n}\n","variables":{"id":"***playable_asset_id***","pid":"web-***unique_device_uuid***","playerId":"***unique_player_id***","code":null},"operationName":"createPlaybackSession"}]