Implement smooth async scrolling through the categories.

master
VikingKong 3 years ago
parent 422365724e
commit 89e74508e6

@ -1,4 +1,4 @@
import requests import httpx
class Fetcher: class Fetcher:
@ -11,26 +11,38 @@ class Fetcher:
self.articles = {} self.articles = {}
def getUnreadCounts(self): def getUnreadCounts(self):
response = requests.get(self.URL+"/reader/api/0/unread-count?output=json", headers=self.headers) response = httpx.get(self.URL+"/reader/api/0/unread-count?output=json", headers=self.headers)
result = dict([(item["id"], (item["count"], item["newestItemTimestampUsec"])) for item in response.json()["unreadcounts"]]) result = dict([(item["id"], (item["count"], item["newestItemTimestampUsec"])) for item in response.json()["unreadcounts"]])
self.unreadCounts = result self.unreadCounts = result
self.categories = [{"id": item, "name": item[13:], "count": self.unreadCounts[item][0]} self.categories = [{"id": item, "name": item[13:], "count": self.unreadCounts[item][0]}
for item in self.unreadCounts.keys() if item[0:13] == "user/-/label/"] for item in self.unreadCounts.keys() if item[0:13] == "user/-/label/"]
def getSubscriptions(self): def getSubscriptions(self):
response = requests.get(self.URL+"/reader/api/0/subscription/list?output=json", headers=self.headers) response = httpx.get(self.URL+"/reader/api/0/subscription/list?output=json", headers=self.headers)
self.feeds = response.json()["subscriptions"] self.feeds = response.json()["subscriptions"]
def checkCategory(self, category):
return category in self.articles.keys()
def feedsFromCategory(self, category): def feedsFromCategory(self, category):
return [item for item in self.feeds if item["categories"][0]["id"] == category and self.unreadCounts[item["id"]][0] != 0] return [item for item in self.feeds if item["categories"][0]["id"] == category and self.unreadCounts[item["id"]][0] != 0]
def articlesFromCategory(self, category, number): def articlesFromCategory(self, category, number):
if category not in self.articles: if category not in self.articles:
response = requests.get(self.URL+"/reader/api/0/stream/contents?n="+number+"&s=user/-/label/"+category, headers=self.headers) response = httpx.get(self.URL+"/reader/api/0/stream/contents?n="+number+"&s=user/-/label/"+category, headers=self.headers)
self.articles[category] = response.json()["items"]
async def articlesFromCategoryAsync(self, category, number):
if category not in self.articles:
response = await httpx.AsyncClient().get(self.URL+"/reader/api/0/stream/contents?n="+number +
"&s=user/-/label/"+category, headers=self.headers)
self.articles[category] = response.json()["items"] self.articles[category] = response.json()["items"]
def articlesFromFeed(self, feed, category): def articlesFromFeed(self, feed, category):
return [article for article in self.articles[category] if article["origin"]["streamId"] == feed] try:
return [article for article in self.articles[category] if article["origin"]["streamId"] == feed]
except BaseException:
return None
def fetch(self): def fetch(self):
for category in self.categories: for category in self.categories:

@ -3,6 +3,7 @@ import yaml
from concurrent.futures import ThreadPoolExecutor from concurrent.futures import ThreadPoolExecutor
from API import Fetcher from API import Fetcher
from Render import Article from Render import Article
import asyncio
class LeftPane(urwid.ListBox): class LeftPane(urwid.ListBox):
@ -27,15 +28,21 @@ class LeftPane(urwid.ListBox):
def getArticlesFromFeed(self, feed): def getArticlesFromFeed(self, feed):
return tui.fetcher.articlesFromFeed(feed, self.currentCategory[13:]) return tui.fetcher.articlesFromFeed(feed, self.currentCategory[13:])
def getArticles(self, attrMap): async def setCategoryArticles(self, attrMap):
if self.isCategoryView: itemId = attrMap[0]
itemId = attrMap[0] number = attrMap[1]
number = attrMap[1] await tui.fetcher.articlesFromCategoryAsync(itemId[13:], str(number))
tui.fetcher.articlesFromCategory(itemId[13:], str(number)) focus_widget, idx = self.get_focus()
return tui.fetcher.articles[itemId[13:]] currentCategory = focus_widget.attr_map[None][0]
else: if itemId == currentCategory:
itemId = attrMap tui.articles = tui.fetcher.articles[currentCategory[13:]]
return tui.fetcher.articlesFromFeed(itemId, self.currentCategory[13:]) tui.articleView.fill(tui.articles)
def setFeedArticles(self, attrMap):
itemId = attrMap
tui.articles = tui.fetcher.articlesFromFeed(itemId, self.currentCategory[13:])
if tui.articles is not None:
tui.articleView.fill(tui.articles)
def keypress(self, size, key): def keypress(self, size, key):
if key in ("j", "down"): if key in ("j", "down"):
@ -47,8 +54,9 @@ class LeftPane(urwid.ListBox):
focus_widget, idx = self.get_focus() focus_widget, idx = self.get_focus()
if self.isCategoryView: if self.isCategoryView:
self.currentCategory = focus_widget.attr_map[None][0] self.currentCategory = focus_widget.attr_map[None][0]
tui.articles = self.getArticles(focus_widget.attr_map[None]) asyncio.create_task(self.setCategoryArticles(focus_widget.attr_map[None]))
tui.articleView.fill(tui.articles) else:
self.setFeedArticles(focus_widget.attr_map[None])
return return
elif key in ("k", "up"): elif key in ("k", "up"):
focus_widget, idx = self.get_focus() focus_widget, idx = self.get_focus()
@ -58,11 +66,12 @@ class LeftPane(urwid.ListBox):
focus_widget, idx = self.get_focus() focus_widget, idx = self.get_focus()
if self.isCategoryView: if self.isCategoryView:
self.currentCategory = focus_widget.attr_map[None][0] self.currentCategory = focus_widget.attr_map[None][0]
tui.articles = self.getArticles(focus_widget.attr_map[None]) asyncio.create_task(self.setCategoryArticles(focus_widget.attr_map[None]))
tui.articleView.fill(tui.articles) else:
self.setFeedArticles(focus_widget.attr_map[None])
return return
elif key in ("l", "right"): elif key in ("l", "right"):
if self.isCategoryView: if self.isCategoryView and tui.fetcher.checkCategory(self.currentCategory[13:]):
self.isCategoryView = False self.isCategoryView = False
focus_widget, idx = self.get_focus() focus_widget, idx = self.get_focus()
self.categoryPosition = idx self.categoryPosition = idx
@ -76,8 +85,7 @@ class LeftPane(urwid.ListBox):
focus_widget, idx = self.get_focus() focus_widget, idx = self.get_focus()
if self.isCategoryView: if self.isCategoryView:
self.currentCategory = focus_widget.attr_map[None][0] self.currentCategory = focus_widget.attr_map[None][0]
tui.articles = self.getArticles(focus_widget.attr_map[None]) self.setFeedArticles(focus_widget.attr_map[None])
tui.articleView.fill(tui.articles)
return return
elif key in ("h", "left"): elif key in ("h", "left"):
if not self.isCategoryView: if not self.isCategoryView:
@ -89,8 +97,7 @@ class LeftPane(urwid.ListBox):
tui.leftBox.set_title("Categories") tui.leftBox.set_title("Categories")
self.set_focus(self.categoryPosition) self.set_focus(self.categoryPosition)
focus_widget, idx = self.get_focus() focus_widget, idx = self.get_focus()
tui.articles = self.getArticles(focus_widget.attr_map[None]) tui.articles = self.setCategoryArticles(focus_widget.attr_map[None])
tui.articleView.fill(tui.articles)
return return
return super().keypress(size, key) return super().keypress(size, key)
@ -224,9 +231,7 @@ class TUI(urwid.Frame):
self.fetcher.articlesFromCategory(item, str(focus_widget.attr_map[None][1])) self.fetcher.articlesFromCategory(item, str(focus_widget.attr_map[None][1]))
self.articles = tui.fetcher.articles[item] self.articles = tui.fetcher.articles[item]
self.articleView.fill(self.articles) self.articleView.fill(self.articles)
self.handle = self.loop.event_loop.alarm(0, self.fetchAll)
self.loop.run() self.loop.run()
tui.loop.event_loop.remove_enter_idle(self.handle)
self.executor.shutdown(wait=False) self.executor.shutdown(wait=False)
def unhandled_input(self, key): def unhandled_input(self, key):
@ -236,7 +241,7 @@ class TUI(urwid.Frame):
elif key == "q": elif key == "q":
raise urwid.ExitMainLoop() raise urwid.ExitMainLoop()
elif key == "r": elif key == "r":
self.fetchAll() self.handle = self.loop.event_loop.alarm(0, self.fetchAll)
focus_widget, idx = self.feedView.get_focus() focus_widget, idx = self.feedView.get_focus()
itemId = focus_widget.attr_map[None][0] itemId = focus_widget.attr_map[None][0]
self.articles = tui.fetcher.articles[itemId[13:]] self.articles = tui.fetcher.articles[itemId[13:]]

Loading…
Cancel
Save