stash
This commit is contained in:
132
stash/config/scrapers/community/CopyToGallery/CopyToGallery.py
Normal file
132
stash/config/scrapers/community/CopyToGallery/CopyToGallery.py
Normal file
@@ -0,0 +1,132 @@
|
||||
import json
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
import py_common.graphql as graphql
|
||||
import py_common.log as log
|
||||
from py_common.config import get_config
|
||||
from py_common.util import dig
|
||||
|
||||
|
||||
config = get_config(
|
||||
default="""
|
||||
find_missing_galleries = False
|
||||
"""
|
||||
)
|
||||
|
||||
|
||||
def get_gallery_id_by_path(abs_path):
|
||||
abs_path = str(abs_path.resolve())
|
||||
log.debug(f"Finding gallery associated with path '{abs_path}'")
|
||||
query = """
|
||||
query FindGalleries($galleries_filter: GalleryFilterType) {
|
||||
findGalleries(gallery_filter: $galleries_filter filter: {per_page: -1}) {
|
||||
galleries {
|
||||
id
|
||||
}
|
||||
}
|
||||
}
|
||||
"""
|
||||
variables = {
|
||||
"galleries_filter": {"path": {"value": abs_path, "modifier": "EQUALS"}}
|
||||
}
|
||||
result = graphql.callGraphQL(query, variables)
|
||||
if (
|
||||
result is None
|
||||
or (gallery_id := dig(result, "findGalleries", "galleries", 0, "id")) is None
|
||||
):
|
||||
log.error(
|
||||
f"Found gallery with path '{abs_path}' but it needs to be added into Stash with a scan first"
|
||||
)
|
||||
exit(1)
|
||||
|
||||
log.debug(f"Found gallery {gallery_id} with path '{abs_path}'")
|
||||
return gallery_id
|
||||
|
||||
|
||||
def update_gallery(input):
|
||||
log.debug(f"Updating gallery {input['id']}")
|
||||
query = """
|
||||
mutation GalleryUpdate($input : GalleryUpdateInput!) {
|
||||
galleryUpdate(input: $input) {
|
||||
id
|
||||
title
|
||||
}
|
||||
}
|
||||
"""
|
||||
variables = {"input": input}
|
||||
result = graphql.callGraphQL(query, variables)
|
||||
if not result:
|
||||
log.error(f"Failed to update gallery {input['id']}")
|
||||
sys.exit(1)
|
||||
|
||||
g_id = result["galleryUpdate"]["id"]
|
||||
g_title = result["galleryUpdate"]["title"]
|
||||
log.info(f"Updated gallery {g_id}: {g_title}")
|
||||
|
||||
|
||||
def add_galleries_to_scene(scene_id, gallery_ids):
|
||||
data = {"id": scene_id, "gallery_ids": gallery_ids}
|
||||
query = """
|
||||
mutation SceneUpdate($input : SceneUpdateInput!) {
|
||||
sceneUpdate(input: $input) {
|
||||
id
|
||||
title
|
||||
}
|
||||
}
|
||||
"""
|
||||
variables = {"input": data}
|
||||
result = graphql.callGraphQL(query, variables)
|
||||
if not result:
|
||||
log.error(f"Failed to update scene {scene_id}")
|
||||
sys.exit(1)
|
||||
|
||||
|
||||
def find_galleries(scene_id, scene_path):
|
||||
directory_path = Path(scene_path).parent
|
||||
log.debug(f"Searching for galleries in {directory_path.resolve()}")
|
||||
return [
|
||||
get_gallery_id_by_path(f) for f in directory_path.glob("*.zip") if f.is_file()
|
||||
]
|
||||
|
||||
|
||||
FRAGMENT = json.loads(sys.stdin.read())
|
||||
log.debug("FRAGMENT " + str(FRAGMENT))
|
||||
SCENE_ID = FRAGMENT.get("id")
|
||||
|
||||
scene = graphql.getScene(SCENE_ID)
|
||||
if not scene:
|
||||
log.error(f"Scene with id '{SCENE_ID}' not found")
|
||||
sys.exit(1)
|
||||
|
||||
|
||||
gallery_ids = [g["id"] for g in scene["galleries"]]
|
||||
if not gallery_ids and config.find_missing_galleries:
|
||||
log.debug(
|
||||
f"No galleries associated with scene {SCENE_ID}, searching for zips in folder..."
|
||||
)
|
||||
gallery_ids = find_galleries(SCENE_ID, scene["files"][0]["path"])
|
||||
|
||||
if not gallery_ids:
|
||||
log.debug("No galleries found, exiting")
|
||||
|
||||
word = "gallery" if len(gallery_ids) == 1 else "galleries"
|
||||
log.debug(f"Scene has {len(gallery_ids)} {word}: {','.join(gallery_ids)}")
|
||||
|
||||
gallery_input = {
|
||||
"urls": scene["urls"],
|
||||
"title": scene["title"],
|
||||
"code": scene["code"],
|
||||
"date": scene["date"],
|
||||
"details": scene["details"],
|
||||
"tag_ids": [t["id"] for t in scene["tags"]],
|
||||
"performer_ids": [p["id"] for p in scene["performers"]],
|
||||
"studio_id": dig(scene, "studio", "id"),
|
||||
}
|
||||
|
||||
for gallery_id in gallery_ids:
|
||||
update_gallery({"id": gallery_id, **gallery_input})
|
||||
|
||||
add_galleries_to_scene(SCENE_ID, gallery_ids)
|
||||
|
||||
print(json.dumps({}))
|
||||
@@ -0,0 +1,10 @@
|
||||
name: "Copy to Gallery"
|
||||
# requires: py_common
|
||||
|
||||
sceneByFragment:
|
||||
action: script
|
||||
script:
|
||||
- python3
|
||||
- CopyToGallery.py
|
||||
|
||||
# Last Updated January 02, 2024
|
||||
10
stash/config/scrapers/community/CopyToGallery/manifest
Executable file
10
stash/config/scrapers/community/CopyToGallery/manifest
Executable file
@@ -0,0 +1,10 @@
|
||||
id: CopyToGallery
|
||||
name: Copy to Gallery
|
||||
metadata: {}
|
||||
version: 60ce33b
|
||||
date: "2024-03-14 12:14:13"
|
||||
requires: []
|
||||
source_repository: https://stashapp.github.io/CommunityScrapers/stable/index.yml
|
||||
files:
|
||||
- CopyToGallery.yml
|
||||
- CopyToGallery.py
|
||||
Reference in New Issue
Block a user