Compare commits
	
		
			1 Commits
		
	
	
		
			9db95c4e6c
			...
			micah/add-
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 0999c88797 | 
| @@ -1,7 +1,5 @@ | |||||||
| overwrite: true | overwrite: true | ||||||
| schema: | schema: "src/schema.gql" | ||||||
|   - "src/schema.gql" |  | ||||||
|   - "src/client-schema.gql" |  | ||||||
| documents: "src/**/*.gql" | documents: "src/**/*.gql" | ||||||
| generates: | generates: | ||||||
|   src/index.tsx: |   src/index.tsx: | ||||||
|   | |||||||
| @@ -7,7 +7,7 @@ readme = "README.md" | |||||||
| packages = [{include = "rbproto"}] | packages = [{include = "rbproto"}] | ||||||
|  |  | ||||||
| [tool.poetry.dependencies] | [tool.poetry.dependencies] | ||||||
| python = ">=3.10,<=3.13" | python = ">=3.10,<3.12" | ||||||
| protobuf = "^4.25.3" | protobuf = "^4.25.3" | ||||||
|  |  | ||||||
|  |  | ||||||
|   | |||||||
| @@ -13,15 +13,13 @@ _sym_db = _symbol_database.Default() | |||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
| DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\nshot.proto\x12\x0fserialized_shot\"?\n\x03\x42ox\x12\x0c\n\x04left\x18\x01 \x01(\x02\x12\x0b\n\x03top\x18\x02 \x01(\x02\x12\r\n\x05width\x18\x03 \x01(\x02\x12\x0e\n\x06height\x18\x04 \x01(\x02\"\x1d\n\x05Point\x12\t\n\x01x\x18\x01 \x01(\x02\x12\t\n\x01y\x18\x02 \x01(\x02\"\x7f\n\rBallDetection\x12.\n\x0eplane_position\x18\x01 \x01(\x0b\x32\x16.serialized_shot.Point\x12(\n\nannotation\x18\x02 \x01(\x0b\x32\x14.serialized_shot.Box\x12\x14\n\x0cinterpolated\x18\x03 \x01(\x08\"T\n\x10RLEBallDetection\x12\x31\n\tdetection\x18\x01 \x01(\x0b\x32\x1e.serialized_shot.BallDetection\x12\r\n\x05\x63ount\x18\x02 \x01(\r\"L\n\x13RLEDetectionHistory\x12\x35\n\ndetections\x18\x01 \x03(\x0b\x32!.serialized_shot.RLEBallDetection\"F\n\x10\x44\x65tectionHistory\x12\x32\n\ndetections\x18\x01 \x03(\x0b\x32\x1e.serialized_shot.BallDetection\"\xfc\x01\n\rCollisionInfo\x12\x0e\n\x06source\x18\x01 \x01(\r\x12M\n\x10\x62\x61ll_identifiers\x18\x02 \x03(\x0b\x32\x33.serialized_shot.CollisionInfo.BallIdentifiersEntry\x12\x17\n\x0fwall_identifier\x18\x03 \x01(\r\x12\x13\n\x0b\x66rame_index\x18\x04 \x01(\r\x12\x0e\n\x06static\x18\x05 \x01(\x08\x1aN\n\x14\x42\x61llIdentifiersEntry\x12\x0b\n\x03key\x18\x01 \x01(\r\x12%\n\x05value\x18\x02 \x01(\x0b\x32\x16.serialized_shot.Point:\x02\x38\x01\"\xcc\x02\n\x04Path\x12\x13\n\x0bstart_frame\x18\x01 \x01(\r\x12\x11\n\tend_frame\x18\x02 \x01(\r\x12\x37\n\ndetections\x18\x03 \x01(\x0b\x32!.serialized_shot.DetectionHistoryH\x00\x12>\n\x0erle_detections\x18\x04 \x01(\x0b\x32$.serialized_shot.RLEDetectionHistoryH\x00\x12\x15\n\x0bnot_present\x18\x05 \x01(\x08H\x00\x12\x11\n\tis_static\x18\x06 \x01(\x08\x12\x32\n\nstart_info\x18\x07 \x01(\x0b\x32\x1e.serialized_shot.CollisionInfo\x12\x30\n\x08\x65nd_info\x18\x08 \x01(\x0b\x32\x1e.serialized_shot.CollisionInfoB\x13\n\x11\x64\x65tection_history\"R\n\x11IdentifierHistory\x12\x17\n\x0f\x62\x61ll_identifier\x18\x01 \x01(\r\x12$\n\x05paths\x18\x02 \x03(\x0b\x32\x15.serialized_shot.Path\"\xf4\x01\n\x12KeyBallIdentifiers\x12\x10\n\x08\x63ue_ball\x18\x01 \x01(\r\x12\x13\n\x0bobject_ball\x18\x02 \x01(\r\x12\x13\n\x0btarget_ball\x18\x03 \x01(\r\x12\x18\n\x10\x63ontact_sequence\x18\x04 \x03(\r\x12\x18\n\x0b\x63ue_ball_id\x18\x05 \x01(\rH\x00\x88\x01\x01\x12\x1b\n\x0eobject_ball_id\x18\x06 \x01(\rH\x01\x88\x01\x01\x12\x1b\n\x0etarget_ball_id\x18\x07 \x01(\rH\x02\x88\x01\x01\x42\x0e\n\x0c_cue_ball_idB\x11\n\x0f_object_ball_idB\x11\n\x0f_target_ball_id\"\xa8\x01\n\x04Shot\x12@\n\x14identifier_histories\x18\x03 \x03(\x0b\x32\".serialized_shot.IdentifierHistory\x12\x36\n\tkey_balls\x18\x04 \x01(\x0b\x32#.serialized_shot.KeyBallIdentifiers\x12\x13\n\x0bstart_index\x18\x05 \x01(\r\x12\x11\n\tend_index\x18\x06 \x01(\rb\x06proto3') | DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\nshot.proto\x12\x0fserialized_shot\"?\n\x03\x42ox\x12\x0c\n\x04left\x18\x01 \x01(\x02\x12\x0b\n\x03top\x18\x02 \x01(\x02\x12\r\n\x05width\x18\x03 \x01(\x02\x12\x0e\n\x06height\x18\x04 \x01(\x02\"\x1d\n\x05Point\x12\t\n\x01x\x18\x01 \x01(\x02\x12\t\n\x01y\x18\x02 \x01(\x02\"\x7f\n\rBallDetection\x12.\n\x0eplane_position\x18\x01 \x01(\x0b\x32\x16.serialized_shot.Point\x12(\n\nannotation\x18\x02 \x01(\x0b\x32\x14.serialized_shot.Box\x12\x14\n\x0cinterpolated\x18\x03 \x01(\x08\"T\n\x10RLEBallDetection\x12\x31\n\tdetection\x18\x01 \x01(\x0b\x32\x1e.serialized_shot.BallDetection\x12\r\n\x05\x63ount\x18\x02 \x01(\r\"L\n\x13RLEDetectionHistory\x12\x35\n\ndetections\x18\x01 \x03(\x0b\x32!.serialized_shot.RLEBallDetection\"F\n\x10\x44\x65tectionHistory\x12\x32\n\ndetections\x18\x01 \x03(\x0b\x32\x1e.serialized_shot.BallDetection\"\xe6\x01\n\x04Path\x12\x13\n\x0bstart_frame\x18\x01 \x01(\r\x12\x11\n\tend_frame\x18\x02 \x01(\r\x12\x37\n\ndetections\x18\x03 \x01(\x0b\x32!.serialized_shot.DetectionHistoryH\x00\x12>\n\x0erle_detections\x18\x04 \x01(\x0b\x32$.serialized_shot.RLEDetectionHistoryH\x00\x12\x15\n\x0bnot_present\x18\x05 \x01(\x08H\x00\x12\x11\n\tis_static\x18\x06 \x01(\x08\x42\x13\n\x11\x64\x65tection_history\"R\n\x11IdentifierHistory\x12\x17\n\x0f\x62\x61ll_identifier\x18\x01 \x01(\r\x12$\n\x05paths\x18\x02 \x03(\x0b\x32\x15.serialized_shot.Path\"H\n\x04Shot\x12@\n\x14identifier_histories\x18\x03 \x03(\x0b\x32\".serialized_shot.IdentifierHistoryb\x06proto3') | ||||||
|  |  | ||||||
| _globals = globals() | _globals = globals() | ||||||
| _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) | _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) | ||||||
| _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'shot_pb2', _globals) | _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'shot_pb2', _globals) | ||||||
| if _descriptor._USE_C_DESCRIPTORS == False: | if _descriptor._USE_C_DESCRIPTORS == False: | ||||||
|   DESCRIPTOR._options = None |   DESCRIPTOR._options = None | ||||||
|   _globals['_COLLISIONINFO_BALLIDENTIFIERSENTRY']._options = None |  | ||||||
|   _globals['_COLLISIONINFO_BALLIDENTIFIERSENTRY']._serialized_options = b'8\001' |  | ||||||
|   _globals['_BOX']._serialized_start=31 |   _globals['_BOX']._serialized_start=31 | ||||||
|   _globals['_BOX']._serialized_end=94 |   _globals['_BOX']._serialized_end=94 | ||||||
|   _globals['_POINT']._serialized_start=96 |   _globals['_POINT']._serialized_start=96 | ||||||
| @@ -34,16 +32,10 @@ if _descriptor._USE_C_DESCRIPTORS == False: | |||||||
|   _globals['_RLEDETECTIONHISTORY']._serialized_end=418 |   _globals['_RLEDETECTIONHISTORY']._serialized_end=418 | ||||||
|   _globals['_DETECTIONHISTORY']._serialized_start=420 |   _globals['_DETECTIONHISTORY']._serialized_start=420 | ||||||
|   _globals['_DETECTIONHISTORY']._serialized_end=490 |   _globals['_DETECTIONHISTORY']._serialized_end=490 | ||||||
|   _globals['_COLLISIONINFO']._serialized_start=493 |   _globals['_PATH']._serialized_start=493 | ||||||
|   _globals['_COLLISIONINFO']._serialized_end=745 |   _globals['_PATH']._serialized_end=723 | ||||||
|   _globals['_COLLISIONINFO_BALLIDENTIFIERSENTRY']._serialized_start=667 |   _globals['_IDENTIFIERHISTORY']._serialized_start=725 | ||||||
|   _globals['_COLLISIONINFO_BALLIDENTIFIERSENTRY']._serialized_end=745 |   _globals['_IDENTIFIERHISTORY']._serialized_end=807 | ||||||
|   _globals['_PATH']._serialized_start=748 |   _globals['_SHOT']._serialized_start=809 | ||||||
|   _globals['_PATH']._serialized_end=1080 |   _globals['_SHOT']._serialized_end=881 | ||||||
|   _globals['_IDENTIFIERHISTORY']._serialized_start=1082 |  | ||||||
|   _globals['_IDENTIFIERHISTORY']._serialized_end=1164 |  | ||||||
|   _globals['_KEYBALLIDENTIFIERS']._serialized_start=1167 |  | ||||||
|   _globals['_KEYBALLIDENTIFIERS']._serialized_end=1411 |  | ||||||
|   _globals['_SHOT']._serialized_start=1414 |  | ||||||
|   _globals['_SHOT']._serialized_end=1582 |  | ||||||
| # @@protoc_insertion_point(module_scope) | # @@protoc_insertion_point(module_scope) | ||||||
|   | |||||||
| @@ -55,46 +55,21 @@ class DetectionHistory(_message.Message): | |||||||
|     detections: _containers.RepeatedCompositeFieldContainer[BallDetection] |     detections: _containers.RepeatedCompositeFieldContainer[BallDetection] | ||||||
|     def __init__(self, detections: _Optional[_Iterable[_Union[BallDetection, _Mapping]]] = ...) -> None: ... |     def __init__(self, detections: _Optional[_Iterable[_Union[BallDetection, _Mapping]]] = ...) -> None: ... | ||||||
|  |  | ||||||
| class CollisionInfo(_message.Message): |  | ||||||
|     __slots__ = ["source", "ball_identifiers", "wall_identifier", "frame_index", "static"] |  | ||||||
|     class BallIdentifiersEntry(_message.Message): |  | ||||||
|         __slots__ = ["key", "value"] |  | ||||||
|         KEY_FIELD_NUMBER: _ClassVar[int] |  | ||||||
|         VALUE_FIELD_NUMBER: _ClassVar[int] |  | ||||||
|         key: int |  | ||||||
|         value: Point |  | ||||||
|         def __init__(self, key: _Optional[int] = ..., value: _Optional[_Union[Point, _Mapping]] = ...) -> None: ... |  | ||||||
|     SOURCE_FIELD_NUMBER: _ClassVar[int] |  | ||||||
|     BALL_IDENTIFIERS_FIELD_NUMBER: _ClassVar[int] |  | ||||||
|     WALL_IDENTIFIER_FIELD_NUMBER: _ClassVar[int] |  | ||||||
|     FRAME_INDEX_FIELD_NUMBER: _ClassVar[int] |  | ||||||
|     STATIC_FIELD_NUMBER: _ClassVar[int] |  | ||||||
|     source: int |  | ||||||
|     ball_identifiers: _containers.MessageMap[int, Point] |  | ||||||
|     wall_identifier: int |  | ||||||
|     frame_index: int |  | ||||||
|     static: bool |  | ||||||
|     def __init__(self, source: _Optional[int] = ..., ball_identifiers: _Optional[_Mapping[int, Point]] = ..., wall_identifier: _Optional[int] = ..., frame_index: _Optional[int] = ..., static: bool = ...) -> None: ... |  | ||||||
|  |  | ||||||
| class Path(_message.Message): | class Path(_message.Message): | ||||||
|     __slots__ = ["start_frame", "end_frame", "detections", "rle_detections", "not_present", "is_static", "start_info", "end_info"] |     __slots__ = ["start_frame", "end_frame", "detections", "rle_detections", "not_present", "is_static"] | ||||||
|     START_FRAME_FIELD_NUMBER: _ClassVar[int] |     START_FRAME_FIELD_NUMBER: _ClassVar[int] | ||||||
|     END_FRAME_FIELD_NUMBER: _ClassVar[int] |     END_FRAME_FIELD_NUMBER: _ClassVar[int] | ||||||
|     DETECTIONS_FIELD_NUMBER: _ClassVar[int] |     DETECTIONS_FIELD_NUMBER: _ClassVar[int] | ||||||
|     RLE_DETECTIONS_FIELD_NUMBER: _ClassVar[int] |     RLE_DETECTIONS_FIELD_NUMBER: _ClassVar[int] | ||||||
|     NOT_PRESENT_FIELD_NUMBER: _ClassVar[int] |     NOT_PRESENT_FIELD_NUMBER: _ClassVar[int] | ||||||
|     IS_STATIC_FIELD_NUMBER: _ClassVar[int] |     IS_STATIC_FIELD_NUMBER: _ClassVar[int] | ||||||
|     START_INFO_FIELD_NUMBER: _ClassVar[int] |  | ||||||
|     END_INFO_FIELD_NUMBER: _ClassVar[int] |  | ||||||
|     start_frame: int |     start_frame: int | ||||||
|     end_frame: int |     end_frame: int | ||||||
|     detections: DetectionHistory |     detections: DetectionHistory | ||||||
|     rle_detections: RLEDetectionHistory |     rle_detections: RLEDetectionHistory | ||||||
|     not_present: bool |     not_present: bool | ||||||
|     is_static: bool |     is_static: bool | ||||||
|     start_info: CollisionInfo |     def __init__(self, start_frame: _Optional[int] = ..., end_frame: _Optional[int] = ..., detections: _Optional[_Union[DetectionHistory, _Mapping]] = ..., rle_detections: _Optional[_Union[RLEDetectionHistory, _Mapping]] = ..., not_present: bool = ..., is_static: bool = ...) -> None: ... | ||||||
|     end_info: CollisionInfo |  | ||||||
|     def __init__(self, start_frame: _Optional[int] = ..., end_frame: _Optional[int] = ..., detections: _Optional[_Union[DetectionHistory, _Mapping]] = ..., rle_detections: _Optional[_Union[RLEDetectionHistory, _Mapping]] = ..., not_present: bool = ..., is_static: bool = ..., start_info: _Optional[_Union[CollisionInfo, _Mapping]] = ..., end_info: _Optional[_Union[CollisionInfo, _Mapping]] = ...) -> None: ... |  | ||||||
|  |  | ||||||
| class IdentifierHistory(_message.Message): | class IdentifierHistory(_message.Message): | ||||||
|     __slots__ = ["ball_identifier", "paths"] |     __slots__ = ["ball_identifier", "paths"] | ||||||
| @@ -104,32 +79,8 @@ class IdentifierHistory(_message.Message): | |||||||
|     paths: _containers.RepeatedCompositeFieldContainer[Path] |     paths: _containers.RepeatedCompositeFieldContainer[Path] | ||||||
|     def __init__(self, ball_identifier: _Optional[int] = ..., paths: _Optional[_Iterable[_Union[Path, _Mapping]]] = ...) -> None: ... |     def __init__(self, ball_identifier: _Optional[int] = ..., paths: _Optional[_Iterable[_Union[Path, _Mapping]]] = ...) -> None: ... | ||||||
|  |  | ||||||
| class KeyBallIdentifiers(_message.Message): |  | ||||||
|     __slots__ = ["cue_ball", "object_ball", "target_ball", "contact_sequence", "cue_ball_id", "object_ball_id", "target_ball_id"] |  | ||||||
|     CUE_BALL_FIELD_NUMBER: _ClassVar[int] |  | ||||||
|     OBJECT_BALL_FIELD_NUMBER: _ClassVar[int] |  | ||||||
|     TARGET_BALL_FIELD_NUMBER: _ClassVar[int] |  | ||||||
|     CONTACT_SEQUENCE_FIELD_NUMBER: _ClassVar[int] |  | ||||||
|     CUE_BALL_ID_FIELD_NUMBER: _ClassVar[int] |  | ||||||
|     OBJECT_BALL_ID_FIELD_NUMBER: _ClassVar[int] |  | ||||||
|     TARGET_BALL_ID_FIELD_NUMBER: _ClassVar[int] |  | ||||||
|     cue_ball: int |  | ||||||
|     object_ball: int |  | ||||||
|     target_ball: int |  | ||||||
|     contact_sequence: _containers.RepeatedScalarFieldContainer[int] |  | ||||||
|     cue_ball_id: int |  | ||||||
|     object_ball_id: int |  | ||||||
|     target_ball_id: int |  | ||||||
|     def __init__(self, cue_ball: _Optional[int] = ..., object_ball: _Optional[int] = ..., target_ball: _Optional[int] = ..., contact_sequence: _Optional[_Iterable[int]] = ..., cue_ball_id: _Optional[int] = ..., object_ball_id: _Optional[int] = ..., target_ball_id: _Optional[int] = ...) -> None: ... |  | ||||||
|  |  | ||||||
| class Shot(_message.Message): | class Shot(_message.Message): | ||||||
|     __slots__ = ["identifier_histories", "key_balls", "start_index", "end_index"] |     __slots__ = ["identifier_histories"] | ||||||
|     IDENTIFIER_HISTORIES_FIELD_NUMBER: _ClassVar[int] |     IDENTIFIER_HISTORIES_FIELD_NUMBER: _ClassVar[int] | ||||||
|     KEY_BALLS_FIELD_NUMBER: _ClassVar[int] |  | ||||||
|     START_INDEX_FIELD_NUMBER: _ClassVar[int] |  | ||||||
|     END_INDEX_FIELD_NUMBER: _ClassVar[int] |  | ||||||
|     identifier_histories: _containers.RepeatedCompositeFieldContainer[IdentifierHistory] |     identifier_histories: _containers.RepeatedCompositeFieldContainer[IdentifierHistory] | ||||||
|     key_balls: KeyBallIdentifiers |     def __init__(self, identifier_histories: _Optional[_Iterable[_Union[IdentifierHistory, _Mapping]]] = ...) -> None: ... | ||||||
|     start_index: int |  | ||||||
|     end_index: int |  | ||||||
|     def __init__(self, identifier_histories: _Optional[_Iterable[_Union[IdentifierHistory, _Mapping]]] = ..., key_balls: _Optional[_Union[KeyBallIdentifiers, _Mapping]] = ..., start_index: _Optional[int] = ..., end_index: _Optional[int] = ...) -> None: ... |  | ||||||
|   | |||||||
| @@ -3,10 +3,10 @@ syntax = "proto3"; | |||||||
| package serialized_shot; | package serialized_shot; | ||||||
|  |  | ||||||
| message Box { | message Box { | ||||||
|   float left = 1; | 	float left = 1; | ||||||
|   float top = 2; | 	float top = 2; | ||||||
|   float width = 3; | 	float width = 3; | ||||||
|   float height = 4; | 	float height = 4; | ||||||
| } | } | ||||||
|  |  | ||||||
| message Point { | message Point { | ||||||
| @@ -15,63 +15,40 @@ message Point { | |||||||
| } | } | ||||||
|  |  | ||||||
| message BallDetection { | message BallDetection { | ||||||
|   Point plane_position = 1; | 	Point plane_position = 1; | ||||||
|   Box annotation = 2; | 	Box annotation = 2; | ||||||
|   bool interpolated = 3; | 	bool interpolated = 3; | ||||||
| } | } | ||||||
|  |  | ||||||
| message RLEBallDetection { | message RLEBallDetection { | ||||||
|   BallDetection detection = 1; | 	BallDetection detection = 1; | ||||||
|   uint32 count = 2; | 	uint32 count = 2; | ||||||
| } | } | ||||||
|  |  | ||||||
| message RLEDetectionHistory { repeated RLEBallDetection detections = 1; } | message RLEDetectionHistory { | ||||||
|  |   repeated RLEBallDetection detections = 1; | ||||||
|  | } | ||||||
|  |  | ||||||
| message DetectionHistory { repeated BallDetection detections = 1; } | message DetectionHistory { | ||||||
|  |   repeated BallDetection detections = 1; | ||||||
| message CollisionInfo { |  | ||||||
|   uint32 source = 1; |  | ||||||
|   map<uint32, Point> ball_identifiers = 2; |  | ||||||
|   uint32 wall_identifier = 3; |  | ||||||
|   uint32 frame_index = 4; |  | ||||||
|   bool static = 5; |  | ||||||
| } | } | ||||||
|  |  | ||||||
| message Path { | message Path { | ||||||
|   uint32 start_frame = 1; |   uint32 start_frame = 1; | ||||||
|   uint32 end_frame = 2; |   uint32 end_frame = 2; | ||||||
|   oneof detection_history { |   oneof detection_history { | ||||||
|     DetectionHistory detections = 3; | 	DetectionHistory detections = 3; | ||||||
|     RLEDetectionHistory rle_detections = 4; | 	RLEDetectionHistory rle_detections = 4; | ||||||
|     bool not_present = 5; | 	bool not_present = 5; | ||||||
|   } |   } | ||||||
|   bool is_static = 6; |   bool is_static = 6; | ||||||
|   CollisionInfo start_info = 7; |  | ||||||
|   CollisionInfo end_info = 8; |  | ||||||
| } | } | ||||||
|  |  | ||||||
| message IdentifierHistory { | message IdentifierHistory { | ||||||
|   uint32 ball_identifier = 1; |   uint32 ball_identifier = 1; | ||||||
|   repeated Path paths = 2; |   repeated Path paths = 2; | ||||||
| } | } | ||||||
| message KeyBallIdentifiers { |  | ||||||
|   uint32 cue_ball = 1; |  | ||||||
|   uint32 object_ball = 2; |  | ||||||
|   uint32 target_ball = 3; |  | ||||||
|  |  | ||||||
|   // For now this will just be cue->object/target->target |  | ||||||
|   // Long term this will potentially represent a linked list |  | ||||||
|   // of all balls in a shot. |  | ||||||
|   repeated uint32 contact_sequence = 4; |  | ||||||
|  |  | ||||||
|   optional uint32 cue_ball_id = 5; |  | ||||||
|   optional uint32 object_ball_id = 6; |  | ||||||
|   optional uint32 target_ball_id = 7; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| message Shot { | message Shot { | ||||||
|   repeated IdentifierHistory identifier_histories = 3; |   repeated IdentifierHistory identifier_histories = 3; | ||||||
|   KeyBallIdentifiers key_balls = 4; |  | ||||||
|   uint32 start_index = 5; |  | ||||||
|   uint32 end_index = 6; |  | ||||||
| } | } | ||||||
|   | |||||||
| @@ -427,150 +427,6 @@ function _decodeDetectionHistory(bb: ByteBuffer): DetectionHistory { | |||||||
|   return message; |   return message; | ||||||
| } | } | ||||||
|  |  | ||||||
| export interface CollisionInfo { |  | ||||||
|   source?: number; |  | ||||||
|   ball_identifiers?: { [key: number]: Point }; |  | ||||||
|   wall_identifier?: number; |  | ||||||
|   frame_index?: number; |  | ||||||
|   static?: boolean; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| export function encodeCollisionInfo(message: CollisionInfo): Uint8Array { |  | ||||||
|   let bb = popByteBuffer(); |  | ||||||
|   _encodeCollisionInfo(message, bb); |  | ||||||
|   return toUint8Array(bb); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| function _encodeCollisionInfo(message: CollisionInfo, bb: ByteBuffer): void { |  | ||||||
|   // optional uint32 source = 1; |  | ||||||
|   let $source = message.source; |  | ||||||
|   if ($source !== undefined) { |  | ||||||
|     writeVarint32(bb, 8); |  | ||||||
|     writeVarint32(bb, $source); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   // optional map<uint32, Point> ball_identifiers = 2; |  | ||||||
|   let map$ball_identifiers = message.ball_identifiers; |  | ||||||
|   if (map$ball_identifiers !== undefined) { |  | ||||||
|     for (let key in map$ball_identifiers) { |  | ||||||
|       let nested = popByteBuffer(); |  | ||||||
|       let value = map$ball_identifiers[key]; |  | ||||||
|       writeVarint32(nested, 8); |  | ||||||
|       writeVarint32(nested, +key); |  | ||||||
|       writeVarint32(nested, 18); |  | ||||||
|       let nestedValue = popByteBuffer(); |  | ||||||
|       _encodePoint(value, nestedValue); |  | ||||||
|       writeVarint32(nested, nestedValue.limit); |  | ||||||
|       writeByteBuffer(nested, nestedValue); |  | ||||||
|       pushByteBuffer(nestedValue); |  | ||||||
|       writeVarint32(bb, 18); |  | ||||||
|       writeVarint32(bb, nested.offset); |  | ||||||
|       writeByteBuffer(bb, nested); |  | ||||||
|       pushByteBuffer(nested); |  | ||||||
|     } |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   // optional uint32 wall_identifier = 3; |  | ||||||
|   let $wall_identifier = message.wall_identifier; |  | ||||||
|   if ($wall_identifier !== undefined) { |  | ||||||
|     writeVarint32(bb, 24); |  | ||||||
|     writeVarint32(bb, $wall_identifier); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   // optional uint32 frame_index = 4; |  | ||||||
|   let $frame_index = message.frame_index; |  | ||||||
|   if ($frame_index !== undefined) { |  | ||||||
|     writeVarint32(bb, 32); |  | ||||||
|     writeVarint32(bb, $frame_index); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   // optional bool static = 5; |  | ||||||
|   let $static = message.static; |  | ||||||
|   if ($static !== undefined) { |  | ||||||
|     writeVarint32(bb, 40); |  | ||||||
|     writeByte(bb, $static ? 1 : 0); |  | ||||||
|   } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| export function decodeCollisionInfo(binary: Uint8Array): CollisionInfo { |  | ||||||
|   return _decodeCollisionInfo(wrapByteBuffer(binary)); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| function _decodeCollisionInfo(bb: ByteBuffer): CollisionInfo { |  | ||||||
|   let message: CollisionInfo = {} as any; |  | ||||||
|  |  | ||||||
|   end_of_message: while (!isAtEnd(bb)) { |  | ||||||
|     let tag = readVarint32(bb); |  | ||||||
|  |  | ||||||
|     switch (tag >>> 3) { |  | ||||||
|       case 0: |  | ||||||
|         break end_of_message; |  | ||||||
|  |  | ||||||
|       // optional uint32 source = 1; |  | ||||||
|       case 1: { |  | ||||||
|         message.source = readVarint32(bb) >>> 0; |  | ||||||
|         break; |  | ||||||
|       } |  | ||||||
|  |  | ||||||
|       // optional map<uint32, Point> ball_identifiers = 2; |  | ||||||
|       case 2: { |  | ||||||
|         let values = |  | ||||||
|           message.ball_identifiers || (message.ball_identifiers = {}); |  | ||||||
|         let outerLimit = pushTemporaryLength(bb); |  | ||||||
|         let key: number | undefined; |  | ||||||
|         let value: Point | undefined; |  | ||||||
|         end_of_entry: while (!isAtEnd(bb)) { |  | ||||||
|           let tag = readVarint32(bb); |  | ||||||
|           switch (tag >>> 3) { |  | ||||||
|             case 0: |  | ||||||
|               break end_of_entry; |  | ||||||
|             case 1: { |  | ||||||
|               key = readVarint32(bb) >>> 0; |  | ||||||
|               break; |  | ||||||
|             } |  | ||||||
|             case 2: { |  | ||||||
|               let valueLimit = pushTemporaryLength(bb); |  | ||||||
|               value = _decodePoint(bb); |  | ||||||
|               bb.limit = valueLimit; |  | ||||||
|               break; |  | ||||||
|             } |  | ||||||
|             default: |  | ||||||
|               skipUnknownField(bb, tag & 7); |  | ||||||
|           } |  | ||||||
|         } |  | ||||||
|         if (key === undefined || value === undefined) |  | ||||||
|           throw new Error("Invalid data for map: ball_identifiers"); |  | ||||||
|         values[key] = value; |  | ||||||
|         bb.limit = outerLimit; |  | ||||||
|         break; |  | ||||||
|       } |  | ||||||
|  |  | ||||||
|       // optional uint32 wall_identifier = 3; |  | ||||||
|       case 3: { |  | ||||||
|         message.wall_identifier = readVarint32(bb) >>> 0; |  | ||||||
|         break; |  | ||||||
|       } |  | ||||||
|  |  | ||||||
|       // optional uint32 frame_index = 4; |  | ||||||
|       case 4: { |  | ||||||
|         message.frame_index = readVarint32(bb) >>> 0; |  | ||||||
|         break; |  | ||||||
|       } |  | ||||||
|  |  | ||||||
|       // optional bool static = 5; |  | ||||||
|       case 5: { |  | ||||||
|         message.static = !!readByte(bb); |  | ||||||
|         break; |  | ||||||
|       } |  | ||||||
|  |  | ||||||
|       default: |  | ||||||
|         skipUnknownField(bb, tag & 7); |  | ||||||
|     } |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   return message; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| export interface Path { | export interface Path { | ||||||
|   start_frame?: number; |   start_frame?: number; | ||||||
|   end_frame?: number; |   end_frame?: number; | ||||||
| @@ -578,8 +434,6 @@ export interface Path { | |||||||
|   rle_detections?: RLEDetectionHistory; |   rle_detections?: RLEDetectionHistory; | ||||||
|   not_present?: boolean; |   not_present?: boolean; | ||||||
|   is_static?: boolean; |   is_static?: boolean; | ||||||
|   start_info?: CollisionInfo; |  | ||||||
|   end_info?: CollisionInfo; |  | ||||||
| } | } | ||||||
|  |  | ||||||
| export function encodePath(message: Path): Uint8Array { | export function encodePath(message: Path): Uint8Array { | ||||||
| @@ -638,28 +492,6 @@ function _encodePath(message: Path, bb: ByteBuffer): void { | |||||||
|     writeVarint32(bb, 48); |     writeVarint32(bb, 48); | ||||||
|     writeByte(bb, $is_static ? 1 : 0); |     writeByte(bb, $is_static ? 1 : 0); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   // optional CollisionInfo start_info = 7; |  | ||||||
|   let $start_info = message.start_info; |  | ||||||
|   if ($start_info !== undefined) { |  | ||||||
|     writeVarint32(bb, 58); |  | ||||||
|     let nested = popByteBuffer(); |  | ||||||
|     _encodeCollisionInfo($start_info, nested); |  | ||||||
|     writeVarint32(bb, nested.limit); |  | ||||||
|     writeByteBuffer(bb, nested); |  | ||||||
|     pushByteBuffer(nested); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   // optional CollisionInfo end_info = 8; |  | ||||||
|   let $end_info = message.end_info; |  | ||||||
|   if ($end_info !== undefined) { |  | ||||||
|     writeVarint32(bb, 66); |  | ||||||
|     let nested = popByteBuffer(); |  | ||||||
|     _encodeCollisionInfo($end_info, nested); |  | ||||||
|     writeVarint32(bb, nested.limit); |  | ||||||
|     writeByteBuffer(bb, nested); |  | ||||||
|     pushByteBuffer(nested); |  | ||||||
|   } |  | ||||||
| } | } | ||||||
|  |  | ||||||
| export function decodePath(binary: Uint8Array): Path { | export function decodePath(binary: Uint8Array): Path { | ||||||
| @@ -716,22 +548,6 @@ function _decodePath(bb: ByteBuffer): Path { | |||||||
|         break; |         break; | ||||||
|       } |       } | ||||||
|  |  | ||||||
|       // optional CollisionInfo start_info = 7; |  | ||||||
|       case 7: { |  | ||||||
|         let limit = pushTemporaryLength(bb); |  | ||||||
|         message.start_info = _decodeCollisionInfo(bb); |  | ||||||
|         bb.limit = limit; |  | ||||||
|         break; |  | ||||||
|       } |  | ||||||
|  |  | ||||||
|       // optional CollisionInfo end_info = 8; |  | ||||||
|       case 8: { |  | ||||||
|         let limit = pushTemporaryLength(bb); |  | ||||||
|         message.end_info = _decodeCollisionInfo(bb); |  | ||||||
|         bb.limit = limit; |  | ||||||
|         break; |  | ||||||
|       } |  | ||||||
|  |  | ||||||
|       default: |       default: | ||||||
|         skipUnknownField(bb, tag & 7); |         skipUnknownField(bb, tag & 7); | ||||||
|     } |     } | ||||||
| @@ -815,165 +631,8 @@ function _decodeIdentifierHistory(bb: ByteBuffer): IdentifierHistory { | |||||||
|   return message; |   return message; | ||||||
| } | } | ||||||
|  |  | ||||||
| export interface KeyBallIdentifiers { |  | ||||||
|   cue_ball?: number; |  | ||||||
|   object_ball?: number; |  | ||||||
|   target_ball?: number; |  | ||||||
|   contact_sequence?: number[]; |  | ||||||
|   cue_ball_id?: number; |  | ||||||
|   object_ball_id?: number; |  | ||||||
|   target_ball_id?: number; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| export function encodeKeyBallIdentifiers( |  | ||||||
|   message: KeyBallIdentifiers, |  | ||||||
| ): Uint8Array { |  | ||||||
|   let bb = popByteBuffer(); |  | ||||||
|   _encodeKeyBallIdentifiers(message, bb); |  | ||||||
|   return toUint8Array(bb); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| function _encodeKeyBallIdentifiers( |  | ||||||
|   message: KeyBallIdentifiers, |  | ||||||
|   bb: ByteBuffer, |  | ||||||
| ): void { |  | ||||||
|   // optional uint32 cue_ball = 1; |  | ||||||
|   let $cue_ball = message.cue_ball; |  | ||||||
|   if ($cue_ball !== undefined) { |  | ||||||
|     writeVarint32(bb, 8); |  | ||||||
|     writeVarint32(bb, $cue_ball); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   // optional uint32 object_ball = 2; |  | ||||||
|   let $object_ball = message.object_ball; |  | ||||||
|   if ($object_ball !== undefined) { |  | ||||||
|     writeVarint32(bb, 16); |  | ||||||
|     writeVarint32(bb, $object_ball); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   // optional uint32 target_ball = 3; |  | ||||||
|   let $target_ball = message.target_ball; |  | ||||||
|   if ($target_ball !== undefined) { |  | ||||||
|     writeVarint32(bb, 24); |  | ||||||
|     writeVarint32(bb, $target_ball); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   // repeated uint32 contact_sequence = 4; |  | ||||||
|   let array$contact_sequence = message.contact_sequence; |  | ||||||
|   if (array$contact_sequence !== undefined) { |  | ||||||
|     let packed = popByteBuffer(); |  | ||||||
|     for (let value of array$contact_sequence) { |  | ||||||
|       writeVarint32(packed, value); |  | ||||||
|     } |  | ||||||
|     writeVarint32(bb, 34); |  | ||||||
|     writeVarint32(bb, packed.offset); |  | ||||||
|     writeByteBuffer(bb, packed); |  | ||||||
|     pushByteBuffer(packed); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   // optional uint32 cue_ball_id = 5; |  | ||||||
|   let $cue_ball_id = message.cue_ball_id; |  | ||||||
|   if ($cue_ball_id !== undefined) { |  | ||||||
|     writeVarint32(bb, 40); |  | ||||||
|     writeVarint32(bb, $cue_ball_id); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   // optional uint32 object_ball_id = 6; |  | ||||||
|   let $object_ball_id = message.object_ball_id; |  | ||||||
|   if ($object_ball_id !== undefined) { |  | ||||||
|     writeVarint32(bb, 48); |  | ||||||
|     writeVarint32(bb, $object_ball_id); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   // optional uint32 target_ball_id = 7; |  | ||||||
|   let $target_ball_id = message.target_ball_id; |  | ||||||
|   if ($target_ball_id !== undefined) { |  | ||||||
|     writeVarint32(bb, 56); |  | ||||||
|     writeVarint32(bb, $target_ball_id); |  | ||||||
|   } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| export function decodeKeyBallIdentifiers( |  | ||||||
|   binary: Uint8Array, |  | ||||||
| ): KeyBallIdentifiers { |  | ||||||
|   return _decodeKeyBallIdentifiers(wrapByteBuffer(binary)); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| function _decodeKeyBallIdentifiers(bb: ByteBuffer): KeyBallIdentifiers { |  | ||||||
|   let message: KeyBallIdentifiers = {} as any; |  | ||||||
|  |  | ||||||
|   end_of_message: while (!isAtEnd(bb)) { |  | ||||||
|     let tag = readVarint32(bb); |  | ||||||
|  |  | ||||||
|     switch (tag >>> 3) { |  | ||||||
|       case 0: |  | ||||||
|         break end_of_message; |  | ||||||
|  |  | ||||||
|       // optional uint32 cue_ball = 1; |  | ||||||
|       case 1: { |  | ||||||
|         message.cue_ball = readVarint32(bb) >>> 0; |  | ||||||
|         break; |  | ||||||
|       } |  | ||||||
|  |  | ||||||
|       // optional uint32 object_ball = 2; |  | ||||||
|       case 2: { |  | ||||||
|         message.object_ball = readVarint32(bb) >>> 0; |  | ||||||
|         break; |  | ||||||
|       } |  | ||||||
|  |  | ||||||
|       // optional uint32 target_ball = 3; |  | ||||||
|       case 3: { |  | ||||||
|         message.target_ball = readVarint32(bb) >>> 0; |  | ||||||
|         break; |  | ||||||
|       } |  | ||||||
|  |  | ||||||
|       // repeated uint32 contact_sequence = 4; |  | ||||||
|       case 4: { |  | ||||||
|         let values = |  | ||||||
|           message.contact_sequence || (message.contact_sequence = []); |  | ||||||
|         if ((tag & 7) === 2) { |  | ||||||
|           let outerLimit = pushTemporaryLength(bb); |  | ||||||
|           while (!isAtEnd(bb)) { |  | ||||||
|             values.push(readVarint32(bb) >>> 0); |  | ||||||
|           } |  | ||||||
|           bb.limit = outerLimit; |  | ||||||
|         } else { |  | ||||||
|           values.push(readVarint32(bb) >>> 0); |  | ||||||
|         } |  | ||||||
|         break; |  | ||||||
|       } |  | ||||||
|  |  | ||||||
|       // optional uint32 cue_ball_id = 5; |  | ||||||
|       case 5: { |  | ||||||
|         message.cue_ball_id = readVarint32(bb) >>> 0; |  | ||||||
|         break; |  | ||||||
|       } |  | ||||||
|  |  | ||||||
|       // optional uint32 object_ball_id = 6; |  | ||||||
|       case 6: { |  | ||||||
|         message.object_ball_id = readVarint32(bb) >>> 0; |  | ||||||
|         break; |  | ||||||
|       } |  | ||||||
|  |  | ||||||
|       // optional uint32 target_ball_id = 7; |  | ||||||
|       case 7: { |  | ||||||
|         message.target_ball_id = readVarint32(bb) >>> 0; |  | ||||||
|         break; |  | ||||||
|       } |  | ||||||
|  |  | ||||||
|       default: |  | ||||||
|         skipUnknownField(bb, tag & 7); |  | ||||||
|     } |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   return message; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| export interface Shot { | export interface Shot { | ||||||
|   identifier_histories?: IdentifierHistory[]; |   identifier_histories?: IdentifierHistory[]; | ||||||
|   key_balls?: KeyBallIdentifiers; |  | ||||||
|   start_index?: number; |  | ||||||
|   end_index?: number; |  | ||||||
| } | } | ||||||
|  |  | ||||||
| export function encodeShot(message: Shot): Uint8Array { | export function encodeShot(message: Shot): Uint8Array { | ||||||
| @@ -995,31 +654,6 @@ function _encodeShot(message: Shot, bb: ByteBuffer): void { | |||||||
|       pushByteBuffer(nested); |       pushByteBuffer(nested); | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   // optional KeyBallIdentifiers key_balls = 4; |  | ||||||
|   let $key_balls = message.key_balls; |  | ||||||
|   if ($key_balls !== undefined) { |  | ||||||
|     writeVarint32(bb, 34); |  | ||||||
|     let nested = popByteBuffer(); |  | ||||||
|     _encodeKeyBallIdentifiers($key_balls, nested); |  | ||||||
|     writeVarint32(bb, nested.limit); |  | ||||||
|     writeByteBuffer(bb, nested); |  | ||||||
|     pushByteBuffer(nested); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   // optional uint32 start_index = 5; |  | ||||||
|   let $start_index = message.start_index; |  | ||||||
|   if ($start_index !== undefined) { |  | ||||||
|     writeVarint32(bb, 40); |  | ||||||
|     writeVarint32(bb, $start_index); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   // optional uint32 end_index = 6; |  | ||||||
|   let $end_index = message.end_index; |  | ||||||
|   if ($end_index !== undefined) { |  | ||||||
|     writeVarint32(bb, 48); |  | ||||||
|     writeVarint32(bb, $end_index); |  | ||||||
|   } |  | ||||||
| } | } | ||||||
|  |  | ||||||
| export function decodeShot(binary: Uint8Array): Shot { | export function decodeShot(binary: Uint8Array): Shot { | ||||||
| @@ -1046,26 +680,6 @@ function _decodeShot(bb: ByteBuffer): Shot { | |||||||
|         break; |         break; | ||||||
|       } |       } | ||||||
|  |  | ||||||
|       // optional KeyBallIdentifiers key_balls = 4; |  | ||||||
|       case 4: { |  | ||||||
|         let limit = pushTemporaryLength(bb); |  | ||||||
|         message.key_balls = _decodeKeyBallIdentifiers(bb); |  | ||||||
|         bb.limit = limit; |  | ||||||
|         break; |  | ||||||
|       } |  | ||||||
|  |  | ||||||
|       // optional uint32 start_index = 5; |  | ||||||
|       case 5: { |  | ||||||
|         message.start_index = readVarint32(bb) >>> 0; |  | ||||||
|         break; |  | ||||||
|       } |  | ||||||
|  |  | ||||||
|       // optional uint32 end_index = 6; |  | ||||||
|       case 6: { |  | ||||||
|         message.end_index = readVarint32(bb) >>> 0; |  | ||||||
|         break; |  | ||||||
|       } |  | ||||||
|  |  | ||||||
|       default: |       default: | ||||||
|         skipUnknownField(bb, tag & 7); |         skipUnknownField(bb, tag & 7); | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -1,25 +0,0 @@ | |||||||
| # see: https://www.apollographql.com/docs/react/local-state/managing-state-with-field-policies/ |  | ||||||
| directive @client on FIELD |  | ||||||
|  |  | ||||||
| extend type ShotGQL { |  | ||||||
|   startTime: Float! |  | ||||||
|   endTime: Float! |  | ||||||
| } |  | ||||||
|  |  | ||||||
| extend type UploadStreamGQL { |  | ||||||
|   segmentEndFrames: [Int!]! |  | ||||||
| } |  | ||||||
|  |  | ||||||
| extend type HLSPlaylistGQL { |  | ||||||
|   segmentStartTimes: [Float!]! |  | ||||||
| } |  | ||||||
|  |  | ||||||
| type SegmentEndFramesGQL { |  | ||||||
|   id: Int! |  | ||||||
|   segmentEndFrames: [Int!]! |  | ||||||
| } |  | ||||||
|  |  | ||||||
| type SegmentStartTimesGQL { |  | ||||||
|   id: Int! |  | ||||||
|   segmentStartTimes: [Float!]! |  | ||||||
| } |  | ||||||
							
								
								
									
										3636
									
								
								src/index.tsx
									
									
									
									
									
								
							
							
						
						
									
										3636
									
								
								src/index.tsx
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -4,6 +4,5 @@ query getDeployedConfig { | |||||||
|     devMode |     devMode | ||||||
|     environment |     environment | ||||||
|     firebase |     firebase | ||||||
|     minimumAllowedAppVersion |  | ||||||
|   } |   } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -21,10 +21,8 @@ query GetFeed( | |||||||
|       elapsedTime |       elapsedTime | ||||||
|       screenshotUri |       screenshotUri | ||||||
|       stream { |       stream { | ||||||
|         id |  | ||||||
|         isCompleted |         isCompleted | ||||||
|       } |       } | ||||||
|       tableSize |  | ||||||
|       tags { |       tags { | ||||||
|         tagClasses { |         tagClasses { | ||||||
|           name |           name | ||||||
|   | |||||||
| @@ -1,11 +1,38 @@ | |||||||
| query GetSerializedShotPaths($filterInput: FilterInput!) { | query GetShots( | ||||||
|  |   $filterInput: FilterInput! | ||||||
|  |   $includeCreatedAt: Boolean! = false | ||||||
|  |   $includeUpdatedAt: Boolean! = false | ||||||
|  |   $includeCueObjectFeatures: Boolean! = false | ||||||
|  |   $includePocketingIntentionFeatures: Boolean! = false | ||||||
|  |   $includeCueObjectDistance: Boolean! = false | ||||||
|  |   $includeCueObjectAngle: Boolean! = false | ||||||
|  |   $includeCueBallSpeed: Boolean! = false | ||||||
|  |   $includeShotDirection: Boolean! = false | ||||||
|  |   $includeTargetPocketDistance: Boolean! = false | ||||||
|  |   $includeMake: Boolean! = false | ||||||
|  |   $includeIntendedPocketType: Boolean! = false | ||||||
|  | ) { | ||||||
|   getShots(filterInput: $filterInput) { |   getShots(filterInput: $filterInput) { | ||||||
|     id |     id | ||||||
|     videoId |     videoId | ||||||
|     startFrame |     startFrame | ||||||
|     endFrame |     endFrame | ||||||
|     serializedShotPaths { |     user { | ||||||
|       b64EncodedBuffer |       id | ||||||
|  |     } | ||||||
|  |     createdAt @include(if: $includeCreatedAt) | ||||||
|  |     updatedAt @include(if: $includeUpdatedAt) | ||||||
|  |     cueObjectFeatures @include(if: $includeCueObjectFeatures) { | ||||||
|  |       cueObjectDistance @include(if: $includeCueObjectDistance) | ||||||
|  |       cueObjectAngle @include(if: $includeCueObjectAngle) | ||||||
|  |       cueBallSpeed @include(if: $includeCueBallSpeed) | ||||||
|  |       shotDirection @include(if: $includeShotDirection) | ||||||
|  |     } | ||||||
|  |     pocketingIntentionFeatures | ||||||
|  |       @include(if: $includePocketingIntentionFeatures) { | ||||||
|  |       targetPocketDistance @include(if: $includeTargetPocketDistance) | ||||||
|  |       make @include(if: $includeMake) | ||||||
|  |       intendedPocketType @include(if: $includeIntendedPocketType) | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
| } | } | ||||||
| @@ -16,141 +43,3 @@ query GetShotAnnotationTypes { | |||||||
|     name |     name | ||||||
|   } |   } | ||||||
| } | } | ||||||
|  |  | ||||||
| mutation UpdateShotAnnotations( |  | ||||||
|   $shotId: Int! |  | ||||||
|   $annotations: [UpdateAnnotationInputGQL!]! |  | ||||||
| ) { |  | ||||||
|   updateShotAnnotations(shotId: $shotId, annotations: $annotations) { |  | ||||||
|     shot { |  | ||||||
|       id |  | ||||||
|       annotations { |  | ||||||
|         shotId |  | ||||||
|         type { |  | ||||||
|           id |  | ||||||
|           name |  | ||||||
|         } |  | ||||||
|         notes |  | ||||||
|       } |  | ||||||
|     } |  | ||||||
|     error { |  | ||||||
|       shotId |  | ||||||
|       msg |  | ||||||
|     } |  | ||||||
|   } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| query GetShotsWithVideoGql( |  | ||||||
|   $filterInput: FilterInput! |  | ||||||
|   $shotsOrdering: GetShotsOrdering |  | ||||||
|   $limit: Int |  | ||||||
| ) { |  | ||||||
|   getOrderedShots( |  | ||||||
|     filterInput: $filterInput |  | ||||||
|     shotsOrdering: $shotsOrdering |  | ||||||
|     limit: $limit |  | ||||||
|   ) { |  | ||||||
|     shots { |  | ||||||
|       id |  | ||||||
|       videoId |  | ||||||
|       video { |  | ||||||
|         screenshotUri |  | ||||||
|         endTime |  | ||||||
|       } |  | ||||||
|     } |  | ||||||
|   } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| ## Reserved for playlists (which are created from a filter) |  | ||||||
| query GetShotsWithMetadataFilterResult( |  | ||||||
|   $filterInput: FilterInput! |  | ||||||
|   $shotsOrdering: GetShotsOrdering |  | ||||||
|   $limit: Int |  | ||||||
|   $ids: [Int!] |  | ||||||
| ) { |  | ||||||
|   getOrderedShots( |  | ||||||
|     filterInput: $filterInput |  | ||||||
|     shotsOrdering: $shotsOrdering |  | ||||||
|     limit: $limit |  | ||||||
|     ids: $ids |  | ||||||
|   ) { |  | ||||||
|     count |  | ||||||
|     shots { |  | ||||||
|       ...ShotWithAllFeatures |  | ||||||
|     } |  | ||||||
|     ids |  | ||||||
|   } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| # TODO: Delete |  | ||||||
| query GetShotsWithMetadata( |  | ||||||
|   $filterInput: FilterInput! |  | ||||||
|   $shotsPagination: GetShotsPagination |  | ||||||
|   $limit: Int |  | ||||||
|   $ids: [Int!] |  | ||||||
| ) { |  | ||||||
|   getShotsWithMetadata( |  | ||||||
|     filterInput: $filterInput |  | ||||||
|     shotsPagination: $shotsPagination |  | ||||||
|     limit: $limit |  | ||||||
|     ids: $ids |  | ||||||
|   ) { |  | ||||||
|     count |  | ||||||
|     shots { |  | ||||||
|       ...ShotWithAllFeatures |  | ||||||
|     } |  | ||||||
|     ids |  | ||||||
|   } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| query GetShotsByIds($ids: [Int!]!) { |  | ||||||
|   getShotsByIds(ids: $ids) { |  | ||||||
|     ...ShotWithAllFeatures |  | ||||||
|   } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| fragment ShotWithAllFeatures on ShotGQL { |  | ||||||
|   id |  | ||||||
|   videoId |  | ||||||
|   startFrame |  | ||||||
|   endFrame |  | ||||||
|   startTime @client |  | ||||||
|   endTime @client |  | ||||||
|   user { |  | ||||||
|     id |  | ||||||
|   } |  | ||||||
|   falsePositiveScore |  | ||||||
|   createdAt |  | ||||||
|   updatedAt |  | ||||||
|   cueObjectFeatures { |  | ||||||
|     cueObjectDistance |  | ||||||
|     cueObjectAngle |  | ||||||
|     cueBallSpeed |  | ||||||
|     shotDirection |  | ||||||
|     spinType |  | ||||||
|   } |  | ||||||
|   pocketingIntentionFeatures { |  | ||||||
|     make |  | ||||||
|     targetPocketDistance |  | ||||||
|     targetPocketAngle |  | ||||||
|     targetPocketAngleDirection |  | ||||||
|     marginOfErrorInDegrees |  | ||||||
|     intendedPocketType |  | ||||||
|   } |  | ||||||
|   pocketingIntentionInfo { |  | ||||||
|     ballId |  | ||||||
|     pocketId |  | ||||||
|     pathMetadataIndex |  | ||||||
|   } |  | ||||||
|   serializedShotPaths { |  | ||||||
|     b64EncodedBuffer |  | ||||||
|   } |  | ||||||
|   annotations { |  | ||||||
|     shotId |  | ||||||
|     type { |  | ||||||
|       id |  | ||||||
|       name |  | ||||||
|     } |  | ||||||
|     notes |  | ||||||
|   } |  | ||||||
| } |  | ||||||
|   | |||||||
| @@ -1,20 +1,9 @@ | |||||||
| mutation getProfileImageUploadLink($fileExt: String = ".png") { | mutation getProfileImageUploadLink($fileExt: String = ".png") { | ||||||
|   getProfileImageUploadLink(fileExt: $fileExt) { |   getProfileImageUploadLink(fileExt: $fileExt) { | ||||||
|     value { |     uploadUrl | ||||||
|       ... on UploadLink { |     headers { | ||||||
|         uploadUrl |       key | ||||||
|         headers { |       value | ||||||
|           key |  | ||||||
|           value |  | ||||||
|         } |  | ||||||
|       } |  | ||||||
|       ... on GetProfileUploadLinkErrors { |  | ||||||
|         error { |  | ||||||
|           ... on TooManyProfileImageUploadsErr { |  | ||||||
|             linksRequested |  | ||||||
|           } |  | ||||||
|         } |  | ||||||
|       } |  | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
| } | } | ||||||
| @@ -37,7 +26,6 @@ query getLoggedInUser { | |||||||
|     username |     username | ||||||
|     isAdmin |     isAdmin | ||||||
|     profileImageUri |     profileImageUri | ||||||
|     fargoRating |  | ||||||
|     activeVideoId |     activeVideoId | ||||||
|     createdAt |     createdAt | ||||||
|     updatedAt |     updatedAt | ||||||
| @@ -57,71 +45,3 @@ query getUsernames( | |||||||
| ) { | ) { | ||||||
|   getUsernames(matchString: $matchString, limit: $limit, after: $after) |   getUsernames(matchString: $matchString, limit: $limit, after: $after) | ||||||
| } | } | ||||||
|  |  | ||||||
| query getUserRelationshipsMatching( |  | ||||||
|   $userId: Int! |  | ||||||
|   $matchString: String! |  | ||||||
|   $limit: Int = null |  | ||||||
|   $after: String = null |  | ||||||
| ) { |  | ||||||
|   getUserRelationshipsMatching( |  | ||||||
|     userId: $userId |  | ||||||
|     matchString: $matchString |  | ||||||
|     limit: $limit |  | ||||||
|     after: $after |  | ||||||
|   ) { |  | ||||||
|     relationships { |  | ||||||
|       toUser { |  | ||||||
|         username |  | ||||||
|         id |  | ||||||
|       } |  | ||||||
|       toUserFollows |  | ||||||
|       toUserIsFollowedBy |  | ||||||
|     } |  | ||||||
|   } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| query GetUserTags { |  | ||||||
|   getUserTags { |  | ||||||
|     id |  | ||||||
|     name |  | ||||||
|   } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| mutation followUser($followedUserId: Int!) { |  | ||||||
|   followUser(followedUserId: $followedUserId) { |  | ||||||
|     username |  | ||||||
|     following { |  | ||||||
|       id |  | ||||||
|     } |  | ||||||
|     followers { |  | ||||||
|       id |  | ||||||
|     } |  | ||||||
|   } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| mutation unfollowUser($followedUserId: Int!) { |  | ||||||
|   unfollowUser(followedUserId: $followedUserId) { |  | ||||||
|     username |  | ||||||
|     following { |  | ||||||
|       id |  | ||||||
|     } |  | ||||||
|     followers { |  | ||||||
|       id |  | ||||||
|     } |  | ||||||
|   } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| query getUserFollowingFollowers { |  | ||||||
|   getLoggedInUser { |  | ||||||
|     id |  | ||||||
|     following { |  | ||||||
|       id |  | ||||||
|       username |  | ||||||
|     } |  | ||||||
|     followers { |  | ||||||
|       id |  | ||||||
|       username |  | ||||||
|     } |  | ||||||
|   } |  | ||||||
| } |  | ||||||
|   | |||||||
| @@ -1,10 +1,10 @@ | |||||||
| query GetStreamMonitoringDetails($videoId: Int!, $debuggingJson: JSON) { | query GetStreamMonitoringDetails($videoId: Int!) { | ||||||
|   getVideo(videoId: $videoId, debuggingJson: $debuggingJson) { |   getVideo(videoId: $videoId) { | ||||||
|     id |     id | ||||||
|     totalShots |     totalShots | ||||||
|     makePercentage |     makePercentage | ||||||
|     elapsedTime |     elapsedTime | ||||||
|     currentHomography { |     homographyHistory { | ||||||
|       crop { |       crop { | ||||||
|         left |         left | ||||||
|         top |         top | ||||||
| @@ -45,7 +45,6 @@ query GetStreamMonitoringDetails($videoId: Int!, $debuggingJson: JSON) { | |||||||
|       } |       } | ||||||
|     } |     } | ||||||
|     stream { |     stream { | ||||||
|       id |  | ||||||
|       linksRequested |       linksRequested | ||||||
|       uploadsCompleted |       uploadsCompleted | ||||||
|       segmentProcessingCursor |       segmentProcessingCursor | ||||||
| @@ -71,7 +70,6 @@ query GetVideoUpdatePageDetails($videoId: Int!) { | |||||||
|     totalShots |     totalShots | ||||||
|     makePercentage |     makePercentage | ||||||
|     elapsedTime |     elapsedTime | ||||||
|     tableSize |  | ||||||
|     tags { |     tags { | ||||||
|       tagClasses { |       tagClasses { | ||||||
|         name |         name | ||||||
| @@ -100,7 +98,6 @@ query GetVideoDetails($videoId: Int!) { | |||||||
|     totalShotsMade |     totalShotsMade | ||||||
|     createdAt |     createdAt | ||||||
|     updatedAt |     updatedAt | ||||||
|     tableSize |  | ||||||
|     owner { |     owner { | ||||||
|       id |       id | ||||||
|       firebaseUid |       firebaseUid | ||||||
| @@ -118,32 +115,20 @@ query GetVideoDetails($videoId: Int!) { | |||||||
|  |  | ||||||
| query GetVideos($videoIds: [Int!]!) { | query GetVideos($videoIds: [Int!]!) { | ||||||
|   getVideos(videoIds: $videoIds) { |   getVideos(videoIds: $videoIds) { | ||||||
|     ...VideoStreamMetadata |  | ||||||
|   } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| fragment VideoStreamMetadata on VideoGQL { |  | ||||||
|   id |  | ||||||
|   framesPerSecond |  | ||||||
|   stream { |  | ||||||
|     id |     id | ||||||
|     streamSegmentType |     playlist { | ||||||
|     segments { |       segmentDurations | ||||||
|       uploaded |     } | ||||||
|       valid |     stream { | ||||||
|       segmentIndex |       id | ||||||
|       endFrameIndex |       segments { | ||||||
|       framesPerSecond |         uploaded | ||||||
|  |         valid | ||||||
|  |         segmentIndex | ||||||
|  |         endFrameIndex | ||||||
|  |         framesPerSecond | ||||||
|  |       } | ||||||
|     } |     } | ||||||
|   } |  | ||||||
|   playlist { |  | ||||||
|     segmentDurations |  | ||||||
|   } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| query GetVideoForShotTime($videoId: Int!) { |  | ||||||
|   getVideo(videoId: $videoId) { |  | ||||||
|     ...VideoStreamMetadata |  | ||||||
|   } |   } | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -153,59 +138,12 @@ query GetVideo($videoId: Int!) { | |||||||
|     playlist { |     playlist { | ||||||
|       segmentDurations |       segmentDurations | ||||||
|     } |     } | ||||||
|     homographyHistory { |  | ||||||
|       frameIndex |  | ||||||
|       crop { |  | ||||||
|         left |  | ||||||
|         top |  | ||||||
|         width |  | ||||||
|         height |  | ||||||
|       } |  | ||||||
|       pockets { |  | ||||||
|         left |  | ||||||
|         top |  | ||||||
|         width |  | ||||||
|         height |  | ||||||
|       } |  | ||||||
|       sourcePoints { |  | ||||||
|         topLeft { |  | ||||||
|           x |  | ||||||
|           y |  | ||||||
|         } |  | ||||||
|         topSide { |  | ||||||
|           x |  | ||||||
|           y |  | ||||||
|         } |  | ||||||
|         topRight { |  | ||||||
|           x |  | ||||||
|           y |  | ||||||
|         } |  | ||||||
|         bottomLeft { |  | ||||||
|           x |  | ||||||
|           y |  | ||||||
|         } |  | ||||||
|         bottomSide { |  | ||||||
|           x |  | ||||||
|           y |  | ||||||
|         } |  | ||||||
|         bottomRight { |  | ||||||
|           x |  | ||||||
|           y |  | ||||||
|         } |  | ||||||
|       } |  | ||||||
|     } |  | ||||||
|     stream { |     stream { | ||||||
|       id |  | ||||||
|       streamSegmentType |  | ||||||
|       segments { |       segments { | ||||||
|         segmentIndex |         segmentIndex | ||||||
|         endFrameIndex |         endFrameIndex | ||||||
|         framesPerSecond |         framesPerSecond | ||||||
|       } |       } | ||||||
|       resolution { |  | ||||||
|         width |  | ||||||
|         height |  | ||||||
|       } |  | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
| } | } | ||||||
| @@ -216,75 +154,15 @@ query GetAverageTimePerShotForVideo($videoId: Int!) { | |||||||
|     averageTimeBetweenShots |     averageTimeBetweenShots | ||||||
|   } |   } | ||||||
| } | } | ||||||
|  |  | ||||||
| query GetElapsedTimeForVideo($videoId: Int!) { | query GetElapsedTimeForVideo($videoId: Int!) { | ||||||
|   getVideo(videoId: $videoId) { |   getVideo(videoId: $videoId) { | ||||||
|     id |     id | ||||||
|     elapsedTime |     elapsedTime | ||||||
|   } |   } | ||||||
| } | } | ||||||
|  |  | ||||||
| query GetMedianRunForVideo($videoId: Int!) { | query GetMedianRunForVideo($videoId: Int!) { | ||||||
|   getVideo(videoId: $videoId) { |   getVideo(videoId: $videoId) { | ||||||
|     id |     id | ||||||
|     medianRun |     medianRun | ||||||
|   } |   } | ||||||
| } | } | ||||||
|  |  | ||||||
| fragment StreamWithEndFrames on UploadStreamGQL { |  | ||||||
|   id |  | ||||||
|   streamSegmentType |  | ||||||
|   segmentEndFrames @client |  | ||||||
|   resolution { |  | ||||||
|     width |  | ||||||
|     height |  | ||||||
|   } |  | ||||||
|   segments { |  | ||||||
|     uploaded |  | ||||||
|     valid |  | ||||||
|     segmentIndex |  | ||||||
|     endFrameIndex |  | ||||||
|     framesPerSecond |  | ||||||
|   } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| fragment SegmentEndFrames on SegmentEndFramesGQL { |  | ||||||
|   id |  | ||||||
|   segmentEndFrames |  | ||||||
| } |  | ||||||
|  |  | ||||||
| fragment SegmentStartTimes on SegmentStartTimesGQL { |  | ||||||
|   id |  | ||||||
|   segmentStartTimes |  | ||||||
| } |  | ||||||
|  |  | ||||||
| fragment PlaylistWithSegmentStartTimes on HLSPlaylistGQL { |  | ||||||
|   videoId |  | ||||||
|   segmentDurations |  | ||||||
|   segmentStartTimes @client |  | ||||||
| } |  | ||||||
|  |  | ||||||
| fragment VideoDurationData on VideoGQL { |  | ||||||
|   id |  | ||||||
|   framesPerSecond |  | ||||||
|   playlist { |  | ||||||
|     ...PlaylistWithSegmentStartTimes |  | ||||||
|   } |  | ||||||
|   stream { |  | ||||||
|     ...StreamWithEndFrames |  | ||||||
|   } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| query GetVideoForClipTimes($videoId: Int!) { |  | ||||||
|   getVideo(videoId: $videoId) { |  | ||||||
|     ...VideoDurationData |  | ||||||
|   } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| query GetHeaderInfoByVideoId($videoId: Int!) { |  | ||||||
|   getVideo(videoId: $videoId) { |  | ||||||
|     id |  | ||||||
|     name |  | ||||||
|     startTime |  | ||||||
|   } |  | ||||||
| } |  | ||||||
|   | |||||||
| @@ -6,63 +6,20 @@ mutation CreateUploadStream($videoMetadataInput: VideoMetadataInput!) { | |||||||
|  |  | ||||||
| mutation GetUploadLink($videoId: Int!, $segmentIndex: Int!) { | mutation GetUploadLink($videoId: Int!, $segmentIndex: Int!) { | ||||||
|   getUploadLink(videoId: $videoId, segmentIndex: $segmentIndex) { |   getUploadLink(videoId: $videoId, segmentIndex: $segmentIndex) { | ||||||
|     value { |     uploadUrl | ||||||
|       ... on UploadLink { |     headers { | ||||||
|         uploadUrl |       key | ||||||
|         headers { |       value | ||||||
|           key |  | ||||||
|           value |  | ||||||
|         } |  | ||||||
|       } |  | ||||||
|       ... on GetUploadLinkErrors { |  | ||||||
|         error { |  | ||||||
|           ... on MustHaveSetForUploadLinkErr { |  | ||||||
|             resolution |  | ||||||
|             framesPerSecond |  | ||||||
|           } |  | ||||||
|           ... on SegmentAlreadyUploadedErr { |  | ||||||
|             segmentId |  | ||||||
|           } |  | ||||||
|           ... on ProcessingFailedErr { |  | ||||||
|             processing { |  | ||||||
|               status |  | ||||||
|               errors { |  | ||||||
|                 message |  | ||||||
|               } |  | ||||||
|             } |  | ||||||
|           } |  | ||||||
|         } |  | ||||||
|       } |  | ||||||
|     } |  | ||||||
|     stream { |  | ||||||
|       uploadCompletionCursor |  | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
| } | } | ||||||
|  |  | ||||||
| mutation GetHlsInitUploadLink($videoId: Int!) { | mutation GetHlsInitUploadLink($videoId: Int!) { | ||||||
|   getHlsInitUploadLink(videoId: $videoId) { |   getHlsInitUploadLink(videoId: $videoId) { | ||||||
|     value { |     uploadUrl | ||||||
|       ... on UploadLink { |     headers { | ||||||
|         uploadUrl |       key | ||||||
|         headers { |       value | ||||||
|           key |  | ||||||
|           value |  | ||||||
|         } |  | ||||||
|       } |  | ||||||
|       ... on GetUploadLinkErrors { |  | ||||||
|         error { |  | ||||||
|           ... on NoInitForChunkedUploadErr { |  | ||||||
|             segmentType |  | ||||||
|           } |  | ||||||
|           ... on InitUploadAlreadyCompletedErr { |  | ||||||
|             segmentType |  | ||||||
|           } |  | ||||||
|           ... on TooManyInitUploadsErr { |  | ||||||
|             linksRequested |  | ||||||
|           } |  | ||||||
|         } |  | ||||||
|       } |  | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
| } | } | ||||||
| @@ -115,7 +72,6 @@ query GetUploadStreamsWithDetails( | |||||||
|         isCompleted |         isCompleted | ||||||
|         lastIntendedSegmentBound |         lastIntendedSegmentBound | ||||||
|         uploadCompletionCursor |         uploadCompletionCursor | ||||||
|         uploadsCompleted |  | ||||||
|       } |       } | ||||||
|     } |     } | ||||||
|     pageInfo { |     pageInfo { | ||||||
|   | |||||||
							
								
								
									
										440
									
								
								src/schema.gql
									
									
									
									
									
								
							
							
						
						
									
										440
									
								
								src/schema.gql
									
									
									
									
									
								
							| @@ -4,30 +4,12 @@ type Query { | |||||||
|   ): [AggregateResultGQL!]! |   ): [AggregateResultGQL!]! | ||||||
|   getBucketSet(keyName: String!): BucketSetGQL |   getBucketSet(keyName: String!): BucketSetGQL | ||||||
|   getDeployedConfig: DeployedConfigGQL! |   getDeployedConfig: DeployedConfigGQL! | ||||||
|   waitFor(duration: Float!): Float! |  | ||||||
|   getVideoMakePercentageIntervals( |   getVideoMakePercentageIntervals( | ||||||
|     videoId: ID! |     videoId: ID! | ||||||
|     intervalDuration: Int! = 300 |     intervalDuration: Int! = 300 | ||||||
|   ): [MakePercentageIntervalGQL!]! |   ): [MakePercentageIntervalGQL!]! | ||||||
|   getOrderedShots( |   getShots(filterInput: FilterInput!): [ShotGQL!]! | ||||||
|     filterInput: FilterInput! |   getShotAnnotationTypes: [ShotAnnotationTypeGQL!]! | ||||||
|     ids: [Int!] = null |  | ||||||
|     shotsOrdering: GetShotsOrdering = null |  | ||||||
|     limit: Int! = 500 |  | ||||||
|   ): GetShotsResult! |  | ||||||
|   getShotsWithMetadata( |  | ||||||
|     filterInput: FilterInput! |  | ||||||
|     ids: [Int!] = null |  | ||||||
|     shotsPagination: GetShotsPagination = null |  | ||||||
|     limit: Int! = 500 |  | ||||||
|   ): GetShotsResult! |  | ||||||
|   getShots( |  | ||||||
|     filterInput: FilterInput! |  | ||||||
|     shotsPagination: GetShotsPagination = null |  | ||||||
|     limit: Int! = 500 |  | ||||||
|   ): [ShotGQL!]! |  | ||||||
|   getShotsByIds(ids: [Int!]!): [ShotGQL!]! |  | ||||||
|   getShotAnnotationTypes(errorTypes: Boolean = false): [ShotAnnotationTypeGQL!]! |  | ||||||
|   getUser(userId: Int!): UserGQL |   getUser(userId: Int!): UserGQL | ||||||
|   getLoggedInUser: UserGQL |   getLoggedInUser: UserGQL | ||||||
|   getUsernames( |   getUsernames( | ||||||
| @@ -35,12 +17,6 @@ type Query { | |||||||
|     limit: Int = null |     limit: Int = null | ||||||
|     after: String = null |     after: String = null | ||||||
|   ): [String!]! |   ): [String!]! | ||||||
|   getUserRelationshipsMatching( |  | ||||||
|     userId: Int! |  | ||||||
|     matchString: String = null |  | ||||||
|     limit: Int = 100 |  | ||||||
|     after: String = null |  | ||||||
|   ): UserRelationshipsResult! |  | ||||||
|   getPlayTime(userId: Int!): UserPlayTimeGQL! |   getPlayTime(userId: Int!): UserPlayTimeGQL! | ||||||
|   getUserVideos( |   getUserVideos( | ||||||
|     userId: Int = null |     userId: Int = null | ||||||
| @@ -48,14 +24,8 @@ type Query { | |||||||
|     after: String = null |     after: String = null | ||||||
|     filters: VideoFilterInput = null |     filters: VideoFilterInput = null | ||||||
|   ): VideoHistoryGQL! |   ): VideoHistoryGQL! | ||||||
|   getUserTags: [TagGQL!]! |   getVideo(videoId: Int!): VideoGQL! | ||||||
|   getVideo(videoId: Int!, debuggingJson: JSON = null): VideoGQL! |  | ||||||
|   getVideos(videoIds: [Int!]!): [VideoGQL!]! |   getVideos(videoIds: [Int!]!): [VideoGQL!]! | ||||||
|   getFeedVideos( |  | ||||||
|     limit: Int! = 5 |  | ||||||
|     after: String = null |  | ||||||
|     filters: VideoFilterInput = null |  | ||||||
|   ): VideoHistoryGQL! |  | ||||||
| } | } | ||||||
|  |  | ||||||
| type AggregateResultGQL { | type AggregateResultGQL { | ||||||
| @@ -72,21 +42,6 @@ type TargetMetricsGQL { | |||||||
|   count: Int! |   count: Int! | ||||||
|   makePercentage: Float |   makePercentage: Float | ||||||
|   averageDifficulty: Float |   averageDifficulty: Float | ||||||
|   spinTypeCounts: SpinTypeCountsGQL |  | ||||||
|   shotDirectionCounts: ShotDirectionCountsGQL |  | ||||||
| } |  | ||||||
|  |  | ||||||
| type SpinTypeCountsGQL { |  | ||||||
|   follow: Int! |  | ||||||
|   draw: Int! |  | ||||||
|   center: Int! |  | ||||||
|   unknown: Int! |  | ||||||
| } |  | ||||||
|  |  | ||||||
| type ShotDirectionCountsGQL { |  | ||||||
|   left: Int! |  | ||||||
|   right: Int! |  | ||||||
|   straight: Int! |  | ||||||
| } | } | ||||||
|  |  | ||||||
| input AggregateInputGQL { | input AggregateInputGQL { | ||||||
| @@ -97,7 +52,6 @@ input AggregateInputGQL { | |||||||
| input AggregationInput @oneOf { | input AggregationInput @oneOf { | ||||||
|   bucketSet: BucketSetInputGQL |   bucketSet: BucketSetInputGQL | ||||||
|   enum: EnumAggregation |   enum: EnumAggregation | ||||||
|   datetimeRange: DatetimeRangeAggregationInput |  | ||||||
| } | } | ||||||
|  |  | ||||||
| input BucketSetInputGQL { | input BucketSetInputGQL { | ||||||
| @@ -114,52 +68,19 @@ input EnumAggregation { | |||||||
|   feature: String! |   feature: String! | ||||||
| } | } | ||||||
|  |  | ||||||
| input DatetimeRangeAggregationInput { |  | ||||||
|   startDatetime: DateTime = null |  | ||||||
|   endDatetime: DateTime = null |  | ||||||
|   interval: TimeInterval! |  | ||||||
|   feature: String! = "created_at" |  | ||||||
| } |  | ||||||
|  |  | ||||||
| """ |  | ||||||
| Date with time (isoformat) |  | ||||||
| """ |  | ||||||
| scalar DateTime |  | ||||||
|  |  | ||||||
| input TimeInterval @oneOf { |  | ||||||
|   timedelta: TimeDeltaGQL |  | ||||||
|   aligned: AlignedIntervalEnum |  | ||||||
| } |  | ||||||
|  |  | ||||||
| input TimeDeltaGQL { |  | ||||||
|   days: Int = 0 |  | ||||||
|   weeks: Int = 0 |  | ||||||
|   months: Int = 0 |  | ||||||
|   years: Int = 0 |  | ||||||
| } |  | ||||||
|  |  | ||||||
| enum AlignedIntervalEnum { |  | ||||||
|   MONTH |  | ||||||
|   YEAR |  | ||||||
|   WEEK |  | ||||||
|   DAY |  | ||||||
| } |  | ||||||
|  |  | ||||||
| input FilterInput @oneOf { | input FilterInput @oneOf { | ||||||
|   andFilters: [FilterInput!] |   andFilters: [FilterInput!] | ||||||
|   orFilters: [FilterInput!] |   orFilters: [FilterInput!] | ||||||
|   notFilter: FilterInput |   notFilter: FilterInput | ||||||
|   cueObjectDistance: FloatRangeFilter |   cueObjectDistance: RangeFilter | ||||||
|   targetPocketDistance: FloatRangeFilter |   targetPocketDistance: RangeFilter | ||||||
|   cueObjectAngle: FloatRangeFilter |   cueObjectAngle: RangeFilter | ||||||
|   cueBallSpeed: FloatRangeFilter |   cueBallSpeed: RangeFilter | ||||||
|   difficulty: FloatRangeFilter |   difficulty: RangeFilter | ||||||
|   intendedPocketType: [PocketEnum!] |   intendedPocketType: [PocketEnum!] | ||||||
|   shotDirection: [ShotDirectionEnum!] |   shotDirection: [ShotDirectionEnum!] | ||||||
|   videoId: [Int!] |   videoId: [Int!] | ||||||
|   userId: [Int!] |   userId: [Int!] | ||||||
|   username: [String!] |  | ||||||
|   fargoRating: FloatRangeFilter |  | ||||||
|   make: [Boolean!] |   make: [Boolean!] | ||||||
|   tags: [VideoTagInput!] |   tags: [VideoTagInput!] | ||||||
|   annotations: [ShotAnnotationInput!] |   annotations: [ShotAnnotationInput!] | ||||||
| @@ -169,32 +90,15 @@ input FilterInput @oneOf { | |||||||
|   isLeftMiss: [Boolean!] |   isLeftMiss: [Boolean!] | ||||||
|   isRightMiss: [Boolean!] |   isRightMiss: [Boolean!] | ||||||
|   isDirect: [Boolean!] |   isDirect: [Boolean!] | ||||||
|   tableSize: FloatRangeFilter |   bankAngle: RangeFilter | ||||||
|   bankAngle: FloatRangeFilter |   bankDistance: RangeFilter | ||||||
|   bankDistance: FloatRangeFilter |   kickAngle: RangeFilter | ||||||
|   kickAngle: FloatRangeFilter |   kickDistance: RangeFilter | ||||||
|   kickDistance: FloatRangeFilter |  | ||||||
|   cueAngleAfterObject: FloatRangeFilter |  | ||||||
|   spinType: [SpinTypeEnum!] |  | ||||||
|   cueSpeedAfterObject: FloatRangeFilter |  | ||||||
|   falsePositiveScore: FloatRangeFilter |  | ||||||
|   backcut: [Boolean!] |  | ||||||
|   targetPocketAngleDirection: [ShotDirectionEnum!] |  | ||||||
|   targetPocketAngle: FloatRangeFilter |  | ||||||
|   missAngleInDegrees: FloatRangeFilter |  | ||||||
|   marginOfErrorInDegrees: FloatRangeFilter |  | ||||||
|   createdAt: DateRangeFilter |  | ||||||
|   totalDistance: FloatRangeFilter |  | ||||||
|   runLength: FloatRangeFilter |  | ||||||
| } | } | ||||||
|  |  | ||||||
| input FloatRangeFilter { | input RangeFilter { | ||||||
|   lessThan: Float = null |   lessThan: Float = null | ||||||
|   greaterThanEqualTo: Float = null |   greaterThanEqualTo: Float = null | ||||||
|   greaterThan: Float = null |  | ||||||
|   includeOnNone: Boolean! = false |  | ||||||
|   lessThanInclusive: Boolean! = false |  | ||||||
|   greaterThanInclusive: Boolean! = true |  | ||||||
| } | } | ||||||
|  |  | ||||||
| enum PocketEnum { | enum PocketEnum { | ||||||
| @@ -221,27 +125,6 @@ input ShotAnnotationInput { | |||||||
|   name: String! |   name: String! | ||||||
| } | } | ||||||
|  |  | ||||||
| enum SpinTypeEnum { |  | ||||||
|   DRAW |  | ||||||
|   FOLLOW |  | ||||||
|   CENTER |  | ||||||
|   UNKNOWN |  | ||||||
| } |  | ||||||
|  |  | ||||||
| input DateRangeFilter { |  | ||||||
|   lessThan: Date = null |  | ||||||
|   greaterThanEqualTo: Date = null |  | ||||||
|   greaterThan: Date = null |  | ||||||
|   includeOnNone: Boolean! = false |  | ||||||
|   lessThanInclusive: Boolean! = false |  | ||||||
|   greaterThanInclusive: Boolean! = true |  | ||||||
| } |  | ||||||
|  |  | ||||||
| """ |  | ||||||
| Date (isoformat) |  | ||||||
| """ |  | ||||||
| scalar Date |  | ||||||
|  |  | ||||||
| type BucketSetGQL { | type BucketSetGQL { | ||||||
|   keyName: String! |   keyName: String! | ||||||
|   feature: String! |   feature: String! | ||||||
| @@ -258,7 +141,6 @@ type DeployedConfigGQL { | |||||||
|   firebase: Boolean! |   firebase: Boolean! | ||||||
|   devMode: Boolean! |   devMode: Boolean! | ||||||
|   environment: String! |   environment: String! | ||||||
|   minimumAllowedAppVersion: String! |  | ||||||
| } | } | ||||||
|  |  | ||||||
| type MakePercentageIntervalGQL { | type MakePercentageIntervalGQL { | ||||||
| @@ -266,12 +148,6 @@ type MakePercentageIntervalGQL { | |||||||
|   elapsedTime: Float! |   elapsedTime: Float! | ||||||
| } | } | ||||||
|  |  | ||||||
| type GetShotsResult { |  | ||||||
|   shots: [ShotGQL!]! |  | ||||||
|   count: Int |  | ||||||
|   ids: [Int!]! |  | ||||||
| } |  | ||||||
|  |  | ||||||
| type ShotGQL { | type ShotGQL { | ||||||
|   id: Int! |   id: Int! | ||||||
|   videoId: Int! |   videoId: Int! | ||||||
| @@ -281,21 +157,22 @@ type ShotGQL { | |||||||
|   updatedAt: DateTime |   updatedAt: DateTime | ||||||
|   cueObjectFeatures: CueObjectFeaturesGQL |   cueObjectFeatures: CueObjectFeaturesGQL | ||||||
|   pocketingIntentionFeatures: PocketingIntentionFeaturesGQL |   pocketingIntentionFeatures: PocketingIntentionFeaturesGQL | ||||||
|   pocketingIntentionInfo: PocketingIntentionInfoGQL |  | ||||||
|   bankFeatures: BankFeaturesGQL |   bankFeatures: BankFeaturesGQL | ||||||
|   serializedShotPaths: SerializedShotPathsGQL |   serializedShotPaths: SerializedShotPathsGQL | ||||||
|   user: UserGQL |   user: UserGQL | ||||||
|   annotations: [ShotAnnotationGQL!]! |   annotations: [ShotAnnotationGQL!]! | ||||||
|   falsePositiveScore: Float |  | ||||||
|   video: VideoGQL |  | ||||||
| } | } | ||||||
|  |  | ||||||
|  | """ | ||||||
|  | Date with time (isoformat) | ||||||
|  | """ | ||||||
|  | scalar DateTime | ||||||
|  |  | ||||||
| type CueObjectFeaturesGQL { | type CueObjectFeaturesGQL { | ||||||
|   cueObjectDistance: Float |   cueObjectDistance: Float | ||||||
|   cueObjectAngle: Float |   cueObjectAngle: Float | ||||||
|   cueBallSpeed: Float |   cueBallSpeed: Float | ||||||
|   shotDirection: ShotDirectionEnum |   shotDirection: ShotDirectionEnum | ||||||
|   spinType: SpinTypeEnum |  | ||||||
| } | } | ||||||
|  |  | ||||||
| type PocketingIntentionFeaturesGQL { | type PocketingIntentionFeaturesGQL { | ||||||
| @@ -303,25 +180,6 @@ type PocketingIntentionFeaturesGQL { | |||||||
|   make: Boolean |   make: Boolean | ||||||
|   intendedPocketType: PocketEnum |   intendedPocketType: PocketEnum | ||||||
|   difficulty: Float |   difficulty: Float | ||||||
|   targetPocketAngle: Float |  | ||||||
|   targetPocketAngleDirection: ShotDirectionEnum |  | ||||||
|   marginOfErrorInDegrees: Float |  | ||||||
|   backcut: Boolean |  | ||||||
| } |  | ||||||
|  |  | ||||||
| type PocketingIntentionInfoGQL { |  | ||||||
|   ballId: Int! |  | ||||||
|   pocketId: PocketIdentifier! |  | ||||||
|   pathMetadataIndex: Int! |  | ||||||
| } |  | ||||||
|  |  | ||||||
| enum PocketIdentifier { |  | ||||||
|   TOP_LEFT |  | ||||||
|   TOP_SIDE |  | ||||||
|   TOP_RIGHT |  | ||||||
|   BOTTOM_LEFT |  | ||||||
|   BOTTOM_SIDE |  | ||||||
|   BOTTOM_RIGHT |  | ||||||
| } | } | ||||||
|  |  | ||||||
| type BankFeaturesGQL { | type BankFeaturesGQL { | ||||||
| @@ -341,16 +199,13 @@ type SerializedShotPathsGQL { | |||||||
|  |  | ||||||
| type UserGQL { | type UserGQL { | ||||||
|   id: Int! |   id: Int! | ||||||
|   firebaseUid: String |   firebaseUid: String! | ||||||
|   username: String! |   username: String! | ||||||
|   isAdmin: Boolean |   isAdmin: Boolean! | ||||||
|   fargoRating: Int |  | ||||||
|   activeVideoId: Int |   activeVideoId: Int | ||||||
|   profileImageUri: String |   profileImageUri: String | ||||||
|   createdAt: DateTime |   createdAt: DateTime | ||||||
|   updatedAt: DateTime |   updatedAt: DateTime | ||||||
|   following: [UserGQL!] |  | ||||||
|   followers: [UserGQL!] |  | ||||||
| } | } | ||||||
|  |  | ||||||
| type ShotAnnotationGQL { | type ShotAnnotationGQL { | ||||||
| @@ -358,7 +213,6 @@ type ShotAnnotationGQL { | |||||||
|   type: ShotAnnotationTypeGQL! |   type: ShotAnnotationTypeGQL! | ||||||
|   creator: UserGQL! |   creator: UserGQL! | ||||||
|   notes: String! |   notes: String! | ||||||
|   errorDefault: Boolean! |  | ||||||
|   createdAt: DateTime |   createdAt: DateTime | ||||||
|   updatedAt: DateTime |   updatedAt: DateTime | ||||||
| } | } | ||||||
| @@ -368,6 +222,15 @@ type ShotAnnotationTypeGQL { | |||||||
|   name: String! |   name: String! | ||||||
| } | } | ||||||
|  |  | ||||||
|  | type UserPlayTimeGQL { | ||||||
|  |   totalSeconds: Float! | ||||||
|  | } | ||||||
|  |  | ||||||
|  | type VideoHistoryGQL { | ||||||
|  |   videos: [VideoGQL!]! | ||||||
|  |   pageInfo: PageInfoGQL! | ||||||
|  | } | ||||||
|  |  | ||||||
| type VideoGQL { | type VideoGQL { | ||||||
|   id: Int! |   id: Int! | ||||||
|   owner: UserGQL |   owner: UserGQL | ||||||
| @@ -385,11 +248,9 @@ type VideoGQL { | |||||||
|   endTime: DateTime |   endTime: DateTime | ||||||
|   elapsedTime: Float |   elapsedTime: Float | ||||||
|   framesPerSecond: Float! |   framesPerSecond: Float! | ||||||
|   tableSize: Float! |  | ||||||
|   stream: UploadStreamGQL |   stream: UploadStreamGQL | ||||||
|   playlist: HLSPlaylistGQL |   playlist: HLSPlaylistGQL | ||||||
|   tags: [VideoTag!]! |   tags: [VideoTag!]! | ||||||
|   currentHomography: HomographyInfoGQL |  | ||||||
|   homographyHistory: [HomographyInfoGQL!]! |   homographyHistory: [HomographyInfoGQL!]! | ||||||
|   currentProcessing: VideoProcessingGQL |   currentProcessing: VideoProcessingGQL | ||||||
| } | } | ||||||
| @@ -408,8 +269,6 @@ type UploadStreamGQL { | |||||||
|   createdAt: DateTime! |   createdAt: DateTime! | ||||||
|   updatedAt: DateTime! |   updatedAt: DateTime! | ||||||
|   segments: [UploadSegmentGQL!]! |   segments: [UploadSegmentGQL!]! | ||||||
|   resolution: VideoResolutionGQL! |  | ||||||
|   streamSegmentType: StreamSegmentTypeEnum! |  | ||||||
| } | } | ||||||
|  |  | ||||||
| enum InitPlaylistUploadStatusEnum { | enum InitPlaylistUploadStatusEnum { | ||||||
| @@ -432,16 +291,6 @@ type UploadSegmentGQL { | |||||||
|   linksRequested: Int! |   linksRequested: Int! | ||||||
| } | } | ||||||
|  |  | ||||||
| type VideoResolutionGQL { |  | ||||||
|   width: Int |  | ||||||
|   height: Int |  | ||||||
| } |  | ||||||
|  |  | ||||||
| enum StreamSegmentTypeEnum { |  | ||||||
|   FRAGMENTED_MP4 |  | ||||||
|   RB_CHUNKED_MP4 |  | ||||||
| } |  | ||||||
|  |  | ||||||
| type HLSPlaylistGQL { | type HLSPlaylistGQL { | ||||||
|   videoId: Int! |   videoId: Int! | ||||||
|   m3u8Text: String! |   m3u8Text: String! | ||||||
| @@ -488,8 +337,6 @@ type IntPoint2D { | |||||||
|  |  | ||||||
| type VideoProcessingGQL { | type VideoProcessingGQL { | ||||||
|   errors: [VideoProcessingErrorGQL!]! |   errors: [VideoProcessingErrorGQL!]! | ||||||
|   status: ProcessingStatusEnum! |  | ||||||
|   statuses: [VideoProcessingStatusGQL!]! |  | ||||||
| } | } | ||||||
|  |  | ||||||
| type VideoProcessingErrorGQL { | type VideoProcessingErrorGQL { | ||||||
| @@ -498,82 +345,6 @@ type VideoProcessingErrorGQL { | |||||||
|   endSegmentIndex: Int |   endSegmentIndex: Int | ||||||
| } | } | ||||||
|  |  | ||||||
| enum ProcessingStatusEnum { |  | ||||||
|   STARTED |  | ||||||
|   FAILED |  | ||||||
|   SUCCEEDED |  | ||||||
|   SUSPENDED |  | ||||||
|   CREATED |  | ||||||
|   QUEUED |  | ||||||
|   RUNNING |  | ||||||
|   REEXTRACTING_FEATURES |  | ||||||
| } |  | ||||||
|  |  | ||||||
| type VideoProcessingStatusGQL { |  | ||||||
|   status: ProcessingStatusEnum! |  | ||||||
|   appVersion: String! |  | ||||||
|   sequenceId: Int! |  | ||||||
|   createdAt: DateTime |  | ||||||
|   updatedAt: DateTime |  | ||||||
| } |  | ||||||
|  |  | ||||||
| input GetShotsOrdering { |  | ||||||
|   orderings: [ShotsOrderingComponent!]! |  | ||||||
| } |  | ||||||
|  |  | ||||||
| input ShotsOrderingComponent @oneOf { |  | ||||||
|   videoCreation: DatetimeShotOrdering |  | ||||||
|   marginOfError: FloatShotOrdering |  | ||||||
|   videoId: IntShotOrdering |  | ||||||
|   startFrame: IntShotOrdering |  | ||||||
|   runLength: IntShotOrdering |  | ||||||
| } |  | ||||||
|  |  | ||||||
| input DatetimeShotOrdering { |  | ||||||
|   descending: Boolean! = true |  | ||||||
|   startingAt: DateTime = null |  | ||||||
| } |  | ||||||
|  |  | ||||||
| input FloatShotOrdering { |  | ||||||
|   descending: Boolean! = true |  | ||||||
|   startingAt: Float = null |  | ||||||
| } |  | ||||||
|  |  | ||||||
| input IntShotOrdering { |  | ||||||
|   descending: Boolean! = true |  | ||||||
|   startingAt: Int = null |  | ||||||
| } |  | ||||||
|  |  | ||||||
| input GetShotsPagination { |  | ||||||
|   createdAfter: CreatedAfter! |  | ||||||
|   startFrameAfter: Int! |  | ||||||
| } |  | ||||||
|  |  | ||||||
| input CreatedAfter @oneOf { |  | ||||||
|   videoId: Int |  | ||||||
|   createdAt: DateTime |  | ||||||
| } |  | ||||||
|  |  | ||||||
| type UserRelationshipsResult { |  | ||||||
|   inquiringUser: UserGQL! |  | ||||||
|   relationships: [UserRelationship!]! |  | ||||||
| } |  | ||||||
|  |  | ||||||
| type UserRelationship { |  | ||||||
|   toUser: UserGQL! |  | ||||||
|   toUserFollows: Boolean! |  | ||||||
|   toUserIsFollowedBy: Boolean! |  | ||||||
| } |  | ||||||
|  |  | ||||||
| type UserPlayTimeGQL { |  | ||||||
|   totalSeconds: Float! |  | ||||||
| } |  | ||||||
|  |  | ||||||
| type VideoHistoryGQL { |  | ||||||
|   videos: [VideoGQL!]! |  | ||||||
|   pageInfo: PageInfoGQL! |  | ||||||
| } |  | ||||||
|  |  | ||||||
| type PageInfoGQL { | type PageInfoGQL { | ||||||
|   hasNextPage: Boolean! |   hasNextPage: Boolean! | ||||||
|   endCursor: String |   endCursor: String | ||||||
| @@ -584,39 +355,11 @@ input VideoFilterInput { | |||||||
|   requireCursorCompletion: Boolean! = true |   requireCursorCompletion: Boolean! = true | ||||||
| } | } | ||||||
|  |  | ||||||
| type TagGQL { |  | ||||||
|   name: String! |  | ||||||
|   id: Int! |  | ||||||
|   group: String |  | ||||||
| } |  | ||||||
|  |  | ||||||
| """ |  | ||||||
| The `JSON` scalar type represents JSON values as specified by [ECMA-404](https://ecma-international.org/wp-content/uploads/ECMA-404_2nd_edition_december_2017.pdf). |  | ||||||
| """ |  | ||||||
| scalar JSON |  | ||||||
|   @specifiedBy( |  | ||||||
|     url: "https://ecma-international.org/wp-content/uploads/ECMA-404_2nd_edition_december_2017.pdf" |  | ||||||
|   ) |  | ||||||
|  |  | ||||||
| type Mutation { | type Mutation { | ||||||
|   createBucketSet(params: CreateBucketSetInput!): BucketSetGQL! |   createBucketSet(params: CreateBucketSetInput!): BucketSetGQL! | ||||||
|   setLoggerLevel(path: String!, level: String!): Boolean! |   setLoggerLevel(path: String!, level: String!): Boolean! | ||||||
|   addAnnotationToShot( |   getProfileImageUploadLink(fileExt: String = ".png"): GetUploadLinkReturn! | ||||||
|     shotId: Int! |  | ||||||
|     annotationName: String! |  | ||||||
|     notes: String = null |  | ||||||
|   ): AddShotAnnotationReturn! |  | ||||||
|   updateShotAnnotations( |  | ||||||
|     shotId: Int! |  | ||||||
|     annotations: [UpdateAnnotationInputGQL!]! |  | ||||||
|   ): UpdateShotAnnotationReturn! |  | ||||||
|   getProfileImageUploadLink( |  | ||||||
|     fileExt: String = ".png" |  | ||||||
|   ): GetProfileUploadLinkReturn! |  | ||||||
|   editProfileImageUri(profileImageUri: String!): UserGQL! |   editProfileImageUri(profileImageUri: String!): UserGQL! | ||||||
|   editUser(input: EditUserInputGQL!): UserGQL! |  | ||||||
|   followUser(followedUserId: Int!): UserGQL! |  | ||||||
|   unfollowUser(followedUserId: Int!): UserGQL! |  | ||||||
|   createUploadStream( |   createUploadStream( | ||||||
|     videoMetadata: VideoMetadataInput! |     videoMetadata: VideoMetadataInput! | ||||||
|   ): CreateUploadStreamReturn! |   ): CreateUploadStreamReturn! | ||||||
| @@ -637,54 +380,7 @@ input CreateBucketSetInput { | |||||||
|   buckets: [BucketInputGQL!]! |   buckets: [BucketInputGQL!]! | ||||||
| } | } | ||||||
|  |  | ||||||
| type AddShotAnnotationReturn { | type GetUploadLinkReturn { | ||||||
|   value: SuccessfulAddAddShotAnnotationErrors! |  | ||||||
| } |  | ||||||
|  |  | ||||||
| union SuccessfulAddAddShotAnnotationErrors = |  | ||||||
|     SuccessfulAdd |  | ||||||
|   | AddShotAnnotationErrors |  | ||||||
|  |  | ||||||
| type SuccessfulAdd { |  | ||||||
|   value: Boolean! |  | ||||||
| } |  | ||||||
|  |  | ||||||
| type AddShotAnnotationErrors { |  | ||||||
|   error: DoesNotOwnShotErrOtherErrorNeedsNote! |  | ||||||
| } |  | ||||||
|  |  | ||||||
| union DoesNotOwnShotErrOtherErrorNeedsNote = |  | ||||||
|     DoesNotOwnShotErr |  | ||||||
|   | OtherErrorNeedsNote |  | ||||||
|  |  | ||||||
| type DoesNotOwnShotErr { |  | ||||||
|   shotId: Int! |  | ||||||
|   msg: String |  | ||||||
| } |  | ||||||
|  |  | ||||||
| type OtherErrorNeedsNote { |  | ||||||
|   msg: String |  | ||||||
| } |  | ||||||
|  |  | ||||||
| type UpdateShotAnnotationReturn { |  | ||||||
|   shot: ShotGQL |  | ||||||
|   error: DoesNotOwnShotErr |  | ||||||
| } |  | ||||||
|  |  | ||||||
| input UpdateAnnotationInputGQL { |  | ||||||
|   name: String! |  | ||||||
|   notes: String = null |  | ||||||
| } |  | ||||||
|  |  | ||||||
| type GetProfileUploadLinkReturn { |  | ||||||
|   value: UploadLinkGetProfileUploadLinkErrors! |  | ||||||
| } |  | ||||||
|  |  | ||||||
| union UploadLinkGetProfileUploadLinkErrors = |  | ||||||
|     UploadLink |  | ||||||
|   | GetProfileUploadLinkErrors |  | ||||||
|  |  | ||||||
| type UploadLink { |  | ||||||
|   uploadUrl: String! |   uploadUrl: String! | ||||||
|   headers: [Header]! |   headers: [Header]! | ||||||
| } | } | ||||||
| @@ -694,33 +390,21 @@ type Header { | |||||||
|   value: String! |   value: String! | ||||||
| } | } | ||||||
|  |  | ||||||
| type GetProfileUploadLinkErrors { |  | ||||||
|   error: TooManyProfileImageUploadsErr! |  | ||||||
| } |  | ||||||
|  |  | ||||||
| type TooManyProfileImageUploadsErr { |  | ||||||
|   linksRequested: Int! |  | ||||||
| } |  | ||||||
|  |  | ||||||
| input EditUserInputGQL { |  | ||||||
|   username: String = null |  | ||||||
|   fargoRating: Int = null |  | ||||||
| } |  | ||||||
|  |  | ||||||
| type CreateUploadStreamReturn { | type CreateUploadStreamReturn { | ||||||
|   videoId: Int! |   videoId: Int! | ||||||
| } | } | ||||||
|  |  | ||||||
| input VideoMetadataInput { | input VideoMetadataInput { | ||||||
|  |   resolution: VideoResolution! | ||||||
|   videoName: String = null |   videoName: String = null | ||||||
|   startTime: DateTime = null |   startTime: DateTime = null | ||||||
|   endTime: DateTime = null |   endTime: DateTime = null | ||||||
|   gameType: String = null |   gameType: String = null | ||||||
|   tableSize: Float = null |   tableSize: String = null | ||||||
|  |   uploadStreamMetadataInput: UploadStreamMetadataInput = null | ||||||
|   lastIntendedSegmentBound: Int = null |   lastIntendedSegmentBound: Int = null | ||||||
|   streamSegmentType: StreamSegmentTypeEnum = null |   streamSegmentType: StreamSegmentTypeEnum = null | ||||||
|   endStream: Boolean! = false |   endStream: Boolean! = false | ||||||
|   resolution: VideoResolution = null |  | ||||||
|   framesPerSecond: Float = null |   framesPerSecond: Float = null | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -729,47 +413,25 @@ input VideoResolution { | |||||||
|   height: Int! |   height: Int! | ||||||
| } | } | ||||||
|  |  | ||||||
| type GetUploadLinkReturn { | input UploadStreamMetadataInput { | ||||||
|   value: UploadLinkGetUploadLinkErrors! |   deviceType: DeviceTypeEnum = null | ||||||
|   stream: UploadStreamGQL |   osVersion: String = null | ||||||
|  |   appVersion: String = null | ||||||
|  |   browserName: String = null | ||||||
|  |   browserVersion: String = null | ||||||
|  |   locale: String = null | ||||||
|  |   timezone: String = null | ||||||
|  |   networkType: String = null | ||||||
|  |   ipAddress: String = null | ||||||
| } | } | ||||||
|  |  | ||||||
| union UploadLinkGetUploadLinkErrors = UploadLink | GetUploadLinkErrors | enum DeviceTypeEnum { | ||||||
|  |   IOS | ||||||
| type GetUploadLinkErrors { |   ANDROID | ||||||
|   error: MustHaveSetForUploadLinkErrSegmentAlreadyUploadedErrProcessingFailedErrNoInitForChunkedUploadErrTooManyProfileImageUploadsErrInitUploadAlreadyCompletedErrTooManyInitUploadsErr! |   BROWSER | ||||||
| } | } | ||||||
|  |  | ||||||
| union MustHaveSetForUploadLinkErrSegmentAlreadyUploadedErrProcessingFailedErrNoInitForChunkedUploadErrTooManyProfileImageUploadsErrInitUploadAlreadyCompletedErrTooManyInitUploadsErr = | enum StreamSegmentTypeEnum { | ||||||
|     MustHaveSetForUploadLinkErr |   FRAGMENTED_MP4 | ||||||
|   | SegmentAlreadyUploadedErr |   RB_CHUNKED_MP4 | ||||||
|   | ProcessingFailedErr |  | ||||||
|   | NoInitForChunkedUploadErr |  | ||||||
|   | TooManyProfileImageUploadsErr |  | ||||||
|   | InitUploadAlreadyCompletedErr |  | ||||||
|   | TooManyInitUploadsErr |  | ||||||
|  |  | ||||||
| type MustHaveSetForUploadLinkErr { |  | ||||||
|   resolution: Boolean |  | ||||||
|   framesPerSecond: Boolean |  | ||||||
| } |  | ||||||
|  |  | ||||||
| type SegmentAlreadyUploadedErr { |  | ||||||
|   segmentId: Int! |  | ||||||
| } |  | ||||||
|  |  | ||||||
| type ProcessingFailedErr { |  | ||||||
|   processing: VideoProcessingGQL! |  | ||||||
| } |  | ||||||
|  |  | ||||||
| type NoInitForChunkedUploadErr { |  | ||||||
|   segmentType: StreamSegmentTypeEnum! |  | ||||||
| } |  | ||||||
|  |  | ||||||
| type InitUploadAlreadyCompletedErr { |  | ||||||
|   segmentType: StreamSegmentTypeEnum! |  | ||||||
| } |  | ||||||
|  |  | ||||||
| type TooManyInitUploadsErr { |  | ||||||
|   linksRequested: Int! |  | ||||||
| } | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user