Manga_OCR / client_example.py
Drag2121's picture
first
a81573d
#!/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()