gitextract_5pun5gxb/ ├── .dockerignore ├── .gitattributes ├── .github/ │ ├── ISSUE_TEMPLATE/ │ │ ├── bug_report.yml │ │ ├── config.yml │ │ └── feature_request.yml │ ├── PULL_REQUEST_TEMPLATE/ │ │ ├── BugFix.md │ │ └── Feature.md │ └── workflows/ │ ├── build-compiler.yml │ ├── build.yml │ └── golangci-lint.yml ├── .gitignore ├── .golangci.yml ├── .gqlgenc.yml ├── .idea/ │ ├── codeStyles/ │ │ └── codeStyleConfig.xml │ ├── dataSources.xml │ ├── encodings.xml │ ├── go.iml │ ├── misc.xml │ ├── modules.xml │ ├── sqldialects.xml │ └── vcs.xml ├── .mockery.yml ├── LICENSE ├── Makefile ├── README.md ├── cmd/ │ ├── phasher/ │ │ └── main.go │ └── stash/ │ ├── main.go │ └── main_test.go ├── docker/ │ ├── build/ │ │ └── x86_64/ │ │ ├── Dockerfile │ │ ├── Dockerfile-CUDA │ │ └── README.md │ ├── ci/ │ │ └── x86_64/ │ │ ├── Dockerfile │ │ ├── README.md │ │ └── docker_push.sh │ ├── compiler/ │ │ ├── Dockerfile │ │ ├── Makefile │ │ └── README.md │ └── production/ │ ├── README.md │ └── docker-compose.yml ├── docs/ │ ├── CONTRIBUTING.md │ └── DEVELOPMENT.md ├── go.mod ├── go.sum ├── gqlgen.yml ├── graphql/ │ ├── schema/ │ │ ├── schema.graphql │ │ └── types/ │ │ ├── config.graphql │ │ ├── dlna.graphql │ │ ├── file.graphql │ │ ├── filters.graphql │ │ ├── gallery-chapter.graphql │ │ ├── gallery.graphql │ │ ├── group.graphql │ │ ├── image.graphql │ │ ├── job.graphql │ │ ├── logging.graphql │ │ ├── metadata.graphql │ │ ├── migration.graphql │ │ ├── movie.graphql │ │ ├── package.graphql │ │ ├── performer.graphql │ │ ├── plugin.graphql │ │ ├── scalars.graphql │ │ ├── scene-marker-tag.graphql │ │ ├── scene-marker.graphql │ │ ├── scene.graphql │ │ ├── scraped-group.graphql │ │ ├── scraped-performer.graphql │ │ ├── scraper.graphql │ │ ├── sql.graphql │ │ ├── stash-box.graphql │ │ ├── stats.graphql │ │ ├── studio.graphql │ │ ├── tag.graphql │ │ └── version.graphql │ └── stash-box/ │ └── query.graphql ├── internal/ │ ├── api/ │ │ ├── authentication.go │ │ ├── bool_map.go │ │ ├── changeset_translator.go │ │ ├── check_version.go │ │ ├── context_keys.go │ │ ├── custom_fields.go │ │ ├── dir_list.go │ │ ├── doc.go │ │ ├── error.go │ │ ├── fields.go │ │ ├── images.go │ │ ├── input.go │ │ ├── json.go │ │ ├── json_test.go │ │ ├── loaders/ │ │ │ ├── customfieldsloader_gen.go │ │ │ ├── dataloaders.go │ │ │ ├── fileloader_gen.go │ │ │ ├── folderloader_gen.go │ │ │ ├── folderparentfolderidsloader_gen.go │ │ │ ├── galleryfileidsloader_gen.go │ │ │ ├── galleryloader_gen.go │ │ │ ├── grouploader_gen.go │ │ │ ├── imagefileidsloader_gen.go │ │ │ ├── imageloader_gen.go │ │ │ ├── performerloader_gen.go │ │ │ ├── scenefileidsloader_gen.go │ │ │ ├── scenelastplayedloader_gen.go │ │ │ ├── sceneloader_gen.go │ │ │ ├── sceneocountloader_gen.go │ │ │ ├── sceneohistoryloader_gen.go │ │ │ ├── sceneplaycountloader_gen.go │ │ │ ├── sceneplayhistoryloader_gen.go │ │ │ ├── studioloader_gen.go │ │ │ └── tagloader_gen.go │ │ ├── locale.go │ │ ├── models.go │ │ ├── plugin_map.go │ │ ├── resolver.go │ │ ├── resolver_model_config.go │ │ ├── resolver_model_file.go │ │ ├── resolver_model_folder.go │ │ ├── resolver_model_gallery.go │ │ ├── resolver_model_gallery_chapter.go │ │ ├── resolver_model_image.go │ │ ├── resolver_model_movie.go │ │ ├── resolver_model_performer.go │ │ ├── resolver_model_plugin.go │ │ ├── resolver_model_saved_filter.go │ │ ├── resolver_model_scene.go │ │ ├── resolver_model_scene_marker.go │ │ ├── resolver_model_studio.go │ │ ├── resolver_model_tag.go │ │ ├── resolver_mutation_configure.go │ │ ├── resolver_mutation_dlna.go │ │ ├── resolver_mutation_file.go │ │ ├── resolver_mutation_gallery.go │ │ ├── resolver_mutation_group.go │ │ ├── resolver_mutation_image.go │ │ ├── resolver_mutation_job.go │ │ ├── resolver_mutation_metadata.go │ │ ├── resolver_mutation_migrate.go │ │ ├── resolver_mutation_movie.go │ │ ├── resolver_mutation_package.go │ │ ├── resolver_mutation_performer.go │ │ ├── resolver_mutation_plugin.go │ │ ├── resolver_mutation_saved_filter.go │ │ ├── resolver_mutation_scene.go │ │ ├── resolver_mutation_scraper.go │ │ ├── resolver_mutation_stash_box.go │ │ ├── resolver_mutation_studio.go │ │ ├── resolver_mutation_tag.go │ │ ├── resolver_mutation_tag_test.go │ │ ├── resolver_query_configuration.go │ │ ├── resolver_query_dlna.go │ │ ├── resolver_query_find_file.go │ │ ├── resolver_query_find_folder.go │ │ ├── resolver_query_find_gallery.go │ │ ├── resolver_query_find_group.go │ │ ├── resolver_query_find_image.go │ │ ├── resolver_query_find_movie.go │ │ ├── resolver_query_find_performer.go │ │ ├── resolver_query_find_saved_filter.go │ │ ├── resolver_query_find_scene.go │ │ ├── resolver_query_find_scene_marker.go │ │ ├── resolver_query_find_studio.go │ │ ├── resolver_query_find_tag.go │ │ ├── resolver_query_job.go │ │ ├── resolver_query_logs.go │ │ ├── resolver_query_metadata.go │ │ ├── resolver_query_package.go │ │ ├── resolver_query_plugin.go │ │ ├── resolver_query_scene.go │ │ ├── resolver_query_scraper.go │ │ ├── resolver_subscription_job.go │ │ ├── resolver_subscription_logging.go │ │ ├── routes.go │ │ ├── routes_custom.go │ │ ├── routes_downloads.go │ │ ├── routes_gallery.go │ │ ├── routes_group.go │ │ ├── routes_image.go │ │ ├── routes_performer.go │ │ ├── routes_plugin.go │ │ ├── routes_scene.go │ │ ├── routes_studio.go │ │ ├── routes_tag.go │ │ ├── scraped_content.go │ │ ├── server.go │ │ ├── session.go │ │ ├── stash_box.go │ │ ├── timestamp.go │ │ ├── timestamp_test.go │ │ ├── types.go │ │ └── urlbuilders/ │ │ ├── doc.go │ │ ├── gallery.go │ │ ├── group.go │ │ ├── image.go │ │ ├── performer.go │ │ ├── scene.go │ │ ├── scene_markers.go │ │ ├── studio.go │ │ └── tag.go │ ├── autotag/ │ │ ├── doc.go │ │ ├── gallery.go │ │ ├── gallery_test.go │ │ ├── image.go │ │ ├── image_test.go │ │ ├── integration_test.go │ │ ├── performer.go │ │ ├── performer_test.go │ │ ├── scene.go │ │ ├── scene_test.go │ │ ├── studio.go │ │ ├── studio_test.go │ │ ├── tag.go │ │ ├── tag_test.go │ │ └── tagger.go │ ├── build/ │ │ └── version.go │ ├── desktop/ │ │ ├── desktop.go │ │ ├── desktop_platform_darwin.go │ │ ├── desktop_platform_nixes.go │ │ ├── desktop_platform_windows.go │ │ ├── dialog_nonwindows.go │ │ ├── dialog_windows.go │ │ ├── icon_windows.syso │ │ ├── systray_nixes.go │ │ └── systray_nonlinux.go │ ├── dlna/ │ │ ├── activity.go │ │ ├── activity_test.go │ │ ├── cd-service-desc.go │ │ ├── cds.go │ │ ├── cds_test.go │ │ ├── cm-service-desc.go │ │ ├── cms.go │ │ ├── dms.go │ │ ├── doc.go │ │ ├── html.go │ │ ├── mrrs.go │ │ ├── paging.go │ │ ├── service.go │ │ ├── whitelist.go │ │ └── xmsr-service-desc.go │ ├── identify/ │ │ ├── identify.go │ │ ├── identify_test.go │ │ ├── options.go │ │ ├── performer.go │ │ ├── performer_test.go │ │ ├── scene.go │ │ ├── scene_test.go │ │ ├── studio.go │ │ └── studio_test.go │ ├── log/ │ │ ├── hook.go │ │ ├── logger.go │ │ └── progress_formatter.go │ ├── manager/ │ │ ├── apikey.go │ │ ├── backup.go │ │ ├── checksum.go │ │ ├── config/ │ │ │ ├── config.go │ │ │ ├── config_concurrency_test.go │ │ │ ├── config_test.go │ │ │ ├── enums.go │ │ │ ├── init.go │ │ │ ├── stash_config.go │ │ │ ├── tasks.go │ │ │ └── ui.go │ │ ├── downloads.go │ │ ├── enums.go │ │ ├── exclude_files.go │ │ ├── exclude_files_test.go │ │ ├── fingerprint.go │ │ ├── generator.go │ │ ├── generator_interactive_heatmap_speed.go │ │ ├── generator_sprite.go │ │ ├── import.go │ │ ├── init.go │ │ ├── json_utils.go │ │ ├── log.go │ │ ├── manager.go │ │ ├── manager_tasks.go │ │ ├── models.go │ │ ├── repository.go │ │ ├── running_streams.go │ │ ├── scan_stashignore_test.go │ │ ├── scene.go │ │ ├── subscribe.go │ │ ├── task/ │ │ │ ├── clean_generated.go │ │ │ ├── download_ffmpeg.go │ │ │ ├── migrate.go │ │ │ ├── migrate_blobs.go │ │ │ ├── migrate_scene_screenshots.go │ │ │ └── packages.go │ │ ├── task.go │ │ ├── task_autotag.go │ │ ├── task_clean.go │ │ ├── task_export.go │ │ ├── task_generate.go │ │ ├── task_generate_clip_preview.go │ │ ├── task_generate_image_phash.go │ │ ├── task_generate_image_thumbnail.go │ │ ├── task_generate_interactive_heatmap_speed.go │ │ ├── task_generate_markers.go │ │ ├── task_generate_phash.go │ │ ├── task_generate_preview.go │ │ ├── task_generate_screenshot.go │ │ ├── task_generate_sprite.go │ │ ├── task_identify.go │ │ ├── task_import.go │ │ ├── task_migrate_hash.go │ │ ├── task_optimise.go │ │ ├── task_plugin.go │ │ ├── task_scan.go │ │ ├── task_stash_box_tag.go │ │ └── task_transcode.go │ └── static/ │ ├── embed.go │ ├── performer/ │ │ └── attribution.md │ └── performer_male/ │ └── attribution.md ├── pkg/ │ ├── exec/ │ │ ├── command.go │ │ ├── shell_nonwindows.go │ │ └── shell_windows.go │ ├── ffmpeg/ │ │ ├── browser.go │ │ ├── codec.go │ │ ├── codec_hardware.go │ │ ├── container.go │ │ ├── downloader.go │ │ ├── ffmpeg.go │ │ ├── ffmpeg_test.go │ │ ├── ffprobe.go │ │ ├── filter.go │ │ ├── format.go │ │ ├── frame_rate.go │ │ ├── generate.go │ │ ├── media_detection.go │ │ ├── options.go │ │ ├── stream.go │ │ ├── stream_segmented.go │ │ ├── stream_transcode.go │ │ ├── transcoder/ │ │ │ ├── image.go │ │ │ ├── screenshot.go │ │ │ ├── splice.go │ │ │ └── transcode.go │ │ └── types.go │ ├── file/ │ │ ├── clean.go │ │ ├── delete.go │ │ ├── file.go │ │ ├── folder.go │ │ ├── folder_rename_detect.go │ │ ├── fs.go │ │ ├── handler.go │ │ ├── image/ │ │ │ ├── orientation.go │ │ │ └── scan.go │ │ ├── import.go │ │ ├── move.go │ │ ├── scan.go │ │ ├── stashignore.go │ │ ├── stashignore_test.go │ │ ├── video/ │ │ │ ├── caption.go │ │ │ ├── caption_test.go │ │ │ ├── funscript.go │ │ │ └── scan.go │ │ ├── walk.go │ │ └── zip.go │ ├── fsutil/ │ │ ├── dir.go │ │ ├── dir_test.go │ │ ├── file.go │ │ ├── file_test.go │ │ ├── fs.go │ │ ├── fs_test.go │ │ ├── lock_manager.go │ │ ├── symwalk.go │ │ └── trash.go │ ├── gallery/ │ │ ├── chapter_import.go │ │ ├── delete.go │ │ ├── export.go │ │ ├── export_test.go │ │ ├── filter.go │ │ ├── import.go │ │ ├── import_test.go │ │ ├── query.go │ │ ├── scan.go │ │ ├── scan_test.go │ │ ├── service.go │ │ ├── update.go │ │ └── validation.go │ ├── group/ │ │ ├── create.go │ │ ├── doc.go │ │ ├── export.go │ │ ├── export_test.go │ │ ├── import.go │ │ ├── import_test.go │ │ ├── query.go │ │ ├── reorder.go │ │ ├── service.go │ │ ├── update.go │ │ └── validate.go │ ├── hash/ │ │ ├── imagephash/ │ │ │ └── phash.go │ │ ├── key.go │ │ ├── md5/ │ │ │ └── md5.go │ │ ├── oshash/ │ │ │ ├── oshash.go │ │ │ └── oshash_test.go │ │ └── videophash/ │ │ └── phash.go │ ├── image/ │ │ ├── delete.go │ │ ├── export.go │ │ ├── export_test.go │ │ ├── filter.go │ │ ├── import.go │ │ ├── import_test.go │ │ ├── query.go │ │ ├── scan.go │ │ ├── scan_test.go │ │ ├── service.go │ │ ├── thumbnail.go │ │ ├── update.go │ │ ├── vips.go │ │ ├── webp.go │ │ └── webp_internal_test.go │ ├── javascript/ │ │ ├── console.go │ │ ├── gql.go │ │ ├── log.go │ │ ├── util.go │ │ └── vm.go │ ├── job/ │ │ ├── job.go │ │ ├── manager.go │ │ ├── manager_test.go │ │ ├── progress.go │ │ ├── progress_test.go │ │ ├── subscribe.go │ │ └── task.go │ ├── logger/ │ │ ├── basic.go │ │ ├── logger.go │ │ ├── plugin.go │ │ └── progress_formatter.go │ ├── match/ │ │ ├── cache.go │ │ ├── path.go │ │ ├── path_test.go │ │ └── scraped.go │ ├── models/ │ │ ├── custom_fields.go │ │ ├── date.go │ │ ├── date_test.go │ │ ├── doc.go │ │ ├── errors.go │ │ ├── file.go │ │ ├── filename_parser.go │ │ ├── filter.go │ │ ├── find_filter.go │ │ ├── fingerprint.go │ │ ├── fingerprint_test.go │ │ ├── folder.go │ │ ├── fs.go │ │ ├── gallery.go │ │ ├── generate.go │ │ ├── group.go │ │ ├── image.go │ │ ├── import.go │ │ ├── json/ │ │ │ └── json_time.go │ │ ├── jsonschema/ │ │ │ ├── doc.go │ │ │ ├── file_folder.go │ │ │ ├── folder.go │ │ │ ├── gallery.go │ │ │ ├── group.go │ │ │ ├── image.go │ │ │ ├── load.go │ │ │ ├── performer.go │ │ │ ├── performer_test.go │ │ │ ├── saved_filter.go │ │ │ ├── scene.go │ │ │ ├── studio.go │ │ │ ├── tag.go │ │ │ └── utils.go │ │ ├── mocks/ │ │ │ ├── FileReaderWriter.go │ │ │ ├── FolderReaderWriter.go │ │ │ ├── GalleryChapterReaderWriter.go │ │ │ ├── GalleryReaderWriter.go │ │ │ ├── GroupReaderWriter.go │ │ │ ├── ImageReaderWriter.go │ │ │ ├── PerformerReaderWriter.go │ │ │ ├── SavedFilterReaderWriter.go │ │ │ ├── SceneMarkerReaderWriter.go │ │ │ ├── SceneReaderWriter.go │ │ │ ├── StudioReaderWriter.go │ │ │ ├── TagReaderWriter.go │ │ │ ├── database.go │ │ │ └── query.go │ │ ├── model_file.go │ │ ├── model_folder.go │ │ ├── model_gallery.go │ │ ├── model_gallery_chapter.go │ │ ├── model_group.go │ │ ├── model_image.go │ │ ├── model_joins.go │ │ ├── model_performer.go │ │ ├── model_saved_filter.go │ │ ├── model_scene.go │ │ ├── model_scene_marker.go │ │ ├── model_scene_test.go │ │ ├── model_scraped_item.go │ │ ├── model_scraped_item_test.go │ │ ├── model_studio.go │ │ ├── model_tag.go │ │ ├── orientation.go │ │ ├── package.go │ │ ├── paths/ │ │ │ ├── paths.go │ │ │ ├── paths_generated.go │ │ │ ├── paths_json.go │ │ │ ├── paths_scene_markers.go │ │ │ └── paths_scenes.go │ │ ├── performer.go │ │ ├── query.go │ │ ├── rating.go │ │ ├── rating_test.go │ │ ├── relationships.go │ │ ├── repository.go │ │ ├── repository_blob.go │ │ ├── repository_file.go │ │ ├── repository_folder.go │ │ ├── repository_gallery.go │ │ ├── repository_gallery_chapter.go │ │ ├── repository_group.go │ │ ├── repository_image.go │ │ ├── repository_performer.go │ │ ├── repository_scene.go │ │ ├── repository_scene_marker.go │ │ ├── repository_studio.go │ │ ├── repository_tag.go │ │ ├── resolution.go │ │ ├── saved_filter.go │ │ ├── scene.go │ │ ├── scene_marker.go │ │ ├── search.go │ │ ├── search_test.go │ │ ├── stash_box.go │ │ ├── stash_ids.go │ │ ├── studio.go │ │ ├── tag.go │ │ ├── update.go │ │ ├── update_test.go │ │ └── value.go │ ├── performer/ │ │ ├── doc.go │ │ ├── export.go │ │ ├── export_test.go │ │ ├── import.go │ │ ├── import_test.go │ │ ├── query.go │ │ ├── url.go │ │ ├── validate.go │ │ └── validate_test.go │ ├── pkg/ │ │ ├── cache.go │ │ ├── manager.go │ │ ├── pkg.go │ │ ├── repository.go │ │ ├── repository_http.go │ │ ├── repository_http_test.go │ │ └── store.go │ ├── plugin/ │ │ ├── args.go │ │ ├── common/ │ │ │ ├── doc.go │ │ │ ├── log/ │ │ │ │ └── log.go │ │ │ ├── msg.go │ │ │ └── rpc.go │ │ ├── config.go │ │ ├── convert.go │ │ ├── examples/ │ │ │ ├── README.md │ │ │ ├── common/ │ │ │ │ └── graphql.go │ │ │ ├── goraw/ │ │ │ │ ├── goraw.yml │ │ │ │ └── main.go │ │ │ ├── gorpc/ │ │ │ │ ├── gorpc.yml │ │ │ │ └── main.go │ │ │ ├── js/ │ │ │ │ ├── js.js │ │ │ │ └── js.yml │ │ │ ├── python/ │ │ │ │ ├── log.py │ │ │ │ ├── pyplugin.py │ │ │ │ ├── pyraw.yml │ │ │ │ └── stash_interface.py │ │ │ └── react-component/ │ │ │ ├── README.md │ │ │ ├── package.json │ │ │ ├── src/ │ │ │ │ ├── testReact.scss │ │ │ │ ├── testReact.tsx │ │ │ │ └── testReact.yml │ │ │ └── tsconfig.json │ │ ├── hook/ │ │ │ └── hooks.go │ │ ├── hooks.go │ │ ├── js.go │ │ ├── log.go │ │ ├── plugins.go │ │ ├── raw.go │ │ ├── rpc.go │ │ ├── setting.go │ │ ├── task.go │ │ └── util/ │ │ └── client.go │ ├── python/ │ │ ├── env.go │ │ └── exec.go │ ├── savedfilter/ │ │ ├── export.go │ │ ├── export_test.go │ │ ├── import.go │ │ └── import_test.go │ ├── scene/ │ │ ├── create.go │ │ ├── delete.go │ │ ├── export.go │ │ ├── export_test.go │ │ ├── filename_parser.go │ │ ├── filter.go │ │ ├── find.go │ │ ├── fingerprints.go │ │ ├── generate/ │ │ │ ├── generator.go │ │ │ ├── marker_preview.go │ │ │ ├── preview.go │ │ │ ├── screenshot.go │ │ │ ├── sprite.go │ │ │ └── transcode.go │ │ ├── hash.go │ │ ├── import.go │ │ ├── import_test.go │ │ ├── marker_import.go │ │ ├── marker_import_test.go │ │ ├── marker_query.go │ │ ├── merge.go │ │ ├── migrate_hash.go │ │ ├── migrate_screenshots.go │ │ ├── query.go │ │ ├── scan.go │ │ ├── scan_test.go │ │ ├── service.go │ │ ├── update.go │ │ └── update_test.go │ ├── scraper/ │ │ ├── action.go │ │ ├── autotag.go │ │ ├── cache.go │ │ ├── cookies.go │ │ ├── country.go │ │ ├── defined_scraper.go │ │ ├── definition.go │ │ ├── freeones.go │ │ ├── graphql.go │ │ ├── image.go │ │ ├── json.go │ │ ├── json_test.go │ │ ├── mapped.go │ │ ├── mapped_config.go │ │ ├── mapped_postprocessing.go │ │ ├── mapped_result.go │ │ ├── mapped_result_test.go │ │ ├── mapped_test.go │ │ ├── movie.go │ │ ├── performer.go │ │ ├── post_processing_test.go │ │ ├── postprocessing.go │ │ ├── query_url.go │ │ ├── scraper.go │ │ ├── script.go │ │ ├── stash.go │ │ ├── tag.go │ │ ├── url.go │ │ ├── xpath.go │ │ └── xpath_test.go │ ├── session/ │ │ ├── authentication.go │ │ ├── authentication_test.go │ │ ├── config.go │ │ ├── local.go │ │ ├── plugin.go │ │ └── session.go │ ├── sliceutil/ │ │ ├── collections.go │ │ ├── collections_test.go │ │ ├── intslice/ │ │ │ └── int_collections.go │ │ └── stringslice/ │ │ └── string_collections.go │ ├── sqlite/ │ │ ├── anonymise.go │ │ ├── anonymise_test.go │ │ ├── batch.go │ │ ├── blob/ │ │ │ └── fs.go │ │ ├── blob.go │ │ ├── blob_migrate.go │ │ ├── blob_test.go │ │ ├── common.go │ │ ├── criterion_handlers.go │ │ ├── custom_fields.go │ │ ├── custom_fields_test.go │ │ ├── custom_migrations.go │ │ ├── database.go │ │ ├── date.go │ │ ├── doc.go │ │ ├── driver.go │ │ ├── file.go │ │ ├── file_filter.go │ │ ├── file_filter_test.go │ │ ├── file_test.go │ │ ├── filter.go │ │ ├── filter_hierarchical.go │ │ ├── filter_internal_test.go │ │ ├── fingerprint.go │ │ ├── folder.go │ │ ├── folder_filter.go │ │ ├── folder_filter_test.go │ │ ├── folder_test.go │ │ ├── functions.go │ │ ├── gallery.go │ │ ├── gallery_chapter.go │ │ ├── gallery_chapter_test.go │ │ ├── gallery_filter.go │ │ ├── gallery_test.go │ │ ├── group.go │ │ ├── group_filter.go │ │ ├── group_relationships.go │ │ ├── group_test.go │ │ ├── history.go │ │ ├── image.go │ │ ├── image_filter.go │ │ ├── image_test.go │ │ ├── migrate.go │ │ ├── migrations/ │ │ │ ├── 10_image_tables.up.sql │ │ │ ├── 11_tag_image.up.sql │ │ │ ├── 12_oshash.up.sql │ │ │ ├── 12_postmigrate.go │ │ │ ├── 13_images.up.sql │ │ │ ├── 14_stash_box_ids.up.sql │ │ │ ├── 15_file_mod_time.up.sql │ │ │ ├── 16_organized_flag.up.sql │ │ │ ├── 17_reset_scene_size.up.sql │ │ │ ├── 18_scene_galleries.up.sql │ │ │ ├── 19_performer_tags.up.sql │ │ │ ├── 1_initial.down.sql │ │ │ ├── 1_initial.up.sql │ │ │ ├── 20_phash.up.sql │ │ │ ├── 21_performers_studios_details.up.sql │ │ │ ├── 22_performers_studios_rating.up.sql │ │ │ ├── 23_scenes_interactive.up.sql │ │ │ ├── 24_tag_aliases.up.sql │ │ │ ├── 25_saved_filters.up.sql │ │ │ ├── 26_tag_hierarchy.up.sql │ │ │ ├── 27_studio_aliases.up.sql │ │ │ ├── 28_images_indexes.up.sql │ │ │ ├── 29_interactive_speed.up.sql │ │ │ ├── 2_cover_image.up.sql │ │ │ ├── 30_ignore_autotag.up..sql │ │ │ ├── 31_scenes_captions.up.sql │ │ │ ├── 32_files.up.sql │ │ │ ├── 32_postmigrate.go │ │ │ ├── 32_premigrate.go │ │ │ ├── 33_noop.up.sql │ │ │ ├── 34_indexes.up.sql │ │ │ ├── 34_postmigrate.go │ │ │ ├── 35_assoc_tables.up.sql │ │ │ ├── 36_tags_description.up.sql │ │ │ ├── 37_iso_country_names.up.sql │ │ │ ├── 38_scenes_director_code.up.sql │ │ │ ├── 39_performer_height.up.sql │ │ │ ├── 3_o_counter.up.sql │ │ │ ├── 40_newratings.up.sql │ │ │ ├── 41_scene_activity.up.sql │ │ │ ├── 42_performer_disambig_aliases.up.sql │ │ │ ├── 42_postmigrate.go │ │ │ ├── 43_image_date_url.up.sql │ │ │ ├── 44_gallery_chapters.up.sql │ │ │ ├── 45_blobs.up.sql │ │ │ ├── 45_postmigrate.go │ │ │ ├── 46_penis_stats.up.sql │ │ │ ├── 47_scene_urls.up.sql │ │ │ ├── 48_cleanup.up.sql │ │ │ ├── 48_premigrate.go │ │ │ ├── 49_postmigrate.go │ │ │ ├── 49_saved_filter_refactor.up.sql │ │ │ ├── 4_movie.up.sql │ │ │ ├── 50_image_urls.up.sql │ │ │ ├── 51_gallery_urls.up.sql │ │ │ ├── 52_postmigrate.go │ │ │ ├── 52_zip_folder_data_correct.up.sql │ │ │ ├── 53_gallery_photographer_code.up.sql │ │ │ ├── 54_image_code_details_photographer.up.sql │ │ │ ├── 55_manual_history.up.sql │ │ │ ├── 55_postmigrate.go │ │ │ ├── 56_studio_favorite.up.sql │ │ │ ├── 57_tag_favorite.up.sql │ │ │ ├── 58_config_correct.up.sql │ │ │ ├── 58_postmigrate.go │ │ │ ├── 59_movie_urls.up.sql │ │ │ ├── 5_performer_gender.down.sql │ │ │ ├── 5_performer_gender.up.sql │ │ │ ├── 60_default_filter_move.up.sql │ │ │ ├── 60_postmigrate.go │ │ │ ├── 61_movie_tags.up.sql │ │ │ ├── 62_performer_urls.up.sql │ │ │ ├── 63_studio_tags.up.sql │ │ │ ├── 64_fixes.up.sql │ │ │ ├── 64_postmigrate.go │ │ │ ├── 65_movie_group_rename.up.sql │ │ │ ├── 65_postmigrate.go │ │ │ ├── 66_gallery_cover.up.sql │ │ │ ├── 67_group_relationships.up.sql │ │ │ ├── 68_image_studio_index.up.sql │ │ │ ├── 69_stash_id_updated_at.up.sql │ │ │ ├── 6_scenes_format.up.sql │ │ │ ├── 70_markers_end.up.sql │ │ │ ├── 71_custom_fields.up.sql │ │ │ ├── 72_tag_sort_name.up.sql │ │ │ ├── 73_studio_urls.up.sql │ │ │ ├── 74_tag_stash_ids.up.sql │ │ │ ├── 75_date_precision.up.sql │ │ │ ├── 76_studio_custom_fields.up.sql │ │ │ ├── 77_tag_custom_fields.up.sql │ │ │ ├── 78_performer_career_dates.up.sql │ │ │ ├── 78_postmigrate.go │ │ │ ├── 79_scene_custom_fields.up.sql │ │ │ ├── 7_performer_optimization.up.sql │ │ │ ├── 80_studio_organized.up.sql │ │ │ ├── 81_gallery_custom_fields.up.sql │ │ │ ├── 82_group_custom_fields.up.sql │ │ │ ├── 83_image_custom_fields.up.sql │ │ │ ├── 84_folder_basename.up.sql │ │ │ ├── 84_postmigrate.go │ │ │ ├── 85_performer_career_dates.up.sql │ │ │ ├── 8_movie_fix.up.sql │ │ │ ├── 9_studios_parent_studio.up.sql │ │ │ ├── README.md │ │ │ └── custom_migration.go │ │ ├── performer.go │ │ ├── performer_filter.go │ │ ├── performer_test.go │ │ ├── phash.go │ │ ├── query.go │ │ ├── record.go │ │ ├── regex.go │ │ ├── relationships.go │ │ ├── repository.go │ │ ├── saved_filter.go │ │ ├── saved_filter_test.go │ │ ├── scene.go │ │ ├── scene_filter.go │ │ ├── scene_marker.go │ │ ├── scene_marker_filter.go │ │ ├── scene_marker_test.go │ │ ├── scene_test.go │ │ ├── setup_test.go │ │ ├── sql.go │ │ ├── stash_id_test.go │ │ ├── studio.go │ │ ├── studio_filter.go │ │ ├── studio_test.go │ │ ├── table.go │ │ ├── tables.go │ │ ├── tag.go │ │ ├── tag_filter.go │ │ ├── tag_test.go │ │ ├── timestamp.go │ │ ├── transaction.go │ │ ├── transaction_test.go │ │ ├── tx.go │ │ └── values.go │ ├── stashbox/ │ │ ├── client.go │ │ ├── draft.go │ │ ├── graphql/ │ │ │ ├── generated_client.go │ │ │ └── generated_models.go │ │ ├── performer.go │ │ ├── scene.go │ │ ├── studio.go │ │ └── tag.go │ ├── studio/ │ │ ├── doc.go │ │ ├── export.go │ │ ├── export_test.go │ │ ├── import.go │ │ ├── import_test.go │ │ ├── query.go │ │ ├── validate.go │ │ └── validate_test.go │ ├── tag/ │ │ ├── doc.go │ │ ├── export.go │ │ ├── export_test.go │ │ ├── import.go │ │ ├── import_test.go │ │ ├── query.go │ │ ├── update.go │ │ ├── update_test.go │ │ ├── validate.go │ │ └── validate_test.go │ ├── txn/ │ │ ├── hooks.go │ │ └── transaction.go │ └── utils/ │ ├── boolean.go │ ├── date.go │ ├── date_test.go │ ├── doc.go │ ├── func.go │ ├── http.go │ ├── image.go │ ├── map.go │ ├── map_test.go │ ├── mutex.go │ ├── mutex_test.go │ ├── phash.go │ ├── reflect.go │ ├── reflect_test.go │ ├── resources.go │ ├── strings.go │ ├── strings_test.go │ ├── time.go │ ├── url.go │ ├── url_test.go │ ├── urlmap.go │ ├── urlmap_test.go │ ├── user_agent.go │ ├── vtt.go │ └── vtt_test.go ├── scripts/ │ ├── generateLoginLocales.go │ ├── generate_icons.sh │ ├── getDate.go │ ├── macos-bundle/ │ │ └── Contents/ │ │ ├── Info.plist │ │ └── Resources/ │ │ └── icon.icns │ └── test_db_generator/ │ ├── README.md │ ├── config.yml │ ├── female.txt │ ├── makeTestDB.go │ ├── male.txt │ ├── naming.go │ ├── scene.txt │ ├── studio.txt │ └── surname.txt ├── tools.go └── ui/ ├── login/ │ ├── login.css │ └── login.html ├── ui.go └── v2.5/ ├── .editorconfig ├── .eslintrc.json ├── .prettierignore ├── .stylelintrc ├── README.md ├── codegen.ts ├── graphql/ │ ├── client-schema.graphql │ ├── data/ │ │ ├── config.graphql │ │ ├── file.graphql │ │ ├── filter.graphql │ │ ├── gallery-chapter.graphql │ │ ├── gallery-slim.graphql │ │ ├── gallery.graphql │ │ ├── group-slim.graphql │ │ ├── group.graphql │ │ ├── image-slim.graphql │ │ ├── image.graphql │ │ ├── job.graphql │ │ ├── log.graphql │ │ ├── package.graphql │ │ ├── performer-slim.graphql │ │ ├── performer.graphql │ │ ├── scene-marker.graphql │ │ ├── scene-slim.graphql │ │ ├── scene.graphql │ │ ├── scrapers.graphql │ │ ├── studio-slim.graphql │ │ ├── studio.graphql │ │ ├── tag-slim.graphql │ │ └── tag.graphql │ ├── mutations/ │ │ ├── config.graphql │ │ ├── dlna.graphql │ │ ├── file.graphql │ │ ├── filter.graphql │ │ ├── gallery-chapter.graphql │ │ ├── gallery.graphql │ │ ├── group.graphql │ │ ├── image.graphql │ │ ├── job.graphql │ │ ├── metadata.graphql │ │ ├── migration.graphql │ │ ├── performer.graphql │ │ ├── plugins.graphql │ │ ├── scene-marker.graphql │ │ ├── scene.graphql │ │ ├── scrapers.graphql │ │ ├── stash-box.graphql │ │ ├── studio.graphql │ │ └── tag.graphql │ ├── queries/ │ │ ├── dlna.graphql │ │ ├── filter.graphql │ │ ├── folder.graphql │ │ ├── gallery.graphql │ │ ├── image.graphql │ │ ├── job.graphql │ │ ├── legacy.graphql │ │ ├── misc.graphql │ │ ├── movie.graphql │ │ ├── performer.graphql │ │ ├── plugins.graphql │ │ ├── scene-marker.graphql │ │ ├── scene.graphql │ │ ├── scrapers/ │ │ │ └── scrapers.graphql │ │ ├── settings/ │ │ │ ├── config.graphql │ │ │ └── metadata.graphql │ │ ├── studio.graphql │ │ └── tag.graphql │ └── subscriptions.graphql ├── index.html ├── package.json ├── pnpm-workspace.yaml ├── public/ │ └── manifest.json ├── src/ │ ├── @types/ │ │ ├── mousetrap-pause.d.ts │ │ ├── string.prototype.replaceall.d.ts │ │ ├── videojs-abloop.d.ts │ │ ├── videojs-contrib-dash.d.ts │ │ ├── videojs-vr.d.ts │ │ └── videojs-vtt.d.ts │ ├── App.tsx │ ├── ConnectionMonitor.tsx │ ├── components/ │ │ ├── Changelog/ │ │ │ ├── Changelog.tsx │ │ │ ├── Version.tsx │ │ │ └── styles.scss │ │ ├── Dialogs/ │ │ │ ├── GenerateDialog.tsx │ │ │ ├── IdentifyDialog/ │ │ │ │ ├── FieldOptions.tsx │ │ │ │ ├── IdentifyDialog.tsx │ │ │ │ ├── Options.tsx │ │ │ │ ├── Sources.tsx │ │ │ │ ├── ThreeStateBoolean.tsx │ │ │ │ ├── constants.ts │ │ │ │ └── styles.scss │ │ │ ├── ReleaseNotesDialog.tsx │ │ │ ├── SubmitDraft.tsx │ │ │ └── styles.scss │ │ ├── ErrorBoundary.tsx │ │ ├── FrontPage/ │ │ │ ├── Control.tsx │ │ │ ├── FilteredRecommendationRow.tsx │ │ │ ├── FrontPage.tsx │ │ │ ├── FrontPageConfig.tsx │ │ │ ├── RecommendationRow.tsx │ │ │ └── styles.scss │ │ ├── Galleries/ │ │ │ ├── DeleteGalleriesDialog.tsx │ │ │ ├── EditGalleriesDialog.tsx │ │ │ ├── Galleries.tsx │ │ │ ├── GalleryCard.tsx │ │ │ ├── GalleryCardGrid.tsx │ │ │ ├── GalleryDetails/ │ │ │ │ ├── ChapterEntry.tsx │ │ │ │ ├── Gallery.tsx │ │ │ │ ├── GalleryAddPanel.tsx │ │ │ │ ├── GalleryChapterForm.tsx │ │ │ │ ├── GalleryChaptersPanel.tsx │ │ │ │ ├── GalleryCreate.tsx │ │ │ │ ├── GalleryDetailPanel.tsx │ │ │ │ ├── GalleryEditPanel.tsx │ │ │ │ ├── GalleryFileInfoPanel.tsx │ │ │ │ ├── GalleryImagesPanel.tsx │ │ │ │ ├── GalleryScenesPanel.tsx │ │ │ │ └── GalleryScrapeDialog.tsx │ │ │ ├── GalleryList.tsx │ │ │ ├── GalleryListTable.tsx │ │ │ ├── GalleryPreviewScrubber.tsx │ │ │ ├── GalleryRecommendationRow.tsx │ │ │ ├── GallerySelect.tsx │ │ │ ├── GalleryViewer.tsx │ │ │ ├── GalleryWallCard.tsx │ │ │ └── styles.scss │ │ ├── Groups/ │ │ │ ├── ContainingGroupsMultiSet.tsx │ │ │ ├── EditGroupsDialog.tsx │ │ │ ├── GroupCard.tsx │ │ │ ├── GroupCardGrid.tsx │ │ │ ├── GroupDetails/ │ │ │ │ ├── AddGroupsDialog.tsx │ │ │ │ ├── Group.tsx │ │ │ │ ├── GroupCreate.tsx │ │ │ │ ├── GroupDetailsPanel.tsx │ │ │ │ ├── GroupEditPanel.tsx │ │ │ │ ├── GroupPerformersPanel.tsx │ │ │ │ ├── GroupScenesPanel.tsx │ │ │ │ ├── GroupScrapeDialog.tsx │ │ │ │ ├── GroupSubGroupsPanel.tsx │ │ │ │ └── RelatedGroupTable.tsx │ │ │ ├── GroupList.tsx │ │ │ ├── GroupRecommendationRow.tsx │ │ │ ├── GroupSelect.tsx │ │ │ ├── GroupTag.tsx │ │ │ ├── Groups.tsx │ │ │ ├── RelatedGroupPopover.tsx │ │ │ └── styles.scss │ │ ├── Help/ │ │ │ ├── Manual.tsx │ │ │ ├── context.tsx │ │ │ └── styles.scss │ │ ├── Images/ │ │ │ ├── DeleteImagesDialog.tsx │ │ │ ├── EditImagesDialog.tsx │ │ │ ├── ImageCard.tsx │ │ │ ├── ImageCardGrid.tsx │ │ │ ├── ImageDetails/ │ │ │ │ ├── Image.tsx │ │ │ │ ├── ImageDetailPanel.tsx │ │ │ │ ├── ImageEditPanel.tsx │ │ │ │ ├── ImageFileInfoPanel.tsx │ │ │ │ └── ImageScrapeDialog.tsx │ │ │ ├── ImageList.tsx │ │ │ ├── ImageRecommendationRow.tsx │ │ │ ├── ImageWallItem.tsx │ │ │ ├── Images.tsx │ │ │ └── styles.scss │ │ ├── List/ │ │ │ ├── CriterionEditor.tsx │ │ │ ├── EditFilterDialog.tsx │ │ │ ├── FilterProvider.tsx │ │ │ ├── FilterTags.tsx │ │ │ ├── FilteredListToolbar.tsx │ │ │ ├── Filters/ │ │ │ │ ├── BooleanFilter.tsx │ │ │ │ ├── CustomFieldsFilter.tsx │ │ │ │ ├── DateFilter.tsx │ │ │ │ ├── DuplicateFilter.tsx │ │ │ │ ├── DurationFilter.tsx │ │ │ │ ├── FilterButton.tsx │ │ │ │ ├── FilterSidebar.tsx │ │ │ │ ├── FolderFilter.tsx │ │ │ │ ├── HierarchicalLabelValueFilter.tsx │ │ │ │ ├── InputFilter.tsx │ │ │ │ ├── LabeledIdFilter.tsx │ │ │ │ ├── NumberFilter.tsx │ │ │ │ ├── OptionFilter.tsx │ │ │ │ ├── PathFilter.tsx │ │ │ │ ├── PerformersFilter.tsx │ │ │ │ ├── PhashFilter.tsx │ │ │ │ ├── RatingFilter.tsx │ │ │ │ ├── SelectableFilter.tsx │ │ │ │ ├── SidebarAgeFilter.tsx │ │ │ │ ├── SidebarDurationFilter.tsx │ │ │ │ ├── SidebarListFilter.tsx │ │ │ │ ├── StashIDFilter.tsx │ │ │ │ ├── StudiosFilter.tsx │ │ │ │ ├── TagsFilter.tsx │ │ │ │ └── TimestampFilter.tsx │ │ │ ├── ItemList.tsx │ │ │ ├── ListFilter.tsx │ │ │ ├── ListOperationButtons.tsx │ │ │ ├── ListProvider.tsx │ │ │ ├── ListTable.tsx │ │ │ ├── ListViewOptions.tsx │ │ │ ├── ModifierSelect.tsx │ │ │ ├── PagedList.tsx │ │ │ ├── Pagination.tsx │ │ │ ├── SavedFilterList.tsx │ │ │ ├── ZoomSlider.tsx │ │ │ ├── styles.scss │ │ │ ├── util.ts │ │ │ └── views.ts │ │ ├── MainNavbar.tsx │ │ ├── PageNotFound.tsx │ │ ├── Performers/ │ │ │ ├── EditPerformersDialog.tsx │ │ │ ├── GenderIcon.tsx │ │ │ ├── PerformerCard.tsx │ │ │ ├── PerformerCardGrid.tsx │ │ │ ├── PerformerDetails/ │ │ │ │ ├── Performer.tsx │ │ │ │ ├── PerformerCreate.tsx │ │ │ │ ├── PerformerDetailsPanel.tsx │ │ │ │ ├── PerformerEditPanel.tsx │ │ │ │ ├── PerformerGalleriesPanel.tsx │ │ │ │ ├── PerformerGroupsPanel.tsx │ │ │ │ ├── PerformerImagesPanel.tsx │ │ │ │ ├── PerformerScenesPanel.tsx │ │ │ │ ├── PerformerScrapeDialog.tsx │ │ │ │ ├── PerformerScrapeModal.tsx │ │ │ │ ├── PerformerStashBoxModal.tsx │ │ │ │ ├── PerformerSubmitButton.tsx │ │ │ │ └── performerAppearsWithPanel.tsx │ │ │ ├── PerformerList.tsx │ │ │ ├── PerformerListTable.tsx │ │ │ ├── PerformerMergeDialog.tsx │ │ │ ├── PerformerPopover.tsx │ │ │ ├── PerformerRecommendationRow.tsx │ │ │ ├── PerformerSelect.tsx │ │ │ ├── Performers.tsx │ │ │ └── styles.scss │ │ ├── SceneDuplicateChecker/ │ │ │ ├── SceneDuplicateChecker.tsx │ │ │ └── styles.scss │ │ ├── SceneFilenameParser/ │ │ │ ├── ParserField.ts │ │ │ ├── ParserInput.tsx │ │ │ ├── SceneFilenameParser.tsx │ │ │ ├── SceneParserRow.tsx │ │ │ ├── ShowFields.tsx │ │ │ └── styles.scss │ │ ├── ScenePlayer/ │ │ │ ├── PlaylistButtons.ts │ │ │ ├── ScenePlayer.tsx │ │ │ ├── ScenePlayerScrubber.tsx │ │ │ ├── autostart-button.ts │ │ │ ├── big-buttons.ts │ │ │ ├── live.ts │ │ │ ├── markers.ts │ │ │ ├── media-session.ts │ │ │ ├── persist-volume.ts │ │ │ ├── source-selector.ts │ │ │ ├── styles.scss │ │ │ ├── track-activity.ts │ │ │ ├── util.ts │ │ │ ├── vrmode.ts │ │ │ ├── vtt-thumbnails.ts │ │ │ └── wake-sentinel.ts │ │ ├── Scenes/ │ │ │ ├── DeleteSceneMarkersDialog.tsx │ │ │ ├── DeleteScenesDialog.tsx │ │ │ ├── EditSceneMarkersDialog.tsx │ │ │ ├── EditScenesDialog.tsx │ │ │ ├── PreviewScrubber.tsx │ │ │ ├── SceneCard.tsx │ │ │ ├── SceneCardGrid.tsx │ │ │ ├── SceneDetails/ │ │ │ │ ├── ExternalPlayerButton.tsx │ │ │ │ ├── OCounterButton.tsx │ │ │ │ ├── OrganizedButton.tsx │ │ │ │ ├── PrimaryTags.tsx │ │ │ │ ├── QueueViewer.tsx │ │ │ │ ├── Scene.tsx │ │ │ │ ├── SceneCreate.tsx │ │ │ │ ├── SceneDetailPanel.tsx │ │ │ │ ├── SceneEditPanel.tsx │ │ │ │ ├── SceneFileInfoPanel.tsx │ │ │ │ ├── SceneGalleriesPanel.tsx │ │ │ │ ├── SceneGroupPanel.tsx │ │ │ │ ├── SceneGroupTable.tsx │ │ │ │ ├── SceneHistoryPanel.tsx │ │ │ │ ├── SceneMarkerForm.tsx │ │ │ │ ├── SceneMarkersPanel.tsx │ │ │ │ ├── SceneQueryModal.tsx │ │ │ │ ├── SceneScrapeDialog.tsx │ │ │ │ └── SceneVideoFilterPanel.tsx │ │ │ ├── SceneList.tsx │ │ │ ├── SceneListTable.tsx │ │ │ ├── SceneMarkerCard.tsx │ │ │ ├── SceneMarkerCardGrid.tsx │ │ │ ├── SceneMarkerList.tsx │ │ │ ├── SceneMarkerRecommendationRow.tsx │ │ │ ├── SceneMarkerWallPanel.tsx │ │ │ ├── SceneMergeDialog.tsx │ │ │ ├── SceneRecommendationRow.tsx │ │ │ ├── SceneSelect.tsx │ │ │ ├── SceneWallPanel.tsx │ │ │ ├── Scenes.tsx │ │ │ └── styles.scss │ │ ├── Settings/ │ │ │ ├── GeneratePreviewOptions.tsx │ │ │ ├── Inputs.tsx │ │ │ ├── PluginPackageManager.tsx │ │ │ ├── ScraperPackageManager.tsx │ │ │ ├── SettingSection.tsx │ │ │ ├── Settings.tsx │ │ │ ├── SettingsAboutPanel.tsx │ │ │ ├── SettingsInterfacePanel/ │ │ │ │ ├── CheckboxGroup.tsx │ │ │ │ └── SettingsInterfacePanel.tsx │ │ │ ├── SettingsLibraryPanel.tsx │ │ │ ├── SettingsLogsPanel.tsx │ │ │ ├── SettingsPluginsPanel.tsx │ │ │ ├── SettingsScrapingPanel.tsx │ │ │ ├── SettingsSecurityPanel.tsx │ │ │ ├── SettingsServicesPanel.tsx │ │ │ ├── SettingsSystemPanel.tsx │ │ │ ├── SettingsToolsPanel.tsx │ │ │ ├── StashBoxConfiguration.tsx │ │ │ ├── StashConfiguration.tsx │ │ │ ├── Tasks/ │ │ │ │ ├── CleanGeneratedDialog.tsx │ │ │ │ ├── DataManagementTasks.tsx │ │ │ │ ├── DirectorySelectionDialog.tsx │ │ │ │ ├── GenerateOptions.tsx │ │ │ │ ├── ImportDialog.tsx │ │ │ │ ├── JobTable.tsx │ │ │ │ ├── LibraryTasks.tsx │ │ │ │ ├── PluginTasks.tsx │ │ │ │ ├── ScanOptions.tsx │ │ │ │ └── SettingsTasksPanel.tsx │ │ │ ├── context.tsx │ │ │ └── styles.scss │ │ ├── SettingsButton.tsx │ │ ├── Setup/ │ │ │ ├── Migrate.tsx │ │ │ ├── Setup.tsx │ │ │ └── styles.scss │ │ ├── Shared/ │ │ │ ├── Alert.tsx │ │ │ ├── BatchModals.tsx │ │ │ ├── BulkUpdate.tsx │ │ │ ├── ClearableInput.tsx │ │ │ ├── CollapseButton.tsx │ │ │ ├── CountButton.tsx │ │ │ ├── Counter.tsx │ │ │ ├── CountryFlag.tsx │ │ │ ├── CountryLabel.tsx │ │ │ ├── CountrySelect.tsx │ │ │ ├── CustomFields.tsx │ │ │ ├── Date.tsx │ │ │ ├── DateInput.tsx │ │ │ ├── DeleteEntityDialog.tsx │ │ │ ├── DeleteFilesDialog.tsx │ │ │ ├── DetailImage.tsx │ │ │ ├── DetailItem.tsx │ │ │ ├── DetailsEditNavbar.tsx │ │ │ ├── DetailsPage/ │ │ │ │ ├── AliasList.tsx │ │ │ │ ├── BackgroundImage.tsx │ │ │ │ ├── DetailTitle.tsx │ │ │ │ ├── HeaderImage.tsx │ │ │ │ └── Tabs.tsx │ │ │ ├── DoubleRangeInput.tsx │ │ │ ├── DurationInput.tsx │ │ │ ├── ErrorMessage.tsx │ │ │ ├── ExportDialog.tsx │ │ │ ├── ExternalLink.tsx │ │ │ ├── ExternalLinksButton.tsx │ │ │ ├── FavoriteIcon.tsx │ │ │ ├── FileSize.tsx │ │ │ ├── FilterSelect.tsx │ │ │ ├── FolderSelect/ │ │ │ │ ├── FolderSelect.tsx │ │ │ │ ├── FolderSelectDialog.tsx │ │ │ │ └── useDirectoryPaths.ts │ │ │ ├── GridCard/ │ │ │ │ ├── GridCard.tsx │ │ │ │ ├── StudioOverlay.tsx │ │ │ │ ├── dragMoveSelect.ts │ │ │ │ └── styles.scss │ │ │ ├── HoverPopover.tsx │ │ │ ├── HoverScrubber.tsx │ │ │ ├── Icon.tsx │ │ │ ├── ImageInput.tsx │ │ │ ├── ImageSelector.tsx │ │ │ ├── IndeterminateCheckbox.tsx │ │ │ ├── Link.tsx │ │ │ ├── LoadingIndicator.tsx │ │ │ ├── MarkdownPage.tsx │ │ │ ├── Modal.tsx │ │ │ ├── MultiSet.tsx │ │ │ ├── OperationButton.tsx │ │ │ ├── PackageManager/ │ │ │ │ ├── PackageManager.tsx │ │ │ │ └── styles.scss │ │ │ ├── PercentInput.tsx │ │ │ ├── PerformerPopoverButton.tsx │ │ │ ├── PopoverCountButton.tsx │ │ │ ├── Rating/ │ │ │ │ ├── RatingNumber.tsx │ │ │ │ ├── RatingStars.tsx │ │ │ │ ├── RatingSystem.tsx │ │ │ │ └── styles.scss │ │ │ ├── RatingBanner.tsx │ │ │ ├── ReassignFilesDialog.tsx │ │ │ ├── RevealInFilesystemButton.tsx │ │ │ ├── ScrapeDialog/ │ │ │ │ ├── CreateLinkTagDialog.tsx │ │ │ │ ├── ScrapeDialog.tsx │ │ │ │ ├── ScrapeDialogRow.tsx │ │ │ │ ├── ScrapedObjectsRow.tsx │ │ │ │ ├── createObjects.ts │ │ │ │ ├── scrapeResult.ts │ │ │ │ └── scrapedTags.tsx │ │ │ ├── ScraperMenu.tsx │ │ │ ├── Select.tsx │ │ │ ├── Sidebar.tsx │ │ │ ├── StashBoxIDSearchModal.tsx │ │ │ ├── StashID.tsx │ │ │ ├── StringListInput.tsx │ │ │ ├── SuccessIcon.tsx │ │ │ ├── SweatDrops.tsx │ │ │ ├── TagLink.tsx │ │ │ ├── ThreeStateCheckbox.tsx │ │ │ ├── TruncatedText.tsx │ │ │ ├── URLField.tsx │ │ │ └── styles.scss │ │ ├── Stats.tsx │ │ ├── Studios/ │ │ │ ├── EditStudiosDialog.tsx │ │ │ ├── StudioCard.tsx │ │ │ ├── StudioCardGrid.tsx │ │ │ ├── StudioDetails/ │ │ │ │ ├── Studio.tsx │ │ │ │ ├── StudioChildrenPanel.tsx │ │ │ │ ├── StudioCreate.tsx │ │ │ │ ├── StudioDetailsPanel.tsx │ │ │ │ ├── StudioEditPanel.tsx │ │ │ │ ├── StudioGalleriesPanel.tsx │ │ │ │ ├── StudioGroupsPanel.tsx │ │ │ │ ├── StudioImagesPanel.tsx │ │ │ │ ├── StudioPerformersPanel.tsx │ │ │ │ └── StudioScenesPanel.tsx │ │ │ ├── StudioList.tsx │ │ │ ├── StudioRecommendationRow.tsx │ │ │ ├── StudioSelect.tsx │ │ │ ├── Studios.tsx │ │ │ └── styles.scss │ │ ├── Tagger/ │ │ │ ├── FieldSelector.tsx │ │ │ ├── IncludeButton.tsx │ │ │ ├── LinkButton.tsx │ │ │ ├── PerformerModal.tsx │ │ │ ├── StashBoxSelector.tsx │ │ │ ├── TaggerConfig.tsx │ │ │ ├── config.ts │ │ │ ├── constants.ts │ │ │ ├── context.tsx │ │ │ ├── performers/ │ │ │ │ ├── PerformerTagger.tsx │ │ │ │ └── StashSearchResult.tsx │ │ │ ├── queries.ts │ │ │ ├── scenes/ │ │ │ │ ├── Config.tsx │ │ │ │ ├── PerformerResult.tsx │ │ │ │ ├── SceneTagger.tsx │ │ │ │ ├── StashSearchResult.tsx │ │ │ │ ├── StudioModal.tsx │ │ │ │ ├── StudioResult.tsx │ │ │ │ ├── TaggerScene.tsx │ │ │ │ ├── sceneTaggerModals.tsx │ │ │ │ └── utils.ts │ │ │ ├── studios/ │ │ │ │ ├── StashSearchResult.tsx │ │ │ │ └── StudioTagger.tsx │ │ │ ├── styles.scss │ │ │ ├── tags/ │ │ │ │ ├── StashSearchResult.tsx │ │ │ │ ├── TagModal.tsx │ │ │ │ └── TagTagger.tsx │ │ │ └── utils.ts │ │ ├── Tags/ │ │ │ ├── EditTagsDialog.tsx │ │ │ ├── TagCard.tsx │ │ │ ├── TagCardGrid.tsx │ │ │ ├── TagDetails/ │ │ │ │ ├── Tag.tsx │ │ │ │ ├── TagCreate.tsx │ │ │ │ ├── TagDetailsPanel.tsx │ │ │ │ ├── TagEditPanel.tsx │ │ │ │ ├── TagGalleriesPanel.tsx │ │ │ │ ├── TagGroupsPanel.tsx │ │ │ │ ├── TagImagesPanel.tsx │ │ │ │ ├── TagMarkersPanel.tsx │ │ │ │ ├── TagPerformersPanel.tsx │ │ │ │ ├── TagScenesPanel.tsx │ │ │ │ └── TagStudiosPanel.tsx │ │ │ ├── TagList.tsx │ │ │ ├── TagListTable.tsx │ │ │ ├── TagMergeDialog.tsx │ │ │ ├── TagPopover.tsx │ │ │ ├── TagRecommendationRow.tsx │ │ │ ├── TagSelect.tsx │ │ │ ├── Tags.tsx │ │ │ └── styles.scss │ │ ├── TroubleshootingMode/ │ │ │ ├── TroubleshootingModeButton.tsx │ │ │ ├── TroubleshootingModeOverlay.tsx │ │ │ └── useTroubleshootingMode.ts │ │ └── Wall/ │ │ ├── WallItem.tsx │ │ ├── WallPanel.tsx │ │ └── styles.scss │ ├── core/ │ │ ├── StashService.ts │ │ ├── config.ts │ │ ├── createClient.ts │ │ ├── enums.ts │ │ ├── files.ts │ │ ├── galleries.ts │ │ ├── groups.ts │ │ ├── markers.ts │ │ ├── performers.ts │ │ ├── recommendations.ts │ │ ├── studios.ts │ │ └── tags.ts │ ├── docs/ │ │ └── en/ │ │ ├── Changelog/ │ │ │ ├── v010.md │ │ │ ├── v0100.md │ │ │ ├── v011.md │ │ │ ├── v0110.md │ │ │ ├── v0120.md │ │ │ ├── v0130.md │ │ │ ├── v0131.md │ │ │ ├── v0140.md │ │ │ ├── v0150.md │ │ │ ├── v0160.md │ │ │ ├── v0161.md │ │ │ ├── v0170.md │ │ │ ├── v0180.md │ │ │ ├── v0190.md │ │ │ ├── v020.md │ │ │ ├── v0200.md │ │ │ ├── v021.md │ │ │ ├── v0210.md │ │ │ ├── v0220.md │ │ │ ├── v0230.md │ │ │ ├── v0240.md │ │ │ ├── v0250.md │ │ │ ├── v0260.md │ │ │ ├── v0270.md │ │ │ ├── v0280.md │ │ │ ├── v0290.md │ │ │ ├── v030.md │ │ │ ├── v0300.md │ │ │ ├── v0310.md │ │ │ ├── v040.md │ │ │ ├── v050.md │ │ │ ├── v060.md │ │ │ ├── v070.md │ │ │ ├── v080.md │ │ │ └── v090.md │ │ ├── Manual/ │ │ │ ├── AutoTagging.md │ │ │ ├── Browsing.md │ │ │ ├── Captions.md │ │ │ ├── Configuration.md │ │ │ ├── Contributing.md │ │ │ ├── Deduplication.md │ │ │ ├── EmbeddedPlugins.md │ │ │ ├── ExternalPlugins.md │ │ │ ├── Help.md │ │ │ ├── Identify.md │ │ │ ├── Images.md │ │ │ ├── Interactive.md │ │ │ ├── Interface.md │ │ │ ├── Introduction.md │ │ │ ├── JSONSpec.md │ │ │ ├── KeyboardShortcuts.md │ │ │ ├── Plugins.md │ │ │ ├── SceneFilenameParser.md │ │ │ ├── ScraperDevelopment.md │ │ │ ├── Scraping.md │ │ │ ├── Tagger.md │ │ │ ├── Tasks.md │ │ │ ├── TroubleshootingMode.md │ │ │ └── UIPluginApi.md │ │ ├── MigrationNotes/ │ │ │ ├── 32.md │ │ │ ├── 39.md │ │ │ ├── 48.md │ │ │ ├── 58.md │ │ │ ├── 60.md │ │ │ └── index.ts │ │ └── ReleaseNotes/ │ │ ├── index.ts │ │ ├── v0170.md │ │ ├── v0200.md │ │ ├── v0240.md │ │ ├── v0250.md │ │ ├── v0260.md │ │ ├── v0270.md │ │ └── v0290.md │ ├── globals.d.ts │ ├── hooks/ │ │ ├── Config.tsx │ │ ├── Interactive/ │ │ │ ├── context.tsx │ │ │ ├── interactive.scss │ │ │ ├── interactive.ts │ │ │ ├── status.tsx │ │ │ └── utils.ts │ │ ├── Interval.ts │ │ ├── Lightbox/ │ │ │ ├── Lightbox.tsx │ │ │ ├── LightboxImage.tsx │ │ │ ├── LightboxLink.tsx │ │ │ ├── context.tsx │ │ │ ├── hooks.ts │ │ │ ├── lightbox.scss │ │ │ └── types.ts │ │ ├── LocalForage.ts │ │ ├── OutsideClick.tsx │ │ ├── PageVisibility.ts │ │ ├── Toast.tsx │ │ ├── data.ts │ │ ├── debounce.ts │ │ ├── detailsPanel.ts │ │ ├── event.ts │ │ ├── keybinds.ts │ │ ├── modal.ts │ │ ├── scrollToTop.ts │ │ ├── sprite.ts │ │ ├── state.ts │ │ ├── tagsEdit.tsx │ │ ├── throttle.ts │ │ ├── title.ts │ │ ├── useScript.tsx │ │ └── useTableColumns.ts │ ├── index.scss │ ├── index.tsx │ ├── locales/ │ │ ├── README.md │ │ ├── af-ZA.json │ │ ├── ar.json │ │ ├── bg-BG.json │ │ ├── bn-BD.json │ │ ├── ca-ES.json │ │ ├── countryNames/ │ │ │ └── zh-TW.json │ │ ├── cs-CZ.json │ │ ├── da-DK.json │ │ ├── de-DE.json │ │ ├── en-GB.json │ │ ├── en-US.json │ │ ├── es-ES.json │ │ ├── et-EE.json │ │ ├── fa-IR.json │ │ ├── fi-FI.json │ │ ├── fr-FR.json │ │ ├── hi-IN.json │ │ ├── hr-HR.json │ │ ├── hu-HU.json │ │ ├── id-ID.json │ │ ├── index.ts │ │ ├── it-IT.json │ │ ├── ja-JP.json │ │ ├── ko-KR.json │ │ ├── lt-LT.json │ │ ├── lv-LV.json │ │ ├── nb-NO.json │ │ ├── ne-NP.json │ │ ├── nl-NL.json │ │ ├── nn-NO.json │ │ ├── pl-PL.json │ │ ├── pt-BR.json │ │ ├── ro-RO.json │ │ ├── ru-RU.json │ │ ├── sk-SK.json │ │ ├── sv-SE.json │ │ ├── th-TH.json │ │ ├── tr-TR.json │ │ ├── uk-UA.json │ │ ├── ur-PK.json │ │ ├── vi-VN.json │ │ ├── zh-CN.json │ │ └── zh-TW.json │ ├── models/ │ │ ├── list-filter/ │ │ │ ├── criteria/ │ │ │ │ ├── captions.ts │ │ │ │ ├── circumcised.ts │ │ │ │ ├── country.ts │ │ │ │ ├── criterion.ts │ │ │ │ ├── custom-fields.ts │ │ │ │ ├── favorite.ts │ │ │ │ ├── folder.ts │ │ │ │ ├── galleries.ts │ │ │ │ ├── gender.ts │ │ │ │ ├── groups.ts │ │ │ │ ├── has-chapters.ts │ │ │ │ ├── has-markers.ts │ │ │ │ ├── interactive.ts │ │ │ │ ├── is-missing.ts │ │ │ │ ├── organized.ts │ │ │ │ ├── orientation.ts │ │ │ │ ├── path.ts │ │ │ │ ├── performers.ts │ │ │ │ ├── phash.ts │ │ │ │ ├── rating.ts │ │ │ │ ├── resolution.ts │ │ │ │ ├── scenes.ts │ │ │ │ ├── stash-ids.ts │ │ │ │ ├── studios.ts │ │ │ │ └── tags.ts │ │ │ ├── factory.ts │ │ │ ├── filter-options.ts │ │ │ ├── filter.ts │ │ │ ├── galleries.ts │ │ │ ├── groups.ts │ │ │ ├── images.ts │ │ │ ├── performers.ts │ │ │ ├── scene-markers.ts │ │ │ ├── scenes.ts │ │ │ ├── studios.ts │ │ │ ├── tags.ts │ │ │ ├── types.ts │ │ │ └── utils.ts │ │ └── sceneQueue.ts │ ├── patch.tsx │ ├── pluginApi.d.ts │ ├── pluginApi.tsx │ ├── plugins.tsx │ ├── polyfills.ts │ ├── serviceWorker.ts │ ├── sfw-mode.scss │ ├── styles/ │ │ ├── _range.scss │ │ ├── _scrollbars.scss │ │ └── _theme.scss │ └── utils/ │ ├── apple.ts │ ├── bulkUpdate.ts │ ├── caption.ts │ ├── circumcised.ts │ ├── country.ts │ ├── data.ts │ ├── dlnaVideoSort.ts │ ├── download.ts │ ├── errors.ts │ ├── field.tsx │ ├── flattenMessages.ts │ ├── focus.ts │ ├── form.tsx │ ├── gender.ts │ ├── hamming.ts │ ├── history.ts │ ├── image.tsx │ ├── imageWall.ts │ ├── index.ts │ ├── job.ts │ ├── keyboard.ts │ ├── lazyComponent.ts │ ├── navigation.ts │ ├── orientation.ts │ ├── percent.ts │ ├── query.ts │ ├── rating.ts │ ├── resolution.ts │ ├── screen.ts │ ├── session.ts │ ├── stashIds.ts │ ├── stashbox.ts │ ├── text.ts │ ├── units.ts │ ├── visualFile.ts │ └── yup.ts ├── tsconfig.json └── vite.config.js