Return the shot's start frame image from getShotTableState
All checks were successful
Tests / Tests (pull_request) Successful in 12s
All checks were successful
Tests / Tests (pull_request) Successful in 12s
Shot Lab was showing the video's single thumbnail next to every shot's layout. The backend now returns the frame the layout was detected in as a base64 JPEG (frameImage), selected by the GetShotTableState operation. Also dedupes ShareLinkGQL/CreateShotShareLinkInput, which appeared twice in the committed schema after a bad merge. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -3882,6 +3882,7 @@ export type ShotProjectionGql = {
|
|||||||
|
|
||||||
export type ShotTableStateGql = {
|
export type ShotTableStateGql = {
|
||||||
__typename?: "ShotTableStateGQL";
|
__typename?: "ShotTableStateGQL";
|
||||||
|
frameImage?: Maybe<Scalars["String"]["output"]>;
|
||||||
frameIndex: Scalars["Int"]["output"];
|
frameIndex: Scalars["Int"]["output"];
|
||||||
shotId: Scalars["Int"]["output"];
|
shotId: Scalars["Int"]["output"];
|
||||||
tableState: TableStateGql;
|
tableState: TableStateGql;
|
||||||
@@ -7735,6 +7736,7 @@ export type GetShotTableStateQuery = {
|
|||||||
shotId: number;
|
shotId: number;
|
||||||
videoId: number;
|
videoId: number;
|
||||||
frameIndex: number;
|
frameIndex: number;
|
||||||
|
frameImage?: string | null;
|
||||||
tableState: {
|
tableState: {
|
||||||
__typename?: "TableStateGQL";
|
__typename?: "TableStateGQL";
|
||||||
identifierToPosition: Array<Array<number>>;
|
identifierToPosition: Array<Array<number>>;
|
||||||
@@ -16515,6 +16517,7 @@ export const GetShotTableStateDocument = gql`
|
|||||||
shotId
|
shotId
|
||||||
videoId
|
videoId
|
||||||
frameIndex
|
frameIndex
|
||||||
|
frameImage
|
||||||
tableState {
|
tableState {
|
||||||
...TableStateLayoutFields
|
...TableStateLayoutFields
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -44,9 +44,10 @@ fragment DetectionPocketPointFields on PocketPointsGQL {
|
|||||||
# positions. Boxes, pocket boxes, and source points share the crop's
|
# positions. Boxes, pocket boxes, and source points share the crop's
|
||||||
# coordinate space; the crop locates that space in the full frame.
|
# coordinate space; the crop locates that space in the full frame.
|
||||||
#
|
#
|
||||||
# Only the photo query selects this. The live and shot queries read a
|
# Only the photo query selects this. The shot query returns its source
|
||||||
# frame out of a video the app never holds, so there is no image to
|
# frame (frameImage) but positions there come from the stored homography,
|
||||||
# overlay, and getLiveTableState is polled every five seconds.
|
# so there are no fresh boxes to draw; the live query returns no image at
|
||||||
|
# all and is polled every five seconds.
|
||||||
fragment TableStateDetectionFields on TableStateGQL {
|
fragment TableStateDetectionFields on TableStateGQL {
|
||||||
identifierToBox {
|
identifierToBox {
|
||||||
...DetectionBoxFields
|
...DetectionBoxFields
|
||||||
@@ -97,6 +98,9 @@ query GetShotTableState($shotId: Int!) {
|
|||||||
shotId
|
shotId
|
||||||
videoId
|
videoId
|
||||||
frameIndex
|
frameIndex
|
||||||
|
# The b64 JPEG frame the layout was detected in, so the client can show
|
||||||
|
# the shot's actual starting frame instead of the video's thumbnail.
|
||||||
|
frameImage
|
||||||
tableState {
|
tableState {
|
||||||
...TableStateLayoutFields
|
...TableStateLayoutFields
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -250,11 +250,6 @@ input CreatePoolHallCameraInput {
|
|||||||
claimTermsText: String = null
|
claimTermsText: String = null
|
||||||
}
|
}
|
||||||
|
|
||||||
input CreateShotShareLinkInput {
|
|
||||||
shotIds: [Int!]!
|
|
||||||
paddingSeconds: Float = null
|
|
||||||
}
|
|
||||||
|
|
||||||
input CreatePoolHallInput {
|
input CreatePoolHallInput {
|
||||||
name: String!
|
name: String!
|
||||||
address: String = null
|
address: String = null
|
||||||
@@ -1573,6 +1568,7 @@ type ShotTableStateGQL {
|
|||||||
videoId: Int!
|
videoId: Int!
|
||||||
frameIndex: Int!
|
frameIndex: Int!
|
||||||
tableState: TableStateGQL!
|
tableState: TableStateGQL!
|
||||||
|
frameImage: String
|
||||||
}
|
}
|
||||||
|
|
||||||
input ShotsOrderingComponent @oneOf {
|
input ShotsOrderingComponent @oneOf {
|
||||||
@@ -1966,11 +1962,6 @@ type UserSubscriptionStatusGQL {
|
|||||||
stripeSubscriptionId: String
|
stripeSubscriptionId: String
|
||||||
}
|
}
|
||||||
|
|
||||||
type ShareLinkGQL {
|
|
||||||
slug: String!
|
|
||||||
url: String!
|
|
||||||
}
|
|
||||||
|
|
||||||
type VideoExportJobGQL {
|
type VideoExportJobGQL {
|
||||||
id: Int!
|
id: Int!
|
||||||
videoId: Int!
|
videoId: Int!
|
||||||
|
|||||||
Reference in New Issue
Block a user