Compare commits
	
		
			110 Commits
		
	
	
		
			update
			...
			9db95c4e6c
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 9db95c4e6c | |||
| 249807c935 | |||
| eec79b2dc5 | |||
| 464c013095 | |||
| e2f4995cad | |||
| a43b286e39 | |||
| 148f5362f0 | |||
| 4d01e9814d | |||
| b9e3e1f310 | |||
| b0da48c4fb | |||
| 1e53dc21ee | |||
| 5c5014339f | |||
| 84188a6066 | |||
| 7c7be319d1 | |||
| 79784faba1 | |||
| f3ea44755c | |||
| 9b6559559c | |||
| 2398216bf2 | |||
| d942b91d17 | |||
| 24d9b9225e | |||
| f6f6404302 | |||
| 4609af726b | |||
| c5919c90d0 | |||
| 605adc3293 | |||
| b40554d38d | |||
| 194d7c66a0 | |||
| 3adc301935 | |||
| 9232c673e8 | |||
| c2cb411469 | |||
| 44ddc732a1 | |||
| d6ef3e0487 | |||
| 8c191bdb90 | |||
| 8246699915 | |||
| de9d47c289 | |||
| 39b1808cab | |||
| a78f9e7b9d | |||
| f573026853 | |||
| f98c98ecdd | |||
| 3f6314aab7 | |||
| 3051c155e2 | |||
| e686be5acd | |||
| d49f9b213a | |||
| 8f346d7832 | |||
| 163c6a4e0c | |||
| b9036001aa | |||
| b16b36588f | |||
| efaaeeaad1 | |||
| 5d93f7166e | |||
| 72ac956758 | |||
| 5cb7df174b | |||
| d15dae23c1 | |||
| c98a65bb6f | |||
| e701c79469 | |||
| 18cd3efe80 | |||
| d71974d385 | |||
| 0defdf0892 | |||
| 8d1f79b8a8 | |||
| 9dc426ea0f | |||
| 19a63b9d19 | |||
| ae97f956b3 | |||
| d619751144 | |||
| e431a1751f | |||
| 209f0aa019 | |||
| 70015a942c | |||
| 91cfcb28e7 | |||
| b2a09c1b8c | |||
| 59aaf47cbe | |||
| c426e753cd | |||
| c8cf97421b | |||
| 9718137ad3 | |||
| af1fb3fee7 | |||
| 025baf257a | |||
| 8239ab6e1b | |||
| 1f018f954e | |||
| fd78ddf641 | |||
| 7662f1f050 | |||
| 890bea2571 | |||
| f57f6dc32d | |||
| 14863e3357 | |||
|  | 58f01c567c | ||
| 937368c753 | |||
| d8c11875d4 | |||
| bacd9e77f0 | |||
| 69d755ba32 | |||
| 31fb95e3b0 | |||
| 7d0f9870dd | |||
| 4a493b4e8d | |||
| 341dc819a0 | |||
| b58aecf7a5 | |||
| 301c017d5e | |||
| 1a4b676635 | |||
| ce54bef0b4 | |||
| 2699d29d7b | |||
| 63a07d58ca | |||
| 59fe332fe0 | |||
| 33723f4ea2 | |||
| c0ee55069e | |||
| 492ae4a225 | |||
| dcdb324391 | |||
| 90685cfdbf | |||
| ab61894373 | |||
| 662e0ade64 | |||
| 75aa847ae1 | |||
| c013228f79 | |||
| 740daf95ae | |||
| 768d29f93e | |||
| 837e084a5a | |||
| caea1b9572 | |||
| 0a255f161a | |||
| 85a2da4b5c | 
| @@ -1,5 +1,7 @@ | |||||||
| overwrite: true | overwrite: true | ||||||
| schema: "src/schema.gql" | schema: | ||||||
|  |   - "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.12" | python = ">=3.10,<=3.13" | ||||||
| protobuf = "^4.25.3" | protobuf = "^4.25.3" | ||||||
|  |  | ||||||
|  |  | ||||||
|   | |||||||
| @@ -13,7 +13,7 @@ _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\"j\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\"\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\"\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') | ||||||
|  |  | ||||||
| _globals = globals() | _globals = globals() | ||||||
| _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) | _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) | ||||||
| @@ -42,8 +42,8 @@ if _descriptor._USE_C_DESCRIPTORS == False: | |||||||
|   _globals['_PATH']._serialized_end=1080 |   _globals['_PATH']._serialized_end=1080 | ||||||
|   _globals['_IDENTIFIERHISTORY']._serialized_start=1082 |   _globals['_IDENTIFIERHISTORY']._serialized_start=1082 | ||||||
|   _globals['_IDENTIFIERHISTORY']._serialized_end=1164 |   _globals['_IDENTIFIERHISTORY']._serialized_end=1164 | ||||||
|   _globals['_KEYBALLIDENTIFIERS']._serialized_start=1166 |   _globals['_KEYBALLIDENTIFIERS']._serialized_start=1167 | ||||||
|   _globals['_KEYBALLIDENTIFIERS']._serialized_end=1272 |   _globals['_KEYBALLIDENTIFIERS']._serialized_end=1411 | ||||||
|   _globals['_SHOT']._serialized_start=1275 |   _globals['_SHOT']._serialized_start=1414 | ||||||
|   _globals['_SHOT']._serialized_end=1443 |   _globals['_SHOT']._serialized_end=1582 | ||||||
| # @@protoc_insertion_point(module_scope) | # @@protoc_insertion_point(module_scope) | ||||||
|   | |||||||
| @@ -105,16 +105,22 @@ class IdentifierHistory(_message.Message): | |||||||
|     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): | class KeyBallIdentifiers(_message.Message): | ||||||
|     __slots__ = ["cue_ball", "object_ball", "target_ball", "contact_sequence"] |     __slots__ = ["cue_ball", "object_ball", "target_ball", "contact_sequence", "cue_ball_id", "object_ball_id", "target_ball_id"] | ||||||
|     CUE_BALL_FIELD_NUMBER: _ClassVar[int] |     CUE_BALL_FIELD_NUMBER: _ClassVar[int] | ||||||
|     OBJECT_BALL_FIELD_NUMBER: _ClassVar[int] |     OBJECT_BALL_FIELD_NUMBER: _ClassVar[int] | ||||||
|     TARGET_BALL_FIELD_NUMBER: _ClassVar[int] |     TARGET_BALL_FIELD_NUMBER: _ClassVar[int] | ||||||
|     CONTACT_SEQUENCE_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 |     cue_ball: int | ||||||
|     object_ball: int |     object_ball: int | ||||||
|     target_ball: int |     target_ball: int | ||||||
|     contact_sequence: _containers.RepeatedScalarFieldContainer[int] |     contact_sequence: _containers.RepeatedScalarFieldContainer[int] | ||||||
|     def __init__(self, cue_ball: _Optional[int] = ..., object_ball: _Optional[int] = ..., target_ball: _Optional[int] = ..., contact_sequence: _Optional[_Iterable[int]] = ...) -> None: ... |     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", "key_balls", "start_index", "end_index"] | ||||||
|   | |||||||
| @@ -63,6 +63,10 @@ message KeyBallIdentifiers { | |||||||
|   // Long term this will potentially represent a linked list |   // Long term this will potentially represent a linked list | ||||||
|   // of all balls in a shot. |   // of all balls in a shot. | ||||||
|   repeated uint32 contact_sequence = 4; |   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 { | ||||||
|   | |||||||
| @@ -820,6 +820,9 @@ export interface KeyBallIdentifiers { | |||||||
|   object_ball?: number; |   object_ball?: number; | ||||||
|   target_ball?: number; |   target_ball?: number; | ||||||
|   contact_sequence?: number[]; |   contact_sequence?: number[]; | ||||||
|  |   cue_ball_id?: number; | ||||||
|  |   object_ball_id?: number; | ||||||
|  |   target_ball_id?: number; | ||||||
| } | } | ||||||
|  |  | ||||||
| export function encodeKeyBallIdentifiers( | export function encodeKeyBallIdentifiers( | ||||||
| @@ -867,6 +870,27 @@ function _encodeKeyBallIdentifiers( | |||||||
|     writeByteBuffer(bb, packed); |     writeByteBuffer(bb, packed); | ||||||
|     pushByteBuffer(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( | export function decodeKeyBallIdentifiers( | ||||||
| @@ -919,6 +943,24 @@ function _decodeKeyBallIdentifiers(bb: ByteBuffer): KeyBallIdentifiers { | |||||||
|         break; |         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: |       default: | ||||||
|         skipUnknownField(bb, tag & 7); |         skipUnknownField(bb, tag & 7); | ||||||
|     } |     } | ||||||
|   | |||||||
							
								
								
									
										25
									
								
								src/client-schema.gql
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								src/client-schema.gql
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,25 @@ | |||||||
|  | # 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!]! | ||||||
|  | } | ||||||
							
								
								
									
										2709
									
								
								src/index.tsx
									
									
									
									
									
								
							
							
						
						
									
										2709
									
								
								src/index.tsx
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -21,6 +21,7 @@ query GetFeed( | |||||||
|       elapsedTime |       elapsedTime | ||||||
|       screenshotUri |       screenshotUri | ||||||
|       stream { |       stream { | ||||||
|  |         id | ||||||
|         isCompleted |         isCompleted | ||||||
|       } |       } | ||||||
|       tableSize |       tableSize | ||||||
|   | |||||||
| @@ -1,59 +1,3 @@ | |||||||
| query GetShots( |  | ||||||
|   $filterInput: FilterInput! |  | ||||||
|   $shotsPagination: GetShotsPagination |  | ||||||
|   $limit: Int |  | ||||||
|   $includeCreatedAt: Boolean! = false |  | ||||||
|   $includeUpdatedAt: Boolean! = false |  | ||||||
|   $includeCueObjectFeatures: Boolean! = false |  | ||||||
|   $includePocketingIntentionFeatures: Boolean! = false |  | ||||||
|   $includeCueObjectDistance: Boolean! = false |  | ||||||
|   $includeCueObjectAngle: Boolean! = false |  | ||||||
|   $includeCueBallSpeed: Boolean! = false |  | ||||||
|   $includeSpinType: Boolean! = false |  | ||||||
|   $includeShotDirection: Boolean! = false |  | ||||||
|   $includeTargetPocketDistance: Boolean! = false |  | ||||||
|   $includeMake: Boolean! = false |  | ||||||
|   $includeIntendedPocketType: Boolean! = false |  | ||||||
| ) { |  | ||||||
|   getShots( |  | ||||||
|     filterInput: $filterInput |  | ||||||
|     shotsPagination: $shotsPagination |  | ||||||
|     limit: $limit |  | ||||||
|   ) { |  | ||||||
|     id |  | ||||||
|     videoId |  | ||||||
|     startFrame |  | ||||||
|     endFrame |  | ||||||
|     user { |  | ||||||
|       id |  | ||||||
|     } |  | ||||||
|     falsePositiveScore |  | ||||||
|     video { |  | ||||||
|       stream { |  | ||||||
|         resolution { |  | ||||||
|           width |  | ||||||
|           height |  | ||||||
|         } |  | ||||||
|       } |  | ||||||
|     } |  | ||||||
|     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) |  | ||||||
|       spinType @include(if: $includeSpinType) |  | ||||||
|     } |  | ||||||
|     pocketingIntentionFeatures |  | ||||||
|       @include(if: $includePocketingIntentionFeatures) { |  | ||||||
|       targetPocketDistance @include(if: $includeTargetPocketDistance) |  | ||||||
|       make @include(if: $includeMake) |  | ||||||
|       intendedPocketType @include(if: $includeIntendedPocketType) |  | ||||||
|     } |  | ||||||
|   } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| query GetSerializedShotPaths($filterInput: FilterInput!) { | query GetSerializedShotPaths($filterInput: FilterInput!) { | ||||||
|   getShots(filterInput: $filterInput) { |   getShots(filterInput: $filterInput) { | ||||||
|     id |     id | ||||||
| @@ -73,64 +17,140 @@ query GetShotAnnotationTypes { | |||||||
|   } |   } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | 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( | query GetShotsWithMetadata( | ||||||
|   $filterInput: FilterInput! |   $filterInput: FilterInput! | ||||||
|   $shotsPagination: GetShotsPagination |   $shotsPagination: GetShotsPagination | ||||||
|   $limit: Int |   $limit: Int | ||||||
|   $includeCreatedAt: Boolean! = false |   $ids: [Int!] | ||||||
|   $includeUpdatedAt: Boolean! = false |  | ||||||
|   $includeCueObjectFeatures: Boolean! = false |  | ||||||
|   $includePocketingIntentionFeatures: Boolean! = false |  | ||||||
|   $includeCueObjectDistance: Boolean! = false |  | ||||||
|   $includeCueObjectAngle: Boolean! = false |  | ||||||
|   $includeCueBallSpeed: Boolean! = false |  | ||||||
|   $includeSpinType: Boolean! = false |  | ||||||
|   $includeShotDirection: Boolean! = false |  | ||||||
|   $includeTargetPocketDistance: Boolean! = false |  | ||||||
|   $includeMake: Boolean! = false |  | ||||||
|   $includeIntendedPocketType: Boolean! = false |  | ||||||
| ) { | ) { | ||||||
|   getShotsWithMetadata( |   getShotsWithMetadata( | ||||||
|     filterInput: $filterInput |     filterInput: $filterInput | ||||||
|     shotsPagination: $shotsPagination |     shotsPagination: $shotsPagination | ||||||
|     limit: $limit |     limit: $limit | ||||||
|  |     ids: $ids | ||||||
|   ) { |   ) { | ||||||
|     count |     count | ||||||
|     shots { |     shots { | ||||||
|       id |       ...ShotWithAllFeatures | ||||||
|       videoId |  | ||||||
|       startFrame |  | ||||||
|       endFrame |  | ||||||
|       user { |  | ||||||
|         id |  | ||||||
|       } |  | ||||||
|       falsePositiveScore |  | ||||||
|       video { |  | ||||||
|         stream { |  | ||||||
|           resolution { |  | ||||||
|             width |  | ||||||
|             height |  | ||||||
|           } |  | ||||||
|         } |  | ||||||
|       } |  | ||||||
|       serializedShotPaths { |  | ||||||
|         b64EncodedBuffer |  | ||||||
|       } |  | ||||||
|       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) |  | ||||||
|         spinType @include(if: $includeSpinType) |  | ||||||
|       } |  | ||||||
|       pocketingIntentionFeatures |  | ||||||
|         @include(if: $includePocketingIntentionFeatures) { |  | ||||||
|         targetPocketDistance @include(if: $includeTargetPocketDistance) |  | ||||||
|         make @include(if: $includeMake) |  | ||||||
|         intendedPocketType @include(if: $includeIntendedPocketType) |  | ||||||
|       } |  | ||||||
|     } |     } | ||||||
|  |     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 | ||||||
|   } |   } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -37,6 +37,7 @@ query getLoggedInUser { | |||||||
|     username |     username | ||||||
|     isAdmin |     isAdmin | ||||||
|     profileImageUri |     profileImageUri | ||||||
|  |     fargoRating | ||||||
|     activeVideoId |     activeVideoId | ||||||
|     createdAt |     createdAt | ||||||
|     updatedAt |     updatedAt | ||||||
| @@ -57,9 +58,70 @@ 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 { | query GetUserTags { | ||||||
|   getUserTags { |   getUserTags { | ||||||
|     id |     id | ||||||
|     name |     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 | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | } | ||||||
|   | |||||||
| @@ -45,6 +45,7 @@ query GetStreamMonitoringDetails($videoId: Int!, $debuggingJson: JSON) { | |||||||
|       } |       } | ||||||
|     } |     } | ||||||
|     stream { |     stream { | ||||||
|  |       id | ||||||
|       linksRequested |       linksRequested | ||||||
|       uploadsCompleted |       uploadsCompleted | ||||||
|       segmentProcessingCursor |       segmentProcessingCursor | ||||||
| @@ -117,23 +118,33 @@ 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 | ||||||
|     framesPerSecond |     streamSegmentType | ||||||
|     stream { |     segments { | ||||||
|       id |       uploaded | ||||||
|       streamSegmentType |       valid | ||||||
|       segments { |       segmentIndex | ||||||
|         uploaded |       endFrameIndex | ||||||
|         valid |       framesPerSecond | ||||||
|         segmentIndex |  | ||||||
|         endFrameIndex |  | ||||||
|         framesPerSecond |  | ||||||
|       } |  | ||||||
|     } |  | ||||||
|     playlist { |  | ||||||
|       segmentDurations |  | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|  |   playlist { | ||||||
|  |     segmentDurations | ||||||
|  |   } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | query GetVideoForShotTime($videoId: Int!) { | ||||||
|  |   getVideo(videoId: $videoId) { | ||||||
|  |     ...VideoStreamMetadata | ||||||
|  |   } | ||||||
| } | } | ||||||
|  |  | ||||||
| query GetVideo($videoId: Int!) { | query GetVideo($videoId: Int!) { | ||||||
| @@ -184,6 +195,7 @@ query GetVideo($videoId: Int!) { | |||||||
|       } |       } | ||||||
|     } |     } | ||||||
|     stream { |     stream { | ||||||
|  |       id | ||||||
|       streamSegmentType |       streamSegmentType | ||||||
|       segments { |       segments { | ||||||
|         segmentIndex |         segmentIndex | ||||||
| @@ -204,12 +216,14 @@ 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 | ||||||
| @@ -217,23 +231,60 @@ query GetMedianRunForVideo($videoId: Int!) { | |||||||
|   } |   } | ||||||
| } | } | ||||||
|  |  | ||||||
| query GetVideoForClipTimes($videoId: Int!) { | fragment StreamWithEndFrames on UploadStreamGQL { | ||||||
|   getVideo(videoId: $videoId) { |   id | ||||||
|     id |   streamSegmentType | ||||||
|  |   segmentEndFrames @client | ||||||
|  |   resolution { | ||||||
|  |     width | ||||||
|  |     height | ||||||
|  |   } | ||||||
|  |   segments { | ||||||
|  |     uploaded | ||||||
|  |     valid | ||||||
|  |     segmentIndex | ||||||
|  |     endFrameIndex | ||||||
|     framesPerSecond |     framesPerSecond | ||||||
|     playlist { |   } | ||||||
|       segmentDurations | } | ||||||
|     } |  | ||||||
|     stream { | fragment SegmentEndFrames on SegmentEndFramesGQL { | ||||||
|       id |   id | ||||||
|       streamSegmentType |   segmentEndFrames | ||||||
|       segments { | } | ||||||
|         uploaded |  | ||||||
|         valid | fragment SegmentStartTimes on SegmentStartTimesGQL { | ||||||
|         segmentIndex |   id | ||||||
|         endFrameIndex |   segmentStartTimes | ||||||
|         framesPerSecond | } | ||||||
|       } |  | ||||||
|     } | 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 | ||||||
|   } |   } | ||||||
| } | } | ||||||
|   | |||||||
							
								
								
									
										218
									
								
								src/schema.gql
									
									
									
									
									
								
							
							
						
						
									
										218
									
								
								src/schema.gql
									
									
									
									
									
								
							| @@ -9,8 +9,15 @@ type Query { | |||||||
|     videoId: ID! |     videoId: ID! | ||||||
|     intervalDuration: Int! = 300 |     intervalDuration: Int! = 300 | ||||||
|   ): [MakePercentageIntervalGQL!]! |   ): [MakePercentageIntervalGQL!]! | ||||||
|  |   getOrderedShots( | ||||||
|  |     filterInput: FilterInput! | ||||||
|  |     ids: [Int!] = null | ||||||
|  |     shotsOrdering: GetShotsOrdering = null | ||||||
|  |     limit: Int! = 500 | ||||||
|  |   ): GetShotsResult! | ||||||
|   getShotsWithMetadata( |   getShotsWithMetadata( | ||||||
|     filterInput: FilterInput! |     filterInput: FilterInput! | ||||||
|  |     ids: [Int!] = null | ||||||
|     shotsPagination: GetShotsPagination = null |     shotsPagination: GetShotsPagination = null | ||||||
|     limit: Int! = 500 |     limit: Int! = 500 | ||||||
|   ): GetShotsResult! |   ): GetShotsResult! | ||||||
| @@ -19,6 +26,7 @@ type Query { | |||||||
|     shotsPagination: GetShotsPagination = null |     shotsPagination: GetShotsPagination = null | ||||||
|     limit: Int! = 500 |     limit: Int! = 500 | ||||||
|   ): [ShotGQL!]! |   ): [ShotGQL!]! | ||||||
|  |   getShotsByIds(ids: [Int!]!): [ShotGQL!]! | ||||||
|   getShotAnnotationTypes(errorTypes: Boolean = false): [ShotAnnotationTypeGQL!]! |   getShotAnnotationTypes(errorTypes: Boolean = false): [ShotAnnotationTypeGQL!]! | ||||||
|   getUser(userId: Int!): UserGQL |   getUser(userId: Int!): UserGQL | ||||||
|   getLoggedInUser: UserGQL |   getLoggedInUser: UserGQL | ||||||
| @@ -27,6 +35,12 @@ 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 | ||||||
| @@ -37,6 +51,11 @@ type Query { | |||||||
|   getUserTags: [TagGQL!]! |   getUserTags: [TagGQL!]! | ||||||
|   getVideo(videoId: Int!, debuggingJson: JSON = null): 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 { | ||||||
| @@ -54,6 +73,7 @@ type TargetMetricsGQL { | |||||||
|   makePercentage: Float |   makePercentage: Float | ||||||
|   averageDifficulty: Float |   averageDifficulty: Float | ||||||
|   spinTypeCounts: SpinTypeCountsGQL |   spinTypeCounts: SpinTypeCountsGQL | ||||||
|  |   shotDirectionCounts: ShotDirectionCountsGQL | ||||||
| } | } | ||||||
|  |  | ||||||
| type SpinTypeCountsGQL { | type SpinTypeCountsGQL { | ||||||
| @@ -63,6 +83,12 @@ type SpinTypeCountsGQL { | |||||||
|   unknown: Int! |   unknown: Int! | ||||||
| } | } | ||||||
|  |  | ||||||
|  | type ShotDirectionCountsGQL { | ||||||
|  |   left: Int! | ||||||
|  |   right: Int! | ||||||
|  |   straight: Int! | ||||||
|  | } | ||||||
|  |  | ||||||
| input AggregateInputGQL { | input AggregateInputGQL { | ||||||
|   aggregations: [AggregationInput!]! |   aggregations: [AggregationInput!]! | ||||||
|   filterInput: FilterInput |   filterInput: FilterInput | ||||||
| @@ -89,9 +115,10 @@ input EnumAggregation { | |||||||
| } | } | ||||||
|  |  | ||||||
| input DatetimeRangeAggregationInput { | input DatetimeRangeAggregationInput { | ||||||
|   startDatetime: DateTime! |   startDatetime: DateTime = null | ||||||
|   endDatetime: DateTime! |   endDatetime: DateTime = null | ||||||
|   interval: TimeInterval! |   interval: TimeInterval! | ||||||
|  |   feature: String! = "created_at" | ||||||
| } | } | ||||||
|  |  | ||||||
| """ | """ | ||||||
| @@ -99,40 +126,40 @@ Date with time (isoformat) | |||||||
| """ | """ | ||||||
| scalar DateTime | scalar DateTime | ||||||
|  |  | ||||||
| input TimeInterval { | input TimeInterval @oneOf { | ||||||
|   """ |   timedelta: TimeDeltaGQL | ||||||
|   A second is the base unit and cannot be subdivided |   aligned: AlignedIntervalEnum | ||||||
|   """ | } | ||||||
|   seconds: Int = 0 |  | ||||||
|   minutes: Int = 0 | input TimeDeltaGQL { | ||||||
|   hours: Int = 0 |  | ||||||
|   days: Int = 0 |   days: Int = 0 | ||||||
|   weeks: Int = 0 |   weeks: Int = 0 | ||||||
|  |  | ||||||
|   """ |  | ||||||
|   Assumes a month is 30 days long |  | ||||||
|   """ |  | ||||||
|   months: Int = 0 |   months: Int = 0 | ||||||
|  |  | ||||||
|   """ |  | ||||||
|   Assumes a year is 365 days long |  | ||||||
|   """ |  | ||||||
|   years: 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: RangeFilter |   cueObjectDistance: FloatRangeFilter | ||||||
|   targetPocketDistance: RangeFilter |   targetPocketDistance: FloatRangeFilter | ||||||
|   cueObjectAngle: RangeFilter |   cueObjectAngle: FloatRangeFilter | ||||||
|   cueBallSpeed: RangeFilter |   cueBallSpeed: FloatRangeFilter | ||||||
|   difficulty: RangeFilter |   difficulty: FloatRangeFilter | ||||||
|   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!] | ||||||
| @@ -142,18 +169,26 @@ input FilterInput @oneOf { | |||||||
|   isLeftMiss: [Boolean!] |   isLeftMiss: [Boolean!] | ||||||
|   isRightMiss: [Boolean!] |   isRightMiss: [Boolean!] | ||||||
|   isDirect: [Boolean!] |   isDirect: [Boolean!] | ||||||
|   tableSize: RangeFilter |   tableSize: FloatRangeFilter | ||||||
|   bankAngle: RangeFilter |   bankAngle: FloatRangeFilter | ||||||
|   bankDistance: RangeFilter |   bankDistance: FloatRangeFilter | ||||||
|   kickAngle: RangeFilter |   kickAngle: FloatRangeFilter | ||||||
|   kickDistance: RangeFilter |   kickDistance: FloatRangeFilter | ||||||
|   cueAngleAfterObject: RangeFilter |   cueAngleAfterObject: FloatRangeFilter | ||||||
|   spinType: [SpinTypeEnum!] |   spinType: [SpinTypeEnum!] | ||||||
|   cueSpeedAfterObject: RangeFilter |   cueSpeedAfterObject: FloatRangeFilter | ||||||
|   falsePositiveScore: RangeFilter |   falsePositiveScore: FloatRangeFilter | ||||||
|  |   backcut: [Boolean!] | ||||||
|  |   targetPocketAngleDirection: [ShotDirectionEnum!] | ||||||
|  |   targetPocketAngle: FloatRangeFilter | ||||||
|  |   missAngleInDegrees: FloatRangeFilter | ||||||
|  |   marginOfErrorInDegrees: FloatRangeFilter | ||||||
|  |   createdAt: DateRangeFilter | ||||||
|  |   totalDistance: FloatRangeFilter | ||||||
|  |   runLength: FloatRangeFilter | ||||||
| } | } | ||||||
|  |  | ||||||
| input RangeFilter { | input FloatRangeFilter { | ||||||
|   lessThan: Float = null |   lessThan: Float = null | ||||||
|   greaterThanEqualTo: Float = null |   greaterThanEqualTo: Float = null | ||||||
|   greaterThan: Float = null |   greaterThan: Float = null | ||||||
| @@ -193,6 +228,20 @@ enum SpinTypeEnum { | |||||||
|   UNKNOWN |   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! | ||||||
| @@ -220,6 +269,7 @@ type MakePercentageIntervalGQL { | |||||||
| type GetShotsResult { | type GetShotsResult { | ||||||
|   shots: [ShotGQL!]! |   shots: [ShotGQL!]! | ||||||
|   count: Int |   count: Int | ||||||
|  |   ids: [Int!]! | ||||||
| } | } | ||||||
|  |  | ||||||
| type ShotGQL { | type ShotGQL { | ||||||
| @@ -231,6 +281,7 @@ 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 | ||||||
| @@ -252,6 +303,25 @@ 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 { | ||||||
| @@ -271,13 +341,16 @@ 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 { | ||||||
| @@ -444,6 +517,33 @@ type VideoProcessingStatusGQL { | |||||||
|   updatedAt: 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 { | input GetShotsPagination { | ||||||
|   createdAfter: CreatedAfter! |   createdAfter: CreatedAfter! | ||||||
|   startFrameAfter: Int! |   startFrameAfter: Int! | ||||||
| @@ -454,6 +554,17 @@ input CreatedAfter @oneOf { | |||||||
|   createdAt: DateTime |   createdAt: DateTime | ||||||
| } | } | ||||||
|  |  | ||||||
|  | type UserRelationshipsResult { | ||||||
|  |   inquiringUser: UserGQL! | ||||||
|  |   relationships: [UserRelationship!]! | ||||||
|  | } | ||||||
|  |  | ||||||
|  | type UserRelationship { | ||||||
|  |   toUser: UserGQL! | ||||||
|  |   toUserFollows: Boolean! | ||||||
|  |   toUserIsFollowedBy: Boolean! | ||||||
|  | } | ||||||
|  |  | ||||||
| type UserPlayTimeGQL { | type UserPlayTimeGQL { | ||||||
|   totalSeconds: Float! |   totalSeconds: Float! | ||||||
| } | } | ||||||
| @@ -495,10 +606,17 @@ type Mutation { | |||||||
|     annotationName: String! |     annotationName: String! | ||||||
|     notes: String = null |     notes: String = null | ||||||
|   ): AddShotAnnotationReturn! |   ): AddShotAnnotationReturn! | ||||||
|  |   updateShotAnnotations( | ||||||
|  |     shotId: Int! | ||||||
|  |     annotations: [UpdateAnnotationInputGQL!]! | ||||||
|  |   ): UpdateShotAnnotationReturn! | ||||||
|   getProfileImageUploadLink( |   getProfileImageUploadLink( | ||||||
|     fileExt: String = ".png" |     fileExt: String = ".png" | ||||||
|   ): GetProfileUploadLinkReturn! |   ): 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! | ||||||
| @@ -548,6 +666,16 @@ type OtherErrorNeedsNote { | |||||||
|   msg: String |   msg: String | ||||||
| } | } | ||||||
|  |  | ||||||
|  | type UpdateShotAnnotationReturn { | ||||||
|  |   shot: ShotGQL | ||||||
|  |   error: DoesNotOwnShotErr | ||||||
|  | } | ||||||
|  |  | ||||||
|  | input UpdateAnnotationInputGQL { | ||||||
|  |   name: String! | ||||||
|  |   notes: String = null | ||||||
|  | } | ||||||
|  |  | ||||||
| type GetProfileUploadLinkReturn { | type GetProfileUploadLinkReturn { | ||||||
|   value: UploadLinkGetProfileUploadLinkErrors! |   value: UploadLinkGetProfileUploadLinkErrors! | ||||||
| } | } | ||||||
| @@ -574,6 +702,11 @@ type TooManyProfileImageUploadsErr { | |||||||
|   linksRequested: Int! |   linksRequested: Int! | ||||||
| } | } | ||||||
|  |  | ||||||
|  | input EditUserInputGQL { | ||||||
|  |   username: String = null | ||||||
|  |   fargoRating: Int = null | ||||||
|  | } | ||||||
|  |  | ||||||
| type CreateUploadStreamReturn { | type CreateUploadStreamReturn { | ||||||
|   videoId: Int! |   videoId: Int! | ||||||
| } | } | ||||||
| @@ -584,7 +717,6 @@ input VideoMetadataInput { | |||||||
|   endTime: DateTime = null |   endTime: DateTime = null | ||||||
|   gameType: String = null |   gameType: String = null | ||||||
|   tableSize: Float = null |   tableSize: Float = null | ||||||
|   uploadStreamMetadataInput: UploadStreamMetadataInput = null |  | ||||||
|   lastIntendedSegmentBound: Int = null |   lastIntendedSegmentBound: Int = null | ||||||
|   streamSegmentType: StreamSegmentTypeEnum = null |   streamSegmentType: StreamSegmentTypeEnum = null | ||||||
|   endStream: Boolean! = false |   endStream: Boolean! = false | ||||||
| @@ -592,24 +724,6 @@ input VideoMetadataInput { | |||||||
|   framesPerSecond: Float = null |   framesPerSecond: Float = null | ||||||
| } | } | ||||||
|  |  | ||||||
| input UploadStreamMetadataInput { |  | ||||||
|   deviceType: DeviceTypeEnum = null |  | ||||||
|   osVersion: String = null |  | ||||||
|   appVersion: String = null |  | ||||||
|   browserName: String = null |  | ||||||
|   browserVersion: String = null |  | ||||||
|   locale: String = null |  | ||||||
|   timezone: String = null |  | ||||||
|   networkType: String = null |  | ||||||
|   ipAddress: String = null |  | ||||||
| } |  | ||||||
|  |  | ||||||
| enum DeviceTypeEnum { |  | ||||||
|   IOS |  | ||||||
|   ANDROID |  | ||||||
|   BROWSER |  | ||||||
| } |  | ||||||
|  |  | ||||||
| input VideoResolution { | input VideoResolution { | ||||||
|   width: Int! |   width: Int! | ||||||
|   height: Int! |   height: Int! | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user