"""API.""" import datetime from pathlib import Path import time import requests from src import config API_BASE_URL = 'https://api.ircamamplify.io' STORAGE_BASE_URL = 'https://storage.ircamamplify.io' class IrcamAPI: _id_token = None _id_token_expiration = None def get_id_token(self): """Get auth token (1 hour expiry).""" if self._id_token and self._id_token_expiration and datetime.datetime.now() < self._id_token_expiration: return self._id_token response = requests.post( f'{API_BASE_URL}/oauth/token', json={ 'client_id': config.IRCAM_CLIENT_ID, 'client_secret': config.IRCAM_CLIENT_SECRET, 'grant_type': 'client_credentials' } ) print('DURATION /oauth/token:', response.elapsed.total_seconds()) if response.status_code != 200: raise Exception('Failed to fetch token', response.text) res = response.json() self._id_token = res['id_token'] self._id_token_expiration = datetime.datetime.now() + datetime.timedelta(hours=1) return self._id_token def _get_headers(self): """Get request headers.""" return { 'Content-Type': 'application/json', 'Accept': 'application/json', 'Authorization': f'Bearer {self.get_id_token()}' } def create_storage_file_id(self): """Create storage.""" response = requests.post( f'{STORAGE_BASE_URL}/manager/', headers=self._get_headers()) print('DURATION /manager/:', response.elapsed.total_seconds()) if response.status_code != 200: raise Exception('Failed to fetch token', response.text) res = response.json() return res['id'] def upload_media(self, file_id, filepath): """Upload media.""" filename = Path(filepath).name put_url = f"{STORAGE_BASE_URL}/{file_id}/{filename}" response = requests.put( put_url, data=open(filepath, 'rb'), headers=self._get_headers()) print('DURATION //:', response.elapsed.total_seconds()) def get_ias_id_from_file_id(self, file_id): """Get ias ID from file ID.""" response = requests.get( f'{STORAGE_BASE_URL}/manager/{file_id}', headers=self._get_headers()) print('DURATION /manager/:', response.elapsed.total_seconds()) res = response.json() return res['ias'] def create_ai_detector_job_id(self, ias_ids): """Create a job to detect AI for an ias ID. Can handle up to 20 ias IDs.""" response = requests.post( f'{API_BASE_URL}/aidetector/', json={'audioUrlList': ias_ids}, headers=self._get_headers()) print('DURATION /aidetector/:', response.elapsed.total_seconds()) res = response.json() return res['id'] def get_job_status_by_id(self, job_id): """Get job status by id.""" attempt_number = 0 start = time.perf_counter() while True: attempt_number += 1 response = requests.get( f'{API_BASE_URL}/aidetector/{job_id}', headers=self._get_headers()) print('DURATION /aidetector/:', response.elapsed.total_seconds(), 'ATTEMPT ', attempt_number) res = response.json() if res['job_infos']['job_status'] == 'error': request_time = time.perf_counter() - start print('TOTAL DURATION {0:.0f} seconds'.format(request_time)) raise Exception('Error in job', res) elif res['job_infos']['job_status'] == 'success': request_time = time.perf_counter() - start print('TOTAL DURATION {0:.0f} seconds'.format(request_time)) return res time.sleep(4) def get_report(self, job_id): result = self.get_job_status_by_id(job_id) return result['job_infos']['report_info']['report'] def quality_check(self, ias_id): response = requests.post( f'{API_BASE_URL}/qualitycheck/', json={"audioUrl": ias_id}, headers=self._get_headers() ) print('DURATION /qualitycheck:', response.elapsed.total_seconds()) return response.json() def get_quality_check(self, quality_check_id): response = requests.get( f'{API_BASE_URL}/qualitycheck/{quality_check_id}', headers=self._get_headers() ) print('DURATION /qualitycheck/:', response.elapsed.total_seconds()) return response.json()