ESPN+ & FOX Sports with Custom Channels via EPlusTV

I'm told that Chicago Sports Network has DRM so that's not currently an option for EPlusTV.

I'm not sure about the others, but if you can loan credentials, I can take a look.

Sure thing I just dm you

Getting issues with the chunklist. Can we fix it

I see others asked about it too. The consistent m3u8 from foxone works fine, it doesnt need to refresh token so often it just needs the right m3u8, fa.edge versus cf.edge

Also are we thinking the other ESPN Channels will be gone by the EOY?

Constant key checking is set at where it is because of key errors that we were getting. It primarily caused issues with the 4k streams.

Right but its not necessary with fox linear. those channels dont need tokens/keys they work as-is. there is not baton-handoff.

1 Like

Yes I was able to get my local fox and others thanks to the link you posted a while back.... Thank you

Fox and FS1 automatically switch to 4k when a feed is detected for the FoxOne source, so it is necessary for at least those two linear channels.

1 Like

I plan on making my own espn package that always works and merges channels together and has a video that plays before a new event starts, that way it never error messages .

Can yall take a look at this python code? You need selenium, chrome driver and change folders.

It works decent and serves the m3u8 here:

http://localhost:8000/wsfa.m3u8

Can we make it better using hlsproxy? It does the baton handoff and everything, but it has to constantly pull files in

pip install selenium

3rd Sunday I am unable to stream NFL Red Zone. Here is the log from today. Any help is appreciated.
Thank you.

