mirror of
https://github.com/stashapp/stash.git
synced 2025-12-17 04:14:39 +03:00
Add new fields to scene tagger (#3094)
* Add new fields to scene tagger * Update scraper docs with new fields * Set code and director in identify * Add new fields to identify dialog
This commit is contained in:
@@ -280,6 +280,16 @@ func getScenePartial(scene *models.Scene, scraped *scraper.ScrapedScene, fieldOp
|
||||
partial.URL = models.NewOptionalString(*scraped.URL)
|
||||
}
|
||||
}
|
||||
if scraped.Director != nil && (scene.Director != *scraped.Director) {
|
||||
if shouldSetSingleValueField(fieldOptions["director"], scene.Director != "") {
|
||||
partial.Director = models.NewOptionalString(*scraped.Director)
|
||||
}
|
||||
}
|
||||
if scraped.Code != nil && (scene.Code != *scraped.Code) {
|
||||
if shouldSetSingleValueField(fieldOptions["code"], scene.Code != "") {
|
||||
partial.Code = models.NewOptionalString(*scraped.Code)
|
||||
}
|
||||
}
|
||||
|
||||
if setOrganized && !scene.Organized {
|
||||
// just reuse the boolean since we know it's true
|
||||
|
||||
@@ -3,7 +3,12 @@ import { Form, Button, Table } from "react-bootstrap";
|
||||
import { Icon } from "src/components/Shared";
|
||||
import * as GQL from "src/core/generated-graphql";
|
||||
import { FormattedMessage, useIntl } from "react-intl";
|
||||
import { multiValueSceneFields, SceneField, sceneFields } from "./constants";
|
||||
import {
|
||||
multiValueSceneFields,
|
||||
SceneField,
|
||||
sceneFieldMessageID,
|
||||
sceneFields,
|
||||
} from "./constants";
|
||||
import { ThreeStateBoolean } from "./ThreeStateBoolean";
|
||||
import {
|
||||
faCheck,
|
||||
@@ -13,7 +18,7 @@ import {
|
||||
|
||||
interface IFieldOptionsEditor {
|
||||
options: GQL.IdentifyFieldOptions | undefined;
|
||||
field: string;
|
||||
field: SceneField;
|
||||
editField: () => void;
|
||||
editOptions: (o?: GQL.IdentifyFieldOptions | null) => void;
|
||||
editing: boolean;
|
||||
@@ -64,7 +69,7 @@ const FieldOptionsEditor: React.FC<IFieldOptionsEditor> = ({
|
||||
}, [resetOptions]);
|
||||
|
||||
function renderField() {
|
||||
return intl.formatMessage({ id: field });
|
||||
return intl.formatMessage({ id: sceneFieldMessageID(field) });
|
||||
}
|
||||
|
||||
function renderStrategy() {
|
||||
|
||||
@@ -13,6 +13,8 @@ export const sceneFields = [
|
||||
"date",
|
||||
"details",
|
||||
"url",
|
||||
"code",
|
||||
"director",
|
||||
"studio",
|
||||
"performers",
|
||||
"tags",
|
||||
@@ -25,3 +27,11 @@ export const multiValueSceneFields: SceneField[] = [
|
||||
"performers",
|
||||
"tags",
|
||||
];
|
||||
|
||||
export function sceneFieldMessageID(field: SceneField) {
|
||||
if (field === "code") {
|
||||
return "scene_code";
|
||||
}
|
||||
|
||||
return field;
|
||||
}
|
||||
|
||||
@@ -365,6 +365,8 @@ const StashSearchResult: React.FC<IStashSearchResultProps> = ({
|
||||
url: resolveField("url", stashScene.url, scene.url),
|
||||
tag_ids: tagIDs,
|
||||
stash_ids: stashScene.stash_ids ?? [],
|
||||
code: resolveField("code", stashScene.code, scene.code),
|
||||
director: resolveField("director", stashScene.director, scene.director),
|
||||
};
|
||||
|
||||
const includeStashID = !excludedFieldList.includes("stash_ids");
|
||||
@@ -427,6 +429,8 @@ const StashSearchResult: React.FC<IStashSearchResultProps> = ({
|
||||
details: "details",
|
||||
studio: "studio",
|
||||
stash_ids: "stash_ids",
|
||||
code: "code",
|
||||
director: "director",
|
||||
};
|
||||
|
||||
const maybeRenderCoverImage = () => {
|
||||
@@ -510,6 +514,21 @@ const StashSearchResult: React.FC<IStashSearchResultProps> = ({
|
||||
}
|
||||
};
|
||||
|
||||
const maybeRenderStudioCode = () => {
|
||||
if (isActive && scene.code) {
|
||||
return (
|
||||
<h5>
|
||||
<OptionalField
|
||||
exclude={excludedFields[fields.code]}
|
||||
setExclude={(v) => setExcludedField(fields.code, v)}
|
||||
>
|
||||
{scene.code}
|
||||
</OptionalField>
|
||||
</h5>
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
const maybeRenderDateField = () => {
|
||||
if (isActive && scene.date) {
|
||||
return (
|
||||
@@ -525,6 +544,21 @@ const StashSearchResult: React.FC<IStashSearchResultProps> = ({
|
||||
}
|
||||
};
|
||||
|
||||
const maybeRenderDirector = () => {
|
||||
if (scene.director) {
|
||||
return (
|
||||
<h5>
|
||||
<OptionalField
|
||||
exclude={excludedFields[fields.director]}
|
||||
setExclude={(v) => setExcludedField(fields.director, v)}
|
||||
>
|
||||
<FormattedMessage id="director" />: {scene.director}
|
||||
</OptionalField>
|
||||
</h5>
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
const maybeRenderURL = () => {
|
||||
if (scene.url) {
|
||||
return (
|
||||
@@ -688,6 +722,7 @@ const StashSearchResult: React.FC<IStashSearchResultProps> = ({
|
||||
</>
|
||||
)}
|
||||
|
||||
{maybeRenderStudioCode()}
|
||||
{maybeRenderDateField()}
|
||||
{getDurationStatus(scene, stashSceneFile?.duration)}
|
||||
{getFingerprintStatus(scene, stashScene)}
|
||||
@@ -696,6 +731,7 @@ const StashSearchResult: React.FC<IStashSearchResultProps> = ({
|
||||
{isActive && (
|
||||
<div className="d-flex flex-column">
|
||||
{maybeRenderStashBoxID()}
|
||||
{maybeRenderDirector()}
|
||||
{maybeRenderURL()}
|
||||
{maybeRenderDetails()}
|
||||
</div>
|
||||
|
||||
@@ -800,6 +800,8 @@ Details
|
||||
```
|
||||
Title
|
||||
Details
|
||||
Code
|
||||
Director
|
||||
URL
|
||||
Date
|
||||
Image
|
||||
|
||||
Reference in New Issue
Block a user