File size: 3,902 Bytes
c7a56f2
 
df9cf6c
 
 
2e86f0d
 
 
 
 
 
 
 
 
 
 
 
c7a56f2
dff6c34
df9cf6c
 
a9b7134
2e86f0d
dff6c34
2e86f0d
dff6c34
 
2e86f0d
 
 
 
 
 
df9cf6c
 
a9b7134
dff6c34
df9cf6c
 
dff6c34
df9cf6c
 
a9b7134
 
 
dff6c34
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
df9cf6c
dff6c34
df9cf6c
 
 
 
 
 
 
dff6c34
df9cf6c
 
a9b7134
2e86f0d
a9b7134
c7a56f2
a9b7134
 
 
 
 
 
 
 
dff6c34
a9b7134
 
dff6c34
a9b7134
 
 
dff6c34
a9b7134
dff6c34
a9b7134
 
dff6c34
a9b7134
dff6c34
 
 
 
 
 
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
113
114
115
116
117
118
119
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_screenplay(pdf_file, progress=gr.Progress()):
    if pdf_file is None:
        raise gr.Error("Please upload a PDF file")
    
    console = ConsoleOutput()
    logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')
    logger = logging.getLogger()
    logger.handlers = []

    class GradioHandler(logging.Handler):
        def emit(self, record):
            msg = self.format(record)
            console.write(msg)
            
    logger.addHandler(GradioHandler())
    
    try:
        processor = GeminiProcessor()
        progress(0.5, 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()
            
        progress(1.0, desc="Complete!")
        return cleaned_text, gr.Button.update(interactive=True), console.get_output()
    
    except Exception as e:
        error_msg = f"Error: {str(e)}"
        console.write(error_msg)
        raise gr.Error(error_msg)

def generate_coverage(progress=gr.Progress()):
    console = ConsoleOutput()
    logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')
    logger = logging.getLogger()
    logger.handlers = []

    class GradioHandler(logging.Handler):
        def emit(self, record):
            msg = self.format(record)
            console.write(msg)
            
    logger.addHandler(GradioHandler())
    
    try:
        coverage_gen = CoverageGenerator()
        progress(0.5, desc="Generating coverage...")
        cleaned_path = Path("cleaned_screenplay_long.txt")
        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 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")
        coverage_btn = gr.Button("Generate Coverage", interactive=False)
    
    with gr.Row():
        console = gr.Textbox(label="Console Output", lines=10, max_lines=30, autoscroll=True, show_copy_button=True)
    
    with gr.Tabs():
        with gr.TabItem("Cleaned Screenplay"):
            cleaned_output = gr.Textbox(label="Cleaned Screenplay", lines=10, show_copy_button=True)
        with gr.TabItem("Coverage"):
            coverage_output = gr.Textbox(label="Coverage Document", lines=10, show_copy_button=True)
    
    process_btn.click(
        fn=process_screenplay,
        inputs=[file_input],
        outputs=[cleaned_output, coverage_btn, console]
    )
    
    coverage_btn.click(
        fn=generate_coverage,
        outputs=[coverage_output, console]
    )

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