Universal EPG for live Max/Netflix/Prime/Peacock/ABCNetworks

Oh it doesn't have to be docker, just running your script with node exposes an endpoint right?

Can it not talk to the cached file from the running cc4c server? Could you have it login like the Eplustv does?

Has anyone else had any success?

The peacock screenshot was from your screenshot, not mine, peacock doesnt work for me either, I assume something isnt authenticating.

Hello... just ran this but I'm running into a bunch of errors after getting it setup in Docker... here's what I"m seeing, if you can lend some insight into what I might be doing wrong?


> [email protected] start
> ts-node index.tsx

=== ccEPG v0.1.0 starting ===
=== Getting events ===
Looking for Peacock events...
Error getting Peacock channels
AxiosError: Request failed with status code 400
    at settle (/app/node_modules/axios/lib/core/settle.js:19:12)
    at IncomingMessage.handleStreamEnd (/app/node_modules/axios/lib/adapters/http.js:512:11)
    at IncomingMessage.emit (node:events:529:35)
    at IncomingMessage.emit (node:domain:489:12)
    at endReadableNT (node:internal/streams/readable:1400:12)
    at processTicksAndRejections (node:internal/process/task_queues:82:21) {
  code: 'ERR_BAD_REQUEST',
  config: {
    transitional: {
      silentJSONParsing: true,
      forcedJSONParsing: true,
      clarifyTimeoutError: false
    },
    adapter: [ 'xhr', 'http' ],
    transformRequest: [ [Function: transformRequest] ],
    transformResponse: [ [Function: transformResponse] ],
    timeout: 0,
    xsrfCookieName: 'XSRF-TOKEN',
    xsrfHeaderName: 'X-XSRF-TOKEN',
    maxContentLength: -1,
    maxBodyLength: -1,
    env: { FormData: [Function], Blob: [class Blob] },
    validateStatus: [Function: validateStatus],
    headers: AxiosHeaders {
      Accept: 'application/json, text/plain, */*',
      'X-SkyOTT-Device': 'COMPUTER',
      'X-SkyOTT-Platform': 'PC',
      'X-SkyOTT-Proposition': 'NBCUOTT',
      'X-SkyOTT-Territory': 'US',
      'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:106.0) Gecko/20100101 Firefox/106.0',
      'Accept-Encoding': 'gzip, compress, deflate, br'
    },
    method: 'get',
    url: 'https://bff-ext.clients.peacocktv.com/bff/channel_guide?startTime=2024-10-16T18:50+00:00&assetsPerChannelCapLimit=1000&contentSegments=D2C,Free',
    data: undefined
  },
  request: <ref *1> ClientRequest {
    _events: [Object: null prototype] {
      abort: [Function (anonymous)],
      aborted: [Function (anonymous)],
      connect: [Function (anonymous)],
      error: [Function (anonymous)],
      socket: [Function (anonymous)],
      timeout: [Function (anonymous)],
      finish: [Function: requestOnFinish]
    },
    _eventsCount: 7,
    _maxListeners: undefined,
    outputData: [],
    outputSize: 0,
    writable: true,
    destroyed: false,
    _last: true,
    chunkedEncoding: false,
    shouldKeepAlive: false,
    maxRequestsOnConnectionReached: false,
    _defaultKeepAlive: true,
    useChunkedEncodingByDefault: false,
    sendDate: false,
    _removedConnection: false,
    _removedContLen: false,
    _removedTE: false,
    strictContentLength: false,
    _contentLength: 0,
    _hasBody: true,
    _trailer: '',
    finished: true,
    _headerSent: true,
    _closed: false,
    socket: TLSSocket {
      _tlsOptions: [Object],
      _secureEstablished: true,
      _securePending: false,
      _newSessionPending: false,
      _controlReleased: true,
      secureConnecting: false,
      _SNICallback: null,
      servername: 'bff-ext.clients.peacocktv.com',
      alpnProtocol: false,
      authorized: true,
      authorizationError: null,
      encrypted: true,
      _events: [Object: null prototype],
      _eventsCount: 10,
      connecting: false,
      _hadError: false,
      _parent: null,
      _host: 'bff-ext.clients.peacocktv.com',
      _closeAfterHandlingError: false,
      _readableState: [ReadableState],
      _maxListeners: undefined,
      _writableState: [WritableState],
      allowHalfOpen: false,
      _sockname: null,
      _pendingData: null,
      _pendingEncoding: '',
      server: undefined,
      _server: null,
      ssl: [TLSWrap],
      _requestCert: true,
      _rejectUnauthorized: true,
      parser: null,
      _httpMessage: [Circular *1],
      [Symbol(alpncallback)]: null,
      [Symbol(res)]: [TLSWrap],
      [Symbol(verified)]: true,
      [Symbol(pendingSession)]: null,
      [Symbol(async_id_symbol)]: 946,
      [Symbol(kHandle)]: [TLSWrap],
      [Symbol(lastWriteQueueSize)]: 0,
      [Symbol(timeout)]: null,
      [Symbol(kBuffer)]: null,
      [Symbol(kBufferCb)]: null,
      [Symbol(kBufferGen)]: null,
      [Symbol(kCapture)]: false,
      [Symbol(kSetNoDelay)]: false,
      [Symbol(kSetKeepAlive)]: true,
      [Symbol(kSetKeepAliveInitialDelay)]: 60,
      [Symbol(kBytesRead)]: 0,
      [Symbol(kBytesWritten)]: 0,
      [Symbol(connect-options)]: [Object]
    },
    _header: 'GET /bff/channel_guide?startTime=2024-10-16T18:50+00:00&assetsPerChannelCapLimit=1000&contentSegments=D2C,Free HTTP/1.1\r\n' +
      'Accept: application/json, text/plain, */*\r\n' +
      'X-SkyOTT-Device: COMPUTER\r\n' +
      'X-SkyOTT-Platform: PC\r\n' +
      'X-SkyOTT-Proposition: NBCUOTT\r\n' +
      'X-SkyOTT-Territory: US\r\n' +
      'user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:106.0) Gecko/20100101 Firefox/106.0\r\n' +
      'Accept-Encoding: gzip, compress, deflate, br\r\n' +
      'Host: bff-ext.clients.peacocktv.com\r\n' +
      'Connection: close\r\n' +
      '\r\n',
    _keepAliveTimeout: 0,
    _onPendingData: [Function: nop],
    agent: Agent {
      _events: [Object: null prototype],
      _eventsCount: 2,
      _maxListeners: undefined,
      defaultPort: 443,
      protocol: 'https:',
      options: [Object: null prototype],
      requests: [Object: null prototype] {},
      sockets: [Object: null prototype],
      freeSockets: [Object: null prototype] {},
      keepAliveMsecs: 1000,
      keepAlive: false,
      maxSockets: Infinity,
      maxFreeSockets: 256,
      scheduling: 'lifo',
      maxTotalSockets: Infinity,
      totalSocketCount: 1,
      maxCachedSessions: 100,
      _sessionCache: [Object],
Could not parse Peacock events
      [Symbol(kCapture)]: false
    },
    socketPath: undefined,
    method: 'GET',
    maxHeaderSize: undefined,
    insecureHTTPParser: undefined,
    joinDuplicateHeaders: undefined,
    path: '/bff/channel_guide?startTime=2024-10-16T18:50+00:00&assetsPerChannelCapLimit=1000&contentSegments=D2C,Free',
    _ended: true,
    res: IncomingMessage {
      _readableState: [ReadableState],
      _events: [Object: null prototype],
      _eventsCount: 4,
      _maxListeners: undefined,
      socket: [TLSSocket],
      httpVersionMajor: 1,
      httpVersionMinor: 1,
      httpVersion: '1.1',
      complete: true,
      rawHeaders: [Array],
      rawTrailers: [],
      joinDuplicateHeaders: undefined,
      aborted: false,
      upgrade: false,
      url: '',
      method: null,
      statusCode: 400,
      statusMessage: 'Bad Request',
      client: [TLSSocket],
      _consuming: true,
      _dumped: false,
      req: [Circular *1],
      responseUrl: 'https://bff-ext.clients.peacocktv.com/bff/channel_guide?startTime=2024-10-16T18:50+00:00&assetsPerChannelCapLimit=1000&contentSegments=D2C,Free',
      redirects: [],
      [Symbol(kCapture)]: false,
      [Symbol(kHeaders)]: [Object],
      [Symbol(kHeadersCount)]: 40,
      [Symbol(kTrailers)]: null,
      [Symbol(kTrailersCount)]: 0
    },
    aborted: false,
    timeoutCb: null,
    upgradeOrConnect: false,
    parser: null,
    maxHeadersCount: null,
    reusedSocket: false,
    host: 'bff-ext.clients.peacocktv.com',
    protocol: 'https:',
    _redirectable: Writable {
      _writableState: [WritableState],
      _events: [Object: null prototype],
      _eventsCount: 3,
      _maxListeners: undefined,
      _options: [Object],
      _ended: true,
      _ending: true,
      _redirectCount: 0,
      _redirects: [],
      _requestBodyLength: 0,
      _requestBodyBuffers: [],
      _onNativeResponse: [Function (anonymous)],
      _currentRequest: [Circular *1],
      _currentUrl: 'https://bff-ext.clients.peacocktv.com/bff/channel_guide?startTime=2024-10-16T18:50+00:00&assetsPerChannelCapLimit=1000&contentSegments=D2C,Free',
      [Symbol(kCapture)]: false
    },
    [Symbol(kCapture)]: false,
    [Symbol(kBytesWritten)]: 0,
    [Symbol(kNeedDrain)]: false,
    [Symbol(corked)]: 0,
    [Symbol(kOutHeaders)]: [Object: null prototype] {
      accept: [Array],
      'x-skyott-device': [Array],
      'x-skyott-platform': [Array],
      'x-skyott-proposition': [Array],
      'x-skyott-territory': [Array],
      'user-agent': [Array],
      'accept-encoding': [Array],
      host: [Array]
    },
    [Symbol(errored)]: null,
    [Symbol(kHighWaterMark)]: 16384,
    [Symbol(kRejectNonStandardBodyWrites)]: false,
    [Symbol(kUniqueHeaders)]: null
  },
  response: {
    status: 400,
    statusText: 'Bad Request',
    headers: AxiosHeaders {
      connection: 'close',
      'content-length': '92',
      'strict-transport-security': 'max-age=63072000',
      'accept-ranges': 'bytes',
      'cache-control': 'max-age=300',
      'x-skyint-requestid': '21438610-f79a-433a-949c-0ed6ac9502f9',
      'content-type': 'application/json; charset=utf-8',
      etag: 'W/"5c-fXqGKWHUKZafsr4aDskFZHx3lbk"',
      date: 'Wed, 16 Oct 2024 18:48:59 GMT',
      'x-served-by': 'cache-chi-kigq8000062-CHI, cache-chi-kigq8000031-CHI, cache-mia-kmia1760026-MIA',
      'x-cache': 'MISS, MISS, MISS',
      'x-cache-hits': '0, 0, 0',
      'x-timer': 'S1729104539.419874,VS0,VE65',
      'access-control-allow-methods': 'HEAD, GET, OPTIONS, PUT, POST, DELETE',
      'access-control-allow-credentials': 'true',
      'access-control-max-age': '86400',
      'timing-allow-origin': '*',
      'access-control-expose-headers': 'via, x-skyott-suggestemptyresultsreason, date',
      via: 'fastly',
      'x-original-host': 'bff-ext.clients.peacocktv.com'
    },
    config: {
      transitional: [Object],
      adapter: [Array],
      transformRequest: [Array],
      transformResponse: [Array],
      timeout: 0,
      xsrfCookieName: 'XSRF-TOKEN',
      xsrfHeaderName: 'X-XSRF-TOKEN',
      maxContentLength: -1,
      maxBodyLength: -1,
      env: [Object],
      validateStatus: [Function: validateStatus],
      headers: [AxiosHeaders],
      method: 'get',
      url: 'https://bff-ext.clients.peacocktv.com/bff/channel_guide?startTime=2024-10-16T18:50+00:00&assetsPerChannelCapLimit=1000&contentSegments=D2C,Free',
      data: undefined
    },
    request: <ref *1> ClientRequest {
      _events: [Object: null prototype],
      _eventsCount: 7,
      _maxListeners: undefined,
      outputData: [],
      outputSize: 0,
      writable: true,
      destroyed: false,
      _last: true,
      chunkedEncoding: false,
      shouldKeepAlive: false,
      maxRequestsOnConnectionReached: false,
      _defaultKeepAlive: true,
      useChunkedEncodingByDefault: false,
      sendDate: false,
      _removedConnection: false,
      _removedContLen: false,
      _removedTE: false,
      strictContentLength: false,
      _contentLength: 0,
      _hasBody: true,
      _trailer: '',
      finished: true,
      _headerSent: true,
      _closed: false,
      socket: [TLSSocket],
      _header: 'GET /bff/channel_guide?startTime=2024-10-16T18:50+00:00&assetsPerChannelCapLimit=1000&contentSegments=D2C,Free HTTP/1.1\r\n' +
        'Accept: application/json, text/plain, */*\r\n' +
        'X-SkyOTT-Device: COMPUTER\r\n' +
        'X-SkyOTT-Platform: PC\r\n' +
        'X-SkyOTT-Proposition: NBCUOTT\r\n' +
        'X-SkyOTT-Territory: US\r\n' +
        'user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:106.0) Gecko/20100101 Firefox/106.0\r\n' +
        'Accept-Encoding: gzip, compress, deflate, br\r\n' +
        'Host: bff-ext.clients.peacocktv.com\r\n' +
        'Connection: close\r\n' +
        '\r\n',
      _keepAliveTimeout: 0,
      _onPendingData: [Function: nop],
      agent: [Agent],
      socketPath: undefined,
      method: 'GET',
      maxHeaderSize: undefined,
      insecureHTTPParser: undefined,
      joinDuplicateHeaders: undefined,
      path: '/bff/channel_guide?startTime=2024-10-16T18:50+00:00&assetsPerChannelCapLimit=1000&contentSegments=D2C,Free',
      _ended: true,
      res: [IncomingMessage],
      aborted: false,
      timeoutCb: null,
      upgradeOrConnect: false,
      parser: null,
      maxHeadersCount: null,
      reusedSocket: false,
      host: 'bff-ext.clients.peacocktv.com',
      protocol: 'https:',
      _redirectable: [Writable],
      [Symbol(kCapture)]: false,
      [Symbol(kBytesWritten)]: 0,
      [Symbol(kNeedDrain)]: false,
      [Symbol(corked)]: 0,
      [Symbol(kOutHeaders)]: [Object: null prototype],
      [Symbol(errored)]: null,
      [Symbol(kHighWaterMark)]: 16384,
      [Symbol(kRejectNonStandardBodyWrites)]: false,
      [Symbol(kUniqueHeaders)]: null
    },
    data: {
      errorCode: 400,
      developerMessage: 'Invalid startTime param. Not a valid ISO8601 datetime'
    }
  }
}
TypeError: Cannot read properties of undefined (reading 'channels')
    at PeacockHandler.<anonymous> (/app/services/peacock-handler.ts:143:34)
    at Generator.next (<anonymous>)
    at fulfilled (/app/services/peacock-handler.ts:5:58)
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
Looking for ABC events...
Error getting ABC channels
AxiosError: Request failed with status code 404
    at settle (/app/node_modules/axios/lib/core/settle.js:19:12)
    at IncomingMessage.handleStreamEnd (/app/node_modules/axios/lib/adapters/http.js:512:11)
    at IncomingMessage.emit (node:events:529:35)
    at IncomingMessage.emit (node:domain:489:12)
    at endReadableNT (node:internal/streams/readable:1400:12)
    at processTicksAndRejections (node:internal/process/task_queues:82:21) {
  code: 'ERR_BAD_REQUEST',
  config: {
    transitional: {
      silentJSONParsing: true,
      forcedJSONParsing: true,
      clarifyTimeoutError: false
    },
    adapter: [ 'xhr', 'http' ],
    transformRequest: [ [Function: transformRequest] ],
    transformResponse: [ [Function: transformResponse] ],
    timeout: 0,
    xsrfCookieName: 'XSRF-TOKEN',
    xsrfHeaderName: 'X-XSRF-TOKEN',
    maxContentLength: -1,
    maxBodyLength: -1,
    env: { FormData: [Function], Blob: [class Blob] },
    validateStatus: [Function: validateStatus],
    headers: AxiosHeaders {
      Accept: 'application/json, text/plain, */*',
      'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:106.0) Gecko/20100101 Firefox/106.0',
      'Accept-Encoding': 'gzip, compress, deflate, br'
    },
    method: 'get',
    url: 'https://prod.gatekeeper.us-abc.symphony.edgedatg.com/api/ws/pluto/v1/module/categoryguide/4204541?brand=001&device=001&authlevel=0&layout=3897245&starttime=20241016-1810&endtime=20241018&offset=+0000&affiliate=WFTV&urlObfuscation=true',
    data: undefined
  },
  request: <ref *1> ClientRequest {
    _events: [Object: null prototype] {
      abort: [Function (anonymous)],
      aborted: [Function (anonymous)],
      connect: [Function (anonymous)],
      error: [Function (anonymous)],
      socket: [Function (anonymous)],
      timeout: [Function (anonymous)],
      finish: [Function: requestOnFinish]
    },
    _eventsCount: 7,
    _maxListeners: undefined,
    outputData: [],
    outputSize: 0,
    writable: true,
    destroyed: false,
    _last: true,
    chunkedEncoding: false,
    shouldKeepAlive: false,
    maxRequestsOnConnectionReached: false,
    _defaultKeepAlive: true,
    useChunkedEncodingByDefault: false,
    sendDate: false,
    _removedConnection: false,
    _removedContLen: false,
    _removedTE: false,
    strictContentLength: false,
    _contentLength: 0,
    _hasBody: true,
    _trailer: '',
    finished: true,
    _headerSent: true,
    _closed: false,
    socket: TLSSocket {
      _tlsOptions: [Object],
      _secureEstablished: true,
      _securePending: false,
      _newSessionPending: false,
      _controlReleased: true,
      secureConnecting: false,
      _SNICallback: null,
      servername: 'prod.gatekeeper.us-abc.symphony.edgedatg.com',
      alpnProtocol: false,
      authorized: true,
      authorizationError: null,
      encrypted: true,
      _events: [Object: null prototype],
      _eventsCount: 10,
      connecting: false,
      _hadError: false,
      _parent: null,
      _host: 'prod.gatekeeper.us-abc.symphony.edgedatg.com',
      _closeAfterHandlingError: false,
      _readableState: [ReadableState],
      _maxListeners: undefined,
      _writableState: [WritableState],
      allowHalfOpen: false,
      _sockname: null,
      _pendingData: null,
      _pendingEncoding: '',
      server: undefined,
      _server: null,
      ssl: [TLSWrap],
      _requestCert: true,
      _rejectUnauthorized: true,
      parser: null,
      _httpMessage: [Circular *1],
      [Symbol(alpncallback)]: null,
      [Symbol(res)]: [TLSWrap],
      [Symbol(verified)]: true,
      [Symbol(pendingSession)]: null,
      [Symbol(async_id_symbol)]: 992,
      [Symbol(kHandle)]: [TLSWrap],
      [Symbol(lastWriteQueueSize)]: 0,
      [Symbol(timeout)]: null,
      [Symbol(kBuffer)]: null,
      [Symbol(kBufferCb)]: null,
      [Symbol(kBufferGen)]: null,
      [Symbol(kCapture)]: false,
      [Symbol(kSetNoDelay)]: false,
      [Symbol(kSetKeepAlive)]: true,
      [Symbol(kSetKeepAliveInitialDelay)]: 60,
      [Symbol(kBytesRead)]: 0,
      [Symbol(kBytesWritten)]: 0,
      [Symbol(connect-options)]: [Object]
    },
    _header: 'GET /api/ws/pluto/v1/module/categoryguide/4204541?brand=001&device=001&authlevel=0&layout=3897245&starttime=20241016-1810&endtime=20241018&offset=+0000&affiliate=WFTV&urlObfuscation=true HTTP/1.1\r\n' +
      'Accept: application/json, text/plain, */*\r\n' +
      'user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:106.0) Gecko/20100101 Firefox/106.0\r\n' +
      'Accept-Encoding: gzip, compress, deflate, br\r\n' +
      'Host: prod.gatekeeper.us-abc.symphony.edgedatg.com\r\n' +
      'Connection: close\r\n' +
      '\r\n',
    _keepAliveTimeout: 0,
    _onPendingData: [Function: nop],
    agent: Agent {
      _events: [Object: null prototype],
      _eventsCount: 2,
      _maxListeners: undefined,
      defaultPort: 443,
      protocol: 'https:',
      options: [Object: null prototype],
      requests: [Object: null prototype] {},
      sockets: [Object: null prototype],
      freeSockets: [Object: null prototype] {},
      keepAliveMsecs: 1000,
      keepAlive: false,
      maxSockets: Infinity,
      maxFreeSockets: 256,
      scheduling: 'lifo',
      maxTotalSockets: Infinity,
      totalSocketCount: 1,
      maxCachedSessions: 100,
      _sessionCache: [Object],
      [Symbol(kCapture)]: false
    },
    socketPath: undefined,
    method: 'GET',
    maxHeaderSize: undefined,
    insecureHTTPParser: undefined,
    joinDuplicateHeaders: undefined,
    path: '/api/ws/pluto/v1/module/categoryguide/4204541?brand=001&device=001&authlevel=0&layout=3897245&starttime=20241016-1810&endtime=20241018&offset=+0000&affiliate=WFTV&urlObfuscation=true',
    _ended: true,
    res: IncomingMessage {
      _readableState: [ReadableState],
      _events: [Object: null prototype],
      _eventsCount: 4,
      _maxListeners: undefined,
      socket: [TLSSocket],
      httpVersionMajor: 1,
      httpVersionMinor: 1,
      httpVersion: '1.1',
      complete: true,
      rawHeaders: [Array],
      rawTrailers: [],
      joinDuplicateHeaders: undefined,
      aborted: false,
      upgrade: false,
      url: '',
      method: null,
      statusCode: 404,
      statusMessage: 'Not Found',
      client: [TLSSocket],
      _consuming: true,
      _dumped: false,
      req: [Circular *1],
      responseUrl: 'https://prod.gatekeeper.us-abc.symphony.edgedatg.com/api/ws/pluto/v1/module/categoryguide/4204541?brand=001&device=001&authlevel=0&layout=3897245&starttime=20241016-1810&endtime=20241018&offset=+0000&affiliate=WFTV&urlObfuscation=true',
      redirects: [],
      [Symbol(kCapture)]: false,
      [Symbol(kHeaders)]: [Object],
      [Symbol(kHeadersCount)]: 24,
      [Symbol(kTrailers)]: null,
      [Symbol(kTrailersCount)]: 0
    },
    aborted: false,
    timeoutCb: null,
    upgradeOrConnect: false,
    parser: null,
    maxHeadersCount: null,
    reusedSocket: false,
    host: 'prod.gatekeeper.us-abc.symphony.edgedatg.com',
    protocol: 'https:',
    _redirectable: Writable {
      _writableState: [WritableState],
      _events: [Object: null prototype],
      _eventsCount: 3,
      _maxListeners: undefined,
      _options: [Object],
      _ended: true,
      _ending: true,
      _redirectCount: 0,
      _redirects: [],
      _requestBodyLength: 0,
      _requestBodyBuffers: [],
      _onNativeResponse: [Function (anonymous)],
      _currentRequest: [Circular *1],
      _currentUrl: 'https://prod.gatekeeper.us-abc.symphony.edgedatg.com/api/ws/pluto/v1/module/categoryguide/4204541?brand=001&device=001&authlevel=0&layout=3897245&starttime=20241016-1810&endtime=20241018&offset=+0000&affiliate=WFTV&urlObfuscation=true',
      [Symbol(kCapture)]: false
    },
Could not parse ABC events
    [Symbol(kCapture)]: false,
    [Symbol(kBytesWritten)]: 0,
    [Symbol(kNeedDrain)]: false,
    [Symbol(corked)]: 0,
    [Symbol(kOutHeaders)]: [Object: null prototype] {
      accept: [Array],
      'user-agent': [Array],
      'accept-encoding': [Array],
      host: [Array]
    },
    [Symbol(errored)]: null,
    [Symbol(kHighWaterMark)]: 16384,
    [Symbol(kRejectNonStandardBodyWrites)]: false,
    [Symbol(kUniqueHeaders)]: null
  },
  response: {
    status: 404,
    statusText: 'Not Found',
=== Done getting events ===
    headers: AxiosHeaders {
      'content-type': 'application/vnd.disney.error.v1.0+json;charset=UTF-8',
      'transfer-encoding': 'chunked',
      connection: 'close',
      date: 'Wed, 16 Oct 2024 18:48:59 GMT',
      'cache-control': 'private, no-cache, no-store, no-transform, must-revalidate, proxy-revalidate, max-age=0, s-maxage=0',
      'access-control-expose-headers': 'Content-Length, X-DATG-Trace-Id',
      'x-datg-trace-id': 'qVYt5zvid_9_wcxjYRXXoJEwfL7S3w4IMZ9ijQSsr_hJXPKrQQbNgw==',
      vary: 'appversion,DATG-MVPD,Origin',
      'x-cache': 'Error from cloudfront',
      via: '1.1 e759cef9ef04dc6632a71818dfac3a76.cloudfront.net (CloudFront)',
      'x-amz-cf-pop': 'MIA3-P3',
      'x-amz-cf-id': 'qVYt5zvid_9_wcxjYRXXoJEwfL7S3w4IMZ9ijQSsr_hJXPKrQQbNgw=='
    },
    config: {
      transitional: [Object],
      adapter: [Array],
      transformRequest: [Array],
      transformResponse: [Array],
      timeout: 0,
      xsrfCookieName: 'XSRF-TOKEN',
      xsrfHeaderName: 'X-XSRF-TOKEN',
      maxContentLength: -1,
      maxBodyLength: -1,
      env: [Object],
      validateStatus: [Function: validateStatus],
      headers: [AxiosHeaders],
      method: 'get',
      url: 'https://prod.gatekeeper.us-abc.symphony.edgedatg.com/api/ws/pluto/v1/module/categoryguide/4204541?brand=001&device=001&authlevel=0&layout=3897245&starttime=20241016-1810&endtime=20241018&offset=+0000&affiliate=WFTV&urlObfuscation=true',
      data: undefined
    },
    request: <ref *1> ClientRequest {
      _events: [Object: null prototype],
      _eventsCount: 7,
      _maxListeners: undefined,
      outputData: [],
      outputSize: 0,
      writable: true,
      destroyed: false,
      _last: true,
      chunkedEncoding: false,
      shouldKeepAlive: false,
      maxRequestsOnConnectionReached: false,
      _defaultKeepAlive: true,
      useChunkedEncodingByDefault: false,
      sendDate: false,
      _removedConnection: false,
      _removedContLen: false,
      _removedTE: false,
      strictContentLength: false,
      _contentLength: 0,
      _hasBody: true,
      _trailer: '',
      finished: true,
      _headerSent: true,
      _closed: false,
      socket: [TLSSocket],
      _header: 'GET /api/ws/pluto/v1/module/categoryguide/4204541?brand=001&device=001&authlevel=0&layout=3897245&starttime=20241016-1810&endtime=20241018&offset=+0000&affiliate=WFTV&urlObfuscation=true HTTP/1.1\r\n' +
        'Accept: application/json, text/plain, */*\r\n' +
        'user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:106.0) Gecko/20100101 Firefox/106.0\r\n' +
        'Accept-Encoding: gzip, compress, deflate, br\r\n' +
        'Host: prod.gatekeeper.us-abc.symphony.edgedatg.com\r\n' +
        'Connection: close\r\n' +
        '\r\n',
      _keepAliveTimeout: 0,
      _onPendingData: [Function: nop],
      agent: [Agent],
      socketPath: undefined,
      method: 'GET',
      maxHeaderSize: undefined,
      insecureHTTPParser: undefined,
      joinDuplicateHeaders: undefined,
      path: '/api/ws/pluto/v1/module/categoryguide/4204541?brand=001&device=001&authlevel=0&layout=3897245&starttime=20241016-1810&endtime=20241018&offset=+0000&affiliate=WFTV&urlObfuscation=true',
      _ended: true,
      res: [IncomingMessage],
      aborted: false,
      timeoutCb: null,
      upgradeOrConnect: false,
      parser: null,
      maxHeadersCount: null,
      reusedSocket: false,
      host: 'prod.gatekeeper.us-abc.symphony.edgedatg.com',
      protocol: 'https:',
      _redirectable: [Writable],
      [Symbol(kCapture)]: false,
      [Symbol(kBytesWritten)]: 0,
      [Symbol(kNeedDrain)]: false,
      [Symbol(corked)]: 0,
      [Symbol(kOutHeaders)]: [Object: null prototype],
      [Symbol(errored)]: null,
      [Symbol(kHighWaterMark)]: 16384,
      [Symbol(kRejectNonStandardBodyWrites)]: false,
      [Symbol(kUniqueHeaders)]: null
    },
    data: { error: [Object] }
  }
}
TypeError: Cannot read properties of undefined (reading 'categories')
    at ABCHandler.<anonymous> (/app/services/abc-handler.ts:173:35)
    at Generator.next (<anonymous>)
    at fulfilled (/app/services/abc-handler.ts:5:58)
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
=== Building the schedule ===
=== Done building the schedule ===
=== Starting Server ===
Server started on port 8787

