From d743787bb38a16520a0d96e8acdb310a90250ce5 Mon Sep 17 00:00:00 2001 From: WithoutPants <53250216+WithoutPants@users.noreply.github.com> Date: Fri, 14 Nov 2025 12:57:34 +1100 Subject: [PATCH] Include stash-ids when creating objects from scrape dialog (#6269) * Filter out empty aliases --- .../Scenes/SceneDetails/SceneScrapeDialog.tsx | 6 ++- .../Shared/ScrapeDialog/createObjects.ts | 46 ++++++++++++++++--- .../Shared/ScrapeDialog/scrapedTags.tsx | 4 +- ui/v2.5/src/core/performers.ts | 19 +++++++- 4 files changed, 65 insertions(+), 10 deletions(-) diff --git a/ui/v2.5/src/components/Scenes/SceneDetails/SceneScrapeDialog.tsx b/ui/v2.5/src/components/Scenes/SceneDetails/SceneScrapeDialog.tsx index d6acfabfb..6a89caf85 100644 --- a/ui/v2.5/src/components/Scenes/SceneDetails/SceneScrapeDialog.tsx +++ b/ui/v2.5/src/components/Scenes/SceneDetails/SceneScrapeDialog.tsx @@ -133,7 +133,8 @@ export const SceneScrapeDialog: React.FC = ({ const { tags, newTags, scrapedTagsRow } = useScrapedTags( sceneTags, - scraped.tags + scraped.tags, + endpoint ); const [details, setDetails] = useState>( @@ -148,6 +149,7 @@ export const SceneScrapeDialog: React.FC = ({ scrapeResult: studio, setScrapeResult: setStudio, setNewObject: setNewStudio, + endpoint, }); const createNewPerformer = useCreateScrapedPerformer({ @@ -155,6 +157,7 @@ export const SceneScrapeDialog: React.FC = ({ setScrapeResult: setPerformers, newObjects: newPerformers, setNewObjects: setNewPerformers, + endpoint, }); const createNewGroup = useCreateScrapedGroup({ @@ -162,6 +165,7 @@ export const SceneScrapeDialog: React.FC = ({ setScrapeResult: setGroups, newObjects: newGroups, setNewObjects: setNewGroups, + endpoint, }); const intl = useIntl(); diff --git a/ui/v2.5/src/components/Shared/ScrapeDialog/createObjects.ts b/ui/v2.5/src/components/Shared/ScrapeDialog/createObjects.ts index c4ba3a3e7..e2d09294a 100644 --- a/ui/v2.5/src/components/Shared/ScrapeDialog/createObjects.ts +++ b/ui/v2.5/src/components/Shared/ScrapeDialog/createObjects.ts @@ -46,6 +46,7 @@ interface IUseCreateNewStudioProps { scrapeResult: ObjectScrapeResult ) => void; setNewObject: (newObject: GQL.ScrapedStudio | undefined) => void; + endpoint?: string; } export function useCreateScrapedStudio(props: IUseCreateNewStudioProps) { @@ -54,12 +55,33 @@ export function useCreateScrapedStudio(props: IUseCreateNewStudioProps) { const { scrapeResult, setScrapeResult, setNewObject } = props; async function createNewStudio(toCreate: GQL.ScrapedStudio) { + const input: GQL.StudioCreateInput = { + name: toCreate.name, + urls: toCreate.urls, + aliases: + toCreate.aliases + ?.split(",") + .map((a) => a.trim()) + .filter((a) => a) || [], + details: toCreate.details, + image: toCreate.image, + tag_ids: (toCreate.tags ?? []) + .filter((t) => t.stored_id) + .map((t) => t.stored_id!), + }; + + if (props.endpoint && toCreate.remote_site_id) { + input.stash_ids = [ + { + endpoint: props.endpoint, + stash_id: toCreate.remote_site_id, + }, + ]; + } + const result = await createStudio({ variables: { - input: { - name: toCreate.name, - url: toCreate.url, - }, + input, }, }); @@ -81,6 +103,7 @@ interface IUseCreateNewObjectProps { setScrapeResult: (scrapeResult: ScrapeResult) => void; newObjects: T[]; setNewObjects: (newObject: T[]) => void; + endpoint?: string; } export function useCreateScrapedPerformer( @@ -91,7 +114,7 @@ export function useCreateScrapedPerformer( const { scrapeResult, setScrapeResult, newObjects, setNewObjects } = props; async function createNewPerformer(toCreate: GQL.ScrapedPerformer) { - const input = scrapedPerformerToCreateInput(toCreate); + const input = scrapedPerformerToCreateInput(toCreate, props.endpoint); const result = await createPerformer({ variables: { input }, @@ -168,7 +191,18 @@ export function useCreateScrapedTag( const { scrapeResult, setScrapeResult, newObjects, setNewObjects } = props; async function createNewTag(toCreate: GQL.ScrapedTag) { - const input: GQL.TagCreateInput = { name: toCreate.name ?? "" }; + const input: GQL.TagCreateInput = { + name: toCreate.name ?? "", + }; + + if (props.endpoint && toCreate.remote_site_id) { + input.stash_ids = [ + { + endpoint: props.endpoint, + stash_id: toCreate.remote_site_id, + }, + ]; + } const result = await createTag({ variables: { input }, diff --git a/ui/v2.5/src/components/Shared/ScrapeDialog/scrapedTags.tsx b/ui/v2.5/src/components/Shared/ScrapeDialog/scrapedTags.tsx index 5527138d1..ca3658391 100644 --- a/ui/v2.5/src/components/Shared/ScrapeDialog/scrapedTags.tsx +++ b/ui/v2.5/src/components/Shared/ScrapeDialog/scrapedTags.tsx @@ -9,7 +9,8 @@ import { ScrapedTagsRow } from "./ScrapedObjectsRow"; export function useScrapedTags( existingTags: Tag[], - scrapedTags?: GQL.Maybe + scrapedTags?: GQL.Maybe, + endpoint?: string ) { const intl = useIntl(); const [tags, setTags] = useState>( @@ -33,6 +34,7 @@ export function useScrapedTags( setScrapeResult: setTags, newObjects: newTags, setNewObjects: setNewTags, + endpoint, }); const scrapedTagsRow = ( diff --git a/ui/v2.5/src/core/performers.ts b/ui/v2.5/src/core/performers.ts index 455ada9f9..9712c9824 100644 --- a/ui/v2.5/src/core/performers.ts +++ b/ui/v2.5/src/core/performers.ts @@ -84,9 +84,14 @@ export function sortPerformers(performers: T[]) { } export const scrapedPerformerToCreateInput = ( - toCreate: GQL.ScrapedPerformer + toCreate: GQL.ScrapedPerformer, + endpoint?: string ) => { - const aliases = toCreate.aliases?.split(",").map((a) => a.trim()); + const aliases = + toCreate.aliases + ?.split(",") + .map((a) => a.trim()) + .filter((a) => a) || []; const input: GQL.PerformerCreateInput = { name: toCreate.name ?? "", @@ -118,5 +123,15 @@ export const scrapedPerformerToCreateInput = ( : undefined, circumcised: stringToCircumcised(toCreate.circumcised), }; + + if (endpoint && toCreate.remote_site_id) { + input.stash_ids = [ + { + endpoint, + stash_id: toCreate.remote_site_id, + }, + ]; + } + return input; };