|
import json |
|
import logging |
|
import os |
|
import sys |
|
import threading |
|
import time |
|
import zipfile |
|
from urllib.parse import urlencode |
|
from urllib.request import urlopen, urlretrieve |
|
|
|
|
|
|
|
class Spinner: |
|
busy = False |
|
delay = 0.1 |
|
|
|
@staticmethod |
|
def spinning_cursor(): |
|
while 1: |
|
for cursor in "|/-\\": |
|
yield cursor |
|
|
|
def __init__(self, delay=None): |
|
self.spinner_generator = self.spinning_cursor() |
|
if delay and float(delay): |
|
self.delay = delay |
|
|
|
def spinner_task(self): |
|
while self.busy: |
|
sys.stdout.write(next(self.spinner_generator)) |
|
sys.stdout.flush() |
|
time.sleep(self.delay) |
|
sys.stdout.write("\b") |
|
sys.stdout.flush() |
|
|
|
def __enter__(self): |
|
self.busy = True |
|
threading.Thread(target=self.spinner_task).start() |
|
|
|
def __exit__(self, exception, value, tb): |
|
self.busy = False |
|
time.sleep(self.delay) |
|
if exception is not None: |
|
return False |
|
|
|
|
|
def download_cect_data(bundle_root: str = "."): |
|
base_url = "https://cloud-api.yandex.net/v1/disk/public/resources/download?" |
|
public_key = "https://disk.yandex.ru/d/pWEKt6D3qi3-aw" |
|
|
|
url = base_url + urlencode(dict(public_key=public_key)) |
|
response = urlopen(url) |
|
filepath = "AVUCTK_cases.zip" |
|
if not os.path.exists(os.path.join(bundle_root, filepath)): |
|
with urlopen(url) as response: |
|
code = response.getcode() |
|
if code == 200: |
|
download_url = json.loads(response.read())["href"] |
|
print("Downloading file...") |
|
with Spinner(): |
|
urlretrieve(download_url, filepath) |
|
else: |
|
raise RuntimeError( |
|
f"Download of file from {url} to {filepath} failed due to network issue or denied permission." |
|
) |
|
else: |
|
logging.info("zipfile exists, skipping download") |
|
with zipfile.ZipFile(os.path.join(bundle_root, filepath), "r") as zip_ref: |
|
zip_ref.extractall() |
|
|