mirror of
https://github.com/yattee/yattee.git
synced 2026-06-04 13:54:19 +00:00
Surfaces Continue Watching, Recent Feed, and Recent Bookmarks in the
Apple TV Home top shelf when Yattee is focused. Tapping a tile opens
the video via the existing yattee://video/{id} deep link.
- New YatteeTopShelf app extension target (tvOS only). LD_ENTRY_POINT is
overridden to _NSExtensionMain; the tv-app-extension product type
defaults to _TVExtensionMain which is for the pre-tvOS-13 legacy API
and crashes modern TVTopShelfContentProvider subclasses at launch.
- Main app writes per-section JSON snapshots (capped at 10 items each)
to a shared App Group UserDefaults suite after bookmark, watch-history,
and feed-cache changes, plus an initial write on launch.
- Enabled-sections list is mirrored to the same App Group so the
extension can respect the user's selection without touching SwiftData.
- Settings → Top Shelf (tvOS only) lets the user toggle sections.
- Deep link playback shows a loading toast while video details are
fetched, and an error toast if no source is configured.
31 lines
1.1 KiB
Swift
31 lines
1.1 KiB
Swift
import Foundation
|
|
|
|
/// Sections that can appear in the tvOS Top Shelf.
|
|
/// Stored ordered in `SettingsKey.topShelfSections` — inclusion = visible.
|
|
enum TopShelfSection: String, Codable, CaseIterable, Identifiable, Sendable {
|
|
case continueWatching
|
|
case recentFeed
|
|
case recentBookmarks
|
|
|
|
var id: String { rawValue }
|
|
|
|
var localizedTitle: String {
|
|
switch self {
|
|
case .continueWatching: return String(localized: "home.section.continueWatching")
|
|
case .recentFeed: return String(localized: "home.section.feed")
|
|
case .recentBookmarks: return String(localized: "home.section.bookmarks")
|
|
}
|
|
}
|
|
|
|
/// UserDefaults key (under the app-group suite) holding the JSON snapshot for this section.
|
|
var snapshotKey: String {
|
|
switch self {
|
|
case .continueWatching: return "topShelf.continueWatching"
|
|
case .recentFeed: return "topShelf.recentFeed"
|
|
case .recentBookmarks: return "topShelf.recentBookmarks"
|
|
}
|
|
}
|
|
|
|
static let defaultOrder: [TopShelfSection] = [.continueWatching, .recentFeed, .recentBookmarks]
|
|
}
|