mirror of
https://github.com/kikootwo/ReadMeABook.git
synced 2026-06-02 20:30:10 +00:00
Add multi-source ebook search & processing
Refactor ebook flow to support multiple sources (Anna's Archive direct downloads + Prowlarr indexer search) and unify handling with existing audiobook processors. Key changes: - search-ebook.processor: rewritten to try Anna's Archive first then fall back to indexer search, add Prowlarr grouping, ranking (rankEbookTorrents), and handlers to route results to direct-download or download-torrent flows. - organize-files.processor: enriches audiobook/ebook metadata from AudibleCache (year, narrator), treats indexer downloads specially (seed retention), adds optional NZB cleanup/archive logic, and improves retryable error detection. - file-organizer: organizeEbook now accepts additional metadata and an isIndexerDownload flag and supports directories vs single-file paths. - API/UI: include request.type in admin requests API and remove the “coming soon” notice from Ebook settings tab. - fetch-ebook route: removed blocking error for indexer-only mode so the flow can proceed when indexer search is enabled. - Documentation: update TOC, ebook-sidecar, settings-pages, and ranking-algorithm docs to describe indexer search, unified ebook ranking, configuration, and flows. These changes enable indexer-based ebook discovery, ranking, and downloads while preserving existing Anna's Archive behavior and reusing audiobook download processors where possible.
This commit is contained in:
@@ -286,6 +286,80 @@ const ranked = rankTorrents(torrents, audiobook, {
|
||||
return ranked; // User can see torrents without author info
|
||||
```
|
||||
|
||||
## Ebook Torrent Ranking
|
||||
|
||||
The ranking algorithm also supports ebook torrents from indexers with ebook-specific scoring.
|
||||
|
||||
### Unified Code Architecture
|
||||
|
||||
Ebook ranking **reuses** the following from audiobook ranking:
|
||||
- `scoreMatch()` - Title/author matching (60 pts)
|
||||
- `scoreSeeders()` - Seeder count scoring (15 pts)
|
||||
- Bonus modifier system (indexer priority, flag bonuses)
|
||||
- Dual threshold filtering (base >= 50, final >= 50)
|
||||
|
||||
### Ebook-Specific Scoring
|
||||
|
||||
**Format Match (10 pts max)**
|
||||
- 10 pts if torrent format matches preferred format
|
||||
- 0 pts otherwise (no partial credit)
|
||||
- Format detected from torrent title keywords: `.epub`, `.pdf`, `.mobi`, `.azw3`, etc.
|
||||
|
||||
**Size Quality (15 pts max, INVERTED)**
|
||||
- < 5 MB: 15 pts (optimal for ebooks)
|
||||
- 5-15 MB: 10 pts (may have images)
|
||||
- 15-20 MB: 5 pts (large but acceptable)
|
||||
- > 20 MB: **Filtered out** (too large for ebooks)
|
||||
|
||||
### Ebook vs Audiobook Comparison
|
||||
|
||||
| Component | Audiobook | Ebook |
|
||||
|-----------|-----------|-------|
|
||||
| Title/Author | 60 pts (reused) | 60 pts (reused) |
|
||||
| Format | 10 pts (M4B > M4A > MP3) | 10 pts (match = 10, else 0) |
|
||||
| Size | 15 pts (larger = better) | 15 pts (smaller = better) |
|
||||
| Seeders | 15 pts (reused) | 15 pts (reused) |
|
||||
| Size Filter | < 20 MB filtered | > 20 MB filtered |
|
||||
|
||||
### Ebook Interface
|
||||
|
||||
```typescript
|
||||
interface EbookTorrentRequest {
|
||||
title: string;
|
||||
author: string;
|
||||
preferredFormat: string; // 'epub', 'pdf', 'mobi', etc.
|
||||
}
|
||||
|
||||
interface RankEbookTorrentsOptions {
|
||||
indexerPriorities?: Map<number, number>;
|
||||
flagConfigs?: IndexerFlagConfig[];
|
||||
requireAuthor?: boolean; // Default: true
|
||||
}
|
||||
|
||||
function rankEbookTorrents(
|
||||
torrents: TorrentResult[],
|
||||
ebook: EbookTorrentRequest,
|
||||
options?: RankEbookTorrentsOptions
|
||||
): RankedEbookTorrent[];
|
||||
```
|
||||
|
||||
### Ebook Usage Example
|
||||
|
||||
```typescript
|
||||
// Ebook search from indexers
|
||||
const ranked = rankEbookTorrents(prowlarrResults, {
|
||||
title: 'Project Hail Mary',
|
||||
author: 'Andy Weir',
|
||||
preferredFormat: 'epub',
|
||||
}, {
|
||||
indexerPriorities,
|
||||
flagConfigs,
|
||||
requireAuthor: true,
|
||||
});
|
||||
|
||||
const bestEbook = ranked[0]; // Safe to auto-download
|
||||
```
|
||||
|
||||
## Tech Stack
|
||||
|
||||
- string-similarity (fuzzy matching)
|
||||
|
||||
Reference in New Issue
Block a user