ESPN+ & FOX Sports with Custom Channels via EPlusTV

I don't have access either, but presumably this is the SNY feed:
https://www.mlb.com/tv/sny
From
image

I fixed my issue in case this comes up for anyone else.

I have an ESPN+ subscription, but technically not ESPN (no cable subscription). But with xfinity being my internet provider, I was able to authenticate the ESPN channels even without a cable subscription. I started to suspect that was the issue. So I removed and did a fresh install of eplus via portainer in docker, didn't authenticate ESPN (only ESPN+), and it appears that's fixed the problem. My current stream has been going for 30 minutes strong. Until this point, the longest I could get a stream before it would break was 5-6 minutes tops.

Pigs get fat, hogs get slaughtered.

That would make sense. The ESPN site will give you a free view for a few minutes before it cuts off.

Hey all, I'm having an issue getting NESN to authenticate, and hoping I could get some assistance.

When I check the NESN checkbox in the E+TV Configuration, nothing appears to happen, but I do see the following in the container logs:

> eplustv@4.8.1 start
> ts-node -r tsconfig-paths/register index.tsx
=== E+TV v4.8.1 starting ===
Server started on port 9000
=== Getting events ===
=== Done getting events ===
=== Building the schedule ===
=== Done building the schedule ===
AxiosError: Request failed with status code 403
    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 {
Could not start the authentication process for Fox Sports!
      Accept: 'application/json, text/plain, */*',
      'Content-Type': 'application/json',
      'User-Agent': 'okhttp/4.11.0',
      authorization: 'sk_Np1qvyUgFaGj5Y4c',
      'Content-Length': '133',
      'Accept-Encoding': 'gzip, compress, deflate, br'
    },
    method: 'post',
    url: 'https://api.short.io/links',
    data: '{"domain":"tv.nesn.com","expiredURL":"https://support.nesn.com","originalURL":"https://nesn.com/watch/authenticate/Q2B3OUB/5a75d2da"}'
  },
  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: '133',
    _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.short.io',
      alpnProtocol: false,
      authorized: true,
      authorizationError: null,
      encrypted: true,
      _events: [Object: null prototype],
      _eventsCount: 10,
      connecting: false,
      _hadError: false,
      _parent: null,
      _host: 'api.short.io',
      _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)]: 1494,
      [Symbol(kHandle)]: [TLSWrap],
      [Symbol(lastWriteQueueSize)]: 0,
      [Symbol(timeout)]: Timeout {
        _idleTimeout: 60000,
        _idlePrev: [TimersList],
        _idleNext: [Timeout],
        _idleStart: 35537,
        _onTimeout: [Function: bound ],
        _timerArgs: undefined,
        _repeat: null,
        _destroyed: false,
        [Symbol(refed)]: false,
        [Symbol(kHasPrimitive)]: false,
        [Symbol(asyncId)]: 1502,
        [Symbol(triggerId)]: 1497
      },
      [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 /links 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: sk_Np1qvyUgFaGj5Y4c\r\n' +
      'Content-Length: 133\r\n' +
      'Accept-Encoding: gzip, compress, deflate, br\r\n' +
      'Host: api.short.io\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: 'POST',
    maxHeaderSize: undefined,
    insecureHTTPParser: undefined,
    joinDuplicateHeaders: undefined,
    path: '/links',
    _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: false,
      _dumped: false,
      req: [Circular *1],
      responseUrl: 'https://api.short.io/links',
      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: 'api.short.io',
    protocol: 'https:',
    _redirectable: Writable {
      _writableState: [WritableState],
      _events: [Object: null prototype],
      _eventsCount: 3,
      _maxListeners: undefined,
      _options: [Object],
      _ended: true,
      _ending: true,
      _redirectCount: 0,
      _redirects: [],
      _requestBodyLength: 133,
      _requestBodyBuffers: [],
      _onNativeResponse: [Function (anonymous)],
      _currentRequest: [Circular *1],
      _currentUrl: 'https://api.short.io/links',
      _timeout: null,
      [Symbol(kCapture)]: false
    },
    [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 {
      date: 'Tue, 25 Mar 2025 02:52:35 GMT',
      'content-type': 'application/json; charset=utf-8',
      'content-length': '70',
      connection: 'close',
      'content-security-policy': "default-src 'none'",
      'cross-origin-opener-policy': 'same-origin',
      'cross-origin-resource-policy': 'same-origin',
      'origin-agent-cluster': '?1',
      'referrer-policy': 'no-referrer',
      'strict-transport-security': 'max-age=63072000; includeSubDomains',
      'x-content-type-options': 'nosniff',
      'x-dns-prefetch-control': 'off',
      'x-download-options': 'noopen',
      'x-frame-options': 'DENY',
      'x-permitted-cross-domain-policies': 'none',
      'x-xss-protection': '0',
      vary: 'Origin',
      'x-ratelimit-limit': '50',
      'x-ratelimit-remaining': '49',
      'x-ratelimit-reset': '1'
    },
    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.short.io/links',
      data: '{"domain":"tv.nesn.com","expiredURL":"https://support.nesn.com","originalURL":"https://nesn.com/watch/authenticate/Q2B3OUB/5a75d2da"}'
    },
    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: '133',
      _hasBody: true,
      _trailer: '',
      finished: true,
      _headerSent: true,
      _closed: false,
      socket: [TLSSocket],
      _header: 'POST /links 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: sk_Np1qvyUgFaGj5Y4c\r\n' +
        'Content-Length: 133\r\n' +
        'Accept-Encoding: gzip, compress, deflate, br\r\n' +
        'Host: api.short.io\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: '/links',
      _ended: true,
      res: [IncomingMessage],
      aborted: false,
      timeoutCb: null,
      upgradeOrConnect: false,
      parser: null,
      maxHeadersCount: null,
      reusedSocket: false,
      host: 'api.short.io',
      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: {
      message: 'Access to domain denied',
      success: false,
      statusCode: 403
    }
  }
}
TypeError: undefined is not iterable (cannot read property Symbol(Symbol.iterator))
    at /app/services/providers/nesn/views/Login.tsx:17:41
    at Generator.next (<anonymous>)
    at fulfilled (/app/services/providers/nesn/views/Login.tsx:5:58)
    at processTicksAndRejections (node:internal/process/task_queues:95:5)