Channel #331 has an active event (NFL RedZone). Going to start the stream.
AxiosError: Request failed with status code 403
Could not start playback
    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: 60000,
    xsrfCookieName: 'XSRF-TOKEN',
    xsrfHeaderName: 'X-XSRF-TOKEN',
    maxContentLength: -1,
    maxBodyLength: -1,
    env: { FormData: [Function [FormData]], Blob: [class Blob] },
    validateStatus: [Function: validateStatus],
    headers: AxiosHeaders {
      Accept: 'application/json, text/plain, */*',
      'Content-Type': 'application/json',
      'User-Agent': 'okhttp/4.11.0',
      authorization: 'Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJjbGllbnRJZCI6IjM2NTY3MmQwLTgzYjgtNDZlYy04ZWUwLTZlMTU0M2JjM2RlOSIsImNsaWVudEtleSI6IkEzYjc0d09pU0RNcmhKS2VYQUVJcWdSSUNCaUJObzdvIiwiZGV2aWNlSWQiOiI4OTBiN2Q5Ny0xODEzLTQyZmYtOGVhNi1lOTFlNTYwYzYwZjgiLCJpc3MiOiJORkwiLCJwbGFucyI6W3sicGxhbiI6ImZyZWUiLCJleHBpcmF0aW9uRGF0ZSI6IjIwMjYtMTEtMjQiLCJzb3VyY2UiOiJORkwiLCJzdGFydERhdGUiOiIyMDI1LTExLTIzIiwic3RhdHVzIjoiQUNUSVZFIiwidHJpYWwiOmZhbHNlfV0sIkRpc3BsYXlOYW1lIjoiQ1RWX0FORFJPSURfQ1RWIiwiTm90ZXMiOiIiLCJmb3JtRmFjdG9yIjoiQ1RWIiwibHVyYUFwcEtleSI6IlNaczU3ZEJHUnhiTDcyOGxWcDdEWVEiLCJwbGF0Zm9ybSI6IkFORFJPSUQiLCJwcm9kdWN0TmFtZSI6IkNUViIsInJvbGVzIjpbImNvbnRlbnQiLCJleHBlcmllbmNlIiwiZm9vdGJhbGwiLCJ1dGlsaXRpZXMiLCJ0ZWFtcyIsInBsYXkiLCJsaXZlIiwiaWRlbnRpdHkiLCJuZ3Nfc3RhdHMiLCJwYXltZW50c19hcGkiLCJuZ3NfdHJhY2tpbmciLCJuZ3NfcGxhdGZvcm0iLCJuZ3NfY29udGVudCIsIm5nc19jb21iaW5lIiwibmdzX2FkdmFuY2VkX3N0YXRzIiwibmZsX3BybyIsImVjb21tIiwibmZsX2lkX2FwaSIsInV0aWxpdGllc19sb2NhdGlvbiIsImlkZW50aXR5X29pZGMiLCJuZ3Nfc3NlIiwiYWNjb3VudHMiLCJjb25zZW50cyIsInN1Yl9wYXJ0bmVyc2hpcHMiLCJjb25jdXJyZW5jeSIsImtleXN0b3JlIiwiaWRfc2VydmVyX3RvX3NlcnZlciIsImZyZWUiXSwibmV0d29ya1R5cGUiOiJ3aWZpIiwiY2l0eSI6InNhbnRhIGJhcmJhcmEiLCJjb3VudHJ5Q29kZSI6IlVTIiwiZG1hQ29kZSI6Ijg1NSIsImhtYVRlYW1zIjpbIjEwNDAyNTEwLTg5MzEtMGQ1Zi05ODE1LTc5YmI3OTY0OWE2NSJdLCJyZWdpb24iOiJDQSIsInppcENvZGUiOiI5MzEwNSIsImJyb3dzZXIiOiJPdGhlciIsImNlbGx1bGFyIjpmYWxzZSwiZW52aXJvbm1lbnQiOiJwcm9kdWN0aW9uIiwidWlkIjoiYWZmNDNkMTJhMWFiYWJiZTZhNDcyNGRmYWJkMjY3NTciLCJuZXR3b3JrcyI6eyJFU1BOIjoiRVNQTiIsIk5GTFJaIjoiTkZMUloiLCJORkxTVCI6Ik5GTFNUIn0sImV4cCI6MTc2MzkzNjAxMX0.6cLVnt7SUpY7Jvlg1v5IjusoS5Vn51TTW-ldt5CLvC0',
      'Content-Length': '2',
      'Accept-Encoding': 'gzip, compress, deflate, br'
    },
    method: 'post',
    url: 'https://api.nfl.com/play/v1/asset/2F1pS5QLzItG3YnwmRf0kw',
    data: '{}'
  },
  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: true,
    sendDate: false,
    _removedConnection: false,
    _removedContLen: false,
    _removedTE: false,
    strictContentLength: false,
    _contentLength: '2',
    _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: 'api.nfl.com',
      alpnProtocol: false,
      authorized: true,
      authorizationError: null,
      encrypted: true,
      _events: [Object: null prototype],
      _eventsCount: 10,
      connecting: false,
      _hadError: false,
      _parent: null,
      _host: 'api.nfl.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],
      timeout: 60000,
      [Symbol(alpncallback)]: null,
      [Symbol(res)]: [TLSWrap],
      [Symbol(verified)]: true,
      [Symbol(pendingSession)]: null,
      [Symbol(async_id_symbol)]: 50356,
      [Symbol(kHandle)]: [TLSWrap],
      [Symbol(lastWriteQueueSize)]: 0,
      [Symbol(timeout)]: Timeout {
        _idleTimeout: 60000,
        _idlePrev: [TimersList],
        _idleNext: [Timeout],
        _idleStart: 185201060,
        _onTimeout: [Function: bound ],
        _timerArgs: undefined,
        _repeat: null,
        _destroyed: false,
        [Symbol(refed)]: false,
        [Symbol(kHasPrimitive)]: false,
        [Symbol(asyncId)]: 50364,
        [Symbol(triggerId)]: 50359
      },
      [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: 'POST /play/v1/asset/2F1pS5QLzItG3YnwmRf0kw HTTP/1.1\r\n' +
      'Accept: application/json, text/plain, */*\r\n' +
      'Content-Type: application/json\r\n' +
      'User-Agent: okhttp/4.11.0\r\n' +
      'authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJjbGllbnRJZCI6IjM2NTY3MmQwLTgzYjgtNDZlYy04ZWUwLTZlMTU0M2JjM2RlOSIsImNsaWVudEtleSI6IkEzYjc0d09pU0RNcmhKS2VYQUVJcWdSSUNCaUJObzdvIiwiZGV2aWNlSWQiOiI4OTBiN2Q5Ny0xODEzLTQyZmYtOGVhNi1lOTFlNTYwYzYwZjgiLCJpc3MiOiJORkwiLCJwbGFucyI6W3sicGxhbiI6ImZyZWUiLCJleHBpcmF0aW9uRGF0ZSI6IjIwMjYtMTEtMjQiLCJzb3VyY2UiOiJORkwiLCJzdGFydERhdGUiOiIyMDI1LTExLTIzIiwic3RhdHVzIjoiQUNUSVZFIiwidHJpYWwiOmZhbHNlfV0sIkRpc3BsYXlOYW1lIjoiQ1RWX0FORFJPSURfQ1RWIiwiTm90ZXMiOiIiLCJmb3JtRmFjdG9yIjoiQ1RWIiwibHVyYUFwcEtleSI6IlNaczU3ZEJHUnhiTDcyOGxWcDdEWVEiLCJwbGF0Zm9ybSI6IkFORFJPSUQiLCJwcm9kdWN0TmFtZSI6IkNUViIsInJvbGVzIjpbImNvbnRlbnQiLCJleHBlcmllbmNlIiwiZm9vdGJhbGwiLCJ1dGlsaXRpZXMiLCJ0ZWFtcyIsInBsYXkiLCJsaXZlIiwiaWRlbnRpdHkiLCJuZ3Nfc3RhdHMiLCJwYXltZW50c19hcGkiLCJuZ3NfdHJhY2tpbmciLCJuZ3NfcGxhdGZvcm0iLCJuZ3NfY29udGVudCIsIm5nc19jb21iaW5lIiwibmdzX2FkdmFuY2VkX3N0YXRzIiwibmZsX3BybyIsImVjb21tIiwibmZsX2lkX2FwaSIsInV0aWxpdGllc19sb2NhdGlvbiIsImlkZW50aXR5X29pZGMiLCJuZ3Nfc3NlIiwiYWNjb3VudHMiLCJjb25zZW50cyIsInN1Yl9wYXJ0bmVyc2hpcHMiLCJjb25jdXJyZW5jeSIsImtleXN0b3JlIiwiaWRfc2VydmVyX3RvX3NlcnZlciIsImZyZWUiXSwibmV0d29ya1R5cGUiOiJ3aWZpIiwiY2l0eSI6InNhbnRhIGJhcmJhcmEiLCJjb3VudHJ5Q29kZSI6IlVTIiwiZG1hQ29kZSI6Ijg1NSIsImhtYVRlYW1zIjpbIjEwNDAyNTEwLTg5MzEtMGQ1Zi05ODE1LTc5YmI3OTY0OWE2NSJdLCJyZWdpb24iOiJDQSIsInppcENvZGUiOiI5MzEwNSIsImJyb3dzZXIiOiJPdGhlciIsImNlbGx1bGFyIjpmYWxzZSwiZW52aXJvbm1lbnQiOiJwcm9kdWN0aW9uIiwidWlkIjoiYWZmNDNkMTJhMWFiYWJiZTZhNDcyNGRmYWJkMjY3NTciLCJuZXR3b3JrcyI6eyJFU1BOIjoiRVNQTiIsIk5GTFJaIjoiTkZMUloiLCJORkxTVCI6Ik5GTFNUIn0sImV4cCI6MTc2MzkzNjAxMX0.6cLVnt7SUpY7Jvlg1v5IjusoS5Vn51TTW-ldt5CLvC0\r\n' +
      'Content-Length: 2\r\n' +
      'Accept-Encoding: gzip, compress, deflate, br\r\n' +
      'Host: api.nfl.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,
Failed to parse the stream
    method: 'POST',
    maxHeaderSize: undefined,
    insecureHTTPParser: undefined,
    joinDuplicateHeaders: undefined,
    path: '/play/v1/asset/2F1pS5QLzItG3YnwmRf0kw',
    _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: 403,
      statusMessage: 'Forbidden',
      client: [TLSSocket],
      _consuming: true,
      _dumped: false,
      req: [Circular *1],
      responseUrl: 'https://api.nfl.com/play/v1/asset/2F1pS5QLzItG3YnwmRf0kw',
      redirects: [],
      [Symbol(kCapture)]: false,
      [Symbol(kHeaders)]: [Object],
      [Symbol(kHeadersCount)]: 30,
      [Symbol(kTrailers)]: null,
      [Symbol(kTrailersCount)]: 0
    },
    aborted: false,
    timeoutCb: null,
    upgradeOrConnect: false,
    parser: null,
    maxHeadersCount: null,
    reusedSocket: false,
    host: 'api.nfl.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: 2,
      _requestBodyBuffers: [],
      _onNativeResponse: [Function (anonymous)],
      _currentRequest: [Circular *1],
      _currentUrl: 'https://api.nfl.com/play/v1/asset/2F1pS5QLzItG3YnwmRf0kw',
      _timeout: null,
      [Symbol(kCapture)]: false
    },
