akhaliq HF Staff commited on
Commit
92a4d78
·
verified ·
1 Parent(s): fdfad28

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +75 -41
app.py CHANGED
@@ -7,24 +7,21 @@ API_URL = "https://huggingface.co/api/daily_papers"
7
  class PaperManager:
8
  def __init__(self, papers_per_page=10):
9
  self.papers_per_page = papers_per_page
10
- self.current_page = 1
11
- self.papers = []
12
- self.total_pages = 1
13
 
14
  def fetch_papers(self, page=1):
15
  try:
16
  response = requests.get(f"{API_URL}?page={page}&limit={self.papers_per_page}")
17
  response.raise_for_status()
18
  data = response.json()
19
- self.papers = sorted(data, key=lambda x: x.get('paper', {}).get('upvotes', 0), reverse=True)
20
 
21
  # Update total_pages based on the 'X-Total-Pages' header if available
22
- self.total_pages = int(response.headers.get('X-Total-Pages', self.total_pages))
23
 
24
- return True
25
  except requests.RequestException as e:
26
  print(f"Error fetching papers: {e}")
27
- return False
28
 
29
  def format_paper(self, paper):
30
  title = paper.get('title', 'No title')
@@ -32,7 +29,9 @@ class PaperManager:
32
  authors = ', '.join([author.get('name', '') for author in paper['paper'].get('authors', [])])
33
  upvotes = paper.get('paper', {}).get('upvotes', 0)
34
  comments = paper.get('numComments', 0)
35
- published_time = datetime.fromisoformat(paper.get('publishedAt', datetime.now(timezone.utc).isoformat()).replace('Z', '+00:00'))
 
 
36
  time_ago = (datetime.now(timezone.utc) - published_time).days
37
 
38
  return f"""<div style='border-bottom: 1px solid #eee; padding: 10px 0;'>
@@ -42,33 +41,18 @@ class PaperManager:
42
  </div>
43
  </div>"""
44
 
45
- def render_papers(self):
46
- if not self.fetch_papers(self.current_page):
47
- return "<div>Failed to fetch papers. Please try again later.</div>"
48
-
49
- if not self.papers:
50
  return "<div>No papers available for this page.</div>"
51
 
52
- return "".join([self.format_paper(paper) for paper in self.papers])
53
 
54
- def search_papers(self, query):
55
  if not query:
56
- self.current_page = 1
57
- return self.render_papers()
58
 
59
- self.fetch_papers(self.current_page) # Ensure we have the latest data
60
- filtered_papers = [paper for paper in self.papers if query.lower() in paper.get('title', '').lower()]
61
- return "".join([self.format_paper(paper) for paper in filtered_papers])
62
-
63
- def next_page(self):
64
- if self.current_page < self.total_pages:
65
- self.current_page += 1
66
- return self.render_papers(), f"Page {self.current_page} of {self.total_pages}"
67
-
68
- def prev_page(self):
69
- if self.current_page > 1:
70
- self.current_page -= 1
71
- return self.render_papers(), f"Page {self.current_page} of {self.total_pages}"
72
 
73
  css = """
74
  html, body {
@@ -116,9 +100,37 @@ html, body {
116
 
117
  paper_manager = PaperManager()
118
 
119
- def refresh_papers():
120
- paper_manager.current_page = 1
121
- return paper_manager.render_papers(), f"Page {paper_manager.current_page} of {paper_manager.total_pages}"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
122
 
123
  demo = gr.Blocks(css=css)
124
 
@@ -128,16 +140,38 @@ with demo:
128
  with gr.Row(elem_classes=["search-row"]):
129
  search_input = gr.Textbox(label="Search papers", placeholder="Enter search term...")
130
  refresh_button = gr.Button("Refresh")
131
- paper_list = gr.HTML(paper_manager.render_papers(), elem_classes=["paper-list"])
132
 
133
  with gr.Row(elem_classes=["footer"]):
134
  prev_button = gr.Button("Previous Page")
135
- page_info = gr.Markdown(f"Page {paper_manager.current_page} of {paper_manager.total_pages}")
136
  next_button = gr.Button("Next Page")
137
-
138
- search_input.change(paper_manager.search_papers, inputs=[search_input], outputs=[paper_list])
139
- refresh_button.click(refresh_papers, outputs=[paper_list, page_info])
140
- prev_button.click(paper_manager.prev_page, outputs=[paper_list, page_info])
141
- next_button.click(paper_manager.next_page, outputs=[paper_list, page_info])
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
142
 
143
- demo.launch()
 
7
  class PaperManager:
8
  def __init__(self, papers_per_page=10):
9
  self.papers_per_page = papers_per_page
 
 
 
10
 
11
  def fetch_papers(self, page=1):
12
  try:
13
  response = requests.get(f"{API_URL}?page={page}&limit={self.papers_per_page}")
14
  response.raise_for_status()
15
  data = response.json()
16
+ papers = sorted(data, key=lambda x: x.get('paper', {}).get('upvotes', 0), reverse=True)
17
 
18
  # Update total_pages based on the 'X-Total-Pages' header if available
19
+ total_pages = int(response.headers.get('X-Total-Pages', 1))
20
 
21
+ return papers, total_pages
22
  except requests.RequestException as e:
23
  print(f"Error fetching papers: {e}")
24
+ return None, 1
25
 
26
  def format_paper(self, paper):
27
  title = paper.get('title', 'No title')
 
29
  authors = ', '.join([author.get('name', '') for author in paper['paper'].get('authors', [])])
30
  upvotes = paper.get('paper', {}).get('upvotes', 0)
31
  comments = paper.get('numComments', 0)
32
+ published_time = datetime.fromisoformat(
33
+ paper.get('publishedAt', datetime.now(timezone.utc).isoformat()).replace('Z', '+00:00')
34
+ )
35
  time_ago = (datetime.now(timezone.utc) - published_time).days
36
 
37
  return f"""<div style='border-bottom: 1px solid #eee; padding: 10px 0;'>
 
