[Bug]: Cannot add "Linux Matters" podcast feed #2404

Closed
opened 2026-04-25 00:06:48 +02:00 by adam · 7 comments
Owner

Originally created by @shimeike on GitHub (Dec 8, 2024).

What happened?

Cannot add "Linux Matters" podcast feed to audiobookshelf. I've tried adding both via the built-in audiobookshelf podcast search, as well as via the feed URL ( https://linuxmatters.sh/episode/index.xml ). Receive the error "Failed to get podcast feed." within the application.

What did you expect to happen?

Podcast is added. This has happened correctly for ~50 other podcasts from various sources that I have added.

Steps to reproduce the issue

  1. Click "Add" to add a new podcast feed
  2. Search for "Linux Matters". (Or directly add the feed URL https://linuxmatters.sh/episode/index.xml )
  3. Click "Submit"
  4. Receive error "Failed to get podcast feed."

Audiobookshelf version

v2.17.5

How are you running audiobookshelf?

Docker

What OS is your Audiobookshelf server hosted from?

Linux

If the issue is being seen in the UI, what browsers are you seeing the problem on?

Firefox

Logs

https://bpa.st/53JA

[podcastUtils] getPodcastFeed Error AggregateError [ETIMEDOUT]: at internalConnectMultiple (node:net:1122:18) at internalConnectMultiple (node:net:1190:5) at Timeout.internalConnectMultipleTimeout (node:net:1716:5) at listOnTimeout (node:internal/timers:583:11) at process.processTimers (node:internal/timers:519:7) { code: 'ETIMEDOUT', errors: [ Error: connect ETIMEDOUT 116.202.241.253:443 at createConnectionError (node:net:1652:14) at Timeout.internalConnectMultipleTimeout (node:net:1711:38) at listOnTimeout (node:internal/timers:583:11) at process.processTimers (node:internal/timers:519:7) { errno: -110, code: 'ETIMEDOUT', syscall: 'connect', address: '116.202.241.253', port: 443 }, Error: connect ENETUNREACH 2a01:4f8:241:3f6d::1:443 - Local (:::0) at internalConnectMultiple (node:net:1186:16) at Timeout.internalConnectMultipleTimeout (node:net:1716:5) at listOnTimeout (node:internal/timers:583:11) at process.processTimers (node:internal/timers:519:7) { errno: -101, code: 'ENETUNREACH', syscall: 'connect', address: '2a01:4f8:241:3f6d::1', port: 443 } ], config: { transitional: { silentJSONParsing: true, forcedJSONParsing: true, clarifyTimeoutError: false }, adapter: [Function: httpAdapter], transformRequest: [ [Function: transformRequest] ], transformResponse: [ [Function: transformResponse] ], timeout: 12000, xsrfCookieName: 'XSRF-TOKEN', xsrfHeaderName: 'X-XSRF-TOKEN', maxContentLength: -1, maxBodyLength: -1, env: { FormData: [Function] }, validateStatus: [Function: validateStatus], headers: { Accept: 'application/rss+xml, application/xhtml+xml, application/xml, */*;q=0.8', 'User-Agent': 'audiobookshelf (+https://audiobookshelf.org; like iTMS)' }, url: 'https://linuxmatters.sh/episode/index.xml', method: 'get', responseType: 'arraybuffer', httpAgent: 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: 0, maxCachedSessions: 100, _sessionCache: [Object], createConnection: [Function (anonymous)], [Symbol(shapeMode)]: false, [Symbol(kCapture)]: false, [Symbol(active)]: true }, httpsAgent: 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], createConnection: [Function (anonymous)], [Symbol(shapeMode)]: false, [Symbol(kCapture)]: false, [Symbol(active)]: true }, data: undefined }, request: <ref *1> Writable { _events: { close: undefined, error: [Function: handleRequestError], prefinish: undefined, finish: undefined, drain: undefined, response: [Function: handleResponse], socket: [Array], timeout: undefined, abort: undefined }, _writableState: WritableState { highWaterMark: 16384, length: 0, corked: 0, onwrite: [Function: bound onwrite], writelen: 0, bufferedIndex: 0, pendingcb: 0, [Symbol(kState)]: 17580812, [Symbol(kBufferedValue)]: null }, _maxListeners: undefined, _options: { maxRedirects: 21, maxBodyLength: 10485760, protocol: 'https:', path: '/episode/index.xml', method: 'GET', headers: [Object], agent: [Agent], agents: [Object], auth: undefined, hostname: 'linuxmatters.sh', port: null, nativeProtocols: [Object], pathname: '/episode/index.xml' }, _ended: true, _ending: true, _redirectCount: 0, _redirects: [], _requestBodyLength: 0, _requestBodyBuffers: [], _eventsCount: 3, _onNativeResponse: [Function (anonymous)], _currentRequest: 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 /episode/index.xml HTTP/1.1\r\n' + 'Accept: application/rss+xml, application/xhtml+xml, application/xml, */*;q=0.8\r\n' + 'User-Agent: audiobookshelf (+https://audiobookshelf.org; like iTMS)\r\n' + 'Host: linuxmatters.sh\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: '/episode/index.xml', _ended: false, res: null, aborted: false, timeoutCb: null, upgradeOrConnect: false, parser: null, maxHeadersCount: null, reusedSocket: false, host: 'linuxmatters.sh', protocol: 'https:', _redirectable: [Circular *1], [Symbol(shapeMode)]: false, [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 }, _currentUrl: 'https://linuxmatters.sh/episode/index.xml', _timeout: null, [Symbol(shapeMode)]: true, [Symbol(kCapture)]: false } }

Additional Notes

I can subscribe to this particular podcast feed on every other client that I've tried (on the same network), and I can subscribe to every other podcast feed that I've tried so far within audiobookshelf.

Therefore, I don't think it's my audiobookshelf setup or network. It's a weird combination of the two.

I can curl the feed successfully from within the audiobookshelf container, so I do not think it is related to my network setup.

Originally created by @shimeike on GitHub (Dec 8, 2024). ### What happened? Cannot add "Linux Matters" podcast feed to audiobookshelf. I've tried adding both via the built-in audiobookshelf podcast search, as well as via the feed URL ( https://linuxmatters.sh/episode/index.xml ). Receive the error "Failed to get podcast feed." within the application. ### What did you expect to happen? Podcast is added. This has happened correctly for ~50 other podcasts from various sources that I have added. ### Steps to reproduce the issue 1. Click "Add" to add a new podcast feed 2. Search for "Linux Matters". (Or directly add the feed URL https://linuxmatters.sh/episode/index.xml ) 3. Click "Submit" 4. Receive error "Failed to get podcast feed." ### Audiobookshelf version v2.17.5 ### How are you running audiobookshelf? Docker ### What OS is your Audiobookshelf server hosted from? Linux ### If the issue is being seen in the UI, what browsers are you seeing the problem on? Firefox ### Logs https://bpa.st/53JA ```shell [podcastUtils] getPodcastFeed Error AggregateError [ETIMEDOUT]: at internalConnectMultiple (node:net:1122:18) at internalConnectMultiple (node:net:1190:5) at Timeout.internalConnectMultipleTimeout (node:net:1716:5) at listOnTimeout (node:internal/timers:583:11) at process.processTimers (node:internal/timers:519:7) { code: 'ETIMEDOUT', errors: [ Error: connect ETIMEDOUT 116.202.241.253:443 at createConnectionError (node:net:1652:14) at Timeout.internalConnectMultipleTimeout (node:net:1711:38) at listOnTimeout (node:internal/timers:583:11) at process.processTimers (node:internal/timers:519:7) { errno: -110, code: 'ETIMEDOUT', syscall: 'connect', address: '116.202.241.253', port: 443 }, Error: connect ENETUNREACH 2a01:4f8:241:3f6d::1:443 - Local (:::0) at internalConnectMultiple (node:net:1186:16) at Timeout.internalConnectMultipleTimeout (node:net:1716:5) at listOnTimeout (node:internal/timers:583:11) at process.processTimers (node:internal/timers:519:7) { errno: -101, code: 'ENETUNREACH', syscall: 'connect', address: '2a01:4f8:241:3f6d::1', port: 443 } ], config: { transitional: { silentJSONParsing: true, forcedJSONParsing: true, clarifyTimeoutError: false }, adapter: [Function: httpAdapter], transformRequest: [ [Function: transformRequest] ], transformResponse: [ [Function: transformResponse] ], timeout: 12000, xsrfCookieName: 'XSRF-TOKEN', xsrfHeaderName: 'X-XSRF-TOKEN', maxContentLength: -1, maxBodyLength: -1, env: { FormData: [Function] }, validateStatus: [Function: validateStatus], headers: { Accept: 'application/rss+xml, application/xhtml+xml, application/xml, */*;q=0.8', 'User-Agent': 'audiobookshelf (+https://audiobookshelf.org; like iTMS)' }, url: 'https://linuxmatters.sh/episode/index.xml', method: 'get', responseType: 'arraybuffer', httpAgent: 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: 0, maxCachedSessions: 100, _sessionCache: [Object], createConnection: [Function (anonymous)], [Symbol(shapeMode)]: false, [Symbol(kCapture)]: false, [Symbol(active)]: true }, httpsAgent: 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], createConnection: [Function (anonymous)], [Symbol(shapeMode)]: false, [Symbol(kCapture)]: false, [Symbol(active)]: true }, data: undefined }, request: <ref *1> Writable { _events: { close: undefined, error: [Function: handleRequestError], prefinish: undefined, finish: undefined, drain: undefined, response: [Function: handleResponse], socket: [Array], timeout: undefined, abort: undefined }, _writableState: WritableState { highWaterMark: 16384, length: 0, corked: 0, onwrite: [Function: bound onwrite], writelen: 0, bufferedIndex: 0, pendingcb: 0, [Symbol(kState)]: 17580812, [Symbol(kBufferedValue)]: null }, _maxListeners: undefined, _options: { maxRedirects: 21, maxBodyLength: 10485760, protocol: 'https:', path: '/episode/index.xml', method: 'GET', headers: [Object], agent: [Agent], agents: [Object], auth: undefined, hostname: 'linuxmatters.sh', port: null, nativeProtocols: [Object], pathname: '/episode/index.xml' }, _ended: true, _ending: true, _redirectCount: 0, _redirects: [], _requestBodyLength: 0, _requestBodyBuffers: [], _eventsCount: 3, _onNativeResponse: [Function (anonymous)], _currentRequest: 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 /episode/index.xml HTTP/1.1\r\n' + 'Accept: application/rss+xml, application/xhtml+xml, application/xml, */*;q=0.8\r\n' + 'User-Agent: audiobookshelf (+https://audiobookshelf.org; like iTMS)\r\n' + 'Host: linuxmatters.sh\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: '/episode/index.xml', _ended: false, res: null, aborted: false, timeoutCb: null, upgradeOrConnect: false, parser: null, maxHeadersCount: null, reusedSocket: false, host: 'linuxmatters.sh', protocol: 'https:', _redirectable: [Circular *1], [Symbol(shapeMode)]: false, [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 }, _currentUrl: 'https://linuxmatters.sh/episode/index.xml', _timeout: null, [Symbol(shapeMode)]: true, [Symbol(kCapture)]: false } } ``` ### Additional Notes I can subscribe to this particular podcast feed on every other client that I've tried (on the same network), and I can subscribe to every other podcast feed that I've tried so far within audiobookshelf. Therefore, I don't think it's my audiobookshelf setup or network. It's a weird combination of the two. I can `curl` the feed successfully from within the audiobookshelf container, so I do not think it is related to my network setup.
adam added the bug label 2026-04-25 00:06:48 +02:00
adam closed this issue 2026-04-25 00:06:48 +02:00
Author
Owner

@advplyr commented on GitHub (Dec 13, 2024):

I'm not able to reproduce this. Can you test again?

@advplyr commented on GitHub (Dec 13, 2024): I'm not able to reproduce this. Can you test again?
Author
Owner

@shimeike commented on GitHub (Dec 13, 2024):

That is interesting. Yes, just tested again with same result. Any ideas for anything else I can test on my side?

@shimeike commented on GitHub (Dec 13, 2024): That is interesting. Yes, just tested again with same result. Any ideas for anything else I can test on my side?
Author
Owner

@advplyr commented on GitHub (Dec 13, 2024):

Is it possible it is taking more than 12 seconds to fetch the podcast RSS feed? That is what the timeout is set at

@advplyr commented on GitHub (Dec 13, 2024): Is it possible it is taking more than 12 seconds to fetch the podcast RSS feed? That is what the timeout is set at
Author
Owner

@shimeike commented on GitHub (Dec 13, 2024):

I don't think so. The "Failed to get podcast feed." error is shown in the audiobookshelf interface almost immediately.

It was suggested to me in the podcast network's IRC channel that it may have something to do with ipv6 (as a point of difference in the server between this particular podcast and others on the network). However, as stated in my original message, I can curl the feed from inside the audiobookshelf container. So it really is a mystery to me.

@shimeike commented on GitHub (Dec 13, 2024): I don't think so. The "Failed to get podcast feed." error is shown in the audiobookshelf interface almost immediately. It was suggested to me in the podcast network's IRC channel that it may have something to do with ipv6 (as a point of difference in the server between this particular podcast and others on the network). However, as stated in my original message, I can curl the feed from inside the audiobookshelf container. So it really is a mystery to me.
Author
Owner

@advplyr commented on GitHub (Dec 13, 2024):

Can you check the existing issues that have been opened with ipv6 https://github.com/advplyr/audiobookshelf/issues?q=is%3Aissue+ipv6

@advplyr commented on GitHub (Dec 13, 2024): Can you check the existing issues that have been opened with ipv6 https://github.com/advplyr/audiobookshelf/issues?q=is%3Aissue+ipv6
Author
Owner

@shimeike commented on GitHub (Dec 14, 2024):

Thanks - good idea!

This seems to have resolved it. I'll close this - thanks for your help and for the application!

@shimeike commented on GitHub (Dec 14, 2024): Thanks - good idea! [This](https://github.com/advplyr/audiobookshelf/issues/3346#issuecomment-2335177670) seems to have resolved it. I'll close this - thanks for your help and for the application!
Author
Owner

@rightsaidfred99 commented on GitHub (Dec 18, 2024):

I wouldn't say it's closed bug. I get the same error messsage. ipv6 disabled

maxRedirects: 21

@rightsaidfred99 commented on GitHub (Dec 18, 2024): I wouldn't say it's closed bug. I get the same error messsage. ipv6 disabled maxRedirects: 21
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: starred/audiobookshelf#2404