Fix performer scraping (#1314)

This commit is contained in:
InfiniteTF 2021-04-17 00:52:18 +02:00 committed by GitHub
parent e3fa8f7b24
commit cd0a9a1d62
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 71 additions and 30 deletions

View File

@ -146,7 +146,7 @@ export const PerformerEditPanel: React.FC<IPerformerDetails> = ({
const formik = useFormik({
initialValues,
validationSchema: schema,
onSubmit: (values) => onSave(getPerformerInput(values)),
onSubmit: (values) => onSave(values),
});
function translateScrapedGender(scrapedGender?: string) {
@ -158,7 +158,7 @@ export const PerformerEditPanel: React.FC<IPerformerDetails> = ({
// try to translate from enum values first
const upperGender = scrapedGender?.toUpperCase();
const asEnum = genderToString(upperGender as GQL.GenderEnum);
const asEnum = genderToString(upperGender);
if (asEnum) {
retEnum = stringToGender(asEnum);
} else {
@ -214,9 +214,14 @@ export const PerformerEditPanel: React.FC<IPerformerDetails> = ({
variables: tagInput,
});
if (!result.data?.tagCreate) {
Toast.error(new Error("Failed to create tag"));
return;
}
// add the new tag to the new tags value
const newTagIds = formik.values.tag_ids.concat([
result.data!.tagCreate!.id,
result.data.tagCreate.id,
]);
formik.setFieldValue("tag_ids", newTagIds);
@ -298,7 +303,7 @@ export const PerformerEditPanel: React.FC<IPerformerDetails> = ({
if (state.tags) {
// map tags to their ids and filter out those not found
const newTagIds = state.tags.map((t) => t.stored_id).filter((t) => t);
formik.setFieldValue("tag_ids", newTagIds as string[]);
formik.setFieldValue("tag_ids", newTagIds);
setNewTags(state.tags.filter((t) => !t.stored_id));
}
@ -309,9 +314,9 @@ export const PerformerEditPanel: React.FC<IPerformerDetails> = ({
// otherwise follow existing behaviour
if (
(!isNew || formik.values.image === undefined) &&
(state as GQL.ScrapedPerformerDataFragment).image !== undefined
state.image !== undefined
) {
const imageStr = (state as GQL.ScrapedPerformerDataFragment).image;
const imageStr = state.image;
formik.setFieldValue("image", imageStr ?? undefined);
}
if (state.details) {
@ -332,29 +337,30 @@ export const PerformerEditPanel: React.FC<IPerformerDetails> = ({
formik.setFieldValue("image", imageData);
}
async function onSave(
performerInput:
| Partial<GQL.PerformerCreateInput>
| Partial<GQL.PerformerUpdateInput>
) {
async function onSave(performerInput: InputValues) {
setIsLoading(true);
try {
if (!isNew) {
const input = getUpdateValues(performerInput);
await updatePerformer({
variables: {
input: {
...performerInput,
...input,
stash_ids: performerInput?.stash_ids?.map((s) => ({
endpoint: s.endpoint,
stash_id: s.stash_id,
})),
} as GQL.PerformerUpdateInput,
},
},
});
history.push(`/performers/${performer.id}`);
} else {
const input = getCreateValues(performerInput);
const result = await createPerformer({
variables: { input: performerInput as GQL.PerformerCreateInput },
variables: {
input,
},
});
if (result.data?.performerCreate) {
history.push(`/performers/${result.data.performerCreate.id}`);
@ -370,7 +376,7 @@ export const PerformerEditPanel: React.FC<IPerformerDetails> = ({
useEffect(() => {
if (isVisible) {
Mousetrap.bind("s s", () => {
onSave?.(getPerformerInput(formik.values));
onSave?.(formik.values);
});
if (!isNew) {
@ -413,19 +419,21 @@ export const PerformerEditPanel: React.FC<IPerformerDetails> = ({
if (isLoading) return <LoadingIndicator />;
function getPerformerInput(values: InputValues) {
const performerInput: Partial<
GQL.PerformerCreateInput | GQL.PerformerUpdateInput
> = {
function getUpdateValues(values: InputValues): GQL.PerformerUpdateInput {
return {
...values,
gender: stringToGender(values.gender),
weight: Number(values.weight),
id: performer.id ?? "",
};
}
function getCreateValues(values: InputValues): GQL.PerformerCreateInput {
return {
...values,
gender: stringToGender(values.gender),
weight: Number(values.weight),
};
if (!isNew) {
(performerInput as GQL.PerformerUpdateInput).id = performer.id!;
}
return performerInput;
}
function onImageChangeHandler(event: React.FormEvent<HTMLInputElement>) {

View File

@ -16,9 +16,10 @@ import {
usePerformerCreate,
useMovieCreate,
useTagCreate,
stringToGender,
} from "src/core/StashService";
import { useToast } from "src/hooks";
import { DurationUtils } from "src/utils";
import { DurationUtils, filterData } from "src/utils";
function renderScrapedStudio(
result: ScrapeResult<string>,
@ -360,11 +361,37 @@ export const SceneScrapeDialog: React.FC<ISceneScrapeDialogProps> = (
}
async function createNewPerformer(toCreate: GQL.ScrapedScenePerformer) {
let performerInput: GQL.PerformerCreateInput = { name: "" };
const input: GQL.PerformerCreateInput = {
name: toCreate.name,
url: toCreate.url,
gender: stringToGender(toCreate.gender),
birthdate: toCreate.birthdate,
ethnicity: toCreate.ethnicity,
country: toCreate.country,
eye_color: toCreate.eye_color,
height: toCreate.height,
measurements: toCreate.measurements,
fake_tits: toCreate.fake_tits,
career_length: toCreate.career_length,
tattoos: toCreate.tattoos,
piercings: toCreate.piercings,
aliases: toCreate.aliases,
twitter: toCreate.twitter,
instagram: toCreate.instagram,
tag_ids: filterData((toCreate.tags ?? []).map((t) => t.stored_id)),
image:
(toCreate.images ?? []).length > 0
? (toCreate.images ?? [])[0]
: undefined,
details: toCreate.details,
death_date: toCreate.death_date,
hair_color: toCreate.hair_color,
weight: toCreate.weight ? Number(toCreate.weight) : undefined,
};
try {
performerInput = Object.assign(performerInput, toCreate);
const result = await createPerformer({
variables: { input: performerInput },
variables: { input },
});
// add the new performer to the new performers value

View File

@ -933,7 +933,7 @@ export const stringGenderMap = new Map<string, GQL.GenderEnum>([
["Non-Binary", GQL.GenderEnum.NonBinary],
]);
export const genderToString = (value?: GQL.GenderEnum) => {
export const genderToString = (value?: GQL.GenderEnum | string) => {
if (!value) {
return undefined;
}
@ -947,7 +947,10 @@ export const genderToString = (value?: GQL.GenderEnum) => {
}
};
export const stringToGender = (value?: string, caseInsensitive?: boolean) => {
export const stringToGender = (
value?: string | null,
caseInsensitive?: boolean
) => {
if (!value) {
return undefined;
}

View File

@ -0,0 +1,2 @@
export const filterData = <T>(data?: (T | null | undefined)[] | null) =>
data ? (data.filter((item) => item) as T[]) : [];

View File

@ -11,3 +11,4 @@ export { default as flattenMessages } from "./flattenMessages";
export { default as getISOCountry } from "./country";
export { default as useFocus } from "./focus";
export { default as downloadFile } from "./download";
export * from "./data";