Add API functions

get_templates list
get_infos_from_url
generate_pic
master
Lertsenem 2020-12-20 19:24:45 +01:00
parent 05898aafca
commit dcf9b676fa
1 changed files with 146 additions and 10 deletions

View File

@ -7,6 +7,7 @@ import logging
import pathlib import pathlib
import requests import requests
import sys import sys
import urllib
import appdirs import appdirs
@ -23,6 +24,135 @@ ROOTDIR = pathlib.Path(__file__).absolute().parent
APPDIRS = appdirs.AppDirs(version.NAME, version.ENTITY) APPDIRS = appdirs.AppDirs(version.NAME, version.ENTITY)
LOG_DUMMY = logging.getLogger("dummy")
LOG_DUMMY.addHandler(logging.NullHandler())
DEFAULT_DIR_TEMPLATES = ROOTDIR / "templates"
# =============================================================================
def get_templates_list(
dir_templates = DEFAULT_DIR_TEMPLATES,
):
templates_list = []
dir_templates_path = pathlib.Path(dir_templates)
for potential_template in dir_templates_path.iterdir():
if (potential_template / "template.svg.j2").is_file():
templates_list.append(potential_template.name)
return templates_list
# =============================================================================
def get_infos_from_url(
url,
token,
options = {},
outform = "dict",
top = 8,
proxy = None,
log = LOG_DUMMY,
):
url_parsed = urllib.parse.urlparse(url)
if url_parsed.netloc not in [ "smash.gg" ]:
raise ValueError("Unsupported domain name")
if outform not in [ "dict", "lkrz" ]:
raise ValueError("Unsupported outform")
# -------------------------------------------------------------------------
if url_parsed.netloc == "smash.gg":
if (url_parsed.path.split("/")[1] != "tournament"):
raise Exception("No tournament found in url {}".format(url_parsed.path.split("/")))
# Get infos from smash.gg and write the config file
tournament, top_players = getTournamentTop(
id_or_slug = url_parsed.path.split("/")[2],
get_prefixes = options.get("use_smashgg_prefixes", False),
top = top,
token = token,
proxy = proxy,
log = log,
)
if tournament is None or top_players is None:
log.error("Could not load data from smash.gg")
raise Exception("Could not load data from smash.gg")
# -------------------------------------------------------------------------
if outform == "dict":
return {
"tournament": tournament,
"players": top_players,
}
# -------------------------------------------------------------------------
if outform == "lkrz":
return "\n".join(
[ tournament.conf() ] \
+ list(map(
lambda p:p.conf(),
top_players,
))
)
# =============================================================================
def generate_pic(
infos_or_lkrzfile = None,
template = None,
outform = "svg",
options = {},
dir_templates = DEFAULT_DIR_TEMPLATES,
dir_res = None,
dir_cache = None,
log = LOG_DUMMY,
):
if outform not in ["svg", "png"]:
raise Exception("Unsupported outform")
if type(infos_or_lkrzfile) == str:
# TODO : load lkrz as dict infos
raise NotImplementedError()
else:
infos = infos_or_lkrzfile
# -------------------------------------------------------------------------
# Build the context which will be passed to the template
context = {
"tournament": infos["tournament"].clean_name(
options.get(
"name_seo_delimiter",
None
)
),
"players" : sorted(
infos["players"],
key = lambda p: p.placement,
),
"dir_res_ssbu": dir_res,
"dir_template": str(dir_templates/template),
"options": options.get("template_options", []),
}
pic = export.generate_pic(
dir_templates,
template,
context,
outform,
log = log,
cachedir = dir_cache,
)
if pic is None:
raise Exception("Failed to generate pic")
return pic
# ============================================================================= # =============================================================================
def main(): def main():
@ -90,7 +220,7 @@ def main():
"--playerskinsdb", "-PD", "--playerskinsdb", "-PD",
type = (lambda s: s if s.startswith("http") else pathlib.Path(s)), type = (lambda s: s if s.startswith("http") else pathlib.Path(s)),
default = ROOTDIR / "data" / "playerskinsdb.json", default = ROOTDIR / "data" / "playerskinsdb.json",
help = "A JSON file path or urk matching player tags, characters,"\ help = "A JSON file path or url matching player tags, characters,"\
" sponsors, and preferred skins", " sponsors, and preferred skins",
) )
top8_parser.add_argument( top8_parser.add_argument(
@ -102,7 +232,7 @@ def main():
top8_parser.add_argument( top8_parser.add_argument(
"--templatesdir", "-TD", "--templatesdir", "-TD",
type = pathlib.Path, type = pathlib.Path,
default = ROOTDIR / "templates", default = DEFAULT_DIR_TEMPLATES,
help = "The local result templates directory", help = "The local result templates directory",
) )
@ -211,10 +341,12 @@ def main():
log.debug("loading playerskins db from '{}'" \ log.debug("loading playerskins db from '{}'" \
.format(args.playerskinsdb)) .format(args.playerskinsdb))
try: try:
smashgg.PLAYERSKINS = requests.get(args.playerskinsdb).json() PLAYERSKINS = requests.get(args.playerskinsdb).json()
smashgg.GET_PLAYERDATA = (lambda tag: PLAYERSKINS[tag.lower()])
except: except:
with args.playerskinsdb.open("r", encoding="utf8") as f: with args.playerskinsdb.open("r", encoding="utf8") as f:
smashgg.PLAYERSKINS = json.load(f) PLAYERSKINS = json.load(f)
smashgg.GET_PLAYERDATA = (lambda tag: PLAYERSKINS[tag.lower()])
# #
tournament = None tournament = None
@ -283,7 +415,7 @@ def main():
[ tournament.conf() ] \ [ tournament.conf() ] \
+ list(map( + list(map(
lambda p:p.conf(), lambda p:p.conf(),
top_players.values(), top_players,
)) ))
) )
@ -310,7 +442,7 @@ def main():
context = { context = {
"tournament": tournament.clean_name(args.name_seo_delimiter), "tournament": tournament.clean_name(args.name_seo_delimiter),
"players" : sorted( "players" : sorted(
top_players.values(), top_players,
key = lambda p: p.placement, key = lambda p: p.placement,
), ),
"dir_res_ssbu": dir_res_ssbu, "dir_res_ssbu": dir_res_ssbu,
@ -341,7 +473,7 @@ def getTournamentTop(
top=8, top=8,
token = "", token = "",
proxy = None, proxy = None,
log=None): log=LOG_DUMMY):
"""Returns a tuple : the smashgg.Tournament object and a list of the top """Returns a tuple : the smashgg.Tournament object and a list of the top
smashgg.Player in that tournament.""" smashgg.Player in that tournament."""
@ -358,7 +490,7 @@ def getTournamentTop(
# ------------------------------------------------------------------------- # -------------------------------------------------------------------------
# Select the right event (the one with the most entrants or the most sets) # Select the right event (the one with the most entrants or the most sets)
def selectBiggestEvent(data, log=None): def selectBiggestEvent(data, log=LOG_DUMMY):
try: try:
event = data["events"][0] event = data["events"][0]
@ -547,10 +679,14 @@ def getTournamentTop(
# If some games or selections are null, this can happen # If some games or selections are null, this can happen
continue continue
# Sort top_players by rank instead of id:
top_players_sorted = sorted(
top_players.values(),
key = lambda p: p.placement,
)
# Return the data # Return the data
return tournament, top_players return tournament, top_players_sorted
# ============================================================================= # =============================================================================
if __name__ == '__main__': if __name__ == '__main__':