Could not get a playlist for channel #331. Please make sure there is an event scheduled and you have access to it.
    [Symbol(kCapture)]: false,
    [Symbol(kBytesWritten)]: 0,
    [Symbol(kNeedDrain)]: false,
    [Symbol(corked)]: 0,
    [Symbol(kOutHeaders)]: [Object: null prototype] {
      accept: [Array],
      'content-type': [Array],
      'user-agent': [Array],
      authorization: [Array],
      'content-length': [Array],
      'accept-encoding': [Array],
      host: [Array]
    },
    [Symbol(errored)]: null,
    [Symbol(kHighWaterMark)]: 16384,
    [Symbol(kRejectNonStandardBodyWrites)]: false,
    [Symbol(kUniqueHeaders)]: null
  },
  response: {
    status: 403,
    statusText: 'Forbidden',
    headers: AxiosHeaders {
      connection: 'close',
      'content-length': '582',
      server: 'be-play-token',
      via: '1.1 varnish, 1.1 varnish, 1.1 varnish',
      'cache-control': 'private',
      'accept-ranges': 'bytes',
      'content-type': 'application/json',
      date: 'Sun, 23 Nov 2025 21:13:32 GMT',
      'x-served-by': 'cache-bur-kbur8200084-BUR, cache-bur-kbur8200084-BUR, cache-bur-kbur8200034-BUR',
      'x-cache': 'MISS, MISS, MISS',
      'x-cache-hits': '0, 0, 0',
      'x-timer': 'S1763932412.089380,VS0,VE392',
      'access-control-allow-origin': '*',
      'access-control-allow-methods': 'PUT,POST,OPTIONS,GET,PATCH,DELETE',
      'access-control-allow-headers': 'Authorization,Content-Type,Cache-Control,nfl_session,Last-Event-Id,x-domain-id,sentry-trace,baggage'
    },
    config: {
      transitional: [Object],
      adapter: [Array],
      transformRequest: [Array],
      transformResponse: [Array],
      timeout: 60000,
      xsrfCookieName: 'XSRF-TOKEN',
      xsrfHeaderName: 'X-XSRF-TOKEN',
      maxContentLength: -1,
      maxBodyLength: -1,
      env: [Object],
      validateStatus: [Function: validateStatus],
      headers: [AxiosHeaders],
      method: 'post',
      url: 'https://api.nfl.com/play/v1/asset/2F1pS5QLzItG3YnwmRf0kw',
      data: '{}'
    },
    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: true,
      sendDate: false,
      _removedConnection: false,
      _removedContLen: false,
      _removedTE: false,
      strictContentLength: false,
      _contentLength: '2',
      _hasBody: true,
      _trailer: '',
      finished: true,
      _headerSent: true,
      _closed: false,
      socket: [TLSSocket],
      _header: 'POST /play/v1/asset/2F1pS5QLzItG3YnwmRf0kw HTTP/1.1\r\n' +
        'Accept: application/json, text/plain, */*\r\n' +
        'Content-Type: application/json\r\n' +
        'User-Agent: okhttp/4.11.0\r\n' +
        'authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJjbGllbnRJZCI6IjM2NTY3MmQwLTgzYjgtNDZlYy04ZWUwLTZlMTU0M2JjM2RlOSIsImNsaWVudEtleSI6IkEzYjc0d09pU0RNcmhKS2VYQUVJcWdSSUNCaUJObzdvIiwiZGV2aWNlSWQiOiI4OTBiN2Q5Ny0xODEzLTQyZmYtOGVhNi1lOTFlNTYwYzYwZjgiLCJpc3MiOiJORkwiLCJwbGFucyI6W3sicGxhbiI6ImZyZWUiLCJleHBpcmF0aW9uRGF0ZSI6IjIwMjYtMTEtMjQiLCJzb3VyY2UiOiJORkwiLCJzdGFydERhdGUiOiIyMDI1LTExLTIzIiwic3RhdHVzIjoiQUNUSVZFIiwidHJpYWwiOmZhbHNlfV0sIkRpc3BsYXlOYW1lIjoiQ1RWX0FORFJPSURfQ1RWIiwiTm90ZXMiOiIiLCJmb3JtRmFjdG9yIjoiQ1RWIiwibHVyYUFwcEtleSI6IlNaczU3ZEJHUnhiTDcyOGxWcDdEWVEiLCJwbGF0Zm9ybSI6IkFORFJPSUQiLCJwcm9kdWN0TmFtZSI6IkNUViIsInJvbGVzIjpbImNvbnRlbnQiLCJleHBlcmllbmNlIiwiZm9vdGJhbGwiLCJ1dGlsaXRpZXMiLCJ0ZWFtcyIsInBsYXkiLCJsaXZlIiwiaWRlbnRpdHkiLCJuZ3Nfc3RhdHMiLCJwYXltZW50c19hcGkiLCJuZ3NfdHJhY2tpbmciLCJuZ3NfcGxhdGZvcm0iLCJuZ3NfY29udGVudCIsIm5nc19jb21iaW5lIiwibmdzX2FkdmFuY2VkX3N0YXRzIiwibmZsX3BybyIsImVjb21tIiwibmZsX2lkX2FwaSIsInV0aWxpdGllc19sb2NhdGlvbiIsImlkZW50aXR5X29pZGMiLCJuZ3Nfc3NlIiwiYWNjb3VudHMiLCJjb25zZW50cyIsInN1Yl9wYXJ0bmVyc2hpcHMiLCJjb25jdXJyZW5jeSIsImtleXN0b3JlIiwiaWRfc2VydmVyX3RvX3NlcnZlciIsImZyZWUiXSwibmV0d29ya1R5cGUiOiJ3aWZpIiwiY2l0eSI6InNhbnRhIGJhcmJhcmEiLCJjb3VudHJ5Q29kZSI6IlVTIiwiZG1hQ29kZSI6Ijg1NSIsImhtYVRlYW1zIjpbIjEwNDAyNTEwLTg5MzEtMGQ1Zi05ODE1LTc5YmI3OTY0OWE2NSJdLCJyZWdpb24iOiJDQSIsInppcENvZGUiOiI5MzEwNSIsImJyb3dzZXIiOiJPdGhlciIsImNlbGx1bGFyIjpmYWxzZSwiZW52aXJvbm1lbnQiOiJwcm9kdWN0aW9uIiwidWlkIjoiYWZmNDNkMTJhMWFiYWJiZTZhNDcyNGRmYWJkMjY3NTciLCJuZXR3b3JrcyI6eyJFU1BOIjoiRVNQTiIsIk5GTFJaIjoiTkZMUloiLCJORkxTVCI6Ik5GTFNUIn0sImV4cCI6MTc2MzkzNjAxMX0.6cLVnt7SUpY7Jvlg1v5IjusoS5Vn51TTW-ldt5CLvC0\r\n' +
        'Content-Length: 2\r\n' +
        'Accept-Encoding: gzip, compress, deflate, br\r\n' +
        'Host: api.nfl.com\r\n' +
        'Connection: close\r\n' +
        '\r\n',
      _keepAliveTimeout: 0,
      _onPendingData: [Function: nop],
      agent: [Agent],
      socketPath: undefined,
      method: 'POST',
      maxHeaderSize: undefined,
      insecureHTTPParser: undefined,
      joinDuplicateHeaders: undefined,
      path: '/play/v1/asset/2F1pS5QLzItG3YnwmRf0kw',
      _ended: true,
      res: [IncomingMessage],
      aborted: false,
      timeoutCb: null,
      upgradeOrConnect: false,
      parser: null,
      maxHeadersCount: null,
      reusedSocket: false,
      host: 'api.nfl.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: {
      authSource: [Object],
      errorCode: 403,
      errorReason: 'Forbidden',
      id: '6a5e705e-677b-4ab2-9768-6abe3e6eb3e4',
      message: 'Error in asset request'
    }
  }
}