Any thoughts?

Just FYI that T-Mobile MLB Tuesday deal is active starting today....just activated mine again for this season.

2 Likes

Now that MLB and Peacock both offer ways to view SF Giants game in market (through a monthly fee). Is this possible to add to this container?

Peacock has DRM, so that can't be added here.

But if Giants.TV streams through an MLB.com account, that should already work.

SNLA plus works great on the container through my MLB account and a valid subscription.
If at all possible, try to get your in market streaming through mlb and you should be set.

3 Likes

I'm curious do these show the full broadcast from SNLA or is it still the MLB.tv overlay with MLB.tv ads, etc?

I'm unsure if they show the normal commericlas from SNLA but you do get the complete experience.
I opened the app today and saw a sqeeze play.
dwould be nice to have the SNLA channel added to the container but it isn't required.
I'm able to see the dodger in market game with my subscription.
in my app i have 3 options.
SNLA [llus, gamews and MLB Network.
I'm not sure what happened but i don't think the t-mobile sub comes with MLB Network.
I just know that i signed up early and it at first indicated that i had the 2024 subscription. Later in the day, it updated to 2025 t-mobile promotion.

If you authenticate it on the MLB site, it should come through in the container without anything else

Hopefully should be fixed now!

1 Like

Sorry just seeing this now - looks like Paramount+ might only be carrying them if you have a Paramount+ Showtime subscription. I did see some CBS games come through in my log (but there was an issue with CBS games not being scheduled when you posted). So hopefully they'll populate if you're upgraded

1 Like

That's interesting sounds like it's the direct feed from SNLA, SNY, etc. Are they the same when they're archived or do they revert to the MLB.tv standard?

Thanks for adding Victory+. I see there are toggles for the Stars and Ducks. Is it possible to add the Rangers now that they're available on Victory+?

I could, but that one costs extra, so I wasn't able to test it. If you have a subscription for the Rangers and don't mind me borrowing your credentials I can add it

1 Like

Great. I just messaged you.

New update should land in a few minutes that adds support

1 Like

Does anyone have SNLA linked to MLB and want to give me access? I'm working on adding the SNY linear channel now - would be nice to be add them both at the same time

3 Likes

Outstanding. Thank you!

I just messaged in my log in details.
lLet me know if you need any assistance.