Skip to content

Commit 9884643

Browse files
committed
only useful methods
1 parent 59f1f3b commit 9884643

File tree

5 files changed

+111
-140
lines changed

5 files changed

+111
-140
lines changed

audiostack/content/file.py

Lines changed: 76 additions & 113 deletions
Original file line numberDiff line numberDiff line change
@@ -14,30 +14,34 @@ class File:
1414
FAMILY = "v3"
1515
interface = RequestInterface(family=FAMILY)
1616

17-
class Item(APIResponseItem):
17+
class Item:
1818
def __init__(self, response: dict) -> None:
19-
super().__init__(response)
20-
self.file_id = response["fileId"]
21-
self.file_name = response["fileName"]
22-
self.folder_id = response["folderId"]
23-
self.content_type = response["mimeType"]
19+
self.file_id: str = response["fileId"]
20+
self.file_name: str = response["fileName"]
21+
self.url: str = response.get("url", "")
22+
self.created_by: str = response.get("createdBy", "")
23+
self.last_modified: str = response.get("lastModified", "")
24+
self.file_type: dict = response.get("fileType", {})
25+
self.file_category: Optional[str] = response.get("fileCategory", None)
26+
self.size: str = str(response.get("size", ""))
27+
self.created_at: str = response.get("createdAt", "")
28+
self.status: str = response.get("status", "")
29+
self.duration: Optional[str] = response.get("duration", None)
2430

2531
def download(self, fileName: str, path: str = "./") -> None:
26-
if not fileName:
27-
raise Exception("Please supply a valid file name")
2832
if not self.url:
29-
raise Exception("No URL found for this file")
30-
RequestInterface.download_url(self.url, destination=path, name=fileName)
33+
raise Exception(
34+
"No URL found for this file. Please check the file has been processed."
35+
)
36+
RequestInterface.download_url(url=self.url, destination=path, name=fileName)
3137

32-
class List(APIResponseList):
33-
def __init__(self, response: dict, list_type: str) -> None:
34-
super().__init__(response, list_type)
35-
36-
def resolve_item(self, list_type: str, item: Any) -> "File.Item":
37-
if list_type == "items" or list_type == "files":
38-
return File.Item({"data": item})
39-
else:
40-
raise Exception()
38+
@staticmethod
39+
def get(file_id: str) -> Item:
40+
r = File.interface.send_request(
41+
rtype=RequestTypes.GET,
42+
route=f"file/{file_id}",
43+
)
44+
return File.Item(response=r)
4145

