Files
CommunityScripts/plugins/dupeMarker/dupeMarker.py
feederbox826 f899a5627e Update DupeMarker (#302)
* fix dupeMarker deprecation, add delete mode

* prettify

---------

Co-authored-by: feederbox826 <feederbox826@users.noreply.github.com>
2024-05-14 01:57:50 +03:00

71 lines
2.0 KiB
Python

import json
import sys
import stashapi.log as log
from stashapi.stashapp import StashInterface
FRAGMENT = json.loads(sys.stdin.read())
MODE = FRAGMENT["args"]["mode"]
stash = StashInterface(FRAGMENT["server_connection"])
dupe_marker_tag = stash.find_tag("[Marker: Duplicate]", create=True).get("id")
def findScenesWithMarkers():
totalDupes = 0
scenes = stash.find_scenes(f={"has_markers": "true"}, fragment="id")
for scene in scenes:
totalDupes += checkScene(scene)
log.info("Found %d duplicate markers across %d scenes" % (totalDupes, len(scenes)))
def addMarkerTag(marker):
query = """
mutation SceneMarkerUpdate($input:SceneMarkerUpdateInput!) {
sceneMarkerUpdate(input: $input) {
id
}
}
"""
oldTags = [tag["id"] for tag in marker["tags"]]
if dupe_marker_tag in oldTags:
return
oldTags.append(dupe_marker_tag)
newMarker = {"id": marker["id"], "tag_ids": oldTags}
stash._callGraphQL(query, {"input": newMarker})
# stash.update_scene_marker(newMarker, "id")
def checkScene(scene):
seen = set()
dupes = []
markers = stash.get_scene_markers(scene["id"])
# find duplicate pairs
for marker in markers:
sortidx = ";".join(
[
str(marker["title"]),
str(marker["seconds"]),
str(marker["primary_tag"]["id"]),
]
)
if sortidx not in seen:
seen.add(sortidx)
else:
dupes.append(marker)
# add tag
if dupes:
log.debug("Found %d duplicate markers in scene %s" % (len(dupes), scene["id"]))
for dupe in dupes:
if MODE == "delete":
stash.destroy_scene_marker(dupe["id"])
else:
addMarkerTag(dupe)
return len(dupes)
def main():
if MODE == "mark":
findScenesWithMarkers()
elif MODE == "delete":
findScenesWithMarkers()
log.exit("Plugin exited normally.")
if __name__ == "__main__":
main()