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()