ESPN+ & FOX Sports with Custom Channels via EPlusTV

Okay, a decently sized update just dropped:

  • NBC Sports has been ripped out. They changed their whole platform and everything is DRM'd now, so I'm not sure I can work around this
  • MLB.tv has been added
  • I think the most requested one is having dedicated channels for linear content

There were a few bugs that I fixed in there as well, but they were more edge cases than anything else.

2 Likes

I found a bug, but fixed that. So if you saw it, just pull the new version :sweat_smile:

Hi there,
Thanks for the good work.
The MLB part did work dn streams are doing nicely.

@m0ngr31 What is the "Proxy keyed *.ts files" variable used for?

If it's set, it will download encrypted segments from the manifest and cache them locally. Useful if you're not using Channels and want more than one stream per event without hitting your max

@m0ngr31 great job adding MLB.tv, I've tried it out and so far it seems to be performing better than the other method in a few ways (quicker to tune and more reliable with a VPN).

A few questions...

  1. Is it necessary to reserve a set number of channels if I am only using EPlusTV for MLB and other linear channels, or will it auto populate the active variables?

  2. Now that Gracenote has guide data for MLB.tv can you integrate the tvg-id into the m3u so that Channels can automatically pull the full guide listings?

What a great docker, thanks so much @m0ngr31!

I installed it last night -- just not for ESPN+ content, as I don't subscribe -- but for integration of the other channels' content. Is EPlusTV designed to work that way? I did enter my regular ESPN.com login as well as DirecTV login credentials, as instructed.

I had to remove a "START_CHANNEL=7000" variable for the Automatic Channel Collection feature to work. With "prefer channel-number from M3U" selected in Custom Channels setting, the channels from EPlusTV start at 1 and go to 150. But with "ignore channel-number from M3U" selected, the channels start at 21919 instead, which I think I prefer.

And since I didn't want ESPN+ content to appear, I made sure to include this flag:

ESPNPLUS=FALSE

Here is my full run command:

docker run --restart unless-stopped --name EPlusTV -p 8000:8000 -v config_dir:/app/config -e ESPN=TRUE -e ESPN2=TRUE -e ESPN3=TRUE -e ESPNU=TRUE -e SEC=TRUE  -e SECPLUS=TRUE -e ESPNPLUS=FALSE -e FOXSPORTS=TRUE -e FOXSPORTS_MAX_RESOLUTION=UHD/HDR m0ngr31/eplustv:latest

Anyway, everything seems to be working great. However ESPN+ content is still appearing in the guide. And any attempt to play that content gets a "404 Not Found" error, as expected. Content from other channels of course plays fine.

My question is, is it possible to just exclude ESPN+ content entirely from my guide since I'm not able to watch it anyway? I did try a "delete and recreate the database" command, to no avail. Should I not have logged into ESPN.com at all, and if not, how to manage that now? Will I still be able to watch ESPN2, ESPN3 and ESPNU content once logged out?

Thanks for any feedback, and thanks again for a really great docker.

Can you post your full log? That variable should prevent ESPN+ events from being pulled down, but maybe there is a bug there

I haven’t played much with the latest but yes. ESPN+ is the only variable on by default. You would need to enter ESPN=True and ESPNPLUS=False to get just content playing on ESPN.

I subscribe to ESPN+ and MLBTV. The docker was able to pull up the stream when the other docker couldn't play the stream.
I love the APP.

Sure thing, here ya go, I removed the EPlusTV docker and added it back fresh, refreshed guide data, and then tried to play a game in the grid from ESPN+ to show what happens.

Here's the log, I did edit the authorization keys just in case...

