Files
compose-projects-arr/stash/config/scrapers/community/Traxxx/Traxxx.py
Christoph Califice 0a5f88d75a stash
2025-10-10 09:50:30 -03:00

118 lines
3.5 KiB
Python

import re, sys, copy, json
try:
import requests
except ModuleNotFoundError:
print("You need to install the requests module. (https://docs.python-requests.org/en/latest/user/install/)", file=sys.stderr)
print("If you have pip (normally installed with python), run this command in a terminal (cmd): pip install requests", file=sys.stderr)
sys.exit()
try:
import py_common.log as log
except ModuleNotFoundError:
print("You need to download the folder 'py_common' from the community repo! (CommunityScrapers/tree/master/scrapers/py_common)", file=sys.stderr)
sys.exit()
try:
from traxxx_interface import TraxxxInterface
except ModuleNotFoundError:
print("You need to download the file 'traxxx_interface.py' from the community repo! (CommunityScrapers/tree/master/scrapers/traxxx_interface.py)", file=sys.stderr)
sys.exit()
def main():
global traxxx
mode = sys.argv[1]
traxxx = TraxxxInterface()
fragment = json.loads(sys.stdin.read())
data = None
log.info(mode)
if mode == 'scene_name':
data = scene_by_name(fragment)
if mode == 'scene_url':
data = scene_query_fragment(fragment)
if mode == 'scene_query_fragment':
data = scene_query_fragment(fragment)
if mode == 'scene_fragment':
data = scene_fragment(fragment)
if mode == 'performer_lookup':
data = performer_lookup(fragment)
if mode == 'performer_fragment':
data = performer_fragment(fragment)
if mode == 'performer_url':
data = performer_url(fragment)
# log.info(json.dumps(data))
print(json.dumps(data))
def search_traxxx_for_scene(fragment):
title = fragment.get("title")
if not title:
title = fragment.get("name")
if not title:
return
return traxxx.search_scenes(title)
# Return a list of scenes from a search
def scene_by_name(fragment):
scenes = search_traxxx_for_scene(fragment)
if scenes:
return [traxxx.parse_to_stash_scene_search(s) for s in scenes]
else:
log.warning("No scene results from Traxxx")
return []
# extract TraxxxID from passed fragment and return new fragment
def scene_query_fragment(fragment):
traxxx_url = fragment.get("url", "")
m = re.search(r'traxxx.me/scene/(\d+)/', traxxx_url)
if not m:
log.warning(f'could not parse scene ID from URL: {traxxx_url}')
return
scene_id = m.group(1)
scene = traxxx.get_scene(scene_id)
return traxxx.parse_to_stash_scene(scene)
# return first result from scene_name
def scene_fragment(fragment):
scenes = search_traxxx_for_scene(fragment)
if scenes:
return traxxx.parse_to_stash_scene(scenes[0])
# Return a list of possible performer matches
def performer_lookup(fragment):
performers = traxxx.search_performers(fragment["name"])
if performers:
return [traxxx.parse_to_stash_performer_search(p) for p in performers]
else:
log.warning("No performer results from Traxxx")
return []
# Return a single best guess for performer based on fragment
def performer_fragment(fragment):
# check if fragment has Traxxx URL
performer = performer_url(fragment)
if performer:
return performer
# search and take first result from lookup
performer = performer_lookup(fragment)[0]
return performer
# Get PerformerID from URL and do a lookup on it
def performer_url(fragment):
m = re.search(r'traxxx.me/actor/(\d+)/', fragment['url'])
if not m:
return
performer_id = m.group(1)
performer = traxxx.get_performer(performer_id)
return traxxx.parse_to_stash_performer(performer)
if __name__ == '__main__':
main()