[Bug]: crash while downloading many podcasts #1521

Closed
opened 2026-04-24 23:48:37 +02:00 by adam · 16 comments
Owner

Originally created by @marcaurele on GitHub (Nov 11, 2023).

Describe the issue

I selected 120 episodes on this podcast URL, the download queue stopped at 57 left to run with an error (log below). Then, the podcast itself is in a broken state, and each time you try to access it, the service crashes. It's impossible to remove the podcast alone, it's impossible to edit anything. The only solution is to remove the entire library.

[2023-11-11 18:27:00] ERROR: [Utils] Failed to get ino for path /podcasts/enfants/Oli [Error: ENOENT: no such file or directory, stat '/podcasts/enfants/Oli'] {
  errno: -2,
  code: 'ENOENT',
  syscall: 'stat',
  path: '/podcasts/enfants/Oli'
} (fileUtils.js:104)
[2023-11-11 18:27:00] ERROR: [fileUtils] Recurse files error [Error: ENOENT: no such file or directory, scandir '/podcasts/enfants/Oli/'] {
  errno: -2,
  code: 'ENOENT',
  syscall: 'scandir',
  path: '/podcasts/enfants/Oli/'
} (fileUtils.js:168)
[2023-11-11 18:27:00] ERROR: [fileUtils] Failed to getFileTimestampsWithIno [Error: ENOENT: no such file or directory, stat '/podcasts/enfants/Oli'] {
  errno: -2,
  code: 'ENOENT',
  syscall: 'stat',
  path: '/podcasts/enfants/Oli'
} (fileUtils.js:61)
[2023-11-11 18:27:00] ERROR: [Utils] Failed to get ino for path /podcasts/enfants/Les odyssées [Error: ENOENT: no such file or directory, stat '/podcasts/enfants/Les odyssées'] {
  errno: -2,
  code: 'ENOENT',
  syscall: 'stat',
  path: '/podcasts/enfants/Les odyssées'
} (fileUtils.js:104)
[2023-11-11 18:27:00] ERROR: [fileUtils] Recurse files error [Error: ENOENT: no such file or directory, scandir '/podcasts/enfants/Les odyssées/'] {
  errno: -2,
  code: 'ENOENT',
  syscall: 'scandir',
  path: '/podcasts/enfants/Les odyssées/'
} (fileUtils.js:168)
[2023-11-11 18:27:00] ERROR: [fileUtils] Failed to getFileTimestampsWithIno [Error: ENOENT: no such file or directory, stat '/podcasts/enfants/Les odyssées'] {
  errno: -2,
  code: 'ENOENT',
  syscall: 'stat',
  path: '/podcasts/enfants/Les odyssées'
} (fileUtils.js:61)
node:internal/process/promises:279
            triggerUncaughtException(err, true /* fromPromise */);
            ^

