mirror of
https://github.com/stashapp/CommunityScripts.git
synced 2026-02-04 10:49:10 -06:00
* fix css files * create workflow * format code using prettier * black ignore 3rd party folder * format py code using black * black exclude option in workflow * Don't format workflow files * Add contributing instructions to readme --------- Co-authored-by: WithoutPants <53250216+WithoutPants@users.noreply.github.com>
151 lines
5.1 KiB
Python
151 lines
5.1 KiB
Python
import stashapi.log as log
|
|
from stashapi.stashapp import StashInterface
|
|
import stashapi.marker_parse as mp
|
|
import yaml
|
|
import json
|
|
import os
|
|
import sys
|
|
import xml.etree.ElementTree as ET
|
|
import zipfile
|
|
|
|
per_page = 100
|
|
|
|
|
|
def processGallery(g):
|
|
# Read ComicInfo.xml File
|
|
if len(g["files"]) == 0:
|
|
log.info(g["id"] + " is not an archive. No scanning for Comic Metadata.")
|
|
return
|
|
comicInfo = False
|
|
with zipfile.ZipFile(g["files"][0]["path"], "r") as archive:
|
|
archivecontent = [x.lower() for x in archive.namelist()]
|
|
for archivefile in archivecontent:
|
|
if archivefile.lower() == "comicinfo.xml":
|
|
comicInfo = ET.fromstring(archive.read("ComicInfo.xml"))
|
|
if not comicInfo:
|
|
log.info(
|
|
g["files"][0]["path"]
|
|
+ " does not contain a ComicInfo.xml file. No scan will be triggered."
|
|
)
|
|
return
|
|
|
|
# Adjust names for giving ids
|
|
for key in ImportList.keys():
|
|
if ImportList[key] == "tags":
|
|
ImportList[key] = "tag_ids"
|
|
if ImportList[key] == "performers":
|
|
ImportList[key] = "performer_ids"
|
|
if ImportList[key] == "studio":
|
|
ImportList[key] = "studio_id"
|
|
|
|
# Get Metadata from ComicInfo.xml
|
|
galleryData = {"id": g["id"]}
|
|
for item in ImportList.keys():
|
|
value = comicInfo.find(item)
|
|
if value != None:
|
|
galleryData[ImportList[item]] = value.text
|
|
chapterData = []
|
|
pageData = comicInfo.find("Pages")
|
|
if pageData:
|
|
for page in pageData:
|
|
if page.get("Bookmark"):
|
|
chapterData.append(
|
|
{
|
|
"image_index": int(page.get("Image")) + 1,
|
|
"title": page.get("Bookmark"),
|
|
}
|
|
)
|
|
if page.get("Type"):
|
|
chapterData.append(
|
|
{
|
|
"image_index": int(page.get("Image")) + 1,
|
|
"title": page.get("Type"),
|
|
}
|
|
)
|
|
|
|
# Adjust the retrieved data if necessary
|
|
for data in galleryData.keys():
|
|
if data in ["tag_ids", "performer_ids"]:
|
|
galleryData[data] = [x.strip() for x in galleryData[data].split(",")]
|
|
if data == "tag_ids":
|
|
tagids = []
|
|
for tag in galleryData[data]:
|
|
tagids.append(stash.find_tag(tag, create=True)["id"])
|
|
galleryData[data] = tagids
|
|
if data == "performer_ids":
|
|
performerids = []
|
|
for performer in galleryData[data]:
|
|
performerids.append(stash.find_performer(performer, create=True)["id"])
|
|
galleryData[data] = performerids
|
|
if data == "studio_id":
|
|
galleryData[data] = stash.find_studio(galleryData[data], create=True)["id"]
|
|
if data == "date":
|
|
galleryData[data] = galleryData[data] + "-01-01"
|
|
if data == "organized":
|
|
galleryData[data] = eval(galleryData[data].lower().capitalize())
|
|
if data == "rating100":
|
|
galleryData[data] = int(galleryData[data])
|
|
|
|
# Add Chapter if it does not exist and finally update Gallery Metadata
|
|
for chapter in chapterData:
|
|
addChapter = True
|
|
for existingChapter in g["chapters"]:
|
|
if (
|
|
existingChapter["title"] == chapter["title"]
|
|
and existingChapter["image_index"] == chapter["image_index"]
|
|
):
|
|
addChapter = False
|
|
if addChapter:
|
|
stash.create_gallery_chapter(
|
|
{
|
|
"title": chapter["title"],
|
|
"image_index": chapter["image_index"],
|
|
"gallery_id": g["id"],
|
|
}
|
|
)
|
|
stash.update_gallery(galleryData)
|
|
|
|
|
|
def processAll():
|
|
log.info("Getting gallery count")
|
|
count = stash.find_galleries(f={}, filter={"per_page": 1}, get_count=True)[0]
|
|
log.info(str(count) + " galleries to scan.")
|
|
for r in range(1, int(count / per_page) + 1):
|
|
log.info("processing " + str(r * per_page) + " - " + str(count))
|
|
galleries = stash.find_galleries(f={}, filter={"page": r, "per_page": per_page})
|
|
for g in galleries:
|
|
processGallery(g)
|
|
|
|
|
|
# Start of the Program
|
|
json_input = json.loads(sys.stdin.read())
|
|
FRAGMENT_SERVER = json_input["server_connection"]
|
|
stash = StashInterface(FRAGMENT_SERVER)
|
|
|
|
# Load Config
|
|
with open(
|
|
os.path.join(os.path.dirname(os.path.abspath(__file__)), "config.yml"), "r"
|
|
) as f:
|
|
try:
|
|
config = yaml.safe_load(f)
|
|
except yaml.YAMLError as exc:
|
|
log.error("Could not load config.yml: " + str(exc))
|
|
sys.exit(1)
|
|
try:
|
|
ImportList = config["ImportList"]
|
|
except KeyError as key:
|
|
log.error(
|
|
str(key)
|
|
+ " is not defined in config.yml, but is needed for this script to proceed"
|
|
)
|
|
sys.exit(1)
|
|
|
|
if "mode" in json_input["args"]:
|
|
PLUGIN_ARGS = json_input["args"]["mode"]
|
|
if "process" in PLUGIN_ARGS:
|
|
processAll()
|
|
elif "hookContext" in json_input["args"]:
|
|
id = json_input["args"]["hookContext"]["id"]
|
|
gallery = stash.find_gallery(id)
|
|
processGallery(gallery)
|