4246
@staticmethod
4347
def create(
@@ -61,140 +65,99 @@ def create(
6165
}
6266

6367
if category:
64-
payload["categoryId"] = File.get_category_id_by_name(category)
68+
payload["categoryId"] = File.get_category_id_by_name(name=category)
6569

6670
r = File.interface.send_request(
6771
rtype=RequestTypes.POST,
6872
route="file/create-upload-url",
6973
json=payload,
7074
)
71-
File.interface.send_upload_request(local_path=local_path, upload_url=r["uploadUrl"], mime_type=r["mimeType"])
72-
return File.Item(r)
73-
74-
@staticmethod
75-
def modify(
76-
file_id: str,
77-
file_name: str,
78-
category: str = "",
79-
) -> Item:
80-
category_id = File.get_category_id_by_name(category)
81-
payload = {
82-
"fileName": file_name,
83-
"categoryId": category_id,
84-
}
85-
r = File.interface.send_request(
86-
rtype=RequestTypes.PATCH,
87-
route=f"file/{file_id}",
88-
json=payload,
75+
File.interface.send_upload_request(
76+
local_path=local_path, upload_url=r["uploadUrl"], mime_type=r["mimeType"]
8977
)
90-
return File.Item(r)
9178

92-
@staticmethod
93-
def get(file_id: str) -> Item:
94-
r = File.interface.send_request(
95-
rtype=RequestTypes.GET,
96-
route=f"file/{file_id}",
97-
)
98-
return File.Item(r)
79+
start = time.time()
80+
81+
file = File.get(file_id=r["fileId"])
82+
83+
while file.status != "uploaded" or time.time() - start >= TIMEOUT_THRESHOLD_S:
84+
print("Response in progress please wait...")
85+
file = File.get(file_id=r["fileId"])
86+
87+
if file.status != "uploaded":
88+
raise Exception("File upload failed")
89+
90+
return file
9991

10092
@staticmethod
101-
def delete(file_id: str, folder_id: str) -> APIResponseItem:
102-
# Needs more thought
103-
r = File.interface.send_request(
93+
def delete(file_id: str, folder_id: str = "") -> None:
94+
if not folder_id:
95+
folder_id = Folder.get_root_folder_id()
96+
97+
File.interface.send_request(
10498
rtype=RequestTypes.DELETE,
10599
route=f"file/{file_id}/{folder_id}",
106100
)
107-
return APIResponseItem(r)
108-
109-
@staticmethod
110-
def get_file_categories() -> APIResponseItem:
111-
r = File.interface.send_request(
112-
rtype=RequestTypes.GET,
113-
route="file/metadata/file-categories",
114-
)
115-
return APIResponseItem(r)
116-
117-
@staticmethod
118-
def get_category_id_by_name(name: str) -> Optional[UUID]:
119-
category_id = None
120-
categories = [
121-
{"category_id": y["categoryId"], "name": y["name"]}
122-
for x in File.get_file_categories().data["fileTypes"]
123-
for y in x["fileCategories"]
124-
]
125-
category_id = next(filter(lambda x: x["name"] == name, categories), None)
126-
return category_id
127101

128102

129103
class Folder:
130104
FAMILY = "v3"
131105
interface = RequestInterface(family=FAMILY)
132106

133-
class Item(APIResponseItem):
107+
class Item:
134108
def __init__(self, response: dict) -> None:
135-
super().__init__(response)
136-
self.folders = Folder.List(response["folders"], list_type="folders")
137-
self.files = File.List(response["files"], list_type="files")
138-
self.current_path_chain = response["currentPathChain"]
139-
140-
class List(APIResponseList):
141-
def __init__(self, response: dict, list_type: str) -> None:
142-
super().__init__(response, list_type)
143-
144-
def resolve_item(self, list_type: str, item: Any) -> dict:
145-
if list_type == "folders":
146-
return {"data": item}
147-
else:
148-
raise Exception()
109+
self.folder_id: str = response["folderId"]
110+
self.folder_name: str = response["folderName"]
111+
self.parent_folder_id: str = response.get("parentFolderId", "")
112+
self.created_by: str = response.get("createdBy", "")
113+
self.last_modified: Optional[str] = response.get("lastModified", None)
114+
self.created_at: str = response.get("createdAt", "")
115+
116+
class ListResponse:
117+
def __init__(self, response: dict) -> None:
118+
self.folders: list[Folder.Item] = [
119+
Folder.Item(response=x) for x in response["folders"]
120+
]
121+
self.files: list[File.Item] = [
122+
File.Item(response=x) for x in response["files"]
123+
]
124+
self.current_path_chain: dict = response["currentPathChain"]
149125

150126
@staticmethod
151-
def get_root() -> Item:
152-
r = Folder.interface.send_request(
127+
def get_root_folder_id() -> str:
128+
root_folder_id = Folder.interface.send_request(
153129
rtype=RequestTypes.GET,
154130
route="folder",
155-
)
156-
return Folder.Item(r)
131+
)["currentPathChain"][0]["folderId"]
132+
return root_folder_id
157133

158134
@staticmethod
159-
def create(name: str, parent_folder_id: Optional[UUID] = None) -> APIResponseItem:
160-
folder = {
135+
def create(name: str, parent_folder_id: Optional[UUID] = None) -> "Folder.Item":
136+
payload = {
161137
"folderName": name,
162-
"parentFolderId": parent_folder_id,
163138
}
139+
140+
if parent_folder_id:
141+
payload["parentFolderId"] = str(parent_folder_id)
142+
164143
r = Folder.interface.send_request(
165144
rtype=RequestTypes.POST,
166145
route="folder",
167-
json=folder,
146+
json=payload,
168147
)
169-
return APIResponseItem(r)
148+
return Folder.Item(response=r)
170149

171150
@staticmethod
172-
def get(folder_id: UUID) -> APIResponseItem:
151+
def get(folder_id: UUID) -> "Folder.Item":
173152
r = Folder.interface.send_request(
174153
rtype=RequestTypes.GET,
175154
route=f"folder/{folder_id}",
176155
)
177-
return APIResponseItem(r)
156+
return Folder.Item(response=r["currentPathChain"][0])
178157

179158
@staticmethod
180-
def modify(
181-
folder_id: UUID,
182-
name: str,
183-
) -> APIResponseItem:
184-
folder = {
185-
"folderName": name,
186-
}
187-
r = Folder.interface.send_request(
188-
rtype=RequestTypes.PATCH,
189-
route=f"folder/{folder_id}",
190-
json=folder,
191-
)
192-
return APIResponseItem(r)
193-
194-
@staticmethod
195-
def delete(folder_id: UUID) -> APIResponseItem:
196-
r = File.interface.send_request(
159+
def delete(folder_id: UUID) -> None:
160+
File.interface.send_request(
197161
rtype=RequestTypes.DELETE,
198162
route=f"folder/{folder_id}",
199163
)
200-
return APIResponseItem(r)

audiostack/helpers/request_interface.py

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -65,11 +65,14 @@ def resolve_response(self, r: Any) -> dict:
6565
raise Exception(exc)
6666

6767
if r.status_code >= 400:
68-
msg = (
69-
r.json()["message"]
70-
+ ". Errors listed as follows: \n\t"
71-
+ "\t".join(r.json()["errors"])
72-
)
68+
if "message" in r.json():
69+
msg = (
70+
r.json()["message"]
71+
+ ". Errors listed as follows: \n\t"
72+
+ "\t".join(r.json()["errors"])
73+
)
74+
else:
75+
msg = r.json()
7376
raise Exception(msg)
7477

7578
if "meta" in r.json():
@@ -78,16 +81,18 @@ def resolve_response(self, r: Any) -> dict:
7881

7982
return {**r.json(), **{"statusCode": r.status_code}}
8083

81-
def send_upload_request(self, local_path: str, upload_url: str, mime_type: str) -> int:
84+
def send_upload_request(
85+
self, local_path: str, upload_url: str, mime_type: str
86+
) -> int:
8287
with open(local_path, "rb") as data:
83-
r = requests.put(url=upload_url, data=data, headers={"Content-Type": mime_type})
84-
print("Upload response:", r.text)
88+
r = requests.put(
89+
url=upload_url, data=data, headers={"Content-Type": mime_type}
90+
)
8591
if r.status_code >= 400:
8692
raise Exception("Failed to upload file")
8793

8894
return r.status_code
8995

90-
9196
def send_request(
9297
self,
9398
rtype: str,

audiostack/speech/tts.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ class TTS:
1313

1414
class Item(APIResponseItem):
1515
def __init__(self, response: dict) -> None:
16-
super().__init__(response)
16+
super().__init__(response=response)
1717
self.speechId = self.data["speechId"]
1818

1919
def download(
Lines changed: 4 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
import os
22

3-
import pytest
4-
53
import audiostack
6-
from audiostack.content.file import File, Folder
4+
from audiostack.content.file import File
75

86
audiostack.api_base = os.environ.get("AUDIO_STACK_DEV_URL", "https://v2.api.audio")
97
audiostack.api_key = os.environ["AUDIO_STACK_DEV_KEY"] # type: ignore
@@ -12,26 +10,17 @@
1210

1311

1412
def test_create() -> None:
15-
r = File.create(local_path="example.mp3", file_name="test")
13+
r = File.create(local_path="example.mp3", file_name="test.mp3")
1614
test_constants["fileId"] = r.file_id
1715
test_constants["fileName"] = r.file_name
1816
print(r)
1917

2018

2119
def test_get() -> None:
22-
r = File.get(test_constants["fileId"])
23-
print(r)
24-
25-
26-
def test_modify() -> None:
27-
r = File.modify(
28-
file_id=test_constants["fileId"], file_name=test_constants["fileName"]
29-
)
20+
r = File.get(file_id=test_constants["fileId"])
3021
print(r)
3122

3223

3324
def test_delete() -> None:
34-
r = File.delete(
35-
test_constants["fileId"], Folder.get_root().current_path_chain["folderId"]
36-
)
25+
r = File.delete(file_id=test_constants["fileId"])
3726
print(r)

audiostack/tests/content/test_folder.py

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1+
# TODO: User proper pytest fixtures
12
import os
3+
import random
4+
import string
25

36
import audiostack
47
from audiostack.content.file import Folder
@@ -9,9 +12,20 @@
912
test_constants: dict = {} #
1013

1114

15+
def create_test_folder_name() -> str:
16+
return "__PYTHON_TEST_" + "".join(
17+
random.choice(string.ascii_letters) for _ in range(10)
18+
)
19+
20+
1221
def test_create() -> None:
13-
r = Folder.create(name="__PYTHON_TEST")
14-
test_constants["folder_id"] = r.data["folderId"]
22+
r = Folder.create(name=create_test_folder_name())
23+
test_constants["folder_id"] = r.folder_id
24+
print(r)
25+
26+
27+
def test_get() -> None:
28+
r = Folder.get(folder_id=test_constants["folder_id"])
1529
print(r)
1630

1731

0 commit comments

Comments
 (0)