41
  </div>
42
  </div>"""
43
 
44
+ def render_papers(self, papers):
45
+ if not papers:
 
 
 
46
  return "<div>No papers available for this page.</div>"
47
 
48
+ return "".join([self.format_paper(paper) for paper in papers])
49
 
50
+ def search_papers(self, papers, query):
51
  if not query:
52
+ return self.render_papers(papers)
 
53
 
54
+ filtered_papers = [paper for paper in papers if query.lower() in paper.get('title', '').lower()]
55
+ return self.render_papers(filtered_papers)
 
 
 
 
 
 
 
 
 
 
 
56
 
57
  css = """
58
  html, body {
 
100
 
101
  paper_manager = PaperManager()
102
 
103
+ def initialize():
104
+ papers, total_pages = paper_manager.fetch_papers(page=1)
105
+ html = paper_manager.render_papers(papers)
106
+ return html, 1, total_pages, papers # paper_list, current_page, total_pages, papers
107
+
108
+ def refresh_papers(current_page, query):
109
+ papers, total_pages = paper_manager.fetch_papers(page=1)
110
+ if query:
111
+ html = paper_manager.search_papers(papers, query)
112
+ else:
113
+ html = paper_manager.render_papers(papers)
114
+ return html, 1, total_pages, papers
115
+
116
+ def search_papers(query, papers):
117
+ html = paper_manager.search_papers(papers, query)
118
+ return html
119
+
120
+ def change_page(direction, current_page, total_pages, papers, query):
121
+ if direction == "next" and current_page < total_pages:
122
+ new_page = current_page + 1
123
+ elif direction == "prev" and current_page > 1:
124
+ new_page = current_page - 1
125
+ else:
126
+ new_page = current_page # No change if limits are reached
127
+
128
+ papers, total_pages = paper_manager.fetch_papers(page=new_page)
129
+ if query:
130
+ html = paper_manager.search_papers(papers, query)
131
+ else:
132
+ html = paper_manager.render_papers(papers)
133
+ return html, new_page, total_pages, papers
134
 
135
  demo = gr.Blocks(css=css)
136
 
 
140
  with gr.Row(elem_classes=["search-row"]):
141
  search_input = gr.Textbox(label="Search papers", placeholder="Enter search term...")
142
  refresh_button = gr.Button("Refresh")
143
+ paper_list = gr.HTML(elem_classes=["paper-list"])
144
 
145
  with gr.Row(elem_classes=["footer"]):
146
  prev_button = gr.Button("Previous Page")
147
+ page_info = gr.Markdown("Page 1 of 1")
148
  next_button = gr.Button("Next Page")
149
+
150
+ # Hidden states
151
+ current_page_state = gr.State(1)
152
+ total_pages_state = gr.State(1)
153
+ papers_state = gr.State([])
154
+
155
+ # Initialize the app
156
+ demo.load(initialize, outputs=[paper_list, current_page_state, total_pages_state, papers_state])
157
+
158
+ # Search functionality
159
+ search_input.submit(search_papers, inputs=[search_input, papers_state], outputs=[paper_list])
160
+ search_input.change(search_papers, inputs=[search_input, papers_state], outputs=[paper_list])
161
+
162
+ # Refresh functionality
163
+ refresh_button.click(refresh_papers,
164
+ inputs=[current_page_state, search_input],
165
+ outputs=[paper_list, current_page_state, total_pages_state, papers_state])
166
+
167
+ # Previous Page
168
+ prev_button.click(change_page,
169
+ inputs=["prev", current_page_state, total_pages_state, papers_state, search_input],
170
+ outputs=[paper_list, current_page_state, total_pages_state, papers_state])
171
+
172
+ # Next Page
173
+ next_button.click(change_page,
174
+ inputs=["next", current_page_state, total_pages_state, papers_state, search_input],
175
+ outputs=[paper_list, current_page_state, total_pages_state, papers_state])
176
 
177
+ demo.launch()