I still cannot connect to ESPN channels. The listings are showing up in the guide properly, according to my search criteria.

I wonder if the problem is that I have the Unlimited ESPN account - which connects via MyDisney? I do not see that as a Provider option yet.

I noticed the 503 error I get cites port 8089. But the source link is port 8185 (GET: myipaddress:8089/....) Is that normal?

ESPN Unlimited is DRM-only and cannot be supported here. Currently the only ESPN support is for linear channels when authenticating with a supported TV provider.

It may eventually be possible to launch those DRM channels/events in the ESPN app from the EPlusTV guide data, but not yet. That would be live only, no recording.

I'm not currently subscribed.

Can anyone else here confirm whether Red Zone has worked recently through EPlusTV? Also note whether you subscribe to Sunday Ticket or just NFL+ Premium.

Is it not possible to get the linear espn channels that are available with cable providers login with espn unlimited credentials?

Not that I'm aware of. And I suspect those linear channels may go away too, as they continue to migrate streams to the new DRM service/platform.

It is possible. I did some proof of concept testing with ESPN Unlimited login for linear channels using the current ESPN+ login flow and it worked, but there have to be changes to an either/or type of login for the linear channels otherwise you would have duplicate linear channels in channels.ts

Granted I did this before they were locking down more channels with DRM. I was testing when digital networks were still available without DRM.

