|
|
|
""" |
|
Client example for Manga OCR Translator API |
|
Demonstrates how to use the API with streaming responses |
|
""" |
|
|
|
import sys |
|
import requests |
|
import json |
|
import argparse |
|
import webbrowser |
|
from urllib.parse import urljoin |
|
from pprint import pprint |
|
|
|
|
|
print("Initializing Manga OCR Translator API client...") |
|
|
|
def process_url(api_url, manga_url, src_lang, tgt_lang, translator): |
|
"""Process a manga URL and display results with streaming.""" |
|
endpoint = urljoin(api_url, "translate/url") |
|
|
|
print(f"Translating manga from URL: {manga_url}") |
|
print(f"Source language: {src_lang}, Target language: {tgt_lang}") |
|
print(f"Using translator: {translator}") |
|
|
|
payload = { |
|
"url": manga_url, |
|
"src_lang": src_lang, |
|
"tgt_lang": tgt_lang, |
|
"translator": translator |
|
} |
|
headers = {"Content-Type": "application/json"} |
|
|
|
|
|
print("\nSending request to API...\n") |
|
try: |
|
response = requests.post(endpoint, json=payload, headers=headers, stream=True) |
|
response.raise_for_status() |
|
|
|
|
|
image_urls = [] |
|
for line in response.iter_lines(): |
|
if line: |
|
|
|
data = line.decode('utf-8').replace('data: ', '') |
|
try: |
|
|
|
result = json.loads(data) |
|
|
|
|
|
if "status" in result: |
|
status = result["status"] |
|
message = result.get("message", "") |
|
print(f"[{status.upper()}] {message}") |
|
|
|
|
|
if "image_url" in result: |
|
image_url = urljoin(api_url, result["image_url"]) |
|
image_urls.append(image_url) |
|
print(f"Image available at: {image_url}") |
|
|
|
|
|
if len(image_urls) == 1: |
|
print("Opening first image in browser...") |
|
webbrowser.open(image_url) |
|
|
|
except json.JSONDecodeError: |
|
print(f"Warning: Received non-JSON data: {data}") |
|
|
|
print("\nProcessing complete.") |
|
print(f"Total images processed: {len(image_urls)}") |
|
|
|
return image_urls |
|
|
|
except requests.exceptions.RequestException as e: |
|
print(f"Error: Failed to connect to API: {e}") |
|
return [] |
|
|
|
def process_pdf(api_url, pdf_path, src_lang, tgt_lang, translator): |
|
"""Process a manga PDF and display results with streaming.""" |
|
endpoint = urljoin(api_url, "translate/pdf") |
|
|
|
print(f"Translating manga from PDF: {pdf_path}") |
|
print(f"Source language: {src_lang}, Target language: {tgt_lang}") |
|
print(f"Using translator: {translator}") |
|
|
|
|
|
try: |
|
files = {"file": open(pdf_path, "rb")} |
|
except FileNotFoundError: |
|
print(f"Error: PDF file not found at path: {pdf_path}") |
|
return [] |
|
|
|
data = { |
|
"src_lang": src_lang, |
|
"tgt_lang": tgt_lang, |
|
"translator": translator |
|
} |
|
|
|
|
|
print("\nSending request to API...\n") |
|
try: |
|
response = requests.post(endpoint, files=files, data=data, stream=True) |
|
response.raise_for_status() |
|
|
|
|
|
image_urls = [] |
|
for line in response.iter_lines(): |
|
if line: |
|
|
|
data = line.decode('utf-8').replace('data: ', '') |
|
try: |
|
|
|
result = json.loads(data) |
|
|
|
|
|
if "status" in result: |
|
status = result["status"] |
|
message = result.get("message", "") |
|
print(f"[{status.upper()}] {message}") |
|
|
|
|
|
if "image_url" in result: |
|
image_url = urljoin(api_url, result["image_url"]) |
|
image_urls.append(image_url) |
|
print(f"Image available at: {image_url}") |
|
|
|
|
|
if len(image_urls) == 1: |
|
print("Opening first image in browser...") |
|
webbrowser.open(image_url) |
|
|
|
except json.JSONDecodeError: |
|
print(f"Warning: Received non-JSON data: {data}") |
|
|
|
print("\nProcessing complete.") |
|
print(f"Total images processed: {len(image_urls)}") |
|
|
|
return image_urls |
|
|
|
except requests.exceptions.RequestException as e: |
|
print(f"Error: Failed to connect to API: {e}") |
|
return [] |
|
finally: |
|
|
|
files["file"].close() |
|
|
|
def main(): |
|
|
|
parser = argparse.ArgumentParser(description="Manga OCR Translator Client") |
|
parser.add_argument("--api-url", default="http://localhost:8000", help="API URL") |
|
|
|
|
|
subparsers = parser.add_subparsers(dest="command", help="Command to run") |
|
|
|
|
|
url_parser = subparsers.add_parser("url", help="Translate manga from URL") |
|
url_parser.add_argument("manga_url", help="URL of manga chapter to translate") |
|
url_parser.add_argument("--src-lang", default="auto", help="Source language (auto, ja, ko, zh)") |
|
url_parser.add_argument("--tgt-lang", default="en", help="Target language (en, es, fr, etc.)") |
|
url_parser.add_argument("--translator", default="google", |
|
help="Translation engine (google, mymemory, linguee, pollinations)") |
|
|
|
|
|
pdf_parser = subparsers.add_parser("pdf", help="Translate manga from PDF") |
|
pdf_parser.add_argument("pdf_path", help="Path to PDF file") |
|
pdf_parser.add_argument("--src-lang", default="auto", help="Source language (auto, ja, ko, zh)") |
|
pdf_parser.add_argument("--tgt-lang", default="en", help="Target language (en, es, fr, etc.)") |
|
pdf_parser.add_argument("--translator", default="google", |
|
help="Translation engine (google, mymemory, linguee, pollinations)") |
|
|
|
args = parser.parse_args() |
|
|
|
|
|
print("Debug: Command line arguments:", args) |
|
|
|
|
|
if args.command == "url": |
|
process_url(args.api_url, args.manga_url, args.src_lang, args.tgt_lang, args.translator) |
|
elif args.command == "pdf": |
|
process_pdf(args.api_url, args.pdf_path, args.src_lang, args.tgt_lang, args.translator) |
|
else: |
|
print("Error: Please specify a command (url or pdf)") |
|
parser.print_help() |
|
sys.exit(1) |
|
|
|
if __name__ == "__main__": |
|
main() |