- Implement fetching articles by categories.

- Implement displaying articles by categories and by feeds.
master
VikingKong 3 years ago
parent 06bd2ef61a
commit a0dd71637f

@ -8,6 +8,7 @@ class Fetcher:
self.headers = {"Authorization": "GoogleLogin auth="+token}
self.getUnreadCounts()
self.getSubscriptions()
self.articles = {}
def getUnreadCounts(self):
response = requests.get(self.URL+"/reader/api/0/unread-count?output=json", headers=self.headers)
@ -22,3 +23,11 @@ class Fetcher:
def feedsFromCategory(self, category):
return [item for item in self.feeds if item["categories"][0]["id"] == category]
def articlesFromCategory(self, category, number):
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)
self.articles[category] = response.json()["items"]
def articlesFromFeed(self, feed, category):
return [article for article in self.articles[category] if article["origin"]["streamId"] == feed]

@ -8,10 +8,30 @@ class LeftPane(urwid.ListBox):
def __init__(self, categories):
super().__init__(self)
items = [urwid.AttrMap(urwid.Columns([(5, urwid.Text(str(category["count"]))), urwid.Text(category["name"])]),
category["id"], "reveal focus") for category in categories]
(category["id"], category["count"]), "reveal focus") for category in categories]
walker = urwid.SimpleListWalker(items)
self.body = walker
self.categoryPosition = 0
self.isCategoryView = True
self.currentCategory = ""
def getArticlesFromCategory(self, category, number):
tui.fetcher.articlesFromCategory(category[13:], str(number))
articles = tui.fetcher.articles[category[13:]]
return articles
def getArticlesFromFeed(self, feed):
return tui.fetcher.articlesFromFeed(feed, self.currentCategory[13:])
def getArticles(self, attrMap):
if self.isCategoryView:
itemId = attrMap[0]
number = attrMap[1]
tui.fetcher.articlesFromCategory(itemId[13:], str(number))
return tui.fetcher.articles[itemId[13:]]
else:
itemId = attrMap
return tui.fetcher.articlesFromFeed(itemId, self.currentCategory[13:])
def keypress(self, size, key):
if key in ("j", "down"):
@ -20,40 +40,63 @@ class LeftPane(urwid.ListBox):
if idx < item_size - 1:
idx = idx + 1
self.set_focus(idx)
focus_widget, idx = self.get_focus()
articles = self.getArticles(focus_widget.attr_map[None])
tui.articles.fill(articles)
return
elif key in ("k", "up"):
focus_widget, idx = self.get_focus()
if idx > 0:
idx = idx - 1
self.set_focus(idx)
focus_widget, idx = self.get_focus()
articles = self.getArticles(focus_widget.attr_map[None])
tui.articles.fill(articles)
return
elif key in ("l", "right"):
focus_widget, idx = self.get_focus()
self.categoryPosition = idx
itemId = focus_widget.attr_map[None]
feeds = tui.fetcher.feedsFromCategory(itemId)
feedItems = [urwid.AttrMap(urwid.Columns([(5, urwid.Text(str(tui.fetcher.unreadCounts[feed["id"]][0]))),
urwid.Text(feed["title"])]), feed["id"], "reveal focus") for feed in feeds]
walker = urwid.SimpleListWalker(feedItems)
self.body = walker
tui.leftBox.set_title(itemId[13:])
if self.isCategoryView:
self.isCategoryView = False
focus_widget, idx = self.get_focus()
self.categoryPosition = idx
categoryId = focus_widget.attr_map[None][0]
self.currentCategory = categoryId
feeds = tui.fetcher.feedsFromCategory(categoryId)
feedItems = [urwid.AttrMap(urwid.Columns([(5, urwid.Text(str(tui.fetcher.unreadCounts[feed["id"]][0]))),
urwid.Text(feed["title"])]), feed["id"], "reveal focus") for feed in feeds]
walker = urwid.SimpleListWalker(feedItems)
self.body = walker
tui.leftBox.set_title(categoryId[13:])
focus_widget, idx = self.get_focus()
articles = self.getArticles(focus_widget.attr_map[None])
tui.articles.fill(articles)
return
elif key in ("h", "left"):
items = [urwid.AttrMap(urwid.Columns([(5, urwid.Text(str(category["count"]))), urwid.Text(category["name"])]),
category["id"], "reveal focus") for category in tui.fetcher.categories]
walker = urwid.SimpleFocusListWalker(items)
self.body = walker
tui.leftBox.set_title("Categories")
tui.feeds.set_focus(self.categoryPosition)
if not self.isCategoryView:
self.isCategoryView = True
items = [urwid.AttrMap(urwid.Columns([(5, urwid.Text(str(category["count"]))), urwid.Text(category["name"])]),
(category["id"], category["count"]), "reveal focus") for category in tui.fetcher.categories]
walker = urwid.SimpleFocusListWalker(items)
self.body = walker
tui.leftBox.set_title("Categories")
self.set_focus(self.categoryPosition)
focus_widget, idx = self.get_focus()
articles = self.getArticles(focus_widget.attr_map[None])
tui.articles.fill(articles)
return
return super().keypress(size, key)
class Items(urwid.ListBox):
class RightPane(urwid.ListBox):
def __init__(self, items):
super().__init__(self)
walker = urwid.SimpleListWalker([urwid.AttrMap(item, None, 'reveal focus') for item in items])
walker = urwid.SimpleListWalker([])
self.body = walker
def fill(self, articles):
items = [urwid.AttrMap(urwid.Columns([(2, urwid.Text("N")), urwid.Text(article["title"])]),
article["id"], "reveal focus") for article in articles]
walker = urwid.SimpleListWalker(items)
self.body = walker
def keypress(self, size, key):
@ -122,7 +165,7 @@ class TUI(urwid.Frame):
self.loop = None
self.articleItems = [urwid.Text("Article# " + str(i)) for i in range(0, 10)]
self.feeds = LeftPane(self.fetcher.categories)
self.articles = Items(self.articleItems)
self.articles = RightPane([])
self.leftBox = urwid.LineBox(self.feeds, title="Categories")
self.container = urwid.Columns(
[(40, self.leftBox),
@ -132,6 +175,12 @@ class TUI(urwid.Frame):
super().__init__(self.body)
def run(self):
focus_widget, idx = self.feeds.get_focus()
itemId = focus_widget.attr_map[None][0]
number = focus_widget.attr_map[None][1]
tui.fetcher.articlesFromCategory(itemId[13:], str(number))
articles = tui.fetcher.articles[itemId[13:]]
self.articles.fill(articles)
self.loop.run()
self.executor.shutdown(wait=False)

Loading…
Cancel
Save