1 Like

If you can share any notes, I'd be happy to try it again. Feel free to PM me.

Tony- not sure how successful I'll be, but I've made a lightweight Android proxy app for Deeplinks. The app will act as a bridge between Channels DVR and ESPN's mobile app on Android devices (or whatever Deeplinkable app you want).

Using ESPN4CC4C output as example, when you select an ESPN live event in Channels DVR, Channels DVR opens a deeplinkproxy:// URL, which this app intercepts. The app then contacts the ESPN4CC4C server to retrieve the actual ESPN deeplink, and automatically launches the ESPN app to start playing the live stream (calls the Sportscenter:// url) - creating a seamless "click and watch" experience without manually switching between apps.

I've got a pretty basic framework kinda working (70% of the time it works everytime), but extremley alpha version at this point. Not sure how many people would ever use something like this. Essentially, the redirect idea you had. Would be much better native inside CDVR.

That's an interesting approach too. But let me ping the devs again if we can try to implement it via a HTTP redirect, to avoid any external dependencies.

2 Likes

Can anyone else here confirm whether Red Zone has worked recently through EPlusTV? Also note whether you subscribe to Sunday Ticket or just NFL+ Premium.

I watched Red Zone through EPlusTV the last two Sundays using an NFL+ Premium subscription.

“I watched Red Zone through EPlusTV the last two Sundays using an NFL+ Premium subscription.”

+1