diff --git a/graphql/documents/data/config.graphql b/graphql/documents/data/config.graphql
index 57cd64c94..d8411a639 100644
--- a/graphql/documents/data/config.graphql
+++ b/graphql/documents/data/config.graphql
@@ -21,6 +21,8 @@ fragment ConfigInterfaceData on ConfigInterfaceResult {
showStudioAsText
css
cssEnabled
+ locale
+ language
}
fragment ConfigData on ConfigResult {
diff --git a/graphql/schema/types/config.graphql b/graphql/schema/types/config.graphql
index 2d90c24f4..dd94bea5f 100644
--- a/graphql/schema/types/config.graphql
+++ b/graphql/schema/types/config.graphql
@@ -75,6 +75,8 @@ input ConfigInterfaceInput {
"""Custom CSS"""
css: String
cssEnabled: Boolean
+ language: String
+ locale: String
}
type ConfigInterfaceResult {
@@ -91,6 +93,10 @@ type ConfigInterfaceResult {
"""Custom CSS"""
css: String
cssEnabled: Boolean
+ """Interface language"""
+ language: String
+ """Interface locale"""
+ locale: String
}
"""All configuration settings"""
diff --git a/pkg/api/resolver_mutation_configure.go b/pkg/api/resolver_mutation_configure.go
index 2b9273caf..cb71ef3d1 100644
--- a/pkg/api/resolver_mutation_configure.go
+++ b/pkg/api/resolver_mutation_configure.go
@@ -106,6 +106,14 @@ func (r *mutationResolver) ConfigureInterface(ctx context.Context, input models.
config.Set(config.ShowStudioAsText, *input.ShowStudioAsText)
}
+ if input.Language != nil {
+ config.Set(config.Language, *input.Language)
+ }
+
+ if input.Locale != nil {
+ config.Set(config.Locale, *input.Locale)
+ }
+
css := ""
if input.CSS != nil {
diff --git a/pkg/api/resolver_query_configuration.go b/pkg/api/resolver_query_configuration.go
index 80ddf8bd2..9a99e9a9e 100644
--- a/pkg/api/resolver_query_configuration.go
+++ b/pkg/api/resolver_query_configuration.go
@@ -57,6 +57,9 @@ func makeConfigInterfaceResult() *models.ConfigInterfaceResult {
showStudioAsText := config.GetShowStudioAsText()
css := config.GetCSS()
cssEnabled := config.GetCSSEnabled()
+ locale := config.GetLocale()
+ language := config.GetLanguage()
+
return &models.ConfigInterfaceResult{
SoundOnPreview: &soundOnPreview,
@@ -66,5 +69,7 @@ func makeConfigInterfaceResult() *models.ConfigInterfaceResult {
ShowStudioAsText: &showStudioAsText,
CSS: &css,
CSSEnabled: &cssEnabled,
+ Language: &language,
+ Locale: &locale,
}
}
diff --git a/pkg/manager/config/config.go b/pkg/manager/config/config.go
index 490094966..2eef9add9 100644
--- a/pkg/manager/config/config.go
+++ b/pkg/manager/config/config.go
@@ -32,6 +32,10 @@ const Host = "host"
const Port = "port"
const ExternalHost = "external_host"
+// i18n
+const Language = "language"
+const Locale = "locale"
+
// Interface options
const SoundOnPreview = "sound_on_preview"
const WallShowTitle = "wall_show_title"
@@ -97,6 +101,28 @@ func GetExcludes() []string {
return viper.GetStringSlice(Exclude)
}
+func GetLanguage() string {
+ ret := viper.GetString(Language)
+
+ // default to English
+ if ret == "" {
+ return "en"
+ }
+
+ return ret
+}
+
+func GetLocale() string {
+ ret := viper.GetString(Locale)
+
+ // default to US
+ if ret == "" {
+ return "US"
+ }
+
+ return ret
+}
+
func GetScrapersPath() string {
return viper.GetString(ScrapersPath)
}
diff --git a/ui/v2.5/.babelrc b/ui/v2.5/.babelrc
new file mode 100644
index 000000000..c14b2828d
--- /dev/null
+++ b/ui/v2.5/.babelrc
@@ -0,0 +1,3 @@
+{
+ "presets": ["react-app"]
+}
diff --git a/ui/v2.5/package.json b/ui/v2.5/package.json
index fd60fe54f..b2d4bcd32 100644
--- a/ui/v2.5/package.json
+++ b/ui/v2.5/package.json
@@ -12,7 +12,8 @@
"lint:js": "eslint --cache src/**/*.{ts,tsx}",
"lint:css": "stylelint 'src/**/*.scss'",
"format": "prettier --write \"src/**/*.{js,jsx,ts,tsx}\"",
- "gqlgen": "gql-gen --config codegen.yml"
+ "gqlgen": "gql-gen --config codegen.yml",
+ "extract": "NODE_ENV=development extract-messages -l=en,de -o src/locale -d en --flat false 'src/**/!(*.test).tsx'"
},
"browserslist": [
">0.2%",
@@ -35,6 +36,7 @@
"axios": "0.18.1",
"bootstrap": "^4.4.1",
"classnames": "^2.2.6",
+ "countries-list": "^2.5.1",
"formik": "^2.1.2",
"graphql": "^14.5.8",
"graphql-tag": "^2.10.1",
@@ -47,6 +49,7 @@
"react-dom": "16.12.0",
"react-hotkeys": "^2.0.0",
"react-images": "0.5.19",
+ "react-intl": "^3.12.0",
"react-jw-player": "1.19.0",
"react-photo-gallery": "^8.0.0",
"react-router-bootstrap": "^0.25.0",
@@ -83,6 +86,7 @@
"eslint-plugin-jsx-a11y": "^6.2.3",
"eslint-plugin-react": "^7.18.0",
"eslint-plugin-react-hooks": "^1.7.0",
+ "extract-react-intl-messages": "^2.3.5",
"node-sass": "4.13.1",
"postcss-safe-parser": "^4.0.1",
"prettier": "1.19.1",
diff --git a/ui/v2.5/src/App.tsx b/ui/v2.5/src/App.tsx
index 7786e58f0..897223ee3 100755
--- a/ui/v2.5/src/App.tsx
+++ b/ui/v2.5/src/App.tsx
@@ -1,8 +1,13 @@
import React from "react";
import { Route, Switch } from "react-router-dom";
+import { IntlProvider } from 'react-intl';
import { ToastProvider } from "src/hooks/Toast";
import { library } from "@fortawesome/fontawesome-svg-core";
import { fas } from "@fortawesome/free-solid-svg-icons";
+
+import locales from 'src/locale';
+import { StashService } from 'src/core/StashService';
+import { flattenMessages } from 'src/utils';
import { ErrorBoundary } from "./components/ErrorBoundary";
import Galleries from "./components/Galleries/Galleries";
import { MainNavbar } from "./components/MainNavbar";
@@ -15,31 +20,41 @@ import Studios from "./components/Studios/Studios";
import { TagList } from "./components/Tags/TagList";
import { SceneFilenameParser } from "./components/SceneFilenameParser/SceneFilenameParser";
+
library.add(fas);
-export const App: React.FC = () => (
-
-
-
-
-
-
-
-
- {/* */}
-
-
-
-
-
-
-
-
-
-
-
-
-);
+export const App: React.FC = () => {
+ const config = StashService.useConfiguration();
+ const locale = config.data?.configuration?.interface?.locale ?? 'US';
+ const language = config.data?.configuration?.interface?.language ?? 'en';
+ const messages = flattenMessages((locales as any)[language] ?? locales.en);
+
+ return (
+
+
+
+
+
+
+
+
+
+ {/* */}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+};
diff --git a/ui/v2.5/src/components/MainNavbar.tsx b/ui/v2.5/src/components/MainNavbar.tsx
index fcab11e27..326b18348 100644
--- a/ui/v2.5/src/components/MainNavbar.tsx
+++ b/ui/v2.5/src/components/MainNavbar.tsx
@@ -1,4 +1,5 @@
import React from "react";
+import { FormattedMessage } from 'react-intl';
import { Nav, Navbar, Button } from "react-bootstrap";
import { IconName } from "@fortawesome/fontawesome-svg-core";
import { LinkContainer } from "react-router-bootstrap";
@@ -7,7 +8,7 @@ import { Link, useLocation } from "react-router-dom";
import { Icon } from "src/components/Shared";
interface IMenuItem {
- text: string;
+ messageID: string;
href: string;
icon: IconName;
}
@@ -15,33 +16,33 @@ interface IMenuItem {
const menuItems: IMenuItem[] = [
{
icon: "play-circle",
- text: "Scenes",
+ messageID: "scenes",
href: "/scenes"
},
{
href: "/scenes/markers",
icon: "map-marker-alt",
- text: "Markers"
+ messageID: "markers"
},
{
href: "/galleries",
icon: "image",
- text: "Galleries"
+ messageID: "galleries"
},
{
href: "/performers",
icon: "user",
- text: "Performers"
+ messageID: "performers"
},
{
href: "/studios",
icon: "video",
- text: "Studios"
+ messageID: "studios"
},
{
href: "/tags",
icon: "tag",
- text: "Tags"
+ messageID: "tags"
}
];
@@ -59,7 +60,7 @@ export const MainNavbar: React.FC = () => {
""
) : (
-
+
);
@@ -85,7 +86,9 @@ export const MainNavbar: React.FC = () => {
>
))}
diff --git a/ui/v2.5/src/components/Settings/SettingsInterfacePanel.tsx b/ui/v2.5/src/components/Settings/SettingsInterfacePanel.tsx
index 6d3768b44..3c65da153 100644
--- a/ui/v2.5/src/components/Settings/SettingsInterfacePanel.tsx
+++ b/ui/v2.5/src/components/Settings/SettingsInterfacePanel.tsx
@@ -1,12 +1,13 @@
import React, { useEffect, useState } from "react";
import { Button, Form } from "react-bootstrap";
+import { countries } from "countries-list";
import { DurationInput, LoadingIndicator } from "src/components/Shared";
import { StashService } from "src/core/StashService";
import { useToast } from "src/hooks";
export const SettingsInterfacePanel: React.FC = () => {
const Toast = useToast();
- const config = StashService.useConfiguration();
+ const { data: config, error, loading } = StashService.useConfiguration();
const [soundOnPreview, setSoundOnPreview] = useState(true);
const [wallShowTitle, setWallShowTitle] = useState(true);
const [maximumLoopDuration, setMaximumLoopDuration] = useState(0);
@@ -14,6 +15,8 @@ export const SettingsInterfacePanel: React.FC = () => {
const [showStudioAsText, setShowStudioAsText] = useState(false);
const [css, setCSS] = useState();
const [cssEnabled, setCSSEnabled] = useState(false);
+ const [language, setLanguage] = useState('en');
+ const [locale, setLocale] = useState('US');
const [updateInterfaceConfig] = StashService.useConfigureInterface({
soundOnPreview,
@@ -22,13 +25,13 @@ export const SettingsInterfacePanel: React.FC = () => {
autostartVideo,
showStudioAsText,
css,
- cssEnabled
+ cssEnabled,
+ language,
+ locale
});
useEffect(() => {
- if (config.error) return;
-
- const iCfg = config?.data?.configuration?.interface;
+ const iCfg = config?.configuration?.interface;
setSoundOnPreview(iCfg?.soundOnPreview ?? true);
setWallShowTitle(iCfg?.wallShowTitle ?? true);
setMaximumLoopDuration(iCfg?.maximumLoopDuration ?? 0);
@@ -36,6 +39,8 @@ export const SettingsInterfacePanel: React.FC = () => {
setShowStudioAsText(iCfg?.showStudioAsText ?? false);
setCSS(iCfg?.css ?? "");
setCSSEnabled(iCfg?.cssEnabled ?? false);
+ setLanguage(iCfg?.language ?? 'en');
+ setLocale(iCfg?.locale ?? 'en_US');
}, [config]);
async function onSave() {
@@ -49,15 +54,39 @@ export const SettingsInterfacePanel: React.FC = () => {
}
}
+ if(error)
+ return {error.message}
;
+ if(loading)
+ return ;
+
return (
<>
- {config.error ? {config.error.message}
: ""}
- {!config?.data?.configuration || config.loading ? (
-
- ) : (
- ""
- )}
User Interface
+
+ Language
+ ) => setLanguage(e.currentTarget.value)}
+ >
+
+
+
+
+
+ Region
+ ) => setLocale(e.currentTarget.value)}
+ >
+ { Object.keys(countries).map(code => (
+
+ ))}
+
+
Scene / Marker Wall
{
const { data, error, loading } = StashService.useStats();
- if (loading || !data) return ;
+ if (loading || !data) return ;
if (error) return error.message;
@@ -15,40 +16,74 @@ export const Stats: React.FC = () => {
- Notes
+
+
+
- This is still an early version, some things are still a work in
- progress.
+
diff --git a/ui/v2.5/src/core/generated-graphql.tsx b/ui/v2.5/src/core/generated-graphql.tsx
index 9ca51898c..d53a71fe5 100644
--- a/ui/v2.5/src/core/generated-graphql.tsx
+++ b/ui/v2.5/src/core/generated-graphql.tsx
@@ -1,2391 +1,2504 @@
/* eslint-disable */
-import gql from "graphql-tag";
-import * as ApolloReactCommon from "@apollo/react-common";
-import * as React from "react";
-import * as ApolloReactComponents from "@apollo/react-components";
-import * as ApolloReactHooks from "@apollo/react-hooks";
+import gql from 'graphql-tag';
+import * as ApolloReactCommon from '@apollo/react-common';
+import * as React from 'react';
+import * as ApolloReactComponents from '@apollo/react-components';
+import * as ApolloReactHooks from '@apollo/react-hooks';
export type Maybe = T | null;
export type Omit = Pick>;
-// Generated in 2020-01-23T14:20:33+01:00
+// Generated in 2020-02-06T18:11:21+01:00
/** All built-in and custom scalars, mapped to their actual values */
export type Scalars = {
- ID: string;
- String: string;
- Boolean: boolean;
- Int: number;
- Float: number;
+ ID: string,
+ String: string,
+ Boolean: boolean,
+ Int: number,
+ Float: number,
/** Log entries */
- Time: any;
+ Time: any,
};
export type AutoTagMetadataInput = {
/** IDs of performers to tag files with, or "*" for all */
- performers?: Maybe>;
+ performers?: Maybe>,
/** IDs of studios to tag files with, or "*" for all */
- studios?: Maybe>;
+ studios?: Maybe>,
/** IDs of tags to tag files with, or "*" for all */
- tags?: Maybe>;
+ tags?: Maybe>,
};
export type BulkSceneUpdateInput = {
- clientMutationId?: Maybe;
- ids?: Maybe>;
- title?: Maybe;
- details?: Maybe;
- url?: Maybe;
- date?: Maybe;
- rating?: Maybe;
- studio_id?: Maybe;
- gallery_id?: Maybe;
- performer_ids?: Maybe>;
- tag_ids?: Maybe>;
+ clientMutationId?: Maybe,
+ ids?: Maybe>,
+ title?: Maybe,
+ details?: Maybe,
+ url?: Maybe,
+ date?: Maybe,
+ rating?: Maybe,
+ studio_id?: Maybe,
+ gallery_id?: Maybe,
+ performer_ids?: Maybe>,
+ tag_ids?: Maybe>,
};
export type ConfigGeneralInput = {
/** Array of file paths to content */
- stashes?: Maybe>;
+ stashes?: Maybe>,
/** Path to the SQLite database */
- databasePath?: Maybe;
+ databasePath?: Maybe,
/** Path to generated files */
- generatedPath?: Maybe;
+ generatedPath?: Maybe,
/** Max generated transcode size */
- maxTranscodeSize?: Maybe;
+ maxTranscodeSize?: Maybe,
/** Max streaming transcode size */
- maxStreamingTranscodeSize?: Maybe;
+ maxStreamingTranscodeSize?: Maybe,
/** Username */
- username?: Maybe;
+ username?: Maybe,
/** Password */
- password?: Maybe;
+ password?: Maybe,
/** Name of the log file */
- logFile?: Maybe;
+ logFile?: Maybe,
/** Whether to also output to stderr */
- logOut: Scalars["Boolean"];
+ logOut: Scalars['Boolean'],
/** Minimum log level */
- logLevel: Scalars["String"];
+ logLevel: Scalars['String'],
/** Whether to log http access */
- logAccess: Scalars["Boolean"];
+ logAccess: Scalars['Boolean'],
/** Array of file regexp to exclude from Scan */
- excludes?: Maybe>;
+ excludes?: Maybe>,
};
export type ConfigGeneralResult = {
- __typename?: "ConfigGeneralResult";
+ __typename?: 'ConfigGeneralResult',
/** Array of file paths to content */
- stashes: Array;
+ stashes: Array,
/** Path to the SQLite database */
- databasePath: Scalars["String"];
+ databasePath: Scalars['String'],
/** Path to generated files */
- generatedPath: Scalars["String"];
+ generatedPath: Scalars['String'],
/** Max generated transcode size */
- maxTranscodeSize?: Maybe;
+ maxTranscodeSize?: Maybe,
/** Max streaming transcode size */
- maxStreamingTranscodeSize?: Maybe;
+ maxStreamingTranscodeSize?: Maybe,
/** Username */
- username: Scalars["String"];
+ username: Scalars['String'],
/** Password */
- password: Scalars["String"];
+ password: Scalars['String'],
/** Name of the log file */
- logFile?: Maybe;
+ logFile?: Maybe,
/** Whether to also output to stderr */
- logOut: Scalars["Boolean"];
+ logOut: Scalars['Boolean'],
/** Minimum log level */
- logLevel: Scalars["String"];
+ logLevel: Scalars['String'],
/** Whether to log http access */
- logAccess: Scalars["Boolean"];
+ logAccess: Scalars['Boolean'],
/** Array of file regexp to exclude from Scan */
- excludes: Array;
+ excludes: Array,
};
export type ConfigInterfaceInput = {
/** Enable sound on mouseover previews */
- soundOnPreview?: Maybe;
+ soundOnPreview?: Maybe,
/** Show title and tags in wall view */
- wallShowTitle?: Maybe;
+ wallShowTitle?: Maybe,
/** Maximum duration (in seconds) in which a scene video will loop in the scene player */
- maximumLoopDuration?: Maybe;
+ maximumLoopDuration?: Maybe,
/** If true, video will autostart on load in the scene player */
- autostartVideo?: Maybe;
+ autostartVideo?: Maybe,
/** If true, studio overlays will be shown as text instead of logo images */
- showStudioAsText?: Maybe;
+ showStudioAsText?: Maybe,
/** Custom CSS */
- css?: Maybe;
- cssEnabled?: Maybe;
+ css?: Maybe,
+ cssEnabled?: Maybe,
+ language?: Maybe,
+ locale?: Maybe,
};
export type ConfigInterfaceResult = {
- __typename?: "ConfigInterfaceResult";
+ __typename?: 'ConfigInterfaceResult',
/** Enable sound on mouseover previews */
- soundOnPreview?: Maybe;
+ soundOnPreview?: Maybe,
/** Show title and tags in wall view */
- wallShowTitle?: Maybe;
+ wallShowTitle?: Maybe,
/** Maximum duration (in seconds) in which a scene video will loop in the scene player */
- maximumLoopDuration?: Maybe;
+ maximumLoopDuration?: Maybe,
/** If true, video will autostart on load in the scene player */
- autostartVideo?: Maybe;
+ autostartVideo?: Maybe,
/** If true, studio overlays will be shown as text instead of logo images */
- showStudioAsText?: Maybe;
+ showStudioAsText?: Maybe,
/** Custom CSS */
- css?: Maybe;
- cssEnabled?: Maybe;
+ css?: Maybe,
+ cssEnabled?: Maybe,
+ /** Interface language */
+ language?: Maybe,
+ /** Interface locale */
+ locale?: Maybe,
};
/** All configuration settings */
export type ConfigResult = {
- __typename?: "ConfigResult";
- general: ConfigGeneralResult;
- interface: ConfigInterfaceResult;
+ __typename?: 'ConfigResult',
+ general: ConfigGeneralResult,
+ interface: ConfigInterfaceResult,
};
export enum CriterionModifier {
/** = */
- Equals = "EQUALS",
+ Equals = 'EQUALS',
/** != */
- NotEquals = "NOT_EQUALS",
+ NotEquals = 'NOT_EQUALS',
/** > */
- GreaterThan = "GREATER_THAN",
+ GreaterThan = 'GREATER_THAN',
/** < */
- LessThan = "LESS_THAN",
+ LessThan = 'LESS_THAN',
/** IS NULL */
- IsNull = "IS_NULL",
+ IsNull = 'IS_NULL',
/** IS NOT NULL */
- NotNull = "NOT_NULL",
+ NotNull = 'NOT_NULL',
/** INCLUDES ALL */
- IncludesAll = "INCLUDES_ALL",
- Includes = "INCLUDES",
- Excludes = "EXCLUDES"
+ IncludesAll = 'INCLUDES_ALL',
+ Includes = 'INCLUDES',
+ Excludes = 'EXCLUDES'
}
export type FindFilterType = {
- q?: Maybe;
- page?: Maybe;
- per_page?: Maybe;
- sort?: Maybe;
- direction?: Maybe;
+ q?: Maybe,
+ page?: Maybe,
+ per_page?: Maybe,
+ sort?: Maybe,
+ direction?: Maybe,
};
export type FindGalleriesResultType = {
- __typename?: "FindGalleriesResultType";
- count: Scalars["Int"];
- galleries: Array;
+ __typename?: 'FindGalleriesResultType',
+ count: Scalars['Int'],
+ galleries: Array,
};
export type FindPerformersResultType = {
- __typename?: "FindPerformersResultType";
- count: Scalars["Int"];
- performers: Array;
+ __typename?: 'FindPerformersResultType',
+ count: Scalars['Int'],
+ performers: Array,
};
export type FindSceneMarkersResultType = {
- __typename?: "FindSceneMarkersResultType";
- count: Scalars["Int"];
- scene_markers: Array;
+ __typename?: 'FindSceneMarkersResultType',
+ count: Scalars['Int'],
+ scene_markers: Array,
};
export type FindScenesResultType = {
- __typename?: "FindScenesResultType";
- count: Scalars["Int"];
- scenes: Array;
+ __typename?: 'FindScenesResultType',
+ count: Scalars['Int'],
+ scenes: Array,
};
export type FindStudiosResultType = {
- __typename?: "FindStudiosResultType";
- count: Scalars["Int"];
- studios: Array;
+ __typename?: 'FindStudiosResultType',
+ count: Scalars['Int'],
+ studios: Array,
};
/** Gallery type */
export type Gallery = {
- __typename?: "Gallery";
- id: Scalars["ID"];
- checksum: Scalars["String"];
- path: Scalars["String"];
- title?: Maybe;
+ __typename?: 'Gallery',
+ id: Scalars['ID'],
+ checksum: Scalars['String'],
+ path: Scalars['String'],
+ title?: Maybe,
/** The files in the gallery */
- files: Array;
+ files: Array,
};
export type GalleryFilesType = {
- __typename?: "GalleryFilesType";
- index: Scalars["Int"];
- name?: Maybe;
- path?: Maybe;
+ __typename?: 'GalleryFilesType',
+ index: Scalars['Int'],
+ name?: Maybe,
+ path?: Maybe,
};
export type GenerateMetadataInput = {
- sprites: Scalars["Boolean"];
- previews: Scalars["Boolean"];
- markers: Scalars["Boolean"];
- transcodes: Scalars["Boolean"];
+ sprites: Scalars['Boolean'],
+ previews: Scalars['Boolean'],
+ markers: Scalars['Boolean'],
+ transcodes: Scalars['Boolean'],
};
export type IntCriterionInput = {
- value: Scalars["Int"];
- modifier: CriterionModifier;
+ value: Scalars['Int'],
+ modifier: CriterionModifier,
};
export type LogEntry = {
- __typename?: "LogEntry";
- time: Scalars["Time"];
- level: LogLevel;
- message: Scalars["String"];
+ __typename?: 'LogEntry',
+ time: Scalars['Time'],
+ level: LogLevel,
+ message: Scalars['String'],
};
export enum LogLevel {
- Debug = "Debug",
- Info = "Info",
- Progress = "Progress",
- Warning = "Warning",
- Error = "Error"
+ Debug = 'Debug',
+ Info = 'Info',
+ Progress = 'Progress',
+ Warning = 'Warning',
+ Error = 'Error'
}
export type MarkerStringsResultType = {
- __typename?: "MarkerStringsResultType";
- count: Scalars["Int"];
- id: Scalars["ID"];
- title: Scalars["String"];
+ __typename?: 'MarkerStringsResultType',
+ count: Scalars['Int'],
+ id: Scalars['ID'],
+ title: Scalars['String'],
};
export type MetadataUpdateStatus = {
- __typename?: "MetadataUpdateStatus";
- progress: Scalars["Float"];
- status: Scalars["String"];
- message: Scalars["String"];
+ __typename?: 'MetadataUpdateStatus',
+ progress: Scalars['Float'],
+ status: Scalars['String'],
+ message: Scalars['String'],
};
export type MultiCriterionInput = {
- value?: Maybe>;
- modifier: CriterionModifier;
+ value?: Maybe>,
+ modifier: CriterionModifier,
};
export type Mutation = {
- __typename?: "Mutation";
- sceneUpdate?: Maybe;
- bulkSceneUpdate?: Maybe>;
- sceneDestroy: Scalars["Boolean"];
- scenesUpdate?: Maybe>>;
- sceneMarkerCreate?: Maybe;
- sceneMarkerUpdate?: Maybe;
- sceneMarkerDestroy: Scalars["Boolean"];
- performerCreate?: Maybe;
- performerUpdate?: Maybe;
- performerDestroy: Scalars["Boolean"];
- studioCreate?: Maybe;
- studioUpdate?: Maybe;
- studioDestroy: Scalars["Boolean"];
- tagCreate?: Maybe;
- tagUpdate?: Maybe;
- tagDestroy: Scalars["Boolean"];
+ __typename?: 'Mutation',
+ sceneUpdate?: Maybe,
+ bulkSceneUpdate?: Maybe>,
+ sceneDestroy: Scalars['Boolean'],
+ scenesUpdate?: Maybe>>,
+ sceneMarkerCreate?: Maybe,
+ sceneMarkerUpdate?: Maybe,
+ sceneMarkerDestroy: Scalars['Boolean'],
+ performerCreate?: Maybe,
+ performerUpdate?: Maybe,
+ performerDestroy: Scalars['Boolean'],
+ studioCreate?: Maybe,
+ studioUpdate?: Maybe,
+ studioDestroy: Scalars['Boolean'],
+ tagCreate?: Maybe,
+ tagUpdate?: Maybe,
+ tagDestroy: Scalars['Boolean'],
/** Change general configuration options */
- configureGeneral: ConfigGeneralResult;
- configureInterface: ConfigInterfaceResult;
+ configureGeneral: ConfigGeneralResult,
+ configureInterface: ConfigInterfaceResult,
};
+
export type MutationSceneUpdateArgs = {
- input: SceneUpdateInput;
+ input: SceneUpdateInput
};
+
export type MutationBulkSceneUpdateArgs = {
- input: BulkSceneUpdateInput;
+ input: BulkSceneUpdateInput
};
+
export type MutationSceneDestroyArgs = {
- input: SceneDestroyInput;
+ input: SceneDestroyInput
};
+
export type MutationScenesUpdateArgs = {
- input: Array;
+ input: Array
};
+
export type MutationSceneMarkerCreateArgs = {
- input: SceneMarkerCreateInput;
+ input: SceneMarkerCreateInput
};
+
export type MutationSceneMarkerUpdateArgs = {
- input: SceneMarkerUpdateInput;
+ input: SceneMarkerUpdateInput
};
+
export type MutationSceneMarkerDestroyArgs = {
- id: Scalars["ID"];
+ id: Scalars['ID']
};
+
export type MutationPerformerCreateArgs = {
- input: PerformerCreateInput;
+ input: PerformerCreateInput
};
+
export type MutationPerformerUpdateArgs = {
- input: PerformerUpdateInput;
+ input: PerformerUpdateInput
};
+
export type MutationPerformerDestroyArgs = {
- input: PerformerDestroyInput;
+ input: PerformerDestroyInput
};
+
export type MutationStudioCreateArgs = {
- input: StudioCreateInput;
+ input: StudioCreateInput
};
+
export type MutationStudioUpdateArgs = {
- input: StudioUpdateInput;
+ input: StudioUpdateInput
};
+
export type MutationStudioDestroyArgs = {
- input: StudioDestroyInput;
+ input: StudioDestroyInput
};
+
export type MutationTagCreateArgs = {
- input: TagCreateInput;
+ input: TagCreateInput
};
+
export type MutationTagUpdateArgs = {
- input: TagUpdateInput;
+ input: TagUpdateInput
};
+
export type MutationTagDestroyArgs = {
- input: TagDestroyInput;
+ input: TagDestroyInput
};
+
export type MutationConfigureGeneralArgs = {
- input: ConfigGeneralInput;
+ input: ConfigGeneralInput
};
+
export type MutationConfigureInterfaceArgs = {
- input: ConfigInterfaceInput;
+ input: ConfigInterfaceInput
};
export type Performer = {
- __typename?: "Performer";
- id: Scalars["ID"];
- checksum: Scalars["String"];
- name?: Maybe;
- url?: Maybe;
- twitter?: Maybe;
- instagram?: Maybe;
- birthdate?: Maybe;
- ethnicity?: Maybe;
- country?: Maybe;
- eye_color?: Maybe;
- height?: Maybe;
- measurements?: Maybe;
- fake_tits?: Maybe;
- career_length?: Maybe;
- tattoos?: Maybe;
- piercings?: Maybe;
- aliases?: Maybe;
- favorite: Scalars["Boolean"];
- image_path?: Maybe;
- scene_count?: Maybe;
- scenes: Array;
+ __typename?: 'Performer',
+ id: Scalars['ID'],
+ checksum: Scalars['String'],
+ name?: Maybe,
+ url?: Maybe,
+ twitter?: Maybe,
+ instagram?: Maybe,
+ birthdate?: Maybe,
+ ethnicity?: Maybe,
+ country?: Maybe,
+ eye_color?: Maybe,
+ height?: Maybe,
+ measurements?: Maybe,
+ fake_tits?: Maybe,
+ career_length?: Maybe,
+ tattoos?: Maybe,
+ piercings?: Maybe,
+ aliases?: Maybe,
+ favorite: Scalars['Boolean'],
+ image_path?: Maybe,
+ scene_count?: Maybe,
+ scenes: Array,
};
export type PerformerCreateInput = {
- name?: Maybe;
- url?: Maybe;
- birthdate?: Maybe;
- ethnicity?: Maybe;
- country?: Maybe;
- eye_color?: Maybe;
- height?: Maybe;
- measurements?: Maybe;
- fake_tits?: Maybe;
- career_length?: Maybe;
- tattoos?: Maybe;
- piercings?: Maybe;
- aliases?: Maybe;
- twitter?: Maybe;
- instagram?: Maybe;
- favorite?: Maybe;
+ name?: Maybe,
+ url?: Maybe,
+ birthdate?: Maybe,
+ ethnicity?: Maybe,
+ country?: Maybe,
+ eye_color?: Maybe,
+ height?: Maybe,
+ measurements?: Maybe,
+ fake_tits?: Maybe,
+ career_length?: Maybe,
+ tattoos?: Maybe,
+ piercings?: Maybe,
+ aliases?: Maybe,
+ twitter?: Maybe,
+ instagram?: Maybe,
+ favorite?: Maybe,
/** This should be base64 encoded */
- image?: Maybe;
+ image?: Maybe,
};
export type PerformerDestroyInput = {
- id: Scalars["ID"];
+ id: Scalars['ID'],
};
export type PerformerFilterType = {
/** Filter by favorite */
- filter_favorites?: Maybe;
+ filter_favorites?: Maybe,
/** Filter by birth year */
- birth_year?: Maybe;
+ birth_year?: Maybe,
/** Filter by age */
- age?: Maybe;
+ age?: Maybe,
/** Filter by ethnicity */
- ethnicity?: Maybe;
+ ethnicity?: Maybe,
/** Filter by country */
- country?: Maybe;
+ country?: Maybe,
/** Filter by eye color */
- eye_color?: Maybe;
+ eye_color?: Maybe,
/** Filter by height */
- height?: Maybe;
+ height?: Maybe,
/** Filter by measurements */
- measurements?: Maybe;
+ measurements?: Maybe,
/** Filter by fake tits value */
- fake_tits?: Maybe;
+ fake_tits?: Maybe,
/** Filter by career length */
- career_length?: Maybe;
+ career_length?: Maybe,
/** Filter by tattoos */
- tattoos?: Maybe;
+ tattoos?: Maybe,
/** Filter by piercings */
- piercings?: Maybe;
+ piercings?: Maybe,
/** Filter by aliases */
- aliases?: Maybe;
+ aliases?: Maybe,
};
export type PerformerUpdateInput = {
- id: Scalars["ID"];
- name?: Maybe;
- url?: Maybe;
- birthdate?: Maybe