project/analysis/util/download.py

77 lines
1.9 KiB
Python

import logging
import os
from analysis.util import json_path
logger = logging.getLogger(__name__)
def download_board(board_id, instance_config_id, sequence_id, source, path="/data/results/"):
local_file = os.path.join("static", instance_config_id, sequence_id, board_id)
abs_path = os.path.join(path, local_file)
if os.path.exists(abs_path):
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(url, board, board.status_code)
data = board.json()
preview_url = json_path(data, "preview_url.medium")
logger.debug(preview_url)
os.makedirs(abs_path[:-len(board_id)], exist_ok=True)
source.download_file(preview_url, abs_path)
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)
logger.exception(e)
data = None
cache[url] = data
return data