#!/usr/bin/env python """ 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 # Debug print statement 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"} # Make the API request with streaming enabled print("\nSending request to API...\n") try: response = requests.post(endpoint, json=payload, headers=headers, stream=True) response.raise_for_status() # Raise exception for 4XX/5XX status codes # Process the streaming response image_urls = [] for line in response.iter_lines(): if line: # Process each line of the server-sent events data = line.decode('utf-8').replace('data: ', '') try: # Parse the JSON data result = json.loads(data) # Print status update if "status" in result: status = result["status"] message = result.get("message", "") print(f"[{status.upper()}] {message}") # Save image URL if available 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}") # Open the first image in a browser 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}") # Prepare files and data for multipart form 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 } # Make the API request with streaming enabled print("\nSending request to API...\n") try: response = requests.post(endpoint, files=files, data=data, stream=True) response.raise_for_status() # Raise exception for 4XX/5XX status codes # Process the streaming response image_urls = [] for line in response.iter_lines(): if line: # Process each line of the server-sent events data = line.decode('utf-8').replace('data: ', '') try: # Parse the JSON data result = json.loads(data) # Print status update if "status" in result: status = result["status"] message = result.get("message", "") print(f"[{status.upper()}] {message}") # Save image URL if available 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}") # Open the first image in a browser 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: # Close the file files["file"].close() def main(): # Parse command line arguments parser = argparse.ArgumentParser(description="Manga OCR Translator Client") parser.add_argument("--api-url", default="http://localhost:8000", help="API URL") # Create subparsers for URL and PDF commands subparsers = parser.add_subparsers(dest="command", help="Command to run") # URL command 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 command 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() # Debug print args print("Debug: Command line arguments:", args) # Process based on command 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()