Same story with me, hopefully we can resolve it. He is a busy guy, but here's to hoping.

Maybe we are missing some dependencies or something.

1 Like

I'm wondering that too - I'm running it on my NAS, but it almost seems that it's looking for Chrome or some sort of way to log into ABC.com or Peacock.com?

I think if it used a similar structure EPlusTV for live events and login tokens it would be set. One thing at a time I think , or maybe there is another way.

1 Like

Honestly, that's what I was expecting to see! But I'm thinking this docker assumes it's running on the same machine that's running cc4c already (which I'm not running via docker since I have it on a dedicated M1 mac mini).

That may be it then. I haven't tried running both in docker since one I have a custom main.js file. Maybe we can get others to try.

I'd try it in Docker if I knew where I could put the main.js file... haha

For what it's worth, I did get CC4C up and running on my NAS since it has an i5 built in... and it works for some, but not all the channels. Anything Peacock throws and error and so does Paramount+ because the version of Chrome included in the CC4C docker is so old it those services don't support it... so now I'm extra perplexed why @m0ngr31's docker doesn't pull in Peacock or ABC channels ... was hoping it somehow scraped their feeds too without going through this ancient Chrome install (113). Is there a way to update Chrome in docker?

I can load peacock/cbs/paramount channels fine, but cant get the guide data that the docker provides.
There are new versions of puppeteer but the distro has mostly been abandoned after being coded by tmm1 (hence why I have updated the main.js file)

Do the abc channels load?

ESPN the ocho, freeform etc?

In docker, I can't get anything from Peacock or Paramount+ to load. They both load the websites properly, but give me errors when trying to playback saying it's basically not supported. I don't run into this error on my M1 installation. NBC plays well and allowed me to login just fine. I think it has to do with the Chrome version baked into the docker image (I assume it's baked in as it installed when I installed CC4C on my NAS in Docker).

