File size: 7,581 Bytes
a81573d |
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 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 |
#!/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() |