118 lines
3.5 KiB
Python
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()
|