File size: 3,810 Bytes
c77ba58
 
 
 
 
 
 
 
 
256d30e
 
 
 
 
 
c77ba58
 
 
 
 
 
 
 
 
4863324
c77ba58
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
256d30e
c77ba58
 
 
 
dc27b1e
c77ba58
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
256d30e
c77ba58
 
 
 
 
dc27b1e
c77ba58
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
import os
import sys
import uuid
import json
import requests
import traceback

sys.path.append(os.getcwd())

conf={
    "apiKey":os.environ.get("apiKey"), 
    "api":os.environ.get("api"), 
    "token": os.environ.get("token"), 
    "storage": os.environ.get("storage"),
}

def fetch(request, timeout=60000):
    try:
        with requests.Session() as session:
            response = session.post(
                conf["api"],
                headers={
                    'Content-Type': 'application/json',
                    'x-application-id': conf["apiKey"],
                    "x-access-token":conf["token"]
                },
                data=request if isinstance(request, str) else json.dumps(request),
                timeout=timeout / 1000
            )
            response.raise_for_status()

            # Parse JSON response
            response_data = response.json()

            if 'data' not in response_data:
                raise ValueError(response_data.get('message') or response_data.get('statusText') or 'Unknown error')

            if 'errors' in response_data:
                raise ValueError(response_data['errors'])

            return response_data['data']

    except requests.exceptions.Timeout:
        raise TimeoutError('Timeout from qili service')


def upload_bytes(bytes, key=None, ext=".wav"):
    try: 
        if key is None:
            key=f"_temp_/1/{str(uuid.uuid4())}{ext}"
        data = fetch({
            "query": '''
                query($key:String!){
                    file_upload_token(key:$key){
                        token
                        key
                    }
                }
            ''', 
            "variables": {
                "key": key
            }
        })
        data=data["file_upload_token"]
        files={"file":(os.path.basename(key), bytes)}
        response = requests.post(conf["storage"], files=files, data=data)
        if response.ok:
            data = response.json()
            return data.get("data", {}).get("file_create", {}).get("url")
        else:
            raise Exception(f"{conf['storage']}: {response.status_code} - {response.reason}, {response.text}")
    except Exception as e:
        traceback.print_exc()
        return str(e)


def upload(files, root_key=None):
    if not isinstance(files, list):
        shouldReturnString=True
        files = [files]
    
    if(root_key==None):
        root_key="_temp_/1/" + str(uuid.uuid4())
        
    try:
        keys, queries, variables = [], [], {}
        
        for i, file in enumerate(files):
            k = f"key{i}"
            keys.append(k)
            queries.append(f"""
                token{i}:file_upload_token(key:${k}){{
                    token
                    key
                }}
            """)
            variables[k] = f"{root_key}{os.path.basename(file)}"
        
        keys=','.join([f'${k}:String!' for k in keys])
        queries='\n'.join(queries)

        query = f"""query({ keys }){{ { queries } }}"""

        data = fetch({"query": query, "variables": variables})
        
        tokens = list(data.values())
        urls = []
        
        for i, file in enumerate(files):
            form = {"file": open(file, "rb")}
            response = requests.post(conf["storage"], files=form, data=tokens[i])
            
            if response.ok:
                data = response.json()
                urls.append(data.get("data", {}).get("file_create", {}).get("url"))
            else:
                raise Exception(f"{conf['storage']}: {response.status_code} - {response.reason}, {response.text}")
        
        if shouldReturnString:
            urls[0]
        return list(filter(None, urls))
    except Exception as e:
        traceback.print_exc()
        return str(e)