utarn commited on
Commit
790a062
Β·
1 Parent(s): 712f641
Files changed (2) hide show
  1. app.py +91 -23
  2. main.py +16 -6
app.py CHANGED
@@ -2,9 +2,47 @@
2
  import gradio as gr
3
  import os
4
  import threading
 
 
 
5
  from main import generate_multiple_mazes, merge_pdfs
6
 
7
- def generate_mazes_interface(num_files, width, height, progress=gr.Progress()):
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8
  """Interface function for generating mazes with progress tracking"""
9
  try:
10
  progress(0.1, desc="Starting maze generation...")
@@ -21,20 +59,24 @@ def generate_mazes_interface(num_files, width, height, progress=gr.Progress()):
21
 
22
  progress(0.2, desc="Generating mazes...")
23
 
24
- # Generate the mazes
25
- success_count = generate_multiple_mazes(num_files, width, height)
26
 
27
  progress(1.0, desc="Generation complete!")
28
 
 
 
 
 
29
  if success_count == num_files:
30
- return f"Successfully generated {success_count} maze PDFs in pdfs/ directory", get_pdf_list()
31
  else:
32
- return f"Warning: Only {success_count} out of {num_files} mazes were generated successfully", get_pdf_list()
33
 
34
  except Exception as e:
35
  return f"Error: {str(e)}", None
36
 
37
- def merge_pdfs_interface(progress=gr.Progress()):
38
  """Interface function for merging PDFs with progress tracking"""
39
  try:
40
  progress(0.1, desc="Starting PDF merge...")
@@ -44,18 +86,19 @@ def merge_pdfs_interface(progress=gr.Progress()):
44
 
45
  progress(0.5, desc="Merging PDFs...")
46
 
47
- success = merge_pdfs('pdfs')
 
48
 
49
  progress(1.0, desc="Merge complete!")
50
 
51
  if success:
52
- merged_pdf_path = os.path.join('pdfs', 'merged_mazes.pdf')
53
  if os.path.exists(merged_pdf_path):
54
- return "Successfully merged all PDFs into pdfs/merged_mazes.pdf", get_pdf_list(), merged_pdf_path
55
  else:
56
- return "Merge completed but merged file not found", get_pdf_list(), None
57
  else:
58
- return "Failed to merge PDFs", get_pdf_list(), None
59
 
60
  except Exception as e:
61
  return f"Error: {str(e)}", None, None
@@ -82,8 +125,12 @@ def create_interface():
82
  os.makedirs('pdfs', exist_ok=True)
83
 
84
  with gr.Blocks(title="Maze Generator", theme=gr.themes.Soft()) as interface:
 
 
 
85
  gr.Markdown("# 🎯 Maze Generator")
86
  gr.Markdown("Generate custom maze PDFs or merge existing ones using this web interface.")
 
87
 
88
  with gr.Tabs():
89
  with gr.TabItem("Generate Mazes"):
@@ -118,10 +165,10 @@ def create_interface():
118
  generate_btn = gr.Button("πŸš€ Generate Mazes", variant="primary", size="lg")
119
 
120
  with gr.Column():
121
- gr.Markdown("### Generated Files")
122
  file_list = gr.List(
123
- label="PDF Files in pdfs/ directory",
124
- value=get_pdf_list()
125
  )
126
 
127
  refresh_btn = gr.Button("πŸ”„ Refresh List", size="sm")
@@ -137,23 +184,24 @@ def create_interface():
137
  # Event handlers
138
  generate_btn.click(
139
  fn=generate_mazes_interface,
140
- inputs=[num_files, width, height],
141
  outputs=[generate_output, file_list],
142
  show_progress=True
143
  )
144
 
145
  refresh_btn.click(
146
- fn=refresh_file_list,
 
147
  outputs=[file_list]
148
  )
149
 
150
  with gr.TabItem("Merge PDFs"):
151
  with gr.Row():
152
  with gr.Column():
153
- gr.Markdown("### Merge Existing PDFs")
154
- gr.Markdown("Merge all PDF files in the pdfs/ directory into a single file and delete individual files.")
155
 
156
- merge_btn = gr.Button("πŸ”— Merge All PDFs", variant="primary", size="lg")
157
 
158
  merge_output = gr.Textbox(
159
  label="Merge Status",
@@ -164,8 +212,8 @@ def create_interface():
164
  )
165
 
