most-client 1.0.15__tar.gz → 1.0.17__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: most-client
3
- Version: 1.0.15
3
+ Version: 1.0.17
4
4
  Summary: Most AI API for https://the-most.ai
5
5
  Home-page: https://github.com/the-most-ai/most-client
6
6
  Author: George Kasparyants
@@ -26,6 +26,7 @@ Requires-Dist: pytest
26
26
  Requires-Dist: tox
27
27
  Requires-Dist: twine
28
28
  Requires-Dist: httpx
29
+ Requires-Dist: pydub
29
30
  Dynamic: author
30
31
  Dynamic: author-email
31
32
  Dynamic: classifier
@@ -1,9 +1,24 @@
1
- from typing import List, Dict
1
+ import io
2
+ import os
3
+ import uuid
4
+ from pathlib import Path
5
+ from typing import Dict, List, Optional
6
+
2
7
  import json5
3
8
  import requests
4
9
  from adaptix import Retort
5
- from most.types import Audio, Result, Script, JobStatus, Text, StoredAudioData, is_valid_id, DialogResult
6
- from pathlib import Path
10
+ from pydub import AudioSegment
11
+
12
+ from most.types import (
13
+ Audio,
14
+ DialogResult,
15
+ JobStatus,
16
+ Result,
17
+ Script,
18
+ StoredAudioData,
19
+ Text,
20
+ is_valid_id,
21
+ )
7
22
 
8
23
 
9
24
  class MostClient(object):
@@ -131,6 +146,17 @@ class MostClient(object):
131
146
  files={"audio_file": f})
132
147
  return self.retort.load(resp.json(), Audio)
133
148
 
149
+ def upload_audio_segment(self, audio: AudioSegment,
150
+ audio_name: Optional[str] = None) -> Audio:
151
+ f = io.BytesIO()
152
+ audio.export(f, format="mp3")
153
+ f.seek(0)
154
+ if audio_name is None:
155
+ audio_name = uuid.uuid4().hex + ".mp3"
156
+ resp = self.post(f"https://api.the-most.ai/api/external/{self.client_id}/upload",
157
+ files={"audio_file": (audio_name, f, 'audio/mp3')})
158
+ return self.retort.load(resp.json(), Audio)
159
+
134
160
  def upload_audio_url(self, audio_url) -> Audio:
135
161
  resp = self.post(f"https://api.the-most.ai/api/external/{self.client_id}/upload_url",
136
162
  json={"audio_url": audio_url})
@@ -248,3 +274,18 @@ class MostClient(object):
248
274
 
249
275
  def __repr__(self):
250
276
  return "<MostClient(model_id='%s')>" % (self.model_id, )
277
+
278
+ def get_audio_segment_by_url(self, audio_url,
279
+ format=None):
280
+ if format is None:
281
+ format = os.path.splitext(audio_url)[1]
282
+ format = format.strip().lower()
283
+
284
+ resp = self.session.get(audio_url,
285
+ timeout=None)
286
+ if resp.status_code >= 400:
287
+ raise RuntimeError("Audio url is not accessable")
288
+
289
+ audio = AudioSegment.from_file(io.BytesIO(resp.content),
290
+ format=format)
291
+ return audio
@@ -1,9 +1,24 @@
1
- from typing import List, Dict
2
- import json5
3
- from adaptix import Retort
4
- from most.types import Audio, Result, Script, JobStatus, Text, StoredAudioData, is_valid_id, DialogResult
1
+ import io
2
+ import os
3
+ import uuid
5
4
  from pathlib import Path
5
+ from typing import Dict, List, Optional
6
+
6
7
  import httpx
8
+ import json5
9
+ from adaptix import Retort
10
+ from pydub import AudioSegment
11
+
12
+ from most.types import (
13
+ Audio,
14
+ DialogResult,
15
+ JobStatus,
16
+ Result,
17
+ Script,
18
+ StoredAudioData,
19
+ Text,
20
+ is_valid_id,
21
+ )
7
22
 
8
23
 
9
24
  class AsyncMostClient(object):
