akhaliq HF staff commited on
Commit
d5d4564
·
verified ·
1 Parent(s): 6d3b49f

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +18 -125
app.py CHANGED
@@ -14,11 +14,13 @@ class PaperManager:
14
  def fetch_papers(self):
15
  """
16
  Fetch papers from the API if not already fetched today.
 
 
17
  """
18
  today = datetime.now(timezone.utc).date()
19
  if self.last_fetch_date == today and self.cache:
20
  print("Using cached papers.")
21
- return True
22
  else:
23
  try:
24
  # Attempt to fetch all papers at once. Adjust 'limit' as per API's capability.
@@ -29,10 +31,10 @@ class PaperManager:
29
  self.last_fetch_date = today
30
  self.total_pages = (len(self.cache) + self.papers_per_page - 1) // self.papers_per_page
31
  print(f"Fetched {len(self.cache)} papers. Total pages: {self.total_pages}")
32
- return True
33
  except requests.RequestException as e:
34
  print(f"Error fetching papers: {e}")
35
- return False
36
 
37
  def format_paper(self, paper):
38
  """
@@ -51,7 +53,6 @@ class PaperManager:
51
  except ValueError:
52
  time_ago = "Unknown"
53
 
54
- # Ensure the triple-quoted string is properly closed
55
  return f"""<div style='border-bottom: 1px solid #eee; padding: 10px 0;'>
56
  <a href='{url}' target='_blank' style='color: #000; text-decoration: none; font-weight: bold;'>{title}</a>
57
  <div style='font-size: 0.8em; color: #666; margin-top: 5px;'>
@@ -120,6 +121,11 @@ html, body {
120
  align-items: center;
121
  margin-top: 10px;
122
  }
 
 
 
 
 
123
  """
124
 
125
  # Instantiate the PaperManager
@@ -129,23 +135,22 @@ def initialize():
129
  """
130
  Initialize the app by fetching papers and setting initial states.
131
  """
132
- success = paper_manager.fetch_papers()
133
  if success:
134
- papers = paper_manager.cache
135
  page = 1
136
  total_pages = paper_manager.total_pages
137
  page_papers = paper_manager.render_papers(papers, page)
138
  page_info_text = f"Page {page} of {total_pages}"
139
- return page_papers, page, total_pages, papers, page_info_text
140
  else:
141
- error_html = "<div>Error fetching papers. Please try again later.</div>"
142
- return error_html, 1, 1, [], "Page 1 of 1"
143
 
144
  def refresh_papers(current_page, query):
145
  """
146
  Refresh the papers. Fetch new data if a new day has started.
147
  """
148
- success = paper_manager.fetch_papers()
149
  if success:
150
  # Reset to first page on refresh
151
  new_page = 1
@@ -154,124 +159,12 @@ def refresh_papers(current_page, query):
154
  total_pages = (len(filtered) + paper_manager.papers_per_page - 1) // paper_manager.papers_per_page if filtered else 1
155
  page_papers = paper_manager.render_papers(filtered, new_page)
156
  page_info_text = f"Page {new_page} of {total_pages}"
157
- return page_papers, new_page, total_pages, filtered, page_info_text
158
  else:
159
  papers = paper_manager.cache
160
  total_pages = paper_manager.total_pages
161
  page_papers = paper_manager.render_papers(papers, new_page)
162
  page_info_text = f"Page {new_page} of {total_pages}"
163
- return page_papers, new_page, total_pages, papers, page_info_text
164
- else:
165
- error_html = "<div>Error fetching papers. Please try again later.</div>"
166
- return error_html, current_page, paper_manager.total_pages, [], f"Page {current_page} of {paper_manager.total_pages}"
167
-
168
- def search_papers(query, papers):
169
- """
170
- Search for papers based on the query and update the display.
171
- """
172
- if query:
173
- filtered = paper_manager.search_papers(query)
174
- else:
175
- filtered = papers
176
- total_pages = (len(filtered) + paper_manager.papers_per_page - 1) // paper_manager.papers_per_page if filtered else 1
177
- page = 1
178
- page_papers = paper_manager.render_papers(filtered, page)
179
- page_info_text = f"Page {page} of {total_pages}"
180
- return page_papers, page, total_pages, filtered, page_info_text
181
-
182
- def change_page(direction, current_page, total_pages, papers, query):
183
- """
184
- Change the current page based on the direction ('next' or 'prev').
185
- """
186
- if direction == "next" and current_page < total_pages:
187
- new_page = current_page + 1
188
- elif direction == "prev" and current_page > 1:
189
- new_page = current_page - 1
190
  else:
191
- new_page = current_page # No change if limits are reached
192
-
193
- if not papers:
194
- page_papers = "<div>No papers available for this page.</div>"
195
- else:
196
- page_papers = paper_manager.render_papers(papers, new_page)
197
- page_info_text = f"Page {new_page} of {total_pages}"
198
- return page_papers, new_page, total_pages, papers, page_info_text
199
-
200
- def go_prev(current_page, total_pages, papers, query):
201
- """
202
- Handle the 'Previous Page' button click.
203
- """
204
- return change_page("prev", current_page, total_pages, papers, query)
205
-
206
- def go_next(current_page, total_pages, papers, query):
207
- """
208
- Handle the 'Next Page' button click.
209
- """
210
- return change_page("next", current_page, total_pages, papers, query)
211
-
212
- # Define the Gradio Blocks interface
213
- demo = gr.Blocks(css=css)
214
-
215
- with demo:
216
- with gr.Column(elem_classes=["container"]):
217
- # Title
218
- gr.Markdown("# Daily Papers - HackerNews Style", elem_classes=["title"])
219
-
220
- # Search and Refresh Row
221
- with gr.Row(elem_classes=["search-row"]):
222
- search_input = gr.Textbox(label="Search papers", placeholder="Enter search term...")
223
- refresh_button = gr.Button("Refresh")
224
-
225
- # Paper List Display
226
- paper_list = gr.HTML(elem_classes=["paper-list"])
227
-
228
- # Pagination Controls
229
- with gr.Row(elem_classes=["footer"]):
230
- prev_button = gr.Button("Previous Page")
231
- page_info = gr.Markdown("Page 1 of 1")
232
- next_button = gr.Button("Next Page")
233
-
234
- # Hidden States
235
- current_page_state = gr.State(1)
236
- total_pages_state = gr.State(1)
237
- papers_state = gr.State([])
238
-
239
- # Initialize the app on load
240
- demo.load(
241
- initialize,
242
- outputs=[paper_list, current_page_state, total_pages_state, papers_state, page_info]
243
- )
244
-
245
- # Search Functionality
246
- search_input.submit(
247
- search_papers,
248
- inputs=[search_input, papers_state],
249
- outputs=[paper_list, current_page_state, total_pages_state, papers_state, page_info]
250
- )
251
- search_input.change(
252
- search_papers,
253
- inputs=[search_input, papers_state],
254
- outputs=[paper_list, current_page_state, total_pages_state, papers_state, page_info]
255
- )
256
-
257
- # Refresh Functionality
258
- refresh_button.click(
259
- refresh_papers,
260
- inputs=[current_page_state, search_input],
261
- outputs=[paper_list, current_page_state, total_pages_state, papers_state, page_info]
262
- )
263
-
264
- # Pagination Buttons
265
- prev_button.click(
266
- go_prev,
267
- inputs=[current_page_state, total_pages_state, papers_state, search_input],
268
- outputs=[paper_list, current_page_state, total_pages_state, papers_state, page_info]
269
- )
270
- next_button.click(
271
- go_next,
272
- inputs=[current_page_state, total_pages_state, papers_state, search_input],
273
- outputs=[paper_list, current_page_state, total_pages_state, papers_state, page_info]
274
- )
275
-
276
- # Launch the Gradio app
277
- demo.launch()
 
14
  def fetch_papers(self):
15
  """