166
  merge_file_list = gr.List(
167
- label="PDF Files After Merge",
168
- value=get_pdf_list()
169
  )
170
 
171
  download_merged_btn = gr.DownloadButton(
@@ -177,24 +225,44 @@ def create_interface():
177
  # Event handlers
178
  merge_btn.click(
179
  fn=merge_pdfs_interface,
 
180
  outputs=[merge_output, merge_file_list, download_merged_btn],
181
  show_progress=True
182
  )
 
 
 
 
 
 
183
 
184
  # Auto-refresh file list every few seconds
185
  interface.load(
186
- fn=lambda: (get_pdf_list(), get_pdf_list()),
 
187
  outputs=[file_list, merge_file_list]
188
  )
189
 
190
  return interface
191
 
192
  if __name__ == "__main__":
 
 
 
193
  # Create and launch the interface
194
  interface = create_interface()
 
 
 
 
 
 
195
  interface.launch(
196
  server_name="0.0.0.0",
197
  server_port=7860,
198
  share=False,
199
  show_error=True
200
- )
 
 
 
 
2
  import gradio as gr
3
  import os
4
  import threading
5
+ import sys
6
+ import uuid
7
+ import time
8
  from main import generate_multiple_mazes, merge_pdfs
9
 
10
+ # Session management
11
+ user_sessions = {}
12
+
13
+ def create_session():
14
+ """Create a new session for the user"""
15
+ session_id = str(uuid.uuid4())[:8] # Short session ID
16
+ user_sessions[session_id] = {
17
+ 'created_at': time.time(),
18
+ 'files_generated': 0
19
+ }
20
+ return session_id
21
+
22
+ def get_session_files(session_id):
23
+ """Get list of PDF files for a specific session"""
24
+ try:
25
+ if os.path.exists('pdfs'):
26
+ pdf_files = [f for f in os.listdir('pdfs')
27
+ if f.endswith('.pdf') and f.startswith(f"{session_id}_")]
28
+ pdf_files.sort()
29
+ return pdf_files if pdf_files else ["No PDF files found for this session"]
30
+ else:
31
+ return ["pdfs/ directory does not exist"]
32
+ except Exception as e:
33
+ return [f"Error: {str(e)}"]
34
+
35
+ def cleanup_merged_pdf(session_id):
36
+ """Remove the merged PDF for a session after download"""
37
+ merged_pdf_path = os.path.join('pdfs', f"{session_id}_merged_mazes.pdf")
38
+ if os.path.exists(merged_pdf_path):
39
+ try:
40
+ os.remove(merged_pdf_path)
41
+ print(f"Cleaned up merged PDF: {merged_pdf_path}")
42
+ except Exception as e:
43
+ print(f"Error cleaning up merged PDF: {e}")
44
+
45
+ def generate_mazes_interface(num_files, width, height, session_id, progress=gr.Progress()):
46
  """Interface function for generating mazes with progress tracking"""
47
  try:
48
  progress(0.1, desc="Starting maze generation...")
 
59
 
60
  progress(0.2, desc="Generating mazes...")
61
 
62
+ # Generate the mazes with session ID
63
+ success_count = generate_multiple_mazes(num_files, width, height, session_id)
64
 
65
  progress(1.0, desc="Generation complete!")
66
 
67
+ # Update session info
68
+ if session_id in user_sessions:
69
+ user_sessions[session_id]['files_generated'] += success_count
70
+
71
  if success_count == num_files:
72
+ return f"Successfully generated {success_count} maze PDFs for session {session_id}", get_session_files(session_id)
73
  else:
74
+ return f"Warning: Only {success_count} out of {num_files} mazes were generated successfully for session {session_id}", get_session_files(session_id)
75
 
76
  except Exception as e:
77
  return f"Error: {str(e)}", None
78
 
79
+ def merge_pdfs_interface(session_id, progress=gr.Progress()):
80
  """Interface function for merging PDFs with progress tracking"""
81
  try:
82
  progress(0.1, desc="Starting PDF merge...")
 
86
 
87
  progress(0.5, desc="Merging PDFs...")
88
 
89
+ # Merge only session-specific PDFs
90
+ success = merge_pdfs('pdfs', session_id)
91
 
92
  progress(1.0, desc="Merge complete!")
93
 
94
  if success:
95
+ merged_pdf_path = os.path.join('pdfs', f"{session_id}_merged_mazes.pdf")
96
  if os.path.exists(merged_pdf_path):
97
+ return f"Successfully merged session {session_id} PDFs into {session_id}_merged_mazes.pdf", get_session_files(session_id), merged_pdf_path
98
  else:
99
+ return "Merge completed but merged file not found", get_session_files(session_id), None
100
  else:
101
+ return "Failed to merge PDFs", get_session_files(session_id), None
102
 
103
  except Exception as e:
104
  return f"Error: {str(e)}", None, None
 
125
  os.makedirs('pdfs', exist_ok=True)
126
 
127
  with gr.Blocks(title="Maze Generator", theme=gr.themes.Soft()) as interface:
128
+ # Session state
129
+ session_id = gr.State(create_session())
130
+
131
  gr.Markdown("# 🎯 Maze Generator")
132
  gr.Markdown("Generate custom maze PDFs or merge existing ones using this web interface.")
133
+ gr.Markdown(f"**Session ID:** {session_id.value} - Your files are isolated from other users")
134
 
135
  with gr.Tabs():
136
  with gr.TabItem("Generate Mazes"):
 
165
  generate_btn = gr.Button("πŸš€ Generate Mazes", variant="primary", size="lg")
166
 
167
  with gr.Column():
168
+ gr.Markdown("### Your Generated Files")
169
  file_list = gr.List(
170
+ label="PDF Files for Your Session",
171
+ value=get_session_files(session_id.value)
172
  )
173
 
174
  refresh_btn = gr.Button("πŸ”„ Refresh List", size="sm")
 
184
  # Event handlers
185
  generate_btn.click(
186
  fn=generate_mazes_interface,
187
+ inputs=[num_files, width, height, session_id],
188
  outputs=[generate_output, file_list],
189
  show_progress=True
190
  )
191
 
192
  refresh_btn.click(
193
+ fn=lambda sid: get_session_files(sid),
194
+ inputs=[session_id],
195
  outputs=[file_list]
196
  )
197
 
198
  with gr.TabItem("Merge PDFs"):
199
  with gr.Row():
200
  with gr.Column():
201
+ gr.Markdown("### Merge Your PDFs")
202
+ gr.Markdown("Merge all your PDF files in this session into a single file. Individual files will be deleted after merging.")
203
 
204
+ merge_btn = gr.Button("πŸ”— Merge Your PDFs", variant="primary", size="lg")
205
 
206
  merge_output = gr.Textbox(
207
  label="Merge Status",
 
212
  )
213
 
214
  merge_file_list = gr.List(
215
+ label="Your PDF Files After Merge",
216
+ value=get_session_files(session_id.value)
217
  )
218
 
219
  download_merged_btn = gr.DownloadButton(
 
225
  # Event handlers
226
  merge_btn.click(
227
  fn=merge_pdfs_interface,
228
+ inputs=[session_id],
229
  outputs=[merge_output, merge_file_list, download_merged_btn],
230
  show_progress=True
231
  )
232
+
233
+ # Clean up merged PDF after download
234
+ download_merged_btn.click(
235
+ fn=lambda sid: cleanup_merged_pdf(sid),
236
+ inputs=[session_id]
237
+ )
238
 
239
  # Auto-refresh file list every few seconds
240
  interface.load(
241
+ fn=lambda sid: (get_session_files(sid), get_session_files(sid)),
242
+ inputs=[session_id],
243
  outputs=[file_list, merge_file_list]
244
  )
245
 
246
  return interface
247
 
248
  if __name__ == "__main__":
249
+ print("πŸš€ Starting Maze Generator Application...")
250
+ print("πŸ“ Creating pdfs directory if it doesn't exist...")
251
+
252
  # Create and launch the interface
253
  interface = create_interface()
254
+
255
+ print("🌐 Launching Gradio interface...")
256
+ print("πŸ“ Server will be available at: http://0.0.0.0:7861")
257
+ print("πŸ“ Local access: http://localhost:7861")
258
+ print("⏳ Waiting for server to start...")
259
+
260
  interface.launch(
261
  server_name="0.0.0.0",
262
  server_port=7860,
263
  share=False,
264
  show_error=True
265
+ )
266
+
267
+ print("βœ… Maze Generator is ready and running!")
268
+ print("🎯 Open your browser and navigate to http://localhost:7861")
main.py CHANGED
@@ -182,7 +182,7 @@ def extract_first_page(input_pdf_path, output_pdf_path):
182
  print(f"Error extracting first page: {e}")
183
  return False
184
 
185
- def generate_multiple_mazes(num_files, width, height):
186
  """Generate multiple maze PDFs with specified dimensions"""
187
  # Create pdfs directory if it doesn't exist
188
  os.makedirs('pdfs', exist_ok=True)
@@ -198,9 +198,10 @@ def generate_multiple_mazes(num_files, width, height):
198
  # Download the full PDF
199
  temp_filename = f"temp_maze_{i+1}.pdf"
200
  if download_pdf(maze_html, maze_cookies, temp_filename):
201
- # Extract only the first page to pdfs directory
202
  # Start with i+1, but get_unique_filename will find the next available number
203
- final_filename = os.path.join('pdfs', f"maze_{width}x{height}_{i+1}.pdf")
 
204
  result_path = extract_first_page(temp_filename, final_filename)
205
 
206
  if result_path:
@@ -217,11 +218,20 @@ def generate_multiple_mazes(num_files, width, height):
217
  print(f"\nSuccessfully generated {success_count}/{num_files} maze PDFs in pdfs/ directory")
218
  return success_count
219
 
220
- def merge_pdfs(pdf_directory, output_filename="merged_mazes.pdf"):
221
  """Merge all PDFs in directory into a single file and delete individual files"""
222
  try:
223
  # Get all PDF files in directory
224
- pdf_files = [f for f in os.listdir(pdf_directory) if f.endswith('.pdf')]
 
 
 
 
 
 
 
 
 
225
  pdf_files.sort() # Sort files by name
226
 
227
  if not pdf_files:
@@ -284,7 +294,7 @@ def main():
284
  if args.merge:
285
  print("Merge mode: Merging all existing PDFs in pdfs/ directory")
286
  if os.path.exists('pdfs'):
287
- success = merge_pdfs('pdfs')
288
  return 0 if success else 1
289
  else:
290
  print("Error: pdfs/ directory does not exist")
 
182
  print(f"Error extracting first page: {e}")
183
  return False
184
 
185
+ def generate_multiple_mazes(num_files, width, height, session_id=None):
186
  """Generate multiple maze PDFs with specified dimensions"""
187
  # Create pdfs directory if it doesn't exist
188
  os.makedirs('pdfs', exist_ok=True)
 
198
  # Download the full PDF
199
  temp_filename = f"temp_maze_{i+1}.pdf"
200
  if download_pdf(maze_html, maze_cookies, temp_filename):
201
+ # Extract only the first page to pdfs directory with session prefix
202
  # Start with i+1, but get_unique_filename will find the next available number
203
+ session_prefix = f"{session_id}_" if session_id else ""
204
+ final_filename = os.path.join('pdfs', f"{session_prefix}maze_{width}x{height}_{i+1}.pdf")
205
  result_path = extract_first_page(temp_filename, final_filename)
206
 
207
  if result_path:
 
218
  print(f"\nSuccessfully generated {success_count}/{num_files} maze PDFs in pdfs/ directory")
219
  return success_count
220
 
221
+ def merge_pdfs(pdf_directory, session_id=None, output_filename=None):
222
  """Merge all PDFs in directory into a single file and delete individual files"""
223
  try:
224
  # Get all PDF files in directory
225
+ if session_id:
226
+ # Only merge files with the session prefix
227
+ pdf_files = [f for f in os.listdir(pdf_directory)
228
+ if f.endswith('.pdf') and f.startswith(f"{session_id}_") and not f.endswith("_merged_mazes.pdf")]
229
+ output_filename = output_filename or f"{session_id}_merged_mazes.pdf"
230
+ else:
231
+ # Merge all PDF files (backward compatibility)
232
+ pdf_files = [f for f in os.listdir(pdf_directory) if f.endswith('.pdf')]
233
+ output_filename = output_filename or "merged_mazes.pdf"
234
+
235
  pdf_files.sort() # Sort files by name
236
 
237
  if not pdf_files:
 
294
  if args.merge:
295
  print("Merge mode: Merging all existing PDFs in pdfs/ directory")
296
  if os.path.exists('pdfs'):
297
+ success = merge_pdfs('pdfs', session_id=None)
298
  return 0 if success else 1
299
  else:
300
  print("Error: pdfs/ directory does not exist")