2023-04-09 09:54:02 
2023-04-09 09:54:02 > [email protected] start
2023-04-09 09:54:02 > ts-node index.ts
2023-04-09 09:54:02 
2023-04-09 09:54:05 === E+TV v2.0.10 starting ===
2023-04-09 09:54:06 === Getting events ===
2023-04-09 09:54:06 Looking for ESPN events
2023-04-09 09:54:10 Looking for FOX Sports events...
2023-04-09 09:54:11 Adding event:  SPEAK
2023-04-09 09:54:11 Adding event:  The B1G Show
2023-04-09 09:54:11 === Done getting events ===
2023-04-09 09:54:11 === Building the schedule ===
2023-04-09 09:54:11 === Done building the schedule ===
2023-04-09 09:54:11 === Starting Server ===
2023-04-09 09:54:11 Server started on port 8000
2023-04-09 10:02:12 Channel #36 has an active event (Drake vs. Bradley). Going to start the stream.
2023-04-09 10:02:13 Could not get stream data. Event might be upcoming, ended, or in blackout...
2023-04-09 10:02:13 Failed to parse the stream
2023-04-09 10:02:13 AxiosError: Request failed with status code 401
2023-04-09 10:02:13     at settle (/app/node_modules/axios/lib/core/settle.js:19:12)
2023-04-09 10:02:13     at IncomingMessage.handleStreamEnd (/app/node_modules/axios/lib/adapters/http.js:512:11)
2023-04-09 10:02:13     at IncomingMessage.emit (node:events:525:35)
2023-04-09 10:02:13     at IncomingMessage.emit (node:domain:489:12)
2023-04-09 10:02:13     at endReadableNT (node:internal/streams/readable:1358:12)
2023-04-09 10:02:13     at processTicksAndRejections (node:internal/process/task_queues:83:21) {
2023-04-09 10:02:13   code: 'ERR_BAD_REQUEST',
2023-04-09 10:02:13   config: {
2023-04-09 10:02:13     transitional: {
2023-04-09 10:02:13       silentJSONParsing: true,
2023-04-09 10:02:13       forcedJSONParsing: true,
2023-04-09 10:02:13       clarifyTimeoutError: false
2023-04-09 10:02:13     },
2023-04-09 10:02:13     adapter: [ 'xhr', 'http' ],
2023-04-09 10:02:13     transformRequest: [ [Function: transformRequest] ],
2023-04-09 10:02:13     transformResponse: [ [Function: transformResponse] ],
2023-04-09 10:02:13     timeout: 0,
2023-04-09 10:02:13     xsrfCookieName: 'XSRF-TOKEN',
2023-04-09 10:02:13     xsrfHeaderName: 'X-XSRF-TOKEN',
2023-04-09 10:02:13     maxContentLength: -1,
2023-04-09 10:02:13     maxBodyLength: -1,
2023-04-09 10:02:13     env: { FormData: [Function], Blob: null },
2023-04-09 10:02:13     validateStatus: [Function: validateStatus],
2023-04-09 10:02:13     headers: AxiosHeaders {
2023-04-09 10:02:13       Accept: 'application/vnd.media-service+json; version=2',
2023-04-09 10:02:13       Authorization: 'eyJ6aXAiOiJ.......',
2023-04-09 10:02:13       Origin: 'https://plus.espn.com',
2023-04-09 10:02:13       'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:106.0) Gecko/20100101 Firefox/106.0',
2023-04-09 10:02:13       'Accept-Encoding': 'gzip, compress, deflate, br'
2023-04-09 10:02:13     },
2023-04-09 10:02:13     method: 'get',
2023-04-09 10:02:13     url: 'https://playback.svcs.plus.espn.com/events/bd015ff7-f369-4e45-a521-ae93162fb73c/media/0045b812-3c4e-45ad-be89-d6a4c0b23275/scenarios/browser~ssai',
2023-04-09 10:02:13     data: undefined
2023-04-09 10:02:13   },
2023-04-09 10:02:13   request: <ref *1> ClientRequest {
2023-04-09 10:02:13     _events: [Object: null prototype] {
2023-04-09 10:02:13       abort: [Function (anonymous)],
2023-04-09 10:02:13       aborted: [Function (anonymous)],
2023-04-09 10:02:13       connect: [Function (anonymous)],
2023-04-09 10:02:13       error: [Function (anonymous)],
2023-04-09 10:02:13       socket: [Function (anonymous)],
2023-04-09 10:02:13       timeout: [Function (anonymous)],
2023-04-09 10:02:13       finish: [Function: requestOnFinish]
2023-04-09 10:02:13     },
2023-04-09 10:02:13     _eventsCount: 7,
2023-04-09 10:02:13     _maxListeners: undefined,
2023-04-09 10:02:13     outputData: [],
2023-04-09 10:02:13     outputSize: 0,
2023-04-09 10:02:13     writable: true,
2023-04-09 10:02:13     destroyed: false,
2023-04-09 10:02:13     _last: true,
2023-04-09 10:02:13     chunkedEncoding: false,
2023-04-09 10:02:13     shouldKeepAlive: false,
2023-04-09 10:02:13     maxRequestsOnConnectionReached: false,
2023-04-09 10:02:13     _defaultKeepAlive: true,
2023-04-09 10:02:13     useChunkedEncodingByDefault: false,
2023-04-09 10:02:13     sendDate: false,
2023-04-09 10:02:13     _removedConnection: false,
2023-04-09 10:02:13     _removedContLen: false,
2023-04-09 10:02:13     _removedTE: false,
2023-04-09 10:02:13     strictContentLength: false,
2023-04-09 10:02:13     _contentLength: 0,
2023-04-09 10:02:13     _hasBody: true,
2023-04-09 10:02:13     _trailer: '',
2023-04-09 10:02:13     finished: true,
2023-04-09 10:02:13     _headerSent: true,
2023-04-09 10:02:13     _closed: false,
2023-04-09 10:02:13     socket: TLSSocket {
2023-04-09 10:02:13       _tlsOptions: [Object],
2023-04-09 10:02:13       _secureEstablished: true,
2023-04-09 10:02:13       _securePending: false,
2023-04-09 10:02:13       _newSessionPending: false,
2023-04-09 10:02:13       _controlReleased: true,
2023-04-09 10:02:13       secureConnecting: false,
2023-04-09 10:02:13       _SNICallback: null,
2023-04-09 10:02:13       servername: 'playback.svcs.plus.espn.com',
2023-04-09 10:02:13       alpnProtocol: false,
2023-04-09 10:02:13       authorized: true,
2023-04-09 10:02:13       authorizationError: null,
2023-04-09 10:02:13       encrypted: true,
2023-04-09 10:02:13       _events: [Object: null prototype],
2023-04-09 10:02:13       _eventsCount: 10,
2023-04-09 10:02:13       connecting: false,
2023-04-09 10:02:13       _hadError: false,
2023-04-09 10:02:13       _parent: null,
2023-04-09 10:02:13       _host: 'playback.svcs.plus.espn.com',
2023-04-09 10:02:13       _closeAfterHandlingError: false,
2023-04-09 10:02:13       _readableState: [ReadableState],
2023-04-09 10:02:13       _maxListeners: undefined,
2023-04-09 10:02:13       _writableState: [WritableState],
2023-04-09 10:02:13       allowHalfOpen: false,
2023-04-09 10:02:13       _sockname: null,
2023-04-09 10:02:13       _pendingData: null,
2023-04-09 10:02:13       _pendingEncoding: '',
2023-04-09 10:02:13       server: undefined,
2023-04-09 10:02:13       _server: null,
2023-04-09 10:02:13       ssl: [TLSWrap],
2023-04-09 10:02:13       _requestCert: true,
2023-04-09 10:02:13       _rejectUnauthorized: true,
2023-04-09 10:02:13       parser: null,
2023-04-09 10:02:13       _httpMessage: [Circular *1],
2023-04-09 10:02:13       [Symbol(res)]: [TLSWrap],
2023-04-09 10:02:13       [Symbol(verified)]: true,
2023-04-09 10:02:13       [Symbol(pendingSession)]: null,
2023-04-09 10:02:13       [Symbol(async_id_symbol)]: 2999,
2023-04-09 10:02:13       [Symbol(kHandle)]: [TLSWrap],
2023-04-09 10:02:13       [Symbol(lastWriteQueueSize)]: 0,
2023-04-09 10:02:13       [Symbol(timeout)]: null,
2023-04-09 10:02:13       [Symbol(kBuffer)]: null,
2023-04-09 10:02:13       [Symbol(kBufferCb)]: null,
2023-04-09 10:02:13       [Symbol(kBufferGen)]: null,
2023-04-09 10:02:13       [Symbol(kCapture)]: false,
2023-04-09 10:02:13       [Symbol(kSetNoDelay)]: false,
2023-04-09 10:02:13       [Symbol(kSetKeepAlive)]: true,
2023-04-09 10:02:13       [Symbol(kSetKeepAliveInitialDelay)]: 60,
2023-04-09 10:02:13       [Symbol(kBytesRead)]: 0,
2023-04-09 10:02:13       [Symbol(kBytesWritten)]: 0,
2023-04-09 10:02:13       [Symbol(connect-options)]: [Object],
2023-04-09 10:02:13       [Symbol(RequestTimeout)]: undefined
2023-04-09 10:02:13     },
2023-04-09 10:02:13     _header: 'GET /events/bd015ff7-f369-4e45-a521-ae93162fb73c/media/0045b812-3c4e-45ad-be89-d6a4c0b23275/scenarios/browser~ssai HTTP/1.1\r\n' +
2023-04-09 10:02:13       'Accept: application/vnd.media-service+json; version=2\r\n' +
2023-04-09 10:02:13       'Authorization: eyJ6aXAiOiJERU.....\r\n' +
2023-04-09 10:02:13       'Origin: https://plus.espn.com\r\n' +
2023-04-09 10:02:13       'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:106.0) Gecko/20100101 Firefox/106.0\r\n' +
2023-04-09 10:02:13       'Accept-Encoding: gzip, compress, deflate, br\r\n' +
2023-04-09 10:02:13       'Host: playback.svcs.plus.espn.com\r\n' +
2023-04-09 10:02:13       'Connection: close\r\n' +
2023-04-09 10:02:13       '\r\n',
2023-04-09 10:02:13     _keepAliveTimeout: 0,
2023-04-09 10:02:13     _onPendingData: [Function: nop],
2023-04-09 10:02:13     agent: Agent {
2023-04-09 10:02:13       _events: [Object: null prototype],
2023-04-09 10:02:13       _eventsCount: 2,
2023-04-09 10:02:13       _maxListeners: undefined,
2023-04-09 10:02:13       defaultPort: 443,
2023-04-09 10:02:13       protocol: 'https:',
2023-04-09 10:02:13       options: [Object: null prototype],
2023-04-09 10:02:13       requests: [Object: null prototype] {},
2023-04-09 10:02:13       sockets: [Object: null prototype],
2023-04-09 10:02:13       freeSockets: [Object: null prototype] {},
2023-04-09 10:02:13       keepAliveMsecs: 1000,
2023-04-09 10:02:13       keepAlive: false,
2023-04-09 10:02:13       maxSockets: Infinity,
2023-04-09 10:02:13       maxFreeSockets: 256,
2023-04-09 10:02:13       scheduling: 'lifo',
2023-04-09 10:02:13       maxTotalSockets: Infinity,
2023-04-09 10:02:13       totalSocketCount: 1,
2023-04-09 10:02:13       maxCachedSessions: 100,
2023-04-09 10:02:13       _sessionCache: [Object],
2023-04-09 10:02:13       [Symbol(kCapture)]: false
2023-04-09 10:02:13     },
2023-04-09 10:02:13     socketPath: undefined,
2023-04-09 10:02:13     method: 'GET',
2023-04-09 10:02:13     maxHeaderSize: undefined,
2023-04-09 10:02:13     insecureHTTPParser: undefined,
2023-04-09 10:02:13     path: '/events/bd015ff7-f369-4e45-a521-ae93162fb73c/media/0045b812-3c4e-45ad-be89-d6a4c0b23275/scenarios/browser~ssai',
2023-04-09 10:02:13     _ended: true,
2023-04-09 10:02:13     res: IncomingMessage {
2023-04-09 10:02:13       _readableState: [ReadableState],
2023-04-09 10:02:13       _events: [Object: null prototype],
2023-04-09 10:02:13       _eventsCount: 4,
2023-04-09 10:02:13       _maxListeners: undefined,
2023-04-09 10:02:13       socket: [TLSSocket],
2023-04-09 10:02:13       httpVersionMajor: 1,
2023-04-09 10:02:13       httpVersionMinor: 1,
2023-04-09 10:02:13       httpVersion: '1.1',
2023-04-09 10:02:13       complete: true,
2023-04-09 10:02:13       rawHeaders: [Array],
2023-04-09 10:02:13       rawTrailers: [],
2023-04-09 10:02:13       aborted: false,
2023-04-09 10:02:13       upgrade: false,
2023-04-09 10:02:13       url: '',
2023-04-09 10:02:13       method: null,
2023-04-09 10:02:13       statusCode: 401,
2023-04-09 10:02:13       statusMessage: 'Unauthorized',
2023-04-09 10:02:13       client: [TLSSocket],
2023-04-09 10:02:13       _consuming: true,
2023-04-09 10:02:13       _dumped: false,
2023-04-09 10:02:13       req: [Circular *1],
2023-04-09 10:02:13       responseUrl: 'https://playback.svcs.plus.espn.com/events/bd015ff7-f369-4e45-a521-ae93162fb73c/media/0045b812-3c4e-45ad-be89-d6a4c0b23275/scenarios/browser~ssai',
2023-04-09 10:02:13       redirects: [],
2023-04-09 10:02:13       [Symbol(kCapture)]: false,
2023-04-09 10:02:13       [Symbol(kHeaders)]: [Object],
2023-04-09 10:02:13       [Symbol(kHeadersCount)]: 38,
2023-04-09 10:02:13       [Symbol(kTrailers)]: null,
2023-04-09 10:02:13       [Symbol(kTrailersCount)]: 0,
2023-04-09 10:02:13       [Symbol(RequestTimeout)]: undefined
2023-04-09 10:02:13     },
2023-04-09 10:02:13     aborted: false,
2023-04-09 10:02:13     timeoutCb: null,
2023-04-09 10:02:13     upgradeOrConnect: false,
2023-04-09 10:02:13     parser: null,
2023-04-09 10:02:13     maxHeadersCount: null,
2023-04-09 10:02:13     reusedSocket: false,
2023-04-09 10:02:13     host: 'playback.svcs.plus.espn.com',
2023-04-09 10:02:13     protocol: 'https:',
2023-04-09 10:02:13     _redirectable: Writable {
2023-04-09 10:02:13       _writableState: [WritableState],
2023-04-09 10:02:13       _events: [Object: null prototype],
2023-04-09 10:02:13       _eventsCount: 3,
2023-04-09 10:02:13       _maxListeners: undefined,
2023-04-09 10:02:13       _options: [Object],
2023-04-09 10:02:13       _ended: true,
2023-04-09 10:02:13       _ending: true,
2023-04-09 10:02:13       _redirectCount: 0,
2023-04-09 10:02:13       _redirects: [],
2023-04-09 10:02:13       _requestBodyLength: 0,
2023-04-09 10:02:13       _requestBodyBuffers: [],
2023-04-09 10:02:13       _onNativeResponse: [Function (anonymous)],
2023-04-09 10:02:13       _currentRequest: [Circular *1],
2023-04-09 10:02:13       _currentUrl: 'https://playback.svcs.plus.espn.com/events/bd015ff7-f369-4e45-a521-ae93162fb73c/media/0045b812-3c4e-45ad-be89-d6a4c0b23275/scenarios/browser~ssai',
2023-04-09 10:02:13       [Symbol(kCapture)]: false
2023-04-09 10:02:13     },
2023-04-09 10:02:13     [Symbol(kCapture)]: false,
2023-04-09 10:02:13     [Symbol(kBytesWritten)]: 0,
2023-04-09 10:02:13     [Symbol(kEndCalled)]: true,
2023-04-09 10:02:13     [Symbol(kNeedDrain)]: false,
2023-04-09 10:02:13     [Symbol(corked)]: 0,
2023-04-09 10:02:13     [Symbol(kOutHeaders)]: [Object: null prototype] {
2023-04-09 10:02:13       accept: [Array],
2023-04-09 10:02:13       authorization: [Array],
2023-04-09 10:02:13       origin: [Array],
2023-04-09 10:02:13       'user-agent': [Array],
2023-04-09 10:02:13       'accept-encoding': [Array],
2023-04-09 10:02:13       host: [Array]
2023-04-09 10:02:13     },
2023-04-09 10:02:13     [Symbol(kUniqueHeaders)]: null
2023-04-09 10:02:13   },
2023-04-09 10:02:13   response: {
2023-04-09 10:02:13     status: 401,
2023-04-09 10:02:13     statusText: 'Unauthorized',
2023-04-09 10:02:13     headers: AxiosHeaders {
2023-04-09 10:02:13       'content-type': 'application/json; charset=utf-8',
2023-04-09 10:02:13       'transfer-encoding': 'chunked',
2023-04-09 10:02:13       connection: 'close',
2023-04-09 10:02:13       date: 'Sun, 09 Apr 2023 17:02:13 GMT',
2023-04-09 10:02:13       'x-dss-edge': 'auth.expired',
2023-04-09 10:02:13       'www-authenticate': 'Bearer code="access-token.invalid", description="auth.expired"',
2023-04-09 10:02:13       'access-control-allow-origin': 'https://plus.espn.com',
2023-04-09 10:02:13       'access-control-allow-methods': 'GET, POST, PUT, PATCH, DELETE, OPTIONS',
2023-04-09 10:02:13       'access-control-allow-credentials': 'true',
2023-04-09 10:02:13       'access-control-expose-headers': 'x-request-id, x-bamtech-region',
2023-04-09 10:02:13       'access-control-max-age': '600',
2023-04-09 10:02:13       'x-request-id': 'f51eed2a09eecc8970294f5810975569',
2023-04-09 10:02:13       'x-bamtech-region': 'us-west-2',
2023-04-09 10:02:13       'cache-control': 'no-store',
2023-04-09 10:02:13       vary: 'origin,access-control-request-headers',
2023-04-09 10:02:13       'x-cache': 'Error from cloudfront',
2023-04-09 10:02:13       via: '1.1 e235a9ff25582ed62ef48771e429fb16.cloudfront.net (CloudFront)',
2023-04-09 10:02:13       'x-amz-cf-pop': 'LAX50-P4',
2023-04-09 10:02:13       'x-amz-cf-id': 'H5hHa0YiE9uTWHizs_J3rktJ540md-gesFvEVk-CVPkhf-uTY8fAGQ=='
2023-04-09 10:02:13     },
2023-04-09 10:02:13     config: {
2023-04-09 10:02:13       transitional: [Object],
2023-04-09 10:02:13       adapter: [Array],
2023-04-09 10:02:13       transformRequest: [Array],
2023-04-09 10:02:13       transformResponse: [Array],
2023-04-09 10:02:13       timeout: 0,
2023-04-09 10:02:13       xsrfCookieName: 'XSRF-TOKEN',
2023-04-09 10:02:13       xsrfHeaderName: 'X-XSRF-TOKEN',
2023-04-09 10:02:13       maxContentLength: -1,
2023-04-09 10:02:13       maxBodyLength: -1,
2023-04-09 10:02:13       env: [Object],
2023-04-09 10:02:13       validateStatus: [Function: validateStatus],
2023-04-09 10:02:13       headers: [AxiosHeaders],
2023-04-09 10:02:13       method: 'get',
2023-04-09 10:02:13       url: 'https://playback.svcs.plus.espn.com/events/bd015ff7-f369-4e45-a521-ae93162fb73c/media/0045b812-3c4e-45ad-be89-d6a4c0b23275/scenarios/browser~ssai',
2023-04-09 10:02:13       data: undefined
2023-04-09 10:02:13     },
2023-04-09 10:02:13     request: <ref *1> ClientRequest {
2023-04-09 10:02:13       _events: [Object: null prototype],
2023-04-09 10:02:13       _eventsCount: 7,
2023-04-09 10:02:13       _maxListeners: undefined,
2023-04-09 10:02:13       outputData: [],
2023-04-09 10:02:13       outputSize: 0,
2023-04-09 10:02:13       writable: true,
2023-04-09 10:02:13       destroyed: false,
2023-04-09 10:02:13       _last: true,
2023-04-09 10:02:13       chunkedEncoding: false,
2023-04-09 10:02:13       shouldKeepAlive: false,
2023-04-09 10:02:13       maxRequestsOnConnectionReached: false,
2023-04-09 10:02:13       _defaultKeepAlive: true,
2023-04-09 10:02:13       useChunkedEncodingByDefault: false,
2023-04-09 10:02:13       sendDate: false,
2023-04-09 10:02:13       _removedConnection: false,
2023-04-09 10:02:13       _removedContLen: false,
2023-04-09 10:02:13       _removedTE: false,
2023-04-09 10:02:13       strictContentLength: false,
2023-04-09 10:02:13       _contentLength: 0,
2023-04-09 10:02:13       _hasBody: true,
2023-04-09 10:02:13       _trailer: '',
2023-04-09 10:02:13       finished: true,
2023-04-09 10:02:13       _headerSent: true,
2023-04-09 10:02:13       _closed: false,
2023-04-09 10:02:13       socket: [TLSSocket],
2023-04-09 10:02:13       _header: 'GET /events/bd015ff7-f369-4e45-a521-ae93162fb73c/media/0045b812-3c4e-45ad-be89-d6a4c0b23275/scenarios/browser~ssai HTTP/1.1\r\n' +
2023-04-09 10:02:13         'Accept: application/vnd.media-service+json; version=2\r\n' +
2023-04-09 10:02:13         'Authorization: eyJ6aXShw....\r\n' +
2023-04-09 10:02:13         'Origin: https://plus.espn.com\r\n' +
2023-04-09 10:02:13         'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:106.0) Gecko/20100101 Firefox/106.0\r\n' +
2023-04-09 10:02:13         'Accept-Encoding: gzip, compress, deflate, br\r\n' +
2023-04-09 10:02:13         'Host: playback.svcs.plus.espn.com\r\n' +
2023-04-09 10:02:13         'Connection: close\r\n' +
2023-04-09 10:02:13         '\r\n',
2023-04-09 10:02:13       _keepAliveTimeout: 0,
2023-04-09 10:02:13       _onPendingData: [Function: nop],
2023-04-09 10:02:13       agent: [Agent],
2023-04-09 10:02:13       socketPath: undefined,
2023-04-09 10:02:13       method: 'GET',
2023-04-09 10:02:13       maxHeaderSize: undefined,
2023-04-09 10:02:13       insecureHTTPParser: undefined,
2023-04-09 10:02:13       path: '/events/bd015ff7-f369-4e45-a521-ae93162fb73c/media/0045b812-3c4e-45ad-be89-d6a4c0b23275/scenarios/browser~ssai',
2023-04-09 10:02:13       _ended: true,
2023-04-09 10:02:13       res: [IncomingMessage],
2023-04-09 10:02:13       aborted: false,
2023-04-09 10:02:13       timeoutCb: null,
2023-04-09 10:02:13       upgradeOrConnect: false,
2023-04-09 10:02:13       parser: null,
2023-04-09 10:02:13       maxHeadersCount: null,
2023-04-09 10:02:13       reusedSocket: false,
2023-04-09 10:02:13       host: 'playback.svcs.plus.espn.com',
2023-04-09 10:02:13       protocol: 'https:',
2023-04-09 10:02:13       _redirectable: [Writable],
2023-04-09 10:02:13       [Symbol(kCapture)]: false,
2023-04-09 10:02:13       [Symbol(kBytesWritten)]: 0,
2023-04-09 10:02:13       [Symbol(kEndCalled)]: true,
2023-04-09 10:02:13       [Symbol(kNeedDrain)]: false,
2023-04-09 10:02:13       [Symbol(corked)]: 0,
2023-04-09 10:02:13       [Symbol(kOutHeaders)]: [Object: null prototype],
2023-04-09 10:02:13       [Symbol(kUniqueHeaders)]: null
2023-04-09 10:02:13     },
2023-04-09 10:02:13     data: { errors: [Array] }
2023-04-09 10:02:13   }
2023-04-09 10:02:13 }
2023-04-09 10:02:13 Could not get a playlist for channel #36. Please make sure there is an event scheduled and you have access to it.

Thanks, yes, I've had have those environment variables set, and yet am still seeing all the ESPN+ games in my grid.

Have you tried removing the entries.db and schedule.db files?

I hadn't tried that yet, but I just did, then stopped and started the docker, refreshed guide data, and now, it's working fine. I see plenty of games listed now on ESPN2, ESPN3, ESPNU, BTN, SEC Network, etc. but nothing displaying from ESPN+. Thanks so much for the help and thanks again for this great bit of code. It's awesome.

Hello! Unfortunately the MLB games through MLB.tv are not showing up under the sports section, am I supposed to do something for that?

I'm seeing the same thing. It looks like the MLB.tv events in the xml don't include the "Sports" tag like the events from other sources do.

1 Like

Yes, that's my bad. On the next update I'll have that fixed

1 Like

Appreciate that!

Keep up the great work.
thankfully i'm able to bring up my game by searching in channels.
The stream comes right up.

I tried adding Bally Sports today, but they are using DRM for all their live streams :cry:

Hi there,
Sortof figures.
thanks for the effort.
I do have one question.
Does anyone know if the vlc-bridge that the other guy is using for dockers can decode the DRM?
Thought i would throw it out there.