stash/graphql/schema/schema.graphql

456 lines
15 KiB
GraphQL

"The query root for this schema"
type Query {
# Filters
findSavedFilter(id: ID!): SavedFilter
findSavedFilters(mode: FilterMode): [SavedFilter!]!
findDefaultFilter(mode: FilterMode!): SavedFilter
"Find a scene by ID or Checksum"
findScene(id: ID, checksum: String): Scene
findSceneByHash(input: SceneHashInput!): Scene
"A function which queries Scene objects"
findScenes(
scene_filter: SceneFilterType
scene_ids: [Int!]
filter: FindFilterType
): FindScenesResultType!
findScenesByPathRegex(filter: FindFilterType): FindScenesResultType!
"""
Returns any groups of scenes that are perceptual duplicates within the queried distance
and the difference between their duration is smaller than durationDiff
"""
findDuplicateScenes(
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.
"""
duration_diff: Float
): [[Scene!]!]!
"Return valid stream paths"
sceneStreams(id: ID): [SceneStreamEndpoint!]!
parseSceneFilenames(
filter: FindFilterType
config: SceneParserInput!
): SceneParserResultType!
"A function which queries SceneMarker objects"
findSceneMarkers(
scene_marker_filter: SceneMarkerFilterType
filter: FindFilterType
): FindSceneMarkersResultType!
findImage(id: ID, checksum: String): Image
"A function which queries Scene objects"
findImages(
image_filter: ImageFilterType
image_ids: [Int!]
filter: FindFilterType
): FindImagesResultType!
"Find a performer by ID"
findPerformer(id: ID!): Performer
"A function which queries Performer objects"
findPerformers(
performer_filter: PerformerFilterType
filter: FindFilterType
performer_ids: [Int!]
): FindPerformersResultType!
"Find a studio by ID"
findStudio(id: ID!): Studio
"A function which queries Studio objects"
findStudios(
studio_filter: StudioFilterType
filter: FindFilterType
): FindStudiosResultType!
"Find a movie by ID"
findMovie(id: ID!): Movie
"A function which queries Movie objects"
findMovies(
movie_filter: MovieFilterType
filter: FindFilterType
): FindMoviesResultType!
findGallery(id: ID!): Gallery
findGalleries(
gallery_filter: GalleryFilterType
filter: FindFilterType
): FindGalleriesResultType!
findTag(id: ID!): Tag
findTags(
tag_filter: TagFilterType
filter: FindFilterType
): FindTagsResultType!
"Retrieve random scene markers for the wall"
markerWall(q: String): [SceneMarker!]!
"Retrieve random scenes for the wall"
sceneWall(q: String): [Scene!]!
"Get marker strings"
markerStrings(q: String, sort: String): [MarkerStringsResultType]!
"Get stats"
stats: StatsResultType!
"Organize scene markers by tag for a given scene ID"
sceneMarkerTags(scene_id: ID!): [SceneMarkerTag!]!
logs: [LogEntry!]!
# Scrapers
"List available scrapers"
listScrapers(types: [ScrapeContentType!]!): [Scraper!]!
listPerformerScrapers: [Scraper!]!
@deprecated(reason: "Use listScrapers(types: [PERFORMER])")
listSceneScrapers: [Scraper!]!
@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 studio"
scrapeSingleStudio(
source: ScraperSourceInput!
input: ScrapeSingleStudioInput!
): [ScrapedStudio!]!
"Scrape for a single performer"
scrapeSinglePerformer(
source: ScraperSourceInput!
input: ScrapeSinglePerformerInput!
): [ScrapedPerformer!]!
"Scrape for multiple performers"
scrapeMultiPerformers(
source: ScraperSourceInput!
input: ScrapeMultiPerformersInput!
): [[ScrapedPerformer!]!]!
"Scrape for a single gallery"
scrapeSingleGallery(
source: ScraperSourceInput!
input: ScrapeSingleGalleryInput!
): [ScrapedGallery!]!
"Scrape for a single movie"
scrapeSingleMovie(
source: ScraperSourceInput!
input: ScrapeSingleMovieInput!
): [ScrapedMovie!]!
"Scrapes content based on a URL"
scrapeURL(url: String!, ty: ScrapeContentType!): ScrapedContent
"Scrapes a complete performer record based on a URL"
scrapePerformerURL(url: String!): ScrapedPerformer
"Scrapes a complete scene record based on a URL"
scrapeSceneURL(url: String!): ScrapedScene
"Scrapes a complete gallery record based on a URL"
scrapeGalleryURL(url: String!): ScrapedGallery
"Scrapes a complete movie record based on a URL"
scrapeMovieURL(url: String!): ScrapedMovie
"Scrape a list of performers based on name"
scrapePerformerList(scraper_id: ID!, query: String!): [ScrapedPerformer!]!
@deprecated(reason: "use scrapeSinglePerformer")
"Scrapes a complete performer record based on a scrapePerformerList result"
scrapePerformer(
scraper_id: ID!
scraped_performer: ScrapedPerformerInput!
): 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"
scrapeFreeonesPerformerList(query: String!): [String!]!
@deprecated(
reason: "use scrapeSinglePerformer with scraper_id = builtin_freeones"
)
# Plugins
"List loaded plugins"
plugins: [Plugin!]
"List available plugin operations"
pluginTasks: [PluginTask!]
# Config
"Returns the current, complete configuration"
configuration: ConfigResult!
"Returns an array of paths for the given path"
directory(
"The directory path to list"
path: String
"Desired collation locale. Determines the order of the directory result. eg. 'en-US', 'pt-BR', ..."
locale: String = "en"
): Directory!
validateStashBoxCredentials(input: StashBoxInput!): StashBoxValidationResult!
# System status
systemStatus: SystemStatus!
# Job status
jobQueue: [Job!]
findJob(input: FindJobInput!): Job
dlnaStatus: DLNAStatus!
# Get everything
allScenes: [Scene!]!
allSceneMarkers: [SceneMarker!]!
allImages: [Image!]!
allGalleries: [Gallery!]!
allStudios: [Studio!]!
allMovies: [Movie!]!
allTags: [Tag!]!
# @deprecated
allPerformers: [Performer!]!
# Get everything with minimal metadata
# Version
version: Version!
# LatestVersion
latestversion: LatestVersion!
}
type Mutation {
setup(input: SetupInput!): Boolean!
migrate(input: MigrateInput!): Boolean!
sceneCreate(input: SceneCreateInput!): Scene
sceneUpdate(input: SceneUpdateInput!): Scene
sceneMerge(input: SceneMergeInput!): Scene
bulkSceneUpdate(input: BulkSceneUpdateInput!): [Scene!]
sceneDestroy(input: SceneDestroyInput!): Boolean!
scenesDestroy(input: ScenesDestroyInput!): Boolean!
scenesUpdate(input: [SceneUpdateInput!]!): [Scene]
"Increments the o-counter for a scene. Returns the new value"
sceneIncrementO(id: ID!): Int!
"Decrements the o-counter for a scene. Returns the new value"
sceneDecrementO(id: ID!): Int!
"Resets the o-counter for a scene to 0. Returns the new value"
sceneResetO(id: ID!): Int!
"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!
"Increments the play count for the scene. Returns the new play count value."
sceneIncrementPlayCount(id: ID!): Int!
"Generates screenshot at specified time in seconds. Leave empty to generate default screenshot"
sceneGenerateScreenshot(id: ID!, at: Float): String!
sceneMarkerCreate(input: SceneMarkerCreateInput!): SceneMarker
sceneMarkerUpdate(input: SceneMarkerUpdateInput!): SceneMarker
sceneMarkerDestroy(id: ID!): Boolean!
sceneAssignFile(input: AssignSceneFileInput!): Boolean!
imageUpdate(input: ImageUpdateInput!): Image
bulkImageUpdate(input: BulkImageUpdateInput!): [Image!]
imageDestroy(input: ImageDestroyInput!): Boolean!
imagesDestroy(input: ImagesDestroyInput!): Boolean!
imagesUpdate(input: [ImageUpdateInput!]!): [Image]
"Increments the o-counter for an image. Returns the new value"
imageIncrementO(id: ID!): Int!
"Decrements the o-counter for an image. Returns the new value"
imageDecrementO(id: ID!): Int!
"Resets the o-counter for a image to 0. Returns the new value"
imageResetO(id: ID!): Int!
galleryCreate(input: GalleryCreateInput!): Gallery
galleryUpdate(input: GalleryUpdateInput!): Gallery
bulkGalleryUpdate(input: BulkGalleryUpdateInput!): [Gallery!]
galleryDestroy(input: GalleryDestroyInput!): Boolean!
galleriesUpdate(input: [GalleryUpdateInput!]!): [Gallery]
addGalleryImages(input: GalleryAddInput!): Boolean!
removeGalleryImages(input: GalleryRemoveInput!): Boolean!
galleryChapterCreate(input: GalleryChapterCreateInput!): GalleryChapter
galleryChapterUpdate(input: GalleryChapterUpdateInput!): GalleryChapter
galleryChapterDestroy(id: ID!): Boolean!
performerCreate(input: PerformerCreateInput!): Performer
performerUpdate(input: PerformerUpdateInput!): Performer
performerDestroy(input: PerformerDestroyInput!): Boolean!
performersDestroy(ids: [ID!]!): Boolean!
bulkPerformerUpdate(input: BulkPerformerUpdateInput!): [Performer!]
studioCreate(input: StudioCreateInput!): Studio
studioUpdate(input: StudioUpdateInput!): Studio
studioDestroy(input: StudioDestroyInput!): Boolean!
studiosDestroy(ids: [ID!]!): Boolean!
movieCreate(input: MovieCreateInput!): Movie
movieUpdate(input: MovieUpdateInput!): Movie
movieDestroy(input: MovieDestroyInput!): Boolean!
moviesDestroy(ids: [ID!]!): Boolean!
bulkMovieUpdate(input: BulkMovieUpdateInput!): [Movie!]
tagCreate(input: TagCreateInput!): Tag
tagUpdate(input: TagUpdateInput!): Tag
tagDestroy(input: TagDestroyInput!): Boolean!
tagsDestroy(ids: [ID!]!): Boolean!
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.
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
matches one of the media extensions.
Creates folder hierarchy if needed.
"""
moveFiles(input: MoveFilesInput!): Boolean!
deleteFiles(ids: [ID!]!): Boolean!
# Saved filters
saveFilter(input: SaveFilterInput!): SavedFilter!
destroySavedFilter(input: DestroyFilterInput!): Boolean!
setDefaultFilter(input: SetDefaultFilterInput!): Boolean!
"Change general configuration options"
configureGeneral(input: ConfigGeneralInput!): ConfigGeneralResult!
configureInterface(input: ConfigInterfaceInput!): ConfigInterfaceResult!
configureDLNA(input: ConfigDLNAInput!): ConfigDLNAResult!
configureScraping(input: ConfigScrapingInput!): ConfigScrapingResult!
configureDefaults(
input: ConfigDefaultSettingsInput!
): ConfigDefaultSettingsResult!
# overwrites the entire UI configuration
configureUI(input: Map!): Map!
# sets a single UI key value
configureUISetting(key: String!, value: Any): Map!
"Generate and set (or clear) API key"
generateAPIKey(input: GenerateAPIKeyInput!): String!
"Returns a link to download the result"
exportObjects(input: ExportObjectsInput!): String
"Performs an incremental import. Returns the job ID"
importObjects(input: ImportObjectsInput!): ID!
"Start an full import. Completely wipes the database and imports from the metadata directory. Returns the job ID"
metadataImport: ID!
"Start a full export. Outputs to the metadata directory. Returns the job ID"
metadataExport: ID!
"Start a scan. Returns the job ID"
metadataScan(input: ScanMetadataInput!): ID!
"Start generating content. Returns the job ID"
metadataGenerate(input: GenerateMetadataInput!): ID!
"Start auto-tagging. Returns the job ID"
metadataAutoTag(input: AutoTagMetadataInput!): ID!
"Clean metadata. Returns the job ID"
metadataClean(input: CleanMetadataInput!): ID!
"Identifies scenes using scrapers. Returns the job ID"
metadataIdentify(input: IdentifyMetadataInput!): ID!
"Migrate generated files for the current hash naming"
migrateHashNaming: ID!
"Migrates legacy scene screenshot files into the blob storage"
migrateSceneScreenshots(input: MigrateSceneScreenshotsInput!): ID!
"Migrates blobs from the old storage system to the current one"
migrateBlobs(input: MigrateBlobsInput!): ID!
"Anonymise the database in a separate file. Optionally returns a link to download the database file"
anonymiseDatabase(input: AnonymiseDatabaseInput!): String
"Optimises the database. Returns the job ID"
optimiseDatabase: ID!
"Reload scrapers"
reloadScrapers: Boolean!
"Run plugin task. Returns the job ID"
runPluginTask(
plugin_id: ID!
task_name: String!
args: [PluginArgInput!]
): ID!
reloadPlugins: Boolean!
stopJob(job_id: ID!): Boolean!
stopAllJobs: Boolean!
"Submit fingerprints to stash-box instance"
submitStashBoxFingerprints(
input: StashBoxFingerprintSubmissionInput!
): Boolean!
"Submit scene as draft to stash-box instance"
submitStashBoxSceneDraft(input: StashBoxDraftSubmissionInput!): ID
"Submit performer as draft to stash-box instance"
submitStashBoxPerformerDraft(input: StashBoxDraftSubmissionInput!): ID
"Backup the database. Optionally returns a link to download the database file"
backupDatabase(input: BackupDatabaseInput!): String
"DANGEROUS: Execute an arbitrary SQL statement that returns rows."
querySQL(sql: String!, args: [Any]): SQLQueryResult!
"DANGEROUS: Execute an arbitrary SQL statement without returning any rows."
execSQL(sql: String!, args: [Any]): SQLExecResult!
"Run batch performer tag task. Returns the job ID."
stashBoxBatchPerformerTag(input: StashBoxBatchTagInput!): String!
"Run batch studio tag task. Returns the job ID."
stashBoxBatchStudioTag(input: StashBoxBatchTagInput!): String!
"Enables DLNA for an optional duration. Has no effect if DLNA is enabled by default"
enableDLNA(input: EnableDLNAInput!): Boolean!
"Disables DLNA for an optional duration. Has no effect if DLNA is disabled by default"
disableDLNA(input: DisableDLNAInput!): Boolean!
"Enables an IP address for DLNA for an optional duration"
addTempDLNAIP(input: AddTempDLNAIPInput!): Boolean!
"Removes an IP address from the temporary DLNA whitelist"
removeTempDLNAIP(input: RemoveTempDLNAIPInput!): Boolean!
}
type Subscription {
"Update from the metadata manager"
jobsSubscribe: JobStatusUpdate!
loggingSubscribe: [LogEntry!]!
scanCompleteSubscribe: Boolean!
}
schema {
query: Query
mutation: Mutation
subscription: Subscription
}