Error
    at Database.<anonymous> (/node_modules/sequelize/lib/dialects/sqlite/query.js:185:27)
    at /node_modules/sequelize/lib/dialects/sqlite/query.js:183:50
    at new Promise (<anonymous>)
    at Query.run (/node_modules/sequelize/lib/dialects/sqlite/query.js:183:12)
    at /node_modules/sequelize/lib/sequelize.js:315:28
    at async SQLiteQueryInterface.select (/node_modules/sequelize/lib/dialects/abstract/query-interface.js:407:12)
    at async Function.findAll (/node_modules/sequelize/lib/model.js:1140:21)
    at async Function.findOne (/node_modules/sequelize/lib/model.js:1240:12)
    at async Function.findByPk (/node_modules/sequelize/lib/model.js:1221:12)
    at async Function.getOldById (/server/models/LibraryItem.js:422:25) {
  name: 'SequelizeDatabaseError',
  parent: [Error: SQLITE_IOERR: disk I/O error] {
    errno: 10,
    code: 'SQLITE_IOERR',
    sql: "SELECT `libraryItem`.`id`, `libraryItem`.`ino`, `libraryItem`.`path`, `libraryItem`.`relPath`, `libraryItem`.`mediaId`, `libraryItem`.`mediaType`, `libraryItem`.`isFile`, `libraryItem`.`isMissing`, `libraryItem`.`isInvalid`, `libraryItem`.`mtime`, `libraryItem`.`ctime`, `libraryItem`.`birthtime`, `libraryItem`.`size`, `libraryItem`.`lastScan`, `libraryItem`.`lastScanVersion`, `libraryItem`.`libraryFiles`, `libraryItem`.`extraData`, `libraryItem`.`createdAt`, `libraryItem`.`updatedAt`, `libraryItem`.`libraryId`, `libraryItem`.`libraryFolderId`, `book`.`id` AS `book.id`, `book`.`title` AS `book.title`, `book`.`titleIgnorePrefix` AS `book.titleIgnorePrefix`, `book`.`subtitle` AS `book.subtitle`, `book`.`publishedYear` AS `book.publishedYear`, `book`.`publishedDate` AS `book.publishedDate`, `book`.`publisher` AS `book.publisher`, `book`.`description` AS `book.description`, `book`.`isbn` AS `book.isbn`, `book`.`asin` AS `book.asin`, `book`.`language` AS `book.language`, `book`.`explicit` AS `book.explicit`, `book`.`abridged` AS `book.abridged`, `book`.`coverPath` AS `book.coverPath`, `book`.`duration` AS `book.duration`, `book`.`narrators` AS `book.narrators`, `book`.`audioFiles` AS `book.audioFiles`, `book`.`ebookFile` AS `book.ebookFile`, `book`.`chapters` AS `book.chapters`, `book`.`tags` AS `book.tags`, `book`.`genres` AS `book.genres`, `book`.`createdAt` AS `book.createdAt`, `book`.`updatedAt` AS `book.updatedAt`, `book->authors`.`id` AS `book.authors.id`, `book->authors`.`name` AS `book.authors.name`, `book->authors`.`lastFirst` AS `book.authors.lastFirst`, `book->authors`.`asin` AS `book.authors.asin`, `book->authors`.`description` AS `book.authors.description`, `book->authors`.`imagePath` AS `book.authors.imagePath`, `book->authors`.`createdAt` AS `book.authors.createdAt`, `book->authors`.`updatedAt` AS `book.authors.updatedAt`, `book->authors`.`libraryId` AS `book.authors.libraryId`, `book->series`.`id` AS `book.series.id`, `book->series`.`name` AS `book.series.name`, `book->series`.`nameIgnorePrefix` AS `book.series.nameIgnorePrefix`, `book->series`.`description` AS `book.series.description`, `book->series`.`createdAt` AS `book.series.createdAt`, `book->series`.`updatedAt` AS `book.series.updatedAt`, `book->series`.`libraryId` AS `book.series.libraryId`, `book->series->bookSeries`.`id` AS `book.series.bookSeries.id`, `book->series->bookSeries`.`sequence` AS `book.series.bookSeries.sequence`, `podcast`.`id` AS `podcast.id`, `podcast`.`title` AS `podcast.title`, `podcast`.`titleIgnorePrefix` AS `podcast.titleIgnorePrefix`, `podcast`.`author` AS `podcast.author`, `podcast`.`releaseDate` AS `podcast.releaseDate`, `podcast`.`feedURL` AS `podcast.feedURL`, `podcast`.`imageURL` AS `podcast.imageURL`, `podcast`.`description` AS `podcast.description`, `podcast`.`itunesPageURL` AS `podcast.itunesPageURL`, `podcast`.`itunesId` AS `podcast.itunesId`, `podcast`.`itunesArtistId` AS `podcast.itunesArtistId`, `podcast`.`language` AS `podcast.language`, `podcast`.`podcastType` AS `podcast.podcastType`, `podcast`.`explicit` AS `podcast.explicit`, `podcast`.`autoDownloadEpisodes` AS `podcast.autoDownloadEpisodes`, `podcast`.`autoDownloadSchedule` AS `podcast.autoDownloadSchedule`, `podcast`.`lastEpisodeCheck` AS `podcast.lastEpisodeCheck`, `podcast`.`maxEpisodesToKeep` AS `podcast.maxEpisodesToKeep`, `podcast`.`maxNewEpisodesToDownload` AS `podcast.maxNewEpisodesToDownload`, `podcast`.`coverPath` AS `podcast.coverPath`, `podcast`.`tags` AS `podcast.tags`, `podcast`.`genres` AS `podcast.genres`, `podcast`.`createdAt` AS `podcast.createdAt`, `podcast`.`updatedAt` AS `podcast.updatedAt`, `podcast->podcastEpisodes`.`id` AS `podcast.podcastEpisodes.id`, `podcast->podcastEpisodes`.`index` AS `podcast.podcastEpisodes.index`, `podcast->podcastEpisodes`.`season` AS `podcast.podcastEpisodes.season`, `podcast->podcastEpisodes`.`episode` AS `podcast.podcastEpisodes.episode`, `podcast->podcastEpisodes`.`episodeType` AS `podcast.podcastEpisodes.episodeType`, `podcast->podcastEpisodes`.`title` AS `podcast.podcastEpisodes.title`, `podcast->podcastEpisodes`.`subtitle` AS `podcast.podcastEpisodes.subtitle`, `podcast->podcastEpisodes`.`description` AS `podcast.podcastEpisodes.description`, `podcast->podcastEpisodes`.`pubDate` AS `podcast.podcastEpisodes.pubDate`, `podcast->podcastEpisodes`.`enclosureURL` AS `podcast.podcastEpisodes.enclosureURL`, `podcast->podcastEpisodes`.`enclosureSize` AS `podcast.podcastEpisodes.enclosureSize`, `podcast->podcastEpisodes`.`enclosureType` AS `podcast.podcastEpisodes.enclosureType`, `podcast->podcastEpisodes`.`publishedAt` AS `podcast.podcastEpisodes.publishedAt`, `podcast->podcastEpisodes`.`audioFile` AS `podcast.podcastEpisodes.audioFile`, `podcast->podcastEpisodes`.`chapters` AS `podcast.podcastEpisodes.chapters`, `podcast->podcastEpisodes`.`extraData` AS `podcast.podcastEpisodes.extraData`, `podcast->podcastEpisodes`.`createdAt` AS `podcast.podcastEpisodes.createdAt`, `podcast->podcastEpisodes`.`updatedAt` AS `podcast.podcastEpisodes.updatedAt`, `podcast->podcastEpisodes`.`podcastId` AS `podcast.podcastEpisodes.podcastId` FROM `libraryItems` AS `libraryItem` LEFT OUTER JOIN `books` AS `book` ON `libraryItem`.`mediaId` = `book`.`id` LEFT OUTER JOIN ( `bookAuthors` AS `book->authors->bookAuthor` INNER JOIN `authors` AS `book->authors` ON `book->authors`.`id` = `book->authors->bookAuthor`.`authorId`) ON `book`.`id` = `book->authors->bookAuthor`.`bookId` LEFT OUTER JOIN ( `bookSeries` AS `book->series->bookSeries` INNER JOIN `series` AS `book->series` ON `book->series`.`id` = `book->series->bookSeries`.`seriesId`) ON `book`.`id` = `book->series->bookSeries`.`bookId` LEFT OUTER JOIN `podcasts` AS `podcast` ON `libraryItem`.`mediaId` = `podcast`.`id` LEFT OUTER JOIN `podcastEpisodes` AS `podcast->podcastEpisodes` ON `podcast`.`id` = `podcast->podcastEpisodes`.`podcastId` WHERE `libraryItem`.`id` = '5287b99a-3afa-4410-a931-5e5f2edb701f' ORDER BY `book->authors->bookAuthor`.`createdAt` ASC, `book->series->bookSeries`.`createdAt` ASC;"
  },
  original: [Error: SQLITE_IOERR: disk I/O error] {
    errno: 10,
    code: 'SQLITE_IOERR',
    sql: "SELECT `libraryItem`.`id`, `libraryItem`.`ino`, `libraryItem`.`path`, `libraryItem`.`relPath`, `libraryItem`.`mediaId`, `libraryItem`.`mediaType`, `libraryItem`.`isFile`, `libraryItem`.`isMissing`, `libraryItem`.`isInvalid`, `libraryItem`.`mtime`, `libraryItem`.`ctime`, `libraryItem`.`birthtime`, `libraryItem`.`size`, `libraryItem`.`lastScan`, `libraryItem`.`lastScanVersion`, `libraryItem`.`libraryFiles`, `libraryItem`.`extraData`, `libraryItem`.`createdAt`, `libraryItem`.`updatedAt`, `libraryItem`.`libraryId`, `libraryItem`.`libraryFolderId`, `book`.`id` AS `book.id`, `book`.`title` AS `book.title`, `book`.`titleIgnorePrefix` AS `book.titleIgnorePrefix`, `book`.`subtitle` AS `book.subtitle`, `book`.`publishedYear` AS `book.publishedYear`, `book`.`publishedDate` AS `book.publishedDate`, `book`.`publisher` AS `book.publisher`, `book`.`description` AS `book.description`, `book`.`isbn` AS `book.isbn`, `book`.`asin` AS `book.asin`, `book`.`language` AS `book.language`, `book`.`explicit` AS `book.explicit`, `book`.`abridged` AS `book.abridged`, `book`.`coverPath` AS `book.coverPath`, `book`.`duration` AS `book.duration`, `book`.`narrators` AS `book.narrators`, `book`.`audioFiles` AS `book.audioFiles`, `book`.`ebookFile` AS `book.ebookFile`, `book`.`chapters` AS `book.chapters`, `book`.`tags` AS `book.tags`, `book`.`genres` AS `book.genres`, `book`.`createdAt` AS `book.createdAt`, `book`.`updatedAt` AS `book.updatedAt`, `book->authors`.`id` AS `book.authors.id`, `book->authors`.`name` AS `book.authors.name`, `book->authors`.`lastFirst` AS `book.authors.lastFirst`, `book->authors`.`asin` AS `book.authors.asin`, `book->authors`.`description` AS `book.authors.description`, `book->authors`.`imagePath` AS `book.authors.imagePath`, `book->authors`.`createdAt` AS `book.authors.createdAt`, `book->authors`.`updatedAt` AS `book.authors.updatedAt`, `book->authors`.`libraryId` AS `book.authors.libraryId`, `book->series`.`id` AS `book.series.id`, `book->series`.`name` AS `book.series.name`, `book->series`.`nameIgnorePrefix` AS `book.series.nameIgnorePrefix`, `book->series`.`description` AS `book.series.description`, `book->series`.`createdAt` AS `book.series.createdAt`, `book->series`.`updatedAt` AS `book.series.updatedAt`, `book->series`.`libraryId` AS `book.series.libraryId`, `book->series->bookSeries`.`id` AS `book.series.bookSeries.id`, `book->series->bookSeries`.`sequence` AS `book.series.bookSeries.sequence`, `podcast`.`id` AS `podcast.id`, `podcast`.`title` AS `podcast.title`, `podcast`.`titleIgnorePrefix` AS `podcast.titleIgnorePrefix`, `podcast`.`author` AS `podcast.author`, `podcast`.`releaseDate` AS `podcast.releaseDate`, `podcast`.`feedURL` AS `podcast.feedURL`, `podcast`.`imageURL` AS `podcast.imageURL`, `podcast`.`description` AS `podcast.description`, `podcast`.`itunesPageURL` AS `podcast.itunesPageURL`, `podcast`.`itunesId` AS `podcast.itunesId`, `podcast`.`itunesArtistId` AS `podcast.itunesArtistId`, `podcast`.`language` AS `podcast.language`, `podcast`.`podcastType` AS `podcast.podcastType`, `podcast`.`explicit` AS `podcast.explicit`, `podcast`.`autoDownloadEpisodes` AS `podcast.autoDownloadEpisodes`, `podcast`.`autoDownloadSchedule` AS `podcast.autoDownloadSchedule`, `podcast`.`lastEpisodeCheck` AS `podcast.lastEpisodeCheck`, `podcast`.`maxEpisodesToKeep` AS `podcast.maxEpisodesToKeep`, `podcast`.`maxNewEpisodesToDownload` AS `podcast.maxNewEpisodesToDownload`, `podcast`.`coverPath` AS `podcast.coverPath`, `podcast`.`tags` AS `podcast.tags`, `podcast`.`genres` AS `podcast.genres`, `podcast`.`createdAt` AS `podcast.createdAt`, `podcast`.`updatedAt` AS `podcast.updatedAt`, `podcast->podcastEpisodes`.`id` AS `podcast.podcastEpisodes.id`, `podcast->podcastEpisodes`.`index` AS `podcast.podcastEpisodes.index`, `podcast->podcastEpisodes`.`season` AS `podcast.podcastEpisodes.season`, `podcast->podcastEpisodes`.`episode` AS `podcast.podcastEpisodes.episode`, `podcast->podcastEpisodes`.`episodeType` AS `podcast.podcastEpisodes.episodeType`, `podcast->podcastEpisodes`.`title` AS `podcast.podcastEpisodes.title`, `podcast->podcastEpisodes`.`subtitle` AS `podcast.podcastEpisodes.subtitle`, `podcast->podcastEpisodes`.`description` AS `podcast.podcastEpisodes.description`, `podcast->podcastEpisodes`.`pubDate` AS `podcast.podcastEpisodes.pubDate`, `podcast->podcastEpisodes`.`enclosureURL` AS `podcast.podcastEpisodes.enclosureURL`, `podcast->podcastEpisodes`.`enclosureSize` AS `podcast.podcastEpisodes.enclosureSize`, `podcast->podcastEpisodes`.`enclosureType` AS `podcast.podcastEpisodes.enclosureType`, `podcast->podcastEpisodes`.`publishedAt` AS `podcast.podcastEpisodes.publishedAt`, `podcast->podcastEpisodes`.`audioFile` AS `podcast.podcastEpisodes.audioFile`, `podcast->podcastEpisodes`.`chapters` AS `podcast.podcastEpisodes.chapters`, `podcast->podcastEpisodes`.`extraData` AS `podcast.podcastEpisodes.extraData`, `podcast->podcastEpisodes`.`createdAt` AS `podcast.podcastEpisodes.createdAt`, `podcast->podcastEpisodes`.`updatedAt` AS `podcast.podcastEpisodes.updatedAt`, `podcast->podcastEpisodes`.`podcastId` AS `podcast.podcastEpisodes.podcastId` FROM `libraryItems` AS `libraryItem` LEFT OUTER JOIN `books` AS `book` ON `libraryItem`.`mediaId` = `book`.`id` LEFT OUTER JOIN ( `bookAuthors` AS `book->authors->bookAuthor` INNER JOIN `authors` AS `book->authors` ON `book->authors`.`id` = `book->authors->bookAuthor`.`authorId`) ON `book`.`id` = `book->authors->bookAuthor`.`bookId` LEFT OUTER JOIN ( `bookSeries` AS `book->series->bookSeries` INNER JOIN `series` AS `book->series` ON `book->series`.`id` = `book->series->bookSeries`.`seriesId`) ON `book`.`id` = `book->series->bookSeries`.`bookId` LEFT OUTER JOIN `podcasts` AS `podcast` ON `libraryItem`.`mediaId` = `podcast`.`id` LEFT OUTER JOIN `podcastEpisodes` AS `podcast->podcastEpisodes` ON `podcast`.`id` = `podcast->podcastEpisodes`.`podcastId` WHERE `libraryItem`.`id` = '5287b99a-3afa-4410-a931-5e5f2edb701f' ORDER BY `book->authors->bookAuthor`.`createdAt` ASC, `book->series->bookSeries`.`createdAt` ASC;"
  },
  sql: "SELECT `libraryItem`.`id`, `libraryItem`.`ino`, `libraryItem`.`path`, `libraryItem`.`relPath`, `libraryItem`.`mediaId`, `libraryItem`.`mediaType`, `libraryItem`.`isFile`, `libraryItem`.`isMissing`, `libraryItem`.`isInvalid`, `libraryItem`.`mtime`, `libraryItem`.`ctime`, `libraryItem`.`birthtime`, `libraryItem`.`size`, `libraryItem`.`lastScan`, `libraryItem`.`lastScanVersion`, `libraryItem`.`libraryFiles`, `libraryItem`.`extraData`, `libraryItem`.`createdAt`, `libraryItem`.`updatedAt`, `libraryItem`.`libraryId`, `libraryItem`.`libraryFolderId`, `book`.`id` AS `book.id`, `book`.`title` AS `book.title`, `book`.`titleIgnorePrefix` AS `book.titleIgnorePrefix`, `book`.`subtitle` AS `book.subtitle`, `book`.`publishedYear` AS `book.publishedYear`, `book`.`publishedDate` AS `book.publishedDate`, `book`.`publisher` AS `book.publisher`, `book`.`description` AS `book.description`, `book`.`isbn` AS `book.isbn`, `book`.`asin` AS `book.asin`, `book`.`language` AS `book.language`, `book`.`explicit` AS `book.explicit`, `book`.`abridged` AS `book.abridged`, `book`.`coverPath` AS `book.coverPath`, `book`.`duration` AS `book.duration`, `book`.`narrators` AS `book.narrators`, `book`.`audioFiles` AS `book.audioFiles`, `book`.`ebookFile` AS `book.ebookFile`, `book`.`chapters` AS `book.chapters`, `book`.`tags` AS `book.tags`, `book`.`genres` AS `book.genres`, `book`.`createdAt` AS `book.createdAt`, `book`.`updatedAt` AS `book.updatedAt`, `book->authors`.`id` AS `book.authors.id`, `book->authors`.`name` AS `book.authors.name`, `book->authors`.`lastFirst` AS `book.authors.lastFirst`, `book->authors`.`asin` AS `book.authors.asin`, `book->authors`.`description` AS `book.authors.description`, `book->authors`.`imagePath` AS `book.authors.imagePath`, `book->authors`.`createdAt` AS `book.authors.createdAt`, `book->authors`.`updatedAt` AS `book.authors.updatedAt`, `book->authors`.`libraryId` AS `book.authors.libraryId`, `book->series`.`id` AS `book.series.id`, `book->series`.`name` AS `book.series.name`, `book->series`.`nameIgnorePrefix` AS `book.series.nameIgnorePrefix`, `book->series`.`description` AS `book.series.description`, `book->series`.`createdAt` AS `book.series.createdAt`, `book->series`.`updatedAt` AS `book.series.updatedAt`, `book->series`.`libraryId` AS `book.series.libraryId`, `book->series->bookSeries`.`id` AS `book.series.bookSeries.id`, `book->series->bookSeries`.`sequence` AS `book.series.bookSeries.sequence`, `podcast`.`id` AS `podcast.id`, `podcast`.`title` AS `podcast.title`, `podcast`.`titleIgnorePrefix` AS `podcast.titleIgnorePrefix`, `podcast`.`author` AS `podcast.author`, `podcast`.`releaseDate` AS `podcast.releaseDate`, `podcast`.`feedURL` AS `podcast.feedURL`, `podcast`.`imageURL` AS `podcast.imageURL`, `podcast`.`description` AS `podcast.description`, `podcast`.`itunesPageURL` AS `podcast.itunesPageURL`, `podcast`.`itunesId` AS `podcast.itunesId`, `podcast`.`itunesArtistId` AS `podcast.itunesArtistId`, `podcast`.`language` AS `podcast.language`, `podcast`.`podcastType` AS `podcast.podcastType`, `podcast`.`explicit` AS `podcast.explicit`, `podcast`.`autoDownloadEpisodes` AS `podcast.autoDownloadEpisodes`, `podcast`.`autoDownloadSchedule` AS `podcast.autoDownloadSchedule`, `podcast`.`lastEpisodeCheck` AS `podcast.lastEpisodeCheck`, `podcast`.`maxEpisodesToKeep` AS `podcast.maxEpisodesToKeep`, `podcast`.`maxNewEpisodesToDownload` AS `podcast.maxNewEpisodesToDownload`, `podcast`.`coverPath` AS `podcast.coverPath`, `podcast`.`tags` AS `podcast.tags`, `podcast`.`genres` AS `podcast.genres`, `podcast`.`createdAt` AS `podcast.createdAt`, `podcast`.`updatedAt` AS `podcast.updatedAt`, `podcast->podcastEpisodes`.`id` AS `podcast.podcastEpisodes.id`, `podcast->podcastEpisodes`.`index` AS `podcast.podcastEpisodes.index`, `podcast->podcastEpisodes`.`season` AS `podcast.podcastEpisodes.season`, `podcast->podcastEpisodes`.`episode` AS `podcast.podcastEpisodes.episode`, `podcast->podcastEpisodes`.`episodeType` AS `podcast.podcastEpisodes.episodeType`, `podcast->podcastEpisodes`.`title` AS `podcast.podcastEpisodes.title`, `podcast->podcastEpisodes`.`subtitle` AS `podcast.podcastEpisodes.subtitle`, `podcast->podcastEpisodes`.`description` AS `podcast.podcastEpisodes.description`, `podcast->podcastEpisodes`.`pubDate` AS `podcast.podcastEpisodes.pubDate`, `podcast->podcastEpisodes`.`enclosureURL` AS `podcast.podcastEpisodes.enclosureURL`, `podcast->podcastEpisodes`.`enclosureSize` AS `podcast.podcastEpisodes.enclosureSize`, `podcast->podcastEpisodes`.`enclosureType` AS `podcast.podcastEpisodes.enclosureType`, `podcast->podcastEpisodes`.`publishedAt` AS `podcast.podcastEpisodes.publishedAt`, `podcast->podcastEpisodes`.`audioFile` AS `podcast.podcastEpisodes.audioFile`, `podcast->podcastEpisodes`.`chapters` AS `podcast.podcastEpisodes.chapters`, `podcast->podcastEpisodes`.`extraData` AS `podcast.podcastEpisodes.extraData`, `podcast->podcastEpisodes`.`createdAt` AS `podcast.podcastEpisodes.createdAt`, `podcast->podcastEpisodes`.`updatedAt` AS `podcast.podcastEpisodes.updatedAt`, `podcast->podcastEpisodes`.`podcastId` AS `podcast.podcastEpisodes.podcastId` FROM `libraryItems` AS `libraryItem` LEFT OUTER JOIN `books` AS `book` ON `libraryItem`.`mediaId` = `book`.`id` LEFT OUTER JOIN ( `bookAuthors` AS `book->authors->bookAuthor` INNER JOIN `authors` AS `book->authors` ON `book->authors`.`id` = `book->authors->bookAuthor`.`authorId`) ON `book`.`id` = `book->authors->bookAuthor`.`bookId` LEFT OUTER JOIN ( `bookSeries` AS `book->series->bookSeries` INNER JOIN `series` AS `book->series` ON `book->series`.`id` = `book->series->bookSeries`.`seriesId`) ON `book`.`id` = `book->series->bookSeries`.`bookId` LEFT OUTER JOIN `podcasts` AS `podcast` ON `libraryItem`.`mediaId` = `podcast`.`id` LEFT OUTER JOIN `podcastEpisodes` AS `podcast->podcastEpisodes` ON `podcast`.`id` = `podcast->podcastEpisodes`.`podcastId` WHERE `libraryItem`.`id` = '5287b99a-3afa-4410-a931-5e5f2edb701f' ORDER BY `book->authors->bookAuthor`.`createdAt` ASC, `book->series->bookSeries`.`createdAt` ASC;",
  parameters: {}
}

