File size: 3,379 Bytes
c7a56f2
 
df9cf6c
 
 
2e86f0d
 
 
 
 
 
 
 
 
 
 
 
c7a56f2
df9cf6c
 
 
a9b7134
2e86f0d
a9b7134
2e86f0d
 
 
 
 
 
 
 
 
 
 
 
 
df9cf6c
 
a9b7134
 
 
df9cf6c
a9b7134
df9cf6c
 
 
 
a9b7134
 
 
 
df9cf6c
a9b7134
df9cf6c
 
 
 
 
 
 
 
2e86f0d
df9cf6c
 
a9b7134
2e86f0d
a9b7134
c7a56f2
a9b7134
 
 
 
 
 
 
 
 
 
2e86f0d
 
 
 
 
 
 
 
a9b7134
 
 
2e86f0d
 
 
 
 
 
a9b7134
2e86f0d
 
 
 
 
 
a9b7134
 
 
 
 
 
c7a56f2
 
 
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
import gradio as gr
import os
from src.processing.gemini_processor import GeminiProcessor
from src.analysis.coverage_generator import CoverageGenerator
from pathlib import Path
import logging

class ConsoleOutput:
    def __init__(self):
        self.messages = []
        
    def write(self, message):
        self.messages.append(str(message))
        return "\n".join(self.messages)
        
    def get_output(self):
        return "\n".join(self.messages)

def process_pdf(pdf_file, progress=gr.Progress()):
    if pdf_file is None:
        raise gr.Error("Please upload a PDF file")
    
    console = ConsoleOutput()
    
    # Set up logging to console
    logging.basicConfig(level=logging.DEBUG,
                       format='%(asctime)s - %(levelname)s - %(message)s')
    
    logger = logging.getLogger()
    logger.handlers = []  # Remove existing handlers
    
    class GradioHandler(logging.Handler):
        def emit(self, record):
            msg = self.format(record)
            console.write(msg)
            
    logger.addHandler(GradioHandler())
    
    try:
        processor = GeminiProcessor()
        coverage_gen = CoverageGenerator()
        
        # Clean screenplay
        progress(0.2, desc="Processing screenplay...")
        cleaned_path = Path("cleaned_screenplay_long.txt")
        success = processor.process_screenplay(pdf_file.name, str(cleaned_path))
        if not success:
            raise gr.Error("Failed to process screenplay")
        
        with open(cleaned_path, 'r') as f:
            cleaned_text = f.read()
        
        # Generate coverage
        progress(0.6, desc="Generating coverage...")
        success = coverage_gen.generate_coverage(cleaned_path)
        if not success:
            raise gr.Error("Failed to generate coverage")
            
        with open(Path("coverage.txt"), 'r') as f:
            coverage = f.read()
            
        progress(1.0, desc="Complete!")
        return cleaned_text, coverage, console.get_output()
        
    except Exception as e:
        error_msg = f"Error: {str(e)}"
        console.write(error_msg)
        raise gr.Error(error_msg)

with gr.Blocks(title="Screenplay Coverage Generator") as demo:
    gr.Markdown("# Screenplay Coverage Generator")
    
    with gr.Row():
        file_input = gr.File(label="Upload Screenplay PDF", file_types=[".pdf"])
    
    with gr.Row():
        process_btn = gr.Button("Process Screenplay")
    
    with gr.Row():
        console = gr.Textbox(
            label="Console Output",
            lines=10,
            max_lines=30,
            autoscroll=True,
            container=True,
            show_copy_button=True
        )
    
    with gr.Tabs():
        with gr.TabItem("Cleaned Screenplay"):
            cleaned_output = gr.Textbox(
                label="Cleaned Screenplay",
                lines=10,
                max_lines=30,
                show_copy_button=True
            )
        with gr.TabItem("Coverage"):
            coverage_output = gr.Textbox(
                label="Coverage Document",
                lines=10,
                max_lines=30,
                show_copy_button=True
            )
    
    process_btn.click(
        fn=process_pdf,
        inputs=[file_input],
        outputs=[cleaned_output, coverage_output, console]
    )

if __name__ == "__main__":
    demo.launch()