16
  Fetch papers from the API if not already fetched today.
17
+ Returns:
18
+ tuple: (success: bool, data: list, error_message: str)
19
  """
20
  today = datetime.now(timezone.utc).date()
21
  if self.last_fetch_date == today and self.cache:
22
  print("Using cached papers.")
23
+ return True, self.cache, ""
24
  else:
25
  try:
26
  # Attempt to fetch all papers at once. Adjust 'limit' as per API's capability.
 
31
  self.last_fetch_date = today
32
  self.total_pages = (len(self.cache) + self.papers_per_page - 1) // self.papers_per_page
33
  print(f"Fetched {len(self.cache)} papers. Total pages: {self.total_pages}")
34
+ return True, self.cache, ""
35
  except requests.RequestException as e:
36
  print(f"Error fetching papers: {e}")
37
+ return False, [], str(e)
38
 
39
  def format_paper(self, paper):
40
  """
 
53
  except ValueError:
54
  time_ago = "Unknown"
55
 
 
56
  return f"""<div style='border-bottom: 1px solid #eee; padding: 10px 0;'>
57
  <a href='{url}' target='_blank' style='color: #000; text-decoration: none; font-weight: bold;'>{title}</a>
58
  <div style='font-size: 0.8em; color: #666; margin-top: 5px;'>
 
121
  align-items: center;
122
  margin-top: 10px;
123
  }
124
+ .error-message {
125
+ color: red;
126
+ margin-bottom: 10px;
127
+ text-align: center;
128
+ }
129
  """
130
 
131
  # Instantiate the PaperManager
 
135
  """
136
  Initialize the app by fetching papers and setting initial states.
137
  """
138
+ success, papers, error_message = paper_manager.fetch_papers()
139
  if success:
 
140
  page = 1
141
  total_pages = paper_manager.total_pages
142
  page_papers = paper_manager.render_papers(papers, page)
143
  page_info_text = f"Page {page} of {total_pages}"
144
+ return page_papers, page, total_pages, papers, page_info_text, ""
145
  else:
146
+ error_html = f"<div class='error-message'>Error fetching papers: {error_message}</div>"
147
+ return error_html, 1, 1, [], "Page 1 of 1", error_message
148
 
149
  def refresh_papers(current_page, query):
150
  """
151
  Refresh the papers. Fetch new data if a new day has started.
152
  """
153
+ success, papers, error_message = paper_manager.fetch_papers()
154
  if success:
155
  # Reset to first page on refresh
156
  new_page = 1
 
159
  total_pages = (len(filtered) + paper_manager.papers_per_page - 1) // paper_manager.papers_per_page if filtered else 1
160
  page_papers = paper_manager.render_papers(filtered, new_page)
161
  page_info_text = f"Page {new_page} of {total_pages}"
162
+ return page_papers, new_page, total_pages, filtered, page_info_text, ""
163
  else:
164
  papers = paper_manager.cache
165
  total_pages = paper_manager.total_pages
166
  page_papers = paper_manager.render_papers(papers, new_page)
167
  page_info_text = f"Page {new_page} of {total_pages}"
168
+ return page_papers, new_page, total_pages, papers, page_info_text, ""
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
169
  else:
170
+ error_html = f"<div cla