feat(core,app,android,ios): more like this and browse by genre, studio, person

pstr_core::discover scores every title against another by shared
director, studio, genres, leading tags and format, leaves out its own
franchise and keeps one title per other franchise. It drives a "More
like this" row under a title's episodes and, seeded by the title most
recently watched to the end, a "Because you watched" row on the library
of titles not yet started.

Genre chips on the title page now open a page of every title with that
genre, and the studios and director move from the line of facts onto
chips of their own that do the same. The desktop has a Browse page whose
back link returns to the title; Android and iOS show it over the library
pane. The bridge exposes more_like, browse and facet_kind.

Also moves a doc comment the My List commit left on the wrong function.
This commit is contained in:
nvrl committed 2026-10-30 22:46:08 +01:00
1 parent f66faf6b75
commit fafe0c3087
23 files changed
+1139 -92

No files matched your search

+17 -3
View File
@@ -420,19 +420,33 @@ struct StatusChip: View {
}
}
/// Something the title is filed under — a genre — as a small rounded label.
/// Android's `GenreChip`.
/// Something the title is filed under — a genre, a studio — as a small rounded
/// label, which opens every title sharing it when given an action. Android's
/// `GenreChip`.
struct GenreChip: View {
@Environment(\.scheme) private var scheme
let text: String
var action: (() -> Void)?
init(text: String, action: (() -> Void)? = nil) {
self.text = text
self.action = action
}
var body: some View {
Text(text)
let label = Text(text)
.textStyle(.labelMedium)
.foregroundStyle(scheme.onSurface)
.padding(.horizontal, 10)
.padding(.vertical, 4)
.background(scheme.surfaceVariant, in: RoundedRectangle(cornerRadius: 12))
if let action {
Button(action: action) { label }
.buttonStyle(.plain)
.accessibilityHint("Browse \(text)")
} else {
label
}
}
}