[PR #5052] [CLOSED] Add placholder books #4405

Closed
opened 2026-04-25 00:19:37 +02:00 by adam · 0 comments
Owner

📋 Pull Request Information

Original PR: https://github.com/advplyr/audiobookshelf/pull/5052
Author: @JensBickel
Created: 2/12/2026
Status: Closed

Base: masterHead: add-placholder-books


📝 Commits (6)

  • 96de890 test(placeholders): add server coverage for placeholder creation, serialization, and query visibility
  • dc52a6b feat(db): add libraryItems.isPlaceholder migration and model serialization support
  • c0d9dc4 feat(series): add placeholder creation endpoint and reuse existing cover flow
  • 2a775d4 feat(server): promote placeholders on scan and enforce visibility rules across list/search/author-series contexts
  • fc325a4 feat(client): add placeholder UX for series/upload flows, card styling/action guards, and localized strings
  • 5ae65d3 fix(placeholders): avoid false promotion on upload

📊 Changes

43 files changed (+3305 additions, -44 deletions)

View changed files

📝 client/components/app/BookShelfToolbar.vue (+32 -0)
📝 client/components/app/LazyBookshelf.vue (+13 -0)
📝 client/components/cards/ItemUploadCard.vue (+38 -2)
📝 client/components/cards/LazyBookCard.vue (+70 -6)
📝 client/components/cards/LazySeriesCard.vue (+5 -1)
client/cypress/tests/components/app/BookShelfToolbar.placeholder.cy.js (+147 -0)
📝 client/cypress/tests/components/cards/LazyBookCard.cy.js (+28 -0)
📝 client/cypress/tests/components/cards/LazySeriesCard.cy.js (+13 -0)
client/cypress/tests/components/pages/Upload.placeholder.cy.js (+122 -0)
📝 client/pages/author/_id.vue (+23 -1)
📝 client/pages/upload/index.vue (+75 -2)
📝 client/strings/en-us.json (+15 -1)
📝 docs/controllers/AuthorController.yaml (+40 -0)
📝 docs/controllers/LibraryController.yaml (+48 -0)
📝 docs/objects/LibraryItem.yaml (+3 -0)
📝 docs/root.yaml (+4 -0)
📝 package-lock.json (+2 -2)
📝 package.json (+6 -1)
📝 server/controllers/AuthorController.js (+191 -0)
📝 server/controllers/FileSystemController.js (+13 -3)

...and 23 more files

📄 Description

Brief summary

I found the placeholder issue/feature request on GitHub and I found the placeholder feature request on GitHub and implemented a first version of it.
See: https://github.com/advplyr/audiobookshelf/issues/3221

This PR adds manually creatable placeholders for existing book series and at the author level.

Which issue is fixed?

closes #3221

In-depth Description

This implementation allows users with upload permission to add placeholders at both the author and series levels.

Placeholders are tracked in the database and can be selected as upload targets, which allows in-place promotion to a real library item during upload.
This makes it possible to prepare and organize incomplete series entries before media files are available.
When a matching upload is completed, the placeholder is reused instead of creating a duplicate item, keeping metadata continuity.

Placeholders are visually distinct from regular books.

The implementation is backed by the file system to closely match the behavior of real books.

How have you tested this?

I added unit tests for the newly introduced code and manually tested the behavior in two browsers.
I verified that placeholders can be created from both author and series views and appear with distinct placeholder styling in the UI.
I also validated the upload flow by targeting an existing placeholder and confirming it is promoted in place to a regular library item without creating duplicates.

Screenshots

Before
After
Details


🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.

## 📋 Pull Request Information **Original PR:** https://github.com/advplyr/audiobookshelf/pull/5052 **Author:** [@JensBickel](https://github.com/JensBickel) **Created:** 2/12/2026 **Status:** ❌ Closed **Base:** `master` ← **Head:** `add-placholder-books` --- ### 📝 Commits (6) - [`96de890`](https://github.com/advplyr/audiobookshelf/commit/96de890bddafcbbbb9c749e71a55fbdfc3e82bf0) test(placeholders): add server coverage for placeholder creation, serialization, and query visibility - [`dc52a6b`](https://github.com/advplyr/audiobookshelf/commit/dc52a6b2d336a30029695fc6bdebcaf4cf86d63b) feat(db): add libraryItems.isPlaceholder migration and model serialization support - [`c0d9dc4`](https://github.com/advplyr/audiobookshelf/commit/c0d9dc4e775f279e553c4dcb82b4b94478ebd0e0) feat(series): add placeholder creation endpoint and reuse existing cover flow - [`2a775d4`](https://github.com/advplyr/audiobookshelf/commit/2a775d434abf1a9f8c7719a1f27d79a4c21936d2) feat(server): promote placeholders on scan and enforce visibility rules across list/search/author-series contexts - [`fc325a4`](https://github.com/advplyr/audiobookshelf/commit/fc325a409567447f2e3e0abc9c5b2e1c68067343) feat(client): add placeholder UX for series/upload flows, card styling/action guards, and localized strings - [`5ae65d3`](https://github.com/advplyr/audiobookshelf/commit/5ae65d31dd8d8843ca7c6a8e4f208efbdef511e4) fix(placeholders): avoid false promotion on upload ### 📊 Changes **43 files changed** (+3305 additions, -44 deletions) <details> <summary>View changed files</summary> 📝 `client/components/app/BookShelfToolbar.vue` (+32 -0) 📝 `client/components/app/LazyBookshelf.vue` (+13 -0) 📝 `client/components/cards/ItemUploadCard.vue` (+38 -2) 📝 `client/components/cards/LazyBookCard.vue` (+70 -6) 📝 `client/components/cards/LazySeriesCard.vue` (+5 -1) ➕ `client/cypress/tests/components/app/BookShelfToolbar.placeholder.cy.js` (+147 -0) 📝 `client/cypress/tests/components/cards/LazyBookCard.cy.js` (+28 -0) 📝 `client/cypress/tests/components/cards/LazySeriesCard.cy.js` (+13 -0) ➕ `client/cypress/tests/components/pages/Upload.placeholder.cy.js` (+122 -0) 📝 `client/pages/author/_id.vue` (+23 -1) 📝 `client/pages/upload/index.vue` (+75 -2) 📝 `client/strings/en-us.json` (+15 -1) 📝 `docs/controllers/AuthorController.yaml` (+40 -0) 📝 `docs/controllers/LibraryController.yaml` (+48 -0) 📝 `docs/objects/LibraryItem.yaml` (+3 -0) 📝 `docs/root.yaml` (+4 -0) 📝 `package-lock.json` (+2 -2) 📝 `package.json` (+6 -1) 📝 `server/controllers/AuthorController.js` (+191 -0) 📝 `server/controllers/FileSystemController.js` (+13 -3) _...and 23 more files_ </details> ### 📄 Description ## Brief summary I found the placeholder issue/feature request on GitHub and I found the placeholder feature request on GitHub and implemented a first version of it. See: https://github.com/advplyr/audiobookshelf/issues/3221 This PR adds manually creatable placeholders for existing book series and at the author level. ## Which issue is fixed? closes #3221 ## In-depth Description This implementation allows users with upload permission to add placeholders at both the author and series levels. Placeholders are tracked in the database and can be selected as upload targets, which allows in-place promotion to a real library item during upload. This makes it possible to prepare and organize incomplete series entries before media files are available. When a matching upload is completed, the placeholder is reused instead of creating a duplicate item, keeping metadata continuity. Placeholders are visually distinct from regular books. The implementation is backed by the file system to closely match the behavior of real books. ## How have you tested this? I added unit tests for the newly introduced code and manually tested the behavior in two browsers. I verified that placeholders can be created from both author and series views and appear with distinct placeholder styling in the UI. I also validated the upload flow by targeting an existing placeholder and confirming it is promoted in place to a regular library item without creating duplicates. ## Screenshots ![Before](https://github.com/user-attachments/assets/d1a81214-557a-44f3-b330-9f5d361680b7) ![After](https://github.com/user-attachments/assets/8f9ffc45-7c2f-4260-80b9-8bf53a5e4bba) ![Details](https://github.com/user-attachments/assets/3c560db3-ab33-4e6c-9959-fa9b1e44ec3a) --- <sub>🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.</sub>
adam added the pull-request label 2026-04-25 00:19:37 +02:00
adam closed this issue 2026-04-25 00:19:37 +02:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: starred/audiobookshelf#4405