Home screen, library-wide search, splash with orbital particles, macOS download fix
- Add Netflix-style Home with recent audiobooks/podcasts, list/grid toggle shared with Library - Add searchable libraries — audiobooks filter on title/author; podcasts also index and search episodes across the whole library - Add unified context menu (download / progress remove) across Home, Library, and PodcastDetail - Rework cover badges: listened checkmark top-right, download indicator bottom-right; hide progress bar when finished - Add AirPlay picker in PlayerBar - Replace splash with four-phase animation: orbital particles → attract → flash → fade; cross-platform iOS+macOS, runtime AppIcon lookup - Fix macOS parallel downloads: align connection settings with iOS, raise timeoutIntervalForRequest to 300s - Fix progress deletion using server-side progress UUID (DELETE /api/me/progress/:id) - Bump CFBundleVersion to 8 Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -13,6 +13,11 @@ struct Library: Codable, Identifiable, Hashable {
|
||||
let mediaType: String?
|
||||
}
|
||||
|
||||
/// Wichtig für `ForEach`: Synthetische Podcast-Episoden-Items (z.B. aus der
|
||||
/// library-weiten Folgensuche) teilen sich denselben `id` (Podcast-Container-ID)
|
||||
/// und unterscheiden sich nur über `episodeId`. Default-`Identifiable` würde
|
||||
/// hier kollidieren. **Immer** `ForEach(items, id: \.syncKey)` benutzen wenn
|
||||
/// die Liste sowohl Container als auch Episoden-Items enthalten kann.
|
||||
struct LibraryItem: Codable, Identifiable, Hashable {
|
||||
let id: String
|
||||
let title: String
|
||||
@@ -74,6 +79,10 @@ struct PlaybackProgress: Codable, Hashable {
|
||||
var duration: Double
|
||||
var isFinished: Bool
|
||||
var updatedAt: Date
|
||||
/// Server-assigned UUID for this progress entry. Required to delete it —
|
||||
/// Audiobookshelf's `DELETE /api/me/progress/:id` matches by this id, NOT
|
||||
/// by libraryItemId. Optional so older persisted caches still decode.
|
||||
var id: String?
|
||||
|
||||
var syncKey: String {
|
||||
if let episodeId { return "\(itemId)|\(episodeId)" }
|
||||
|
||||
Reference in New Issue
Block a user