1
0
mirror of https://github.com/ihabunek/toot.git synced 2024-06-23 06:25:26 +00:00

Fetch next statuses when going below last

This commit is contained in:
Ivan Habunek 2018-01-04 14:16:52 +01:00
parent d789d21171
commit 923ac57811
No known key found for this signature in database
GPG Key ID: CDBD63C43A30BB95
2 changed files with 37 additions and 26 deletions

View File

@ -88,21 +88,20 @@ def timeline_home(app, user):
return http.get(app, user, '/api/v1/timelines/home').json()
def _get_next_path(headers):
links = headers.get('Link', '')
matches = re.match('<([^>]+)>; rel="next"', links)
if matches:
url = matches.group(1)
return urlparse(url).path
def timeline_generator(app, user, limit=20):
path = '/api/v1/timelines/home?limit={}'.format(limit)
def get_next_path(headers):
links = headers.get('Link', '')
matches = re.match('<([^>]+)>; rel="next"', links)
if matches:
parsed = urlparse(matches.group(1))
return "?".join([parsed.path, parsed.query])
def timeline_generator(app, user):
next_path = '/api/v1/timelines/home'
while next_path:
response = http.get(app, user, next_path)
while path:
response = http.get(app, user, path)
yield response.json()
next_path = _get_next_path(response.headers)
path = get_next_path(response.headers)
def upload_media(app, user, file):

View File

@ -63,7 +63,7 @@ class TimelineApp:
self.right_width = screen_width - self.left_width
self.top = curses.newwin(2, screen_width, 0, 0)
self.left = curses.newpad(screen_height * 2, self.left_width)
self.left = curses.newpad(screen_height - 4, self.left_width)
self.right = curses.newwin(screen_height - 4, self.right_width, 2, self.left_width)
self.bottom = curses.newwin(2, screen_width, screen_height - 2, 0)
@ -108,8 +108,9 @@ class TimelineApp:
self.clear_bottom_message()
if self.selected + 1 >= len(self.statuses):
self.draw_bottom_message("Cannot move beyond last toot.", Color.GREEN)
return
self.fetch_next()
self.draw_statuses(self.left, self.selected + 1)
self.draw_bottom_status()
old_index = self.selected
new_index = self.selected + 1
@ -125,10 +126,11 @@ class TimelineApp:
self.draw_status_row(self.left, old_status, 3 * old_index - 1, False)
self.draw_status_row(self.left, new_status, 3 * new_index - 1, True)
self.draw_status_details(self.right, new_status)
self.draw_bottom_status(self.bottom, new_index, len(self.statuses))
self.draw_bottom_status()
def fetch_next(self):
try:
self.draw_bottom_message("Loading toots...", Color.BLUE)
statuses = next(self.status_generator)
except StopIteration:
return None
@ -136,6 +138,8 @@ class TimelineApp:
for status in statuses:
self.statuses.append(parse_status(status))
self.draw_bottom_message("Loaded {} toots".format(len(statuses)), Color.GREEN)
return len(statuses)
def full_redraw(self):
@ -154,7 +158,7 @@ class TimelineApp:
self.draw_statuses(self.left)
self.draw_status_details(self.right, self.get_selected_status())
self.draw_usage(self.bottom)
self.draw_bottom_status(self.bottom, self.selected, len(self.statuses))
self.draw_bottom_status()
screen_height, screen_width = self.stdscr.getmaxyx()
self.left.refresh(0, 0, 2, 0, screen_height - 3, self.left_width)
@ -200,11 +204,19 @@ class TimelineApp:
screen_height, screen_width = self.stdscr.getmaxyx()
window.refresh(0, 0, 2, 0, screen_height - 4, self.left_width)
def draw_statuses(self, window):
def draw_statuses(self, window, starting=0):
# Resize window to accomodate statuses if required
height, width = window.getmaxyx()
new_height = len(self.statuses) * 3 + 1
if new_height > height:
window.resize(new_height, width)
window.box()
for index, status in enumerate(self.statuses):
offset = 3 * index - 1
highlight = self.selected == index
self.draw_status_row(window, status, offset, highlight)
if index >= starting:
offset = 3 * index - 1
highlight = self.selected == index
self.draw_status_row(window, status, offset, highlight)
def draw_status_details(self, window, status):
window.erase()
@ -256,16 +268,16 @@ class TimelineApp:
def draw_bottom_message(self, text, color=0):
_, width = self.bottom.getmaxyx()
text = trunc(text, width - 1)
text = trunc(text, width - 1).ljust(width - 1)
self.bottom.addstr(1, 0, text, color)
self.bottom.refresh()
def draw_bottom_status(self, window, index, count):
def draw_bottom_status(self):
_, width = self.bottom.getmaxyx()
text = "Showing toot {} of {}".format(index + 1, count)
text = "Showing toot {} of {}".format(self.selected + 1, len(self.statuses))
text = trunc(text, width - 1).ljust(width - 1)
window.addstr(0, 0, text, Color.WHITE_ON_BLUE | curses.A_BOLD)
window.refresh()
self.bottom.addstr(0, 0, text, Color.WHITE_ON_BLUE | curses.A_BOLD)
self.bottom.refresh()
def parse_status(status):