Steps to reproduce the issue

  1. Open the list of episodes for the podcast https://radiofrance-podcast.net/podcast09/rss_19721.xml
  2. Select all of them
  3. Wait for the download to run
  4. The download queue stopped at 57 items left with this error

image

Audiobookshelf version

v2.5.0

How are you running audiobookshelf?

Docker

Originally created by @marcaurele on GitHub (Nov 11, 2023). ### Describe the issue I selected 120 episodes on this podcast URL, the download queue stopped at 57 left to run with an error (log below). Then, the podcast itself is in a broken state, and each time you try to access it, the service crashes. It's impossible to remove the podcast alone, it's impossible to edit anything. The only solution is to remove the entire library. ```console [2023-11-11 18:27:00] ERROR: [Utils] Failed to get ino for path /podcasts/enfants/Oli [Error: ENOENT: no such file or directory, stat '/podcasts/enfants/Oli'] { errno: -2, code: 'ENOENT', syscall: 'stat', path: '/podcasts/enfants/Oli' } (fileUtils.js:104) [2023-11-11 18:27:00] ERROR: [fileUtils] Recurse files error [Error: ENOENT: no such file or directory, scandir '/podcasts/enfants/Oli/'] { errno: -2, code: 'ENOENT', syscall: 'scandir', path: '/podcasts/enfants/Oli/' } (fileUtils.js:168) [2023-11-11 18:27:00] ERROR: [fileUtils] Failed to getFileTimestampsWithIno [Error: ENOENT: no such file or directory, stat '/podcasts/enfants/Oli'] { errno: -2, code: 'ENOENT', syscall: 'stat', path: '/podcasts/enfants/Oli' } (fileUtils.js:61) [2023-11-11 18:27:00] ERROR: [Utils] Failed to get ino for path /podcasts/enfants/Les odyssées [Error: ENOENT: no such file or directory, stat '/podcasts/enfants/Les odyssées'] { errno: -2, code: 'ENOENT', syscall: 'stat', path: '/podcasts/enfants/Les odyssées' } (fileUtils.js:104) [2023-11-11 18:27:00] ERROR: [fileUtils] Recurse files error [Error: ENOENT: no such file or directory, scandir '/podcasts/enfants/Les odyssées/'] { errno: -2, code: 'ENOENT', syscall: 'scandir', path: '/podcasts/enfants/Les odyssées/' } (fileUtils.js:168) [2023-11-11 18:27:00] ERROR: [fileUtils] Failed to getFileTimestampsWithIno [Error: ENOENT: no such file or directory, stat '/podcasts/enfants/Les odyssées'] { errno: -2, code: 'ENOENT', syscall: 'stat', path: '/podcasts/enfants/Les odyssées' } (fileUtils.js:61) node:internal/process/promises:279 triggerUncaughtException(err, true /* fromPromise */); ^ Error at Database.<anonymous> (/node_modules/sequelize/lib/dialects/sqlite/query.js:185:27) at /node_modules/sequelize/lib/dialects/sqlite/query.js:183:50 at new Promise (<anonymous>) at Query.run (/node_modules/sequelize/lib/dialects/sqlite/query.js:183:12) at /node_modules/sequelize/lib/sequelize.js:315:28 at async SQLiteQueryInterface.select (/node_modules/sequelize/lib/dialects/abstract/query-interface.js:407:12) at async Function.findAll (/node_modules/sequelize/lib/model.js:1140:21) at async Function.findOne (/node_modules/sequelize/lib/model.js:1240:12) at async Function.findByPk (/node_modules/sequelize/lib/model.js:1221:12) at async Function.getOldById (/server/models/LibraryItem.js:422:25) { name: 'SequelizeDatabaseError', parent: [Error: SQLITE_IOERR: disk I/O error] { errno: 10, code: 'SQLITE_IOERR', sql: "SELECT `libraryItem`.`id`, `libraryItem`.`ino`, `libraryItem`.`path`, `libraryItem`.`relPath`, `libraryItem`.`mediaId`, `libraryItem`.`mediaType`, `libraryItem`.`isFile`, `libraryItem`.`isMissing`, `libraryItem`.`isInvalid`, `libraryItem`.`mtime`, `libraryItem`.`ctime`, `libraryItem`.`birthtime`, `libraryItem`.`size`, `libraryItem`.`lastScan`, `libraryItem`.`lastScanVersion`, `libraryItem`.`libraryFiles`, `libraryItem`.`extraData`, `libraryItem`.`createdAt`, `libraryItem`.`updatedAt`, `libraryItem`.`libraryId`, `libraryItem`.`libraryFolderId`, `book`.`id` AS `book.id`, `book`.`title` AS `book.title`, `book`.`titleIgnorePrefix` AS `book.titleIgnorePrefix`, `book`.`subtitle` AS `book.subtitle`, `book`.`publishedYear` AS `book.publishedYear`, `book`.`publishedDate` AS `book.publishedDate`, `book`.`publisher` AS `book.publisher`, `book`.`description` AS `book.description`, `book`.`isbn` AS `book.isbn`, `book`.`asin` AS `book.asin`, `book`.`language` AS `book.language`, `book`.`explicit` AS `book.explicit`, `book`.`abridged` AS `book.abridged`, `book`.`coverPath` AS `book.coverPath`, `book`.`duration` AS `book.duration`, `book`.`narrators` AS `book.narrators`, `book`.`audioFiles` AS `book.audioFiles`, `book`.`ebookFile` AS `book.ebookFile`, `book`.`chapters` AS `book.chapters`, `book`.`tags` AS `book.tags`, `book`.`genres` AS `book.genres`, `book`.`createdAt` AS `book.createdAt`, `book`.`updatedAt` AS `book.updatedAt`, `book->authors`.`id` AS `book.authors.id`, `book->authors`.`name` AS `book.authors.name`, `book->authors`.`lastFirst` AS `book.authors.lastFirst`, `book->authors`.`asin` AS `book.authors.asin`, `book->authors`.`description` AS `book.authors.description`, `book->authors`.`imagePath` AS `book.authors.imagePath`, `book->authors`.`createdAt` AS `book.authors.createdAt`, `book->authors`.`updatedAt` AS `book.authors.updatedAt`, `book->authors`.`libraryId` AS `book.authors.libraryId`, `book->series`.`id` AS `book.series.id`, `book->series`.`name` AS `book.series.name`, `book->series`.`nameIgnorePrefix` AS `book.series.nameIgnorePrefix`, `book->series`.`description` AS `book.series.description`, `book->series`.`createdAt` AS `book.series.createdAt`, `book->series`.`updatedAt` AS `book.series.updatedAt`, `book->series`.`libraryId` AS `book.series.libraryId`, `book->series->bookSeries`.`id` AS `book.series.bookSeries.id`, `book->series->bookSeries`.`sequence` AS `book.series.bookSeries.sequence`, `podcast`.`id` AS `podcast.id`, `podcast`.`title` AS `podcast.title`, `podcast`.`titleIgnorePrefix` AS `podcast.titleIgnorePrefix`, `podcast`.`author` AS `podcast.author`, `podcast`.`releaseDate` AS `podcast.releaseDate`, `podcast`.`feedURL` AS `podcast.feedURL`, `podcast`.`imageURL` AS `podcast.imageURL`, `podcast`.`description` AS `podcast.description`, `podcast`.`itunesPageURL` AS `podcast.itunesPageURL`, `podcast`.`itunesId` AS `podcast.itunesId`, `podcast`.`itunesArtistId` AS `podcast.itunesArtistId`, `podcast`.`language` AS `podcast.language`, `podcast`.`podcastType` AS `podcast.podcastType`, `podcast`.`explicit` AS `podcast.explicit`, `podcast`.`autoDownloadEpisodes` AS `podcast.autoDownloadEpisodes`, `podcast`.`autoDownloadSchedule` AS `podcast.autoDownloadSchedule`, `podcast`.`lastEpisodeCheck` AS `podcast.lastEpisodeCheck`, `podcast`.`maxEpisodesToKeep` AS `podcast.maxEpisodesToKeep`, `podcast`.`maxNewEpisodesToDownload` AS `podcast.maxNewEpisodesToDownload`, `podcast`.`coverPath` AS `podcast.coverPath`, `podcast`.`tags` AS `podcast.tags`, `podcast`.`genres` AS `podcast.genres`, `podcast`.`createdAt` AS `podcast.createdAt`, `podcast`.`updatedAt` AS `podcast.updatedAt`, `podcast->podcastEpisodes`.`id` AS `podcast.podcastEpisodes.id`, `podcast->podcastEpisodes`.`index` AS `podcast.podcastEpisodes.index`, `podcast->podcastEpisodes`.`season` AS `podcast.podcastEpisodes.season`, `podcast->podcastEpisodes`.`episode` AS `podcast.podcastEpisodes.episode`, `podcast->podcastEpisodes`.`episodeType` AS `podcast.podcastEpisodes.episodeType`, `podcast->podcastEpisodes`.`title` AS `podcast.podcastEpisodes.title`, `podcast->podcastEpisodes`.`subtitle` AS `podcast.podcastEpisodes.subtitle`, `podcast->podcastEpisodes`.`description` AS `podcast.podcastEpisodes.description`, `podcast->podcastEpisodes`.`pubDate` AS `podcast.podcastEpisodes.pubDate`, `podcast->podcastEpisodes`.`enclosureURL` AS `podcast.podcastEpisodes.enclosureURL`, `podcast->podcastEpisodes`.`enclosureSize` AS `podcast.podcastEpisodes.enclosureSize`, `podcast->podcastEpisodes`.`enclosureType` AS `podcast.podcastEpisodes.enclosureType`, `podcast->podcastEpisodes`.`publishedAt` AS `podcast.podcastEpisodes.publishedAt`, `podcast->podcastEpisodes`.`audioFile` AS `podcast.podcastEpisodes.audioFile`, `podcast->podcastEpisodes`.`chapters` AS `podcast.podcastEpisodes.chapters`, `podcast->podcastEpisodes`.`extraData` AS `podcast.podcastEpisodes.extraData`, `podcast->podcastEpisodes`.`createdAt` AS `podcast.podcastEpisodes.createdAt`, `podcast->podcastEpisodes`.`updatedAt` AS `podcast.podcastEpisodes.updatedAt`, `podcast->podcastEpisodes`.`podcastId` AS `podcast.podcastEpisodes.podcastId` FROM `libraryItems` AS `libraryItem` LEFT OUTER JOIN `books` AS `book` ON `libraryItem`.`mediaId` = `book`.`id` LEFT OUTER JOIN ( `bookAuthors` AS `book->authors->bookAuthor` INNER JOIN `authors` AS `book->authors` ON `book->authors`.`id` = `book->authors->bookAuthor`.`authorId`) ON `book`.`id` = `book->authors->bookAuthor`.`bookId` LEFT OUTER JOIN ( `bookSeries` AS `book->series->bookSeries` INNER JOIN `series` AS `book->series` ON `book->series`.`id` = `book->series->bookSeries`.`seriesId`) ON `book`.`id` = `book->series->bookSeries`.`bookId` LEFT OUTER JOIN `podcasts` AS `podcast` ON `libraryItem`.`mediaId` = `podcast`.`id` LEFT OUTER JOIN `podcastEpisodes` AS `podcast->podcastEpisodes` ON `podcast`.`id` = `podcast->podcastEpisodes`.`podcastId` WHERE `libraryItem`.`id` = '5287b99a-3afa-4410-a931-5e5f2edb701f' ORDER BY `book->authors->bookAuthor`.`createdAt` ASC, `book->series->bookSeries`.`createdAt` ASC;" }, original: [Error: SQLITE_IOERR: disk I/O error] { errno: 10, code: 'SQLITE_IOERR', sql: "SELECT `libraryItem`.`id`, `libraryItem`.`ino`, `libraryItem`.`path`, `libraryItem`.`relPath`, `libraryItem`.`mediaId`, `libraryItem`.`mediaType`, `libraryItem`.`isFile`, `libraryItem`.`isMissing`, `libraryItem`.`isInvalid`, `libraryItem`.`mtime`, `libraryItem`.`ctime`, `libraryItem`.`birthtime`, `libraryItem`.`size`, `libraryItem`.`lastScan`, `libraryItem`.`lastScanVersion`, `libraryItem`.`libraryFiles`, `libraryItem`.`extraData`, `libraryItem`.`createdAt`, `libraryItem`.`updatedAt`, `libraryItem`.`libraryId`, `libraryItem`.`libraryFolderId`, `book`.`id` AS `book.id`, `book`.`title` AS `book.title`, `book`.`titleIgnorePrefix` AS `book.titleIgnorePrefix`, `book`.`subtitle` AS `book.subtitle`, `book`.`publishedYear` AS `book.publishedYear`, `book`.`publishedDate` AS `book.publishedDate`, `book`.`publisher` AS `book.publisher`, `book`.`description` AS `book.description`, `book`.`isbn` AS `book.isbn`, `book`.`asin` AS `book.asin`, `book`.`language` AS `book.language`, `book`.`explicit` AS `book.explicit`, `book`.`abridged` AS `book.abridged`, `book`.`coverPath` AS `book.coverPath`, `book`.`duration` AS `book.duration`, `book`.`narrators` AS `book.narrators`, `book`.`audioFiles` AS `book.audioFiles`, `book`.`ebookFile` AS `book.ebookFile`, `book`.`chapters` AS `book.chapters`, `book`.`tags` AS `book.tags`, `book`.`genres` AS `book.genres`, `book`.`createdAt` AS `book.createdAt`, `book`.`updatedAt` AS `book.updatedAt`, `book->authors`.`id` AS `book.authors.id`, `book->authors`.`name` AS `book.authors.name`, `book->authors`.`lastFirst` AS `book.authors.lastFirst`, `book->authors`.`asin` AS `book.authors.asin`, `book->authors`.`description` AS `book.authors.description`, `book->authors`.`imagePath` AS `book.authors.imagePath`, `book->authors`.`createdAt` AS `book.authors.createdAt`, `book->authors`.`updatedAt` AS `book.authors.updatedAt`, `book->authors`.`libraryId` AS `book.authors.libraryId`, `book->series`.`id` AS `book.series.id`, `book->series`.`name` AS `book.series.name`, `book->series`.`nameIgnorePrefix` AS `book.series.nameIgnorePrefix`, `book->series`.`description` AS `book.series.description`, `book->series`.`createdAt` AS `book.series.createdAt`, `book->series`.`updatedAt` AS `book.series.updatedAt`, `book->series`.`libraryId` AS `book.series.libraryId`, `book->series->bookSeries`.`id` AS `book.series.bookSeries.id`, `book->series->bookSeries`.`sequence` AS `book.series.bookSeries.sequence`, `podcast`.`id` AS `podcast.id`, `podcast`.`title` AS `podcast.title`, `podcast`.`titleIgnorePrefix` AS `podcast.titleIgnorePrefix`, `podcast`.`author` AS `podcast.author`, `podcast`.`releaseDate` AS `podcast.releaseDate`, `podcast`.`feedURL` AS `podcast.feedURL`, `podcast`.`imageURL` AS `podcast.imageURL`, `podcast`.`description` AS `podcast.description`, `podcast`.`itunesPageURL` AS `podcast.itunesPageURL`, `podcast`.`itunesId` AS `podcast.itunesId`, `podcast`.`itunesArtistId` AS `podcast.itunesArtistId`, `podcast`.`language` AS `podcast.language`, `podcast`.`podcastType` AS `podcast.podcastType`, `podcast`.`explicit` AS `podcast.explicit`, `podcast`.`autoDownloadEpisodes` AS `podcast.autoDownloadEpisodes`, `podcast`.`autoDownloadSchedule` AS `podcast.autoDownloadSchedule`, `podcast`.`lastEpisodeCheck` AS `podcast.lastEpisodeCheck`, `podcast`.`maxEpisodesToKeep` AS `podcast.maxEpisodesToKeep`, `podcast`.`maxNewEpisodesToDownload` AS `podcast.maxNewEpisodesToDownload`, `podcast`.`coverPath` AS `podcast.coverPath`, `podcast`.`tags` AS `podcast.tags`, `podcast`.`genres` AS `podcast.genres`, `podcast`.`createdAt` AS `podcast.createdAt`, `podcast`.`updatedAt` AS `podcast.updatedAt`, `podcast->podcastEpisodes`.`id` AS `podcast.podcastEpisodes.id`, `podcast->podcastEpisodes`.`index` AS `podcast.podcastEpisodes.index`, `podcast->podcastEpisodes`.`season` AS `podcast.podcastEpisodes.season`, `podcast->podcastEpisodes`.`episode` AS `podcast.podcastEpisodes.episode`, `podcast->podcastEpisodes`.`episodeType` AS `podcast.podcastEpisodes.episodeType`, `podcast->podcastEpisodes`.`title` AS `podcast.podcastEpisodes.title`, `podcast->podcastEpisodes`.`subtitle` AS `podcast.podcastEpisodes.subtitle`, `podcast->podcastEpisodes`.`description` AS `podcast.podcastEpisodes.description`, `podcast->podcastEpisodes`.`pubDate` AS `podcast.podcastEpisodes.pubDate`, `podcast->podcastEpisodes`.`enclosureURL` AS `podcast.podcastEpisodes.enclosureURL`, `podcast->podcastEpisodes`.`enclosureSize` AS `podcast.podcastEpisodes.enclosureSize`, `podcast->podcastEpisodes`.`enclosureType` AS `podcast.podcastEpisodes.enclosureType`, `podcast->podcastEpisodes`.`publishedAt` AS `podcast.podcastEpisodes.publishedAt`, `podcast->podcastEpisodes`.`audioFile` AS `podcast.podcastEpisodes.audioFile`, `podcast->podcastEpisodes`.`chapters` AS `podcast.podcastEpisodes.chapters`, `podcast->podcastEpisodes`.`extraData` AS `podcast.podcastEpisodes.extraData`, `podcast->podcastEpisodes`.`createdAt` AS `podcast.podcastEpisodes.createdAt`, `podcast->podcastEpisodes`.`updatedAt` AS `podcast.podcastEpisodes.updatedAt`, `podcast->podcastEpisodes`.`podcastId` AS `podcast.podcastEpisodes.podcastId` FROM `libraryItems` AS `libraryItem` LEFT OUTER JOIN `books` AS `book` ON `libraryItem`.`mediaId` = `book`.`id` LEFT OUTER JOIN ( `bookAuthors` AS `book->authors->bookAuthor` INNER JOIN `authors` AS `book->authors` ON `book->authors`.`id` = `book->authors->bookAuthor`.`authorId`) ON `book`.`id` = `book->authors->bookAuthor`.`bookId` LEFT OUTER JOIN ( `bookSeries` AS `book->series->bookSeries` INNER JOIN `series` AS `book->series` ON `book->series`.`id` = `book->series->bookSeries`.`seriesId`) ON `book`.`id` = `book->series->bookSeries`.`bookId` LEFT OUTER JOIN `podcasts` AS `podcast` ON `libraryItem`.`mediaId` = `podcast`.`id` LEFT OUTER JOIN `podcastEpisodes` AS `podcast->podcastEpisodes` ON `podcast`.`id` = `podcast->podcastEpisodes`.`podcastId` WHERE `libraryItem`.`id` = '5287b99a-3afa-4410-a931-5e5f2edb701f' ORDER BY `book->authors->bookAuthor`.`createdAt` ASC, `book->series->bookSeries`.`createdAt` ASC;" }, sql: "SELECT `libraryItem`.`id`, `libraryItem`.`ino`, `libraryItem`.`path`, `libraryItem`.`relPath`, `libraryItem`.`mediaId`, `libraryItem`.`mediaType`, `libraryItem`.`isFile`, `libraryItem`.`isMissing`, `libraryItem`.`isInvalid`, `libraryItem`.`mtime`, `libraryItem`.`ctime`, `libraryItem`.`birthtime`, `libraryItem`.`size`, `libraryItem`.`lastScan`, `libraryItem`.`lastScanVersion`, `libraryItem`.`libraryFiles`, `libraryItem`.`extraData`, `libraryItem`.`createdAt`, `libraryItem`.`updatedAt`, `libraryItem`.`libraryId`, `libraryItem`.`libraryFolderId`, `book`.`id` AS `book.id`, `book`.`title` AS `book.title`, `book`.`titleIgnorePrefix` AS `book.titleIgnorePrefix`, `book`.`subtitle` AS `book.subtitle`, `book`.`publishedYear` AS `book.publishedYear`, `book`.`publishedDate` AS `book.publishedDate`, `book`.`publisher` AS `book.publisher`, `book`.`description` AS `book.description`, `book`.`isbn` AS `book.isbn`, `book`.`asin` AS `book.asin`, `book`.`language` AS `book.language`, `book`.`explicit` AS `book.explicit`, `book`.`abridged` AS `book.abridged`, `book`.`coverPath` AS `book.coverPath`, `book`.`duration` AS `book.duration`, `book`.`narrators` AS `book.narrators`, `book`.`audioFiles` AS `book.audioFiles`, `book`.`ebookFile` AS `book.ebookFile`, `book`.`chapters` AS `book.chapters`, `book`.`tags` AS `book.tags`, `book`.`genres` AS `book.genres`, `book`.`createdAt` AS `book.createdAt`, `book`.`updatedAt` AS `book.updatedAt`, `book->authors`.`id` AS `book.authors.id`, `book->authors`.`name` AS `book.authors.name`, `book->authors`.`lastFirst` AS `book.authors.lastFirst`, `book->authors`.`asin` AS `book.authors.asin`, `book->authors`.`description` AS `book.authors.description`, `book->authors`.`imagePath` AS `book.authors.imagePath`, `book->authors`.`createdAt` AS `book.authors.createdAt`, `book->authors`.`updatedAt` AS `book.authors.updatedAt`, `book->authors`.`libraryId` AS `book.authors.libraryId`, `book->series`.`id` AS `book.series.id`, `book->series`.`name` AS `book.series.name`, `book->series`.`nameIgnorePrefix` AS `book.series.nameIgnorePrefix`, `book->series`.`description` AS `book.series.description`, `book->series`.`createdAt` AS `book.series.createdAt`, `book->series`.`updatedAt` AS `book.series.updatedAt`, `book->series`.`libraryId` AS `book.series.libraryId`, `book->series->bookSeries`.`id` AS `book.series.bookSeries.id`, `book->series->bookSeries`.`sequence` AS `book.series.bookSeries.sequence`, `podcast`.`id` AS `podcast.id`, `podcast`.`title` AS `podcast.title`, `podcast`.`titleIgnorePrefix` AS `podcast.titleIgnorePrefix`, `podcast`.`author` AS `podcast.author`, `podcast`.`releaseDate` AS `podcast.releaseDate`, `podcast`.`feedURL` AS `podcast.feedURL`, `podcast`.`imageURL` AS `podcast.imageURL`, `podcast`.`description` AS `podcast.description`, `podcast`.`itunesPageURL` AS `podcast.itunesPageURL`, `podcast`.`itunesId` AS `podcast.itunesId`, `podcast`.`itunesArtistId` AS `podcast.itunesArtistId`, `podcast`.`language` AS `podcast.language`, `podcast`.`podcastType` AS `podcast.podcastType`, `podcast`.`explicit` AS `podcast.explicit`, `podcast`.`autoDownloadEpisodes` AS `podcast.autoDownloadEpisodes`, `podcast`.`autoDownloadSchedule` AS `podcast.autoDownloadSchedule`, `podcast`.`lastEpisodeCheck` AS `podcast.lastEpisodeCheck`, `podcast`.`maxEpisodesToKeep` AS `podcast.maxEpisodesToKeep`, `podcast`.`maxNewEpisodesToDownload` AS `podcast.maxNewEpisodesToDownload`, `podcast`.`coverPath` AS `podcast.coverPath`, `podcast`.`tags` AS `podcast.tags`, `podcast`.`genres` AS `podcast.genres`, `podcast`.`createdAt` AS `podcast.createdAt`, `podcast`.`updatedAt` AS `podcast.updatedAt`, `podcast->podcastEpisodes`.`id` AS `podcast.podcastEpisodes.id`, `podcast->podcastEpisodes`.`index` AS `podcast.podcastEpisodes.index`, `podcast->podcastEpisodes`.`season` AS `podcast.podcastEpisodes.season`, `podcast->podcastEpisodes`.`episode` AS `podcast.podcastEpisodes.episode`, `podcast->podcastEpisodes`.`episodeType` AS `podcast.podcastEpisodes.episodeType`, `podcast->podcastEpisodes`.`title` AS `podcast.podcastEpisodes.title`, `podcast->podcastEpisodes`.`subtitle` AS `podcast.podcastEpisodes.subtitle`, `podcast->podcastEpisodes`.`description` AS `podcast.podcastEpisodes.description`, `podcast->podcastEpisodes`.`pubDate` AS `podcast.podcastEpisodes.pubDate`, `podcast->podcastEpisodes`.`enclosureURL` AS `podcast.podcastEpisodes.enclosureURL`, `podcast->podcastEpisodes`.`enclosureSize` AS `podcast.podcastEpisodes.enclosureSize`, `podcast->podcastEpisodes`.`enclosureType` AS `podcast.podcastEpisodes.enclosureType`, `podcast->podcastEpisodes`.`publishedAt` AS `podcast.podcastEpisodes.publishedAt`, `podcast->podcastEpisodes`.`audioFile` AS `podcast.podcastEpisodes.audioFile`, `podcast->podcastEpisodes`.`chapters` AS `podcast.podcastEpisodes.chapters`, `podcast->podcastEpisodes`.`extraData` AS `podcast.podcastEpisodes.extraData`, `podcast->podcastEpisodes`.`createdAt` AS `podcast.podcastEpisodes.createdAt`, `podcast->podcastEpisodes`.`updatedAt` AS `podcast.podcastEpisodes.updatedAt`, `podcast->podcastEpisodes`.`podcastId` AS `podcast.podcastEpisodes.podcastId` FROM `libraryItems` AS `libraryItem` LEFT OUTER JOIN `books` AS `book` ON `libraryItem`.`mediaId` = `book`.`id` LEFT OUTER JOIN ( `bookAuthors` AS `book->authors->bookAuthor` INNER JOIN `authors` AS `book->authors` ON `book->authors`.`id` = `book->authors->bookAuthor`.`authorId`) ON `book`.`id` = `book->authors->bookAuthor`.`bookId` LEFT OUTER JOIN ( `bookSeries` AS `book->series->bookSeries` INNER JOIN `series` AS `book->series` ON `book->series`.`id` = `book->series->bookSeries`.`seriesId`) ON `book`.`id` = `book->series->bookSeries`.`bookId` LEFT OUTER JOIN `podcasts` AS `podcast` ON `libraryItem`.`mediaId` = `podcast`.`id` LEFT OUTER JOIN `podcastEpisodes` AS `podcast->podcastEpisodes` ON `podcast`.`id` = `podcast->podcastEpisodes`.`podcastId` WHERE `libraryItem`.`id` = '5287b99a-3afa-4410-a931-5e5f2edb701f' ORDER BY `book->authors->bookAuthor`.`createdAt` ASC, `book->series->bookSeries`.`createdAt` ASC;", parameters: {} } ``` ### Steps to reproduce the issue 1. Open the list of episodes for the podcast `https://radiofrance-podcast.net/podcast09/rss_19721.xml` 2. Select all of them 3. Wait for the download to run 4. The download queue stopped at 57 items left with this error ![image](https://github.com/advplyr/audiobookshelf/assets/1081566/212737b0-8ed7-485e-af7a-3010c135dcdf) ### Audiobookshelf version v2.5.0 ### How are you running audiobookshelf? Docker
adam added the bug label 2026-04-24 23:48:37 +02:00
adam closed this issue 2026-04-24 23:48:38 +02:00
Author
Owner

