forked from LiveCarta/BookConverter
163 lines
5.0 KiB
Python
163 lines
5.0 KiB
Python
import json
|
|
import os
|
|
import time
|
|
import requests
|
|
from threading import Event
|
|
|
|
|
|
class Access:
|
|
PENDING = 1
|
|
PROCESS = 2
|
|
GENERATE = 3
|
|
FINISH = 4
|
|
ERROR = 5
|
|
|
|
url = None
|
|
username = None
|
|
password = None
|
|
|
|
token = None
|
|
refresh = None
|
|
refresh_time = None
|
|
headers = None
|
|
|
|
refreshing = Event()
|
|
|
|
def __init__(self):
|
|
self.read_credentials()
|
|
self.get_token()
|
|
self.refreshing.set()
|
|
|
|
def read_credentials(self):
|
|
folder_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
|
config_path = os.path.join(folder_path, "config/api_config.json")
|
|
with open(config_path, "r") as f:
|
|
params = json.load(f)
|
|
|
|
self.refreshing.clear()
|
|
self.url = params['url']
|
|
self.username = params['username']
|
|
self.password = params['password']
|
|
self.refreshing.set()
|
|
|
|
def format_header(self):
|
|
self.headers = {
|
|
'Authorization': f'Bearer {self.token}'
|
|
}
|
|
|
|
def is_time_for_refreshing(self):
|
|
return self.refresh_time < time.time()
|
|
|
|
def get_token(self):
|
|
json_form = {
|
|
'grantType': 'password',
|
|
'username': self.username,
|
|
'password': self.password
|
|
}
|
|
response = requests.post(f'{self.url}/token', json=json_form)
|
|
|
|
if response.status_code == 400:
|
|
raise Exception('400 Bad request: invalid login and/or password.')
|
|
elif response.status_code == 200:
|
|
self.refreshing.clear()
|
|
self.token = response.json()['accessToken']
|
|
self.refresh = response.json()['refreshToken']
|
|
self.refresh_time = response.json()['expiresIn']
|
|
self.format_header()
|
|
self.refreshing.set()
|
|
else:
|
|
raise Exception(f'{response.status_code}')
|
|
|
|
def refresh_token(self):
|
|
json_form = {
|
|
'grantType': 'refresh_token',
|
|
'refreshToken': self.refresh
|
|
}
|
|
response = requests.post(f'{self.url}/token', json=json_form)
|
|
|
|
if response.status_code == 400:
|
|
raise Exception('400 Bad request: wrong request parameters for refreshing.')
|
|
elif response.status_code == 401:
|
|
self.get_token()
|
|
elif response.status_code == 200:
|
|
self.refreshing.clear()
|
|
self.token = response.json()['accessToken']
|
|
self.refresh = response.json()['refreshToken']
|
|
self.refresh_time = response.json()['expiresIn']
|
|
self.format_header()
|
|
self.refreshing.set()
|
|
else:
|
|
raise Exception(f'{response.status_code}')
|
|
|
|
def get_doc(self, doc_id):
|
|
if self.is_time_for_refreshing():
|
|
self.refresh_token()
|
|
|
|
self.refreshing.wait()
|
|
response = requests.get(f'{self.url}/doc-convert/{doc_id}/file', headers=self.headers)
|
|
|
|
if response.status_code == 404:
|
|
raise FileNotFoundError('404 Not Found: file have not found.')
|
|
elif response.status_code == 200:
|
|
content = response.content
|
|
else:
|
|
raise Exception(f'{response.status_code}')
|
|
|
|
return content
|
|
|
|
def send_image(self, img, doc_id):
|
|
if self.is_time_for_refreshing():
|
|
self.refresh_token()
|
|
|
|
self.refreshing.wait()
|
|
|
|
with open(img, 'rb') as img_file:
|
|
files = {
|
|
'image': (os.path.basename(img), img_file)
|
|
}
|
|
response = requests.post(f'{self.url}/doc-convert/image', files=files, headers=self.headers)
|
|
|
|
if response.status_code == 400:
|
|
self.update_status(doc_id, self.ERROR)
|
|
raise Exception(f'400 Bad request: {response.json()["message"]}.')
|
|
elif response.status_code == 200:
|
|
img_url = response.json()['imageUrl']
|
|
else:
|
|
self.update_status(doc_id, self.ERROR)
|
|
raise Exception(f'{response.status_code}')
|
|
|
|
return img_url
|
|
|
|
def send_book(self, doc_id, content):
|
|
if self.is_time_for_refreshing():
|
|
self.refresh_token()
|
|
|
|
self.refreshing.wait()
|
|
json_content = {
|
|
'json': json.dumps(content)
|
|
}
|
|
response = requests.post(f'{self.url}/doc-convert/{doc_id}/import', json=json_content, headers=self.headers)
|
|
|
|
if response.status_code == 400:
|
|
self.update_status(doc_id, self.ERROR)
|
|
raise Exception(f'400 Bad request')
|
|
elif response.status_code == 200:
|
|
pass
|
|
else:
|
|
self.update_status(doc_id, self.ERROR)
|
|
raise Exception(f'{response.status_code}')
|
|
|
|
def update_status(self, doc_id, status):
|
|
if self.is_time_for_refreshing():
|
|
self.refresh_token()
|
|
|
|
self.refreshing.wait()
|
|
response = requests.patch(f'{self.url}/doc-convert/{doc_id}/status/{status}', headers=self.headers)
|
|
|
|
if response.status_code == 400:
|
|
raise Exception(f'400 Bad request')
|
|
elif response.status_code == 200:
|
|
pass
|
|
else:
|
|
raise Exception(f'{response.status_code}')
|