File size: 2,219 Bytes
df9eb37 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 | import argparse
import json
import time
import urllib.error
import urllib.request
def request_json(url: str, method: str = "GET", payload: dict | None = None) -> dict:
body = None
headers = {}
if payload is not None:
body = json.dumps(payload).encode("utf-8")
headers["Content-Type"] = "application/json"
request = urllib.request.Request(url, data=body, headers=headers, method=method)
try:
with urllib.request.urlopen(request, timeout=30) as response:
return json.loads(response.read().decode("utf-8"))
except urllib.error.HTTPError as exc:
detail = exc.read().decode("utf-8")
raise RuntimeError(f"{exc.code}: {detail}") from exc
def main() -> None:
parser = argparse.ArgumentParser(description="Run an AI Clip Studio API benchmark.")
parser.add_argument("--api", default="http://localhost:8000")
parser.add_argument("--youtube-url", required=True)
parser.add_argument("--language", default="Thai")
parser.add_argument("--style", default="informative")
parser.add_argument("--niche", default="education")
parser.add_argument("--clip-length", type=int, default=60)
args = parser.parse_args()
payload = {
"youtube_url": args.youtube_url,
"profile": {
"niche": args.niche,
"clip_style": args.style,
"clip_length_seconds": args.clip_length,
"primary_language": args.language,
"target_platform": "tiktok",
},
}
started = time.perf_counter()
job = request_json(f"{args.api}/api/jobs/youtube", "POST", payload)
while job["status"] in {"queued", "running"}:
time.sleep(2)
job = request_json(f"{args.api}/api/jobs/{job['id']}")
elapsed = round(time.perf_counter() - started, 3)
print(
json.dumps(
{
"job_id": job["id"],
"status": job["status"],
"elapsed_wall_seconds": elapsed,
"clips": len(job.get("clips", [])),
"timings": job.get("timings", {}),
"error": job.get("error"),
},
indent=2,
)
)
if __name__ == "__main__":
main()
|