@marcaurele commented on GitHub (Nov 11, 2023):

I tried to download first ~55, it worked. Whend done I tried another ~40 and it crashed the same way.

@marcaurele commented on GitHub (Nov 11, 2023): I tried to download first ~55, it worked. Whend done I tried another ~40 and it crashed the same way.
Author
Owner

@marcaurele commented on GitHub (Nov 11, 2023):

It seems to keep crashing after having around 67 podcasts.

image

image

@marcaurele commented on GitHub (Nov 11, 2023): It seems to keep crashing after having around 67 podcasts. ![image](https://github.com/advplyr/audiobookshelf/assets/1081566/11322970-6809-44a6-b083-013da34086a3) ![image](https://github.com/advplyr/audiobookshelf/assets/1081566/04241ebc-6348-437a-9c0d-daec6cb3f8dc)
Author
Owner

@advplyr commented on GitHub (Nov 11, 2023):

Can you test disabling the watcher in server settings first?

@advplyr commented on GitHub (Nov 11, 2023): Can you test disabling the watcher in server settings first?
Author
Owner

@marcaurele commented on GitHub (Nov 11, 2023):

I just did a test, and got an error anyway. The logs are different with a 503 response from the podcast server. But strangely it crashed again after having 67 episodes locally

EDIT: I disabled the watcher on the library itself, but not at the server level.

[2023-11-11 19:50:25] ERROR: [ffmpegHelpers] Failed to download podcast episode with url "https://rf.proxycast.org/5729b8e4-4dcb-4d52-873c-46dca6379efc/19721-23.04.2021-ITEMA_22645181-2021F33264E0040-21.mp3" [AxiosError: Request failed with status code 503] {
  code: 'ERR_BAD_RESPONSE',
  config: {
    transitional: {
      silentJSONParsing: true,
      forcedJSONParsing: true,
      clarifyTimeoutError: false
    },
    adapter: [Function: httpAdapter],
    transformRequest: [ [Function: transformRequest] ],
    transformResponse: [ [Function: transformResponse] ],
    timeout: 30000,
    xsrfCookieName: 'XSRF-TOKEN',
    xsrfHeaderName: 'X-XSRF-TOKEN',
    maxContentLength: -1,
    maxBodyLength: -1,
    env: { FormData: [Function] },
    validateStatus: [Function: validateStatus],
    headers: {
      Accept: 'application/json, text/plain, */*',
      'User-Agent': 'axios/0.27.2'
    },
    url: 'https://rf.proxycast.org/5729b8e4-4dcb-4d52-873c-46dca6379efc/19721-23.04.2021-ITEMA_22645181-2021F33264E0040-21.mp3',
    method: 'get',
    responseType: 'stream',
    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: 'rf.proxycast.org',
      alpnProtocol: false,
      authorized: true,
      authorizationError: null,
      encrypted: true,
      _events: [Object: null prototype],
      _eventsCount: 9,
      connecting: false,
      _hadError: false,
      _parent: null,
      _host: 'rf.proxycast.org',
      _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: 30000,
      [Symbol(res)]: [TLSWrap],
      [Symbol(verified)]: true,
      [Symbol(pendingSession)]: null,
      [Symbol(async_id_symbol)]: 202643,
      [Symbol(kHandle)]: [TLSWrap],
      [Symbol(lastWriteQueueSize)]: 0,
      [Symbol(timeout)]: Timeout {
        _idleTimeout: 30000,
        _idlePrev: [TimersList],
        _idleNext: [TimersList],
        _idleStart: 2887003,
        _onTimeout: [Function: bound ],
        _timerArgs: undefined,
        _repeat: null,
        _destroyed: false,
        [Symbol(refed)]: false,
        [Symbol(kHasPrimitive)]: false,
        [Symbol(asyncId)]: 202651,
        [Symbol(triggerId)]: 202646
      },
      [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],
      [Symbol(RequestTimeout)]: undefined
    },
    _header: 'GET /5729b8e4-4dcb-4d52-873c-46dca6379efc/19721-23.04.2021-ITEMA_22645181-2021F33264E0040-21.mp3 HTTP/1.1\r\n' +
      'Accept: application/json, text/plain, */*\r\n' +
      'User-Agent: axios/0.27.2\r\n' +
      'Host: rf.proxycast.org\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,
    path: '/5729b8e4-4dcb-4d52-873c-46dca6379efc/19721-23.04.2021-ITEMA_22645181-2021F33264E0040-21.mp3',
....

image

@marcaurele commented on GitHub (Nov 11, 2023): I just did a test, and got an error anyway. The logs are different with a `503` response from the podcast server. But strangely it crashed again after having 67 episodes locally EDIT: I disabled the watcher on the library itself, but not at the server level. ``` [2023-11-11 19:50:25] ERROR: [ffmpegHelpers] Failed to download podcast episode with url "https://rf.proxycast.org/5729b8e4-4dcb-4d52-873c-46dca6379efc/19721-23.04.2021-ITEMA_22645181-2021F33264E0040-21.mp3" [AxiosError: Request failed with status code 503] { code: 'ERR_BAD_RESPONSE', config: { transitional: { silentJSONParsing: true, forcedJSONParsing: true, clarifyTimeoutError: false }, adapter: [Function: httpAdapter], transformRequest: [ [Function: transformRequest] ], transformResponse: [ [Function: transformResponse] ], timeout: 30000, xsrfCookieName: 'XSRF-TOKEN', xsrfHeaderName: 'X-XSRF-TOKEN', maxContentLength: -1, maxBodyLength: -1, env: { FormData: [Function] }, validateStatus: [Function: validateStatus], headers: { Accept: 'application/json, text/plain, */*', 'User-Agent': 'axios/0.27.2' }, url: 'https://rf.proxycast.org/5729b8e4-4dcb-4d52-873c-46dca6379efc/19721-23.04.2021-ITEMA_22645181-2021F33264E0040-21.mp3', method: 'get', responseType: 'stream', 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: 'rf.proxycast.org', alpnProtocol: false, authorized: true, authorizationError: null, encrypted: true, _events: [Object: null prototype], _eventsCount: 9, connecting: false, _hadError: false, _parent: null, _host: 'rf.proxycast.org', _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: 30000, [Symbol(res)]: [TLSWrap], [Symbol(verified)]: true, [Symbol(pendingSession)]: null, [Symbol(async_id_symbol)]: 202643, [Symbol(kHandle)]: [TLSWrap], [Symbol(lastWriteQueueSize)]: 0, [Symbol(timeout)]: Timeout { _idleTimeout: 30000, _idlePrev: [TimersList], _idleNext: [TimersList], _idleStart: 2887003, _onTimeout: [Function: bound ], _timerArgs: undefined, _repeat: null, _destroyed: false, [Symbol(refed)]: false, [Symbol(kHasPrimitive)]: false, [Symbol(asyncId)]: 202651, [Symbol(triggerId)]: 202646 }, [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], [Symbol(RequestTimeout)]: undefined }, _header: 'GET /5729b8e4-4dcb-4d52-873c-46dca6379efc/19721-23.04.2021-ITEMA_22645181-2021F33264E0040-21.mp3 HTTP/1.1\r\n' + 'Accept: application/json, text/plain, */*\r\n' + 'User-Agent: axios/0.27.2\r\n' + 'Host: rf.proxycast.org\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, path: '/5729b8e4-4dcb-4d52-873c-46dca6379efc/19721-23.04.2021-ITEMA_22645181-2021F33264E0040-21.mp3', .... ``` ![image](https://github.com/advplyr/audiobookshelf/assets/1081566/fc7e5469-6a81-4e2a-bf3c-00ba8adbd6e5)
Author
Owner

@marcaurele commented on GitHub (Nov 11, 2023):

I disabled at the server level the watcher, and got again the error after downloading 68 entries.

@marcaurele commented on GitHub (Nov 11, 2023): I disabled at the server level the watcher, and got again the error after downloading 68 entries.
Author
Owner

@advplyr commented on GitHub (Nov 11, 2023):

Are you storing the sqlite database on a NFS?
The database is wherever you mapped the /config directory. Is the mapping to a local drive?

@advplyr commented on GitHub (Nov 11, 2023): Are you storing the sqlite database on a NFS? The database is wherever you mapped the `/config` directory. Is the mapping to a local drive?
Author
Owner

@advplyr commented on GitHub (Nov 11, 2023):

I think this is the same as #2295 but you provided the full error logs.

@advplyr commented on GitHub (Nov 11, 2023): I think this is the same as #2295 but you provided the full error logs.
Author
Owner

@marcaurele commented on GitHub (Nov 11, 2023):

No I mount a local volume into the container, nothing fancy there.

@marcaurele commented on GitHub (Nov 11, 2023): No I mount a local volume into the container, nothing fancy there.
Author
Owner

@marcaurele commented on GitHub (Nov 11, 2023):

I have no issue with other podcasts, but for those librairies I never (yet) downloaded that many entries.

@marcaurele commented on GitHub (Nov 11, 2023): I have no issue with other podcasts, but for those librairies I never (yet) downloaded that many entries.
Author
Owner

@p6002 commented on GitHub (Nov 14, 2023):

The download is simply broken.
To download an episode of a podcast I have to restart the app sometimes several times.
Audiobook I won't download because it always contains several chapters and can't be downloaded individually. Always stuck while downloading the audiobook.
This is not a problem with my network. Other open source services based on media have no problem downloading to my phone.
The problem is definitely with autiobookschelf.
It's a pity. because it loses its meaning in my case, because in order to listen outside the house I consume the mobile data plan, since I can't download the audio the day before via wifi.

@p6002 commented on GitHub (Nov 14, 2023): The download is simply broken. To download an episode of a podcast I have to restart the app sometimes several times. Audiobook I won't download because it always contains several chapters and can't be downloaded individually. Always stuck while downloading the audiobook. This is not a problem with my network. Other open source services based on media have no problem downloading to my phone. The problem is definitely with autiobookschelf. It's a pity. because it loses its meaning in my case, because in order to listen outside the house I consume the mobile data plan, since I can't download the audio the day before via wifi.
Author
Owner

@advplyr commented on GitHub (Nov 18, 2023):

@p6002 This issue is specific to downloads on the server. I'm not sure what issue you are having with the mobile app since no one mentioned that before. That suggests the download is not simply broke but that you may be coming across a specific issue. You can try updating to the mobile app v0.9.67-beta released today. If you are still having issues you can provide more info and we can try to get to the bottom of it.

@advplyr commented on GitHub (Nov 18, 2023): @p6002 This issue is specific to downloads on the server. I'm not sure what issue you are having with the mobile app since no one mentioned that before. That suggests the download is not simply broke but that you may be coming across a specific issue. You can try updating to the mobile app v0.9.67-beta released today. If you are still having issues you can provide more info and we can try to get to the bottom of it.
Author
Owner

@p6002 commented on GitHub (Nov 20, 2023):

@advplyr The download stucks, I have to kill the app and try again to make it work.
I looked in the logs now and it just says user requested download, there is no error.
I would prefer, for example, the ability to mark several episodes for download, because there are often days that several episodes appear. The best if there was an option to automatically download files when they appear on the server.

image
@p6002 commented on GitHub (Nov 20, 2023): @advplyr The download stucks, I have to kill the app and try again to make it work. I looked in the logs now and it just says user requested download, there is no error. I would prefer, for example, the ability to mark several episodes for download, because there are often days that several episodes appear. The best if there was an option to automatically download files when they appear on the server. <img width="520" alt="image" src="https://github.com/advplyr/audiobookshelf/assets/74392057/12324d38-d32a-498e-8a73-fcf8cc1a769d">
Author
Owner

@marcaurele commented on GitHub (Nov 20, 2023):

@p6002 this is not the same issue as I have, and described here. My case is the server is not able to download the episodes from the source. Please open a different ticket if you want to continue the discussion as I do not think the solution will cover the 2 issues.

@marcaurele commented on GitHub (Nov 20, 2023): @p6002 this is not the same issue as I have, and described here. My case is the server is not able to download the episodes from the source. Please open a different ticket if you want to continue the discussion as I do not think the solution will cover the 2 issues.
Author
Owner

@marcaurele commented on GitHub (Jan 7, 2024):

@advplyr I tried again with the latest version https://github.com/advplyr/audiobookshelf/releases/tag/v2.7.1 and it's working correctly now. So one of the changes related to the many podcast or download has fixed this issue too.

@marcaurele commented on GitHub (Jan 7, 2024): @advplyr I tried again with the latest version https://github.com/advplyr/audiobookshelf/releases/tag/v2.7.1 and it's working correctly now. So one of the changes related to the many podcast or download has fixed this issue too.
Author
Owner

@marcaurele commented on GitHub (Jan 7, 2024):

Hmmm, no it is not fixed. I tried to download a bunch of podcast for my kids and it failed but after a larger number of items. The error is still the same.

@marcaurele commented on GitHub (Jan 7, 2024): Hmmm, no it is not fixed. I tried to download a bunch of podcast for my kids and it failed but after a larger number of items. The error is still the same.
Author
Owner

@marcaurele commented on GitHub (Feb 24, 2024):

I tried again with the 2.8.0 release and it's gone, I could not reproduce it on a fresh docker execution, downloading this whole podcast series I had in the example. I saw as well the change on the crash log, so in case something similar happens I would dig into that.
Thanks for the awesome work @advplyr !

@marcaurele commented on GitHub (Feb 24, 2024): I tried again with the 2.8.0 release and it's gone, I could not reproduce it on a fresh docker execution, downloading this whole podcast series I had in the example. I saw as well the change on the crash log, so in case something similar happens I would dig into that. Thanks for the awesome work @advplyr !
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: starred/audiobookshelf#1521