From 61124661b8ce8df4c8076be008beb9d80dbae794 Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 5 Oct 2026 02:01:32 +0000 Subject: [PATCH] docs: v1.2.0 changelog and docs for the queue, Wanted and MAM changes - CHANGELOG: v1.2.0, covering #49-#63. - Saved for Later: the Queued and Wanted pages, queue order and dragging, per-release automatic downloads, the 100 MB ratio exception, and Show Downloads When Queued. - MyAnonamouse: the top-bar button (two-decimal ratio, slot countdown), the 2-minute slot check, torrents already in the client, and lag counting. - Audiobookshelf: the 240-byte name limit and "et al." narrator lists. - Library: Library is in the left navigation; content type is in the search bar. - Troubleshooting: replaces the TODO with name-too-long, expired-link, slot-wait and queued-book entries. - environment-variables.md regenerated (Saved for Later settings, Show Downloads When Queued). Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01V88DbAixT45r3AJsyFJchY --- CHANGELOG.md | 79 +++++++++++++++++++++++++++++++ docs/audiobookshelf.md | 2 + docs/environment-variables.md | 36 +++++++++++++- docs/library-check.md | 6 +-- docs/myanonamouse-enrichment.md | 13 +++--- docs/saved-for-later.md | 83 +++++++++++++++++++++------------ docs/troubleshooting.md | 34 +++++++++++++- 7 files changed, 210 insertions(+), 43 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7d8a0adf7..6c2fb3c49 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,85 @@ Releases of this fork. Images: `ghcr.io/mikaeltarquin/shelfmark:` and `:latest`. +## v1.2.0 + +### Added + +**A Sonarr/Radarr-style layout** +- **Left navigation and a search bar that's always there**: Search, Library, Activity + (Queued, Downloads, Requests, History), Wanted, Settings and System, each a page with + its own address. The open section lists its pages, with counts. On a phone it's a menu. +- **Tables for Activity, Wanted and the Library**, with sortable columns. +- **Settings is a page**, its tabs grouped into sections (Indexers, Download Clients with + Torrent and Usenet tabs, Libraries, Notifications…). **System** has the version, + health and support links. +- **A theme button** in the top bar: Light, Dark or Auto. +- Links, images and install commands point at this fork. + +**The download queue** +- **Activity → Queued is everything waiting, in order**: **Up next** (downloads waiting + to start, such as a MyAnonamouse torrent waiting for an unsatisfied slot) and then + **Waiting for room** (saved picks), numbered in the order they go. Drag a row, or use + its arrows, to reorder either list. +- **Each saved pick shows** its releases (one per line, with the narrator and a link to + the release on MyAnonamouse), what it's **Waiting for**, when it was **Last checked** + and a countdown to the **Next check**. +- **Each release goes on its own**: a freeleech torrent or a small ebook downloads as soon + as there's room, instead of waiting for a big audiobook picked with it. An ebook that + goes first is still filed with its audiobooks. +- **Wanted** (formerly Later) has **Choose releases** on each book; once you pick, the book + moves to the queue. +- **Titles and covers on Queued and Wanted open the book's details.** + +**Activity** +- **Finished downloads go straight to History**, and History is kept (it can't be + cleared). Clear Completed is gone. +- **Narrators** are listed under the author in Queued, Downloads and History, so two + recordings of a book can be told apart. +- **Open in your library from History** (Audiobookshelf or Calibre-Web), with or + without login. +- **Calmer badges**: counts beside Activity and its pages are soft tints, not red, and + queued downloads count on Queued, not twice. + +**MyAnonamouse** +- **Next slot countdown** in the MyAnonamouse button. +- **The ratio shows two decimals**, worked out from the exact bytes uploaded and + downloaded. + +**Library** +- Books in several series are listed under each of them (*Rhythm of War* in both The + Cosmere and The Stormlight Archive). +- **My Account → Library** sets the tab the Library opens on and each tab's sort. +- Box sets, omnibuses and collections are left out of missing books (My Account can show + them), and so are missing books numbered like one you already hold in the series. +- Narrator badges name the first narrator and a count ("Andrew Scott +9"). + +### Changed +- **Show Downloads When Queued** is off by default and only applies to downloads you + start. Background changes to the queue never move you to another page. +- Downloads waiting for an unsatisfied slot are checked every 2 minutes (was 5). + +### Fixed +- **"Download failed: OSError"**: an audiobook with a large cast made a narrator folder + name too long for the filesystem. Names are now kept to 240 bytes, ending a long + narrator list with "et al.", and errors say what went wrong ("File name too long"). +- **Non-freeleech audiobooks downloaded automatically below Keep Ratio At Least**: the + "barely moves the ratio" exception let through anything that lowered it by less than + 0.01, which on a large account is a 500 MB audiobook. It now covers only ebook-sized + downloads (100 MB or less). +- **Automatic downloads stopped short of the unsatisfied limit** (stalling at 132/150 + with 5 slots kept free): recent snatches were counted again after MAM's own count + already included them. +- **Retrying a MyAnonamouse download that was already in the torrent client** waited for + an unsatisfied slot it didn't need. +- **Expired indexer links** are re-found more often: the refresh searches the way the + book search did, then by title and author, so short titles like *Eric* are found. + +### Upgrading +Activity's Later tab is now **Wanted** in the navigation; update bookmarks to the old +pages. Folders an earlier version left half-made after an "OSError" failure aren't cleaned +up; delete them and retry the download. + ## v1.1.0 ### Added diff --git a/docs/audiobookshelf.md b/docs/audiobookshelf.md index 795756e4e..406a686e5 100644 --- a/docs/audiobookshelf.md +++ b/docs/audiobookshelf.md @@ -20,6 +20,8 @@ Audiobook templates can use `{Narrator}`. Narrators come from [MyAnonamouse Enri Several narrators are joined with **Narrator Separator** (`NARRATOR_SEPARATOR`): `&` (default) gives `Narrator Two & Narrator Three`, `,` gives `Narrator Two, Narrator Three`. +Folder and file names are kept to 240 bytes, under the 255-byte limit of most filesystems. A full-cast recording with a dozen narrators would go over it, so its list is cut after the last whole name that fits and ends with `et al.` (`Book Title {Martin Jarvis & Peter Serafinowicz & … et al.}`). Any other value that's too long (a very long title, say) is cut at a word. + Braces nested inside a template block are kept as text, so `{{Narrator}}` renders `{Narrator One}` and disappears entirely when there is no narrator (the space before it is trimmed too). The recommended audiobook **Path Template** is: ``` diff --git a/docs/environment-variables.md b/docs/environment-variables.md index 384f183c8..c1cdc2eb3 100644 --- a/docs/environment-variables.md +++ b/docs/environment-variables.md @@ -536,7 +536,7 @@ Audiobooks only. AudiobookBay lists it for most releases. In Prowlarr results it | `EBOOKS_WITH_AUDIOBOOKS` | Audiobookshelf shows an ebook and an audiobook as one item when they share a folder. Also place each downloaded ebook in the folder of every audiobook of the same book (one per narrator), and copy an existing ebook into a newly downloaded audiobook's folder. Ebooks with no audiobook yet go to the audiobook path without a narrator and move in when the first audiobook arrives. Uses the audiobook Path Template, so include {Narrator} to keep narrations apart. | boolean | `false` | | `WRITE_AUDIOBOOKSHELF_OPF` | Save a metadata.opf with Shelfmark's title, authors, narrators, year and series into each audiobook folder (and the ebooks kept with them) before the files arrive. Audiobookshelf prefers it over the release's own tags, so every book of a series imports with the same series name and number. Edits made in Audiobookshelf still take precedence. Folders that already have an .opf are left alone. | boolean | `false` | | `HARDLINK_TORRENTS_AUDIOBOOK` | Create hardlinks instead of copying. Preserves seeding but archives won't be extracted. Don't use if destination is a library ingest folder. | boolean | `true` | -| `AUTO_OPEN_DOWNLOADS_SIDEBAR` | Go to Activity > Downloads when a new download is queued. | boolean | `false` | +| `AUTO_OPEN_DOWNLOADS_SIDEBAR` | When you start a download, go to the Activity page that lists it (Queued or Downloads). Downloads queued in the background never move the page. | boolean | `false` | | `DOWNLOAD_TO_BROWSER_CONTENT_TYPES` | Automatically download completed files to your browser for the selected content types. | string (comma-separated) | _empty list_ | | `MAX_CONCURRENT_DOWNLOADS` | Maximum number of simultaneous downloads. | number | `3` | | `STATUS_TIMEOUT` | How long to keep completed/failed downloads in the queue display. | number | `3600` | @@ -852,7 +852,7 @@ Create hardlinks instead of copying. Preserves seeding but archives won't be ext **Show Downloads When Queued** -Go to Activity > Downloads when a new download is queued. +When you start a download, go to the Activity page that lists it (Queued or Downloads). Downloads queued in the background never move the page. - **Type:** boolean - **Default:** `false` @@ -1357,6 +1357,9 @@ How long to cache individual book details. Default: 600 (10 minutes). Max: 60480 | `MAM_BLOCK_ON_LOW_BUFFER` | Before queueing MyAnonamouse torrents, check that they fit in the account's buffer (uploaded minus downloaded), counting Shelfmark's MAM downloads that are still active. If not, admins are offered upload credit to buy first; other users are asked to contact an admin. Freeleech torrents don't count. If MAM can't be reached, downloads go ahead. | boolean | `true` | | `MAM_BLOCK_ON_UNSAT_LIMIT` | MyAnonamouse limits how many torrents can be unsatisfied (not yet seeded 72 hours) at once, by user class. Before queueing MAM torrents (freeleech too), check that they, plus Shelfmark's MAM downloads not yet started, leave the slots below free. Buying upload credit doesn't help here; wait for torrents to finish seeding. | boolean | `true` | | `MAM_UNSAT_RESERVE_SLOTS` | Hold back downloads that would leave fewer free unsatisfied slots than this. | number | `5` | +| `SAVED_AUTO_GET_ENABLED` | Turn off to pause every automatic download; items stay marked. | boolean | `true` | +| `SAVED_AUTO_GET_TARGET_RATIO` | Non-freeleech downloads that would take the ratio below this wait, unless they're ebook-sized (100 MB or less) and lower it by less than 0.01. 0 turns the ratio check off. | number | `2.0` | +| `SAVED_AUTO_GET_INTERVAL_MINUTES` | How often to check the marked items. At least 5. | number | `10` | | `MAM_AUTOBUY_RATIO_ENABLED` | Buy once per check while the ratio is below the threshold. | boolean | `false` | | `MAM_AUTOBUY_RATIO_THRESHOLD` | Buy when the ratio is below this. 2.0 is MAM's minimum for renewing VIP; 1.0 is the site minimum. | number | `2.0` | | `MAM_AUTOBUY_RATIO_AMOUNT` | How much to buy each time, in multiples of 50 GB. | number | `50` | @@ -1484,6 +1487,35 @@ Hold back downloads that would leave fewer free unsatisfied slots than this. - **Default:** `5` - **Constraints:** min: 0 +#### `SAVED_AUTO_GET_ENABLED` + +**Get Saved Books Automatically** + +Turn off to pause every automatic download; items stay marked. + +- **Type:** boolean +- **Default:** `true` + +#### `SAVED_AUTO_GET_TARGET_RATIO` + +**Keep Ratio At Least** + +Non-freeleech downloads that would take the ratio below this wait, unless they're ebook-sized (100 MB or less) and lower it by less than 0.01. 0 turns the ratio check off. + +- **Type:** number +- **Default:** `2.0` +- **Constraints:** min: 0 + +#### `SAVED_AUTO_GET_INTERVAL_MINUTES` + +**Check Every (Minutes)** + +How often to check the marked items. At least 5. + +- **Type:** number +- **Default:** `10` +- **Constraints:** min: 5 + #### `MAM_AUTOBUY_RATIO_ENABLED` **Buy When Ratio Is Low** diff --git a/docs/library-check.md b/docs/library-check.md index 742ba7fe5..98ce27a2c 100644 --- a/docs/library-check.md +++ b/docs/library-check.md @@ -50,7 +50,7 @@ so its items are re-read at most every ten minutes. ## Browsing the library -With a library connected, admins get a **Library** button in the header. It shows every +With a library connected, admins get **Library** in the left navigation. It shows every book in the connected libraries as a cover grid, with a filter (title, author, series or narrator), a format filter (ebook, audiobook, or both) and sorting by title, author or recently added. A book held by both libraries, say the ebook in Calibre and the audiobook @@ -70,7 +70,7 @@ series name anywhere opens its page, and each page has its own address Books you own work like search results: hover a card for **details** and the **Hardcover lists** button, and **+ Get** underneath finds releases, in the format picked -in the header (or both, in combined mode). Use it to get the format you're missing, a +in the search bar (or both, in combined mode). Use it to get the format you're missing, a better copy, or another narrator's version; releases whose narrator you already own are marked. The card looks the book up with the metadata provider the first time it's hovered (by ISBN, else title and author), and the answer is remembered. @@ -79,7 +79,7 @@ Below the books you own, author and series pages list what is **Not in your libr the books the metadata provider knows for that author or series, minus the ones you have. Pick **Any format**, **Ebook** or **Audiobook**: under Audiobook, a book you own only as an ebook still shows (with a "Have ebook" badge). Picking Ebook or Audiobook also switches -the header's content type, so **Get** on a missing book finds releases in that format; +the search bar's content type, so **Get** on a missing book finds releases in that format; it opens the usual release (or request) flow. Series need a provider that can list a series (Hardcover); with Hardcover an author is looked up by their Hardcover id, so the list is their own books. Up to 200 books are listed per author or series. diff --git a/docs/myanonamouse-enrichment.md b/docs/myanonamouse-enrichment.md index 78e6f6294..6099b0f43 100644 --- a/docs/myanonamouse-enrichment.md +++ b/docs/myanonamouse-enrichment.md @@ -45,10 +45,11 @@ After a failed request (a 403, a timeout, an unexpected reply), Shelfmark waits ## Account panel -With a MAM session ID set, admins get a **MyAnonamouse** button in the header, between -Library and Activity. It shows the account's ratio and unsatisfied count at a glance (amber -or red as they near their limits, refreshed every 5 minutes), and opens a panel with links -to your MAM profile and the MAM store. The panel shows: +With a MAM session ID set, admins get a **MyAnonamouse** button in the top bar. It shows the account's ratio (to two +decimals, worked out from the exact bytes uploaded and downloaded rather than MAM's rounded +figures) and unsatisfied count at a glance (amber or red as they near their limits, +refreshed every 5 minutes), plus a countdown to the next unsatisfied slot freeing up, and +opens a panel with links to your MAM profile and the MAM store. The panel shows: - **Account:** ratio, buffer (uploaded − downloaded), bonus points, uploaded, downloaded, class, VIP expiry and unsatisfied torrents against your class's limit (amber at 90%, red at the limit), from MAM's `jsonLoad.php?snatch_summary`. Refreshed at most once a minute unless you press **Refresh**. - **Points / hour:** MAM's API has no earning rate, so Shelfmark estimates it from its own readings of your balance (taken hourly, kept for two days) over the last 24 hours. Points Shelfmark spent on upload credit are added back; a period where points dropped for another reason (spending on MAM's site) or hit MAM's 99,999 cap is left out. It shows once a few hours of readings exist. @@ -87,11 +88,11 @@ Under **Settings > Prowlarr > Upload Credit Auto-Buy**, Shelfmark can spend bonu MyAnonamouse limits how many torrents can be unsatisfied (not yet seeded 72 hours) at once, by class. With **Hold Back Downloads at the Unsatisfied Limit** (`MAM_BLOCK_ON_UNSAT_LIMIT`, on by default), MAM torrents are held back when they, plus Shelfmark's MAM downloads not yet handed to the torrent client, would leave fewer free slots than **Unsatisfied Slots to Keep Free** (`MAM_UNSAT_RESERVE_SLOTS`, 5). Every MAM torrent counts, freeleech too. Upload credit can't fix this, so none is offered: wait for torrents to finish seeding or pick fewer. The projected-ratio line also shows `unsatisfied 94 → 98 / 100`, red when the picks would be held back. -A MAM download that's short only of unsatisfied slots doesn't have to be held back or fail. The hold-back prompt offers **Queue and wait for a slot**. A queued MAM download whose turn comes while the account is full, counting the slots kept free (or whose grab MAM refuses while at the limit), goes back to the queue as **Waiting for an unsatisfied slot on MyAnonamouse**. Waiting downloads are released, longest waiting first, once a slot is free (checked every 5 minutes). Shelfmark's own snatches since shortly before the account was read count too, since MAM's figure lags. Cancel it from Activity to drop it. Waiting downloads don't survive a restart; they show as interrupted, with Retry. +A MAM download that's short only of unsatisfied slots doesn't have to be held back or fail. The hold-back prompt offers **Queue and wait for a slot**. A queued MAM download whose turn comes while the account is full, counting the slots kept free (or whose grab MAM refuses while at the limit), goes back to the queue as **Waiting for an unsatisfied slot on MyAnonamouse**. Waiting downloads are released, longest waiting first, once a slot is free (checked every 2 minutes), in their order on **Activity → Queued**. A torrent already in your torrent client (a retry after it was handed over) doesn't wait for a slot: it already has one. Shelfmark's own snatches that MAM's count doesn't show yet count too, since MAM's figure lags; once MAM's count has caught up they aren't counted a second time. Cancel it from Activity to drop it. Waiting downloads don't survive a restart; they show as interrupted, with Retry. ### When slots free up -The account panel (and the header button's tooltip) also estimates when unsatisfied +The account panel (and the top-bar button and its tooltip) also estimates when unsatisfied torrents free their slots: `Next slot in 2:05 · 3 slots in the next 6 hours`. MAM's API only reports how many torrents are unsatisfied, so the timing comes from your torrent client: each MyAnonamouse torrent it is seeding that hasn't reached 72 hours frees a slot diff --git a/docs/saved-for-later.md b/docs/saved-for-later.md index a6e878852..acf7b6ad8 100644 --- a/docs/saved-for-later.md +++ b/docs/saved-for-later.md @@ -21,59 +21,80 @@ A book is saved once. Saving it again with a release replaces the earlier pick, saving it again on its own keeps the pick. A filled bookmark means the book (or, on a release row, that release) is saved; click it again to remove it. -## Saved for later, or queued for download +## Queued, or Wanted A saved item is one of two things, marked on books everywhere they show: -- **Saved for later** (amber bookmark): a book with no release picked yet, or picks you'll - get by hand. +- **Wanted** (amber bookmark): a book with no release picked yet, or picks that couldn't + be queued (the error says why). - **Queued** (blue): releases are picked and it downloads on its own once there's room (see below). Picking releases queues them straight away when **Get Saved Books Automatically** is on. -## The Queued and Later tabs +## The Queued and Wanted pages -**Activity → Queued** and **Activity → Later** list your saved books, with what each will download ("Ebook EPUB + -audiobook, Narrator Name", or "Book only"). **+ Get** downloads it through the usual path: -the MyAnonamouse buffer and unsatisfied checks still apply, and for users who need -approval it becomes a request. A book saved on its own opens its releases instead. +**Activity → Queued** is everything waiting to download, in the order it goes: + +- **Up next**: downloads already handed to Shelfmark that haven't started, such as a + MyAnonamouse torrent waiting for an unsatisfied slot. They're numbered in the order they + start; drag a row by its handle (or use the arrows) to change it. +- **Waiting for room**: saved picks, numbered after them, each showing its **Releases** (one line per + release, with the format, narrator and a link to its page at the source, the torrent on + MyAnonamouse for example), what it's **Waiting for**, when it was **Last checked** and a + countdown to the **Next check**. Drag these to reorder them too: earlier ones get free + room first. **+ Get** downloads one now without waiting; **Remove** drops it. + +**Wanted** lists books saved without picks. **Choose releases** opens the release list; +pick and save, and the book moves to Queued. Rows with picks that couldn't be queued +have **Choose again** and **+ Get**. + +**+ Get** downloads through the usual path: the MyAnonamouse buffer and unsatisfied +checks still apply, and for users who need approval it becomes a request. Titles and +covers on either page open the book's details. A book leaves Saved once it's downloaded: on Get, or when you download it (or one of its picked releases) any other way. ## Getting automatically -A saved item with picked releases can download on its own once it makes sense to. It's -queued as it's saved; in **Activity → Queued**, untick **Queue for download** to keep it for -later instead, or tick it on an older pick. A background check (every 10 minutes by -default, and a few seconds after you tick it) gets it once: +A background check (every 10 minutes by default, and a few seconds after you queue +something) goes through the queue in order. Each release in an item is weighed on its +own, cheapest first (not on MyAnonamouse, then freeleech, then by size), so a freeleech +torrent or a small ebook isn't held back by a big audiobook picked with it. A release +goes once: -- its MyAnonamouse torrents fit the buffer and the unsatisfied limit, the same check as a - manual download (keeping the slots set in **Unsatisfied Slots to Keep Free**); +- its MyAnonamouse torrent fits the buffer and the unsatisfied limit together with the + releases already going, the same check as a manual download (keeping the slots set in + **Unsatisfied Slots to Keep Free**); - you could download it directly, without a request (users who need approval use **Get**); -- it won't drag your ratio down, by one rule for every item: +- it won't drag your ratio down: - **Freeleech** torrents go as soon as there's room, since they can't lower the ratio. Freeleech is checked live on MyAnonamouse at each check, so a site-wide freeleech, a personal freeleech wedge, or VIP freeleech (for a VIP account) all count; - anything else goes when the ratio stays at **Keep Ratio At Least** (2.0 by default) with this download and Shelfmark's other active MAM downloads counted in full, or - when it's small enough to barely move the ratio (less than 0.01, an ebook say); + when it's ebook-sized (100 MB or less) and lowers the ratio by less than 0.01; - otherwise it waits until the ratio allows it or the torrent turns freeleech, whichever comes first. -Upload credit is never bought for an automatic download. Items are checked in the order -they were saved, so earlier ones get free slots first. Each item shows why it's still +Upload credit is never bought for an automatic download. Each item shows why it's still waiting ("Waiting for 2 unsatisfied slots", "Waiting for freeleech or ratio 2.00: 1.20 GB -would take it from 1.84 to 1.81") and when it was last checked. If MyAnonamouse can't be -read, items wait rather than risk the account. Releases -that aren't MyAnonamouse torrents have nothing to wait for and download at the next check. - -Once it's queued, the item leaves Saved, a toast says so, and a **Saved book got -automatically** notification goes out to notification routes subscribed to that event -(or to **All**). If part of a combined pick can't be queued, the rest still downloads and -what's left stays saved with the error, with automatic downloading turned off. - -**Settings → Prowlarr → Saved for Later** has the global switch (**Get Saved Books -Automatically**, on by default; turning it off pauses every item without unmarking it), -**Keep Ratio At Least** (0 turns the ratio check off) and the check interval (at least 5 -minutes). +would take it from 1.84 to 1.81"). If MyAnonamouse can't be read, its torrents wait +rather than risk the account. Releases that aren't MyAnonamouse torrents have nothing to +wait for and download at the next check. + +When some of an item's releases go and others wait, the ones that went download now and +the rest stay queued. An ebook that goes ahead of its audiobooks is still filed in their +narrator folders (see [Keeping ebooks with audiobooks](audiobookshelf.md#keeping-ebooks-with-audiobooks)). +Once everything has gone the item leaves Saved. Each time, a toast says so and a **Saved +book got automatically** notification goes out to notification routes subscribed to that +event (or to **All**). If a release can't be queued, the error shows on the item. + +Queuing something doesn't take you away from the page you're on. **Show Downloads When +Queued** (off by default) goes to Activity → Downloads when you start a download +yourself; background downloads never move the page. + +**Settings → Indexers → Prowlarr → Saved for Later** has the global switch (**Get Saved +Books Automatically**, on by default; turning it off pauses every item without unmarking +it), **Keep Ratio At Least** (0 turns the ratio check off) and the check interval (at +least 5 minutes). diff --git a/docs/troubleshooting.md b/docs/troubleshooting.md index 10a4dd066..bbf11ccb9 100644 --- a/docs/troubleshooting.md +++ b/docs/troubleshooting.md @@ -1,3 +1,35 @@ # Troubleshooting -TODO +## "Download failed: File name too long" + +A folder or file name went over the filesystem's limit (usually 255 bytes), most often +an audiobook with a large cast in `{Narrator}`. Shelfmark keeps names to 240 bytes, +ending a long narrator list with `et al.` (see +[Audiobookshelf Folders](audiobookshelf.md#the-narrator-variable)), so **Retry** the +download. Older versions reported this as just "OSError". + +If an earlier attempt left part of the book in a folder of its own (say, the audiobook +imported but the ebook failed), move or delete it once the retry has finished. + +## "The indexer download link expired" + +Prowlarr's download links for a release stop working after a while, so a release saved +or queued long ago can't be fetched as it was. Shelfmark searches again on its own to +find the same release: first the way the book search found it, then by title and first +author (which finds books with very short titles, like *Eric*), and downloads it from +the fresh result. This error means none of those searches returned it. Search for the +book again, or use the source link in Activity to grab it from the indexer by hand. + +## "Waiting for an unsatisfied slot on MyAnonamouse" + +Not an error: the account is at its unsatisfied limit (counting **Unsatisfied Slots to +Keep Free**), and the download starts on its own once a torrent finishes its 72 hours. +It's listed under **Activity → Queued → Up next**, with the countdown to the next slot in +the MyAnonamouse button. See +[Unsatisfied limit](myanonamouse-enrichment.md#unsatisfied-limit). + +## A queued book doesn't download + +**Activity → Queued** says what each saved pick is waiting for (unsatisfied slots, buffer, +freeleech or the ratio) and when it's next checked. See +[Getting automatically](saved-for-later.md#getting-automatically).