Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
9e7c298
wip(markers): initial frontend implementation of marker editor
sifferhans Jul 1, 2026
2f9df5a
chore(markers): remove marker track toggles
sifferhans Jul 1, 2026
0237ee1
feat(markers): better playhead
sifferhans Jul 1, 2026
07e9ba9
feat(markers): color and icon code track types
sifferhans Jul 1, 2026
7fa94f3
chore(markers): rename to person
sifferhans Jul 1, 2026
420c5d6
feat(markers): improved layout
sifferhans Jul 1, 2026
d9e86f8
feat(markers): switch placement of editor and list
sifferhans Jul 1, 2026
8cac2c5
feat(markers): layout animation
sifferhans Jul 1, 2026
bf297d1
feat(markers): seek 5 seconds
sifferhans Jul 1, 2026
f188957
chore(markers): hide milliseconds
sifferhans Jul 1, 2026
d2b3b02
feat(markers): simpler marker list + smaller marker min width
sifferhans Jul 1, 2026
6344955
chore(markers): remove html comments
sifferhans Jul 1, 2026
71a05a5
feat(markers): last added marker type
sifferhans Jul 1, 2026
6845553
feat(markers): improve marker editor
sifferhans Jul 1, 2026
f08771b
feat(markers): zooming + auto-focus
sifferhans Jul 1, 2026
858fd99
feat(markers): dont show time in tooltips
sifferhans Jul 1, 2026
4c0f726
fix(markers): remove direct manipulation of markers in timeline
sifferhans Jul 1, 2026
886e54d
chore(markers): remove link in header
sifferhans Jul 1, 2026
f4a0e91
feat(markers): align design more with design system
sifferhans Jul 1, 2026
7bbc12b
chore(markers): design fix
sifferhans Jul 1, 2026
1cd2bdb
feat(markers): better empty state
sifferhans Jul 1, 2026
7621c07
chore(markers): remove mock backend text
sifferhans Jul 1, 2026
7658986
fix(markers): ignore shortcuts
sifferhans Jul 1, 2026
dfd6967
wip(markers): noop backend mock
sifferhans Jul 1, 2026
d778524
feat(markers): import export
sifferhans Jul 1, 2026
12cdae6
fix(markers): prevent scrolling timeline with arrows
sifferhans Jul 1, 2026
109e028
feat(markers): error and loading states
sifferhans Jul 1, 2026
894cba9
feat(markers): bible references auto-complete
sifferhans Jul 2, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
111 changes: 111 additions & 0 deletions api/v1/api.proto
Original file line number Diff line number Diff line change
Expand Up @@ -398,6 +398,109 @@ message GetVaultItemResponse {
VaultItem item = 1;
}

// ---- Markers ----

enum MarkerType {
MARKER_TYPE_UNSPECIFIED = 0;
MARKER_TYPE_NAME_SUPER = 1;
MARKER_TYPE_BIBLE_VERSE = 2;
MARKER_TYPE_SONG = 3;
MARKER_TYPE_CHAPTER = 4;
MARKER_TYPE_CUSTOM = 5;
}

// Where a marker originated. IMPORTED markers come from the third-party timing
// program (name-supers, bible-verse references, …); MANUAL ones are created in
// this tool. The source is preserved through edits for reconciliation.
enum MarkerSource {
MARKER_SOURCE_UNSPECIFIED = 0;
MARKER_SOURCE_IMPORTED = 1;
MARKER_SOURCE_MANUAL = 2;
}

message Marker {
string id = 1;
MarkerType type = 2;
// Display text: the name, the verse reference, the song/chapter title.
// Always present; for linked markers it mirrors the canonical entity label,
// for custom / free-text markers it's whatever the user typed.
string label = 3;
string note = 4;
// In/out points in seconds.
double start = 5;
double end = 6;
MarkerSource source = 7;
// Canonical entity reference, when the label is linked to a known entity (a
// bible passage, a song, a person). Empty for free-text / custom markers.
// `label` is kept as denormalized display text so linking is enrichment, not
// a requirement — unmatched markers still round-trip.
string entity_id = 8;
// Which registry `entity_id` belongs to: "bible" | "songbook" | "people".
// Empty when `entity_id` is empty.
string entity_source = 9;
}

// A resolvable entity behind a marker label, returned by SearchEntities for
// autocomplete. `id`/`source` map to Marker.entity_id/entity_source.
message Entity {
string id = 1;
string source = 2;
// Canonical display text, e.g. "John 3:16".
string label = 3;
// Optional secondary text shown under the label, e.g. a translation or book.
string detail = 4;
}

message SearchEntitiesRequest {
// Which kind of entity to search — mapped from the marker's type.
MarkerType type = 1;
string query = 2;
// Max results to return; server clamps to a sane bound. 0 means default.
int32 limit = 3;
}

message SearchEntitiesResponse {
repeated Entity entities = 1;
}

// One free-text label to try to resolve to a canonical entity, used by the bulk
// "resolve references" action.
message ReferenceQuery {
// Opaque id echoed back so the caller can correlate results (the marker id).
string ref_id = 1;
MarkerType type = 2;
string text = 3;
}

message ResolvedReference {
string ref_id = 1;
// True only when the text resolved to a single, confident match.
bool resolved = 2;
// Set only when resolved.
Entity entity = 3;
}

message ResolveReferencesRequest {
repeated ReferenceQuery queries = 1;
}

message ResolveReferencesResponse {
repeated ResolvedReference results = 1;
}

message GetMarkersRequest {
string VXID = 1;
}

message GetMarkersResponse {
repeated Marker markers = 1;
}

message SubmitMarkersRequest {
string VXID = 1;
repeated Marker markers = 2;
}

service APIService {
// Permissions
rpc GetPermissions (Void) returns (Permissions) {}
Expand Down Expand Up @@ -441,4 +544,12 @@ service APIService {
// VAULT (Vidispine search)
rpc VaultSearch(VaultSearchRequest) returns (VaultSearchResponse) {}
rpc GetVaultItem(GetVaultItemRequest) returns (GetVaultItemResponse) {}

// Markers
rpc GetMarkers(GetMarkersRequest) returns (GetMarkersResponse) {}
rpc SubmitMarkers(SubmitMarkersRequest) returns (Void) {}
// Autocomplete for marker labels (bible passages, songs, people).
rpc SearchEntities(SearchEntitiesRequest) returns (SearchEntitiesResponse) {}
// Bulk-resolve free-text marker labels to canonical entities.
rpc ResolveReferences(ResolveReferencesRequest) returns (ResolveReferencesResponse) {}
}
Loading