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:
@@ -146,20 +146,23 @@ final class DownloadManager: NSObject, @unchecked Sendable {
|
||||
let config = URLSessionConfiguration.background(withIdentifier: identifier)
|
||||
config.sessionSendsLaunchEvents = true
|
||||
config.isDiscretionary = false
|
||||
// Tells iOS this is interactive (vs. opportunistic bulk transfer) so
|
||||
// it scheduling gives us closer-to-foreground throughput. On `.background`
|
||||
// sessions this is mostly advisory but still respected for prioritization.
|
||||
config.networkServiceType = .responsiveData
|
||||
// Allow up to 6 parallel HTTPS connections to the ABS host — matches the
|
||||
// default for foreground sessions and helps multi-track books download
|
||||
// faster instead of being serialized to 1 connection.
|
||||
config.httpMaximumConnectionsPerHost = 6
|
||||
#else
|
||||
// macOS hat keinen Background-Session-Daemon mit Auto-Retry —
|
||||
// gleiche Pool-/Service-Settings wie iOS, sonst hängt sich ein
|
||||
// parallel laufender Download bei geteilter Bandbreite zu lange ohne
|
||||
// Bytes auf und failed mit Timeout.
|
||||
let config = URLSessionConfiguration.default
|
||||
config.networkServiceType = .responsiveData
|
||||
config.httpMaximumConnectionsPerHost = 6
|
||||
#endif
|
||||
config.allowsCellularAccess = true
|
||||
config.waitsForConnectivity = true
|
||||
config.timeoutIntervalForRequest = 60
|
||||
// 300s statt 60s: bei zwei parallelen großen Tracks kann eine Task
|
||||
// temporär für deutlich mehr als 60s ohne Bytes bleiben, besonders
|
||||
// auf macOS-Foreground-Sessions ohne iOS-Background-Retry-Logik.
|
||||
config.timeoutIntervalForRequest = 300
|
||||
config.timeoutIntervalForResource = 60 * 60 * 24 // 24h — big audiobooks
|
||||
return URLSession(configuration: config, delegate: self, delegateQueue: nil)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user