That is inconvenient you had to run the cc4c to docker, but I will have to try it. try to run my js file from other thread. its called ncc062 I think.

The question is, will epg data continue to pull if you dont use the docker version of cc4c.

Just to be clear, installing cc4c on docker did not make @m0ngr31's container work for me.

OK it didnt scapre anything? Peacock works in my main.js file that was modified

The error you're seeing (AxiosError: Request failed with status code 400) means that the request is being rejected by the server, likely due to an issue with the request parameters or headers. A 400 error typically indicates a "Bad Request," meaning the server couldn't understand the request due to invalid syntax or missing information.

Here are some possible causes and steps to troubleshoot:

  1. Incorrect URL or Parameters:
  • Double-check that the URL being called (https://bff-ext.clients.peacocktv.com/bff/channel_guide?startTime=2024-10-16T23:00+00:00&assetsPerChannelCapLimit=1000&contentSegments=D2C,Free) is valid and properly formatted. Ensure the query parameters like startTime, assetsPerChannelCapLimit, and contentSegments are acceptable for the API.
  • Ensure that startTime uses the correct format and that there are no extra characters or invalid values in the parameters.
  1. Missing or Incorrect Headers:
  • The headers in the request seem fine, but you might want to verify with the API documentation whether the X-SkyOTT-* headers and user-agent are required or correct. It's possible the API needs more headers or different ones.
  • Ensure that Authorization headers or any other required headers for authentication (if applicable) are included if needed by the API.
  1. Check API Documentation:
  • The error could be due to missing or invalid parameters or headers that the server expects. Double-check the API documentation to ensure you're sending the correct request.
  1. Validate the API Request:
  • Sometimes, the request's body might be malformed or the expected request method might not be GET. Ensure that the method (GET) is appropriate for the endpoint.
  1. Test the Request:
  • Try testing the API call in an API client like Postman or curl to see if the request is working. This can help isolate whether the issue is in the request itself or in your code.
  1. Debugging Axios Call:
  • Add a catch block and print out the response.data or error.response.data to see if the server is sending more details about why the request failed.

according to ai answer lol if that helps.

Okay, this is my bad because I never tested running it in the actual container :man_facepalming: New container is up now and should work

2 Likes

I'll look at getting this updated

1 Like

That would be incredible!! Thank you! I just updated the container and the log shows a successful run (and that it gathered channels), but when I look at the 8787 page... it's not listing any channels:

What do your logs say? Maybe try doing a hard refresh on that page?