mirror of
https://github.com/stashapp/stash.git
synced 2025-12-06 08:26:00 +01:00
* Add collation to directory listings. Closes #1806 Introduce a new `locale` arg to the `Query.directory` field. Set "en" as the default for the field for backward compatibility. Use the given locale, sending it through a language matcher, and use `x/text` as the collation engine for the matched language. Augment the file `ListDirs` call to optionally take a Collator. If the Collator is given, sort file listings according to the collators rules. While here, document the GraphQL schema a bit more. Add matchers by looking at the current front-end locales, and make sure each of these occur in the matcher list. * Language matcher touchups * Avoid having `en-US` twice. * Introduce `en-AU`. * Pass IgnoreCase and Numeric collation Allow the collator to be configured with options. Pass the options IgnoreCase and Numeric to the collator.
307 lines
12 KiB
GraphQL
307 lines
12 KiB
GraphQL
"""The query root for this schema"""
|
|
type Query {
|
|
# Filters
|
|
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 """
|
|
findDuplicateScenes(distance: Int): [[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): 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"""
|
|
listPerformerScrapers: [Scraper!]!
|
|
listSceneScrapers: [Scraper!]!
|
|
listGalleryScrapers: [Scraper!]!
|
|
listMovieScrapers: [Scraper!]!
|
|
|
|
"""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 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 a complete performer record based on a URL"""
|
|
scrapePerformerURL(url: String!): ScrapedPerformer
|
|
"""Scrapes a complete performer 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 performer using Freeones"""
|
|
scrapeFreeones(performer_name: String!): ScrapedPerformer @deprecated(reason: "use scrapeSinglePerformer with scraper_id = builtin_freeones")
|
|
"""Scrape a list of performers from a query"""
|
|
scrapeFreeonesPerformerList(query: String!): [String!]! @deprecated(reason: "use scrapeSinglePerformer with scraper_id = builtin_freeones")
|
|
|
|
"""Query StashBox for scenes"""
|
|
queryStashBoxScene(input: StashBoxSceneQueryInput!): [ScrapedScene!]! @deprecated(reason: "use scrapeSingleScene or scrapeMultiScenes")
|
|
"""Query StashBox for performers"""
|
|
queryStashBoxPerformer(input: StashBoxPerformerQueryInput!): [StashBoxPerformerQueryResult!]! @deprecated(reason: "use scrapeSinglePerformer or scrapeMultiPerformers")
|
|
# === end deprecated methods ===
|
|
|
|
# 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!
|
|
|
|
# System status
|
|
systemStatus: SystemStatus!
|
|
|
|
# Job status
|
|
jobQueue: [Job!]
|
|
findJob(input: FindJobInput!): Job
|
|
|
|
dlnaStatus: DLNAStatus!
|
|
|
|
# Get everything
|
|
|
|
allPerformers: [Performer!]!
|
|
allStudios: [Studio!]!
|
|
allMovies: [Movie!]!
|
|
allTags: [Tag!]!
|
|
|
|
# Get everything with minimal metadata
|
|
|
|
# Version
|
|
version: Version!
|
|
|
|
# LatestVersion
|
|
latestversion: ShortVersion!
|
|
}
|
|
|
|
type Mutation {
|
|
setup(input: SetupInput!): Boolean!
|
|
migrate(input: MigrateInput!): Boolean!
|
|
|
|
sceneUpdate(input: SceneUpdateInput!): 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!
|
|
|
|
"""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!
|
|
|
|
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!
|
|
|
|
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!
|
|
|
|
tagCreate(input: TagCreateInput!): Tag
|
|
tagUpdate(input: TagUpdateInput!): Tag
|
|
tagDestroy(input: TagDestroyInput!): Boolean!
|
|
tagsDestroy(ids: [ID!]!): Boolean!
|
|
tagsMerge(input: TagsMergeInput!): Tag
|
|
|
|
# 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!
|
|
|
|
"""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!
|
|
"""Migrate generated files for the current hash naming"""
|
|
migrateHashNaming: 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!
|
|
|
|
"""Backup the database. Optionally returns a link to download the database file"""
|
|
backupDatabase(input: BackupDatabaseInput!): String
|
|
|
|
"""Run batch performer tag task. Returns the job ID."""
|
|
stashBoxBatchPerformerTag(input: StashBoxBatchPerformerTagInput!): 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
|
|
}
|