@@ -135,6 +150,17 @@ class AsyncMostClient(object):
135
150
  files={"audio_file": f})
136
151
  return self.retort.load(resp.json(), Audio)
137
152
 
153
+ async def upload_audio_segment(self, audio: AudioSegment,
154
+ audio_name: Optional[str] = None) -> Audio:
155
+ f = io.BytesIO()
156
+ audio.export(f, format="mp3")
157
+ f.seek(0)
158
+ if audio_name is None:
159
+ audio_name = uuid.uuid4().hex + ".mp3"
160
+ resp = await self.post(f"https://api.the-most.ai/api/external/{self.client_id}/upload",
161
+ files={"audio_file": (audio_name, f, 'audio/mp3')})
162
+ return self.retort.load(resp.json(), Audio)
163
+
138
164
  async def upload_text(self, text: str) -> Text:
139
165
  resp = await self.post(f"https://api.the-most.ai/api/external/{self.client_id}/upload_text",
140
166
  json={"text": text})
@@ -146,8 +172,8 @@ class AsyncMostClient(object):
146
172
  return self.retort.load(resp.json(), Audio)
147
173
 
148
174
  async def list_audios(self,
149
- offset: int = 0,
150
- limit: int = 10) -> List[Audio]:
175
+ offset: int = 0,
176
+ limit: int = 10) -> List[Audio]:
151
177
  resp = await self.get(f"https://api.the-most.ai/api/external/{self.client_id}/list?offset={offset}&limit={limit}")
152
178
  audio_list = resp.json()
153
179
  return self.retort.load(audio_list, List[Audio])
@@ -253,3 +279,18 @@ class AsyncMostClient(object):
253
279
 
254
280
  def __repr__(self):
255
281
  return "<AsyncMostClient(model_id='%s')>" % (self.model_id, )
282
+
283
+ async def get_audio_segment_by_url(self, audio_url,
284
+ format=None):
285
+ if format is None:
286
+ format = os.path.splitext(audio_url)[1]
287
+ format = format.strip().lower()
288
+
289
+ resp = await self.session.get(audio_url,
290
+ timeout=None)
291
+ if resp.status_code >= 400:
292
+ raise RuntimeError("Audio url is not accessable")
293
+
294
+ audio = AudioSegment.from_file(io.BytesIO(resp.content),
295
+ format=format)
296
+ return audio
@@ -1,7 +1,8 @@
1
1
  import re
2
2
  from dataclasses import dataclass
3
- from dataclasses_json import dataclass_json, DataClassJsonMixin
4
- from typing import Optional, List, Literal, Dict
3
+ from typing import Dict, List, Literal, Optional
4
+
5
+ from dataclasses_json import DataClassJsonMixin, dataclass_json
5
6
 
6
7
 
7
8
  @dataclass_json
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: most-client
3
- Version: 1.0.15
3
+ Version: 1.0.17
4
4
  Summary: Most AI API for https://the-most.ai
5
5
  Home-page: https://github.com/the-most-ai/most-client
6
6
  Author: George Kasparyants
@@ -26,6 +26,7 @@ Requires-Dist: pytest
26
26
  Requires-Dist: tox
27
27
  Requires-Dist: twine
28
28
  Requires-Dist: httpx
29
+ Requires-Dist: pydub
29
30
  Dynamic: author
30
31
  Dynamic: author-email
31
32
  Dynamic: classifier
@@ -12,3 +12,4 @@ pytest
12
12
  tox
13
13
  twine
14
14
  httpx
15
+ pydub
@@ -12,3 +12,4 @@ pytest
12
12
  tox
13
13
  twine
14
14
  httpx
15
+ pydub
@@ -8,7 +8,7 @@ with open('requirements.txt', 'r') as f:
8
8
 
9
9
  setup(
10
10
  name='most-client',
11
- version='1.0.15',
11
+ version='1.0.17',
12
12
  python_requires=f'>=3.6',
13
13
  description='Most AI API for https://the-most.ai',
14
14
  url='https://github.com/the-most-ai/most-client',
File without changes
File without changes
File without changes