mirror of
https://github.com/stashapp/stash.git
synced 2025-12-08 01:13:09 +01:00
Overhaul graphql client cache invalidation (#3912)
* Update apollo client * Overhaul graphql client cache invalidation * Fix tagger studio link display update * Add graphql formatting
This commit is contained in:
parent
a1da626c9f
commit
7b77b8986f
64 changed files with 3034 additions and 1939 deletions
|
|
@ -149,7 +149,7 @@ fragment ConfigDefaultSettingsData on ConfigDefaultSettingsResult {
|
||||||
scanGenerateThumbnails
|
scanGenerateThumbnails
|
||||||
scanGenerateClipPreviews
|
scanGenerateClipPreviews
|
||||||
}
|
}
|
||||||
|
|
||||||
identify {
|
identify {
|
||||||
sources {
|
sources {
|
||||||
source {
|
source {
|
||||||
|
|
|
||||||
|
|
@ -3,4 +3,4 @@ fragment SavedFilterData on SavedFilter {
|
||||||
mode
|
mode
|
||||||
name
|
name
|
||||||
filter
|
filter
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,7 @@ fragment SlimGalleryData on Gallery {
|
||||||
files {
|
files {
|
||||||
...ImageFileData
|
...ImageFileData
|
||||||
}
|
}
|
||||||
|
|
||||||
paths {
|
paths {
|
||||||
thumbnail
|
thumbnail
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -26,7 +26,7 @@ fragment ImageData on Image {
|
||||||
studio {
|
studio {
|
||||||
...SlimStudioData
|
...SlimStudioData
|
||||||
}
|
}
|
||||||
|
|
||||||
tags {
|
tags {
|
||||||
...SlimTagData
|
...SlimTagData
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -7,4 +7,4 @@ fragment JobData on Job {
|
||||||
startTime
|
startTime
|
||||||
endTime
|
endTime
|
||||||
addTime
|
addTime
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -10,7 +10,7 @@ fragment MovieData on Movie {
|
||||||
studio {
|
studio {
|
||||||
...SlimStudioData
|
...SlimStudioData
|
||||||
}
|
}
|
||||||
|
|
||||||
synopsis
|
synopsis
|
||||||
url
|
url
|
||||||
front_image_path
|
front_image_path
|
||||||
|
|
|
||||||
|
|
@ -49,7 +49,7 @@ fragment SceneData on Scene {
|
||||||
studio {
|
studio {
|
||||||
...SlimStudioData
|
...SlimStudioData
|
||||||
}
|
}
|
||||||
|
|
||||||
movies {
|
movies {
|
||||||
movie {
|
movie {
|
||||||
...MovieData
|
...MovieData
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,3 @@
|
||||||
mutation DeleteFiles($ids: [ID!]!) {
|
mutation DeleteFiles($ids: [ID!]!) {
|
||||||
deleteFiles(ids: $ids)
|
deleteFiles(ids: $ids)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@ mutation SaveFilter($input: SaveFilterInput!) {
|
||||||
saveFilter(input: $input) {
|
saveFilter(input: $input) {
|
||||||
...SavedFilterData
|
...SavedFilterData
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
mutation DestroySavedFilter($input: DestroyFilterInput!) {
|
mutation DestroySavedFilter($input: DestroyFilterInput!) {
|
||||||
destroySavedFilter(input: $input)
|
destroySavedFilter(input: $input)
|
||||||
|
|
|
||||||
|
|
@ -1,27 +1,29 @@
|
||||||
mutation GalleryChapterCreate(
|
mutation GalleryChapterCreate(
|
||||||
$title: String!,
|
$title: String!
|
||||||
$image_index: Int!,
|
$image_index: Int!
|
||||||
$gallery_id: ID!) {
|
$gallery_id: ID!
|
||||||
galleryChapterCreate(input: {
|
) {
|
||||||
title: $title,
|
galleryChapterCreate(
|
||||||
image_index: $image_index,
|
input: { title: $title, image_index: $image_index, gallery_id: $gallery_id }
|
||||||
gallery_id: $gallery_id,
|
) {
|
||||||
}) {
|
|
||||||
...GalleryChapterData
|
...GalleryChapterData
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
mutation GalleryChapterUpdate(
|
mutation GalleryChapterUpdate(
|
||||||
$id: ID!,
|
$id: ID!
|
||||||
$title: String!,
|
$title: String!
|
||||||
$image_index: Int!,
|
$image_index: Int!
|
||||||
$gallery_id: ID!) {
|
$gallery_id: ID!
|
||||||
galleryChapterUpdate(input: {
|
) {
|
||||||
id: $id,
|
galleryChapterUpdate(
|
||||||
title: $title,
|
input: {
|
||||||
image_index: $image_index,
|
id: $id
|
||||||
gallery_id: $gallery_id,
|
title: $title
|
||||||
}) {
|
image_index: $image_index
|
||||||
|
gallery_id: $gallery_id
|
||||||
|
}
|
||||||
|
) {
|
||||||
...GalleryChapterData
|
...GalleryChapterData
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,41 +1,45 @@
|
||||||
mutation GalleryCreate(
|
mutation GalleryCreate($input: GalleryCreateInput!) {
|
||||||
$input: GalleryCreateInput!) {
|
|
||||||
|
|
||||||
galleryCreate(input: $input) {
|
galleryCreate(input: $input) {
|
||||||
...GalleryData
|
...GalleryData
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
mutation GalleryUpdate(
|
mutation GalleryUpdate($input: GalleryUpdateInput!) {
|
||||||
$input: GalleryUpdateInput!) {
|
|
||||||
|
|
||||||
galleryUpdate(input: $input) {
|
galleryUpdate(input: $input) {
|
||||||
...GalleryData
|
...GalleryData
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
mutation BulkGalleryUpdate(
|
mutation BulkGalleryUpdate($input: BulkGalleryUpdateInput!) {
|
||||||
$input: BulkGalleryUpdateInput!) {
|
|
||||||
|
|
||||||
bulkGalleryUpdate(input: $input) {
|
bulkGalleryUpdate(input: $input) {
|
||||||
...GalleryData
|
...GalleryData
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
mutation GalleriesUpdate($input : [GalleryUpdateInput!]!) {
|
mutation GalleriesUpdate($input: [GalleryUpdateInput!]!) {
|
||||||
galleriesUpdate(input: $input) {
|
galleriesUpdate(input: $input) {
|
||||||
...GalleryData
|
...GalleryData
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
mutation GalleryDestroy($ids: [ID!]!, $delete_file: Boolean, $delete_generated : Boolean) {
|
mutation GalleryDestroy(
|
||||||
galleryDestroy(input: {ids: $ids, delete_file: $delete_file, delete_generated: $delete_generated})
|
$ids: [ID!]!
|
||||||
|
$delete_file: Boolean
|
||||||
|
$delete_generated: Boolean
|
||||||
|
) {
|
||||||
|
galleryDestroy(
|
||||||
|
input: {
|
||||||
|
ids: $ids
|
||||||
|
delete_file: $delete_file
|
||||||
|
delete_generated: $delete_generated
|
||||||
|
}
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
mutation AddGalleryImages($gallery_id: ID!, $image_ids: [ID!]!) {
|
mutation AddGalleryImages($gallery_id: ID!, $image_ids: [ID!]!) {
|
||||||
addGalleryImages(input: {gallery_id: $gallery_id, image_ids: $image_ids})
|
addGalleryImages(input: { gallery_id: $gallery_id, image_ids: $image_ids })
|
||||||
}
|
}
|
||||||
|
|
||||||
mutation RemoveGalleryImages($gallery_id: ID!, $image_ids: [ID!]!) {
|
mutation RemoveGalleryImages($gallery_id: ID!, $image_ids: [ID!]!) {
|
||||||
removeGalleryImages(input: {gallery_id: $gallery_id, image_ids: $image_ids})
|
removeGalleryImages(input: { gallery_id: $gallery_id, image_ids: $image_ids })
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,27 +1,23 @@
|
||||||
mutation ImageUpdate(
|
mutation ImageUpdate($input: ImageUpdateInput!) {
|
||||||
$input: ImageUpdateInput!) {
|
|
||||||
|
|
||||||
imageUpdate(input: $input) {
|
imageUpdate(input: $input) {
|
||||||
...SlimImageData
|
...SlimImageData
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
mutation BulkImageUpdate(
|
mutation BulkImageUpdate($input: BulkImageUpdateInput!) {
|
||||||
$input: BulkImageUpdateInput!) {
|
|
||||||
|
|
||||||
bulkImageUpdate(input: $input) {
|
bulkImageUpdate(input: $input) {
|
||||||
...SlimImageData
|
...SlimImageData
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
mutation ImagesUpdate($input : [ImageUpdateInput!]!) {
|
mutation ImagesUpdate($input: [ImageUpdateInput!]!) {
|
||||||
imagesUpdate(input: $input) {
|
imagesUpdate(input: $input) {
|
||||||
...SlimImageData
|
...SlimImageData
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
mutation ImageIncrementO($id: ID!) {
|
mutation ImageIncrementO($id: ID!) {
|
||||||
imageIncrementO(id: $id)
|
imageIncrementO(id: $id)
|
||||||
}
|
}
|
||||||
|
|
||||||
mutation ImageDecrementO($id: ID!) {
|
mutation ImageDecrementO($id: ID!) {
|
||||||
|
|
@ -32,10 +28,30 @@ mutation ImageResetO($id: ID!) {
|
||||||
imageResetO(id: $id)
|
imageResetO(id: $id)
|
||||||
}
|
}
|
||||||
|
|
||||||
mutation ImageDestroy($id: ID!, $delete_file: Boolean, $delete_generated : Boolean) {
|
mutation ImageDestroy(
|
||||||
imageDestroy(input: {id: $id, delete_file: $delete_file, delete_generated: $delete_generated})
|
$id: ID!
|
||||||
|
$delete_file: Boolean
|
||||||
|
$delete_generated: Boolean
|
||||||
|
) {
|
||||||
|
imageDestroy(
|
||||||
|
input: {
|
||||||
|
id: $id
|
||||||
|
delete_file: $delete_file
|
||||||
|
delete_generated: $delete_generated
|
||||||
|
}
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
mutation ImagesDestroy($ids: [ID!]!, $delete_file: Boolean, $delete_generated : Boolean) {
|
mutation ImagesDestroy(
|
||||||
imagesDestroy(input: {ids: $ids, delete_file: $delete_file, delete_generated: $delete_generated})
|
$ids: [ID!]!
|
||||||
|
$delete_file: Boolean
|
||||||
|
$delete_generated: Boolean
|
||||||
|
) {
|
||||||
|
imagesDestroy(
|
||||||
|
input: {
|
||||||
|
ids: $ids
|
||||||
|
delete_file: $delete_file
|
||||||
|
delete_generated: $delete_generated
|
||||||
|
}
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -3,5 +3,5 @@ mutation StopJob($job_id: ID!) {
|
||||||
}
|
}
|
||||||
|
|
||||||
mutation StopAllJobs {
|
mutation StopAllJobs {
|
||||||
stopAllJobs
|
stopAllJobs
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -4,4 +4,4 @@ mutation MigrateSceneScreenshots($input: MigrateSceneScreenshotsInput!) {
|
||||||
|
|
||||||
mutation MigrateBlobs($input: MigrateBlobsInput!) {
|
mutation MigrateBlobs($input: MigrateBlobsInput!) {
|
||||||
migrateBlobs(input: $input)
|
migrateBlobs(input: $input)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,22 +1,16 @@
|
||||||
mutation PerformerCreate(
|
mutation PerformerCreate($input: PerformerCreateInput!) {
|
||||||
$input: PerformerCreateInput!) {
|
|
||||||
|
|
||||||
performerCreate(input: $input) {
|
performerCreate(input: $input) {
|
||||||
...PerformerData
|
...PerformerData
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
mutation PerformerUpdate(
|
mutation PerformerUpdate($input: PerformerUpdateInput!) {
|
||||||
$input: PerformerUpdateInput!) {
|
|
||||||
|
|
||||||
performerUpdate(input: $input) {
|
performerUpdate(input: $input) {
|
||||||
...PerformerData
|
...PerformerData
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
mutation BulkPerformerUpdate(
|
mutation BulkPerformerUpdate($input: BulkPerformerUpdateInput!) {
|
||||||
$input: BulkPerformerUpdateInput!) {
|
|
||||||
|
|
||||||
bulkPerformerUpdate(input: $input) {
|
bulkPerformerUpdate(input: $input) {
|
||||||
...PerformerData
|
...PerformerData
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,10 @@ mutation ReloadPlugins {
|
||||||
reloadPlugins
|
reloadPlugins
|
||||||
}
|
}
|
||||||
|
|
||||||
mutation RunPluginTask($plugin_id: ID!, $task_name: String!, $args: [PluginArgInput!]) {
|
mutation RunPluginTask(
|
||||||
|
$plugin_id: ID!
|
||||||
|
$task_name: String!
|
||||||
|
$args: [PluginArgInput!]
|
||||||
|
) {
|
||||||
runPluginTask(plugin_id: $plugin_id, task_name: $task_name, args: $args)
|
runPluginTask(plugin_id: $plugin_id, task_name: $task_name, args: $args)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,41 +1,45 @@
|
||||||
mutation SceneMarkerCreate(
|
mutation SceneMarkerCreate(
|
||||||
$title: String!,
|
$title: String!
|
||||||
$seconds: Float!,
|
$seconds: Float!
|
||||||
$scene_id: ID!,
|
$scene_id: ID!
|
||||||
$primary_tag_id: ID!,
|
$primary_tag_id: ID!
|
||||||
$tag_ids: [ID!] = []) {
|
$tag_ids: [ID!] = []
|
||||||
|
) {
|
||||||
sceneMarkerCreate(input: {
|
sceneMarkerCreate(
|
||||||
title: $title,
|
input: {
|
||||||
seconds: $seconds,
|
title: $title
|
||||||
scene_id: $scene_id,
|
seconds: $seconds
|
||||||
primary_tag_id: $primary_tag_id,
|
scene_id: $scene_id
|
||||||
tag_ids: $tag_ids
|
primary_tag_id: $primary_tag_id
|
||||||
}) {
|
tag_ids: $tag_ids
|
||||||
|
}
|
||||||
|
) {
|
||||||
...SceneMarkerData
|
...SceneMarkerData
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
mutation SceneMarkerUpdate(
|
mutation SceneMarkerUpdate(
|
||||||
$id: ID!,
|
$id: ID!
|
||||||
$title: String!,
|
$title: String!
|
||||||
$seconds: Float!,
|
$seconds: Float!
|
||||||
$scene_id: ID!,
|
$scene_id: ID!
|
||||||
$primary_tag_id: ID!,
|
$primary_tag_id: ID!
|
||||||
$tag_ids: [ID!] = []) {
|
$tag_ids: [ID!] = []
|
||||||
|
) {
|
||||||
sceneMarkerUpdate(input: {
|
sceneMarkerUpdate(
|
||||||
id: $id,
|
input: {
|
||||||
title: $title,
|
id: $id
|
||||||
seconds: $seconds,
|
title: $title
|
||||||
scene_id: $scene_id,
|
seconds: $seconds
|
||||||
primary_tag_id: $primary_tag_id,
|
scene_id: $scene_id
|
||||||
tag_ids: $tag_ids
|
primary_tag_id: $primary_tag_id
|
||||||
}) {
|
tag_ids: $tag_ids
|
||||||
|
}
|
||||||
|
) {
|
||||||
...SceneMarkerData
|
...SceneMarkerData
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
mutation SceneMarkerDestroy($id: ID!) {
|
mutation SceneMarkerDestroy($id: ID!) {
|
||||||
sceneMarkerDestroy(id: $id)
|
sceneMarkerDestroy(id: $id)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,43 +1,45 @@
|
||||||
mutation SceneCreate(
|
mutation SceneCreate($input: SceneCreateInput!) {
|
||||||
$input: SceneCreateInput!) {
|
|
||||||
|
|
||||||
sceneCreate(input: $input) {
|
sceneCreate(input: $input) {
|
||||||
...SceneData
|
...SceneData
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
mutation SceneUpdate(
|
mutation SceneUpdate($input: SceneUpdateInput!) {
|
||||||
$input: SceneUpdateInput!) {
|
|
||||||
|
|
||||||
sceneUpdate(input: $input) {
|
sceneUpdate(input: $input) {
|
||||||
...SceneData
|
...SceneData
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
mutation BulkSceneUpdate(
|
mutation BulkSceneUpdate($input: BulkSceneUpdateInput!) {
|
||||||
$input: BulkSceneUpdateInput!) {
|
|
||||||
|
|
||||||
bulkSceneUpdate(input: $input) {
|
bulkSceneUpdate(input: $input) {
|
||||||
...SceneData
|
...SceneData
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
mutation ScenesUpdate($input : [SceneUpdateInput!]!) {
|
mutation ScenesUpdate($input: [SceneUpdateInput!]!) {
|
||||||
scenesUpdate(input: $input) {
|
scenesUpdate(input: $input) {
|
||||||
...SceneData
|
...SceneData
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
mutation SceneSaveActivity($id: ID!, $resume_time: Float, $playDuration: Float) {
|
mutation SceneSaveActivity(
|
||||||
sceneSaveActivity(id: $id, resume_time: $resume_time, playDuration: $playDuration)
|
$id: ID!
|
||||||
|
$resume_time: Float
|
||||||
|
$playDuration: Float
|
||||||
|
) {
|
||||||
|
sceneSaveActivity(
|
||||||
|
id: $id
|
||||||
|
resume_time: $resume_time
|
||||||
|
playDuration: $playDuration
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
mutation SceneIncrementPlayCount($id: ID!) {
|
mutation SceneIncrementPlayCount($id: ID!) {
|
||||||
sceneIncrementPlayCount(id: $id)
|
sceneIncrementPlayCount(id: $id)
|
||||||
}
|
}
|
||||||
|
|
||||||
mutation SceneIncrementO($id: ID!) {
|
mutation SceneIncrementO($id: ID!) {
|
||||||
sceneIncrementO(id: $id)
|
sceneIncrementO(id: $id)
|
||||||
}
|
}
|
||||||
|
|
||||||
mutation SceneDecrementO($id: ID!) {
|
mutation SceneDecrementO($id: ID!) {
|
||||||
|
|
@ -48,12 +50,32 @@ mutation SceneResetO($id: ID!) {
|
||||||
sceneResetO(id: $id)
|
sceneResetO(id: $id)
|
||||||
}
|
}
|
||||||
|
|
||||||
mutation SceneDestroy($id: ID!, $delete_file: Boolean, $delete_generated : Boolean) {
|
mutation SceneDestroy(
|
||||||
sceneDestroy(input: {id: $id, delete_file: $delete_file, delete_generated: $delete_generated})
|
$id: ID!
|
||||||
|
$delete_file: Boolean
|
||||||
|
$delete_generated: Boolean
|
||||||
|
) {
|
||||||
|
sceneDestroy(
|
||||||
|
input: {
|
||||||
|
id: $id
|
||||||
|
delete_file: $delete_file
|
||||||
|
delete_generated: $delete_generated
|
||||||
|
}
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
mutation ScenesDestroy($ids: [ID!]!, $delete_file: Boolean, $delete_generated : Boolean) {
|
mutation ScenesDestroy(
|
||||||
scenesDestroy(input: {ids: $ids, delete_file: $delete_file, delete_generated: $delete_generated})
|
$ids: [ID!]!
|
||||||
|
$delete_file: Boolean
|
||||||
|
$delete_generated: Boolean
|
||||||
|
) {
|
||||||
|
scenesDestroy(
|
||||||
|
input: {
|
||||||
|
ids: $ids
|
||||||
|
delete_file: $delete_file
|
||||||
|
delete_generated: $delete_generated
|
||||||
|
}
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
mutation SceneGenerateScreenshot($id: ID!, $at: Float) {
|
mutation SceneGenerateScreenshot($id: ID!, $at: Float) {
|
||||||
|
|
@ -68,4 +90,4 @@ mutation SceneMerge($input: SceneMergeInput!) {
|
||||||
sceneMerge(input: $input) {
|
sceneMerge(input: $input) {
|
||||||
id
|
id
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,6 @@
|
||||||
mutation SubmitStashBoxFingerprints($input: StashBoxFingerprintSubmissionInput!) {
|
mutation SubmitStashBoxFingerprints(
|
||||||
|
$input: StashBoxFingerprintSubmissionInput!
|
||||||
|
) {
|
||||||
submitStashBoxFingerprints(input: $input)
|
submitStashBoxFingerprints(input: $input)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -8,4 +8,4 @@ query DLNAStatus {
|
||||||
until
|
until
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,7 @@
|
||||||
query FindGalleries($filter: FindFilterType, $gallery_filter: GalleryFilterType) {
|
query FindGalleries(
|
||||||
|
$filter: FindFilterType
|
||||||
|
$gallery_filter: GalleryFilterType
|
||||||
|
) {
|
||||||
findGalleries(gallery_filter: $gallery_filter, filter: $filter) {
|
findGalleries(gallery_filter: $gallery_filter, filter: $filter) {
|
||||||
count
|
count
|
||||||
galleries {
|
galleries {
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,13 @@
|
||||||
query FindImages($filter: FindFilterType, $image_filter: ImageFilterType, $image_ids: [Int!]) {
|
query FindImages(
|
||||||
findImages(filter: $filter, image_filter: $image_filter, image_ids: $image_ids) {
|
$filter: FindFilterType
|
||||||
|
$image_filter: ImageFilterType
|
||||||
|
$image_ids: [Int!]
|
||||||
|
) {
|
||||||
|
findImages(
|
||||||
|
filter: $filter
|
||||||
|
image_filter: $image_filter
|
||||||
|
image_ids: $image_ids
|
||||||
|
) {
|
||||||
count
|
count
|
||||||
megapixels
|
megapixels
|
||||||
filesize
|
filesize
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ query JobQueue {
|
||||||
}
|
}
|
||||||
|
|
||||||
query FindJob($input: FindJobInput!) {
|
query FindJob($input: FindJobInput!) {
|
||||||
findJob(input: $input) {
|
findJob(input: $input) {
|
||||||
...JobData
|
...JobData
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -8,4 +8,4 @@ query MarkerWall($q: String) {
|
||||||
markerWall(q: $q) {
|
markerWall(q: $q) {
|
||||||
...SceneMarkerData
|
...SceneMarkerData
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -11,4 +11,4 @@ query FindMovie($id: ID!) {
|
||||||
findMovie(id: $id) {
|
findMovie(id: $id) {
|
||||||
...MovieData
|
...MovieData
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,7 @@
|
||||||
query FindPerformers($filter: FindFilterType, $performer_filter: PerformerFilterType) {
|
query FindPerformers(
|
||||||
|
$filter: FindFilterType
|
||||||
|
$performer_filter: PerformerFilterType
|
||||||
|
) {
|
||||||
findPerformers(filter: $filter, performer_filter: $performer_filter) {
|
findPerformers(filter: $filter, performer_filter: $performer_filter) {
|
||||||
count
|
count
|
||||||
performers {
|
performers {
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,11 @@
|
||||||
query FindSceneMarkers($filter: FindFilterType, $scene_marker_filter: SceneMarkerFilterType) {
|
query FindSceneMarkers(
|
||||||
|
$filter: FindFilterType
|
||||||
|
$scene_marker_filter: SceneMarkerFilterType
|
||||||
|
) {
|
||||||
findSceneMarkers(filter: $filter, scene_marker_filter: $scene_marker_filter) {
|
findSceneMarkers(filter: $filter, scene_marker_filter: $scene_marker_filter) {
|
||||||
count
|
count
|
||||||
scene_markers {
|
scene_markers {
|
||||||
...SceneMarkerData
|
...SceneMarkerData
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,13 @@
|
||||||
query FindScenes($filter: FindFilterType, $scene_filter: SceneFilterType, $scene_ids: [Int!]) {
|
query FindScenes(
|
||||||
findScenes(filter: $filter, scene_filter: $scene_filter, scene_ids: $scene_ids) {
|
$filter: FindFilterType
|
||||||
|
$scene_filter: SceneFilterType
|
||||||
|
$scene_ids: [Int!]
|
||||||
|
) {
|
||||||
|
findScenes(
|
||||||
|
filter: $filter
|
||||||
|
scene_filter: $scene_filter
|
||||||
|
scene_ids: $scene_ids
|
||||||
|
) {
|
||||||
count
|
count
|
||||||
filesize
|
filesize
|
||||||
duration
|
duration
|
||||||
|
|
@ -44,7 +52,10 @@ query FindSceneMarkerTags($id: ID!) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
query ParseSceneFilenames($filter: FindFilterType!, $config: SceneParserInput!) {
|
query ParseSceneFilenames(
|
||||||
|
$filter: FindFilterType!
|
||||||
|
$config: SceneParserInput!
|
||||||
|
) {
|
||||||
parseSceneFilenames(filter: $filter, config: $config) {
|
parseSceneFilenames(filter: $filter, config: $config) {
|
||||||
count
|
count
|
||||||
results {
|
results {
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,3 @@
|
||||||
query ScrapeFreeonesPerformers($q: String!) {
|
query ScrapeFreeonesPerformers($q: String!) {
|
||||||
scrapeFreeonesPerformerList(query: $q)
|
scrapeFreeonesPerformerList(query: $q)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -42,13 +42,19 @@ query ListMovieScrapers {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
query ScrapeSinglePerformer($source: ScraperSourceInput!, $input: ScrapeSinglePerformerInput!) {
|
query ScrapeSinglePerformer(
|
||||||
|
$source: ScraperSourceInput!
|
||||||
|
$input: ScrapeSinglePerformerInput!
|
||||||
|
) {
|
||||||
scrapeSinglePerformer(source: $source, input: $input) {
|
scrapeSinglePerformer(source: $source, input: $input) {
|
||||||
...ScrapedPerformerData
|
...ScrapedPerformerData
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
query ScrapeMultiPerformers($source: ScraperSourceInput!, $input: ScrapeMultiPerformersInput!) {
|
query ScrapeMultiPerformers(
|
||||||
|
$source: ScraperSourceInput!
|
||||||
|
$input: ScrapeMultiPerformersInput!
|
||||||
|
) {
|
||||||
scrapeMultiPerformers(source: $source, input: $input) {
|
scrapeMultiPerformers(source: $source, input: $input) {
|
||||||
...ScrapedPerformerData
|
...ScrapedPerformerData
|
||||||
}
|
}
|
||||||
|
|
@ -60,13 +66,19 @@ query ScrapePerformerURL($url: String!) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
query ScrapeSingleScene($source: ScraperSourceInput!, $input: ScrapeSingleSceneInput!) {
|
query ScrapeSingleScene(
|
||||||
|
$source: ScraperSourceInput!
|
||||||
|
$input: ScrapeSingleSceneInput!
|
||||||
|
) {
|
||||||
scrapeSingleScene(source: $source, input: $input) {
|
scrapeSingleScene(source: $source, input: $input) {
|
||||||
...ScrapedSceneData
|
...ScrapedSceneData
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
query ScrapeMultiScenes($source: ScraperSourceInput!, $input: ScrapeMultiScenesInput!) {
|
query ScrapeMultiScenes(
|
||||||
|
$source: ScraperSourceInput!
|
||||||
|
$input: ScrapeMultiScenesInput!
|
||||||
|
) {
|
||||||
scrapeMultiScenes(source: $source, input: $input) {
|
scrapeMultiScenes(source: $source, input: $input) {
|
||||||
...ScrapedSceneData
|
...ScrapedSceneData
|
||||||
}
|
}
|
||||||
|
|
@ -78,7 +90,10 @@ query ScrapeSceneURL($url: String!) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
query ScrapeSingleGallery($source: ScraperSourceInput!, $input: ScrapeSingleGalleryInput!) {
|
query ScrapeSingleGallery(
|
||||||
|
$source: ScraperSourceInput!
|
||||||
|
$input: ScrapeSingleGalleryInput!
|
||||||
|
) {
|
||||||
scrapeSingleGallery(source: $source, input: $input) {
|
scrapeSingleGallery(source: $source, input: $input) {
|
||||||
...ScrapedGalleryData
|
...ScrapedGalleryData
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -6,9 +6,9 @@ query Configuration {
|
||||||
|
|
||||||
query Directory($path: String) {
|
query Directory($path: String) {
|
||||||
directory(path: $path) {
|
directory(path: $path) {
|
||||||
path
|
path
|
||||||
parent
|
parent
|
||||||
directories
|
directories
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
query FindStudios($filter: FindFilterType, $studio_filter: StudioFilterType ) {
|
query FindStudios($filter: FindFilterType, $studio_filter: StudioFilterType) {
|
||||||
findStudios(filter: $filter, studio_filter: $studio_filter) {
|
findStudios(filter: $filter, studio_filter: $studio_filter) {
|
||||||
count
|
count
|
||||||
studios {
|
studios {
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
query FindTags($filter: FindFilterType, $tag_filter: TagFilterType ) {
|
query FindTags($filter: FindFilterType, $tag_filter: TagFilterType) {
|
||||||
findTags(filter: $filter, tag_filter: $tag_filter) {
|
findTags(filter: $filter, tag_filter: $tag_filter) {
|
||||||
count
|
count
|
||||||
tags {
|
tags {
|
||||||
|
|
@ -11,4 +11,4 @@ query FindTag($id: ID!) {
|
||||||
findTag(id: $id) {
|
findTag(id: $id) {
|
||||||
...TagData
|
...TagData
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -19,4 +19,4 @@ subscription LoggingSubscribe {
|
||||||
|
|
||||||
subscription ScanCompleteSubscribe {
|
subscription ScanCompleteSubscribe {
|
||||||
scanCompleteSubscribe
|
scanCompleteSubscribe
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,16 +1,20 @@
|
||||||
"""The query root for this schema"""
|
"The query root for this schema"
|
||||||
type Query {
|
type Query {
|
||||||
# Filters
|
# Filters
|
||||||
findSavedFilter(id: ID!): SavedFilter
|
findSavedFilter(id: ID!): SavedFilter
|
||||||
findSavedFilters(mode: FilterMode): [SavedFilter!]!
|
findSavedFilters(mode: FilterMode): [SavedFilter!]!
|
||||||
findDefaultFilter(mode: FilterMode!): SavedFilter
|
findDefaultFilter(mode: FilterMode!): SavedFilter
|
||||||
|
|
||||||
"""Find a scene by ID or Checksum"""
|
"Find a scene by ID or Checksum"
|
||||||
findScene(id: ID, checksum: String): Scene
|
findScene(id: ID, checksum: String): Scene
|
||||||
findSceneByHash(input: SceneHashInput!): Scene
|
findSceneByHash(input: SceneHashInput!): Scene
|
||||||
|
|
||||||
"""A function which queries Scene objects"""
|
"A function which queries Scene objects"
|
||||||
findScenes(scene_filter: SceneFilterType, scene_ids: [Int!], filter: FindFilterType): FindScenesResultType!
|
findScenes(
|
||||||
|
scene_filter: SceneFilterType
|
||||||
|
scene_ids: [Int!]
|
||||||
|
filter: FindFilterType
|
||||||
|
): FindScenesResultType!
|
||||||
|
|
||||||
findScenesByPathRegex(filter: FindFilterType): FindScenesResultType!
|
findScenesByPathRegex(filter: FindFilterType): FindScenesResultType!
|
||||||
|
|
||||||
|
|
@ -19,123 +23,180 @@ type Query {
|
||||||
and the difference between their duration is smaller than durationDiff
|
and the difference between their duration is smaller than durationDiff
|
||||||
"""
|
"""
|
||||||
findDuplicateScenes(
|
findDuplicateScenes(
|
||||||
distance: Int,
|
distance: Int
|
||||||
"""Max difference in seconds between files in order to be considered for similarity matching.
|
"""
|
||||||
Fractional seconds are ok: 0.5 will mean only files that have durations within 0.5 seconds between them will be matched based on PHash distance."""
|
Max difference in seconds between files in order to be considered for similarity matching.
|
||||||
|
Fractional seconds are ok: 0.5 will mean only files that have durations within 0.5 seconds between them will be matched based on PHash distance.
|
||||||
|
"""
|
||||||
duration_diff: Float
|
duration_diff: Float
|
||||||
): [[Scene!]!]!
|
): [[Scene!]!]!
|
||||||
|
|
||||||
"""Return valid stream paths"""
|
"Return valid stream paths"
|
||||||
sceneStreams(id: ID): [SceneStreamEndpoint!]!
|
sceneStreams(id: ID): [SceneStreamEndpoint!]!
|
||||||
|
|
||||||
parseSceneFilenames(filter: FindFilterType, config: SceneParserInput!): SceneParserResultType!
|
parseSceneFilenames(
|
||||||
|
filter: FindFilterType
|
||||||
|
config: SceneParserInput!
|
||||||
|
): SceneParserResultType!
|
||||||
|
|
||||||
"""A function which queries SceneMarker objects"""
|
"A function which queries SceneMarker objects"
|
||||||
findSceneMarkers(scene_marker_filter: SceneMarkerFilterType filter: FindFilterType): FindSceneMarkersResultType!
|
findSceneMarkers(
|
||||||
|
scene_marker_filter: SceneMarkerFilterType
|
||||||
|
filter: FindFilterType
|
||||||
|
): FindSceneMarkersResultType!
|
||||||
|
|
||||||
findImage(id: ID, checksum: String): Image
|
findImage(id: ID, checksum: String): Image
|
||||||
|
|
||||||
"""A function which queries Scene objects"""
|
"A function which queries Scene objects"
|
||||||
findImages(image_filter: ImageFilterType, image_ids: [Int!], filter: FindFilterType): FindImagesResultType!
|
findImages(
|
||||||
|
image_filter: ImageFilterType
|
||||||
|
image_ids: [Int!]
|
||||||
|
filter: FindFilterType
|
||||||
|
): FindImagesResultType!
|
||||||
|
|
||||||
"""Find a performer by ID"""
|
"Find a performer by ID"
|
||||||
findPerformer(id: ID!): Performer
|
findPerformer(id: ID!): Performer
|
||||||
"""A function which queries Performer objects"""
|
"A function which queries Performer objects"
|
||||||
findPerformers(performer_filter: PerformerFilterType, filter: FindFilterType): FindPerformersResultType!
|
findPerformers(
|
||||||
|
performer_filter: PerformerFilterType
|
||||||
|
filter: FindFilterType
|
||||||
|
): FindPerformersResultType!
|
||||||
|
|
||||||
"""Find a studio by ID"""
|
"Find a studio by ID"
|
||||||
findStudio(id: ID!): Studio
|
findStudio(id: ID!): Studio
|
||||||
"""A function which queries Studio objects"""
|
"A function which queries Studio objects"
|
||||||
findStudios(studio_filter: StudioFilterType, filter: FindFilterType): FindStudiosResultType!
|
findStudios(
|
||||||
|
studio_filter: StudioFilterType
|
||||||
|
filter: FindFilterType
|
||||||
|
): FindStudiosResultType!
|
||||||
|
|
||||||
"""Find a movie by ID"""
|
"Find a movie by ID"
|
||||||
findMovie(id: ID!): Movie
|
findMovie(id: ID!): Movie
|
||||||
"""A function which queries Movie objects"""
|
"A function which queries Movie objects"
|
||||||
findMovies(movie_filter: MovieFilterType, filter: FindFilterType): FindMoviesResultType!
|
findMovies(
|
||||||
|
movie_filter: MovieFilterType
|
||||||
|
filter: FindFilterType
|
||||||
|
): FindMoviesResultType!
|
||||||
|
|
||||||
findGallery(id: ID!): Gallery
|
findGallery(id: ID!): Gallery
|
||||||
findGalleries(gallery_filter: GalleryFilterType, filter: FindFilterType): FindGalleriesResultType!
|
findGalleries(
|
||||||
|
gallery_filter: GalleryFilterType
|
||||||
|
filter: FindFilterType
|
||||||
|
): FindGalleriesResultType!
|
||||||
|
|
||||||
findTag(id: ID!): Tag
|
findTag(id: ID!): Tag
|
||||||
findTags(tag_filter: TagFilterType, filter: FindFilterType): FindTagsResultType!
|
findTags(
|
||||||
|
tag_filter: TagFilterType
|
||||||
|
filter: FindFilterType
|
||||||
|
): FindTagsResultType!
|
||||||
|
|
||||||
"""Retrieve random scene markers for the wall"""
|
"Retrieve random scene markers for the wall"
|
||||||
markerWall(q: String): [SceneMarker!]!
|
markerWall(q: String): [SceneMarker!]!
|
||||||
"""Retrieve random scenes for the wall"""
|
"Retrieve random scenes for the wall"
|
||||||
sceneWall(q: String): [Scene!]!
|
sceneWall(q: String): [Scene!]!
|
||||||
|
|
||||||
"""Get marker strings"""
|
"Get marker strings"
|
||||||
markerStrings(q: String, sort: String): [MarkerStringsResultType]!
|
markerStrings(q: String, sort: String): [MarkerStringsResultType]!
|
||||||
"""Get stats"""
|
"Get stats"
|
||||||
stats: StatsResultType!
|
stats: StatsResultType!
|
||||||
"""Organize scene markers by tag for a given scene ID"""
|
"Organize scene markers by tag for a given scene ID"
|
||||||
sceneMarkerTags(scene_id: ID!): [SceneMarkerTag!]!
|
sceneMarkerTags(scene_id: ID!): [SceneMarkerTag!]!
|
||||||
|
|
||||||
logs: [LogEntry!]!
|
logs: [LogEntry!]!
|
||||||
|
|
||||||
# Scrapers
|
# Scrapers
|
||||||
|
|
||||||
"""List available scrapers"""
|
"List available scrapers"
|
||||||
listScrapers(types: [ScrapeContentType!]!): [Scraper!]!
|
listScrapers(types: [ScrapeContentType!]!): [Scraper!]!
|
||||||
listPerformerScrapers: [Scraper!]! @deprecated(reason: "Use listScrapers(types: [PERFORMER])")
|
listPerformerScrapers: [Scraper!]!
|
||||||
listSceneScrapers: [Scraper!]! @deprecated(reason: "Use listScrapers(types: [SCENE])")
|
@deprecated(reason: "Use listScrapers(types: [PERFORMER])")
|
||||||
listGalleryScrapers: [Scraper!]! @deprecated(reason: "Use listScrapers(types: [GALLERY])")
|
listSceneScrapers: [Scraper!]!
|
||||||
listMovieScrapers: [Scraper!]! @deprecated(reason: "Use listScrapers(types: [MOVIE])")
|
@deprecated(reason: "Use listScrapers(types: [SCENE])")
|
||||||
|
listGalleryScrapers: [Scraper!]!
|
||||||
|
@deprecated(reason: "Use listScrapers(types: [GALLERY])")
|
||||||
|
listMovieScrapers: [Scraper!]!
|
||||||
|
@deprecated(reason: "Use listScrapers(types: [MOVIE])")
|
||||||
|
|
||||||
|
"Scrape for a single scene"
|
||||||
|
scrapeSingleScene(
|
||||||
|
source: ScraperSourceInput!
|
||||||
|
input: ScrapeSingleSceneInput!
|
||||||
|
): [ScrapedScene!]!
|
||||||
|
"Scrape for multiple scenes"
|
||||||
|
scrapeMultiScenes(
|
||||||
|
source: ScraperSourceInput!
|
||||||
|
input: ScrapeMultiScenesInput!
|
||||||
|
): [[ScrapedScene!]!]!
|
||||||
|
|
||||||
"""Scrape for a single scene"""
|
"Scrape for a single performer"
|
||||||
scrapeSingleScene(source: ScraperSourceInput!, input: ScrapeSingleSceneInput!): [ScrapedScene!]!
|
scrapeSinglePerformer(
|
||||||
"""Scrape for multiple scenes"""
|
source: ScraperSourceInput!
|
||||||
scrapeMultiScenes(source: ScraperSourceInput!, input: ScrapeMultiScenesInput!): [[ScrapedScene!]!]!
|
input: ScrapeSinglePerformerInput!
|
||||||
|
): [ScrapedPerformer!]!
|
||||||
|
"Scrape for multiple performers"
|
||||||
|
scrapeMultiPerformers(
|
||||||
|
source: ScraperSourceInput!
|
||||||
|
input: ScrapeMultiPerformersInput!
|
||||||
|
): [[ScrapedPerformer!]!]!
|
||||||
|
|
||||||
"""Scrape for a single performer"""
|
"Scrape for a single gallery"
|
||||||
scrapeSinglePerformer(source: ScraperSourceInput!, input: ScrapeSinglePerformerInput!): [ScrapedPerformer!]!
|
scrapeSingleGallery(
|
||||||
"""Scrape for multiple performers"""
|
source: ScraperSourceInput!
|
||||||
scrapeMultiPerformers(source: ScraperSourceInput!, input: ScrapeMultiPerformersInput!): [[ScrapedPerformer!]!]!
|
input: ScrapeSingleGalleryInput!
|
||||||
|
): [ScrapedGallery!]!
|
||||||
|
|
||||||
"""Scrape for a single gallery"""
|
"Scrape for a single movie"
|
||||||
scrapeSingleGallery(source: ScraperSourceInput!, input: ScrapeSingleGalleryInput!): [ScrapedGallery!]!
|
scrapeSingleMovie(
|
||||||
|
source: ScraperSourceInput!
|
||||||
"""Scrape for a single movie"""
|
input: ScrapeSingleMovieInput!
|
||||||
scrapeSingleMovie(source: ScraperSourceInput!, input: ScrapeSingleMovieInput!): [ScrapedMovie!]!
|
): [ScrapedMovie!]!
|
||||||
|
|
||||||
"Scrapes content based on a URL"
|
"Scrapes content based on a URL"
|
||||||
scrapeURL(url: String!, ty: ScrapeContentType!): ScrapedContent
|
scrapeURL(url: String!, ty: ScrapeContentType!): ScrapedContent
|
||||||
|
|
||||||
"""Scrapes a complete performer record based on a URL"""
|
"Scrapes a complete performer record based on a URL"
|
||||||
scrapePerformerURL(url: String!): ScrapedPerformer
|
scrapePerformerURL(url: String!): ScrapedPerformer
|
||||||
"""Scrapes a complete scene record based on a URL"""
|
"Scrapes a complete scene record based on a URL"
|
||||||
scrapeSceneURL(url: String!): ScrapedScene
|
scrapeSceneURL(url: String!): ScrapedScene
|
||||||
"""Scrapes a complete gallery record based on a URL"""
|
"Scrapes a complete gallery record based on a URL"
|
||||||
scrapeGalleryURL(url: String!): ScrapedGallery
|
scrapeGalleryURL(url: String!): ScrapedGallery
|
||||||
"""Scrapes a complete movie record based on a URL"""
|
"Scrapes a complete movie record based on a URL"
|
||||||
scrapeMovieURL(url: String!): ScrapedMovie
|
scrapeMovieURL(url: String!): ScrapedMovie
|
||||||
|
|
||||||
"""Scrape a list of performers based on name"""
|
"Scrape a list of performers based on name"
|
||||||
scrapePerformerList(scraper_id: ID!, query: String!): [ScrapedPerformer!]! @deprecated(reason: "use scrapeSinglePerformer")
|
scrapePerformerList(scraper_id: ID!, query: String!): [ScrapedPerformer!]!
|
||||||
"""Scrapes a complete performer record based on a scrapePerformerList result"""
|
@deprecated(reason: "use scrapeSinglePerformer")
|
||||||
scrapePerformer(scraper_id: ID!, scraped_performer: ScrapedPerformerInput!): ScrapedPerformer @deprecated(reason: "use scrapeSinglePerformer")
|
"Scrapes a complete performer record based on a scrapePerformerList result"
|
||||||
"""Scrapes a complete scene record based on an existing scene"""
|
scrapePerformer(
|
||||||
scrapeScene(scraper_id: ID!, scene: SceneUpdateInput!): ScrapedScene @deprecated(reason: "use scrapeSingleScene")
|
scraper_id: ID!
|
||||||
"""Scrapes a complete gallery record based on an existing gallery"""
|
scraped_performer: ScrapedPerformerInput!
|
||||||
scrapeGallery(scraper_id: ID!, gallery: GalleryUpdateInput!): ScrapedGallery @deprecated(reason: "use scrapeSingleGallery")
|
): ScrapedPerformer @deprecated(reason: "use scrapeSinglePerformer")
|
||||||
|
"Scrapes a complete scene record based on an existing scene"
|
||||||
|
scrapeScene(scraper_id: ID!, scene: SceneUpdateInput!): ScrapedScene
|
||||||
|
@deprecated(reason: "use scrapeSingleScene")
|
||||||
|
"Scrapes a complete gallery record based on an existing gallery"
|
||||||
|
scrapeGallery(scraper_id: ID!, gallery: GalleryUpdateInput!): ScrapedGallery
|
||||||
|
@deprecated(reason: "use scrapeSingleGallery")
|
||||||
|
|
||||||
"""Scrape a list of performers from a query"""
|
"Scrape a list of performers from a query"
|
||||||
scrapeFreeonesPerformerList(query: String!): [String!]! @deprecated(reason: "use scrapeSinglePerformer with scraper_id = builtin_freeones")
|
scrapeFreeonesPerformerList(query: String!): [String!]!
|
||||||
|
@deprecated(
|
||||||
|
reason: "use scrapeSinglePerformer with scraper_id = builtin_freeones"
|
||||||
|
)
|
||||||
|
|
||||||
# Plugins
|
# Plugins
|
||||||
"""List loaded plugins"""
|
"List loaded plugins"
|
||||||
plugins: [Plugin!]
|
plugins: [Plugin!]
|
||||||
"""List available plugin operations"""
|
"List available plugin operations"
|
||||||
pluginTasks: [PluginTask!]
|
pluginTasks: [PluginTask!]
|
||||||
|
|
||||||
# Config
|
# Config
|
||||||
"""Returns the current, complete configuration"""
|
"Returns the current, complete configuration"
|
||||||
configuration: ConfigResult!
|
configuration: ConfigResult!
|
||||||
"""Returns an array of paths for the given path"""
|
"Returns an array of paths for the given path"
|
||||||
directory(
|
directory(
|
||||||
"The directory path to list"
|
"The directory path to list"
|
||||||
path: String,
|
path: String
|
||||||
"Desired collation locale. Determines the order of the directory result. eg. 'en-US', 'pt-BR', ..."
|
"Desired collation locale. Determines the order of the directory result. eg. 'en-US', 'pt-BR', ..."
|
||||||
locale: String = "en"
|
locale: String = "en"
|
||||||
): Directory!
|
): Directory!
|
||||||
|
|
@ -182,20 +243,20 @@ type Mutation {
|
||||||
scenesDestroy(input: ScenesDestroyInput!): Boolean!
|
scenesDestroy(input: ScenesDestroyInput!): Boolean!
|
||||||
scenesUpdate(input: [SceneUpdateInput!]!): [Scene]
|
scenesUpdate(input: [SceneUpdateInput!]!): [Scene]
|
||||||
|
|
||||||
"""Increments the o-counter for a scene. Returns the new value"""
|
"Increments the o-counter for a scene. Returns the new value"
|
||||||
sceneIncrementO(id: ID!): Int!
|
sceneIncrementO(id: ID!): Int!
|
||||||
"""Decrements the o-counter for a scene. Returns the new value"""
|
"Decrements the o-counter for a scene. Returns the new value"
|
||||||
sceneDecrementO(id: ID!): Int!
|
sceneDecrementO(id: ID!): Int!
|
||||||
"""Resets the o-counter for a scene to 0. Returns the new value"""
|
"Resets the o-counter for a scene to 0. Returns the new value"
|
||||||
sceneResetO(id: ID!): Int!
|
sceneResetO(id: ID!): Int!
|
||||||
|
|
||||||
"""Sets the resume time point (if provided) and adds the provided duration to the scene's play duration"""
|
"Sets the resume time point (if provided) and adds the provided duration to the scene's play duration"
|
||||||
sceneSaveActivity(id: ID!, resume_time: Float, playDuration: Float): Boolean!
|
sceneSaveActivity(id: ID!, resume_time: Float, playDuration: Float): Boolean!
|
||||||
|
|
||||||
"""Increments the play count for the scene. Returns the new play count value."""
|
"Increments the play count for the scene. Returns the new play count value."
|
||||||
sceneIncrementPlayCount(id: ID!): Int!
|
sceneIncrementPlayCount(id: ID!): Int!
|
||||||
|
|
||||||
"""Generates screenshot at specified time in seconds. Leave empty to generate default screenshot"""
|
"Generates screenshot at specified time in seconds. Leave empty to generate default screenshot"
|
||||||
sceneGenerateScreenshot(id: ID!, at: Float): String!
|
sceneGenerateScreenshot(id: ID!, at: Float): String!
|
||||||
|
|
||||||
sceneMarkerCreate(input: SceneMarkerCreateInput!): SceneMarker
|
sceneMarkerCreate(input: SceneMarkerCreateInput!): SceneMarker
|
||||||
|
|
@ -210,11 +271,11 @@ type Mutation {
|
||||||
imagesDestroy(input: ImagesDestroyInput!): Boolean!
|
imagesDestroy(input: ImagesDestroyInput!): Boolean!
|
||||||
imagesUpdate(input: [ImageUpdateInput!]!): [Image]
|
imagesUpdate(input: [ImageUpdateInput!]!): [Image]
|
||||||
|
|
||||||
"""Increments the o-counter for an image. Returns the new value"""
|
"Increments the o-counter for an image. Returns the new value"
|
||||||
imageIncrementO(id: ID!): Int!
|
imageIncrementO(id: ID!): Int!
|
||||||
"""Decrements the o-counter for an image. Returns the new value"""
|
"Decrements the o-counter for an image. Returns the new value"
|
||||||
imageDecrementO(id: ID!): Int!
|
imageDecrementO(id: ID!): Int!
|
||||||
"""Resets the o-counter for a image to 0. Returns the new value"""
|
"Resets the o-counter for a image to 0. Returns the new value"
|
||||||
imageResetO(id: ID!): Int!
|
imageResetO(id: ID!): Int!
|
||||||
|
|
||||||
galleryCreate(input: GalleryCreateInput!): Gallery
|
galleryCreate(input: GalleryCreateInput!): Gallery
|
||||||
|
|
@ -253,8 +314,10 @@ type Mutation {
|
||||||
tagsDestroy(ids: [ID!]!): Boolean!
|
tagsDestroy(ids: [ID!]!): Boolean!
|
||||||
tagsMerge(input: TagsMergeInput!): Tag
|
tagsMerge(input: TagsMergeInput!): Tag
|
||||||
|
|
||||||
"""Moves the given files to the given destination. Returns true if successful.
|
"""
|
||||||
Either the destination_folder or destination_folder_id must be provided. If both are provided, the destination_folder_id takes precedence.
|
Moves the given files to the given destination. Returns true if successful.
|
||||||
|
Either the destination_folder or destination_folder_id must be provided.
|
||||||
|
If both are provided, the destination_folder_id takes precedence.
|
||||||
Destination folder must be a subfolder of one of the stash library paths.
|
Destination folder must be a subfolder of one of the stash library paths.
|
||||||
If provided, destination_basename must be a valid filename with an extension that
|
If provided, destination_basename must be a valid filename with an extension that
|
||||||
matches one of the media extensions.
|
matches one of the media extensions.
|
||||||
|
|
@ -268,94 +331,102 @@ type Mutation {
|
||||||
destroySavedFilter(input: DestroyFilterInput!): Boolean!
|
destroySavedFilter(input: DestroyFilterInput!): Boolean!
|
||||||
setDefaultFilter(input: SetDefaultFilterInput!): Boolean!
|
setDefaultFilter(input: SetDefaultFilterInput!): Boolean!
|
||||||
|
|
||||||
"""Change general configuration options"""
|
"Change general configuration options"
|
||||||
configureGeneral(input: ConfigGeneralInput!): ConfigGeneralResult!
|
configureGeneral(input: ConfigGeneralInput!): ConfigGeneralResult!
|
||||||
configureInterface(input: ConfigInterfaceInput!): ConfigInterfaceResult!
|
configureInterface(input: ConfigInterfaceInput!): ConfigInterfaceResult!
|
||||||
configureDLNA(input: ConfigDLNAInput!): ConfigDLNAResult!
|
configureDLNA(input: ConfigDLNAInput!): ConfigDLNAResult!
|
||||||
configureScraping(input: ConfigScrapingInput!): ConfigScrapingResult!
|
configureScraping(input: ConfigScrapingInput!): ConfigScrapingResult!
|
||||||
configureDefaults(input: ConfigDefaultSettingsInput!): ConfigDefaultSettingsResult!
|
configureDefaults(
|
||||||
|
input: ConfigDefaultSettingsInput!
|
||||||
|
): ConfigDefaultSettingsResult!
|
||||||
|
|
||||||
# overwrites the entire UI configuration
|
# overwrites the entire UI configuration
|
||||||
configureUI(input: Map!): Map!
|
configureUI(input: Map!): Map!
|
||||||
# sets a single UI key value
|
# sets a single UI key value
|
||||||
configureUISetting(key: String!, value: Any): Map!
|
configureUISetting(key: String!, value: Any): Map!
|
||||||
|
|
||||||
"""Generate and set (or clear) API key"""
|
"Generate and set (or clear) API key"
|
||||||
generateAPIKey(input: GenerateAPIKeyInput!): String!
|
generateAPIKey(input: GenerateAPIKeyInput!): String!
|
||||||
|
|
||||||
"""Returns a link to download the result"""
|
"Returns a link to download the result"
|
||||||
exportObjects(input: ExportObjectsInput!): String
|
exportObjects(input: ExportObjectsInput!): String
|
||||||
|
|
||||||
"""Performs an incremental import. Returns the job ID"""
|
"Performs an incremental import. Returns the job ID"
|
||||||
importObjects(input: ImportObjectsInput!): ID!
|
importObjects(input: ImportObjectsInput!): ID!
|
||||||
|
|
||||||
"""Start an full import. Completely wipes the database and imports from the metadata directory. Returns the job ID"""
|
"Start an full import. Completely wipes the database and imports from the metadata directory. Returns the job ID"
|
||||||
metadataImport: ID!
|
metadataImport: ID!
|
||||||
"""Start a full export. Outputs to the metadata directory. Returns the job ID"""
|
"Start a full export. Outputs to the metadata directory. Returns the job ID"
|
||||||
metadataExport: ID!
|
metadataExport: ID!
|
||||||
"""Start a scan. Returns the job ID"""
|
"Start a scan. Returns the job ID"
|
||||||
metadataScan(input: ScanMetadataInput!): ID!
|
metadataScan(input: ScanMetadataInput!): ID!
|
||||||
"""Start generating content. Returns the job ID"""
|
"Start generating content. Returns the job ID"
|
||||||
metadataGenerate(input: GenerateMetadataInput!): ID!
|
metadataGenerate(input: GenerateMetadataInput!): ID!
|
||||||
"""Start auto-tagging. Returns the job ID"""
|
"Start auto-tagging. Returns the job ID"
|
||||||
metadataAutoTag(input: AutoTagMetadataInput!): ID!
|
metadataAutoTag(input: AutoTagMetadataInput!): ID!
|
||||||
"""Clean metadata. Returns the job ID"""
|
"Clean metadata. Returns the job ID"
|
||||||
metadataClean(input: CleanMetadataInput!): ID!
|
metadataClean(input: CleanMetadataInput!): ID!
|
||||||
"""Identifies scenes using scrapers. Returns the job ID"""
|
"Identifies scenes using scrapers. Returns the job ID"
|
||||||
metadataIdentify(input: IdentifyMetadataInput!): ID!
|
metadataIdentify(input: IdentifyMetadataInput!): ID!
|
||||||
|
|
||||||
"""Migrate generated files for the current hash naming"""
|
"Migrate generated files for the current hash naming"
|
||||||
migrateHashNaming: ID!
|
migrateHashNaming: ID!
|
||||||
"""Migrates legacy scene screenshot files into the blob storage"""
|
"Migrates legacy scene screenshot files into the blob storage"
|
||||||
migrateSceneScreenshots(input: MigrateSceneScreenshotsInput!): ID!
|
migrateSceneScreenshots(input: MigrateSceneScreenshotsInput!): ID!
|
||||||
"""Migrates blobs from the old storage system to the current one"""
|
"Migrates blobs from the old storage system to the current one"
|
||||||
migrateBlobs(input: MigrateBlobsInput!): ID!
|
migrateBlobs(input: MigrateBlobsInput!): ID!
|
||||||
|
|
||||||
"""Anonymise the database in a separate file. Optionally returns a link to download the database file"""
|
"Anonymise the database in a separate file. Optionally returns a link to download the database file"
|
||||||
anonymiseDatabase(input: AnonymiseDatabaseInput!): String
|
anonymiseDatabase(input: AnonymiseDatabaseInput!): String
|
||||||
|
|
||||||
"""Reload scrapers"""
|
"Reload scrapers"
|
||||||
reloadScrapers: Boolean!
|
reloadScrapers: Boolean!
|
||||||
|
|
||||||
"""Run plugin task. Returns the job ID"""
|
"Run plugin task. Returns the job ID"
|
||||||
runPluginTask(plugin_id: ID!, task_name: String!, args: [PluginArgInput!]): ID!
|
runPluginTask(
|
||||||
|
plugin_id: ID!
|
||||||
|
task_name: String!
|
||||||
|
args: [PluginArgInput!]
|
||||||
|
): ID!
|
||||||
reloadPlugins: Boolean!
|
reloadPlugins: Boolean!
|
||||||
|
|
||||||
stopJob(job_id: ID!): Boolean!
|
stopJob(job_id: ID!): Boolean!
|
||||||
stopAllJobs: Boolean!
|
stopAllJobs: Boolean!
|
||||||
|
|
||||||
"""Submit fingerprints to stash-box instance"""
|
"Submit fingerprints to stash-box instance"
|
||||||
submitStashBoxFingerprints(input: StashBoxFingerprintSubmissionInput!): Boolean!
|
submitStashBoxFingerprints(
|
||||||
|
input: StashBoxFingerprintSubmissionInput!
|
||||||
|
): Boolean!
|
||||||
|
|
||||||
"""Submit scene as draft to stash-box instance"""
|
"Submit scene as draft to stash-box instance"
|
||||||
submitStashBoxSceneDraft(input: StashBoxDraftSubmissionInput!): ID
|
submitStashBoxSceneDraft(input: StashBoxDraftSubmissionInput!): ID
|
||||||
"""Submit performer as draft to stash-box instance"""
|
"Submit performer as draft to stash-box instance"
|
||||||
submitStashBoxPerformerDraft(input: StashBoxDraftSubmissionInput!): ID
|
submitStashBoxPerformerDraft(input: StashBoxDraftSubmissionInput!): ID
|
||||||
|
|
||||||
"""Backup the database. Optionally returns a link to download the database file"""
|
"Backup the database. Optionally returns a link to download the database file"
|
||||||
backupDatabase(input: BackupDatabaseInput!): String
|
backupDatabase(input: BackupDatabaseInput!): String
|
||||||
|
|
||||||
"""DANGEROUS: Execute an arbitrary SQL statement that returns rows."""
|
"DANGEROUS: Execute an arbitrary SQL statement that returns rows."
|
||||||
querySQL(sql: String!, args: [Any]): SQLQueryResult!
|
querySQL(sql: String!, args: [Any]): SQLQueryResult!
|
||||||
|
|
||||||
"""DANGEROUS: Execute an arbitrary SQL statement without returning any rows."""
|
"DANGEROUS: Execute an arbitrary SQL statement without returning any rows."
|
||||||
execSQL(sql: String!, args: [Any]): SQLExecResult!
|
execSQL(sql: String!, args: [Any]): SQLExecResult!
|
||||||
|
|
||||||
"""Run batch performer tag task. Returns the job ID."""
|
"Run batch performer tag task. Returns the job ID."
|
||||||
stashBoxBatchPerformerTag(input: StashBoxBatchPerformerTagInput!): String!
|
stashBoxBatchPerformerTag(input: StashBoxBatchPerformerTagInput!): String!
|
||||||
|
|
||||||
"""Enables DLNA for an optional duration. Has no effect if DLNA is enabled by default"""
|
"Enables DLNA for an optional duration. Has no effect if DLNA is enabled by default"
|
||||||
enableDLNA(input: EnableDLNAInput!): Boolean!
|
enableDLNA(input: EnableDLNAInput!): Boolean!
|
||||||
"""Disables DLNA for an optional duration. Has no effect if DLNA is disabled by default"""
|
"Disables DLNA for an optional duration. Has no effect if DLNA is disabled by default"
|
||||||
disableDLNA(input: DisableDLNAInput!): Boolean!
|
disableDLNA(input: DisableDLNAInput!): Boolean!
|
||||||
"""Enables an IP address for DLNA for an optional duration"""
|
"Enables an IP address for DLNA for an optional duration"
|
||||||
addTempDLNAIP(input: AddTempDLNAIPInput!): Boolean!
|
addTempDLNAIP(input: AddTempDLNAIPInput!): Boolean!
|
||||||
"""Removes an IP address from the temporary DLNA whitelist"""
|
"Removes an IP address from the temporary DLNA whitelist"
|
||||||
removeTempDLNAIP(input: RemoveTempDLNAIPInput!): Boolean!
|
removeTempDLNAIP(input: RemoveTempDLNAIPInput!): Boolean!
|
||||||
}
|
}
|
||||||
|
|
||||||
type Subscription {
|
type Subscription {
|
||||||
"""Update from the metadata manager"""
|
"Update from the metadata manager"
|
||||||
jobsSubscribe: JobStatusUpdate!
|
jobsSubscribe: JobStatusUpdate!
|
||||||
|
|
||||||
loggingSubscribe: [LogEntry!]!
|
loggingSubscribe: [LogEntry!]!
|
||||||
|
|
|
||||||
|
|
@ -1,267 +1,311 @@
|
||||||
input SetupInput {
|
input SetupInput {
|
||||||
"""Empty to indicate $HOME/.stash/config.yml default"""
|
"Empty to indicate $HOME/.stash/config.yml default"
|
||||||
configLocation: String!
|
configLocation: String!
|
||||||
stashes: [StashConfigInput!]!
|
stashes: [StashConfigInput!]!
|
||||||
"""Empty to indicate default"""
|
"Empty to indicate default"
|
||||||
databaseFile: String!
|
databaseFile: String!
|
||||||
"""Empty to indicate default"""
|
"Empty to indicate default"
|
||||||
generatedLocation: String!
|
generatedLocation: String!
|
||||||
"""Empty to indicate default"""
|
"Empty to indicate default"
|
||||||
cacheLocation: String!
|
cacheLocation: String!
|
||||||
"""Empty to indicate database storage for blobs"""
|
"Empty to indicate database storage for blobs"
|
||||||
blobsLocation: String!
|
blobsLocation: String!
|
||||||
}
|
}
|
||||||
|
|
||||||
enum StreamingResolutionEnum {
|
enum StreamingResolutionEnum {
|
||||||
"240p", LOW
|
"240p"
|
||||||
"480p", STANDARD
|
LOW
|
||||||
"720p", STANDARD_HD
|
"480p"
|
||||||
"1080p", FULL_HD
|
STANDARD
|
||||||
"4k", FOUR_K
|
"720p"
|
||||||
"Original", ORIGINAL
|
STANDARD_HD
|
||||||
|
"1080p"
|
||||||
|
FULL_HD
|
||||||
|
"4k"
|
||||||
|
FOUR_K
|
||||||
|
"Original"
|
||||||
|
ORIGINAL
|
||||||
}
|
}
|
||||||
|
|
||||||
enum PreviewPreset {
|
enum PreviewPreset {
|
||||||
"X264_ULTRAFAST", ultrafast
|
"X264_ULTRAFAST"
|
||||||
"X264_VERYFAST", veryfast
|
ultrafast
|
||||||
"X264_FAST", fast
|
"X264_VERYFAST"
|
||||||
"X264_MEDIUM", medium
|
veryfast
|
||||||
"X264_SLOW", slow
|
"X264_FAST"
|
||||||
"X264_SLOWER", slower
|
fast
|
||||||
"X264_VERYSLOW", veryslow
|
"X264_MEDIUM"
|
||||||
|
medium
|
||||||
|
"X264_SLOW"
|
||||||
|
slow
|
||||||
|
"X264_SLOWER"
|
||||||
|
slower
|
||||||
|
"X264_VERYSLOW"
|
||||||
|
veryslow
|
||||||
}
|
}
|
||||||
|
|
||||||
enum HashAlgorithm {
|
enum HashAlgorithm {
|
||||||
MD5
|
MD5
|
||||||
"oshash", OSHASH
|
"oshash"
|
||||||
|
OSHASH
|
||||||
}
|
}
|
||||||
|
|
||||||
enum BlobsStorageType {
|
enum BlobsStorageType {
|
||||||
# blobs are stored in the database
|
# blobs are stored in the database
|
||||||
"Database", DATABASE
|
"Database"
|
||||||
|
DATABASE
|
||||||
# blobs are stored in the filesystem under the configured blobs directory
|
# blobs are stored in the filesystem under the configured blobs directory
|
||||||
"Filesystem", FILESYSTEM
|
"Filesystem"
|
||||||
|
FILESYSTEM
|
||||||
}
|
}
|
||||||
|
|
||||||
input ConfigGeneralInput {
|
input ConfigGeneralInput {
|
||||||
"""Array of file paths to content"""
|
"Array of file paths to content"
|
||||||
stashes: [StashConfigInput!]
|
stashes: [StashConfigInput!]
|
||||||
"""Path to the SQLite database"""
|
"Path to the SQLite database"
|
||||||
databasePath: String
|
databasePath: String
|
||||||
"""Path to backup directory"""
|
"Path to backup directory"
|
||||||
backupDirectoryPath: String
|
backupDirectoryPath: String
|
||||||
"""Path to generated files"""
|
"Path to generated files"
|
||||||
generatedPath: String
|
generatedPath: String
|
||||||
"""Path to import/export files"""
|
"Path to import/export files"
|
||||||
metadataPath: String
|
metadataPath: String
|
||||||
"""Path to scrapers"""
|
"Path to scrapers"
|
||||||
scrapersPath: String
|
scrapersPath: String
|
||||||
"""Path to cache"""
|
"Path to cache"
|
||||||
cachePath: String
|
cachePath: String
|
||||||
"""Path to blobs - required for filesystem blob storage"""
|
"Path to blobs - required for filesystem blob storage"
|
||||||
blobsPath: String
|
blobsPath: String
|
||||||
"""Where to store blobs"""
|
"Where to store blobs"
|
||||||
blobsStorage: BlobsStorageType
|
blobsStorage: BlobsStorageType
|
||||||
"""Whether to calculate MD5 checksums for scene video files"""
|
"Whether to calculate MD5 checksums for scene video files"
|
||||||
calculateMD5: Boolean
|
calculateMD5: Boolean
|
||||||
"""Hash algorithm to use for generated file naming"""
|
"Hash algorithm to use for generated file naming"
|
||||||
videoFileNamingAlgorithm: HashAlgorithm
|
videoFileNamingAlgorithm: HashAlgorithm
|
||||||
"""Number of parallel tasks to start during scan/generate"""
|
"Number of parallel tasks to start during scan/generate"
|
||||||
parallelTasks: Int
|
parallelTasks: Int
|
||||||
"""Include audio stream in previews"""
|
"Include audio stream in previews"
|
||||||
previewAudio: Boolean
|
previewAudio: Boolean
|
||||||
"""Number of segments in a preview file"""
|
"Number of segments in a preview file"
|
||||||
previewSegments: Int
|
previewSegments: Int
|
||||||
"""Preview segment duration, in seconds"""
|
"Preview segment duration, in seconds"
|
||||||
previewSegmentDuration: Float
|
previewSegmentDuration: Float
|
||||||
"""Duration of start of video to exclude when generating previews"""
|
"Duration of start of video to exclude when generating previews"
|
||||||
previewExcludeStart: String
|
previewExcludeStart: String
|
||||||
"""Duration of end of video to exclude when generating previews"""
|
"Duration of end of video to exclude when generating previews"
|
||||||
previewExcludeEnd: String
|
previewExcludeEnd: String
|
||||||
"""Preset when generating preview"""
|
"Preset when generating preview"
|
||||||
previewPreset: PreviewPreset
|
previewPreset: PreviewPreset
|
||||||
"""Transcode Hardware Acceleration"""
|
"Transcode Hardware Acceleration"
|
||||||
transcodeHardwareAcceleration: Boolean
|
transcodeHardwareAcceleration: Boolean
|
||||||
"""Max generated transcode size"""
|
"Max generated transcode size"
|
||||||
maxTranscodeSize: StreamingResolutionEnum
|
maxTranscodeSize: StreamingResolutionEnum
|
||||||
"""Max streaming transcode size"""
|
"Max streaming transcode size"
|
||||||
maxStreamingTranscodeSize: StreamingResolutionEnum
|
maxStreamingTranscodeSize: StreamingResolutionEnum
|
||||||
|
|
||||||
"""ffmpeg transcode input args - injected before input file
|
"""
|
||||||
These are applied to generated transcodes (previews and transcodes)"""
|
ffmpeg transcode input args - injected before input file
|
||||||
|
These are applied to generated transcodes (previews and transcodes)
|
||||||
|
"""
|
||||||
transcodeInputArgs: [String!]
|
transcodeInputArgs: [String!]
|
||||||
"""ffmpeg transcode output args - injected before output file
|
"""
|
||||||
These are applied to generated transcodes (previews and transcodes)"""
|
ffmpeg transcode output args - injected before output file
|
||||||
|
These are applied to generated transcodes (previews and transcodes)
|
||||||
|
"""
|
||||||
transcodeOutputArgs: [String!]
|
transcodeOutputArgs: [String!]
|
||||||
|
|
||||||
"""ffmpeg stream input args - injected before input file
|
"""
|
||||||
These are applied when live transcoding"""
|
ffmpeg stream input args - injected before input file
|
||||||
|
These are applied when live transcoding
|
||||||
|
"""
|
||||||
liveTranscodeInputArgs: [String!]
|
liveTranscodeInputArgs: [String!]
|
||||||
"""ffmpeg stream output args - injected before output file
|
"""
|
||||||
These are applied when live transcoding"""
|
ffmpeg stream output args - injected before output file
|
||||||
|
These are applied when live transcoding
|
||||||
|
"""
|
||||||
liveTranscodeOutputArgs: [String!]
|
liveTranscodeOutputArgs: [String!]
|
||||||
|
|
||||||
"""whether to include range in generated funscript heatmaps"""
|
"whether to include range in generated funscript heatmaps"
|
||||||
drawFunscriptHeatmapRange: Boolean
|
drawFunscriptHeatmapRange: Boolean
|
||||||
|
|
||||||
"""Write image thumbnails to disk when generating on the fly"""
|
"Write image thumbnails to disk when generating on the fly"
|
||||||
writeImageThumbnails: Boolean
|
writeImageThumbnails: Boolean
|
||||||
"""Create Image Clips from Video extensions when Videos are disabled in Library"""
|
"Create Image Clips from Video extensions when Videos are disabled in Library"
|
||||||
createImageClipsFromVideos: Boolean
|
createImageClipsFromVideos: Boolean
|
||||||
"""Username"""
|
"Username"
|
||||||
username: String
|
username: String
|
||||||
"""Password"""
|
"Password"
|
||||||
password: String
|
password: String
|
||||||
"""Maximum session cookie age"""
|
"Maximum session cookie age"
|
||||||
maxSessionAge: Int
|
maxSessionAge: Int
|
||||||
"""Comma separated list of proxies to allow traffic from"""
|
"Comma separated list of proxies to allow traffic from"
|
||||||
trustedProxies: [String!] @deprecated(reason: "no longer supported")
|
trustedProxies: [String!] @deprecated(reason: "no longer supported")
|
||||||
"""Name of the log file"""
|
"Name of the log file"
|
||||||
logFile: String
|
logFile: String
|
||||||
"""Whether to also output to stderr"""
|
"Whether to also output to stderr"
|
||||||
logOut: Boolean
|
logOut: Boolean
|
||||||
"""Minimum log level"""
|
"Minimum log level"
|
||||||
logLevel: String
|
logLevel: String
|
||||||
"""Whether to log http access"""
|
"Whether to log http access"
|
||||||
logAccess: Boolean
|
logAccess: Boolean
|
||||||
"""True if galleries should be created from folders with images"""
|
"True if galleries should be created from folders with images"
|
||||||
createGalleriesFromFolders: Boolean
|
createGalleriesFromFolders: Boolean
|
||||||
"""Regex used to identify images as gallery covers"""
|
"Regex used to identify images as gallery covers"
|
||||||
galleryCoverRegex: String
|
galleryCoverRegex: String
|
||||||
"""Array of video file extensions"""
|
"Array of video file extensions"
|
||||||
videoExtensions: [String!]
|
videoExtensions: [String!]
|
||||||
"""Array of image file extensions"""
|
"Array of image file extensions"
|
||||||
imageExtensions: [String!]
|
imageExtensions: [String!]
|
||||||
"""Array of gallery zip file extensions"""
|
"Array of gallery zip file extensions"
|
||||||
galleryExtensions: [String!]
|
galleryExtensions: [String!]
|
||||||
"""Array of file regexp to exclude from Video Scans"""
|
"Array of file regexp to exclude from Video Scans"
|
||||||
excludes: [String!]
|
excludes: [String!]
|
||||||
"""Array of file regexp to exclude from Image Scans"""
|
"Array of file regexp to exclude from Image Scans"
|
||||||
imageExcludes: [String!]
|
imageExcludes: [String!]
|
||||||
"""Custom Performer Image Location"""
|
"Custom Performer Image Location"
|
||||||
customPerformerImageLocation: String
|
customPerformerImageLocation: String
|
||||||
"""Scraper user agent string"""
|
"Scraper user agent string"
|
||||||
scraperUserAgent: String @deprecated(reason: "use mutation ConfigureScraping(input: ConfigScrapingInput) instead")
|
scraperUserAgent: String
|
||||||
"""Scraper CDP path. Path to chrome executable or remote address"""
|
@deprecated(
|
||||||
scraperCDPPath: String @deprecated(reason: "use mutation ConfigureScraping(input: ConfigScrapingInput) instead")
|
reason: "use mutation ConfigureScraping(input: ConfigScrapingInput) instead"
|
||||||
"""Whether the scraper should check for invalid certificates"""
|
)
|
||||||
scraperCertCheck: Boolean @deprecated(reason: "use mutation ConfigureScraping(input: ConfigScrapingInput) instead")
|
"Scraper CDP path. Path to chrome executable or remote address"
|
||||||
"""Stash-box instances used for tagging"""
|
scraperCDPPath: String
|
||||||
|
@deprecated(
|
||||||
|
reason: "use mutation ConfigureScraping(input: ConfigScrapingInput) instead"
|
||||||
|
)
|
||||||
|
"Whether the scraper should check for invalid certificates"
|
||||||
|
scraperCertCheck: Boolean
|
||||||
|
@deprecated(
|
||||||
|
reason: "use mutation ConfigureScraping(input: ConfigScrapingInput) instead"
|
||||||
|
)
|
||||||
|
"Stash-box instances used for tagging"
|
||||||
stashBoxes: [StashBoxInput!]
|
stashBoxes: [StashBoxInput!]
|
||||||
"""Python path - resolved using path if unset"""
|
"Python path - resolved using path if unset"
|
||||||
pythonPath: String
|
pythonPath: String
|
||||||
}
|
}
|
||||||
|
|
||||||
type ConfigGeneralResult {
|
type ConfigGeneralResult {
|
||||||
"""Array of file paths to content"""
|
"Array of file paths to content"
|
||||||
stashes: [StashConfig!]!
|
stashes: [StashConfig!]!
|
||||||
"""Path to the SQLite database"""
|
"Path to the SQLite database"
|
||||||
databasePath: String!
|
databasePath: String!
|
||||||
"""Path to backup directory"""
|
"Path to backup directory"
|
||||||
backupDirectoryPath: String!
|
backupDirectoryPath: String!
|
||||||
"""Path to generated files"""
|
"Path to generated files"
|
||||||
generatedPath: String!
|
generatedPath: String!
|
||||||
"""Path to import/export files"""
|
"Path to import/export files"
|
||||||
metadataPath: String!
|
metadataPath: String!
|
||||||
"""Path to the config file used"""
|
"Path to the config file used"
|
||||||
configFilePath: String!
|
configFilePath: String!
|
||||||
"""Path to scrapers"""
|
"Path to scrapers"
|
||||||
scrapersPath: String!
|
scrapersPath: String!
|
||||||
"""Path to cache"""
|
"Path to cache"
|
||||||
cachePath: String!
|
cachePath: String!
|
||||||
"""Path to blobs - required for filesystem blob storage"""
|
"Path to blobs - required for filesystem blob storage"
|
||||||
blobsPath: String!
|
blobsPath: String!
|
||||||
"""Where to store blobs"""
|
"Where to store blobs"
|
||||||
blobsStorage: BlobsStorageType!
|
blobsStorage: BlobsStorageType!
|
||||||
"""Whether to calculate MD5 checksums for scene video files"""
|
"Whether to calculate MD5 checksums for scene video files"
|
||||||
calculateMD5: Boolean!
|
calculateMD5: Boolean!
|
||||||
"""Hash algorithm to use for generated file naming"""
|
"Hash algorithm to use for generated file naming"
|
||||||
videoFileNamingAlgorithm: HashAlgorithm!
|
videoFileNamingAlgorithm: HashAlgorithm!
|
||||||
"""Number of parallel tasks to start during scan/generate"""
|
"Number of parallel tasks to start during scan/generate"
|
||||||
parallelTasks: Int!
|
parallelTasks: Int!
|
||||||
"""Include audio stream in previews"""
|
"Include audio stream in previews"
|
||||||
previewAudio: Boolean!
|
previewAudio: Boolean!
|
||||||
"""Number of segments in a preview file"""
|
"Number of segments in a preview file"
|
||||||
previewSegments: Int!
|
previewSegments: Int!
|
||||||
"""Preview segment duration, in seconds"""
|
"Preview segment duration, in seconds"
|
||||||
previewSegmentDuration: Float!
|
previewSegmentDuration: Float!
|
||||||
"""Duration of start of video to exclude when generating previews"""
|
"Duration of start of video to exclude when generating previews"
|
||||||
previewExcludeStart: String!
|
previewExcludeStart: String!
|
||||||
"""Duration of end of video to exclude when generating previews"""
|
"Duration of end of video to exclude when generating previews"
|
||||||
previewExcludeEnd: String!
|
previewExcludeEnd: String!
|
||||||
"""Preset when generating preview"""
|
"Preset when generating preview"
|
||||||
previewPreset: PreviewPreset!
|
previewPreset: PreviewPreset!
|
||||||
"""Transcode Hardware Acceleration"""
|
"Transcode Hardware Acceleration"
|
||||||
transcodeHardwareAcceleration: Boolean!
|
transcodeHardwareAcceleration: Boolean!
|
||||||
"""Max generated transcode size"""
|
"Max generated transcode size"
|
||||||
maxTranscodeSize: StreamingResolutionEnum
|
maxTranscodeSize: StreamingResolutionEnum
|
||||||
"""Max streaming transcode size"""
|
"Max streaming transcode size"
|
||||||
maxStreamingTranscodeSize: StreamingResolutionEnum
|
maxStreamingTranscodeSize: StreamingResolutionEnum
|
||||||
|
|
||||||
"""ffmpeg transcode input args - injected before input file
|
"""
|
||||||
These are applied to generated transcodes (previews and transcodes)"""
|
ffmpeg transcode input args - injected before input file
|
||||||
|
These are applied to generated transcodes (previews and transcodes)
|
||||||
|
"""
|
||||||
transcodeInputArgs: [String!]!
|
transcodeInputArgs: [String!]!
|
||||||
"""ffmpeg transcode output args - injected before output file
|
"""
|
||||||
These are applied to generated transcodes (previews and transcodes)"""
|
ffmpeg transcode output args - injected before output file
|
||||||
|
These are applied to generated transcodes (previews and transcodes)
|
||||||
|
"""
|
||||||
transcodeOutputArgs: [String!]!
|
transcodeOutputArgs: [String!]!
|
||||||
|
|
||||||
"""ffmpeg stream input args - injected before input file
|
"""
|
||||||
These are applied when live transcoding"""
|
ffmpeg stream input args - injected before input file
|
||||||
|
These are applied when live transcoding
|
||||||
|
"""
|
||||||
liveTranscodeInputArgs: [String!]!
|
liveTranscodeInputArgs: [String!]!
|
||||||
"""ffmpeg stream output args - injected before output file
|
"""
|
||||||
These are applied when live transcoding"""
|
ffmpeg stream output args - injected before output file
|
||||||
|
These are applied when live transcoding
|
||||||
|
"""
|
||||||
liveTranscodeOutputArgs: [String!]!
|
liveTranscodeOutputArgs: [String!]!
|
||||||
|
|
||||||
"""whether to include range in generated funscript heatmaps"""
|
"whether to include range in generated funscript heatmaps"
|
||||||
drawFunscriptHeatmapRange: Boolean!
|
drawFunscriptHeatmapRange: Boolean!
|
||||||
|
|
||||||
"""Write image thumbnails to disk when generating on the fly"""
|
"Write image thumbnails to disk when generating on the fly"
|
||||||
writeImageThumbnails: Boolean!
|
writeImageThumbnails: Boolean!
|
||||||
"""Create Image Clips from Video extensions when Videos are disabled in Library"""
|
"Create Image Clips from Video extensions when Videos are disabled in Library"
|
||||||
createImageClipsFromVideos: Boolean!
|
createImageClipsFromVideos: Boolean!
|
||||||
"""API Key"""
|
"API Key"
|
||||||
apiKey: String!
|
apiKey: String!
|
||||||
"""Username"""
|
"Username"
|
||||||
username: String!
|
username: String!
|
||||||
"""Password"""
|
"Password"
|
||||||
password: String!
|
password: String!
|
||||||
"""Maximum session cookie age"""
|
"Maximum session cookie age"
|
||||||
maxSessionAge: Int!
|
maxSessionAge: Int!
|
||||||
"""Comma separated list of proxies to allow traffic from"""
|
"Comma separated list of proxies to allow traffic from"
|
||||||
trustedProxies: [String!] @deprecated(reason: "no longer supported")
|
trustedProxies: [String!] @deprecated(reason: "no longer supported")
|
||||||
"""Name of the log file"""
|
"Name of the log file"
|
||||||
logFile: String
|
logFile: String
|
||||||
"""Whether to also output to stderr"""
|
"Whether to also output to stderr"
|
||||||
logOut: Boolean!
|
logOut: Boolean!
|
||||||
"""Minimum log level"""
|
"Minimum log level"
|
||||||
logLevel: String!
|
logLevel: String!
|
||||||
"""Whether to log http access"""
|
"Whether to log http access"
|
||||||
logAccess: Boolean!
|
logAccess: Boolean!
|
||||||
"""Array of video file extensions"""
|
"Array of video file extensions"
|
||||||
videoExtensions: [String!]!
|
videoExtensions: [String!]!
|
||||||
"""Array of image file extensions"""
|
"Array of image file extensions"
|
||||||
imageExtensions: [String!]!
|
imageExtensions: [String!]!
|
||||||
"""Array of gallery zip file extensions"""
|
"Array of gallery zip file extensions"
|
||||||
galleryExtensions: [String!]!
|
galleryExtensions: [String!]!
|
||||||
"""True if galleries should be created from folders with images"""
|
"True if galleries should be created from folders with images"
|
||||||
createGalleriesFromFolders: Boolean!
|
createGalleriesFromFolders: Boolean!
|
||||||
"""Regex used to identify images as gallery covers"""
|
"Regex used to identify images as gallery covers"
|
||||||
galleryCoverRegex: String!
|
galleryCoverRegex: String!
|
||||||
"""Array of file regexp to exclude from Video Scans"""
|
"Array of file regexp to exclude from Video Scans"
|
||||||
excludes: [String!]!
|
excludes: [String!]!
|
||||||
"""Array of file regexp to exclude from Image Scans"""
|
"Array of file regexp to exclude from Image Scans"
|
||||||
imageExcludes: [String!]!
|
imageExcludes: [String!]!
|
||||||
"""Custom Performer Image Location"""
|
"Custom Performer Image Location"
|
||||||
customPerformerImageLocation: String
|
customPerformerImageLocation: String
|
||||||
"""Scraper user agent string"""
|
"Scraper user agent string"
|
||||||
scraperUserAgent: String @deprecated(reason: "use ConfigResult.scraping instead")
|
scraperUserAgent: String
|
||||||
"""Scraper CDP path. Path to chrome executable or remote address"""
|
@deprecated(reason: "use ConfigResult.scraping instead")
|
||||||
scraperCDPPath: String @deprecated(reason: "use ConfigResult.scraping instead")
|
"Scraper CDP path. Path to chrome executable or remote address"
|
||||||
"""Whether the scraper should check for invalid certificates"""
|
scraperCDPPath: String
|
||||||
scraperCertCheck: Boolean! @deprecated(reason: "use ConfigResult.scraping instead")
|
@deprecated(reason: "use ConfigResult.scraping instead")
|
||||||
"""Stash-box instances used for tagging"""
|
"Whether the scraper should check for invalid certificates"
|
||||||
|
scraperCertCheck: Boolean!
|
||||||
|
@deprecated(reason: "use ConfigResult.scraping instead")
|
||||||
|
"Stash-box instances used for tagging"
|
||||||
stashBoxes: [StashBox!]!
|
stashBoxes: [StashBox!]!
|
||||||
"""Python path - resolved using path if unset"""
|
"Python path - resolved using path if unset"
|
||||||
pythonPath: String!
|
pythonPath: String!
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -302,64 +346,64 @@ type ConfigImageLightboxResult {
|
||||||
}
|
}
|
||||||
|
|
||||||
input ConfigInterfaceInput {
|
input ConfigInterfaceInput {
|
||||||
"""Ordered list of items that should be shown in the menu"""
|
"Ordered list of items that should be shown in the menu"
|
||||||
menuItems: [String!]
|
menuItems: [String!]
|
||||||
|
|
||||||
"""Enable sound on mouseover previews"""
|
"Enable sound on mouseover previews"
|
||||||
soundOnPreview: Boolean
|
soundOnPreview: Boolean
|
||||||
|
|
||||||
"""Show title and tags in wall view"""
|
"Show title and tags in wall view"
|
||||||
wallShowTitle: Boolean
|
wallShowTitle: Boolean
|
||||||
"""Wall playback type"""
|
"Wall playback type"
|
||||||
wallPlayback: String
|
wallPlayback: String
|
||||||
|
|
||||||
"""Show scene scrubber by default"""
|
"Show scene scrubber by default"
|
||||||
showScrubber: Boolean
|
showScrubber: Boolean
|
||||||
|
|
||||||
"""Maximum duration (in seconds) in which a scene video will loop in the scene player"""
|
"Maximum duration (in seconds) in which a scene video will loop in the scene player"
|
||||||
maximumLoopDuration: Int
|
maximumLoopDuration: Int
|
||||||
"""If true, video will autostart on load in the scene player"""
|
"If true, video will autostart on load in the scene player"
|
||||||
autostartVideo: Boolean
|
autostartVideo: Boolean
|
||||||
"""If true, video will autostart when loading from play random or play selected"""
|
"If true, video will autostart when loading from play random or play selected"
|
||||||
autostartVideoOnPlaySelected: Boolean
|
autostartVideoOnPlaySelected: Boolean
|
||||||
"""If true, next scene in playlist will be played at video end by default"""
|
"If true, next scene in playlist will be played at video end by default"
|
||||||
continuePlaylistDefault: Boolean
|
continuePlaylistDefault: Boolean
|
||||||
|
|
||||||
"""If true, studio overlays will be shown as text instead of logo images"""
|
"If true, studio overlays will be shown as text instead of logo images"
|
||||||
showStudioAsText: Boolean
|
showStudioAsText: Boolean
|
||||||
|
|
||||||
"""Custom CSS"""
|
"Custom CSS"
|
||||||
css: String
|
css: String
|
||||||
cssEnabled: Boolean
|
cssEnabled: Boolean
|
||||||
|
|
||||||
"""Custom Javascript"""
|
"Custom Javascript"
|
||||||
javascript: String
|
javascript: String
|
||||||
javascriptEnabled: Boolean
|
javascriptEnabled: Boolean
|
||||||
|
|
||||||
"""Custom Locales"""
|
"Custom Locales"
|
||||||
customLocales: String
|
customLocales: String
|
||||||
customLocalesEnabled: Boolean
|
customLocalesEnabled: Boolean
|
||||||
|
|
||||||
"""Interface language"""
|
"Interface language"
|
||||||
language: String
|
language: String
|
||||||
|
|
||||||
"""Slideshow Delay"""
|
"Slideshow Delay"
|
||||||
slideshowDelay: Int @deprecated(reason: "Use imageLightbox.slideshowDelay")
|
slideshowDelay: Int @deprecated(reason: "Use imageLightbox.slideshowDelay")
|
||||||
|
|
||||||
imageLightbox: ConfigImageLightboxInput
|
imageLightbox: ConfigImageLightboxInput
|
||||||
|
|
||||||
"""Set to true to disable creating new objects via the dropdown menus"""
|
"Set to true to disable creating new objects via the dropdown menus"
|
||||||
disableDropdownCreate: ConfigDisableDropdownCreateInput
|
disableDropdownCreate: ConfigDisableDropdownCreateInput
|
||||||
|
|
||||||
"""Handy Connection Key"""
|
"Handy Connection Key"
|
||||||
handyKey: String
|
handyKey: String
|
||||||
"""Funscript Time Offset"""
|
"Funscript Time Offset"
|
||||||
funscriptOffset: Int
|
funscriptOffset: Int
|
||||||
"""Whether to use Stash Hosted Funscript"""
|
"Whether to use Stash Hosted Funscript"
|
||||||
useStashHostedFunscript: Boolean
|
useStashHostedFunscript: Boolean
|
||||||
"""True if we should not auto-open a browser window on startup"""
|
"True if we should not auto-open a browser window on startup"
|
||||||
noBrowser: Boolean
|
noBrowser: Boolean
|
||||||
"""True if we should send notifications to the desktop"""
|
"True if we should send notifications to the desktop"
|
||||||
notificationsEnabled: Boolean
|
notificationsEnabled: Boolean
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -371,111 +415,112 @@ type ConfigDisableDropdownCreate {
|
||||||
}
|
}
|
||||||
|
|
||||||
type ConfigInterfaceResult {
|
type ConfigInterfaceResult {
|
||||||
"""Ordered list of items that should be shown in the menu"""
|
"Ordered list of items that should be shown in the menu"
|
||||||
menuItems: [String!]
|
menuItems: [String!]
|
||||||
|
|
||||||
"""Enable sound on mouseover previews"""
|
"Enable sound on mouseover previews"
|
||||||
soundOnPreview: Boolean
|
soundOnPreview: Boolean
|
||||||
|
|
||||||
"""Show title and tags in wall view"""
|
"Show title and tags in wall view"
|
||||||
wallShowTitle: Boolean
|
wallShowTitle: Boolean
|
||||||
"""Wall playback type"""
|
"Wall playback type"
|
||||||
wallPlayback: String
|
wallPlayback: String
|
||||||
|
|
||||||
"""Show scene scrubber by default"""
|
"Show scene scrubber by default"
|
||||||
showScrubber: Boolean
|
showScrubber: Boolean
|
||||||
|
|
||||||
"""Maximum duration (in seconds) in which a scene video will loop in the scene player"""
|
"Maximum duration (in seconds) in which a scene video will loop in the scene player"
|
||||||
maximumLoopDuration: Int
|
maximumLoopDuration: Int
|
||||||
"""True if we should not auto-open a browser window on startup"""
|
"True if we should not auto-open a browser window on startup"
|
||||||
noBrowser: Boolean
|
noBrowser: Boolean
|
||||||
"""True if we should send desktop notifications"""
|
"True if we should send desktop notifications"
|
||||||
notificationsEnabled: Boolean
|
notificationsEnabled: Boolean
|
||||||
"""If true, video will autostart on load in the scene player"""
|
"If true, video will autostart on load in the scene player"
|
||||||
autostartVideo: Boolean
|
autostartVideo: Boolean
|
||||||
"""If true, video will autostart when loading from play random or play selected"""
|
"If true, video will autostart when loading from play random or play selected"
|
||||||
autostartVideoOnPlaySelected: Boolean
|
autostartVideoOnPlaySelected: Boolean
|
||||||
"""If true, next scene in playlist will be played at video end by default"""
|
"If true, next scene in playlist will be played at video end by default"
|
||||||
continuePlaylistDefault: Boolean
|
continuePlaylistDefault: Boolean
|
||||||
|
|
||||||
"""If true, studio overlays will be shown as text instead of logo images"""
|
"If true, studio overlays will be shown as text instead of logo images"
|
||||||
showStudioAsText: Boolean
|
showStudioAsText: Boolean
|
||||||
|
|
||||||
"""Custom CSS"""
|
"Custom CSS"
|
||||||
css: String
|
css: String
|
||||||
cssEnabled: Boolean
|
cssEnabled: Boolean
|
||||||
|
|
||||||
"""Custom Javascript"""
|
"Custom Javascript"
|
||||||
javascript: String
|
javascript: String
|
||||||
javascriptEnabled: Boolean
|
javascriptEnabled: Boolean
|
||||||
|
|
||||||
"""Custom Locales"""
|
"Custom Locales"
|
||||||
customLocales: String
|
customLocales: String
|
||||||
customLocalesEnabled: Boolean
|
customLocalesEnabled: Boolean
|
||||||
|
|
||||||
"""Interface language"""
|
"Interface language"
|
||||||
language: String
|
language: String
|
||||||
|
|
||||||
"""Slideshow Delay"""
|
"Slideshow Delay"
|
||||||
slideshowDelay: Int @deprecated(reason: "Use imageLightbox.slideshowDelay")
|
slideshowDelay: Int @deprecated(reason: "Use imageLightbox.slideshowDelay")
|
||||||
|
|
||||||
imageLightbox: ConfigImageLightboxResult!
|
imageLightbox: ConfigImageLightboxResult!
|
||||||
|
|
||||||
"""Fields are true if creating via dropdown menus are disabled"""
|
"Fields are true if creating via dropdown menus are disabled"
|
||||||
disableDropdownCreate: ConfigDisableDropdownCreate!
|
disableDropdownCreate: ConfigDisableDropdownCreate!
|
||||||
disabledDropdownCreate: ConfigDisableDropdownCreate! @deprecated(reason: "Use disableDropdownCreate")
|
disabledDropdownCreate: ConfigDisableDropdownCreate!
|
||||||
|
@deprecated(reason: "Use disableDropdownCreate")
|
||||||
|
|
||||||
"""Handy Connection Key"""
|
"Handy Connection Key"
|
||||||
handyKey: String
|
handyKey: String
|
||||||
"""Funscript Time Offset"""
|
"Funscript Time Offset"
|
||||||
funscriptOffset: Int
|
funscriptOffset: Int
|
||||||
"""Whether to use Stash Hosted Funscript"""
|
"Whether to use Stash Hosted Funscript"
|
||||||
useStashHostedFunscript: Boolean
|
useStashHostedFunscript: Boolean
|
||||||
}
|
}
|
||||||
|
|
||||||
input ConfigDLNAInput {
|
input ConfigDLNAInput {
|
||||||
serverName: String
|
serverName: String
|
||||||
"""True if DLNA service should be enabled by default"""
|
"True if DLNA service should be enabled by default"
|
||||||
enabled: Boolean
|
enabled: Boolean
|
||||||
"""List of IPs whitelisted for DLNA service"""
|
"List of IPs whitelisted for DLNA service"
|
||||||
whitelistedIPs: [String!]
|
whitelistedIPs: [String!]
|
||||||
"""List of interfaces to run DLNA on. Empty for all"""
|
"List of interfaces to run DLNA on. Empty for all"
|
||||||
interfaces: [String!]
|
interfaces: [String!]
|
||||||
"""Order to sort videos"""
|
"Order to sort videos"
|
||||||
videoSortOrder: String
|
videoSortOrder: String
|
||||||
}
|
}
|
||||||
|
|
||||||
type ConfigDLNAResult {
|
type ConfigDLNAResult {
|
||||||
serverName: String!
|
serverName: String!
|
||||||
"""True if DLNA service should be enabled by default"""
|
"True if DLNA service should be enabled by default"
|
||||||
enabled: Boolean!
|
enabled: Boolean!
|
||||||
"""List of IPs whitelisted for DLNA service"""
|
"List of IPs whitelisted for DLNA service"
|
||||||
whitelistedIPs: [String!]!
|
whitelistedIPs: [String!]!
|
||||||
"""List of interfaces to run DLNA on. Empty for all"""
|
"List of interfaces to run DLNA on. Empty for all"
|
||||||
interfaces: [String!]!
|
interfaces: [String!]!
|
||||||
"""Order to sort videos"""
|
"Order to sort videos"
|
||||||
videoSortOrder: String!
|
videoSortOrder: String!
|
||||||
}
|
}
|
||||||
|
|
||||||
input ConfigScrapingInput {
|
input ConfigScrapingInput {
|
||||||
"""Scraper user agent string"""
|
"Scraper user agent string"
|
||||||
scraperUserAgent: String
|
scraperUserAgent: String
|
||||||
"""Scraper CDP path. Path to chrome executable or remote address"""
|
"Scraper CDP path. Path to chrome executable or remote address"
|
||||||
scraperCDPPath: String
|
scraperCDPPath: String
|
||||||
"""Whether the scraper should check for invalid certificates"""
|
"Whether the scraper should check for invalid certificates"
|
||||||
scraperCertCheck: Boolean
|
scraperCertCheck: Boolean
|
||||||
"""Tags blacklist during scraping"""
|
"Tags blacklist during scraping"
|
||||||
excludeTagPatterns: [String!]
|
excludeTagPatterns: [String!]
|
||||||
}
|
}
|
||||||
|
|
||||||
type ConfigScrapingResult {
|
type ConfigScrapingResult {
|
||||||
"""Scraper user agent string"""
|
"Scraper user agent string"
|
||||||
scraperUserAgent: String
|
scraperUserAgent: String
|
||||||
"""Scraper CDP path. Path to chrome executable or remote address"""
|
"Scraper CDP path. Path to chrome executable or remote address"
|
||||||
scraperCDPPath: String
|
scraperCDPPath: String
|
||||||
"""Whether the scraper should check for invalid certificates"""
|
"Whether the scraper should check for invalid certificates"
|
||||||
scraperCertCheck: Boolean!
|
scraperCertCheck: Boolean!
|
||||||
"""Tags blacklist during scraping"""
|
"Tags blacklist during scraping"
|
||||||
excludeTagPatterns: [String!]!
|
excludeTagPatterns: [String!]!
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -484,10 +529,10 @@ type ConfigDefaultSettingsResult {
|
||||||
identify: IdentifyMetadataTaskOptions
|
identify: IdentifyMetadataTaskOptions
|
||||||
autoTag: AutoTagMetadataOptions
|
autoTag: AutoTagMetadataOptions
|
||||||
generate: GenerateMetadataOptions
|
generate: GenerateMetadataOptions
|
||||||
|
|
||||||
"""If true, delete file checkbox will be checked by default"""
|
"If true, delete file checkbox will be checked by default"
|
||||||
deleteFile: Boolean
|
deleteFile: Boolean
|
||||||
"""If true, delete generated supporting files checkbox will be checked by default"""
|
"If true, delete generated supporting files checkbox will be checked by default"
|
||||||
deleteGenerated: Boolean
|
deleteGenerated: Boolean
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -497,13 +542,13 @@ input ConfigDefaultSettingsInput {
|
||||||
autoTag: AutoTagMetadataInput
|
autoTag: AutoTagMetadataInput
|
||||||
generate: GenerateMetadataInput
|
generate: GenerateMetadataInput
|
||||||
|
|
||||||
"""If true, delete file checkbox will be checked by default"""
|
"If true, delete file checkbox will be checked by default"
|
||||||
deleteFile: Boolean
|
deleteFile: Boolean
|
||||||
"""If true, delete generated files checkbox will be checked by default"""
|
"If true, delete generated files checkbox will be checked by default"
|
||||||
deleteGenerated: Boolean
|
deleteGenerated: Boolean
|
||||||
}
|
}
|
||||||
|
|
||||||
"""All configuration settings"""
|
"All configuration settings"
|
||||||
type ConfigResult {
|
type ConfigResult {
|
||||||
general: ConfigGeneralResult!
|
general: ConfigGeneralResult!
|
||||||
interface: ConfigInterfaceResult!
|
interface: ConfigInterfaceResult!
|
||||||
|
|
@ -513,14 +558,14 @@ type ConfigResult {
|
||||||
ui: Map!
|
ui: Map!
|
||||||
}
|
}
|
||||||
|
|
||||||
"""Directory structure of a path"""
|
"Directory structure of a path"
|
||||||
type Directory {
|
type Directory {
|
||||||
path: String!
|
path: String!
|
||||||
parent: String
|
parent: String
|
||||||
directories: [String!]!
|
directories: [String!]!
|
||||||
}
|
}
|
||||||
|
|
||||||
"""Stash configuration details"""
|
"Stash configuration details"
|
||||||
input StashConfigInput {
|
input StashConfigInput {
|
||||||
path: String!
|
path: String!
|
||||||
excludeVideo: Boolean!
|
excludeVideo: Boolean!
|
||||||
|
|
|
||||||
|
|
@ -1,35 +1,33 @@
|
||||||
|
|
||||||
|
|
||||||
type DLNAIP {
|
type DLNAIP {
|
||||||
ipAddress: String!
|
ipAddress: String!
|
||||||
"""Time until IP will be no longer allowed/disallowed"""
|
"Time until IP will be no longer allowed/disallowed"
|
||||||
until: Time
|
until: Time
|
||||||
}
|
}
|
||||||
|
|
||||||
type DLNAStatus {
|
type DLNAStatus {
|
||||||
running: Boolean!
|
running: Boolean!
|
||||||
"""If not currently running, time until it will be started. If running, time until it will be stopped"""
|
"If not currently running, time until it will be started. If running, time until it will be stopped"
|
||||||
until: Time
|
until: Time
|
||||||
recentIPAddresses: [String!]!
|
recentIPAddresses: [String!]!
|
||||||
allowedIPAddresses: [DLNAIP!]!
|
allowedIPAddresses: [DLNAIP!]!
|
||||||
}
|
}
|
||||||
|
|
||||||
input EnableDLNAInput {
|
input EnableDLNAInput {
|
||||||
"""Duration to enable, in minutes. 0 or null for indefinite."""
|
"Duration to enable, in minutes. 0 or null for indefinite."
|
||||||
duration: Int
|
duration: Int
|
||||||
}
|
}
|
||||||
|
|
||||||
input DisableDLNAInput {
|
input DisableDLNAInput {
|
||||||
"""Duration to enable, in minutes. 0 or null for indefinite."""
|
"Duration to enable, in minutes. 0 or null for indefinite."
|
||||||
duration: Int
|
duration: Int
|
||||||
}
|
}
|
||||||
|
|
||||||
input AddTempDLNAIPInput {
|
input AddTempDLNAIPInput {
|
||||||
address: String!
|
address: String!
|
||||||
"""Duration to enable, in minutes. 0 or null for indefinite."""
|
"Duration to enable, in minutes. 0 or null for indefinite."
|
||||||
duration: Int
|
duration: Int
|
||||||
}
|
}
|
||||||
|
|
||||||
input RemoveTempDLNAIPInput {
|
input RemoveTempDLNAIPInput {
|
||||||
address: String!
|
address: String!
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,111 +1,111 @@
|
||||||
type Fingerprint {
|
type Fingerprint {
|
||||||
type: String!
|
type: String!
|
||||||
value: String!
|
value: String!
|
||||||
}
|
}
|
||||||
|
|
||||||
type Folder {
|
type Folder {
|
||||||
id: ID!
|
id: ID!
|
||||||
path: String!
|
path: String!
|
||||||
|
|
||||||
parent_folder_id: ID
|
parent_folder_id: ID
|
||||||
zip_file_id: ID
|
zip_file_id: ID
|
||||||
|
|
||||||
mod_time: Time!
|
mod_time: Time!
|
||||||
|
|
||||||
created_at: Time!
|
created_at: Time!
|
||||||
updated_at: Time!
|
updated_at: Time!
|
||||||
}
|
}
|
||||||
|
|
||||||
interface BaseFile {
|
interface BaseFile {
|
||||||
id: ID!
|
id: ID!
|
||||||
path: String!
|
path: String!
|
||||||
basename: String!
|
basename: String!
|
||||||
|
|
||||||
parent_folder_id: ID!
|
parent_folder_id: ID!
|
||||||
zip_file_id: ID
|
zip_file_id: ID
|
||||||
|
|
||||||
mod_time: Time!
|
mod_time: Time!
|
||||||
size: Int64!
|
size: Int64!
|
||||||
|
|
||||||
fingerprints: [Fingerprint!]!
|
fingerprints: [Fingerprint!]!
|
||||||
|
|
||||||
created_at: Time!
|
created_at: Time!
|
||||||
updated_at: Time!
|
updated_at: Time!
|
||||||
}
|
}
|
||||||
|
|
||||||
type VideoFile implements BaseFile {
|
type VideoFile implements BaseFile {
|
||||||
id: ID!
|
id: ID!
|
||||||
path: String!
|
path: String!
|
||||||
basename: String!
|
basename: String!
|
||||||
|
|
||||||
parent_folder_id: ID!
|
parent_folder_id: ID!
|
||||||
zip_file_id: ID
|
zip_file_id: ID
|
||||||
|
|
||||||
mod_time: Time!
|
mod_time: Time!
|
||||||
size: Int64!
|
size: Int64!
|
||||||
|
|
||||||
fingerprints: [Fingerprint!]!
|
fingerprints: [Fingerprint!]!
|
||||||
|
|
||||||
format: String!
|
format: String!
|
||||||
width: Int!
|
width: Int!
|
||||||
height: Int!
|
height: Int!
|
||||||
duration: Float!
|
duration: Float!
|
||||||
video_codec: String!
|
video_codec: String!
|
||||||
audio_codec: String!
|
audio_codec: String!
|
||||||
frame_rate: Float!
|
frame_rate: Float!
|
||||||
bit_rate: Int!
|
bit_rate: Int!
|
||||||
|
|
||||||
created_at: Time!
|
created_at: Time!
|
||||||
updated_at: Time!
|
updated_at: Time!
|
||||||
}
|
}
|
||||||
|
|
||||||
type ImageFile implements BaseFile {
|
type ImageFile implements BaseFile {
|
||||||
id: ID!
|
id: ID!
|
||||||
path: String!
|
path: String!
|
||||||
basename: String!
|
basename: String!
|
||||||
|
|
||||||
parent_folder_id: ID!
|
parent_folder_id: ID!
|
||||||
zip_file_id: ID
|
zip_file_id: ID
|
||||||
|
|
||||||
mod_time: Time!
|
mod_time: Time!
|
||||||
size: Int64!
|
size: Int64!
|
||||||
|
|
||||||
fingerprints: [Fingerprint!]!
|
fingerprints: [Fingerprint!]!
|
||||||
|
|
||||||
width: Int!
|
width: Int!
|
||||||
height: Int!
|
height: Int!
|
||||||
|
|
||||||
created_at: Time!
|
created_at: Time!
|
||||||
updated_at: Time!
|
updated_at: Time!
|
||||||
}
|
}
|
||||||
|
|
||||||
union VisualFile = VideoFile | ImageFile
|
union VisualFile = VideoFile | ImageFile
|
||||||
|
|
||||||
type GalleryFile implements BaseFile {
|
type GalleryFile implements BaseFile {
|
||||||
id: ID!
|
id: ID!
|
||||||
path: String!
|
path: String!
|
||||||
basename: String!
|
basename: String!
|
||||||
|
|
||||||
parent_folder_id: ID!
|
parent_folder_id: ID!
|
||||||
zip_file_id: ID
|
zip_file_id: ID
|
||||||
|
|
||||||
mod_time: Time!
|
mod_time: Time!
|
||||||
size: Int64!
|
size: Int64!
|
||||||
|
|
||||||
fingerprints: [Fingerprint!]!
|
fingerprints: [Fingerprint!]!
|
||||||
|
|
||||||
created_at: Time!
|
created_at: Time!
|
||||||
updated_at: Time!
|
updated_at: Time!
|
||||||
}
|
}
|
||||||
|
|
||||||
input MoveFilesInput {
|
input MoveFilesInput {
|
||||||
ids: [ID!]!
|
ids: [ID!]!
|
||||||
"""valid for single or multiple file ids"""
|
"valid for single or multiple file ids"
|
||||||
destination_folder: String
|
destination_folder: String
|
||||||
|
|
||||||
"""valid for single or multiple file ids"""
|
"valid for single or multiple file ids"
|
||||||
destination_folder_id: ID
|
destination_folder_id: ID
|
||||||
|
|
||||||
"""valid only for single file id. If empty, existing basename is used"""
|
"valid only for single file id. If empty, existing basename is used"
|
||||||
destination_basename: String
|
destination_basename: String
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -6,28 +6,43 @@ enum SortDirectionEnum {
|
||||||
input FindFilterType {
|
input FindFilterType {
|
||||||
q: String
|
q: String
|
||||||
page: Int
|
page: Int
|
||||||
"""use per_page = -1 to indicate all results. Defaults to 25."""
|
"use per_page = -1 to indicate all results. Defaults to 25."
|
||||||
per_page: Int
|
per_page: Int
|
||||||
sort: String
|
sort: String
|
||||||
direction: SortDirectionEnum
|
direction: SortDirectionEnum
|
||||||
}
|
}
|
||||||
|
|
||||||
enum ResolutionEnum {
|
enum ResolutionEnum {
|
||||||
"144p", VERY_LOW
|
"144p"
|
||||||
"240p", LOW
|
VERY_LOW
|
||||||
"360p", R360P
|
"240p"
|
||||||
"480p", STANDARD
|
LOW
|
||||||
"540p", WEB_HD
|
"360p"
|
||||||
"720p", STANDARD_HD
|
R360P
|
||||||
"1080p", FULL_HD
|
"480p"
|
||||||
"1440p", QUAD_HD
|
STANDARD
|
||||||
"1920p", VR_HD @deprecated(reason: "Use 4K instead")
|
"540p"
|
||||||
"4K", FOUR_K
|
WEB_HD
|
||||||
"5K", FIVE_K
|
"720p"
|
||||||
"6K", SIX_K
|
STANDARD_HD
|
||||||
"7K", SEVEN_K
|
"1080p"
|
||||||
"8K", EIGHT_K
|
FULL_HD
|
||||||
"8K+", HUGE
|
"1440p"
|
||||||
|
QUAD_HD
|
||||||
|
"1920p"
|
||||||
|
VR_HD @deprecated(reason: "Use 4K instead")
|
||||||
|
"4K"
|
||||||
|
FOUR_K
|
||||||
|
"5K"
|
||||||
|
FIVE_K
|
||||||
|
"6K"
|
||||||
|
SIX_K
|
||||||
|
"7K"
|
||||||
|
SEVEN_K
|
||||||
|
"8K"
|
||||||
|
EIGHT_K
|
||||||
|
"8K+"
|
||||||
|
HUGE
|
||||||
}
|
}
|
||||||
|
|
||||||
input ResolutionCriterionInput {
|
input ResolutionCriterionInput {
|
||||||
|
|
@ -37,13 +52,15 @@ input ResolutionCriterionInput {
|
||||||
|
|
||||||
input PHashDuplicationCriterionInput {
|
input PHashDuplicationCriterionInput {
|
||||||
duplicated: Boolean
|
duplicated: Boolean
|
||||||
"""Currently unimplemented"""
|
"Currently unimplemented"
|
||||||
distance: Int
|
distance: Int
|
||||||
}
|
}
|
||||||
|
|
||||||
input StashIDCriterionInput {
|
input StashIDCriterionInput {
|
||||||
"""If present, this value is treated as a predicate.
|
"""
|
||||||
That is, it will filter based on stash_ids with the matching endpoint"""
|
If present, this value is treated as a predicate.
|
||||||
|
That is, it will filter based on stash_ids with the matching endpoint
|
||||||
|
"""
|
||||||
endpoint: String
|
endpoint: String
|
||||||
stash_id: String
|
stash_id: String
|
||||||
modifier: CriterionModifier!
|
modifier: CriterionModifier!
|
||||||
|
|
@ -58,104 +75,106 @@ input PerformerFilterType {
|
||||||
disambiguation: StringCriterionInput
|
disambiguation: StringCriterionInput
|
||||||
details: StringCriterionInput
|
details: StringCriterionInput
|
||||||
|
|
||||||
"""Filter by favorite"""
|
"Filter by favorite"
|
||||||
filter_favorites: Boolean
|
filter_favorites: Boolean
|
||||||
"""Filter by birth year"""
|
"Filter by birth year"
|
||||||
birth_year: IntCriterionInput
|
birth_year: IntCriterionInput
|
||||||
"""Filter by age"""
|
"Filter by age"
|
||||||
age: IntCriterionInput
|
age: IntCriterionInput
|
||||||
"""Filter by ethnicity"""
|
"Filter by ethnicity"
|
||||||
ethnicity: StringCriterionInput
|
ethnicity: StringCriterionInput
|
||||||
"""Filter by country"""
|
"Filter by country"
|
||||||
country: StringCriterionInput
|
country: StringCriterionInput
|
||||||
"""Filter by eye color"""
|
"Filter by eye color"
|
||||||
eye_color: StringCriterionInput
|
eye_color: StringCriterionInput
|
||||||
"""Filter by height"""
|
"Filter by height"
|
||||||
height: StringCriterionInput @deprecated(reason: "Use height_cm instead")
|
height: StringCriterionInput @deprecated(reason: "Use height_cm instead")
|
||||||
"""Filter by height in cm"""
|
"Filter by height in cm"
|
||||||
height_cm: IntCriterionInput
|
height_cm: IntCriterionInput
|
||||||
"""Filter by measurements"""
|
"Filter by measurements"
|
||||||
measurements: StringCriterionInput
|
measurements: StringCriterionInput
|
||||||
"""Filter by fake tits value"""
|
"Filter by fake tits value"
|
||||||
fake_tits: StringCriterionInput
|
fake_tits: StringCriterionInput
|
||||||
"""Filter by penis length value"""
|
"Filter by penis length value"
|
||||||
penis_length: FloatCriterionInput
|
penis_length: FloatCriterionInput
|
||||||
"""Filter by ciricumcision"""
|
"Filter by ciricumcision"
|
||||||
circumcised: CircumcisionCriterionInput
|
circumcised: CircumcisionCriterionInput
|
||||||
"""Filter by career length"""
|
"Filter by career length"
|
||||||
career_length: StringCriterionInput
|
career_length: StringCriterionInput
|
||||||
"""Filter by tattoos"""
|
"Filter by tattoos"
|
||||||
tattoos: StringCriterionInput
|
tattoos: StringCriterionInput
|
||||||
"""Filter by piercings"""
|
"Filter by piercings"
|
||||||
piercings: StringCriterionInput
|
piercings: StringCriterionInput
|
||||||
"""Filter by aliases"""
|
"Filter by aliases"
|
||||||
aliases: StringCriterionInput
|
aliases: StringCriterionInput
|
||||||
"""Filter by gender"""
|
"Filter by gender"
|
||||||
gender: GenderCriterionInput
|
gender: GenderCriterionInput
|
||||||
"""Filter to only include performers missing this property"""
|
"Filter to only include performers missing this property"
|
||||||
is_missing: String
|
is_missing: String
|
||||||
"""Filter to only include performers with these tags"""
|
"Filter to only include performers with these tags"
|
||||||
tags: HierarchicalMultiCriterionInput
|
tags: HierarchicalMultiCriterionInput
|
||||||
"""Filter by tag count"""
|
"Filter by tag count"
|
||||||
tag_count: IntCriterionInput
|
tag_count: IntCriterionInput
|
||||||
"""Filter by scene count"""
|
"Filter by scene count"
|
||||||
scene_count: IntCriterionInput
|
scene_count: IntCriterionInput
|
||||||
"""Filter by image count"""
|
"Filter by image count"
|
||||||
image_count: IntCriterionInput
|
image_count: IntCriterionInput
|
||||||
"""Filter by gallery count"""
|
"Filter by gallery count"
|
||||||
gallery_count: IntCriterionInput
|
gallery_count: IntCriterionInput
|
||||||
"""Filter by o count"""
|
"Filter by o count"
|
||||||
o_counter: IntCriterionInput
|
o_counter: IntCriterionInput
|
||||||
"""Filter by StashID"""
|
"Filter by StashID"
|
||||||
stash_id: StringCriterionInput @deprecated(reason: "Use stash_id_endpoint instead")
|
stash_id: StringCriterionInput
|
||||||
"""Filter by StashID"""
|
@deprecated(reason: "Use stash_id_endpoint instead")
|
||||||
|
"Filter by StashID"
|
||||||
stash_id_endpoint: StashIDCriterionInput
|
stash_id_endpoint: StashIDCriterionInput
|
||||||
"""Filter by rating"""
|
"Filter by rating"
|
||||||
rating: IntCriterionInput @deprecated(reason: "Use 1-100 range with rating100")
|
rating: IntCriterionInput
|
||||||
|
@deprecated(reason: "Use 1-100 range with rating100")
|
||||||
# rating expressed as 1-100
|
# rating expressed as 1-100
|
||||||
rating100: IntCriterionInput
|
rating100: IntCriterionInput
|
||||||
"""Filter by url"""
|
"Filter by url"
|
||||||
url: StringCriterionInput
|
url: StringCriterionInput
|
||||||
"""Filter by hair color"""
|
"Filter by hair color"
|
||||||
hair_color: StringCriterionInput
|
hair_color: StringCriterionInput
|
||||||
"""Filter by weight"""
|
"Filter by weight"
|
||||||
weight: IntCriterionInput
|
weight: IntCriterionInput
|
||||||
"""Filter by death year"""
|
"Filter by death year"
|
||||||
death_year: IntCriterionInput
|
death_year: IntCriterionInput
|
||||||
"""Filter by studios where performer appears in scene/image/gallery"""
|
"Filter by studios where performer appears in scene/image/gallery"
|
||||||
studios: HierarchicalMultiCriterionInput
|
studios: HierarchicalMultiCriterionInput
|
||||||
"""Filter by performers where performer appears with another performer in scene/image/gallery"""
|
"Filter by performers where performer appears with another performer in scene/image/gallery"
|
||||||
performers: MultiCriterionInput
|
performers: MultiCriterionInput
|
||||||
"""Filter by autotag ignore value"""
|
"Filter by autotag ignore value"
|
||||||
ignore_auto_tag: Boolean
|
ignore_auto_tag: Boolean
|
||||||
"""Filter by birthdate"""
|
"Filter by birthdate"
|
||||||
birthdate: DateCriterionInput
|
birthdate: DateCriterionInput
|
||||||
"""Filter by death date"""
|
"Filter by death date"
|
||||||
death_date: DateCriterionInput
|
death_date: DateCriterionInput
|
||||||
"""Filter by creation time"""
|
"Filter by creation time"
|
||||||
created_at: TimestampCriterionInput
|
created_at: TimestampCriterionInput
|
||||||
"""Filter by last update time"""
|
"Filter by last update time"
|
||||||
updated_at: TimestampCriterionInput
|
updated_at: TimestampCriterionInput
|
||||||
}
|
}
|
||||||
|
|
||||||
input SceneMarkerFilterType {
|
input SceneMarkerFilterType {
|
||||||
"""Filter to only include scene markers with this tag"""
|
"Filter to only include scene markers with this tag"
|
||||||
tag_id: ID @deprecated(reason: "use tags filter instead")
|
tag_id: ID @deprecated(reason: "use tags filter instead")
|
||||||
"""Filter to only include scene markers with these tags"""
|
"Filter to only include scene markers with these tags"
|
||||||
tags: HierarchicalMultiCriterionInput
|
tags: HierarchicalMultiCriterionInput
|
||||||
"""Filter to only include scene markers attached to a scene with these tags"""
|
"Filter to only include scene markers attached to a scene with these tags"
|
||||||
scene_tags: HierarchicalMultiCriterionInput
|
scene_tags: HierarchicalMultiCriterionInput
|
||||||
"""Filter to only include scene markers with these performers"""
|
"Filter to only include scene markers with these performers"
|
||||||
performers: MultiCriterionInput
|
performers: MultiCriterionInput
|
||||||
"""Filter by creation time"""
|
"Filter by creation time"
|
||||||
created_at: TimestampCriterionInput
|
created_at: TimestampCriterionInput
|
||||||
"""Filter by last update time"""
|
"Filter by last update time"
|
||||||
updated_at: TimestampCriterionInput
|
updated_at: TimestampCriterionInput
|
||||||
"""Filter by scene date"""
|
"Filter by scene date"
|
||||||
scene_date: DateCriterionInput
|
scene_date: DateCriterionInput
|
||||||
"""Filter by cscene reation time"""
|
"Filter by cscene reation time"
|
||||||
scene_created_at: TimestampCriterionInput
|
scene_created_at: TimestampCriterionInput
|
||||||
"""Filter by lscene ast update time"""
|
"Filter by lscene ast update time"
|
||||||
scene_updated_at: TimestampCriterionInput
|
scene_updated_at: TimestampCriterionInput
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -170,109 +189,111 @@ input SceneFilterType {
|
||||||
details: StringCriterionInput
|
details: StringCriterionInput
|
||||||
director: StringCriterionInput
|
director: StringCriterionInput
|
||||||
|
|
||||||
"""Filter by file oshash"""
|
"Filter by file oshash"
|
||||||
oshash: StringCriterionInput
|
oshash: StringCriterionInput
|
||||||
"""Filter by file checksum"""
|
"Filter by file checksum"
|
||||||
checksum: StringCriterionInput
|
checksum: StringCriterionInput
|
||||||
"""Filter by file phash"""
|
"Filter by file phash"
|
||||||
phash: StringCriterionInput @deprecated(reason: "Use phash_distance instead")
|
phash: StringCriterionInput @deprecated(reason: "Use phash_distance instead")
|
||||||
"""Filter by file phash distance"""
|
"Filter by file phash distance"
|
||||||
phash_distance: PhashDistanceCriterionInput
|
phash_distance: PhashDistanceCriterionInput
|
||||||
"""Filter by path"""
|
"Filter by path"
|
||||||
path: StringCriterionInput
|
path: StringCriterionInput
|
||||||
"""Filter by file count"""
|
"Filter by file count"
|
||||||
file_count: IntCriterionInput
|
file_count: IntCriterionInput
|
||||||
"""Filter by rating"""
|
"Filter by rating"
|
||||||
rating: IntCriterionInput @deprecated(reason: "Use 1-100 range with rating100")
|
rating: IntCriterionInput
|
||||||
|
@deprecated(reason: "Use 1-100 range with rating100")
|
||||||
# rating expressed as 1-100
|
# rating expressed as 1-100
|
||||||
rating100: IntCriterionInput
|
rating100: IntCriterionInput
|
||||||
"""Filter by organized"""
|
"Filter by organized"
|
||||||
organized: Boolean
|
organized: Boolean
|
||||||
"""Filter by o-counter"""
|
"Filter by o-counter"
|
||||||
o_counter: IntCriterionInput
|
o_counter: IntCriterionInput
|
||||||
"""Filter Scenes that have an exact phash match available"""
|
"Filter Scenes that have an exact phash match available"
|
||||||
duplicated: PHashDuplicationCriterionInput
|
duplicated: PHashDuplicationCriterionInput
|
||||||
"""Filter by resolution"""
|
"Filter by resolution"
|
||||||
resolution: ResolutionCriterionInput
|
resolution: ResolutionCriterionInput
|
||||||
"""Filter by video codec"""
|
"Filter by video codec"
|
||||||
video_codec: StringCriterionInput
|
video_codec: StringCriterionInput
|
||||||
"""Filter by audio codec"""
|
"Filter by audio codec"
|
||||||
audio_codec: StringCriterionInput
|
audio_codec: StringCriterionInput
|
||||||
"""Filter by duration (in seconds)"""
|
"Filter by duration (in seconds)"
|
||||||
duration: IntCriterionInput
|
duration: IntCriterionInput
|
||||||
"""Filter to only include scenes which have markers. `true` or `false`"""
|
"Filter to only include scenes which have markers. `true` or `false`"
|
||||||
has_markers: String
|
has_markers: String
|
||||||
"""Filter to only include scenes missing this property"""
|
"Filter to only include scenes missing this property"
|
||||||
is_missing: String
|
is_missing: String
|
||||||
"""Filter to only include scenes with this studio"""
|
"Filter to only include scenes with this studio"
|
||||||
studios: HierarchicalMultiCriterionInput
|
studios: HierarchicalMultiCriterionInput
|
||||||
"""Filter to only include scenes with this movie"""
|
"Filter to only include scenes with this movie"
|
||||||
movies: MultiCriterionInput
|
movies: MultiCriterionInput
|
||||||
"""Filter to only include scenes with these tags"""
|
"Filter to only include scenes with these tags"
|
||||||
tags: HierarchicalMultiCriterionInput
|
tags: HierarchicalMultiCriterionInput
|
||||||
"""Filter by tag count"""
|
"Filter by tag count"
|
||||||
tag_count: IntCriterionInput
|
tag_count: IntCriterionInput
|
||||||
"""Filter to only include scenes with performers with these tags"""
|
"Filter to only include scenes with performers with these tags"
|
||||||
performer_tags: HierarchicalMultiCriterionInput
|
performer_tags: HierarchicalMultiCriterionInput
|
||||||
"""Filter scenes that have performers that have been favorited"""
|
"Filter scenes that have performers that have been favorited"
|
||||||
performer_favorite: Boolean
|
performer_favorite: Boolean
|
||||||
"""Filter scenes by performer age at time of scene"""
|
"Filter scenes by performer age at time of scene"
|
||||||
performer_age: IntCriterionInput
|
performer_age: IntCriterionInput
|
||||||
"""Filter to only include scenes with these performers"""
|
"Filter to only include scenes with these performers"
|
||||||
performers: MultiCriterionInput
|
performers: MultiCriterionInput
|
||||||
"""Filter by performer count"""
|
"Filter by performer count"
|
||||||
performer_count: IntCriterionInput
|
performer_count: IntCriterionInput
|
||||||
"""Filter by StashID"""
|
"Filter by StashID"
|
||||||
stash_id: StringCriterionInput @deprecated(reason: "Use stash_id_endpoint instead")
|
stash_id: StringCriterionInput
|
||||||
"""Filter by StashID"""
|
@deprecated(reason: "Use stash_id_endpoint instead")
|
||||||
|
"Filter by StashID"
|
||||||
stash_id_endpoint: StashIDCriterionInput
|
stash_id_endpoint: StashIDCriterionInput
|
||||||
"""Filter by url"""
|
"Filter by url"
|
||||||
url: StringCriterionInput
|
url: StringCriterionInput
|
||||||
"""Filter by interactive"""
|
"Filter by interactive"
|
||||||
interactive: Boolean
|
interactive: Boolean
|
||||||
"""Filter by InteractiveSpeed"""
|
"Filter by InteractiveSpeed"
|
||||||
interactive_speed: IntCriterionInput
|
interactive_speed: IntCriterionInput
|
||||||
"""Filter by captions"""
|
"Filter by captions"
|
||||||
captions: StringCriterionInput
|
captions: StringCriterionInput
|
||||||
"""Filter by resume time"""
|
"Filter by resume time"
|
||||||
resume_time: IntCriterionInput
|
resume_time: IntCriterionInput
|
||||||
"""Filter by play count"""
|
"Filter by play count"
|
||||||
play_count: IntCriterionInput
|
play_count: IntCriterionInput
|
||||||
"""Filter by play duration (in seconds)"""
|
"Filter by play duration (in seconds)"
|
||||||
play_duration: IntCriterionInput
|
play_duration: IntCriterionInput
|
||||||
"""Filter by date"""
|
"Filter by date"
|
||||||
date: DateCriterionInput
|
date: DateCriterionInput
|
||||||
"""Filter by creation time"""
|
"Filter by creation time"
|
||||||
created_at: TimestampCriterionInput
|
created_at: TimestampCriterionInput
|
||||||
"""Filter by last update time"""
|
"Filter by last update time"
|
||||||
updated_at: TimestampCriterionInput
|
updated_at: TimestampCriterionInput
|
||||||
}
|
}
|
||||||
|
|
||||||
input MovieFilterType {
|
input MovieFilterType {
|
||||||
|
|
||||||
name: StringCriterionInput
|
name: StringCriterionInput
|
||||||
director: StringCriterionInput
|
director: StringCriterionInput
|
||||||
synopsis: StringCriterionInput
|
synopsis: StringCriterionInput
|
||||||
|
|
||||||
"""Filter by duration (in seconds)"""
|
"Filter by duration (in seconds)"
|
||||||
duration: IntCriterionInput
|
duration: IntCriterionInput
|
||||||
"""Filter by rating"""
|
"Filter by rating"
|
||||||
rating: IntCriterionInput @deprecated(reason: "Use 1-100 range with rating100")
|
rating: IntCriterionInput
|
||||||
|
@deprecated(reason: "Use 1-100 range with rating100")
|
||||||
# rating expressed as 1-100
|
# rating expressed as 1-100
|
||||||
rating100: IntCriterionInput
|
rating100: IntCriterionInput
|
||||||
"""Filter to only include movies with this studio"""
|
"Filter to only include movies with this studio"
|
||||||
studios: HierarchicalMultiCriterionInput
|
studios: HierarchicalMultiCriterionInput
|
||||||
"""Filter to only include movies missing this property"""
|
"Filter to only include movies missing this property"
|
||||||
is_missing: String
|
is_missing: String
|
||||||
"""Filter by url"""
|
"Filter by url"
|
||||||
url: StringCriterionInput
|
url: StringCriterionInput
|
||||||
"""Filter to only include movies where performer appears in a scene"""
|
"Filter to only include movies where performer appears in a scene"
|
||||||
performers: MultiCriterionInput
|
performers: MultiCriterionInput
|
||||||
"""Filter by date"""
|
"Filter by date"
|
||||||
date: DateCriterionInput
|
date: DateCriterionInput
|
||||||
"""Filter by creation time"""
|
"Filter by creation time"
|
||||||
created_at: TimestampCriterionInput
|
created_at: TimestampCriterionInput
|
||||||
"""Filter by last update time"""
|
"Filter by last update time"
|
||||||
updated_at: TimestampCriterionInput
|
updated_at: TimestampCriterionInput
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -283,33 +304,35 @@ input StudioFilterType {
|
||||||
|
|
||||||
name: StringCriterionInput
|
name: StringCriterionInput
|
||||||
details: StringCriterionInput
|
details: StringCriterionInput
|
||||||
"""Filter to only include studios with this parent studio"""
|
"Filter to only include studios with this parent studio"
|
||||||
parents: MultiCriterionInput
|
parents: MultiCriterionInput
|
||||||
"""Filter by StashID"""
|
"Filter by StashID"
|
||||||
stash_id: StringCriterionInput @deprecated(reason: "Use stash_id_endpoint instead")
|
stash_id: StringCriterionInput
|
||||||
"""Filter by StashID"""
|
@deprecated(reason: "Use stash_id_endpoint instead")
|
||||||
|
"Filter by StashID"
|
||||||
stash_id_endpoint: StashIDCriterionInput
|
stash_id_endpoint: StashIDCriterionInput
|
||||||
"""Filter to only include studios missing this property"""
|
"Filter to only include studios missing this property"
|
||||||
is_missing: String
|
is_missing: String
|
||||||
"""Filter by rating"""
|
"Filter by rating"
|
||||||
rating: IntCriterionInput @deprecated(reason: "Use 1-100 range with rating100")
|
rating: IntCriterionInput
|
||||||
|
@deprecated(reason: "Use 1-100 range with rating100")
|
||||||
# rating expressed as 1-100
|
# rating expressed as 1-100
|
||||||
rating100: IntCriterionInput
|
rating100: IntCriterionInput
|
||||||
"""Filter by scene count"""
|
"Filter by scene count"
|
||||||
scene_count: IntCriterionInput
|
scene_count: IntCriterionInput
|
||||||
"""Filter by image count"""
|
"Filter by image count"
|
||||||
image_count: IntCriterionInput
|
image_count: IntCriterionInput
|
||||||
"""Filter by gallery count"""
|
"Filter by gallery count"
|
||||||
gallery_count: IntCriterionInput
|
gallery_count: IntCriterionInput
|
||||||
"""Filter by url"""
|
"Filter by url"
|
||||||
url: StringCriterionInput
|
url: StringCriterionInput
|
||||||
"""Filter by studio aliases"""
|
"Filter by studio aliases"
|
||||||
aliases: StringCriterionInput
|
aliases: StringCriterionInput
|
||||||
"""Filter by autotag ignore value"""
|
"Filter by autotag ignore value"
|
||||||
ignore_auto_tag: Boolean
|
ignore_auto_tag: Boolean
|
||||||
"""Filter by creation time"""
|
"Filter by creation time"
|
||||||
created_at: TimestampCriterionInput
|
created_at: TimestampCriterionInput
|
||||||
"""Filter by last update time"""
|
"Filter by last update time"
|
||||||
updated_at: TimestampCriterionInput
|
updated_at: TimestampCriterionInput
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -322,51 +345,52 @@ input GalleryFilterType {
|
||||||
title: StringCriterionInput
|
title: StringCriterionInput
|
||||||
details: StringCriterionInput
|
details: StringCriterionInput
|
||||||
|
|
||||||
"""Filter by file checksum"""
|
"Filter by file checksum"
|
||||||
checksum: StringCriterionInput
|
checksum: StringCriterionInput
|
||||||
"""Filter by path"""
|
"Filter by path"
|
||||||
path: StringCriterionInput
|
path: StringCriterionInput
|
||||||
"""Filter by zip-file count"""
|
"Filter by zip-file count"
|
||||||
file_count: IntCriterionInput
|
file_count: IntCriterionInput
|
||||||
"""Filter to only include galleries missing this property"""
|
"Filter to only include galleries missing this property"
|
||||||
is_missing: String
|
is_missing: String
|
||||||
"""Filter to include/exclude galleries that were created from zip"""
|
"Filter to include/exclude galleries that were created from zip"
|
||||||
is_zip: Boolean
|
is_zip: Boolean
|
||||||
"""Filter by rating"""
|
"Filter by rating"
|
||||||
rating: IntCriterionInput @deprecated(reason: "Use 1-100 range with rating100")
|
rating: IntCriterionInput
|
||||||
|
@deprecated(reason: "Use 1-100 range with rating100")
|
||||||
# rating expressed as 1-100
|
# rating expressed as 1-100
|
||||||
rating100: IntCriterionInput
|
rating100: IntCriterionInput
|
||||||
"""Filter by organized"""
|
"Filter by organized"
|
||||||
organized: Boolean
|
organized: Boolean
|
||||||
"""Filter by average image resolution"""
|
"Filter by average image resolution"
|
||||||
average_resolution: ResolutionCriterionInput
|
average_resolution: ResolutionCriterionInput
|
||||||
"""Filter to only include galleries that have chapters. `true` or `false`"""
|
"Filter to only include galleries that have chapters. `true` or `false`"
|
||||||
has_chapters: String
|
has_chapters: String
|
||||||
"""Filter to only include galleries with this studio"""
|
"Filter to only include galleries with this studio"
|
||||||
studios: HierarchicalMultiCriterionInput
|
studios: HierarchicalMultiCriterionInput
|
||||||
"""Filter to only include galleries with these tags"""
|
"Filter to only include galleries with these tags"
|
||||||
tags: HierarchicalMultiCriterionInput
|
tags: HierarchicalMultiCriterionInput
|
||||||
"""Filter by tag count"""
|
"Filter by tag count"
|
||||||
tag_count: IntCriterionInput
|
tag_count: IntCriterionInput
|
||||||
"""Filter to only include galleries with performers with these tags"""
|
"Filter to only include galleries with performers with these tags"
|
||||||
performer_tags: HierarchicalMultiCriterionInput
|
performer_tags: HierarchicalMultiCriterionInput
|
||||||
"""Filter to only include galleries with these performers"""
|
"Filter to only include galleries with these performers"
|
||||||
performers: MultiCriterionInput
|
performers: MultiCriterionInput
|
||||||
"""Filter by performer count"""
|
"Filter by performer count"
|
||||||
performer_count: IntCriterionInput
|
performer_count: IntCriterionInput
|
||||||
"""Filter galleries that have performers that have been favorited"""
|
"Filter galleries that have performers that have been favorited"
|
||||||
performer_favorite: Boolean
|
performer_favorite: Boolean
|
||||||
"""Filter galleries by performer age at time of gallery"""
|
"Filter galleries by performer age at time of gallery"
|
||||||
performer_age: IntCriterionInput
|
performer_age: IntCriterionInput
|
||||||
"""Filter by number of images in this gallery"""
|
"Filter by number of images in this gallery"
|
||||||
image_count: IntCriterionInput
|
image_count: IntCriterionInput
|
||||||
"""Filter by url"""
|
"Filter by url"
|
||||||
url: StringCriterionInput
|
url: StringCriterionInput
|
||||||
"""Filter by date"""
|
"Filter by date"
|
||||||
date: DateCriterionInput
|
date: DateCriterionInput
|
||||||
"""Filter by creation time"""
|
"Filter by creation time"
|
||||||
created_at: TimestampCriterionInput
|
created_at: TimestampCriterionInput
|
||||||
"""Filter by last update time"""
|
"Filter by last update time"
|
||||||
updated_at: TimestampCriterionInput
|
updated_at: TimestampCriterionInput
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -375,52 +399,52 @@ input TagFilterType {
|
||||||
OR: TagFilterType
|
OR: TagFilterType
|
||||||
NOT: TagFilterType
|
NOT: TagFilterType
|
||||||
|
|
||||||
"""Filter by tag name"""
|
"Filter by tag name"
|
||||||
name: StringCriterionInput
|
name: StringCriterionInput
|
||||||
|
|
||||||
"""Filter by tag aliases"""
|
"Filter by tag aliases"
|
||||||
aliases: StringCriterionInput
|
aliases: StringCriterionInput
|
||||||
|
|
||||||
"""Filter by tag description"""
|
"Filter by tag description"
|
||||||
description: StringCriterionInput
|
description: StringCriterionInput
|
||||||
|
|
||||||
"""Filter to only include tags missing this property"""
|
"Filter to only include tags missing this property"
|
||||||
is_missing: String
|
is_missing: String
|
||||||
|
|
||||||
"""Filter by number of scenes with this tag"""
|
"Filter by number of scenes with this tag"
|
||||||
scene_count: IntCriterionInput
|
scene_count: IntCriterionInput
|
||||||
|
|
||||||
"""Filter by number of images with this tag"""
|
"Filter by number of images with this tag"
|
||||||
image_count: IntCriterionInput
|
image_count: IntCriterionInput
|
||||||
|
|
||||||
"""Filter by number of galleries with this tag"""
|
"Filter by number of galleries with this tag"
|
||||||
gallery_count: IntCriterionInput
|
gallery_count: IntCriterionInput
|
||||||
|
|
||||||
"""Filter by number of performers with this tag"""
|
"Filter by number of performers with this tag"
|
||||||
performer_count: IntCriterionInput
|
performer_count: IntCriterionInput
|
||||||
|
|
||||||
"""Filter by number of markers with this tag"""
|
"Filter by number of markers with this tag"
|
||||||
marker_count: IntCriterionInput
|
marker_count: IntCriterionInput
|
||||||
|
|
||||||
"""Filter by parent tags"""
|
"Filter by parent tags"
|
||||||
parents: HierarchicalMultiCriterionInput
|
parents: HierarchicalMultiCriterionInput
|
||||||
|
|
||||||
"""Filter by child tags"""
|
"Filter by child tags"
|
||||||
children: HierarchicalMultiCriterionInput
|
children: HierarchicalMultiCriterionInput
|
||||||
|
|
||||||
"""Filter by number of parent tags the tag has"""
|
"Filter by number of parent tags the tag has"
|
||||||
parent_count: IntCriterionInput
|
parent_count: IntCriterionInput
|
||||||
|
|
||||||
"""Filter by number f child tags the tag has"""
|
"Filter by number f child tags the tag has"
|
||||||
child_count: IntCriterionInput
|
child_count: IntCriterionInput
|
||||||
|
|
||||||
"""Filter by autotag ignore value"""
|
"Filter by autotag ignore value"
|
||||||
ignore_auto_tag: Boolean
|
ignore_auto_tag: Boolean
|
||||||
|
|
||||||
"""Filter by creation time"""
|
"Filter by creation time"
|
||||||
created_at: TimestampCriterionInput
|
created_at: TimestampCriterionInput
|
||||||
|
|
||||||
"""Filter by last update time"""
|
"Filter by last update time"
|
||||||
updated_at: TimestampCriterionInput
|
updated_at: TimestampCriterionInput
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -431,77 +455,78 @@ input ImageFilterType {
|
||||||
|
|
||||||
title: StringCriterionInput
|
title: StringCriterionInput
|
||||||
|
|
||||||
""" Filter by image id"""
|
" Filter by image id"
|
||||||
id: IntCriterionInput
|
id: IntCriterionInput
|
||||||
"""Filter by file checksum"""
|
"Filter by file checksum"
|
||||||
checksum: StringCriterionInput
|
checksum: StringCriterionInput
|
||||||
"""Filter by path"""
|
"Filter by path"
|
||||||
path: StringCriterionInput
|
path: StringCriterionInput
|
||||||
"""Filter by file count"""
|
"Filter by file count"
|
||||||
file_count: IntCriterionInput
|
file_count: IntCriterionInput
|
||||||
"""Filter by rating"""
|
"Filter by rating"
|
||||||
rating: IntCriterionInput @deprecated(reason: "Use 1-100 range with rating100")
|
rating: IntCriterionInput
|
||||||
|
@deprecated(reason: "Use 1-100 range with rating100")
|
||||||
# rating expressed as 1-100
|
# rating expressed as 1-100
|
||||||
rating100: IntCriterionInput
|
rating100: IntCriterionInput
|
||||||
"""Filter by date"""
|
"Filter by date"
|
||||||
date: DateCriterionInput
|
date: DateCriterionInput
|
||||||
"""Filter by url"""
|
"Filter by url"
|
||||||
url: StringCriterionInput
|
url: StringCriterionInput
|
||||||
"""Filter by organized"""
|
"Filter by organized"
|
||||||
organized: Boolean
|
organized: Boolean
|
||||||
"""Filter by o-counter"""
|
"Filter by o-counter"
|
||||||
o_counter: IntCriterionInput
|
o_counter: IntCriterionInput
|
||||||
"""Filter by resolution"""
|
"Filter by resolution"
|
||||||
resolution: ResolutionCriterionInput
|
resolution: ResolutionCriterionInput
|
||||||
"""Filter to only include images missing this property"""
|
"Filter to only include images missing this property"
|
||||||
is_missing: String
|
is_missing: String
|
||||||
"""Filter to only include images with this studio"""
|
"Filter to only include images with this studio"
|
||||||
studios: HierarchicalMultiCriterionInput
|
studios: HierarchicalMultiCriterionInput
|
||||||
"""Filter to only include images with these tags"""
|
"Filter to only include images with these tags"
|
||||||
tags: HierarchicalMultiCriterionInput
|
tags: HierarchicalMultiCriterionInput
|
||||||
"""Filter by tag count"""
|
"Filter by tag count"
|
||||||
tag_count: IntCriterionInput
|
tag_count: IntCriterionInput
|
||||||
"""Filter to only include images with performers with these tags"""
|
"Filter to only include images with performers with these tags"
|
||||||
performer_tags: HierarchicalMultiCriterionInput
|
performer_tags: HierarchicalMultiCriterionInput
|
||||||
"""Filter to only include images with these performers"""
|
"Filter to only include images with these performers"
|
||||||
performers: MultiCriterionInput
|
performers: MultiCriterionInput
|
||||||
"""Filter by performer count"""
|
"Filter by performer count"
|
||||||
performer_count: IntCriterionInput
|
performer_count: IntCriterionInput
|
||||||
"""Filter images that have performers that have been favorited"""
|
"Filter images that have performers that have been favorited"
|
||||||
performer_favorite: Boolean
|
performer_favorite: Boolean
|
||||||
"""Filter to only include images with these galleries"""
|
"Filter to only include images with these galleries"
|
||||||
galleries: MultiCriterionInput
|
galleries: MultiCriterionInput
|
||||||
"""Filter by creation time"""
|
"Filter by creation time"
|
||||||
created_at: TimestampCriterionInput
|
created_at: TimestampCriterionInput
|
||||||
"""Filter by last update time"""
|
"Filter by last update time"
|
||||||
updated_at: TimestampCriterionInput
|
updated_at: TimestampCriterionInput
|
||||||
}
|
}
|
||||||
|
|
||||||
enum CriterionModifier {
|
enum CriterionModifier {
|
||||||
"""="""
|
"="
|
||||||
EQUALS,
|
EQUALS
|
||||||
"""!="""
|
"!="
|
||||||
NOT_EQUALS,
|
NOT_EQUALS
|
||||||
""">"""
|
">"
|
||||||
GREATER_THAN,
|
GREATER_THAN
|
||||||
"""<"""
|
"<"
|
||||||
LESS_THAN,
|
LESS_THAN
|
||||||
"""IS NULL"""
|
"IS NULL"
|
||||||
IS_NULL,
|
IS_NULL
|
||||||
"""IS NOT NULL"""
|
"IS NOT NULL"
|
||||||
NOT_NULL,
|
NOT_NULL
|
||||||
"""INCLUDES ALL"""
|
"INCLUDES ALL"
|
||||||
INCLUDES_ALL,
|
INCLUDES_ALL
|
||||||
INCLUDES,
|
INCLUDES
|
||||||
EXCLUDES,
|
EXCLUDES
|
||||||
"""MATCHES REGEX"""
|
"MATCHES REGEX"
|
||||||
MATCHES_REGEX,
|
MATCHES_REGEX
|
||||||
"""NOT MATCHES REGEX"""
|
"NOT MATCHES REGEX"
|
||||||
NOT_MATCHES_REGEX,
|
NOT_MATCHES_REGEX
|
||||||
""">= AND <="""
|
">= AND <="
|
||||||
BETWEEN,
|
BETWEEN
|
||||||
"""< OR >"""
|
"< OR >"
|
||||||
NOT_BETWEEN,
|
NOT_BETWEEN
|
||||||
}
|
}
|
||||||
|
|
||||||
input StringCriterionInput {
|
input StringCriterionInput {
|
||||||
|
|
@ -531,7 +556,7 @@ input GenderCriterionInput {
|
||||||
value: GenderEnum
|
value: GenderEnum
|
||||||
modifier: CriterionModifier!
|
modifier: CriterionModifier!
|
||||||
}
|
}
|
||||||
|
|
||||||
input CircumcisionCriterionInput {
|
input CircumcisionCriterionInput {
|
||||||
value: [CircumisedEnum!]
|
value: [CircumisedEnum!]
|
||||||
modifier: CriterionModifier!
|
modifier: CriterionModifier!
|
||||||
|
|
@ -563,30 +588,30 @@ input PhashDistanceCriterionInput {
|
||||||
}
|
}
|
||||||
|
|
||||||
enum FilterMode {
|
enum FilterMode {
|
||||||
SCENES,
|
SCENES
|
||||||
PERFORMERS,
|
PERFORMERS
|
||||||
STUDIOS,
|
STUDIOS
|
||||||
GALLERIES,
|
GALLERIES
|
||||||
SCENE_MARKERS,
|
SCENE_MARKERS
|
||||||
MOVIES,
|
MOVIES
|
||||||
TAGS,
|
TAGS
|
||||||
IMAGES,
|
IMAGES
|
||||||
}
|
}
|
||||||
|
|
||||||
type SavedFilter {
|
type SavedFilter {
|
||||||
id: ID!
|
id: ID!
|
||||||
mode: FilterMode!
|
mode: FilterMode!
|
||||||
name: String!
|
name: String!
|
||||||
"""JSON-encoded filter string"""
|
"JSON-encoded filter string"
|
||||||
filter: String!
|
filter: String!
|
||||||
}
|
}
|
||||||
|
|
||||||
input SaveFilterInput {
|
input SaveFilterInput {
|
||||||
"""provide ID to overwrite existing filter"""
|
"provide ID to overwrite existing filter"
|
||||||
id: ID
|
id: ID
|
||||||
mode: FilterMode!
|
mode: FilterMode!
|
||||||
name: String!
|
name: String!
|
||||||
"""JSON-encoded filter string"""
|
"JSON-encoded filter string"
|
||||||
filter: String!
|
filter: String!
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -596,6 +621,6 @@ input DestroyFilterInput {
|
||||||
|
|
||||||
input SetDefaultFilterInput {
|
input SetDefaultFilterInput {
|
||||||
mode: FilterMode!
|
mode: FilterMode!
|
||||||
"""JSON-encoded filter string - null to clear"""
|
"JSON-encoded filter string - null to clear"
|
||||||
filter: String
|
filter: String
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
"""Gallery type"""
|
"Gallery type"
|
||||||
type Gallery {
|
type Gallery {
|
||||||
id: ID!
|
id: ID!
|
||||||
checksum: String! @deprecated(reason: "Use files.fingerprints")
|
checksum: String! @deprecated(reason: "Use files.fingerprints")
|
||||||
|
|
@ -26,7 +26,7 @@ type Gallery {
|
||||||
tags: [Tag!]!
|
tags: [Tag!]!
|
||||||
performers: [Performer!]!
|
performers: [Performer!]!
|
||||||
|
|
||||||
"""The images in the gallery"""
|
"The images in the gallery"
|
||||||
images: [Image!]! @deprecated(reason: "Use findImages")
|
images: [Image!]! @deprecated(reason: "Use findImages")
|
||||||
cover: Image
|
cover: Image
|
||||||
}
|
}
|
||||||
|
|
@ -87,7 +87,7 @@ input BulkGalleryUpdateInput {
|
||||||
input GalleryDestroyInput {
|
input GalleryDestroyInput {
|
||||||
ids: [ID!]!
|
ids: [ID!]!
|
||||||
"""
|
"""
|
||||||
If true, then the zip file will be deleted if the gallery is zip-file-based.
|
If true, then the zip file will be deleted if the gallery is zip-file-based.
|
||||||
If gallery is folder-based, then any files not associated with other
|
If gallery is folder-based, then any files not associated with other
|
||||||
galleries will be deleted, along with the folder, if it is not empty.
|
galleries will be deleted, along with the folder, if it is not empty.
|
||||||
"""
|
"""
|
||||||
|
|
|
||||||
|
|
@ -13,14 +13,13 @@ type Image {
|
||||||
path: String! @deprecated(reason: "Use files.path")
|
path: String! @deprecated(reason: "Use files.path")
|
||||||
created_at: Time!
|
created_at: Time!
|
||||||
updated_at: Time!
|
updated_at: Time!
|
||||||
|
|
||||||
file_mod_time: Time @deprecated(reason: "Use files.mod_time")
|
file_mod_time: Time @deprecated(reason: "Use files.mod_time")
|
||||||
|
|
||||||
file: ImageFileType! @deprecated(reason: "Use visual_files")
|
file: ImageFileType! @deprecated(reason: "Use visual_files")
|
||||||
files: [ImageFile!]! @deprecated(reason: "Use visual_files")
|
files: [ImageFile!]! @deprecated(reason: "Use visual_files")
|
||||||
visual_files: [VisualFile!]!
|
visual_files: [VisualFile!]!
|
||||||
paths: ImagePathsType! # Resolver
|
paths: ImagePathsType! # Resolver
|
||||||
|
|
||||||
galleries: [Gallery!]!
|
galleries: [Gallery!]!
|
||||||
studio: Studio
|
studio: Studio
|
||||||
tags: [Tag!]!
|
tags: [Tag!]!
|
||||||
|
|
@ -51,7 +50,7 @@ input ImageUpdateInput {
|
||||||
organized: Boolean
|
organized: Boolean
|
||||||
url: String
|
url: String
|
||||||
date: String
|
date: String
|
||||||
|
|
||||||
studio_id: ID
|
studio_id: ID
|
||||||
performer_ids: [ID!]
|
performer_ids: [ID!]
|
||||||
tag_ids: [ID!]
|
tag_ids: [ID!]
|
||||||
|
|
@ -71,7 +70,7 @@ input BulkImageUpdateInput {
|
||||||
organized: Boolean
|
organized: Boolean
|
||||||
url: String
|
url: String
|
||||||
date: String
|
date: String
|
||||||
|
|
||||||
studio_id: ID
|
studio_id: ID
|
||||||
performer_ids: BulkUpdateIds
|
performer_ids: BulkUpdateIds
|
||||||
tag_ids: BulkUpdateIds
|
tag_ids: BulkUpdateIds
|
||||||
|
|
@ -92,9 +91,9 @@ input ImagesDestroyInput {
|
||||||
|
|
||||||
type FindImagesResultType {
|
type FindImagesResultType {
|
||||||
count: Int!
|
count: Int!
|
||||||
"""Total megapixels of the images"""
|
"Total megapixels of the images"
|
||||||
megapixels: Float!
|
megapixels: Float!
|
||||||
"""Total file size in bytes"""
|
"Total file size in bytes"
|
||||||
filesize: Float!
|
filesize: Float!
|
||||||
images: [Image!]!
|
images: [Image!]!
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,17 +1,17 @@
|
||||||
"""Log entries"""
|
"Log entries"
|
||||||
scalar Time
|
scalar Time
|
||||||
|
|
||||||
enum LogLevel {
|
enum LogLevel {
|
||||||
Trace
|
Trace
|
||||||
Debug
|
Debug
|
||||||
Info
|
Info
|
||||||
Progress
|
Progress
|
||||||
Warning
|
Warning
|
||||||
Error
|
Error
|
||||||
}
|
}
|
||||||
|
|
||||||
type LogEntry {
|
type LogEntry {
|
||||||
time: Time!
|
time: Time!
|
||||||
level: LogLevel!
|
level: LogLevel!
|
||||||
message: String!
|
message: String!
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -10,31 +10,31 @@ input GenerateMetadataInput {
|
||||||
markerImagePreviews: Boolean
|
markerImagePreviews: Boolean
|
||||||
markerScreenshots: Boolean
|
markerScreenshots: Boolean
|
||||||
transcodes: Boolean
|
transcodes: Boolean
|
||||||
"""Generate transcodes even if not required"""
|
"Generate transcodes even if not required"
|
||||||
forceTranscodes: Boolean
|
forceTranscodes: Boolean
|
||||||
phashes: Boolean
|
phashes: Boolean
|
||||||
interactiveHeatmapsSpeeds: Boolean
|
interactiveHeatmapsSpeeds: Boolean
|
||||||
clipPreviews: Boolean
|
clipPreviews: Boolean
|
||||||
|
|
||||||
"""scene ids to generate for"""
|
"scene ids to generate for"
|
||||||
sceneIDs: [ID!]
|
sceneIDs: [ID!]
|
||||||
"""marker ids to generate for"""
|
"marker ids to generate for"
|
||||||
markerIDs: [ID!]
|
markerIDs: [ID!]
|
||||||
|
|
||||||
"""overwrite existing media"""
|
"overwrite existing media"
|
||||||
overwrite: Boolean
|
overwrite: Boolean
|
||||||
}
|
}
|
||||||
|
|
||||||
input GeneratePreviewOptionsInput {
|
input GeneratePreviewOptionsInput {
|
||||||
"""Number of segments in a preview file"""
|
"Number of segments in a preview file"
|
||||||
previewSegments: Int
|
previewSegments: Int
|
||||||
"""Preview segment duration, in seconds"""
|
"Preview segment duration, in seconds"
|
||||||
previewSegmentDuration: Float
|
previewSegmentDuration: Float
|
||||||
"""Duration of start of video to exclude when generating previews"""
|
"Duration of start of video to exclude when generating previews"
|
||||||
previewExcludeStart: String
|
previewExcludeStart: String
|
||||||
"""Duration of end of video to exclude when generating previews"""
|
"Duration of end of video to exclude when generating previews"
|
||||||
previewExcludeEnd: String
|
previewExcludeEnd: String
|
||||||
"""Preset when generating preview"""
|
"Preset when generating preview"
|
||||||
previewPreset: PreviewPreset
|
previewPreset: PreviewPreset
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -54,15 +54,15 @@ type GenerateMetadataOptions {
|
||||||
}
|
}
|
||||||
|
|
||||||
type GeneratePreviewOptions {
|
type GeneratePreviewOptions {
|
||||||
"""Number of segments in a preview file"""
|
"Number of segments in a preview file"
|
||||||
previewSegments: Int
|
previewSegments: Int
|
||||||
"""Preview segment duration, in seconds"""
|
"Preview segment duration, in seconds"
|
||||||
previewSegmentDuration: Float
|
previewSegmentDuration: Float
|
||||||
"""Duration of start of video to exclude when generating previews"""
|
"Duration of start of video to exclude when generating previews"
|
||||||
previewExcludeStart: String
|
previewExcludeStart: String
|
||||||
"""Duration of end of video to exclude when generating previews"""
|
"Duration of end of video to exclude when generating previews"
|
||||||
previewExcludeEnd: String
|
previewExcludeEnd: String
|
||||||
"""Preset when generating preview"""
|
"Preset when generating preview"
|
||||||
previewPreset: PreviewPreset
|
previewPreset: PreviewPreset
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -78,29 +78,29 @@ input ScanMetadataInput {
|
||||||
# useFileMetadata is deprecated with the new file management system
|
# useFileMetadata is deprecated with the new file management system
|
||||||
# if this functionality is desired, then we can make a built in scraper instead.
|
# if this functionality is desired, then we can make a built in scraper instead.
|
||||||
|
|
||||||
"""Set name, date, details from metadata (if present)"""
|
"Set name, date, details from metadata (if present)"
|
||||||
useFileMetadata: Boolean @deprecated(reason: "Not implemented")
|
useFileMetadata: Boolean @deprecated(reason: "Not implemented")
|
||||||
|
|
||||||
# stripFileExtension is deprecated since we no longer set the title from the
|
# stripFileExtension is deprecated since we no longer set the title from the
|
||||||
# filename - it is automatically returned if the object has no title. If this
|
# filename - it is automatically returned if the object has no title. If this
|
||||||
# functionality is desired, then we could make this an option to not include
|
# functionality is desired, then we could make this an option to not include
|
||||||
# the extension in the auto-generated title.
|
# the extension in the auto-generated title.
|
||||||
|
|
||||||
"""Strip file extension from title"""
|
"Strip file extension from title"
|
||||||
stripFileExtension: Boolean @deprecated(reason: "Not implemented")
|
stripFileExtension: Boolean @deprecated(reason: "Not implemented")
|
||||||
"""Generate covers during scan"""
|
"Generate covers during scan"
|
||||||
scanGenerateCovers: Boolean
|
scanGenerateCovers: Boolean
|
||||||
"""Generate previews during scan"""
|
"Generate previews during scan"
|
||||||
scanGeneratePreviews: Boolean
|
scanGeneratePreviews: Boolean
|
||||||
"""Generate image previews during scan"""
|
"Generate image previews during scan"
|
||||||
scanGenerateImagePreviews: Boolean
|
scanGenerateImagePreviews: Boolean
|
||||||
"""Generate sprites during scan"""
|
"Generate sprites during scan"
|
||||||
scanGenerateSprites: Boolean
|
scanGenerateSprites: Boolean
|
||||||
"""Generate phashes during scan"""
|
"Generate phashes during scan"
|
||||||
scanGeneratePhashes: Boolean
|
scanGeneratePhashes: Boolean
|
||||||
"""Generate image thumbnails during scan"""
|
"Generate image thumbnails during scan"
|
||||||
scanGenerateThumbnails: Boolean
|
scanGenerateThumbnails: Boolean
|
||||||
"""Generate image clip previews during scan"""
|
"Generate image clip previews during scan"
|
||||||
scanGenerateClipPreviews: Boolean
|
scanGenerateClipPreviews: Boolean
|
||||||
|
|
||||||
"Filter options for the scan"
|
"Filter options for the scan"
|
||||||
|
|
@ -108,62 +108,75 @@ input ScanMetadataInput {
|
||||||
}
|
}
|
||||||
|
|
||||||
type ScanMetadataOptions {
|
type ScanMetadataOptions {
|
||||||
"""Set name, date, details from metadata (if present)"""
|
"Set name, date, details from metadata (if present)"
|
||||||
useFileMetadata: Boolean! @deprecated(reason: "Not implemented")
|
useFileMetadata: Boolean! @deprecated(reason: "Not implemented")
|
||||||
"""Strip file extension from title"""
|
"Strip file extension from title"
|
||||||
stripFileExtension: Boolean! @deprecated(reason: "Not implemented")
|
stripFileExtension: Boolean! @deprecated(reason: "Not implemented")
|
||||||
"""Generate covers during scan"""
|
"Generate covers during scan"
|
||||||
scanGenerateCovers: Boolean!
|
scanGenerateCovers: Boolean!
|
||||||
"""Generate previews during scan"""
|
"Generate previews during scan"
|
||||||
scanGeneratePreviews: Boolean!
|
scanGeneratePreviews: Boolean!
|
||||||
"""Generate image previews during scan"""
|
"Generate image previews during scan"
|
||||||
scanGenerateImagePreviews: Boolean!
|
scanGenerateImagePreviews: Boolean!
|
||||||
"""Generate sprites during scan"""
|
"Generate sprites during scan"
|
||||||
scanGenerateSprites: Boolean!
|
scanGenerateSprites: Boolean!
|
||||||
"""Generate phashes during scan"""
|
"Generate phashes during scan"
|
||||||
scanGeneratePhashes: Boolean!
|
scanGeneratePhashes: Boolean!
|
||||||
"""Generate image thumbnails during scan"""
|
"Generate image thumbnails during scan"
|
||||||
scanGenerateThumbnails: Boolean!
|
scanGenerateThumbnails: Boolean!
|
||||||
"""Generate image clip previews during scan"""
|
"Generate image clip previews during scan"
|
||||||
scanGenerateClipPreviews: Boolean!
|
scanGenerateClipPreviews: Boolean!
|
||||||
}
|
}
|
||||||
|
|
||||||
input CleanMetadataInput {
|
input CleanMetadataInput {
|
||||||
paths: [String!]
|
paths: [String!]
|
||||||
|
|
||||||
"""Do a dry run. Don't delete any files"""
|
"Do a dry run. Don't delete any files"
|
||||||
dryRun: Boolean!
|
dryRun: Boolean!
|
||||||
}
|
}
|
||||||
|
|
||||||
input AutoTagMetadataInput {
|
input AutoTagMetadataInput {
|
||||||
"""Paths to tag, null for all files"""
|
"Paths to tag, null for all files"
|
||||||
paths: [String!]
|
paths: [String!]
|
||||||
"""IDs of performers to tag files with, or "*" for all"""
|
"""
|
||||||
|
IDs of performers to tag files with, or "*" for all
|
||||||
|
"""
|
||||||
performers: [String!]
|
performers: [String!]
|
||||||
"""IDs of studios to tag files with, or "*" for all"""
|
"""
|
||||||
|
IDs of studios to tag files with, or "*" for all
|
||||||
|
"""
|
||||||
studios: [String!]
|
studios: [String!]
|
||||||
"""IDs of tags to tag files with, or "*" for all"""
|
"""
|
||||||
|
IDs of tags to tag files with, or "*" for all
|
||||||
|
"""
|
||||||
tags: [String!]
|
tags: [String!]
|
||||||
}
|
}
|
||||||
|
|
||||||
type AutoTagMetadataOptions {
|
type AutoTagMetadataOptions {
|
||||||
"""IDs of performers to tag files with, or "*" for all"""
|
"""
|
||||||
|
IDs of performers to tag files with, or "*" for all
|
||||||
|
"""
|
||||||
performers: [String!]
|
performers: [String!]
|
||||||
"""IDs of studios to tag files with, or "*" for all"""
|
"""
|
||||||
|
IDs of studios to tag files with, or "*" for all
|
||||||
|
"""
|
||||||
studios: [String!]
|
studios: [String!]
|
||||||
"""IDs of tags to tag files with, or "*" for all"""
|
"""
|
||||||
|
IDs of tags to tag files with, or "*" for all
|
||||||
|
"""
|
||||||
tags: [String!]
|
tags: [String!]
|
||||||
}
|
}
|
||||||
|
|
||||||
enum IdentifyFieldStrategy {
|
enum IdentifyFieldStrategy {
|
||||||
"""Never sets the field value"""
|
"Never sets the field value"
|
||||||
IGNORE
|
IGNORE
|
||||||
"""
|
"""
|
||||||
For multi-value fields, merge with existing.
|
For multi-value fields, merge with existing.
|
||||||
For single-value fields, ignore if already set
|
For single-value fields, ignore if already set
|
||||||
"""
|
"""
|
||||||
MERGE
|
MERGE
|
||||||
"""Always replaces the value if a value is found.
|
"""
|
||||||
|
Always replaces the value if a value is found.
|
||||||
For multi-value fields, any existing values are removed and replaced with the
|
For multi-value fields, any existing values are removed and replaced with the
|
||||||
scraped values.
|
scraped values.
|
||||||
"""
|
"""
|
||||||
|
|
@ -173,44 +186,44 @@ enum IdentifyFieldStrategy {
|
||||||
input IdentifyFieldOptionsInput {
|
input IdentifyFieldOptionsInput {
|
||||||
field: String!
|
field: String!
|
||||||
strategy: IdentifyFieldStrategy!
|
strategy: IdentifyFieldStrategy!
|
||||||
"""creates missing objects if needed - only applicable for performers, tags and studios"""
|
"creates missing objects if needed - only applicable for performers, tags and studios"
|
||||||
createMissing: Boolean
|
createMissing: Boolean
|
||||||
}
|
}
|
||||||
|
|
||||||
input IdentifyMetadataOptionsInput {
|
input IdentifyMetadataOptionsInput {
|
||||||
"""any fields missing from here are defaulted to MERGE and createMissing false"""
|
"any fields missing from here are defaulted to MERGE and createMissing false"
|
||||||
fieldOptions: [IdentifyFieldOptionsInput!]
|
fieldOptions: [IdentifyFieldOptionsInput!]
|
||||||
"""defaults to true if not provided"""
|
"defaults to true if not provided"
|
||||||
setCoverImage: Boolean
|
setCoverImage: Boolean
|
||||||
setOrganized: Boolean
|
setOrganized: Boolean
|
||||||
"""defaults to true if not provided"""
|
"defaults to true if not provided"
|
||||||
includeMalePerformers: Boolean
|
includeMalePerformers: Boolean
|
||||||
"""defaults to true if not provided"""
|
"defaults to true if not provided"
|
||||||
skipMultipleMatches: Boolean
|
skipMultipleMatches: Boolean
|
||||||
"""tag to tag skipped multiple matches with"""
|
"tag to tag skipped multiple matches with"
|
||||||
skipMultipleMatchTag: String
|
skipMultipleMatchTag: String
|
||||||
"""defaults to true if not provided"""
|
"defaults to true if not provided"
|
||||||
skipSingleNamePerformers: Boolean
|
skipSingleNamePerformers: Boolean
|
||||||
"""tag to tag skipped single name performers with"""
|
"tag to tag skipped single name performers with"
|
||||||
skipSingleNamePerformerTag: String
|
skipSingleNamePerformerTag: String
|
||||||
}
|
}
|
||||||
|
|
||||||
input IdentifySourceInput {
|
input IdentifySourceInput {
|
||||||
source: ScraperSourceInput!
|
source: ScraperSourceInput!
|
||||||
"""Options defined for a source override the defaults"""
|
"Options defined for a source override the defaults"
|
||||||
options: IdentifyMetadataOptionsInput
|
options: IdentifyMetadataOptionsInput
|
||||||
}
|
}
|
||||||
|
|
||||||
input IdentifyMetadataInput {
|
input IdentifyMetadataInput {
|
||||||
"""An ordered list of sources to identify items with. Only the first source that finds a match is used."""
|
"An ordered list of sources to identify items with. Only the first source that finds a match is used."
|
||||||
sources: [IdentifySourceInput!]!
|
sources: [IdentifySourceInput!]!
|
||||||
"""Options defined here override the configured defaults"""
|
"Options defined here override the configured defaults"
|
||||||
options: IdentifyMetadataOptionsInput
|
options: IdentifyMetadataOptionsInput
|
||||||
|
|
||||||
"""scene ids to identify"""
|
"scene ids to identify"
|
||||||
sceneIDs: [ID!]
|
sceneIDs: [ID!]
|
||||||
|
|
||||||
"""paths of scenes to identify - ignored if scene ids are set"""
|
"paths of scenes to identify - ignored if scene ids are set"
|
||||||
paths: [String!]
|
paths: [String!]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -218,38 +231,38 @@ input IdentifyMetadataInput {
|
||||||
type IdentifyFieldOptions {
|
type IdentifyFieldOptions {
|
||||||
field: String!
|
field: String!
|
||||||
strategy: IdentifyFieldStrategy!
|
strategy: IdentifyFieldStrategy!
|
||||||
"""creates missing objects if needed - only applicable for performers, tags and studios"""
|
"creates missing objects if needed - only applicable for performers, tags and studios"
|
||||||
createMissing: Boolean
|
createMissing: Boolean
|
||||||
}
|
}
|
||||||
|
|
||||||
type IdentifyMetadataOptions {
|
type IdentifyMetadataOptions {
|
||||||
"""any fields missing from here are defaulted to MERGE and createMissing false"""
|
"any fields missing from here are defaulted to MERGE and createMissing false"
|
||||||
fieldOptions: [IdentifyFieldOptions!]
|
fieldOptions: [IdentifyFieldOptions!]
|
||||||
"""defaults to true if not provided"""
|
"defaults to true if not provided"
|
||||||
setCoverImage: Boolean
|
setCoverImage: Boolean
|
||||||
setOrganized: Boolean
|
setOrganized: Boolean
|
||||||
"""defaults to true if not provided"""
|
"defaults to true if not provided"
|
||||||
includeMalePerformers: Boolean
|
includeMalePerformers: Boolean
|
||||||
"""defaults to true if not provided"""
|
"defaults to true if not provided"
|
||||||
skipMultipleMatches: Boolean
|
skipMultipleMatches: Boolean
|
||||||
"""tag to tag skipped multiple matches with"""
|
"tag to tag skipped multiple matches with"
|
||||||
skipMultipleMatchTag: String
|
skipMultipleMatchTag: String
|
||||||
"""defaults to true if not provided"""
|
"defaults to true if not provided"
|
||||||
skipSingleNamePerformers: Boolean
|
skipSingleNamePerformers: Boolean
|
||||||
"""tag to tag skipped single name performers with"""
|
"tag to tag skipped single name performers with"
|
||||||
skipSingleNamePerformerTag: String
|
skipSingleNamePerformerTag: String
|
||||||
}
|
}
|
||||||
|
|
||||||
type IdentifySource {
|
type IdentifySource {
|
||||||
source: ScraperSource!
|
source: ScraperSource!
|
||||||
"""Options defined for a source override the defaults"""
|
"Options defined for a source override the defaults"
|
||||||
options: IdentifyMetadataOptions
|
options: IdentifyMetadataOptions
|
||||||
}
|
}
|
||||||
|
|
||||||
type IdentifyMetadataTaskOptions {
|
type IdentifyMetadataTaskOptions {
|
||||||
"""An ordered list of sources to identify items with. Only the first source that finds a match is used."""
|
"An ordered list of sources to identify items with. Only the first source that finds a match is used."
|
||||||
sources: [IdentifySource!]!
|
sources: [IdentifySource!]!
|
||||||
"""Options defined here override the configured defaults"""
|
"Options defined here override the configured defaults"
|
||||||
options: IdentifyMetadataOptions
|
options: IdentifyMetadataOptions
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@ type Movie {
|
||||||
name: String!
|
name: String!
|
||||||
checksum: String! @deprecated(reason: "MD5 hash of name, use name directly")
|
checksum: String! @deprecated(reason: "MD5 hash of name, use name directly")
|
||||||
aliases: String
|
aliases: String
|
||||||
"""Duration in seconds"""
|
"Duration in seconds"
|
||||||
duration: Int
|
duration: Int
|
||||||
date: String
|
date: String
|
||||||
# rating expressed as 1-5
|
# rating expressed as 1-5
|
||||||
|
|
@ -26,7 +26,7 @@ type Movie {
|
||||||
input MovieCreateInput {
|
input MovieCreateInput {
|
||||||
name: String!
|
name: String!
|
||||||
aliases: String
|
aliases: String
|
||||||
"""Duration in seconds"""
|
"Duration in seconds"
|
||||||
duration: Int
|
duration: Int
|
||||||
date: String
|
date: String
|
||||||
# rating expressed as 1-5
|
# rating expressed as 1-5
|
||||||
|
|
@ -37,9 +37,9 @@ input MovieCreateInput {
|
||||||
director: String
|
director: String
|
||||||
synopsis: String
|
synopsis: String
|
||||||
url: String
|
url: String
|
||||||
"""This should be a URL or a base64 encoded data URL"""
|
"This should be a URL or a base64 encoded data URL"
|
||||||
front_image: String
|
front_image: String
|
||||||
"""This should be a URL or a base64 encoded data URL"""
|
"This should be a URL or a base64 encoded data URL"
|
||||||
back_image: String
|
back_image: String
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -57,9 +57,9 @@ input MovieUpdateInput {
|
||||||
director: String
|
director: String
|
||||||
synopsis: String
|
synopsis: String
|
||||||
url: String
|
url: String
|
||||||
"""This should be a URL or a base64 encoded data URL"""
|
"This should be a URL or a base64 encoded data URL"
|
||||||
front_image: String
|
front_image: String
|
||||||
"""This should be a URL or a base64 encoded data URL"""
|
"This should be a URL or a base64 encoded data URL"
|
||||||
back_image: String
|
back_image: String
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@ enum GenderEnum {
|
||||||
INTERSEX
|
INTERSEX
|
||||||
NON_BINARY
|
NON_BINARY
|
||||||
}
|
}
|
||||||
|
|
||||||
enum CircumisedEnum {
|
enum CircumisedEnum {
|
||||||
CUT
|
CUT
|
||||||
UNCUT
|
UNCUT
|
||||||
|
|
@ -14,7 +14,7 @@ enum CircumisedEnum {
|
||||||
|
|
||||||
type Performer {
|
type Performer {
|
||||||
id: ID!
|
id: ID!
|
||||||
checksum: String @deprecated(reason: "Not used")
|
checksum: String @deprecated(reason: "Not used")
|
||||||
name: String!
|
name: String!
|
||||||
disambiguation: String
|
disambiguation: String
|
||||||
url: String
|
url: String
|
||||||
|
|
@ -87,7 +87,7 @@ input PerformerCreateInput {
|
||||||
instagram: String
|
instagram: String
|
||||||
favorite: Boolean
|
favorite: Boolean
|
||||||
tag_ids: [ID!]
|
tag_ids: [ID!]
|
||||||
"""This should be a URL or a base64 encoded data URL"""
|
"This should be a URL or a base64 encoded data URL"
|
||||||
image: String
|
image: String
|
||||||
stash_ids: [StashIDInput!]
|
stash_ids: [StashIDInput!]
|
||||||
# rating expressed as 1-5
|
# rating expressed as 1-5
|
||||||
|
|
@ -127,7 +127,7 @@ input PerformerUpdateInput {
|
||||||
instagram: String
|
instagram: String
|
||||||
favorite: Boolean
|
favorite: Boolean
|
||||||
tag_ids: [ID!]
|
tag_ids: [ID!]
|
||||||
"""This should be a URL or a base64 encoded data URL"""
|
"This should be a URL or a base64 encoded data URL"
|
||||||
image: String
|
image: String
|
||||||
stash_ids: [StashIDInput!]
|
stash_ids: [StashIDInput!]
|
||||||
# rating expressed as 1-5
|
# rating expressed as 1-5
|
||||||
|
|
|
||||||
|
|
@ -1,43 +1,42 @@
|
||||||
|
|
||||||
type Plugin {
|
type Plugin {
|
||||||
id: ID!
|
id: ID!
|
||||||
name: String!
|
name: String!
|
||||||
description: String
|
description: String
|
||||||
url: String
|
url: String
|
||||||
version: String
|
version: String
|
||||||
|
|
||||||
tasks: [PluginTask!]
|
tasks: [PluginTask!]
|
||||||
hooks: [PluginHook!]
|
hooks: [PluginHook!]
|
||||||
}
|
}
|
||||||
|
|
||||||
type PluginTask {
|
type PluginTask {
|
||||||
name: String!
|
name: String!
|
||||||
description: String
|
description: String
|
||||||
plugin: Plugin!
|
plugin: Plugin!
|
||||||
}
|
}
|
||||||
|
|
||||||
type PluginHook {
|
type PluginHook {
|
||||||
name: String!
|
name: String!
|
||||||
description: String
|
description: String
|
||||||
hooks: [String!]
|
hooks: [String!]
|
||||||
plugin: Plugin!
|
plugin: Plugin!
|
||||||
}
|
}
|
||||||
|
|
||||||
type PluginResult {
|
type PluginResult {
|
||||||
error: String
|
error: String
|
||||||
result: String
|
result: String
|
||||||
}
|
}
|
||||||
|
|
||||||
input PluginArgInput {
|
input PluginArgInput {
|
||||||
key: String!
|
key: String!
|
||||||
value: PluginValueInput
|
value: PluginValueInput
|
||||||
}
|
}
|
||||||
|
|
||||||
input PluginValueInput {
|
input PluginValueInput {
|
||||||
str: String
|
str: String
|
||||||
i: Int
|
i: Int
|
||||||
b: Boolean
|
b: Boolean
|
||||||
f: Float
|
f: Float
|
||||||
o: [PluginArgInput!]
|
o: [PluginArgInput!]
|
||||||
a: [PluginValueInput!]
|
a: [PluginValueInput!]
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,3 @@
|
||||||
|
|
||||||
"""
|
"""
|
||||||
Timestamp is a point in time. It is always output as RFC3339-compatible time points.
|
Timestamp is a point in time. It is always output as RFC3339-compatible time points.
|
||||||
It can be input as a RFC3339 string, or as "<4h" for "4 hours in the past" or ">5m"
|
It can be input as a RFC3339 string, or as "<4h" for "4 hours in the past" or ">5m"
|
||||||
|
|
@ -11,4 +10,4 @@ scalar Map
|
||||||
|
|
||||||
scalar Any
|
scalar Any
|
||||||
|
|
||||||
scalar Int64
|
scalar Int64
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
type SceneMarkerTag {
|
type SceneMarkerTag {
|
||||||
tag: Tag!
|
tag: Tag!
|
||||||
scene_markers: [SceneMarker!]!
|
scene_markers: [SceneMarker!]!
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -8,11 +8,11 @@ type SceneMarker {
|
||||||
created_at: Time!
|
created_at: Time!
|
||||||
updated_at: Time!
|
updated_at: Time!
|
||||||
|
|
||||||
"""The path to stream this marker"""
|
"The path to stream this marker"
|
||||||
stream: String! # Resolver
|
stream: String! # Resolver
|
||||||
"""The path to the preview image for this marker"""
|
"The path to the preview image for this marker"
|
||||||
preview: String! # Resolver
|
preview: String! # Resolver
|
||||||
"""The path to the screenshot image for this marker"""
|
"The path to the screenshot image for this marker"
|
||||||
screenshot: String! # Resolver
|
screenshot: String! # Resolver
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -42,4 +42,4 @@ type MarkerStringsResultType {
|
||||||
count: Int!
|
count: Int!
|
||||||
id: ID!
|
id: ID!
|
||||||
title: String!
|
title: String!
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -57,19 +57,18 @@ type Scene {
|
||||||
created_at: Time!
|
created_at: Time!
|
||||||
updated_at: Time!
|
updated_at: Time!
|
||||||
file_mod_time: Time
|
file_mod_time: Time
|
||||||
"""The last time play count was updated"""
|
"The last time play count was updated"
|
||||||
last_played_at: Time
|
last_played_at: Time
|
||||||
"""The time index a scene was left at"""
|
"The time index a scene was left at"
|
||||||
resume_time: Float
|
resume_time: Float
|
||||||
"""The total time a scene has spent playing"""
|
"The total time a scene has spent playing"
|
||||||
play_duration: Float
|
play_duration: Float
|
||||||
"""The number ot times a scene has been played"""
|
"The number ot times a scene has been played"
|
||||||
play_count: Int
|
play_count: Int
|
||||||
|
|
||||||
file: SceneFileType! @deprecated(reason: "Use files")
|
file: SceneFileType! @deprecated(reason: "Use files")
|
||||||
files: [VideoFile!]!
|
files: [VideoFile!]!
|
||||||
paths: ScenePathsType! # Resolver
|
paths: ScenePathsType! # Resolver
|
||||||
|
|
||||||
scene_markers: [SceneMarker!]!
|
scene_markers: [SceneMarker!]!
|
||||||
galleries: [Gallery!]!
|
galleries: [Gallery!]!
|
||||||
studio: Studio
|
studio: Studio
|
||||||
|
|
@ -78,7 +77,7 @@ type Scene {
|
||||||
performers: [Performer!]!
|
performers: [Performer!]!
|
||||||
stash_ids: [StashID!]!
|
stash_ids: [StashID!]!
|
||||||
|
|
||||||
"""Return valid stream paths"""
|
"Return valid stream paths"
|
||||||
sceneStreams: [SceneStreamEndpoint!]!
|
sceneStreams: [SceneStreamEndpoint!]!
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -105,12 +104,15 @@ input SceneCreateInput {
|
||||||
performer_ids: [ID!]
|
performer_ids: [ID!]
|
||||||
movies: [SceneMovieInput!]
|
movies: [SceneMovieInput!]
|
||||||
tag_ids: [ID!]
|
tag_ids: [ID!]
|
||||||
"""This should be a URL or a base64 encoded data URL"""
|
"This should be a URL or a base64 encoded data URL"
|
||||||
cover_image: String
|
cover_image: String
|
||||||
stash_ids: [StashIDInput!]
|
stash_ids: [StashIDInput!]
|
||||||
|
|
||||||
"""The first id will be assigned as primary. Files will be reassigned from
|
"""
|
||||||
existing scenes if applicable. Files must not already be primary for another scene"""
|
The first id will be assigned as primary.
|
||||||
|
Files will be reassigned from existing scenes if applicable.
|
||||||
|
Files must not already be primary for another scene.
|
||||||
|
"""
|
||||||
file_ids: [ID!]
|
file_ids: [ID!]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -135,15 +137,15 @@ input SceneUpdateInput {
|
||||||
performer_ids: [ID!]
|
performer_ids: [ID!]
|
||||||
movies: [SceneMovieInput!]
|
movies: [SceneMovieInput!]
|
||||||
tag_ids: [ID!]
|
tag_ids: [ID!]
|
||||||
"""This should be a URL or a base64 encoded data URL"""
|
"This should be a URL or a base64 encoded data URL"
|
||||||
cover_image: String
|
cover_image: String
|
||||||
stash_ids: [StashIDInput!]
|
stash_ids: [StashIDInput!]
|
||||||
|
|
||||||
"""The time index a scene was left at"""
|
"The time index a scene was left at"
|
||||||
resume_time: Float
|
resume_time: Float
|
||||||
"""The total time a scene has spent playing"""
|
"The total time a scene has spent playing"
|
||||||
play_duration: Float
|
play_duration: Float
|
||||||
"""The number ot times a scene has been played"""
|
"The number ot times a scene has been played"
|
||||||
play_count: Int
|
play_count: Int
|
||||||
|
|
||||||
primary_file_id: ID
|
primary_file_id: ID
|
||||||
|
|
@ -179,7 +181,7 @@ input BulkSceneUpdateInput {
|
||||||
gallery_ids: BulkUpdateIds
|
gallery_ids: BulkUpdateIds
|
||||||
performer_ids: BulkUpdateIds
|
performer_ids: BulkUpdateIds
|
||||||
tag_ids: BulkUpdateIds
|
tag_ids: BulkUpdateIds
|
||||||
movie_ids: BulkUpdateIds
|
movie_ids: BulkUpdateIds
|
||||||
}
|
}
|
||||||
|
|
||||||
input SceneDestroyInput {
|
input SceneDestroyInput {
|
||||||
|
|
@ -196,17 +198,17 @@ input ScenesDestroyInput {
|
||||||
|
|
||||||
type FindScenesResultType {
|
type FindScenesResultType {
|
||||||
count: Int!
|
count: Int!
|
||||||
"""Total duration in seconds"""
|
"Total duration in seconds"
|
||||||
duration: Float!
|
duration: Float!
|
||||||
"""Total file size in bytes"""
|
"Total file size in bytes"
|
||||||
filesize: Float!
|
filesize: Float!
|
||||||
scenes: [Scene!]!
|
scenes: [Scene!]!
|
||||||
}
|
}
|
||||||
|
|
||||||
input SceneParserInput {
|
input SceneParserInput {
|
||||||
ignoreWords: [String!],
|
ignoreWords: [String!]
|
||||||
whitespaceCharacters: String,
|
whitespaceCharacters: String
|
||||||
capitalizeTitle: Boolean,
|
capitalizeTitle: Boolean
|
||||||
ignoreOrganized: Boolean
|
ignoreOrganized: Boolean
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -256,8 +258,10 @@ input AssignSceneFileInput {
|
||||||
}
|
}
|
||||||
|
|
||||||
input SceneMergeInput {
|
input SceneMergeInput {
|
||||||
"""If destination scene has no files, then the primary file of the
|
"""
|
||||||
first source scene will be assigned as primary"""
|
If destination scene has no files, then the primary file of the
|
||||||
|
first source scene will be assigned as primary
|
||||||
|
"""
|
||||||
source: [ID!]!
|
source: [ID!]!
|
||||||
destination: ID!
|
destination: ID!
|
||||||
# values defined here will override values in the destination
|
# values defined here will override values in the destination
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
"""A movie from a scraping operation..."""
|
"A movie from a scraping operation..."
|
||||||
type ScrapedMovie {
|
type ScrapedMovie {
|
||||||
stored_id: ID
|
stored_id: ID
|
||||||
name: String
|
name: String
|
||||||
|
|
@ -11,9 +11,9 @@ type ScrapedMovie {
|
||||||
synopsis: String
|
synopsis: String
|
||||||
studio: ScrapedStudio
|
studio: ScrapedStudio
|
||||||
|
|
||||||
"""This should be a base64 encoded data URL"""
|
"This should be a base64 encoded data URL"
|
||||||
front_image: String
|
front_image: String
|
||||||
"""This should be a base64 encoded data URL"""
|
"This should be a base64 encoded data URL"
|
||||||
back_image: String
|
back_image: String
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
"""A performer from a scraping operation..."""
|
"A performer from a scraping operation..."
|
||||||
type ScrapedPerformer {
|
type ScrapedPerformer {
|
||||||
"""Set if performer matched"""
|
"Set if performer matched"
|
||||||
stored_id: ID
|
stored_id: ID
|
||||||
name: String
|
name: String
|
||||||
disambiguation: String
|
disambiguation: String
|
||||||
|
|
@ -24,7 +24,7 @@ type ScrapedPerformer {
|
||||||
aliases: String
|
aliases: String
|
||||||
tags: [ScrapedTag!]
|
tags: [ScrapedTag!]
|
||||||
|
|
||||||
"""This should be a base64 encoded data URL"""
|
"This should be a base64 encoded data URL"
|
||||||
image: String @deprecated(reason: "use images instead")
|
image: String @deprecated(reason: "use images instead")
|
||||||
images: [String!]
|
images: [String!]
|
||||||
details: String
|
details: String
|
||||||
|
|
@ -35,7 +35,7 @@ type ScrapedPerformer {
|
||||||
}
|
}
|
||||||
|
|
||||||
input ScrapedPerformerInput {
|
input ScrapedPerformerInput {
|
||||||
"""Set if performer matched"""
|
"Set if performer matched"
|
||||||
stored_id: ID
|
stored_id: ID
|
||||||
name: String
|
name: String
|
||||||
disambiguation: String
|
disambiguation: String
|
||||||
|
|
@ -64,4 +64,4 @@ input ScrapedPerformerInput {
|
||||||
hair_color: String
|
hair_color: String
|
||||||
weight: String
|
weight: String
|
||||||
remote_site_id: String
|
remote_site_id: String
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,9 @@
|
||||||
enum ScrapeType {
|
enum ScrapeType {
|
||||||
"""From text query"""
|
"From text query"
|
||||||
NAME
|
NAME
|
||||||
"""From existing object"""
|
"From existing object"
|
||||||
FRAGMENT
|
FRAGMENT
|
||||||
"""From URL"""
|
"From URL"
|
||||||
URL
|
URL
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -16,35 +16,35 @@ enum ScrapeContentType {
|
||||||
}
|
}
|
||||||
|
|
||||||
"Scraped Content is the forming union over the different scrapers"
|
"Scraped Content is the forming union over the different scrapers"
|
||||||
union ScrapedContent = ScrapedStudio
|
union ScrapedContent =
|
||||||
| ScrapedTag
|
ScrapedStudio
|
||||||
| ScrapedScene
|
| ScrapedTag
|
||||||
| ScrapedGallery
|
| ScrapedScene
|
||||||
| ScrapedMovie
|
| ScrapedGallery
|
||||||
| ScrapedPerformer
|
| ScrapedMovie
|
||||||
|
| ScrapedPerformer
|
||||||
|
|
||||||
type ScraperSpec {
|
type ScraperSpec {
|
||||||
"""URLs matching these can be scraped with"""
|
"URLs matching these can be scraped with"
|
||||||
urls: [String!]
|
urls: [String!]
|
||||||
supported_scrapes: [ScrapeType!]!
|
supported_scrapes: [ScrapeType!]!
|
||||||
}
|
}
|
||||||
|
|
||||||
type Scraper {
|
type Scraper {
|
||||||
id: ID!
|
id: ID!
|
||||||
name: String!
|
name: String!
|
||||||
"""Details for performer scraper"""
|
"Details for performer scraper"
|
||||||
performer: ScraperSpec
|
performer: ScraperSpec
|
||||||
"""Details for scene scraper"""
|
"Details for scene scraper"
|
||||||
scene: ScraperSpec
|
scene: ScraperSpec
|
||||||
"""Details for gallery scraper"""
|
"Details for gallery scraper"
|
||||||
gallery: ScraperSpec
|
gallery: ScraperSpec
|
||||||
"""Details for movie scraper"""
|
"Details for movie scraper"
|
||||||
movie: ScraperSpec
|
movie: ScraperSpec
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
type ScrapedStudio {
|
type ScrapedStudio {
|
||||||
"""Set if studio matched"""
|
"Set if studio matched"
|
||||||
stored_id: ID
|
stored_id: ID
|
||||||
name: String!
|
name: String!
|
||||||
url: String
|
url: String
|
||||||
|
|
@ -54,7 +54,7 @@ type ScrapedStudio {
|
||||||
}
|
}
|
||||||
|
|
||||||
type ScrapedTag {
|
type ScrapedTag {
|
||||||
"""Set if tag matched"""
|
"Set if tag matched"
|
||||||
stored_id: ID
|
stored_id: ID
|
||||||
name: String!
|
name: String!
|
||||||
}
|
}
|
||||||
|
|
@ -68,11 +68,10 @@ type ScrapedScene {
|
||||||
urls: [String!]
|
urls: [String!]
|
||||||
date: String
|
date: String
|
||||||
|
|
||||||
"""This should be a base64 encoded data URL"""
|
"This should be a base64 encoded data URL"
|
||||||
image: String
|
image: String
|
||||||
|
|
||||||
file: SceneFileType # Resolver
|
file: SceneFileType # Resolver
|
||||||
|
|
||||||
studio: ScrapedStudio
|
studio: ScrapedStudio
|
||||||
tags: [ScrapedTag!]
|
tags: [ScrapedTag!]
|
||||||
performers: [ScrapedPerformer!]
|
performers: [ScrapedPerformer!]
|
||||||
|
|
@ -118,84 +117,84 @@ input ScrapedGalleryInput {
|
||||||
}
|
}
|
||||||
|
|
||||||
input ScraperSourceInput {
|
input ScraperSourceInput {
|
||||||
"""Index of the configured stash-box instance to use. Should be unset if scraper_id is set"""
|
"Index of the configured stash-box instance to use. Should be unset if scraper_id is set"
|
||||||
stash_box_index: Int @deprecated(reason: "use stash_box_endpoint")
|
stash_box_index: Int @deprecated(reason: "use stash_box_endpoint")
|
||||||
"""Stash-box endpoint"""
|
"Stash-box endpoint"
|
||||||
stash_box_endpoint: String
|
stash_box_endpoint: String
|
||||||
"""Scraper ID to scrape with. Should be unset if stash_box_index is set"""
|
"Scraper ID to scrape with. Should be unset if stash_box_index is set"
|
||||||
scraper_id: ID
|
scraper_id: ID
|
||||||
}
|
}
|
||||||
|
|
||||||
type ScraperSource {
|
type ScraperSource {
|
||||||
"""Index of the configured stash-box instance to use. Should be unset if scraper_id is set"""
|
"Index of the configured stash-box instance to use. Should be unset if scraper_id is set"
|
||||||
stash_box_index: Int @deprecated(reason: "use stash_box_endpoint")
|
stash_box_index: Int @deprecated(reason: "use stash_box_endpoint")
|
||||||
"""Stash-box endpoint"""
|
"Stash-box endpoint"
|
||||||
stash_box_endpoint: String
|
stash_box_endpoint: String
|
||||||
"""Scraper ID to scrape with. Should be unset if stash_box_index is set"""
|
"Scraper ID to scrape with. Should be unset if stash_box_index is set"
|
||||||
scraper_id: ID
|
scraper_id: ID
|
||||||
}
|
}
|
||||||
|
|
||||||
input ScrapeSingleSceneInput {
|
input ScrapeSingleSceneInput {
|
||||||
"""Instructs to query by string"""
|
"Instructs to query by string"
|
||||||
query: String
|
query: String
|
||||||
"""Instructs to query by scene fingerprints"""
|
"Instructs to query by scene fingerprints"
|
||||||
scene_id: ID
|
scene_id: ID
|
||||||
"""Instructs to query by scene fragment"""
|
"Instructs to query by scene fragment"
|
||||||
scene_input: ScrapedSceneInput
|
scene_input: ScrapedSceneInput
|
||||||
}
|
}
|
||||||
|
|
||||||
input ScrapeMultiScenesInput {
|
input ScrapeMultiScenesInput {
|
||||||
"""Instructs to query by scene fingerprints"""
|
"Instructs to query by scene fingerprints"
|
||||||
scene_ids: [ID!]
|
scene_ids: [ID!]
|
||||||
}
|
}
|
||||||
|
|
||||||
input ScrapeSinglePerformerInput {
|
input ScrapeSinglePerformerInput {
|
||||||
"""Instructs to query by string"""
|
"Instructs to query by string"
|
||||||
query: String
|
query: String
|
||||||
"""Instructs to query by performer id"""
|
"Instructs to query by performer id"
|
||||||
performer_id: ID
|
performer_id: ID
|
||||||
"""Instructs to query by performer fragment"""
|
"Instructs to query by performer fragment"
|
||||||
performer_input: ScrapedPerformerInput
|
performer_input: ScrapedPerformerInput
|
||||||
}
|
}
|
||||||
|
|
||||||
input ScrapeMultiPerformersInput {
|
input ScrapeMultiPerformersInput {
|
||||||
"""Instructs to query by scene fingerprints"""
|
"Instructs to query by scene fingerprints"
|
||||||
performer_ids: [ID!]
|
performer_ids: [ID!]
|
||||||
}
|
}
|
||||||
|
|
||||||
input ScrapeSingleGalleryInput {
|
input ScrapeSingleGalleryInput {
|
||||||
"""Instructs to query by string"""
|
"Instructs to query by string"
|
||||||
query: String
|
query: String
|
||||||
"""Instructs to query by gallery id"""
|
"Instructs to query by gallery id"
|
||||||
gallery_id: ID
|
gallery_id: ID
|
||||||
"""Instructs to query by gallery fragment"""
|
"Instructs to query by gallery fragment"
|
||||||
gallery_input: ScrapedGalleryInput
|
gallery_input: ScrapedGalleryInput
|
||||||
}
|
}
|
||||||
|
|
||||||
input ScrapeSingleMovieInput {
|
input ScrapeSingleMovieInput {
|
||||||
"""Instructs to query by string"""
|
"Instructs to query by string"
|
||||||
query: String
|
query: String
|
||||||
"""Instructs to query by movie id"""
|
"Instructs to query by movie id"
|
||||||
movie_id: ID
|
movie_id: ID
|
||||||
"""Instructs to query by gallery fragment"""
|
"Instructs to query by gallery fragment"
|
||||||
movie_input: ScrapedMovieInput
|
movie_input: ScrapedMovieInput
|
||||||
}
|
}
|
||||||
|
|
||||||
input StashBoxSceneQueryInput {
|
input StashBoxSceneQueryInput {
|
||||||
"""Index of the configured stash-box instance to use"""
|
"Index of the configured stash-box instance to use"
|
||||||
stash_box_index: Int!
|
stash_box_index: Int!
|
||||||
"""Instructs query by scene fingerprints"""
|
"Instructs query by scene fingerprints"
|
||||||
scene_ids: [ID!]
|
scene_ids: [ID!]
|
||||||
"""Query by query string"""
|
"Query by query string"
|
||||||
q: String
|
q: String
|
||||||
}
|
}
|
||||||
|
|
||||||
input StashBoxPerformerQueryInput {
|
input StashBoxPerformerQueryInput {
|
||||||
"""Index of the configured stash-box instance to use"""
|
"Index of the configured stash-box instance to use"
|
||||||
stash_box_index: Int!
|
stash_box_index: Int!
|
||||||
"""Instructs query by scene fingerprints"""
|
"Instructs query by scene fingerprints"
|
||||||
performer_ids: [ID!]
|
performer_ids: [ID!]
|
||||||
"""Query by query string"""
|
"Query by query string"
|
||||||
q: String
|
q: String
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -210,7 +209,7 @@ type StashBoxFingerprint {
|
||||||
duration: Int!
|
duration: Int!
|
||||||
}
|
}
|
||||||
|
|
||||||
"""If neither performer_ids nor performer_names are set, tag all performers"""
|
"If neither performer_ids nor performer_names are set, tag all performers"
|
||||||
input StashBoxBatchPerformerTagInput {
|
input StashBoxBatchPerformerTagInput {
|
||||||
"Stash endpoint to use for the performer tagging"
|
"Stash endpoint to use for the performer tagging"
|
||||||
endpoint: Int!
|
endpoint: Int!
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
type SQLQueryResult {
|
type SQLQueryResult {
|
||||||
"""The column names, in the order they appear in the result set."""
|
"The column names, in the order they appear in the result set."
|
||||||
columns: [String!]!
|
columns: [String!]!
|
||||||
"""The returned rows."""
|
"The returned rows."
|
||||||
rows: [[Any]!]!
|
rows: [[Any]!]!
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -12,7 +12,8 @@ type SQLExecResult {
|
||||||
"""
|
"""
|
||||||
rows_affected: Int64
|
rows_affected: Int64
|
||||||
"""
|
"""
|
||||||
The integer generated by the database in response to a command. Typically this will be from an "auto increment" column when inserting a new row.
|
The integer generated by the database in response to a command.
|
||||||
|
Typically this will be from an "auto increment" column when inserting a new row.
|
||||||
Not all databases support this feature, and the syntax of such statements varies.
|
Not all databases support this feature, and the syntax of such statements varies.
|
||||||
"""
|
"""
|
||||||
last_insert_id: Int64
|
last_insert_id: Int64
|
||||||
|
|
|
||||||
|
|
@ -1,13 +1,13 @@
|
||||||
type StashBox {
|
type StashBox {
|
||||||
endpoint: String!
|
endpoint: String!
|
||||||
api_key: String!
|
api_key: String!
|
||||||
name: String!
|
name: String!
|
||||||
}
|
}
|
||||||
|
|
||||||
input StashBoxInput {
|
input StashBoxInput {
|
||||||
endpoint: String!
|
endpoint: String!
|
||||||
api_key: String!
|
api_key: String!
|
||||||
name: String!
|
name: String!
|
||||||
}
|
}
|
||||||
|
|
||||||
type StashID {
|
type StashID {
|
||||||
|
|
|
||||||
|
|
@ -29,7 +29,7 @@ input StudioCreateInput {
|
||||||
name: String!
|
name: String!
|
||||||
url: String
|
url: String
|
||||||
parent_id: ID
|
parent_id: ID
|
||||||
"""This should be a URL or a base64 encoded data URL"""
|
"This should be a URL or a base64 encoded data URL"
|
||||||
image: String
|
image: String
|
||||||
stash_ids: [StashIDInput!]
|
stash_ids: [StashIDInput!]
|
||||||
# rating expressed as 1-5
|
# rating expressed as 1-5
|
||||||
|
|
@ -45,8 +45,8 @@ input StudioUpdateInput {
|
||||||
id: ID!
|
id: ID!
|
||||||
name: String
|
name: String
|
||||||
url: String
|
url: String
|
||||||
parent_id: ID,
|
parent_id: ID
|
||||||
"""This should be a URL or a base64 encoded data URL"""
|
"This should be a URL or a base64 encoded data URL"
|
||||||
image: String
|
image: String
|
||||||
stash_ids: [StashIDInput!]
|
stash_ids: [StashIDInput!]
|
||||||
# rating expressed as 1-5
|
# rating expressed as 1-5
|
||||||
|
|
|
||||||
|
|
@ -13,7 +13,6 @@ type Tag {
|
||||||
image_count(depth: Int): Int! # Resolver
|
image_count(depth: Int): Int! # Resolver
|
||||||
gallery_count(depth: Int): Int! # Resolver
|
gallery_count(depth: Int): Int! # Resolver
|
||||||
performer_count(depth: Int): Int! # Resolver
|
performer_count(depth: Int): Int! # Resolver
|
||||||
|
|
||||||
parents: [Tag!]!
|
parents: [Tag!]!
|
||||||
children: [Tag!]!
|
children: [Tag!]!
|
||||||
}
|
}
|
||||||
|
|
@ -24,7 +23,7 @@ input TagCreateInput {
|
||||||
aliases: [String!]
|
aliases: [String!]
|
||||||
ignore_auto_tag: Boolean
|
ignore_auto_tag: Boolean
|
||||||
|
|
||||||
"""This should be a URL or a base64 encoded data URL"""
|
"This should be a URL or a base64 encoded data URL"
|
||||||
image: String
|
image: String
|
||||||
|
|
||||||
parent_ids: [ID!]
|
parent_ids: [ID!]
|
||||||
|
|
@ -38,7 +37,7 @@ input TagUpdateInput {
|
||||||
aliases: [String!]
|
aliases: [String!]
|
||||||
ignore_auto_tag: Boolean
|
ignore_auto_tag: Boolean
|
||||||
|
|
||||||
"""This should be a URL or a base64 encoded data URL"""
|
"This should be a URL or a base64 encoded data URL"
|
||||||
image: String
|
image: String
|
||||||
|
|
||||||
parent_ids: [ID!]
|
parent_ids: [ID!]
|
||||||
|
|
|
||||||
|
|
@ -131,7 +131,9 @@ query FindScenesByFullFingerprints($fingerprints: [FingerprintQueryInput!]!) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
query FindScenesBySceneFingerprints($fingerprints: [[FingerprintQueryInput!]!]!) {
|
query FindScenesBySceneFingerprints(
|
||||||
|
$fingerprints: [[FingerprintQueryInput!]!]!
|
||||||
|
) {
|
||||||
findScenesBySceneFingerprints(fingerprints: $fingerprints) {
|
findScenesBySceneFingerprints(fingerprints: $fingerprints) {
|
||||||
...SceneFragment
|
...SceneFragment
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -12,14 +12,14 @@
|
||||||
"lint:css": "stylelint --cache \"src/**/*.scss\"",
|
"lint:css": "stylelint --cache \"src/**/*.scss\"",
|
||||||
"lint:js": "eslint --cache src/",
|
"lint:js": "eslint --cache src/",
|
||||||
"check": "tsc --noEmit",
|
"check": "tsc --noEmit",
|
||||||
"format": "prettier --write .",
|
"format": "prettier --write . ../../graphql",
|
||||||
"format-check": "prettier --check .",
|
"format-check": "prettier --check . ../../graphql",
|
||||||
"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'"
|
"extract": "NODE_ENV=development extract-messages -l=en,de -o src/locale -d en --flat false 'src/**/!(*.test).tsx'"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@ant-design/react-slick": "^1.0.0",
|
"@ant-design/react-slick": "^1.0.0",
|
||||||
"@apollo/client": "^3.7.8",
|
"@apollo/client": "^3.7.17",
|
||||||
"@formatjs/intl-getcanonicallocales": "^2.0.5",
|
"@formatjs/intl-getcanonicallocales": "^2.0.5",
|
||||||
"@formatjs/intl-locale": "^3.0.11",
|
"@formatjs/intl-locale": "^3.0.11",
|
||||||
"@formatjs/intl-numberformat": "^8.3.3",
|
"@formatjs/intl-numberformat": "^8.3.3",
|
||||||
|
|
|
||||||
|
|
@ -39,8 +39,12 @@ export interface ITaggerContextState {
|
||||||
doSceneFragmentScrape: (sceneID: string) => Promise<void>;
|
doSceneFragmentScrape: (sceneID: string) => Promise<void>;
|
||||||
doMultiSceneFragmentScrape: (sceneIDs: string[]) => Promise<void>;
|
doMultiSceneFragmentScrape: (sceneIDs: string[]) => Promise<void>;
|
||||||
stopMultiScrape: () => void;
|
stopMultiScrape: () => void;
|
||||||
createNewTag: (toCreate: GQL.ScrapedTag) => Promise<string | undefined>;
|
createNewTag: (
|
||||||
|
tag: GQL.ScrapedTag,
|
||||||
|
toCreate: GQL.TagCreateInput
|
||||||
|
) => Promise<string | undefined>;
|
||||||
createNewPerformer: (
|
createNewPerformer: (
|
||||||
|
performer: GQL.ScrapedPerformer,
|
||||||
toCreate: GQL.PerformerCreateInput
|
toCreate: GQL.PerformerCreateInput
|
||||||
) => Promise<string | undefined>;
|
) => Promise<string | undefined>;
|
||||||
linkPerformer: (
|
linkPerformer: (
|
||||||
|
|
@ -48,6 +52,7 @@ export interface ITaggerContextState {
|
||||||
performerID: string
|
performerID: string
|
||||||
) => Promise<void>;
|
) => Promise<void>;
|
||||||
createNewStudio: (
|
createNewStudio: (
|
||||||
|
studio: GQL.ScrapedStudio,
|
||||||
toCreate: GQL.StudioCreateInput
|
toCreate: GQL.StudioCreateInput
|
||||||
) => Promise<string | undefined>;
|
) => Promise<string | undefined>;
|
||||||
linkStudio: (studio: GQL.ScrapedStudio, studioID: string) => Promise<void>;
|
linkStudio: (studio: GQL.ScrapedStudio, studioID: string) => Promise<void>;
|
||||||
|
|
@ -484,16 +489,19 @@ export const TaggerContext: React.FC = ({ children }) => {
|
||||||
return newSearchResults;
|
return newSearchResults;
|
||||||
}
|
}
|
||||||
|
|
||||||
async function createNewTag(toCreate: GQL.ScrapedTag) {
|
async function createNewTag(
|
||||||
const tagInput: GQL.TagCreateInput = { name: toCreate.name ?? "" };
|
tag: GQL.ScrapedTag,
|
||||||
|
toCreate: GQL.TagCreateInput
|
||||||
|
) {
|
||||||
try {
|
try {
|
||||||
const result = await createTag({
|
const result = await createTag({
|
||||||
variables: {
|
variables: {
|
||||||
input: tagInput,
|
input: toCreate,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
const tagID = result.data?.tagCreate?.id;
|
const tagID = result.data?.tagCreate?.id;
|
||||||
|
if (tagID === undefined) return undefined;
|
||||||
|
|
||||||
const newSearchResults = mapResults((r) => {
|
const newSearchResults = mapResults((r) => {
|
||||||
if (!r.tags) {
|
if (!r.tags) {
|
||||||
|
|
@ -503,7 +511,7 @@ export const TaggerContext: React.FC = ({ children }) => {
|
||||||
return {
|
return {
|
||||||
...r,
|
...r,
|
||||||
tags: r.tags.map((t) => {
|
tags: r.tags.map((t) => {
|
||||||
if (t.name === toCreate.name) {
|
if (t.name === tag.name) {
|
||||||
return {
|
return {
|
||||||
...t,
|
...t,
|
||||||
stored_id: tagID,
|
stored_id: tagID,
|
||||||
|
|
@ -531,7 +539,10 @@ export const TaggerContext: React.FC = ({ children }) => {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async function createNewPerformer(toCreate: GQL.PerformerCreateInput) {
|
async function createNewPerformer(
|
||||||
|
performer: GQL.ScrapedPerformer,
|
||||||
|
toCreate: GQL.PerformerCreateInput
|
||||||
|
) {
|
||||||
try {
|
try {
|
||||||
const result = await createPerformer({
|
const result = await createPerformer({
|
||||||
variables: {
|
variables: {
|
||||||
|
|
@ -540,6 +551,7 @@ export const TaggerContext: React.FC = ({ children }) => {
|
||||||
});
|
});
|
||||||
|
|
||||||
const performerID = result.data?.performerCreate?.id;
|
const performerID = result.data?.performerCreate?.id;
|
||||||
|
if (performerID === undefined) return undefined;
|
||||||
|
|
||||||
const newSearchResults = mapResults((r) => {
|
const newSearchResults = mapResults((r) => {
|
||||||
if (!r.performers) {
|
if (!r.performers) {
|
||||||
|
|
@ -548,15 +560,15 @@ export const TaggerContext: React.FC = ({ children }) => {
|
||||||
|
|
||||||
return {
|
return {
|
||||||
...r,
|
...r,
|
||||||
performers: r.performers.map((t) => {
|
performers: r.performers.map((p) => {
|
||||||
if (t.name === toCreate.name) {
|
if (p.remote_site_id === performer.remote_site_id) {
|
||||||
return {
|
return {
|
||||||
...t,
|
...p,
|
||||||
stored_id: performerID,
|
stored_id: performerID,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
return t;
|
return p;
|
||||||
}),
|
}),
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|
@ -640,7 +652,12 @@ export const TaggerContext: React.FC = ({ children }) => {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async function createNewStudio(toCreate: GQL.StudioCreateInput) {
|
async function createNewStudio(
|
||||||
|
studio: GQL.ScrapedStudio,
|
||||||
|
toCreate: GQL.StudioCreateInput
|
||||||
|
) {
|
||||||
|
if (!currentSource?.stashboxEndpoint) return;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const result = await createStudio({
|
const result = await createStudio({
|
||||||
variables: {
|
variables: {
|
||||||
|
|
@ -649,6 +666,7 @@ export const TaggerContext: React.FC = ({ children }) => {
|
||||||
});
|
});
|
||||||
|
|
||||||
const studioID = result.data?.studioCreate?.id;
|
const studioID = result.data?.studioCreate?.id;
|
||||||
|
if (studioID === undefined) return undefined;
|
||||||
|
|
||||||
const newSearchResults = mapResults((r) => {
|
const newSearchResults = mapResults((r) => {
|
||||||
if (!r.studio) {
|
if (!r.studio) {
|
||||||
|
|
@ -658,7 +676,7 @@ export const TaggerContext: React.FC = ({ children }) => {
|
||||||
return {
|
return {
|
||||||
...r,
|
...r,
|
||||||
studio:
|
studio:
|
||||||
r.studio.name === toCreate.name
|
r.studio.remote_site_id === studio.remote_site_id
|
||||||
? {
|
? {
|
||||||
...r.studio,
|
...r.studio,
|
||||||
stored_id: studioID,
|
stored_id: studioID,
|
||||||
|
|
@ -720,7 +738,7 @@ export const TaggerContext: React.FC = ({ children }) => {
|
||||||
return {
|
return {
|
||||||
...r,
|
...r,
|
||||||
studio:
|
studio:
|
||||||
r.remote_site_id === studio.remote_site_id
|
r.studio.remote_site_id === studio.remote_site_id
|
||||||
? {
|
? {
|
||||||
...r.studio,
|
...r.studio,
|
||||||
stored_id: studioID,
|
stored_id: studioID,
|
||||||
|
|
|
||||||
|
|
@ -396,26 +396,20 @@ const StashSearchResult: React.FC<IStashSearchResultProps> = ({
|
||||||
await saveScene(sceneCreateInput, includeStashID);
|
await saveScene(sceneCreateInput, includeStashID);
|
||||||
}
|
}
|
||||||
|
|
||||||
function performerModalCallback(
|
|
||||||
toCreate?: GQL.PerformerCreateInput | undefined
|
|
||||||
) {
|
|
||||||
if (toCreate) {
|
|
||||||
createNewPerformer(toCreate);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function showPerformerModal(t: GQL.ScrapedPerformer) {
|
function showPerformerModal(t: GQL.ScrapedPerformer) {
|
||||||
createPerformerModal(t, performerModalCallback);
|
createPerformerModal(t, (toCreate) => {
|
||||||
}
|
if (toCreate) {
|
||||||
|
createNewPerformer(t, toCreate);
|
||||||
function studioModalCallback(toCreate?: GQL.StudioCreateInput | undefined) {
|
}
|
||||||
if (toCreate) {
|
});
|
||||||
createNewStudio(toCreate);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function showStudioModal(t: GQL.ScrapedStudio) {
|
function showStudioModal(t: GQL.ScrapedStudio) {
|
||||||
createStudioModal(t, studioModalCallback);
|
createStudioModal(t, (toCreate) => {
|
||||||
|
if (toCreate) {
|
||||||
|
createNewStudio(t, toCreate);
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// constants to get around dot-notation eslint rule
|
// constants to get around dot-notation eslint rule
|
||||||
|
|
@ -660,7 +654,8 @@ const StashSearchResult: React.FC<IStashSearchResultProps> = ({
|
||||||
);
|
);
|
||||||
|
|
||||||
async function onCreateTag(t: GQL.ScrapedTag) {
|
async function onCreateTag(t: GQL.ScrapedTag) {
|
||||||
const newTagID = await createNewTag(t);
|
const toCreate: GQL.TagCreateInput = { name: t.name };
|
||||||
|
const newTagID = await createNewTag(t, toCreate);
|
||||||
if (newTagID !== undefined) {
|
if (newTagID !== undefined) {
|
||||||
setTagIDs([...tagIDs, newTagID]);
|
setTagIDs([...tagIDs, newTagID]);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load diff
|
|
@ -12,60 +12,55 @@ import { onError } from "@apollo/client/link/error";
|
||||||
import { getMainDefinition } from "@apollo/client/utilities";
|
import { getMainDefinition } from "@apollo/client/utilities";
|
||||||
import { createUploadLink } from "apollo-upload-client";
|
import { createUploadLink } from "apollo-upload-client";
|
||||||
import * as GQL from "src/core/generated-graphql";
|
import * as GQL from "src/core/generated-graphql";
|
||||||
|
import { FieldReadFunction } from "@apollo/client/cache";
|
||||||
|
|
||||||
|
// A read function that returns a cache reference with the given
|
||||||
|
// typename if no valid reference is available.
|
||||||
|
// Allows to return a cached object rather than fetching.
|
||||||
|
const readReference = (typename: string): FieldReadFunction => {
|
||||||
|
return (existing, { args, canRead, toReference }) =>
|
||||||
|
canRead(existing)
|
||||||
|
? existing
|
||||||
|
: toReference({
|
||||||
|
__typename: typename,
|
||||||
|
id: args?.id,
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
// A read function that returns null if no valid reference is available.
|
||||||
|
// Means that a dangling reference implies the object was deleted.
|
||||||
|
const readDanglingNull: FieldReadFunction = (existing, { canRead }) =>
|
||||||
|
canRead(existing) ? existing : null;
|
||||||
|
|
||||||
// Policies that tell apollo what the type of the returned object will be.
|
|
||||||
// In many cases this allows it to return from cache immediately rather than fetching.
|
|
||||||
const typePolicies: TypePolicies = {
|
const typePolicies: TypePolicies = {
|
||||||
Query: {
|
Query: {
|
||||||
fields: {
|
fields: {
|
||||||
findImage: {
|
findImage: {
|
||||||
read: (_, { args, toReference }) =>
|
read: readReference("Image"),
|
||||||
toReference({
|
|
||||||
__typename: "Image",
|
|
||||||
id: args?.id,
|
|
||||||
}),
|
|
||||||
},
|
},
|
||||||
findPerformer: {
|
findPerformer: {
|
||||||
read: (_, { args, toReference }) =>
|
read: readReference("Performer"),
|
||||||
toReference({
|
|
||||||
__typename: "Performer",
|
|
||||||
id: args?.id,
|
|
||||||
}),
|
|
||||||
},
|
},
|
||||||
findStudio: {
|
findStudio: {
|
||||||
read: (_, { args, toReference }) =>
|
read: readReference("Studio"),
|
||||||
toReference({
|
|
||||||
__typename: "Studio",
|
|
||||||
id: args?.id,
|
|
||||||
}),
|
|
||||||
},
|
},
|
||||||
findMovie: {
|
findMovie: {
|
||||||
read: (_, { args, toReference }) =>
|
read: readReference("Movie"),
|
||||||
toReference({
|
|
||||||
__typename: "Movie",
|
|
||||||
id: args?.id,
|
|
||||||
}),
|
|
||||||
},
|
},
|
||||||
findGallery: {
|
findGallery: {
|
||||||
read: (_, { args, toReference }) =>
|
read: readReference("Gallery"),
|
||||||
toReference({
|
|
||||||
__typename: "Gallery",
|
|
||||||
id: args?.id,
|
|
||||||
}),
|
|
||||||
},
|
},
|
||||||
findScene: {
|
findScene: {
|
||||||
read: (_, { args, toReference }) =>
|
read: readReference("Scene"),
|
||||||
toReference({
|
|
||||||
__typename: "Scene",
|
|
||||||
id: args?.id,
|
|
||||||
}),
|
|
||||||
},
|
},
|
||||||
findTag: {
|
findTag: {
|
||||||
read: (_, { args, toReference }) =>
|
read: readReference("Tag"),
|
||||||
toReference({
|
},
|
||||||
__typename: "Tag",
|
findSavedFilter: {
|
||||||
id: args?.id,
|
read: readReference("SavedFilter"),
|
||||||
}),
|
},
|
||||||
|
findDefaultFilter: {
|
||||||
|
read: readDanglingNull,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
@ -74,6 +69,37 @@ const typePolicies: TypePolicies = {
|
||||||
scene_markers: {
|
scene_markers: {
|
||||||
merge: false,
|
merge: false,
|
||||||
},
|
},
|
||||||
|
studio: {
|
||||||
|
read: readDanglingNull,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Image: {
|
||||||
|
fields: {
|
||||||
|
studio: {
|
||||||
|
read: readDanglingNull,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Movie: {
|
||||||
|
fields: {
|
||||||
|
studio: {
|
||||||
|
read: readDanglingNull,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Gallery: {
|
||||||
|
fields: {
|
||||||
|
studio: {
|
||||||
|
read: readDanglingNull,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Studio: {
|
||||||
|
fields: {
|
||||||
|
parent_studio: {
|
||||||
|
read: readDanglingNull,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
Tag: {
|
Tag: {
|
||||||
|
|
@ -89,6 +115,7 @@ const typePolicies: TypePolicies = {
|
||||||
};
|
};
|
||||||
|
|
||||||
const possibleTypes = {
|
const possibleTypes = {
|
||||||
|
BaseFile: ["VideoFile", "ImageFile", "GalleryFile"],
|
||||||
VisualFile: ["VideoFile", "ImageFile"],
|
VisualFile: ["VideoFile", "ImageFile"],
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -21,18 +21,18 @@
|
||||||
resize-observer-polyfill "^1.5.1"
|
resize-observer-polyfill "^1.5.1"
|
||||||
throttle-debounce "^5.0.0"
|
throttle-debounce "^5.0.0"
|
||||||
|
|
||||||
"@apollo/client@^3.7.0", "@apollo/client@^3.7.8":
|
"@apollo/client@^3.7.0", "@apollo/client@^3.7.17":
|
||||||
version "3.7.8"
|
version "3.7.17"
|
||||||
resolved "https://registry.yarnpkg.com/@apollo/client/-/client-3.7.8.tgz#e1c8dfd02cbbe1baf9b18fa86918904efd9cc580"
|
resolved "https://registry.yarnpkg.com/@apollo/client/-/client-3.7.17.tgz#1d2538729fd8ef138aa301a7cf62704474e57b72"
|
||||||
integrity sha512-o1NxF4ytET2w9HSVMLwYUEEdv6H3XPpbh9M+ABVGnUVT0s6T9pgqRtYO4pFP1TmeDmb1pbRfVhFwh3gC167j5Q==
|
integrity sha512-0EErSHEtKPNl5wgWikHJbKFAzJ/k11O0WO2QyqZSHpdxdAnw7UWHY4YiLbHCFG7lhrD+NTQ3Z/H9Jn4rcikoJA==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@graphql-typed-document-node/core" "^3.1.1"
|
"@graphql-typed-document-node/core" "^3.1.1"
|
||||||
"@wry/context" "^0.7.0"
|
"@wry/context" "^0.7.0"
|
||||||
"@wry/equality" "^0.5.0"
|
"@wry/equality" "^0.5.0"
|
||||||
"@wry/trie" "^0.3.0"
|
"@wry/trie" "^0.4.0"
|
||||||
graphql-tag "^2.12.6"
|
graphql-tag "^2.12.6"
|
||||||
hoist-non-react-statics "^3.3.2"
|
hoist-non-react-statics "^3.3.2"
|
||||||
optimism "^0.16.1"
|
optimism "^0.16.2"
|
||||||
prop-types "^15.7.2"
|
prop-types "^15.7.2"
|
||||||
response-iterator "^0.2.6"
|
response-iterator "^0.2.6"
|
||||||
symbol-observable "^4.0.0"
|
symbol-observable "^4.0.0"
|
||||||
|
|
@ -2718,6 +2718,13 @@
|
||||||
dependencies:
|
dependencies:
|
||||||
tslib "^2.3.0"
|
tslib "^2.3.0"
|
||||||
|
|
||||||
|
"@wry/trie@^0.4.0":
|
||||||
|
version "0.4.3"
|
||||||
|
resolved "https://registry.yarnpkg.com/@wry/trie/-/trie-0.4.3.tgz#077d52c22365871bf3ffcbab8e95cb8bc5689af4"
|
||||||
|
integrity sha512-I6bHwH0fSf6RqQcnnXLJKhkSXG45MFral3GxPaY4uAl0LYDZM+YDVDAiU9bYwjTuysy1S0IeecWtmq1SZA3M1w==
|
||||||
|
dependencies:
|
||||||
|
tslib "^2.3.0"
|
||||||
|
|
||||||
"@xmldom/xmldom@^0.8.3":
|
"@xmldom/xmldom@^0.8.3":
|
||||||
version "0.8.6"
|
version "0.8.6"
|
||||||
resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.8.6.tgz#8a1524eb5bd5e965c1e3735476f0262469f71440"
|
resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.8.6.tgz#8a1524eb5bd5e965c1e3735476f0262469f71440"
|
||||||
|
|
@ -6197,7 +6204,7 @@ onetime@^5.1.0:
|
||||||
dependencies:
|
dependencies:
|
||||||
mimic-fn "^2.1.0"
|
mimic-fn "^2.1.0"
|
||||||
|
|
||||||
optimism@^0.16.1:
|
optimism@^0.16.2:
|
||||||
version "0.16.2"
|
version "0.16.2"
|
||||||
resolved "https://registry.yarnpkg.com/optimism/-/optimism-0.16.2.tgz#519b0c78b3b30954baed0defe5143de7776bf081"
|
resolved "https://registry.yarnpkg.com/optimism/-/optimism-0.16.2.tgz#519b0c78b3b30954baed0defe5143de7776bf081"
|
||||||
integrity sha512-zWNbgWj+3vLEjZNIh/okkY2EUfX+vB9TJopzIZwT1xxaMqC5hRLLraePod4c5n4He08xuXNH+zhKFFCu390wiQ==
|
integrity sha512-zWNbgWj+3vLEjZNIh/okkY2EUfX+vB9TJopzIZwT1xxaMqC5hRLLraePod4c5n4He08xuXNH+zhKFFCu390wiQ==
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue