Spaces:
Runtime error
Runtime error
| import os | |
| import requests | |
| import json | |
| import time | |
| from qiniu import put_file | |
| import tempfile | |
| import shutil | |
| import random | |
| API_KEY = os.environ['API_KEY'] | |
| headers = { | |
| "User-Agent": "PexelDance Sdk/1.0", | |
| 'Authorization': 'Bearer %s' % API_KEY, | |
| 'Content-Type': 'application/json' | |
| } | |
| def get_endpoint(): | |
| hosts = [ | |
| "https://api-01.pexeldance.com", | |
| "https://api-02.pexeldance.com", | |
| "https://api-03.pexeldance.com", | |
| "https://api-04.pexeldance.com", | |
| "https://api-05.pexeldance.com", | |
| "https://api-06.pexeldance.com", | |
| "https://api-07.pexeldance.com", | |
| "https://api-08.pexeldance.com", | |
| "https://api-09.pexeldance.com", | |
| "https://api-10.pexeldance.com", | |
| # "https://api-11.pexeldance.com", | |
| # "https://api-12.pexeldance.com", | |
| # "https://api-13.pexeldance.com", | |
| # "https://api-14.pexeldance.com", | |
| # "https://api-15.pexeldance.com", | |
| # "https://api-16.pexeldance.com", | |
| # "https://api-17.pexeldance.com", | |
| # "https://api-18.pexeldance.com", | |
| # "https://api-19.pexeldance.com", | |
| # "https://api-20.pexeldance.com", | |
| ] | |
| return random.choice(hosts) | |
| def get_upload_token(extension="mp4"): | |
| endpoint = get_endpoint() | |
| url = endpoint + "/api/upload/token" | |
| payload = json.dumps({ | |
| "file_ext": extension, | |
| }) | |
| response = requests.request("POST", url, headers=headers, data=bytes(payload, "utf-8")) | |
| if 200<= response.status_code < 300: | |
| return response.json() | |
| return None | |
| def upload_file(local_file, file_key, token): | |
| ret, info = put_file(token, file_key, local_file) | |
| if info.status_code == 200: | |
| return ret | |
| else: | |
| return None | |
| def confirm_upload(key, name, hash_, fsize, bucket): | |
| endpoint = get_endpoint() | |
| url = endpoint + "/api/upload/confirm" | |
| payload = json.dumps({ | |
| "key": key, | |
| "name": name, | |
| "hash": hash_, | |
| "fsize": fsize, | |
| "bucket": bucket, | |
| }) | |
| response = requests.request("POST", url, headers=headers, data=payload) | |
| if 200<= response.status_code < 300: | |
| return response.json() | |
| return None | |
| def upload_video(file): | |
| ext = file.split(".")[-1] | |
| if not os.path.exists(file): | |
| return False | |
| token_res = get_upload_token(ext) | |
| upload_data = token_res.get('data') | |
| if not upload_data: | |
| return False | |
| upload_token = upload_data.get('token') | |
| if not upload_token: | |
| return False | |
| bucket_key = upload_data.get('bucket_key') | |
| if not bucket_key: | |
| return False | |
| ret = upload_file(file, bucket_key, upload_token) | |
| if not ret: | |
| return False | |
| key, name, hash_, fsize, bucket = ret.get('key'), upload_data.get('c_string'), ret.get('hash'), ret.get('fsize'), ret.get('bucket') | |
| upload_res = confirm_upload(key, name, hash_, fsize, bucket) | |
| if not upload_res: | |
| return False | |
| return upload_res.get('data') | |
| def generate(item_id, style_id, width, height, prompt): | |
| endpoint = get_endpoint() | |
| url = endpoint + "/api/job/common" | |
| payload = json.dumps({ | |
| "user_content": { | |
| "item_id": item_id, | |
| "seed": 11111, | |
| "width": width, | |
| "height": height, | |
| "prompt": prompt | |
| }, | |
| "unit": 3, | |
| "use_credit_type": "credit", | |
| "name": style_id | |
| }) | |
| response = requests.request("POST", url, headers=headers, data=payload) | |
| if 200<= response.status_code < 300: | |
| return response.json() | |
| else: | |
| return None | |
| def get_job_status(job_id): | |
| endpoint = get_endpoint() | |
| url = endpoint + "/api/job" | |
| payload = json.dumps({ | |
| "id": job_id | |
| }) | |
| response = requests.request("GET", url, headers=headers, data=payload) | |
| if 200<= response.status_code < 300: | |
| return response.json() | |
| return None | |
| def get_item_url(_id): | |
| endpoint = get_endpoint() | |
| url = endpoint + "/api/download_item" | |
| payload = json.dumps({ | |
| "key_id": [ | |
| _id | |
| ] | |
| }) | |
| response = requests.request("POST", url, headers=headers, data=payload) | |
| if 200<= response.status_code < 300: | |
| return response.json() | |
| return None | |
| def get_result(job_id): | |
| endpoint = get_endpoint() | |
| url = endpoint + "/api/item/job_id" | |
| payload = json.dumps({ | |
| "job_id": job_id | |
| }) | |
| response = requests.request("GET", url, headers=headers, data=payload) | |
| if 200<= response.status_code < 300: | |
| return response.json() | |
| return None | |
| def download_file(url): | |
| response = requests.get(url, stream=True) | |
| if response.status_code == 200: | |
| tmpfile = tempfile.NamedTemporaryFile(delete=False) | |
| tmpfile.close() | |
| with open(tmpfile.name, 'wb') as f: | |
| shutil.copyfileobj(response.raw, f) | |
| return tmpfile.name | |
| else: | |
| return None | |
| def processing(in_video, width, height, style_id,transfer_duration, prompt): | |
| videoRes = upload_video(in_video) | |
| if not videoRes: | |
| return None | |
| videoId = videoRes.get('id') | |
| if not videoId: | |
| return None | |
| req_access = False | |
| try_times = 1000 | |
| for i in range(try_times): | |
| generate_result = generate(videoId, style_id, width, height, prompt) | |
| if not generate_result: | |
| time.sleep(8) | |
| continue | |
| jobInfo = generate_result.get('data') | |
| if not jobInfo: | |
| time.sleep(8) | |
| continue | |
| job_id = jobInfo.get("job_id") | |
| if job_id: | |
| req_access = True | |
| break | |
| if not req_access: | |
| raise "too many requests" | |
| while True: | |
| jobStatusInfo = get_job_status(job_id) | |
| js = jobStatusInfo.get('data') | |
| if js is None: | |
| return None | |
| if js.get('status') == "finished": | |
| break | |
| elif js.get('status') == "failed": | |
| return None | |
| time.sleep(10) | |
| result = get_result(job_id) | |
| if not result: | |
| return None | |
| res_data = result.get('data') | |
| if not res_data: | |
| return None | |
| li = res_data.get('list') | |
| if len(li) == 0: | |
| return None | |
| jobRes = li[0] | |
| item_id = jobRes.get('id') | |
| if not item_id: | |
| return None | |
| itemDes = get_item_url(item_id) | |
| itemData = itemDes.get('data') | |
| if not itemData: | |
| return None | |
| signed_urls = itemData.get('signed_urls') | |
| if len(signed_urls) == 0: | |
| return None | |
| item_url = signed_urls[0] | |
| file_path = download_file(item_url) | |
| if not file_path: | |
| return None | |
| return file_path | |