"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 }