Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,14 @@ Get all speeches
otter.get_speeches()
```

Get all speeches in a folder

**optional parameters**: page_size, last_load_speech_id

```python
otter.list_folder_speeches(folder_id=FOLDER_ID)
```

Get speech by id

```python
Expand Down Expand Up @@ -79,6 +87,14 @@ Download a speech
otter.download_speech(SPEECH_ID, FILE_NAME)
```

Stream a speech

**optional parameters**: format (default: mp4)

```python
otter.stream_speech(SPEECH_ID)
```

Move a speech to trash

```python
Expand Down
44 changes: 43 additions & 1 deletion otterai/otterai.py
Original file line number Diff line number Diff line change
Expand Up @@ -164,6 +164,23 @@ def upload_speech(self, file_name, content_type='audio/mp4'):

return self._handle_response(response)

def stream_speech(self, speech_id, fileformat="mp3"):
# API URL
download_speech_url = OtterAI.API_BASE_URL + 'bulk_export'
if self._is_userid_invalid():
raise OtterAIException('userid is invalid')
# Query Params
payload = {'userid': self._userid}
# POST
data = {'formats': fileformat, "speech_otid_list": [speech_id]}
headers = {'x-csrftoken': self._cookies['csrftoken'], "referer": "https://otter.ai/"}

with self._session.post(download_speech_url, params=payload, headers=headers, data=data, stream=True) as response:
if response.ok:
return response.content # Return the entire content
else:
raise OtterAIException(f"Got response status {response.status_code} when attempting to stream {speech_id}")

def download_speech(self, speech_id, name=None, fileformat="txt,pdf,mp3,docx,srt"):
# API URL
download_speech_url = OtterAI.API_BASE_URL + 'bulk_export'
Expand Down Expand Up @@ -193,7 +210,10 @@ def move_to_trash_bin(self, speech_id):
payload = {'userid': self._userid}
# POST
data = {'otid': speech_id}
headers = {'x-csrftoken': self._cookies['csrftoken']}
headers = {
'x-csrftoken': self._cookies['csrftoken'],
'Referer': 'https://otter.ai/'
}
response = self._session.post(move_to_trash_bin_url, params=payload, headers=headers, data=data)

return self._handle_response(response)
Expand Down Expand Up @@ -254,3 +274,25 @@ def speech_start(self):
def stop_speech(self):
# API URL
speech_finish_url = OtterAI.API_BASE_URL + 'speech_finish'

def list_folder_speeches(self, folder_id, page_size=45, last_load_speech_id=None, modified_after=None, speech_metadata=True):
# API URL
list_folder_speeches_url = OtterAI.API_BASE_URL + 'list_folder_speeches'
if self._is_userid_invalid():
raise OtterAIException('userid is invalid')
# Query Parameters
payload = {
'userid': self._userid,
'folder_id': folder_id,
'speech_metadata': speech_metadata,
'page_size': page_size,
}

if last_load_speech_id:
payload['last_load_speech_id'] = last_load_speech_id
if modified_after:
payload['modified_after'] = modified_after
# GET
response = self._session.get(list_folder_speeches_url, params=payload)

return self._handle_response(response)