Skip to content

Commit 15d28bf

Browse files
Mary HippMary Hipp
authored andcommitted
add option to fetch metadata from api instead of reading off of png
1 parent 0e5eac7 commit 15d28bf

File tree

5 files changed

+67
-20
lines changed

5 files changed

+67
-20
lines changed

invokeai/frontend/web/src/app/types/invokeai.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ export type AppConfig = {
4545
* Whether or not we should update image urls when image loading errors
4646
*/
4747
shouldUpdateImagesOnConnect: boolean;
48+
shouldFetchMetadataFromApi: boolean;
4849
disabledTabs: InvokeTabName[];
4950
disabledFeatures: AppFeature[];
5051
disabledSDFeatures: SDFeature[];

invokeai/frontend/web/src/features/gallery/components/CurrentImage/CurrentImageButtons.tsx

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ import {
2727
setShouldShowImageDetails,
2828
setShouldShowProgressInViewer,
2929
} from 'features/ui/store/uiSlice';
30-
import { memo, useCallback } from 'react';
30+
import { memo, useCallback, useMemo } from 'react';
3131
import { useHotkeys } from 'react-hotkeys-hook';
3232
import { useTranslation } from 'react-i18next';
3333
import {
@@ -49,7 +49,7 @@ import SingleSelectionMenuItems from '../ImageContextMenu/SingleSelectionMenuIte
4949

5050
const currentImageButtonsSelector = createSelector(
5151
[stateSelector, activeTabNameSelector],
52-
({ gallery, system, ui }, activeTabName) => {
52+
({ gallery, system, ui, config }, activeTabName) => {
5353
const { isProcessing, isConnected, shouldConfirmOnDelete, progressImage } =
5454
system;
5555

@@ -59,6 +59,8 @@ const currentImageButtonsSelector = createSelector(
5959
shouldShowProgressInViewer,
6060
} = ui;
6161

62+
const { shouldFetchMetadataFromApi } = config;
63+
6264
const lastSelectedImage = gallery.selection[gallery.selection.length - 1];
6365

6466
return {
@@ -72,6 +74,7 @@ const currentImageButtonsSelector = createSelector(
7274
shouldHidePreview,
7375
shouldShowProgressInViewer,
7476
lastSelectedImage,
77+
shouldFetchMetadataFromApi,
7578
};
7679
},
7780
{
@@ -92,6 +95,7 @@ const CurrentImageButtons = (props: CurrentImageButtonsProps) => {
9295
shouldShowImageDetails,
9396
lastSelectedImage,
9497
shouldShowProgressInViewer,
98+
shouldFetchMetadataFromApi,
9599
} = useAppSelector(currentImageButtonsSelector);
96100

97101
const isUpscalingEnabled = useFeatureStatus('upscaling').isFeatureEnabled;
@@ -106,8 +110,16 @@ const CurrentImageButtons = (props: CurrentImageButtonsProps) => {
106110
lastSelectedImage?.image_name ?? skipToken
107111
);
108112

113+
const getMetadataArg = useMemo(() => {
114+
if (lastSelectedImage) {
115+
return { image: lastSelectedImage, shouldFetchMetadataFromApi };
116+
} else {
117+
return skipToken;
118+
}
119+
}, [lastSelectedImage, shouldFetchMetadataFromApi]);
120+
109121
const { metadata, workflow, isLoading } = useGetImageMetadataFromFileQuery(
110-
lastSelectedImage ?? skipToken,
122+
getMetadataArg,
111123
{
112124
selectFromResult: (res) => ({
113125
isLoading: res.isFetching,

invokeai/frontend/web/src/features/gallery/components/ImageContextMenu/SingleSelectionMenuItems.tsx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { Flex, MenuItem, Spinner } from '@chakra-ui/react';
22
import { useAppToaster } from 'app/components/Toaster';
3-
import { useAppDispatch } from 'app/store/storeHooks';
3+
import { useAppDispatch, useAppSelector } from 'app/store/storeHooks';
44
import { setInitialCanvasImage } from 'features/canvas/store/canvasSlice';
55
import {
66
imagesToChangeSelected,
@@ -34,6 +34,7 @@ import {
3434
import { ImageDTO } from 'services/api/types';
3535
import { sentImageToCanvas, sentImageToImg2Img } from '../../store/actions';
3636
import { workflowLoadRequested } from 'features/nodes/store/actions';
37+
import { configSelector } from '../../../system/store/configSelectors';
3738

3839
type SingleSelectionMenuItemsProps = {
3940
imageDTO: ImageDTO;
@@ -48,9 +49,10 @@ const SingleSelectionMenuItems = (props: SingleSelectionMenuItemsProps) => {
4849
const toaster = useAppToaster();
4950

5051
const isCanvasEnabled = useFeatureStatus('unifiedCanvas').isFeatureEnabled;
52+
const { shouldFetchMetadataFromApi } = useAppSelector(configSelector);
5153

5254
const { metadata, workflow, isLoading } = useGetImageMetadataFromFileQuery(
53-
imageDTO,
55+
{ image: imageDTO, shouldFetchMetadataFromApi },
5456
{
5557
selectFromResult: (res) => ({
5658
isLoading: res.isFetching,

invokeai/frontend/web/src/features/gallery/components/ImageMetadataViewer/ImageMetadataViewer.tsx

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ import { useGetImageMetadataFromFileQuery } from 'services/api/endpoints/images'
1515
import { ImageDTO } from 'services/api/types';
1616
import DataViewer from './DataViewer';
1717
import ImageMetadataActions from './ImageMetadataActions';
18+
import { useAppSelector } from '../../../../app/store/storeHooks';
19+
import { configSelector } from '../../../system/store/configSelectors';
1820

1921
type ImageMetadataViewerProps = {
2022
image: ImageDTO;
@@ -27,12 +29,17 @@ const ImageMetadataViewer = ({ image }: ImageMetadataViewerProps) => {
2729
// dispatch(setShouldShowImageDetails(false));
2830
// });
2931

30-
const { metadata, workflow } = useGetImageMetadataFromFileQuery(image, {
31-
selectFromResult: (res) => ({
32-
metadata: res?.currentData?.metadata,
33-
workflow: res?.currentData?.workflow,
34-
}),
35-
});
32+
const { shouldFetchMetadataFromApi } = useAppSelector(configSelector);
33+
34+
const { metadata, workflow } = useGetImageMetadataFromFileQuery(
35+
{ image, shouldFetchMetadataFromApi },
36+
{
37+
selectFromResult: (res) => ({
38+
metadata: res?.currentData?.metadata,
39+
workflow: res?.currentData?.workflow,
40+
}),
41+
}
42+
);
3643

3744
return (
3845
<Flex

invokeai/frontend/web/src/services/api/endpoints/images.ts

Lines changed: 34 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import {
77
IMAGE_LIMIT,
88
} from 'features/gallery/store/types';
99
import { getMetadataAndWorkflowFromImageBlob } from 'features/nodes/util/getMetadataAndWorkflowFromImageBlob';
10-
import { keyBy } from 'lodash-es';
10+
import { isUndefined, keyBy } from 'lodash-es';
1111
import { ApiFullTagDescription, LIST_TAG, api } from '..';
1212
import { components, paths } from '../schema';
1313
import {
@@ -28,8 +28,12 @@ import {
2828
} from '../util';
2929
import { boardsApi } from './boards';
3030
import { ImageMetadataAndWorkflow } from 'features/nodes/types/types';
31-
import { fetchBaseQuery } from '@reduxjs/toolkit/dist/query';
31+
import {
32+
FetchBaseQueryError,
33+
fetchBaseQuery,
34+
} from '@reduxjs/toolkit/dist/query';
3235
import { $authToken, $projectId } from '../client';
36+
import { QueryReturnValue } from '@reduxjs/toolkit/dist/query/baseQueryTypes';
3337

3438
export const imagesApi = api.injectEndpoints({
3539
endpoints: (build) => ({
@@ -117,8 +121,16 @@ export const imagesApi = api.injectEndpoints({
117121
],
118122
keepUnusedDataFor: 86400, // 24 hours
119123
}),
120-
getImageMetadataFromFile: build.query<ImageMetadataAndWorkflow, ImageDTO>({
121-
queryFn: async (args: ImageDTO, api, extraOptions) => {
124+
getImageMetadataFromFile: build.query<
125+
ImageMetadataAndWorkflow,
126+
{ image: ImageDTO; shouldFetchMetadataFromApi: boolean }
127+
>({
128+
queryFn: async (
129+
args: { image: ImageDTO; shouldFetchMetadataFromApi: boolean },
130+
api,
131+
extraOptions,
132+
fetchWithBaseQuery
133+
) => {
122134
const authToken = $authToken.get();
123135
const projectId = $projectId.get();
124136
const customBaseQuery = fetchBaseQuery({
@@ -139,17 +151,30 @@ export const imagesApi = api.injectEndpoints({
139151
});
140152

141153
const response = await customBaseQuery(
142-
args.image_url,
154+
args.image.image_url,
143155
api,
144156
extraOptions
145157
);
146-
const data = await getMetadataAndWorkflowFromImageBlob(
158+
const blobData = await getMetadataAndWorkflowFromImageBlob(
147159
response.data as Blob
148160
);
149-
return { data };
161+
162+
let metadata = blobData.metadata;
163+
164+
if (args.shouldFetchMetadataFromApi) {
165+
const metadataResult = await fetchWithBaseQuery(
166+
`images/i/${args.image.image_name}/metadata`
167+
);
168+
if (metadataResult.data) {
169+
metadata = (metadataResult.data as UnsafeImageMetadata)
170+
.metadata as UnsafeImageMetadata['metadata'];
171+
}
172+
}
173+
174+
return { data: { ...blobData, metadata } };
150175
},
151-
providesTags: (result, error, image_dto) => [
152-
{ type: 'ImageMetadataFromFile', id: image_dto.image_name },
176+
providesTags: (result, error, { image, shouldFetchMetadataFromApi }) => [
177+
{ type: 'ImageMetadataFromFile', id: image.image_name },
153178
],
154179
keepUnusedDataFor: 86400, // 24 hours
155180
}),

0 commit comments

Comments
 (0)