From a0dd71637f771c1f9e97b6343a71ca37bd8bb713 Mon Sep 17 00:00:00 2001 From: VikingKong Date: Thu, 24 Nov 2022 01:29:05 +0300 Subject: [PATCH] - Implement fetching articles by categories. - Implement displaying articles by categories and by feeds. --- API.py | 9 ++++++ App.py | 87 +++++++++++++++++++++++++++++++++++++++++++++------------- 2 files changed, 77 insertions(+), 19 deletions(-) diff --git a/API.py b/API.py index ee8792d..691ae33 100644 --- a/API.py +++ b/API.py @@ -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] diff --git a/App.py b/App.py index 14964ba..3eae3e8 100644 --- a/App.py +++ b/App.py @@ -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)