Compare commits

...

88 Commits

Author SHA1 Message Date
2554c1c4f3 Return userGQL
All checks were successful
Tests / Tests (pull_request) Successful in 15s
2024-10-25 01:12:38 -06:00
f6f6404302 Merge pull request 'Delete user with ids' (#92) from kat/remove-user-ids into master
Reviewed-on: #92
2024-10-25 01:08:04 -06:00
4609af726b Delete user with ids
All checks were successful
Tests / Tests (pull_request) Successful in 9s
2024-10-25 01:07:23 -06:00
c5919c90d0 User UserGQL in response 2024-10-25 00:31:29 -06:00
605adc3293 Merge pull request 'Update get usernames ids' (#90) from kat/update-get-username-ids into master
Reviewed-on: #90
2024-10-25 00:18:19 -06:00
b40554d38d Update get usernames ids
All checks were successful
Tests / Tests (pull_request) Successful in 15s
2024-10-25 00:16:59 -06:00
194d7c66a0 Merge pull request 'Add subfields to usernames and following' (#89) from kat/usernames-following-response into master
Reviewed-on: #89
2024-10-24 23:50:28 -06:00
3adc301935 Add subfields to usernames and following
All checks were successful
Tests / Tests (pull_request) Successful in 15s
2024-10-24 23:49:47 -06:00
9232c673e8 Merge pull request 'Return usernamesAndIds' (#88) from kat/update-usernames-and-following into master
Reviewed-on: #88
2024-10-24 23:46:27 -06:00
c2cb411469 Return usernamesAndIds
All checks were successful
Tests / Tests (pull_request) Successful in 16s
2024-10-24 23:41:52 -06:00
44ddc732a1 Fix cache merge (#87)
Co-authored-by: Kat Huang <kkathuang@gmail.com>
Reviewed-on: #87
Co-authored-by: Volodymyr Smolianinov <voidozzer@gmail.com>
Co-committed-by: Volodymyr Smolianinov <voidozzer@gmail.com>
2024-10-24 13:50:52 -06:00
d6ef3e0487 Merge pull request 'Remove error default from operation' (#86) from loewy/remove-error-default into master
Reviewed-on: #86
2024-10-24 12:28:39 -06:00
8c191bdb90 Remove error default from operation
All checks were successful
Tests / Tests (pull_request) Successful in 15s
2024-10-24 11:27:40 -07:00
8246699915 Merge pull request 'Return ShotGQL w/ updateShotAnnotations' (#84) from loewy/annotations-return into master
Reviewed-on: #84
Reviewed-by: Ivan Malison <ivanmalison@gmail.com>
2024-10-24 10:54:05 -06:00
de9d47c289 Merge branch 'master' into loewy/annotations-return
All checks were successful
Tests / Tests (pull_request) Successful in 8s
2024-10-24 10:53:02 -06:00
39b1808cab Merge pull request 'Create get usernames and followers operation' (#85) from kat/add-get-usernames-following-operation into master
Reviewed-on: #85
2024-10-24 09:19:38 -06:00
a78f9e7b9d return shot gql with an annotation update
All checks were successful
Tests / Tests (pull_request) Successful in 16s
2024-10-23 16:39:16 -07:00
f573026853 Create get usernames and followers operation
All checks were successful
Tests / Tests (pull_request) Successful in 15s
2024-10-23 17:04:25 -06:00
f98c98ecdd Merge pull request 'Add get usernames and following response' (#83) from kat/add-usernames-response into master
Reviewed-on: #83
2024-10-23 16:53:50 -06:00
3f6314aab7 Add get usernames and following response
All checks were successful
Tests / Tests (pull_request) Successful in 9s
2024-10-23 16:53:26 -06:00
3051c155e2 Merge pull request 'Add mutation, logic needs to have better stateful solution' (#82) from loewy/add-annotations-to-operations into master
Reviewed-on: #82
2024-10-22 18:38:25 -06:00
e686be5acd add mutation, logic needs to have better stateful solution
All checks were successful
Tests / Tests (pull_request) Successful in 10s
2024-10-22 16:58:35 -07:00
d49f9b213a Merge pull request 'Add following followers to user model' (#81) from kat/following-followers into master
Reviewed-on: #81
2024-10-22 00:12:59 -06:00
8f346d7832 Add runLength ordering and filter 2024-10-21 21:35:19 -06:00
163c6a4e0c Add following followers to user model
All checks were successful
Tests / Tests (pull_request) Successful in 7s
2024-10-21 12:08:42 -06:00
b9036001aa Remove user id from feed args 2024-10-21 01:12:17 -06:00
b16b36588f Create feed query 2024-10-20 23:35:52 -06:00
efaaeeaad1 Add totalDistance 2024-10-20 14:38:06 -06:00
5d93f7166e Use getOrderedShots 2024-10-19 21:27:57 -06:00
72ac956758 Add get ordered shots 2024-10-19 20:18:23 -06:00
5cb7df174b Merge pull request 'get rid of metadata input' (#80) from mk/alter-metadata-type into master
Reviewed-on: #80
2024-10-18 12:52:21 -06:00
d15dae23c1 get rid of metadata input
All checks were successful
Tests / Tests (pull_request) Successful in 9s
2024-10-18 11:51:38 -07:00
c98a65bb6f Merge pull request 'Add fargo filter input' (#79) from mk/fargo-filter into master
Reviewed-on: #79
Reviewed-by: Ivan Malison <ivanmalison@gmail.com>
2024-10-17 16:26:09 -06:00
e701c79469 Add fargo filter input
All checks were successful
Tests / Tests (pull_request) Successful in 10s
2024-10-17 15:24:56 -07:00
18cd3efe80 Dumb bug, nuked the schema lol (#78)
Alter fargo type, restore schema :O
Reviewed-on: #78
Co-authored-by: Mike Kalange <countablecloud@gmail.com>
Co-committed-by: Mike Kalange <countablecloud@gmail.com>
2024-10-17 15:15:54 -06:00
d71974d385 Merge pull request 'Add editUser mutation and input' (#77) from mk/edit-user into master
Reviewed-on: #77
2024-10-17 15:11:40 -06:00
0defdf0892 Add editUser mutation and input
All checks were successful
Tests / Tests (pull_request) Successful in 9s
2024-10-17 14:10:43 -07:00
8d1f79b8a8 GQL for caching hack 2024-10-17 01:28:14 -06:00
9dc426ea0f Moar fragments! 2024-10-16 23:39:14 -06:00
19a63b9d19 Move segment start times 2024-10-16 18:52:18 -06:00
ae97f956b3 Add segmentDurations and segmentStartFrames 2024-10-16 16:46:29 -06:00
d619751144 Add client side start and end time 2024-10-16 15:24:08 -06:00
e431a1751f Merge pull request 'Create get video for shot time conversion query' (#76) from kat/get-video-metadata into master
Reviewed-on: #76
Reviewed-by: Ivan Malison <ivanmalison@gmail.com>
2024-10-16 00:03:39 -06:00
209f0aa019 Create get video for shot time conversion query
All checks were successful
Tests / Tests (pull_request) Successful in 16s
2024-10-15 23:41:04 -06:00
70015a942c Merge pull request 'Add updateAnnotation interfaces' (#75) from mk/update-annotations into master
Reviewed-on: #75
2024-10-14 18:41:08 -06:00
91cfcb28e7 Add updateAnnotation interfaces
All checks were successful
Tests / Tests (pull_request) Successful in 8s
2024-10-14 17:27:07 -07:00
b2a09c1b8c Create reserved query for get shots with metadata (#74)
Reviewed-on: #74
Reviewed-by: Ivan Malison <ivanmalison@gmail.com>
2024-10-11 18:46:46 -06:00
59aaf47cbe Merge pull request 'Add a lightweight GQL call to get video header info' (#73) from loewy/add-lightweight-get-video-with-just-header-info into master
Reviewed-on: #73
2024-10-10 18:33:42 -06:00
c426e753cd add lightweigth gql call to get video header info
All checks were successful
Tests / Tests (pull_request) Successful in 15s
2024-10-10 17:02:18 -07:00
c8cf97421b Merge pull request 'Add id to shots: video items to prevent cache merge issues' (#72) from loewy/add-id-to-fix-cache-merging-issue into master
Reviewed-on: #72
2024-10-07 22:15:38 -06:00
9718137ad3 add id to prevent cache merge issues
All checks were successful
Tests / Tests (pull_request) Successful in 8s
2024-10-07 21:14:47 -07:00
af1fb3fee7 Merge pull request 'Add a lightweight query to get video thumbnail and info from getShotsResultGql' (#71) from loewy/get-shots-with-video into master
Reviewed-on: #71
Reviewed-by: Kat Huang <kkathuang@gmail.com>
2024-10-07 20:19:14 -06:00
025baf257a add a lightweight query to get video thumbnail and info from getShotsResultGql
All checks were successful
Tests / Tests (pull_request) Successful in 9s
2024-10-07 16:51:53 -07:00
8239ab6e1b Add a username filter 2024-10-06 13:44:53 -06:00
1f018f954e Add all targetPocketIntention features to shot retrieval 2024-10-06 13:16:39 -06:00
fd78ddf641 Add marginOfErrorInDegrees 2024-10-06 12:52:13 -06:00
7662f1f050 Merge pull request 'Add day back' (#70) from kat/add-day-back into master
Reviewed-on: #70
2024-10-05 14:44:27 -06:00
890bea2571 Add day back
All checks were successful
Tests / Tests (pull_request) Successful in 7s
2024-10-05 14:33:39 -06:00
f57f6dc32d Merge pull request 'Add day' (#69) from kat/update-gql into master
Reviewed-on: #69
2024-10-04 23:49:52 -06:00
14863e3357 Add day
All checks were successful
Tests / Tests (pull_request) Successful in 6s
2024-10-04 22:56:58 -06:00
Your Name
58f01c567c Add day alignment 2024-10-03 21:57:07 -06:00
937368c753 GetShotsWithMetadata accepts ids (#68)
Reviewed-on: #68
2024-10-03 12:36:35 -06:00
d8c11875d4 Merge pull request 'Update get shots with metadata' (#67) from kat/update-gql into master
Reviewed-on: #67
Reviewed-by: Ivan Malison <ivanmalison@gmail.com>
2024-10-03 11:47:20 -06:00
bacd9e77f0 Update get shots with metadata
All checks were successful
Tests / Tests (pull_request) Successful in 14s
2024-10-03 11:42:39 -06:00
69d755ba32 Merge pull request 'Use ShotWithAllFeatures in getAllShots' (#66) from kat/use-fragment-get-shots into master
Reviewed-on: #66
2024-10-02 19:09:50 -06:00
31fb95e3b0 Use ShotWithAllFeatures in getAllShots
All checks were successful
Tests / Tests (pull_request) Successful in 13s
2024-10-02 18:15:00 -06:00
7d0f9870dd Merge pull request 'Delete unused get shots operation' (#65) from kat/delete-unused-get-shots into master
Reviewed-on: #65
2024-10-02 17:46:26 -06:00
4a493b4e8d Delete unused get shots operation
All checks were successful
Tests / Tests (pull_request) Successful in 9s
2024-10-02 17:43:06 -06:00
341dc819a0 Merge pull request 'Use shot fragment in getShots to cache normalized shots' (#64) from kat/create-shot-fragment into master
Reviewed-on: #64
2024-10-02 17:37:59 -06:00
b58aecf7a5 Crate shot with all features fragment (#63)
Reviewed-on: #63
Reviewed-by: Ivan Malison <ivanmalison@gmail.com>
2024-10-01 19:19:39 -06:00
301c017d5e Delete unused varibles
All checks were successful
Tests / Tests (pull_request) Successful in 10s
2024-10-01 15:28:12 -06:00
1a4b676635 Create shot fragment
Some checks failed
Tests / Tests (pull_request) Failing after 4s
2024-09-30 17:08:11 -06:00
ce54bef0b4 Merge pull request 'Create get shots by ids operation' (#61) from kat/create-get-shots-by-id into master
Reviewed-on: #61
2024-09-29 22:55:34 -06:00
2699d29d7b Create get shots by ids operation
All checks were successful
Tests / Tests (pull_request) Successful in 16s
2024-09-29 22:53:24 -06:00
63a07d58ca Add get shots by Ids 2024-09-29 22:16:50 -06:00
59fe332fe0 Add ids to GetShotsResult 2024-09-26 21:47:44 -06:00
33723f4ea2 Improve TimeInterval type 2024-09-23 15:13:45 -06:00
c0ee55069e Merge pull request 'Add pocketing intention info' (#60) from volodymyr/pocketing-intention-info into master
Reviewed-on: #60
2024-09-23 11:47:01 -06:00
492ae4a225 Add pocketing intention info
All checks were successful
Tests / Tests (pull_request) Successful in 15s
2024-09-23 11:45:03 -06:00
dcdb324391 Add explicit optional scalars to KeyBallIdentifiers 2024-09-21 13:07:20 -06:00
90685cfdbf Make startDatetime and endDatetime optional 2024-09-20 22:29:18 -06:00
ab61894373 Fix multiline comment 2024-09-20 20:34:37 -07:00
662e0ade64 Merge pull request 'Add calendar aligned months' (#59) from mk/calendar-months into master
Reviewed-on: #59
Reviewed-by: Ivan Malison <ivanmalison@gmail.com>
2024-09-20 21:15:46 -06:00
75aa847ae1 Add calendar aligned months
All checks were successful
Tests / Tests (pull_request) Successful in 16s
2024-09-20 20:14:57 -07:00
c013228f79 Make range filters generic 2024-09-20 13:25:36 -06:00
740daf95ae Merge pull request 'Add Pocketing Intention Info' (#58) from mk/pocketing-intention-info into master
Reviewed-on: #58
Reviewed-by: Ivan Malison <ivanmalison@gmail.com>
2024-09-19 23:19:36 -06:00
768d29f93e Pocketing Intention Info Schema Changes
All checks were successful
Tests / Tests (pull_request) Successful in 7s
2024-09-19 22:59:36 -06:00
837e084a5a Add miss angle in degrees 2024-09-19 22:03:59 -06:00
12 changed files with 2321 additions and 571 deletions

View File

@@ -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:

View File

@@ -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)

View File

@@ -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"]

View File

@@ -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 {

View File

@@ -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
View 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!]!
}

File diff suppressed because it is too large Load Diff

View File

@@ -21,6 +21,7 @@ query GetFeed(
elapsedTime elapsedTime
screenshotUri screenshotUri
stream { stream {
id
isCompleted isCompleted
} }
tableSize tableSize

View File

@@ -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,133 @@ 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!, $limit: Int) {
getShotsWithMetadata(filterInput: $filterInput, limit: $limit) {
ids
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 {
...ShotWithAllFeatures
}
ids
}
}
query GetShotsByIds($ids: [Int!]!) {
getShotsByIds(ids: $ids) {
...ShotWithAllFeatures
}
}
fragment ShotWithAllFeatures on ShotGQL {
id id
videoId videoId
startFrame startFrame
endFrame endFrame
startTime @client
endTime @client
user { user {
id id
} }
falsePositiveScore falsePositiveScore
video { createdAt
stream { updatedAt
resolution { cueObjectFeatures {
width cueObjectDistance
height cueObjectAngle
cueBallSpeed
shotDirection
spinType
} }
pocketingIntentionFeatures {
make
targetPocketDistance
targetPocketAngle
targetPocketAngleDirection
marginOfErrorInDegrees
intendedPocketType
} }
pocketingIntentionInfo {
ballId
pocketId
pathMetadataIndex
} }
serializedShotPaths { serializedShotPaths {
b64EncodedBuffer b64EncodedBuffer
} }
createdAt @include(if: $includeCreatedAt) annotations {
updatedAt @include(if: $includeUpdatedAt) shotId
cueObjectFeatures @include(if: $includeCueObjectFeatures) { type {
cueObjectDistance @include(if: $includeCueObjectDistance) id
cueObjectAngle @include(if: $includeCueObjectAngle) name
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)
}
} }
notes
} }
} }

View File

@@ -57,6 +57,23 @@ query getUsernames(
getUsernames(matchString: $matchString, limit: $limit, after: $after) getUsernames(matchString: $matchString, limit: $limit, after: $after)
} }
query getUsernamesAndFollowing(
$userId: Int!
$matchString: String!
$limit: Int = null
$after: String = null
) {
getUsernamesAndFollowing(
userId: $userId
matchString: $matchString
limit: $limit
after: $after
) {
followers
following
}
}
query GetUserTags { query GetUserTags {
getUserTags { getUserTags {
id id

View File

@@ -45,6 +45,7 @@ query GetStreamMonitoringDetails($videoId: Int!, $debuggingJson: JSON) {
} }
} }
stream { stream {
id
linksRequested linksRequested
uploadsCompleted uploadsCompleted
segmentProcessingCursor segmentProcessingCursor
@@ -117,6 +118,11 @@ query GetVideoDetails($videoId: Int!) {
query GetVideos($videoIds: [Int!]!) { query GetVideos($videoIds: [Int!]!) {
getVideos(videoIds: $videoIds) { getVideos(videoIds: $videoIds) {
...VideoStreamMetadata
}
}
fragment VideoStreamMetadata on VideoGQL {
id id
framesPerSecond framesPerSecond
stream { stream {
@@ -133,6 +139,11 @@ query GetVideos($videoIds: [Int!]!) {
playlist { playlist {
segmentDurations segmentDurations
} }
}
query GetVideoForShotTime($videoId: Int!) {
getVideo(videoId: $videoId) {
...VideoStreamMetadata
} }
} }
@@ -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,16 +231,14 @@ query GetMedianRunForVideo($videoId: Int!) {
} }
} }
query GetVideoForClipTimes($videoId: Int!) { fragment StreamWithEndFrames on UploadStreamGQL {
getVideo(videoId: $videoId) {
id
framesPerSecond
playlist {
segmentDurations
}
stream {
id id
streamSegmentType streamSegmentType
segmentEndFrames @client
resolution {
width
height
}
segments { segments {
uploaded uploaded
valid valid
@@ -234,6 +246,45 @@ query GetVideoForClipTimes($videoId: Int!) {
endFrameIndex endFrameIndex
framesPerSecond 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
} }
} }

View File

@@ -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,18 @@ type Query {
limit: Int = null limit: Int = null
after: String = null after: String = null
): [String!]! ): [String!]!
getUsernamesAndFollowing(
userId: Int!
matchString: String = null
limit: Int = 100
after: String = null
): UsernamesAndFollowingResponse!
getUsernamesAndFollowingOld(
userId: Int!
matchString: String = null
limit: Int = 100
after: String = null
): UsernamesAndFollowingResponse!
getPlayTime(userId: Int!): UserPlayTimeGQL! getPlayTime(userId: Int!): UserPlayTimeGQL!
getUserVideos( getUserVideos(
userId: Int = null userId: Int = null
@@ -37,6 +57,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 {
@@ -96,9 +121,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"
} }
""" """
@@ -106,40 +132,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!]
@@ -149,21 +175,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!] backcut: [Boolean!]
targetPocketAngleDirection: [ShotDirectionEnum!] targetPocketAngleDirection: [ShotDirectionEnum!]
targetPocketAngle: RangeFilter 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
@@ -203,6 +234,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!
@@ -230,6 +275,7 @@ type MakePercentageIntervalGQL {
type GetShotsResult { type GetShotsResult {
shots: [ShotGQL!]! shots: [ShotGQL!]!
count: Int count: Int
ids: [Int!]!
} }
type ShotGQL { type ShotGQL {
@@ -241,6 +287,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
@@ -264,9 +311,25 @@ type PocketingIntentionFeaturesGQL {
difficulty: Float difficulty: Float
targetPocketAngle: Float targetPocketAngle: Float
targetPocketAngleDirection: ShotDirectionEnum targetPocketAngleDirection: ShotDirectionEnum
marginOfErrorInDegrees: Float
backcut: Boolean 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 {
wallsHit: [WallTypeEnum!]! wallsHit: [WallTypeEnum!]!
bankAngle: Float! bankAngle: Float!
@@ -284,13 +347,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: [Int!]
followers: [Int!]
} }
type ShotAnnotationGQL { type ShotAnnotationGQL {
@@ -457,6 +523,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!
@@ -467,6 +560,12 @@ input CreatedAfter @oneOf {
createdAt: DateTime createdAt: DateTime
} }
type UsernamesAndFollowingResponse {
users: [UserGQL!]!
following: [Int!]!
followers: [Int!]!
}
type UserPlayTimeGQL { type UserPlayTimeGQL {
totalSeconds: Float! totalSeconds: Float!
} }
@@ -508,10 +607,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!
@@ -561,6 +667,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!
} }
@@ -587,6 +703,11 @@ type TooManyProfileImageUploadsErr {
linksRequested: Int! linksRequested: Int!
} }
input EditUserInputGQL {
username: String = null
fargoRating: Int = null
}
type CreateUploadStreamReturn { type CreateUploadStreamReturn {
videoId: Int! videoId: Int!
} }
@@ -597,7 +718,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
@@ -605,24 +725,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!