awacke1 commited on
Commit
9995ec6
·
verified ·
1 Parent(s): 44ef166

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +46 -46
app.py CHANGED
@@ -25,7 +25,6 @@ def search_hub(query: str, search_type: str) -> pd.DataFrame:
25
  else:
26
  data = []
27
 
28
- # Add numbering and format the link
29
  for i, item in enumerate(data, 1):
30
  item['number'] = i
31
  item['formatted_link'] = format_link(item, i, search_type)
@@ -64,38 +63,38 @@ async def download_readme(session: aiohttp.ClientSession, item: Dict) -> tuple[s
64
  except Exception as e:
65
  return item_id.replace('/', '_'), f"# Error downloading README for {item_id}\nError: {str(e)}"
66
 
67
- async def download_all_readmes(data: List[Dict]) -> str:
68
  """Download all README files and create a zip archive."""
 
 
 
69
  zip_buffer = io.BytesIO()
 
70
 
71
  async with aiohttp.ClientSession() as session:
72
- # Download all READMEs concurrently
73
  tasks = [download_readme(session, item) for item in data]
74
  results = await asyncio.gather(*tasks)
75
 
76
- # Create zip file
77
  with zipfile.ZipFile(zip_buffer, 'w', zipfile.ZIP_DEFLATED) as zip_file:
78
  for filename, content in results:
79
  zip_file.writestr(f"{filename}.md", content)
80
 
81
- # Convert to base64
82
  zip_buffer.seek(0)
83
  base64_zip = base64.b64encode(zip_buffer.getvalue()).decode()
84
- return base64_zip
85
-
86
- def create_download_link(base64_zip: str) -> str:
87
- """Create an HTML download link for the zip file."""
88
  download_link = f"""
89
- <a href="data:application/zip;base64,{base64_zip}"
90
- download="readmes.zip"
91
- style="display: inline-block; padding: 10px 20px;
92
- background-color: #4CAF50; color: white;
93
- text-decoration: none; border-radius: 5px;
94
- margin-top: 10px;">
95
- 📥 Download READMEs Archive
96
- </a>
 
97
  """
98
- return download_link
 
99
 
100
  def display_results(df: pd.DataFrame):
101
  if df is not None and not df.empty:
@@ -138,51 +137,52 @@ with gr.Blocks() as demo:
138
  search_button = gr.Button("Search")
139
 
140
  results_html = gr.HTML(label="Search Results")
141
- download_html = gr.HTML(label="Download Link")
 
 
142
  metadata_output = gr.Textbox(label="Metadata", lines=10)
143
  aggregated_output = gr.JSON(label="Aggregated Content")
144
 
145
- current_results = gr.State([]) # Store current search results
146
 
147
- async def search_and_aggregate(query, search_type):
148
  df = search_hub(query, search_type)
149
  data = df.to_dict('records')
150
  aggregated = SwarmyTime(data)
151
  html_results = display_results(df)
152
-
153
- # Create download button
154
- download_button = """
155
- <button onclick="downloadReadmes()"
156
- style="padding: 10px 20px;
157
- background-color: #4CAF50;
158
- color: white;
159
- border: none;
160
- border-radius: 5px;
161
- cursor: pointer;">
162
- 📚 Download All READMEs
163
- </button>
164
- """
165
-
166
- return html_results, download_button, aggregated, data
167
 
168
- async def download_readmes(data):
169
  if not data:
170
- return "No results to download"
171
-
172
- base64_zip = await download_all_readmes(data)
173
- return create_download_link(base64_zip)
174
 
175
  search_button.click(
176
  search_and_aggregate,
177
  inputs=[search_query, search_type],
178
- outputs=[results_html, download_html, aggregated_output, current_results]
 
 
 
 
 
 
 
179
  )
180
 
181
- # Add download button click handler
182
- download_html.click(
183
- download_readmes,
184
  inputs=[current_results],
185
- outputs=[download_html]
186
  )
187
 
188
  demo.launch(debug=True)
 
25
  else:
26
  data = []
27
 
 
28
  for i, item in enumerate(data, 1):
29
  item['number'] = i
30
  item['formatted_link'] = format_link(item, i, search_type)
 
63
  except Exception as e:
64
  return item_id.replace('/', '_'), f"# Error downloading README for {item_id}\nError: {str(e)}"
65
 
66
+ async def download_all_readmes(data: List[Dict]) -> tuple[str, str]:
67
  """Download all README files and create a zip archive."""
68
+ if not data:
69
+ return "", "No results to download"
70
+
71
  zip_buffer = io.BytesIO()
72
+ status_message = "Downloading READMEs..."
73
 
74
  async with aiohttp.ClientSession() as session:
 
75
  tasks = [download_readme(session, item) for item in data]
76
  results = await asyncio.gather(*tasks)
77
 
 
78
  with zipfile.ZipFile(zip_buffer, 'w', zipfile.ZIP_DEFLATED) as zip_file:
79
  for filename, content in results:
80
  zip_file.writestr(f"{filename}.md", content)
81
 
 
82
  zip_buffer.seek(0)
83
  base64_zip = base64.b64encode(zip_buffer.getvalue()).decode()
84
+
 
 
 
85
  download_link = f"""
86
+ <div style="margin-top: 10px;">
87
+ <a href="data:application/zip;base64,{base64_zip}"
88
+ download="readmes.zip"
89
+ style="display: inline-block; padding: 10px 20px;
90
+ background-color: #4CAF50; color: white;
91
+ text-decoration: none; border-radius: 5px;">
92
+ 📥 Download READMEs Archive
93
+ </a>
94
+ </div>
95
  """
96
+
97
+ return download_link, "READMEs ready for download!"
98
 
99
  def display_results(df: pd.DataFrame):
100
  if df is not None and not df.empty:
 
137
  search_button = gr.Button("Search")
138
 
139
  results_html = gr.HTML(label="Search Results")
140
+ download_button = gr.Button("📚 Download All READMEs", visible=False)
141
+ download_status = gr.Markdown("", label="Download Status")
142
+ download_area = gr.HTML("", label="Download Link")
143
  metadata_output = gr.Textbox(label="Metadata", lines=10)
144
  aggregated_output = gr.JSON(label="Aggregated Content")
145
 
146
+ current_results = gr.State([])
147
 
148
+ def search_and_aggregate(query, search_type):
149
  df = search_hub(query, search_type)
150
  data = df.to_dict('records')
151
  aggregated = SwarmyTime(data)
152
  html_results = display_results(df)
153
+ show_download = len(data) > 0
154
+ return [
155
+ html_results, # results_html
156
+ show_download, # download_button visible
157
+ "", # download_status
158
+ "", # download_area
159
+ aggregated, # aggregated_output
160
+ data # current_results
161
+ ]
 
 
 
 
 
 
162
 
163
+ async def handle_download(data):
164
  if not data:
165
+ return ["No results to download", ""]
166
+ download_link, status = await download_all_readmes(data)
167
+ return [status, download_link]
 
168
 
169
  search_button.click(
170
  search_and_aggregate,
171
  inputs=[search_query, search_type],
172
+ outputs=[
173
+ results_html,
174
+ download_button,
175
+ download_status,
176
+ download_area,
177
+ aggregated_output,
178
+ current_results
179
+ ]
180
  )
181
 
182
+ download_button.click(
183
+ handle_download,
 
184
  inputs=[current_results],
185
+ outputs=[download_status, download_area]
186
  )
187
 
188
  demo.launch(debug=True)