Compare commits

..

211 Commits

Author SHA1 Message Date
0e00ae9297 Merge pull request 'Add private to VideoGQL' (#125) from mk/not-clear into master
Reviewed-on: #125
2024-11-07 18:50:34 -07:00
e16812f242 ???
All checks were successful
Tests / Tests (pull_request) Successful in 16s
2024-11-07 17:49:36 -08:00
3e9b7a0d16 Merge pull request 'Add private field to user and videos' (#124) from mk/privacy into master
Reviewed-on: #124
2024-11-07 18:19:01 -07:00
309deb9473 Add private field to user and videos
All checks were successful
Tests / Tests (pull_request) Successful in 9s
2024-11-07 17:16:56 -08:00
d5ba9c2ba5 Merge pull request 'Remove id from HomographyInfo fragment for now, use string instead of base64 for FindPrerecordTableLayout' (#122) from loewy/switch-back-to-string into master
Reviewed-on: #122
2024-11-07 18:09:51 -07:00
73771a263a remove id for now, use string instead of base64
All checks were successful
Tests / Tests (pull_request) Successful in 16s
2024-11-07 17:08:35 -08:00
655e59c43c Remove base64 scalar 2024-11-07 17:43:09 -07:00
056120a68a Merge pull request 'Add operation for FindPrerecordTableLayoutMutation + HomographyInfoGql fragment' (#121) from loewy/add-operation-check-homography into master
Reviewed-on: #121
2024-11-07 16:51:16 -07:00
bd7ffa7fdb add operation
All checks were successful
Tests / Tests (pull_request) Successful in 10s
2024-11-07 15:45:03 -08:00
ec58923c65 Add id to homography info gql 2024-11-07 16:29:33 -07:00
63869cd7ca Rename checkHomographyIsValid to findPrerecordTableLayout 2024-11-07 15:55:23 -07:00
08ae9611cf Add id to video processing gql 2024-11-07 15:52:07 -07:00
4e610b7df2 Merge pull request 'Return video processing status in feed' (#119) from kat/current-processing into master
Reviewed-on: #119
2024-11-06 22:41:30 -07:00
2d6d3964ad Return video processing status in feed
All checks were successful
Tests / Tests (pull_request) Successful in 8s
2024-11-06 22:40:18 -07:00
73a58de36e Merge pull request 'Make check homography mutation' (#118) from mk/make-homography-mutation into master
Reviewed-on: #118
2024-11-06 17:26:27 -07:00
dc6f246489 Make check homography mutation
All checks were successful
Tests / Tests (pull_request) Successful in 16s
2024-11-06 16:25:23 -08:00
c0a3aa97dc Merge pull request 'Add getShotsWithJustIds' (#117) from loewy/update-get-shots-with-video-ids into master
Reviewed-on: #117
2024-11-06 16:32:59 -07:00
f4e43b24f2 add getShotsWithJustIds
All checks were successful
Tests / Tests (pull_request) Successful in 15s
2024-11-06 14:58:32 -08:00
51ab8320d7 Merge pull request 'add checkHomographyIsValid' (#116) from mk/get-homography-valid into master
Reviewed-on: #116
2024-11-05 15:45:49 -07:00
f9a00ad3eb add checkHomographyIsValid
All checks were successful
Tests / Tests (pull_request) Successful in 16s
2024-11-05 14:39:23 -08:00
998b2ffc8c Merge pull request 'Create video card fragment' (#115) from kat/video-card-feed into master
Reviewed-on: #115
2024-11-05 14:04:02 -07:00
c7642e6204 Create video card fragment
All checks were successful
Tests / Tests (pull_request) Successful in 16s
2024-11-05 13:58:31 -07:00
b2ce1c2f96 Create video card fragment
All checks were successful
Tests / Tests (pull_request) Successful in 6s
2024-11-05 13:56:51 -07:00
d0cf071934 Merge pull request 'Return profile image in feed' (#114) from kat/image-uri-feed into master
Reviewed-on: #114
2024-11-05 12:54:24 -07:00
6b410b3d78 Return profile image in feed
All checks were successful
Tests / Tests (pull_request) Successful in 10s
2024-11-05 12:53:42 -07:00
607504261c Merge pull request 'Create new get feed operation' (#113) from kat/add-feed into master
Reviewed-on: #113
Reviewed-by: loewy <loewymalkov@gmail.com>
2024-11-04 15:13:56 -07:00
0421be855d Create new get feed operation
All checks were successful
Tests / Tests (pull_request) Successful in 8s
2024-11-04 15:08:21 -07:00
014aab473b Merge pull request 'Add operation for query doesUsernameExist' (#111) from loewy/query-does-username-exist into master
Reviewed-on: #111
2024-10-31 18:39:58 -06:00
353872401e does username exist query
All checks were successful
Tests / Tests (pull_request) Successful in 8s
2024-10-31 17:37:08 -07:00
433dfdaf74 Merge pull request 'Add countRespectsLimit to GetShotsWithMetadataFilterResult operation args' (#110) from loewy/add-count-respects-limit-to-get-shots-with-metadata-filter-result into master
Reviewed-on: #110
2024-10-31 16:41:06 -06:00
a2d9e688e9 add countRespectsLimit
All checks were successful
Tests / Tests (pull_request) Successful in 15s
2024-10-31 15:21:54 -07:00
b3259dac1f Merge pull request 'Add countRespectsLimit' (#109) from mk/count-respects-limit into master
Reviewed-on: #109
2024-10-31 14:40:06 -06:00
0982b9e60c Add countRespectsLimit
All checks were successful
Tests / Tests (pull_request) Successful in 15s
2024-10-31 13:37:15 -07:00
1710ae451c Merge pull request 'Return id for cache;' (#107) from kat/use-logged-in-user into master
Reviewed-on: #107
2024-10-31 01:57:38 -06:00
de9e7dea6a Return id for cache;
All checks were successful
Tests / Tests (pull_request) Successful in 15s
2024-10-31 01:56:34 -06:00
cfcf1dbcd2 Merge pull request 'Use logged in user for followers' (#106) from kat/use-logged-in-user into master
Reviewed-on: #106
2024-10-30 21:52:42 -06:00
05e3182e8b Use logged in user for followers
All checks were successful
Tests / Tests (pull_request) Successful in 15s
2024-10-30 18:20:25 -06:00
baf139aab5 Merge pull request 'Add support for medals' (#105) from mk/medals into master
Reviewed-on: #105
2024-10-30 17:53:33 -06:00
b3b454ef83 Add support for medals
All checks were successful
Tests / Tests (pull_request) Successful in 8s
2024-10-30 16:51:35 -07:00
f6e4a1bc0b Merge pull request 'Use getUser for getting followers' (#104) from kat/get-user-followers into master
Reviewed-on: #104
2024-10-30 16:19:53 -06:00
9d8155527d Use getUser for getting followers
All checks were successful
Tests / Tests (pull_request) Successful in 8s
2024-10-30 16:18:25 -06:00
8690e81029 Merge pull request 'Add doesUsernameExist' (#103) from mk/does-username-exist into master
Reviewed-on: #103
2024-10-30 13:08:59 -06:00
4ef13a482a Add doesUsernameExist
All checks were successful
Tests / Tests (pull_request) Successful in 15s
2024-10-30 12:07:54 -07:00
9db95c4e6c Merge pull request 'Get user following followers' (#101) from kat/get-user-following-followers into master
Reviewed-on: #101
2024-10-29 23:38:48 -06:00
249807c935 Get user following followers
All checks were successful
Tests / Tests (pull_request) Successful in 15s
2024-10-29 23:37:37 -06:00
eec79b2dc5 Merge pull request 'Use getOrderedShots when requesting getShotsWithVideoGql' (#100) from loewy/use-ordered-shots-to-get-thumbnail into master
Reviewed-on: #100
2024-10-29 19:44:14 -06:00
464c013095 Merge branch 'master' into loewy/use-ordered-shots-to-get-thumbnail
All checks were successful
Tests / Tests (pull_request) Successful in 1m37s
2024-10-29 19:42:30 -06:00
e2f4995cad use getOrderedShots when requesting getShotsWithVideoGql
All checks were successful
Tests / Tests (pull_request) Successful in 6m32s
2024-10-29 17:59:18 -07:00
a43b286e39 Merge pull request 'Followers and following' (#99) from kat/return-following-followers into master
Reviewed-on: #99
2024-10-29 15:48:34 -06:00
148f5362f0 Followers and following
All checks were successful
Tests / Tests (pull_request) Successful in 15s
2024-10-29 15:47:00 -06:00
4d01e9814d Merge pull request 'Remove unused field' (#98) from loewy/remove-ids-from-get-shot-video-gql into master
Reviewed-on: #98
2024-10-29 13:45:52 -06:00
b9e3e1f310 remove uneeded ids
All checks were successful
Tests / Tests (pull_request) Successful in 6s
2024-10-29 12:44:56 -07:00
b0da48c4fb Merge pull request 'Add fargoRating in getLoggedInUser operations requested fields' (#97) from loewy/fargo-rating-in-returns into master
Reviewed-on: #97
2024-10-28 17:04:08 -06:00
1e53dc21ee add fargoRating in user operations
All checks were successful
Tests / Tests (pull_request) Successful in 9s
2024-10-28 16:00:11 -07:00
5c5014339f Allow python 3.12 2024-10-28 02:24:24 -06:00
84188a6066 Merge pull request 'Return username in follow unfollow' (#96) from kat/return-username into master
Reviewed-on: #96
2024-10-27 19:19:41 -06:00
7c7be319d1 Return username in follow unfollow
All checks were successful
Tests / Tests (pull_request) Successful in 9s
2024-10-27 19:18:57 -06:00
79784faba1 Merge pull request 'Follow and unfollow mutation' (#95) from kat/user-relationships-result into master
Reviewed-on: #95
2024-10-27 13:53:22 -06:00
f3ea44755c Follow, unfollow mutation
All checks were successful
Tests / Tests (pull_request) Successful in 8s
2024-10-27 12:22:22 -06:00
9b6559559c Use clearer names in the fields of GetUserRelationshipsMatching 2024-10-25 16:58:21 -06:00
2398216bf2 Replace GetUsernamesAndRelationships with GetUserRelationshipsMatching 2024-10-25 02:45:07 -06:00
d942b91d17 Merge pull request 'Update get user and following response' (#94) from kat/update-gql-v2 into master
Reviewed-on: #94
2024-10-25 01:28:03 -06:00
24d9b9225e Update get user and following response
All checks were successful
Tests / Tests (pull_request) Successful in 15s
2024-10-25 01:27:14 -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
caea1b9572 Add pocket angle features 2024-09-19 18:28:18 -06:00
0a255f161a Merge pull request 'Add shot direction counts' (#57) from shot-direction-counts into master
Reviewed-on: #57
Reviewed-by: Ivan Malison <ivanmalison@gmail.com>
2024-09-19 12:02:51 -06:00
85a2da4b5c Add shot direction counts
All checks were successful
Tests / Tests (pull_request) Successful in 15s
2024-09-19 10:46:20 -07:00
647ef3049b Add spin type counts 2024-09-18 16:58:46 -06:00
7b48a5b6e2 Merge pull request 'Add DatetimeRangeAggregation' (#56) from mk/datetime-range-aggregation into master
Reviewed-on: #56
Reviewed-by: Ivan Malison <ivanmalison@gmail.com>
2024-09-18 15:31:31 -06:00
ec2e3da513 Add DatetimeRangeAggregation
All checks were successful
Tests / Tests (pull_request) Successful in 9s
2024-09-18 13:48:52 -07:00
72729e410b Merge pull request 'Add serializedShotPaths to GetShots' (#55) from loewy/add-shot-deserialization-to-operation into master
Reviewed-on: #55
2024-09-16 17:56:23 -06:00
5a9205a9b8 was on the wrong gql operation, updated
All checks were successful
Tests / Tests (pull_request) Successful in 7s
2024-09-16 15:44:22 -07:00
a33601158f add serializedShotPaths to GetShots
All checks were successful
Tests / Tests (pull_request) Successful in 8s
2024-09-16 11:55:30 -07:00
3c6b37b567 Merge pull request 'Add indices to shot proto' (#54) from mk/fix-shot-indexes into master
Reviewed-on: #54
Reviewed-by: Ivan Malison <ivanmalison@gmail.com>
2024-09-13 18:08:34 -06:00
9b18ada78d Add indices to shot proto
All checks were successful
Tests / Tests (pull_request) Successful in 11s
2024-09-13 16:54:17 -07:00
d57bb607e4 Merge pull request 'Serialization Improvements' (#53) from mk/serialization-improvements into master
Reviewed-on: #53
Reviewed-by: Ivan Malison <ivanmalison@gmail.com>
2024-09-11 16:23:18 -06:00
1f88ee4a0c Add KeyBalls to shot proto
All checks were successful
Tests / Tests (pull_request) Successful in 9s
2024-09-11 13:46:14 -07:00
a32317e72f Add Collision Info 2024-09-10 13:31:57 -07:00
b60cbe3854 Merge pull request 'Add current homography operation' (#52) from loewy/add-current-homography-in-operation into master
Reviewed-on: #52
Reviewed-by: Ivan Malison <ivanmalison@gmail.com>
2024-09-06 19:04:35 -06:00
e0b150aa2a add current homography operation
All checks were successful
Tests / Tests (pull_request) Successful in 6s
2024-09-06 19:00:13 -06:00
2bdfcb994e Merge pull request 'Added get shots with metadadata operation' (#51) from add-get-shots-with-metadata-query into master
Reviewed-on: #51
Reviewed-by: Ivan Malison <ivanmalison@gmail.com>
2024-09-05 23:18:37 -06:00
d5c6014548 Merge remote-tracking branch 'origin/master' into add-get-shots-with-metadata-query
All checks were successful
Tests / Tests (pull_request) Successful in 15s
2024-09-05 23:17:53 -06:00
de6fcacfd0 Merge pull request 'Added GetUserTagsQuery' (#50) from micah/add-get-tags-query into master
Reviewed-on: #50
Reviewed-by: Ivan Malison <ivanmalison@gmail.com>
2024-09-05 20:28:16 -06:00
993f62b6cf Added get shots with metadadata operation
All checks were successful
Tests / Tests (pull_request) Successful in 10s
2024-09-05 20:46:25 -05:00
aabd74d7d7 Added GetUserTagsQuery
All checks were successful
Tests / Tests (pull_request) Successful in 8s
2024-09-05 18:35:08 -07:00
15b307a88f Merge pull request 'Add current homography to VideoGQL' (#49) from loewy/add-current-homography-to-get-video into master
Reviewed-on: #49
2024-09-04 18:28:24 -06:00
72b338bfc2 add current homography to video gql
All checks were successful
Tests / Tests (pull_request) Successful in 6s
2024-09-04 18:04:55 -06:00
267486774c Add get shots result 2024-09-04 16:12:20 -06:00
b94a568ef1 Merge pull request 'Add error types for init uploading' (#48) from mk/limit-init-upload-links into master
Reviewed-on: #48
Reviewed-by: loewy <loewymalkov@gmail.com>
2024-09-03 16:52:51 -06:00
b773ccfc8f Add error types for init uploading
All checks were successful
Tests / Tests (pull_request) Successful in 15s
2024-09-03 15:50:02 -07:00
fd5c28e073 Add get shots with metadata 2024-09-01 21:16:44 +00:00
4c232829b6 Merge pull request 'Add spinType and cueBallSpeed to get shots operation' (#47) from loewy/add-spin-type-to-get-shots into master
Reviewed-on: #47
2024-08-29 19:34:19 -06:00
ddf1036009 add spin type and cue ball speed to get shots operation
All checks were successful
Tests / Tests (pull_request) Successful in 15s
2024-08-29 18:32:05 -07:00
9b3e5c23a0 Merge pull request 'Dummy query to resolve shot paths' (#46) from mk/deserialize-and-render into master
Reviewed-on: #46
Reviewed-by: loewy <loewymalkov@gmail.com>
2024-08-29 12:26:23 -06:00
a7eae9d46b Merge branch 'master' into mk/deserialize-and-render
All checks were successful
Tests / Tests (pull_request) Successful in 5s
2024-08-29 12:24:54 -06:00
8c3e9d6273 Merge pull request 'Add spinType and filter input' (#45) from mk/spin-type into master
Reviewed-on: #45
Reviewed-by: loewy <loewymalkov@gmail.com>
2024-08-28 17:38:43 -06:00
f306cc6c16 Merge branch 'master' into mk/spin-type
All checks were successful
Tests / Tests (pull_request) Successful in 9s
2024-08-28 17:27:58 -06:00
643cdb29e3 Add spinType and filter input
All checks were successful
Tests / Tests (pull_request) Successful in 15s
2024-08-28 16:27:21 -07:00
89287a0100 Merge pull request 'Expose frames per second in get videos' (#44) from kat/expose-frames-per-second into master
Reviewed-on: #44
2024-08-27 10:21:38 -06:00
f9b02f65e0 Expose frames per second in get videos
All checks were successful
Tests / Tests (pull_request) Successful in 7s
2024-08-26 20:53:16 -06:00
41169e2848 Dummy query to get it working for now
All checks were successful
Tests / Tests (pull_request) Successful in 7s
2024-08-26 15:54:43 -07:00
ba36bc709c Merge pull request 'Add resolution to getShots operation' (#42) from loewy/add-resolution-in-get-shots into master
Reviewed-on: #42
Reviewed-by: Ivan Malison <ivanmalison@gmail.com>
Reviewed-by: countablecloud <countablecloud@gmail.com>
2024-08-26 12:42:15 -06:00
4005416233 Merge branch 'master' into loewy/add-resolution-in-get-shots
All checks were successful
Tests / Tests (pull_request) Successful in 15s
2024-08-26 10:23:07 -06:00
db4a6315cd Merge pull request 'Add stream type to get videos' (#43) from kat/add-stream-type-get-videos into master
Reviewed-on: #43
Reviewed-by: Ivan Malison <ivanmalison@gmail.com>
2024-08-26 08:36:44 -06:00
af38fdea64 Add stream type to get videos
All checks were successful
Tests / Tests (pull_request) Successful in 7s
2024-08-26 06:56:40 -06:00
172df69340 add resolution to getShots operation
All checks were successful
Tests / Tests (pull_request) Successful in 9s
2024-08-23 17:29:40 -07:00
a030a0ef16 Merge pull request 'Error reporting types and Errors for Shot Annotation' (#41) from mk/allow-error-reporting into master
Reviewed-on: #41
Reviewed-by: Ivan Malison <ivanmalison@gmail.com>
2024-08-21 16:59:34 -06:00
7a6cc2739f Error reporting types and Errors
All checks were successful
Tests / Tests (pull_request) Successful in 9s
2024-08-21 13:41:24 -07:00
41c9701e18 Merge pull request 'Add separate return to profile image' (#40) from mk/add-separate-return-to-image-upload-link into master
Reviewed-on: #40
Reviewed-by: loewy <loewymalkov@gmail.com>
2024-08-19 15:58:15 -06:00
16e79ed608 Adds stream to get upload link
All checks were successful
Tests / Tests (pull_request) Successful in 14s
2024-08-19 14:54:48 -07:00
f401e1879b Add separate return to profile image
All checks were successful
Tests / Tests (pull_request) Successful in 15s
2024-08-19 14:44:43 -07:00
72b451d322 remove stream from getUploadLink 2024-08-16 18:47:08 -07:00
5350c46e0a Merge pull request 'Adds proper error return to stuff involving upload links' (#39) from mk/add-error-return-to-upload-links into master
Reviewed-on: #39
Reviewed-by: loewy <loewymalkov@gmail.com>
2024-08-16 19:02:31 -06:00
1f5c5774e1 Merge branch 'master' into mk/add-error-return-to-upload-links
All checks were successful
Tests / Tests (pull_request) Successful in 15s
2024-08-16 17:29:18 -06:00
3b29502e7e Adds proper error return to stuff involving upload links
All checks were successful
Tests / Tests (pull_request) Successful in 10s
2024-08-16 16:28:45 -07:00
abc7e9fd05 Merge pull request 'add minimum app version to get config call' (#38) from loewy/add-operation-minimum-app-version into master
Reviewed-on: #38
2024-08-16 16:40:39 -06:00
dd5ce77102 add minimum app version to get config call
All checks were successful
Tests / Tests (pull_request) Successful in 15s
2024-08-16 14:26:24 -07:00
dabaa3d1e1 Add minimum allowed AppVersion to deployed config 2024-08-16 12:21:46 -07:00
a6604a3a6d add tableSize to GetFeed 2024-08-15 19:52:03 -07:00
09a3e0e294 Add table size range filter 2024-08-15 19:42:53 -07:00
f20ca53a2a add tableSize to operations for getVideo
All checks were successful
Tests / Tests (pull_request) Successful in 14s
2024-08-15 18:51:36 -07:00
a2b912500c Merge pull request 'Add table size to return' (#36) from mk/table-size-non-optional-float into master
Reviewed-on: #36
Reviewed-by: loewy <loewymalkov@gmail.com>
2024-08-15 19:12:22 -06:00
7de3d196ba Add table size to return
All checks were successful
Tests / Tests (pull_request) Successful in 8s
2024-08-15 19:11:25 -06:00
6d5669aaf8 Merge pull request 'Make table size nonnullable float' (#35) from mk/table-size-non-optional-float into master
Reviewed-on: #35
Reviewed-by: Ivan Malison <ivanmalison@gmail.com>
2024-08-15 18:19:07 -06:00
2c583509a2 Make table size nonnullable and float
All checks were successful
Tests / Tests (pull_request) Successful in 7s
2024-08-15 16:54:07 -07:00
15 changed files with 5041 additions and 546 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

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

View File

@ -13,13 +13,15 @@ _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\"\xe6\x01\n\x04Path\x12\x13\n\x0bstart_frame\x18\x01 \x01(\r\x12\x11\n\tend_frame\x18\x02 \x01(\r\x12\x37\n\ndetections\x18\x03 \x01(\x0b\x32!.serialized_shot.DetectionHistoryH\x00\x12>\n\x0erle_detections\x18\x04 \x01(\x0b\x32$.serialized_shot.RLEDetectionHistoryH\x00\x12\x15\n\x0bnot_present\x18\x05 \x01(\x08H\x00\x12\x11\n\tis_static\x18\x06 \x01(\x08\x42\x13\n\x11\x64\x65tection_history\"R\n\x11IdentifierHistory\x12\x17\n\x0f\x62\x61ll_identifier\x18\x01 \x01(\r\x12$\n\x05paths\x18\x02 \x03(\x0b\x32\x15.serialized_shot.Path\"H\n\x04Shot\x12@\n\x14identifier_histories\x18\x03 \x03(\x0b\x32\".serialized_shot.IdentifierHistoryb\x06proto3') 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)
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'shot_pb2', _globals) _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'shot_pb2', _globals)
if _descriptor._USE_C_DESCRIPTORS == False: if _descriptor._USE_C_DESCRIPTORS == False:
DESCRIPTOR._options = None DESCRIPTOR._options = None
_globals['_COLLISIONINFO_BALLIDENTIFIERSENTRY']._options = None
_globals['_COLLISIONINFO_BALLIDENTIFIERSENTRY']._serialized_options = b'8\001'
_globals['_BOX']._serialized_start=31 _globals['_BOX']._serialized_start=31
_globals['_BOX']._serialized_end=94 _globals['_BOX']._serialized_end=94
_globals['_POINT']._serialized_start=96 _globals['_POINT']._serialized_start=96
@ -32,10 +34,16 @@ if _descriptor._USE_C_DESCRIPTORS == False:
_globals['_RLEDETECTIONHISTORY']._serialized_end=418 _globals['_RLEDETECTIONHISTORY']._serialized_end=418
_globals['_DETECTIONHISTORY']._serialized_start=420 _globals['_DETECTIONHISTORY']._serialized_start=420
_globals['_DETECTIONHISTORY']._serialized_end=490 _globals['_DETECTIONHISTORY']._serialized_end=490
_globals['_PATH']._serialized_start=493 _globals['_COLLISIONINFO']._serialized_start=493
_globals['_PATH']._serialized_end=723 _globals['_COLLISIONINFO']._serialized_end=745
_globals['_IDENTIFIERHISTORY']._serialized_start=725 _globals['_COLLISIONINFO_BALLIDENTIFIERSENTRY']._serialized_start=667
_globals['_IDENTIFIERHISTORY']._serialized_end=807 _globals['_COLLISIONINFO_BALLIDENTIFIERSENTRY']._serialized_end=745
_globals['_SHOT']._serialized_start=809 _globals['_PATH']._serialized_start=748
_globals['_SHOT']._serialized_end=881 _globals['_PATH']._serialized_end=1080
_globals['_IDENTIFIERHISTORY']._serialized_start=1082
_globals['_IDENTIFIERHISTORY']._serialized_end=1164
_globals['_KEYBALLIDENTIFIERS']._serialized_start=1167
_globals['_KEYBALLIDENTIFIERS']._serialized_end=1411
_globals['_SHOT']._serialized_start=1414
_globals['_SHOT']._serialized_end=1582
# @@protoc_insertion_point(module_scope) # @@protoc_insertion_point(module_scope)

View File

@ -55,21 +55,46 @@ class DetectionHistory(_message.Message):
detections: _containers.RepeatedCompositeFieldContainer[BallDetection] detections: _containers.RepeatedCompositeFieldContainer[BallDetection]
def __init__(self, detections: _Optional[_Iterable[_Union[BallDetection, _Mapping]]] = ...) -> None: ... def __init__(self, detections: _Optional[_Iterable[_Union[BallDetection, _Mapping]]] = ...) -> None: ...
class CollisionInfo(_message.Message):
__slots__ = ["source", "ball_identifiers", "wall_identifier", "frame_index", "static"]
class BallIdentifiersEntry(_message.Message):
__slots__ = ["key", "value"]
KEY_FIELD_NUMBER: _ClassVar[int]
VALUE_FIELD_NUMBER: _ClassVar[int]
key: int
value: Point
def __init__(self, key: _Optional[int] = ..., value: _Optional[_Union[Point, _Mapping]] = ...) -> None: ...
SOURCE_FIELD_NUMBER: _ClassVar[int]
BALL_IDENTIFIERS_FIELD_NUMBER: _ClassVar[int]
WALL_IDENTIFIER_FIELD_NUMBER: _ClassVar[int]
FRAME_INDEX_FIELD_NUMBER: _ClassVar[int]
STATIC_FIELD_NUMBER: _ClassVar[int]
source: int
ball_identifiers: _containers.MessageMap[int, Point]
wall_identifier: int
frame_index: int
static: bool
def __init__(self, source: _Optional[int] = ..., ball_identifiers: _Optional[_Mapping[int, Point]] = ..., wall_identifier: _Optional[int] = ..., frame_index: _Optional[int] = ..., static: bool = ...) -> None: ...
class Path(_message.Message): class Path(_message.Message):
__slots__ = ["start_frame", "end_frame", "detections", "rle_detections", "not_present", "is_static"] __slots__ = ["start_frame", "end_frame", "detections", "rle_detections", "not_present", "is_static", "start_info", "end_info"]
START_FRAME_FIELD_NUMBER: _ClassVar[int] START_FRAME_FIELD_NUMBER: _ClassVar[int]
END_FRAME_FIELD_NUMBER: _ClassVar[int] END_FRAME_FIELD_NUMBER: _ClassVar[int]
DETECTIONS_FIELD_NUMBER: _ClassVar[int] DETECTIONS_FIELD_NUMBER: _ClassVar[int]
RLE_DETECTIONS_FIELD_NUMBER: _ClassVar[int] RLE_DETECTIONS_FIELD_NUMBER: _ClassVar[int]
NOT_PRESENT_FIELD_NUMBER: _ClassVar[int] NOT_PRESENT_FIELD_NUMBER: _ClassVar[int]
IS_STATIC_FIELD_NUMBER: _ClassVar[int] IS_STATIC_FIELD_NUMBER: _ClassVar[int]
START_INFO_FIELD_NUMBER: _ClassVar[int]
END_INFO_FIELD_NUMBER: _ClassVar[int]
start_frame: int start_frame: int
end_frame: int end_frame: int
detections: DetectionHistory detections: DetectionHistory
rle_detections: RLEDetectionHistory rle_detections: RLEDetectionHistory
not_present: bool not_present: bool
is_static: bool is_static: bool
def __init__(self, start_frame: _Optional[int] = ..., end_frame: _Optional[int] = ..., detections: _Optional[_Union[DetectionHistory, _Mapping]] = ..., rle_detections: _Optional[_Union[RLEDetectionHistory, _Mapping]] = ..., not_present: bool = ..., is_static: bool = ...) -> None: ... start_info: CollisionInfo
end_info: CollisionInfo
def __init__(self, start_frame: _Optional[int] = ..., end_frame: _Optional[int] = ..., detections: _Optional[_Union[DetectionHistory, _Mapping]] = ..., rle_detections: _Optional[_Union[RLEDetectionHistory, _Mapping]] = ..., not_present: bool = ..., is_static: bool = ..., start_info: _Optional[_Union[CollisionInfo, _Mapping]] = ..., end_info: _Optional[_Union[CollisionInfo, _Mapping]] = ...) -> None: ...
class IdentifierHistory(_message.Message): class IdentifierHistory(_message.Message):
__slots__ = ["ball_identifier", "paths"] __slots__ = ["ball_identifier", "paths"]
@ -79,8 +104,32 @@ class IdentifierHistory(_message.Message):
paths: _containers.RepeatedCompositeFieldContainer[Path] paths: _containers.RepeatedCompositeFieldContainer[Path]
def __init__(self, ball_identifier: _Optional[int] = ..., paths: _Optional[_Iterable[_Union[Path, _Mapping]]] = ...) -> None: ... def __init__(self, ball_identifier: _Optional[int] = ..., paths: _Optional[_Iterable[_Union[Path, _Mapping]]] = ...) -> None: ...
class KeyBallIdentifiers(_message.Message):
__slots__ = ["cue_ball", "object_ball", "target_ball", "contact_sequence", "cue_ball_id", "object_ball_id", "target_ball_id"]
CUE_BALL_FIELD_NUMBER: _ClassVar[int]
OBJECT_BALL_FIELD_NUMBER: _ClassVar[int]
TARGET_BALL_FIELD_NUMBER: _ClassVar[int]
CONTACT_SEQUENCE_FIELD_NUMBER: _ClassVar[int]
CUE_BALL_ID_FIELD_NUMBER: _ClassVar[int]
OBJECT_BALL_ID_FIELD_NUMBER: _ClassVar[int]
TARGET_BALL_ID_FIELD_NUMBER: _ClassVar[int]
cue_ball: int
object_ball: int
target_ball: int
contact_sequence: _containers.RepeatedScalarFieldContainer[int]
cue_ball_id: int
object_ball_id: int
target_ball_id: int
def __init__(self, cue_ball: _Optional[int] = ..., object_ball: _Optional[int] = ..., target_ball: _Optional[int] = ..., contact_sequence: _Optional[_Iterable[int]] = ..., cue_ball_id: _Optional[int] = ..., object_ball_id: _Optional[int] = ..., target_ball_id: _Optional[int] = ...) -> None: ...
class Shot(_message.Message): class Shot(_message.Message):
__slots__ = ["identifier_histories"] __slots__ = ["identifier_histories", "key_balls", "start_index", "end_index"]
IDENTIFIER_HISTORIES_FIELD_NUMBER: _ClassVar[int] IDENTIFIER_HISTORIES_FIELD_NUMBER: _ClassVar[int]
KEY_BALLS_FIELD_NUMBER: _ClassVar[int]
START_INDEX_FIELD_NUMBER: _ClassVar[int]
END_INDEX_FIELD_NUMBER: _ClassVar[int]
identifier_histories: _containers.RepeatedCompositeFieldContainer[IdentifierHistory] identifier_histories: _containers.RepeatedCompositeFieldContainer[IdentifierHistory]
def __init__(self, identifier_histories: _Optional[_Iterable[_Union[IdentifierHistory, _Mapping]]] = ...) -> None: ... key_balls: KeyBallIdentifiers
start_index: int
end_index: int
def __init__(self, identifier_histories: _Optional[_Iterable[_Union[IdentifierHistory, _Mapping]]] = ..., key_balls: _Optional[_Union[KeyBallIdentifiers, _Mapping]] = ..., start_index: _Optional[int] = ..., end_index: _Optional[int] = ...) -> None: ...

View File

@ -25,12 +25,16 @@ message RLEBallDetection {
uint32 count = 2; uint32 count = 2;
} }
message RLEDetectionHistory { message RLEDetectionHistory { repeated RLEBallDetection detections = 1; }
repeated RLEBallDetection detections = 1;
}
message DetectionHistory { message DetectionHistory { repeated BallDetection detections = 1; }
repeated BallDetection detections = 1;
message CollisionInfo {
uint32 source = 1;
map<uint32, Point> ball_identifiers = 2;
uint32 wall_identifier = 3;
uint32 frame_index = 4;
bool static = 5;
} }
message Path { message Path {
@ -42,13 +46,32 @@ message Path {
bool not_present = 5; bool not_present = 5;
} }
bool is_static = 6; bool is_static = 6;
CollisionInfo start_info = 7;
CollisionInfo end_info = 8;
} }
message IdentifierHistory { message IdentifierHistory {
uint32 ball_identifier = 1; uint32 ball_identifier = 1;
repeated Path paths = 2; repeated Path paths = 2;
} }
message KeyBallIdentifiers {
uint32 cue_ball = 1;
uint32 object_ball = 2;
uint32 target_ball = 3;
// For now this will just be cue->object/target->target
// Long term this will potentially represent a linked list
// of all balls in a shot.
repeated uint32 contact_sequence = 4;
optional uint32 cue_ball_id = 5;
optional uint32 object_ball_id = 6;
optional uint32 target_ball_id = 7;
}
message Shot { message Shot {
repeated IdentifierHistory identifier_histories = 3; repeated IdentifierHistory identifier_histories = 3;
KeyBallIdentifiers key_balls = 4;
uint32 start_index = 5;
uint32 end_index = 6;
} }

View File

@ -427,6 +427,150 @@ function _decodeDetectionHistory(bb: ByteBuffer): DetectionHistory {
return message; return message;
} }
export interface CollisionInfo {
source?: number;
ball_identifiers?: { [key: number]: Point };
wall_identifier?: number;
frame_index?: number;
static?: boolean;
}
export function encodeCollisionInfo(message: CollisionInfo): Uint8Array {
let bb = popByteBuffer();
_encodeCollisionInfo(message, bb);
return toUint8Array(bb);
}
function _encodeCollisionInfo(message: CollisionInfo, bb: ByteBuffer): void {
// optional uint32 source = 1;
let $source = message.source;
if ($source !== undefined) {
writeVarint32(bb, 8);
writeVarint32(bb, $source);
}
// optional map<uint32, Point> ball_identifiers = 2;
let map$ball_identifiers = message.ball_identifiers;
if (map$ball_identifiers !== undefined) {
for (let key in map$ball_identifiers) {
let nested = popByteBuffer();
let value = map$ball_identifiers[key];
writeVarint32(nested, 8);
writeVarint32(nested, +key);
writeVarint32(nested, 18);
let nestedValue = popByteBuffer();
_encodePoint(value, nestedValue);
writeVarint32(nested, nestedValue.limit);
writeByteBuffer(nested, nestedValue);
pushByteBuffer(nestedValue);
writeVarint32(bb, 18);
writeVarint32(bb, nested.offset);
writeByteBuffer(bb, nested);
pushByteBuffer(nested);
}
}
// optional uint32 wall_identifier = 3;
let $wall_identifier = message.wall_identifier;
if ($wall_identifier !== undefined) {
writeVarint32(bb, 24);
writeVarint32(bb, $wall_identifier);
}
// optional uint32 frame_index = 4;
let $frame_index = message.frame_index;
if ($frame_index !== undefined) {
writeVarint32(bb, 32);
writeVarint32(bb, $frame_index);
}
// optional bool static = 5;
let $static = message.static;
if ($static !== undefined) {
writeVarint32(bb, 40);
writeByte(bb, $static ? 1 : 0);
}
}
export function decodeCollisionInfo(binary: Uint8Array): CollisionInfo {
return _decodeCollisionInfo(wrapByteBuffer(binary));
}
function _decodeCollisionInfo(bb: ByteBuffer): CollisionInfo {
let message: CollisionInfo = {} as any;
end_of_message: while (!isAtEnd(bb)) {
let tag = readVarint32(bb);
switch (tag >>> 3) {
case 0:
break end_of_message;
// optional uint32 source = 1;
case 1: {
message.source = readVarint32(bb) >>> 0;
break;
}
// optional map<uint32, Point> ball_identifiers = 2;
case 2: {
let values =
message.ball_identifiers || (message.ball_identifiers = {});
let outerLimit = pushTemporaryLength(bb);
let key: number | undefined;
let value: Point | undefined;
end_of_entry: while (!isAtEnd(bb)) {
let tag = readVarint32(bb);
switch (tag >>> 3) {
case 0:
break end_of_entry;
case 1: {
key = readVarint32(bb) >>> 0;
break;
}
case 2: {
let valueLimit = pushTemporaryLength(bb);
value = _decodePoint(bb);
bb.limit = valueLimit;
break;
}
default:
skipUnknownField(bb, tag & 7);
}
}
if (key === undefined || value === undefined)
throw new Error("Invalid data for map: ball_identifiers");
values[key] = value;
bb.limit = outerLimit;
break;
}
// optional uint32 wall_identifier = 3;
case 3: {
message.wall_identifier = readVarint32(bb) >>> 0;
break;
}
// optional uint32 frame_index = 4;
case 4: {
message.frame_index = readVarint32(bb) >>> 0;
break;
}
// optional bool static = 5;
case 5: {
message.static = !!readByte(bb);
break;
}
default:
skipUnknownField(bb, tag & 7);
}
}
return message;
}
export interface Path { export interface Path {
start_frame?: number; start_frame?: number;
end_frame?: number; end_frame?: number;
@ -434,6 +578,8 @@ export interface Path {
rle_detections?: RLEDetectionHistory; rle_detections?: RLEDetectionHistory;
not_present?: boolean; not_present?: boolean;
is_static?: boolean; is_static?: boolean;
start_info?: CollisionInfo;
end_info?: CollisionInfo;
} }
export function encodePath(message: Path): Uint8Array { export function encodePath(message: Path): Uint8Array {
@ -492,6 +638,28 @@ function _encodePath(message: Path, bb: ByteBuffer): void {
writeVarint32(bb, 48); writeVarint32(bb, 48);
writeByte(bb, $is_static ? 1 : 0); writeByte(bb, $is_static ? 1 : 0);
} }
// optional CollisionInfo start_info = 7;
let $start_info = message.start_info;
if ($start_info !== undefined) {
writeVarint32(bb, 58);
let nested = popByteBuffer();
_encodeCollisionInfo($start_info, nested);
writeVarint32(bb, nested.limit);
writeByteBuffer(bb, nested);
pushByteBuffer(nested);
}
// optional CollisionInfo end_info = 8;
let $end_info = message.end_info;
if ($end_info !== undefined) {
writeVarint32(bb, 66);
let nested = popByteBuffer();
_encodeCollisionInfo($end_info, nested);
writeVarint32(bb, nested.limit);
writeByteBuffer(bb, nested);
pushByteBuffer(nested);
}
} }
export function decodePath(binary: Uint8Array): Path { export function decodePath(binary: Uint8Array): Path {
@ -548,6 +716,22 @@ function _decodePath(bb: ByteBuffer): Path {
break; break;
} }
// optional CollisionInfo start_info = 7;
case 7: {
let limit = pushTemporaryLength(bb);
message.start_info = _decodeCollisionInfo(bb);
bb.limit = limit;
break;
}
// optional CollisionInfo end_info = 8;
case 8: {
let limit = pushTemporaryLength(bb);
message.end_info = _decodeCollisionInfo(bb);
bb.limit = limit;
break;
}
default: default:
skipUnknownField(bb, tag & 7); skipUnknownField(bb, tag & 7);
} }
@ -631,8 +815,165 @@ function _decodeIdentifierHistory(bb: ByteBuffer): IdentifierHistory {
return message; return message;
} }
export interface KeyBallIdentifiers {
cue_ball?: number;
object_ball?: number;
target_ball?: number;
contact_sequence?: number[];
cue_ball_id?: number;
object_ball_id?: number;
target_ball_id?: number;
}
export function encodeKeyBallIdentifiers(
message: KeyBallIdentifiers,
): Uint8Array {
let bb = popByteBuffer();
_encodeKeyBallIdentifiers(message, bb);
return toUint8Array(bb);
}
function _encodeKeyBallIdentifiers(
message: KeyBallIdentifiers,
bb: ByteBuffer,
): void {
// optional uint32 cue_ball = 1;
let $cue_ball = message.cue_ball;
if ($cue_ball !== undefined) {
writeVarint32(bb, 8);
writeVarint32(bb, $cue_ball);
}
// optional uint32 object_ball = 2;
let $object_ball = message.object_ball;
if ($object_ball !== undefined) {
writeVarint32(bb, 16);
writeVarint32(bb, $object_ball);
}
// optional uint32 target_ball = 3;
let $target_ball = message.target_ball;
if ($target_ball !== undefined) {
writeVarint32(bb, 24);
writeVarint32(bb, $target_ball);
}
// repeated uint32 contact_sequence = 4;
let array$contact_sequence = message.contact_sequence;
if (array$contact_sequence !== undefined) {
let packed = popByteBuffer();
for (let value of array$contact_sequence) {
writeVarint32(packed, value);
}
writeVarint32(bb, 34);
writeVarint32(bb, packed.offset);
writeByteBuffer(bb, packed);
pushByteBuffer(packed);
}
// optional uint32 cue_ball_id = 5;
let $cue_ball_id = message.cue_ball_id;
if ($cue_ball_id !== undefined) {
writeVarint32(bb, 40);
writeVarint32(bb, $cue_ball_id);
}
// optional uint32 object_ball_id = 6;
let $object_ball_id = message.object_ball_id;
if ($object_ball_id !== undefined) {
writeVarint32(bb, 48);
writeVarint32(bb, $object_ball_id);
}
// optional uint32 target_ball_id = 7;
let $target_ball_id = message.target_ball_id;
if ($target_ball_id !== undefined) {
writeVarint32(bb, 56);
writeVarint32(bb, $target_ball_id);
}
}
export function decodeKeyBallIdentifiers(
binary: Uint8Array,
): KeyBallIdentifiers {
return _decodeKeyBallIdentifiers(wrapByteBuffer(binary));
}
function _decodeKeyBallIdentifiers(bb: ByteBuffer): KeyBallIdentifiers {
let message: KeyBallIdentifiers = {} as any;
end_of_message: while (!isAtEnd(bb)) {
let tag = readVarint32(bb);
switch (tag >>> 3) {
case 0:
break end_of_message;
// optional uint32 cue_ball = 1;
case 1: {
message.cue_ball = readVarint32(bb) >>> 0;
break;
}
// optional uint32 object_ball = 2;
case 2: {
message.object_ball = readVarint32(bb) >>> 0;
break;
}
// optional uint32 target_ball = 3;
case 3: {
message.target_ball = readVarint32(bb) >>> 0;
break;
}
// repeated uint32 contact_sequence = 4;
case 4: {
let values =
message.contact_sequence || (message.contact_sequence = []);
if ((tag & 7) === 2) {
let outerLimit = pushTemporaryLength(bb);
while (!isAtEnd(bb)) {
values.push(readVarint32(bb) >>> 0);
}
bb.limit = outerLimit;
} else {
values.push(readVarint32(bb) >>> 0);
}
break;
}
// optional uint32 cue_ball_id = 5;
case 5: {
message.cue_ball_id = readVarint32(bb) >>> 0;
break;
}
// optional uint32 object_ball_id = 6;
case 6: {
message.object_ball_id = readVarint32(bb) >>> 0;
break;
}
// optional uint32 target_ball_id = 7;
case 7: {
message.target_ball_id = readVarint32(bb) >>> 0;
break;
}
default:
skipUnknownField(bb, tag & 7);
}
}
return message;
}
export interface Shot { export interface Shot {
identifier_histories?: IdentifierHistory[]; identifier_histories?: IdentifierHistory[];
key_balls?: KeyBallIdentifiers;
start_index?: number;
end_index?: number;
} }
export function encodeShot(message: Shot): Uint8Array { export function encodeShot(message: Shot): Uint8Array {
@ -654,6 +995,31 @@ function _encodeShot(message: Shot, bb: ByteBuffer): void {
pushByteBuffer(nested); pushByteBuffer(nested);
} }
} }
// optional KeyBallIdentifiers key_balls = 4;
let $key_balls = message.key_balls;
if ($key_balls !== undefined) {
writeVarint32(bb, 34);
let nested = popByteBuffer();
_encodeKeyBallIdentifiers($key_balls, nested);
writeVarint32(bb, nested.limit);
writeByteBuffer(bb, nested);
pushByteBuffer(nested);
}
// optional uint32 start_index = 5;
let $start_index = message.start_index;
if ($start_index !== undefined) {
writeVarint32(bb, 40);
writeVarint32(bb, $start_index);
}
// optional uint32 end_index = 6;
let $end_index = message.end_index;
if ($end_index !== undefined) {
writeVarint32(bb, 48);
writeVarint32(bb, $end_index);
}
} }
export function decodeShot(binary: Uint8Array): Shot { export function decodeShot(binary: Uint8Array): Shot {
@ -680,6 +1046,26 @@ function _decodeShot(bb: ByteBuffer): Shot {
break; break;
} }
// optional KeyBallIdentifiers key_balls = 4;
case 4: {
let limit = pushTemporaryLength(bb);
message.key_balls = _decodeKeyBallIdentifiers(bb);
bb.limit = limit;
break;
}
// optional uint32 start_index = 5;
case 5: {
message.start_index = readVarint32(bb) >>> 0;
break;
}
// optional uint32 end_index = 6;
case 6: {
message.end_index = readVarint32(bb) >>> 0;
break;
}
default: default:
skipUnknownField(bb, tag & 7); skipUnknownField(bb, tag & 7);
} }

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

@ -4,5 +4,6 @@ query getDeployedConfig {
devMode devMode
environment environment
firebase firebase
minimumAllowedAppVersion
} }
} }

View File

@ -1,3 +1,4 @@
# DO NOT USE: use getVideoFeed instead
query GetFeed( query GetFeed(
$limit: Int! = 5 $limit: Int! = 5
$after: String = null $after: String = null
@ -21,8 +22,10 @@ query GetFeed(
elapsedTime elapsedTime
screenshotUri screenshotUri
stream { stream {
id
isCompleted isCompleted
} }
tableSize
tags { tags {
tagClasses { tagClasses {
name name
@ -36,3 +39,60 @@ query GetFeed(
} }
} }
} }
fragment VideoCardFields on VideoGQL {
id
owner {
id
username
profileImageUri
}
name
screenshotUri
totalShotsMade
totalShots
makePercentage
createdAt
updatedAt
startTime
endTime
elapsedTime
screenshotUri
stream {
id
isCompleted
}
tableSize
tags {
tagClasses {
name
}
name
}
currentProcessing {
id
errors {
message
}
status
statuses {
status
}
}
}
query GetVideoFeed(
$limit: Int! = 5
$after: String = null
$filters: VideoFilterInput = null
) {
getFeedVideos(limit: $limit, after: $after, filters: $filters) {
videos {
...VideoCardFields
}
pageInfo {
hasNextPage
endCursor
}
}
}

View File

@ -1,45 +1,11 @@
query GetShots( query GetSerializedShotPaths($filterInput: FilterInput!) {
$filterInput: FilterInput! getShots(filterInput: $filterInput) {
$shotsPagination: GetShotsPagination = null
$limit: Int
$includeCreatedAt: Boolean! = false
$includeUpdatedAt: Boolean! = false
$includeCueObjectFeatures: Boolean! = false
$includePocketingIntentionFeatures: Boolean! = false
$includeCueObjectDistance: Boolean! = false
$includeCueObjectAngle: Boolean! = false
$includeCueBallSpeed: Boolean! = false
$includeShotDirection: Boolean! = false
$includeTargetPocketDistance: Boolean! = false
$includeMake: Boolean! = false
$includeIntendedPocketType: Boolean! = false
) {
getShots(
filterInput: $filterInput
shotsPagination: $shotsPagination
limit: $limit
) {
id id
videoId videoId
startFrame startFrame
endFrame endFrame
user { serializedShotPaths {
id b64EncodedBuffer
}
falsePositiveScore
createdAt @include(if: $includeCreatedAt)
updatedAt @include(if: $includeUpdatedAt)
cueObjectFeatures @include(if: $includeCueObjectFeatures) {
cueObjectDistance @include(if: $includeCueObjectDistance)
cueObjectAngle @include(if: $includeCueObjectAngle)
cueBallSpeed @include(if: $includeCueBallSpeed)
shotDirection @include(if: $includeShotDirection)
}
pocketingIntentionFeatures
@include(if: $includePocketingIntentionFeatures) {
targetPocketDistance @include(if: $includeTargetPocketDistance)
make @include(if: $includeMake)
intendedPocketType @include(if: $includeIntendedPocketType)
} }
} }
} }
@ -50,3 +16,161 @@ query GetShotAnnotationTypes {
name name
} }
} }
mutation UpdateShotAnnotations(
$shotId: Int!
$annotations: [UpdateAnnotationInputGQL!]!
) {
updateShotAnnotations(shotId: $shotId, annotations: $annotations) {
shot {
id
annotations {
shotId
type {
id
name
}
notes
}
}
error {
shotId
msg
}
}
}
## Should be deprecated
query GetShotsWithVideoGql(
$filterInput: FilterInput!
$shotsOrdering: GetShotsOrdering
$limit: Int
) {
getOrderedShots(
filterInput: $filterInput
shotsOrdering: $shotsOrdering
limit: $limit
) {
shots {
id
videoId
video {
screenshotUri
endTime
}
}
}
}
query GetShotsWithJustIds(
$filterInput: FilterInput!
$shotsOrdering: GetShotsOrdering
$limit: Int
) {
getOrderedShots(
filterInput: $filterInput
shotsOrdering: $shotsOrdering
limit: $limit
) {
shots {
id
videoId
}
}
}
## Reserved for playlists (which are created from a filter)
query GetShotsWithMetadataFilterResult(
$filterInput: FilterInput!
$shotsOrdering: GetShotsOrdering
$limit: Int
$ids: [Int!]
$countRespectsLimit: Boolean
) {
getOrderedShots(
filterInput: $filterInput
shotsOrdering: $shotsOrdering
limit: $limit
ids: $ids
countRespectsLimit: $countRespectsLimit
) {
count
shots {
...ShotWithAllFeatures
}
ids
}
}
# TODO: Delete
query GetShotsWithMetadata(
$filterInput: FilterInput!
$shotsPagination: GetShotsPagination
$limit: Int
$ids: [Int!]
) {
getShotsWithMetadata(
filterInput: $filterInput
shotsPagination: $shotsPagination
limit: $limit
ids: $ids
) {
count
shots {
...ShotWithAllFeatures
}
ids
}
}
query GetShotsByIds($ids: [Int!]!) {
getShotsByIds(ids: $ids) {
...ShotWithAllFeatures
}
}
fragment ShotWithAllFeatures on ShotGQL {
id
videoId
startFrame
endFrame
startTime @client
endTime @client
user {
id
}
falsePositiveScore
createdAt
updatedAt
cueObjectFeatures {
cueObjectDistance
cueObjectAngle
cueBallSpeed
shotDirection
spinType
}
pocketingIntentionFeatures {
make
targetPocketDistance
targetPocketAngle
targetPocketAngleDirection
marginOfErrorInDegrees
intendedPocketType
}
pocketingIntentionInfo {
ballId
pocketId
pathMetadataIndex
}
serializedShotPaths {
b64EncodedBuffer
}
annotations {
shotId
type {
id
name
}
notes
}
}

View File

@ -1,11 +1,22 @@
mutation getProfileImageUploadLink($fileExt: String = ".png") { mutation getProfileImageUploadLink($fileExt: String = ".png") {
getProfileImageUploadLink(fileExt: $fileExt) { getProfileImageUploadLink(fileExt: $fileExt) {
value {
... on UploadLink {
uploadUrl uploadUrl
headers { headers {
key key
value value
} }
} }
... on GetProfileUploadLinkErrors {
error {
... on TooManyProfileImageUploadsErr {
linksRequested
}
}
}
}
}
} }
mutation editProfileImageUri($profileImageUri: String!) { mutation editProfileImageUri($profileImageUri: String!) {
@ -26,6 +37,7 @@ query getLoggedInUser {
username username
isAdmin isAdmin
profileImageUri profileImageUri
fargoRating
activeVideoId activeVideoId
createdAt createdAt
updatedAt updatedAt
@ -45,3 +57,81 @@ query getUsernames(
) { ) {
getUsernames(matchString: $matchString, limit: $limit, after: $after) getUsernames(matchString: $matchString, limit: $limit, after: $after)
} }
query getUserRelationshipsMatching(
$userId: Int!
$matchString: String!
$limit: Int = null
$after: String = null
) {
getUserRelationshipsMatching(
userId: $userId
matchString: $matchString
limit: $limit
after: $after
) {
relationships {
toUser {
username
id
}
toUserFollows
toUserIsFollowedBy
}
}
}
query GetUserTags {
getUserTags {
id
name
}
}
mutation followUser($followedUserId: Int!) {
followUser(followedUserId: $followedUserId) {
username
id
following {
id
username
}
followers {
id
username
}
}
}
mutation unfollowUser($followedUserId: Int!) {
unfollowUser(followedUserId: $followedUserId) {
username
id
following {
id
username
}
followers {
id
username
}
}
}
query getUserFollowingFollowers {
getLoggedInUser {
id
following {
id
username
}
followers {
id
username
}
}
}
query doesUsernameExist($candidateUsername: String!) {
doesUsernameExist(candidateUsername: $candidateUsername)
}

View File

@ -4,47 +4,11 @@ query GetStreamMonitoringDetails($videoId: Int!, $debuggingJson: JSON) {
totalShots totalShots
makePercentage makePercentage
elapsedTime elapsedTime
homographyHistory { currentHomography {
crop { ...HomographyInfo
left
top
width
height
}
pockets {
left
top
width
height
}
sourcePoints {
topLeft {
x
y
}
topSide {
x
y
}
topRight {
x
y
}
bottomLeft {
x
y
}
bottomSide {
x
y
}
bottomRight {
x
y
}
}
} }
stream { stream {
id
linksRequested linksRequested
uploadsCompleted uploadsCompleted
segmentProcessingCursor segmentProcessingCursor
@ -70,6 +34,7 @@ query GetVideoUpdatePageDetails($videoId: Int!) {
totalShots totalShots
makePercentage makePercentage
elapsedTime elapsedTime
tableSize
tags { tags {
tagClasses { tagClasses {
name name
@ -98,6 +63,7 @@ query GetVideoDetails($videoId: Int!) {
totalShotsMade totalShotsMade
createdAt createdAt
updatedAt updatedAt
tableSize
owner { owner {
id id
firebaseUid firebaseUid
@ -115,12 +81,16 @@ query GetVideoDetails($videoId: Int!) {
query GetVideos($videoIds: [Int!]!) { query GetVideos($videoIds: [Int!]!) {
getVideos(videoIds: $videoIds) { getVideos(videoIds: $videoIds) {
id ...VideoStreamMetadata
playlist {
segmentDurations
} }
}
fragment VideoStreamMetadata on VideoGQL {
id
framesPerSecond
stream { stream {
id id
streamSegmentType
segments { segments {
uploaded uploaded
valid valid
@ -129,6 +99,14 @@ query GetVideos($videoIds: [Int!]!) {
framesPerSecond framesPerSecond
} }
} }
playlist {
segmentDurations
}
}
query GetVideoForShotTime($videoId: Int!) {
getVideo(videoId: $videoId) {
...VideoStreamMetadata
} }
} }
@ -139,6 +117,110 @@ query GetVideo($videoId: Int!) {
segmentDurations segmentDurations
} }
homographyHistory { homographyHistory {
...HomographyInfo
}
stream {
id
streamSegmentType
segments {
segmentIndex
endFrameIndex
framesPerSecond
}
resolution {
width
height
}
}
}
}
query GetAverageTimePerShotForVideo($videoId: Int!) {
getVideo(videoId: $videoId) {
id
averageTimeBetweenShots
}
}
query GetElapsedTimeForVideo($videoId: Int!) {
getVideo(videoId: $videoId) {
id
elapsedTime
}
}
query GetMedianRunForVideo($videoId: Int!) {
getVideo(videoId: $videoId) {
id
medianRun
}
}
fragment StreamWithEndFrames on UploadStreamGQL {
id
streamSegmentType
segmentEndFrames @client
resolution {
width
height
}
segments {
uploaded
valid
segmentIndex
endFrameIndex
framesPerSecond
}
}
fragment SegmentEndFrames on SegmentEndFramesGQL {
id
segmentEndFrames
}
fragment SegmentStartTimes on SegmentStartTimesGQL {
id
segmentStartTimes
}
fragment PlaylistWithSegmentStartTimes on HLSPlaylistGQL {
videoId
segmentDurations
segmentStartTimes @client
}
fragment VideoDurationData on VideoGQL {
id
framesPerSecond
playlist {
...PlaylistWithSegmentStartTimes
}
stream {
...StreamWithEndFrames
}
}
query GetVideoForClipTimes($videoId: Int!) {
getVideo(videoId: $videoId) {
...VideoDurationData
}
}
query GetHeaderInfoByVideoId($videoId: Int!) {
getVideo(videoId: $videoId) {
id
name
startTime
}
}
mutation FindPrerecordTableLayout($b64Image: String!, $videoId: Int!) {
findPrerecordTableLayout(b64Image: $b64Image, videoId: $videoId) {
...HomographyInfo
}
}
fragment HomographyInfo on HomographyInfoGQL {
frameIndex frameIndex
crop { crop {
left left
@ -179,57 +261,3 @@ query GetVideo($videoId: Int!) {
} }
} }
} }
stream {
streamSegmentType
segments {
segmentIndex
endFrameIndex
framesPerSecond
}
resolution {
width
height
}
}
}
}
query GetAverageTimePerShotForVideo($videoId: Int!) {
getVideo(videoId: $videoId) {
id
averageTimeBetweenShots
}
}
query GetElapsedTimeForVideo($videoId: Int!) {
getVideo(videoId: $videoId) {
id
elapsedTime
}
}
query GetMedianRunForVideo($videoId: Int!) {
getVideo(videoId: $videoId) {
id
medianRun
}
}
query GetVideoForClipTimes($videoId: Int!) {
getVideo(videoId: $videoId) {
id
framesPerSecond
playlist {
segmentDurations
}
stream {
id
streamSegmentType
segments {
uploaded
valid
segmentIndex
endFrameIndex
framesPerSecond
}
}
}
}

View File

@ -6,22 +6,65 @@ mutation CreateUploadStream($videoMetadataInput: VideoMetadataInput!) {
mutation GetUploadLink($videoId: Int!, $segmentIndex: Int!) { mutation GetUploadLink($videoId: Int!, $segmentIndex: Int!) {
getUploadLink(videoId: $videoId, segmentIndex: $segmentIndex) { getUploadLink(videoId: $videoId, segmentIndex: $segmentIndex) {
value {
... on UploadLink {
uploadUrl uploadUrl
headers { headers {
key key
value value
} }
} }
... on GetUploadLinkErrors {
error {
... on MustHaveSetForUploadLinkErr {
resolution
framesPerSecond
}
... on SegmentAlreadyUploadedErr {
segmentId
}
... on ProcessingFailedErr {
processing {
status
errors {
message
}
}
}
}
}
}
stream {
uploadCompletionCursor
}
}
} }
mutation GetHlsInitUploadLink($videoId: Int!) { mutation GetHlsInitUploadLink($videoId: Int!) {
getHlsInitUploadLink(videoId: $videoId) { getHlsInitUploadLink(videoId: $videoId) {
value {
... on UploadLink {
uploadUrl uploadUrl
headers { headers {
key key
value value
} }
} }
... on GetUploadLinkErrors {
error {
... on NoInitForChunkedUploadErr {
segmentType
}
... on InitUploadAlreadyCompletedErr {
segmentType
}
... on TooManyInitUploadsErr {
linksRequested
}
}
}
}
}
} }
mutation SetSegmentDuration( mutation SetSegmentDuration(

View File

@ -9,19 +9,43 @@ type Query {
videoId: ID! videoId: ID!
intervalDuration: Int! = 300 intervalDuration: Int! = 300
): [MakePercentageIntervalGQL!]! ): [MakePercentageIntervalGQL!]!
getMedals(scope: MedalScope!, userId: Int = null): RequestedMedalsGQL!
getOrderedShots(
filterInput: FilterInput!
ids: [Int!] = null
shotsOrdering: GetShotsOrdering = null
limit: Int! = 500
countRespectsLimit: Boolean! = false
): GetShotsResult!
getShotsWithMetadata(
filterInput: FilterInput!
ids: [Int!] = null
shotsPagination: GetShotsPagination = null
limit: Int! = 500
countRespectsLimit: Boolean! = false
): GetShotsResult!
getShots( getShots(
filterInput: FilterInput! filterInput: FilterInput!
shotsPagination: GetShotsPagination = null shotsPagination: GetShotsPagination = null
limit: Int! = 500 limit: Int! = 500
countRespectsLimit: Boolean! = false
): [ShotGQL!]! ): [ShotGQL!]!
getShotAnnotationTypes: [ShotAnnotationTypeGQL!]! getShotsByIds(ids: [Int!]!): [ShotGQL!]!
getShotAnnotationTypes(errorTypes: Boolean = false): [ShotAnnotationTypeGQL!]!
getUser(userId: Int!): UserGQL getUser(userId: Int!): UserGQL
doesUsernameExist(candidateUsername: String!): Boolean!
getLoggedInUser: UserGQL getLoggedInUser: UserGQL
getUsernames( getUsernames(
matchString: String = null matchString: String = null
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
@ -32,6 +56,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 {
@ -48,6 +77,21 @@ type TargetMetricsGQL {
count: Int! count: Int!
makePercentage: Float makePercentage: Float
averageDifficulty: Float averageDifficulty: Float
spinTypeCounts: SpinTypeCountsGQL
shotDirectionCounts: ShotDirectionCountsGQL
}
type SpinTypeCountsGQL {
follow: Int!
draw: Int!
center: Int!
unknown: Int!
}
type ShotDirectionCountsGQL {
left: Int!
right: Int!
straight: Int!
} }
input AggregateInputGQL { input AggregateInputGQL {
@ -58,6 +102,7 @@ input AggregateInputGQL {
input AggregationInput @oneOf { input AggregationInput @oneOf {
bucketSet: BucketSetInputGQL bucketSet: BucketSetInputGQL
enum: EnumAggregation enum: EnumAggregation
datetimeRange: DatetimeRangeAggregationInput
} }
input BucketSetInputGQL { input BucketSetInputGQL {
@ -74,19 +119,52 @@ input EnumAggregation {
feature: String! feature: String!
} }
input DatetimeRangeAggregationInput {
startDatetime: DateTime = null
endDatetime: DateTime = null
interval: TimeInterval!
feature: String! = "created_at"
}
"""
Date with time (isoformat)
"""
scalar DateTime
input TimeInterval @oneOf {
timedelta: TimeDeltaGQL
aligned: AlignedIntervalEnum
}
input TimeDeltaGQL {
days: Int = 0
weeks: Int = 0
months: Int = 0
years: Int = 0
}
enum AlignedIntervalEnum {
MONTH
YEAR
WEEK
DAY
}
input FilterInput @oneOf { input FilterInput @oneOf {
andFilters: [FilterInput!] andFilters: [FilterInput!]
orFilters: [FilterInput!] orFilters: [FilterInput!]
notFilter: FilterInput notFilter: FilterInput
cueObjectDistance: 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!]
@ -96,20 +174,32 @@ input FilterInput @oneOf {
isLeftMiss: [Boolean!] isLeftMiss: [Boolean!]
isRightMiss: [Boolean!] isRightMiss: [Boolean!]
isDirect: [Boolean!] isDirect: [Boolean!]
bankAngle: RangeFilter tableSize: FloatRangeFilter
bankDistance: RangeFilter bankAngle: FloatRangeFilter
kickAngle: RangeFilter bankDistance: FloatRangeFilter
kickDistance: RangeFilter kickAngle: FloatRangeFilter
cueAngleAfterObject: RangeFilter kickDistance: FloatRangeFilter
cueSpeedAfterObject: RangeFilter cueAngleAfterObject: FloatRangeFilter
spinType: [String!] spinType: [SpinTypeEnum!]
falsePositiveScore: RangeFilter cueSpeedAfterObject: FloatRangeFilter
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
includeOnNone: Boolean! = false includeOnNone: Boolean! = false
lessThanInclusive: Boolean! = false
greaterThanInclusive: Boolean! = true
} }
enum PocketEnum { enum PocketEnum {
@ -136,6 +226,27 @@ input ShotAnnotationInput {
name: String! name: String!
} }
enum SpinTypeEnum {
DRAW
FOLLOW
CENTER
UNKNOWN
}
input DateRangeFilter {
lessThan: Date = null
greaterThanEqualTo: Date = null
greaterThan: Date = null
includeOnNone: Boolean! = false
lessThanInclusive: Boolean! = false
greaterThanInclusive: Boolean! = true
}
"""
Date (isoformat)
"""
scalar Date
type BucketSetGQL { type BucketSetGQL {
keyName: String! keyName: String!
feature: String! feature: String!
@ -152,6 +263,7 @@ type DeployedConfigGQL {
firebase: Boolean! firebase: Boolean!
devMode: Boolean! devMode: Boolean!
environment: String! environment: String!
minimumAllowedAppVersion: String!
} }
type MakePercentageIntervalGQL { type MakePercentageIntervalGQL {
@ -159,6 +271,58 @@ type MakePercentageIntervalGQL {
elapsedTime: Float! elapsedTime: Float!
} }
type RequestedMedalsGQL {
distanceOver66: MedalGQL
distanceOver78: MedalGQL
distanceOver90: MedalGQL
runLength3: MedalGQL
runLength5: MedalGQL
runLength8: MedalGQL
runLength10: MedalGQL
runLength15: MedalGQL
runLength20: MedalGQL
runLength25: MedalGQL
runLength30: MedalGQL
runLength40: MedalGQL
runLength50: MedalGQL
totalMakes25: MedalGQL
totalMakes50: MedalGQL
totalMakes75: MedalGQL
totalMakes100: MedalGQL
totalMakes200: MedalGQL
totalMakes300: MedalGQL
totalMakes400: MedalGQL
totalMakes500: MedalGQL
totalMakes750: MedalGQL
totalMakes1000: MedalGQL
dayStreak2: MedalGQL
dayStreak3: MedalGQL
dayStreak4: MedalGQL
dayStreak5: MedalGQL
dayStreak6: MedalGQL
dayStreak7: MedalGQL
dayStreak14: MedalGQL
dayStreak21: MedalGQL
dayStreak30: MedalGQL
dayStreak60: MedalGQL
dayStreak90: MedalGQL
}
type MedalGQL {
count: Int!
}
input MedalScope @oneOf {
videoId: Int
interval: TimeInterval
}
type GetShotsResult {
shots: [ShotGQL!]!
count: Int
ids: [Int!]!
}
type ShotGQL { type ShotGQL {
id: Int! id: Int!
videoId: Int! videoId: Int!
@ -168,6 +332,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
@ -176,16 +341,12 @@ type ShotGQL {
video: VideoGQL video: VideoGQL
} }
"""
Date with time (isoformat)
"""
scalar DateTime
type CueObjectFeaturesGQL { type CueObjectFeaturesGQL {
cueObjectDistance: Float cueObjectDistance: Float
cueObjectAngle: Float cueObjectAngle: Float
cueBallSpeed: Float cueBallSpeed: Float
shotDirection: ShotDirectionEnum shotDirection: ShotDirectionEnum
spinType: SpinTypeEnum
} }
type PocketingIntentionFeaturesGQL { type PocketingIntentionFeaturesGQL {
@ -193,6 +354,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 {
@ -212,13 +392,17 @@ 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
videosPrivateByDefault: Boolean
following: [UserGQL!]
followers: [UserGQL!]
} }
type ShotAnnotationGQL { type ShotAnnotationGQL {
@ -226,6 +410,7 @@ type ShotAnnotationGQL {
type: ShotAnnotationTypeGQL! type: ShotAnnotationTypeGQL!
creator: UserGQL! creator: UserGQL!
notes: String! notes: String!
errorDefault: Boolean!
createdAt: DateTime createdAt: DateTime
updatedAt: DateTime updatedAt: DateTime
} }
@ -252,9 +437,12 @@ type VideoGQL {
endTime: DateTime endTime: DateTime
elapsedTime: Float elapsedTime: Float
framesPerSecond: Float! framesPerSecond: Float!
tableSize: Float!
private: Boolean!
stream: UploadStreamGQL stream: UploadStreamGQL
playlist: HLSPlaylistGQL playlist: HLSPlaylistGQL
tags: [VideoTag!]! tags: [VideoTag!]!
currentHomography: HomographyInfoGQL
homographyHistory: [HomographyInfoGQL!]! homographyHistory: [HomographyInfoGQL!]!
currentProcessing: VideoProcessingGQL currentProcessing: VideoProcessingGQL
} }
@ -323,6 +511,7 @@ type VideoTagClass {
} }
type HomographyInfoGQL { type HomographyInfoGQL {
id: Int!
frameIndex: Int! frameIndex: Int!
crop: BoundingBoxGQL! crop: BoundingBoxGQL!
pockets: [BoundingBoxGQL!]! pockets: [BoundingBoxGQL!]!
@ -352,6 +541,7 @@ type IntPoint2D {
} }
type VideoProcessingGQL { type VideoProcessingGQL {
id: Int!
errors: [VideoProcessingErrorGQL!]! errors: [VideoProcessingErrorGQL!]!
status: ProcessingStatusEnum! status: ProcessingStatusEnum!
statuses: [VideoProcessingStatusGQL!]! statuses: [VideoProcessingStatusGQL!]!
@ -382,6 +572,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!
@ -392,6 +609,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!
} }
@ -428,9 +656,23 @@ scalar JSON
type Mutation { type Mutation {
createBucketSet(params: CreateBucketSetInput!): BucketSetGQL! createBucketSet(params: CreateBucketSetInput!): BucketSetGQL!
setLoggerLevel(path: String!, level: String!): Boolean! setLoggerLevel(path: String!, level: String!): Boolean!
addAnnotationToShot(shotId: Int!, annotationName: String!): Boolean! addAnnotationToShot(
getProfileImageUploadLink(fileExt: String = ".png"): GetUploadLinkReturn! shotId: Int!
annotationName: String!
notes: String = null
): AddShotAnnotationReturn!
updateShotAnnotations(
shotId: Int!
annotations: [UpdateAnnotationInputGQL!]!
): UpdateShotAnnotationReturn!
getProfileImageUploadLink(
fileExt: String = ".png"
): GetProfileUploadLinkReturn!
editProfileImageUri(profileImageUri: String!): UserGQL! editProfileImageUri(profileImageUri: String!): UserGQL!
editUser(input: EditUserInputGQL!): UserGQL!
followUser(followedUserId: Int!): UserGQL!
unfollowUser(followedUserId: Int!): UserGQL!
findPrerecordTableLayout(b64Image: String!, videoId: Int!): HomographyInfoGQL
createUploadStream( createUploadStream(
videoMetadata: VideoMetadataInput! videoMetadata: VideoMetadataInput!
): CreateUploadStreamReturn! ): CreateUploadStreamReturn!
@ -451,10 +693,56 @@ input CreateBucketSetInput {
buckets: [BucketInputGQL!]! buckets: [BucketInputGQL!]!
} }
type GetUploadLinkReturn { type AddShotAnnotationReturn {
value: SuccessfulAddAddShotAnnotationErrors!
}
union SuccessfulAddAddShotAnnotationErrors =
SuccessfulAdd
| AddShotAnnotationErrors
type SuccessfulAdd {
value: Boolean!
}
type AddShotAnnotationErrors {
error: DoesNotOwnShotErrOtherErrorNeedsNote!
}
union DoesNotOwnShotErrOtherErrorNeedsNote =
DoesNotOwnShotErr
| OtherErrorNeedsNote
type DoesNotOwnShotErr {
shotId: Int!
msg: String
}
type OtherErrorNeedsNote {
msg: String
}
type UpdateShotAnnotationReturn {
shot: ShotGQL
error: DoesNotOwnShotErr
}
input UpdateAnnotationInputGQL {
name: String!
notes: String = null
}
type GetProfileUploadLinkReturn {
value: UploadLinkGetProfileUploadLinkErrors!
}
union UploadLinkGetProfileUploadLinkErrors =
UploadLink
| GetProfileUploadLinkErrors
type UploadLink {
uploadUrl: String! uploadUrl: String!
headers: [Header]! headers: [Header]!
uploadCompletionCursor: Int
} }
type Header { type Header {
@ -462,6 +750,20 @@ type Header {
value: String! value: String!
} }
type GetProfileUploadLinkErrors {
error: TooManyProfileImageUploadsErr!
}
type TooManyProfileImageUploadsErr {
linksRequested: Int!
}
input EditUserInputGQL {
username: String = null
fargoRating: Int = null
videosPrivateByDefault: Boolean = null
}
type CreateUploadStreamReturn { type CreateUploadStreamReturn {
videoId: Int! videoId: Int!
} }
@ -471,34 +773,61 @@ input VideoMetadataInput {
startTime: DateTime = null startTime: DateTime = null
endTime: DateTime = null endTime: DateTime = null
gameType: String = null gameType: String = null
tableSize: String = null tableSize: Float = null
uploadStreamMetadataInput: UploadStreamMetadataInput = null
lastIntendedSegmentBound: Int = null lastIntendedSegmentBound: Int = null
streamSegmentType: StreamSegmentTypeEnum = null streamSegmentType: StreamSegmentTypeEnum = null
private: Boolean = null
endStream: Boolean! = false endStream: Boolean! = false
resolution: VideoResolution = null resolution: VideoResolution = null
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!
} }
type GetUploadLinkReturn {
value: UploadLinkGetUploadLinkErrors!
stream: UploadStreamGQL
}
union UploadLinkGetUploadLinkErrors = UploadLink | GetUploadLinkErrors
type GetUploadLinkErrors {
error: MustHaveSetForUploadLinkErrSegmentAlreadyUploadedErrProcessingFailedErrNoInitForChunkedUploadErrTooManyProfileImageUploadsErrInitUploadAlreadyCompletedErrTooManyInitUploadsErr!
}
union MustHaveSetForUploadLinkErrSegmentAlreadyUploadedErrProcessingFailedErrNoInitForChunkedUploadErrTooManyProfileImageUploadsErrInitUploadAlreadyCompletedErrTooManyInitUploadsErr =
MustHaveSetForUploadLinkErr
| SegmentAlreadyUploadedErr
| ProcessingFailedErr
| NoInitForChunkedUploadErr
| TooManyProfileImageUploadsErr
| InitUploadAlreadyCompletedErr
| TooManyInitUploadsErr
type MustHaveSetForUploadLinkErr {
resolution: Boolean
framesPerSecond: Boolean
}
type SegmentAlreadyUploadedErr {
segmentId: Int!
}
type ProcessingFailedErr {
processing: VideoProcessingGQL!
}
type NoInitForChunkedUploadErr {
segmentType: StreamSegmentTypeEnum!
}
type InitUploadAlreadyCompletedErr {
segmentType: StreamSegmentTypeEnum!
}
type TooManyInitUploadsErr {
linksRequested: Int!
}