project/analysis/util/download.py

78 lines
1.9 KiB
Python

import logging
import os
from util import json_path
logger = logging.getLogger(__name__)
def download_board(board_id, instance_config_id, sequence_id, source):
local_file = "static/progress/images/{config_id}/{sequence_id}/{board_id}".format(
config_id=instance_config_id,
sequence_id=sequence_id,
board_id=board_id)
if os.path.exists(local_file):
return local_file
url = "/game2/editor/config/{config_id}/sequence/{sequence_id}/board/{board_id}/".format(
config_id=instance_config_id,
sequence_id=sequence_id,
board_id=board_id
)
board = source.get(url)
if not board.ok:
raise ConnectionError()
data = board.json()
preview_url = json_path(data, "preview_url.medium")
logger.debug(preview_url)
os.makedirs(local_file[:-len(board_id)], exist_ok=True)
source.download_file(preview_url, local_file)
return local_file
def get_config(source, instance_id):
url = "/game2/editor/config/{config_id}/".format(config_id=instance_id)
instance_data = get_json(source, url)
caches = url + "cache/"
cache_data = get_json(source, caches)
result = {
"name": instance_data["name"],
"id": instance_data["@id"],
"caches": cache_data
}
return result
def get_board_data(source, instance_id, sequence_id, board_id):
url = "/game2/editor/config/{config_id}/sequence/{sequence_id}/board/{board_id}/".format(
config_id=instance_id,
sequence_id=sequence_id,
board_id=board_id
)
instance_data = get_json(source, url)
if instance_data is None:
return {"class": "error"}
result = {
"class": instance_data["@class"],
}
for i in ["image", "audio", "video"]:
key = i + "_file"
result["has_" + i] = bool(key in instance_data and instance_data[key])
return result
cache = {}
def get_json(source, url):
if url in cache:
return cache[url]
try:
data = source.get(url).json()
except Exception as e:
print("exception", e, e.args) # TODO: logging
data = None
cache[url] = data
return data