diff --git a/API.py b/API.py index e37b8a9..e3c38ca 100644 --- a/API.py +++ b/API.py @@ -1,4 +1,5 @@ import httpx +import Utils class Fetcher: @@ -12,9 +13,10 @@ class Fetcher: def getUnreadCounts(self): 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"], Utils.timestampToDate( + item["newestItemTimestampUsec"]))) for item in response.json()["unreadcounts"]]) 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], "date": self.unreadCounts[item][2]} for item in self.unreadCounts.keys() if item[0:13] == "user/-/label/"] def getSubscriptions(self): diff --git a/App.py b/App.py index 009204a..1515e69 100644 --- a/App.py +++ b/App.py @@ -1,15 +1,19 @@ import urwid import yaml +import asyncio +import warnings from concurrent.futures import ThreadPoolExecutor from API import Fetcher from Render import Article -import asyncio +import Utils +warnings.filterwarnings("ignore") 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"])]), + items = [urwid.AttrMap(urwid.Columns([ + (16, urwid.Text(category["date"])), urwid.Text(category["name"]), (5, urwid.Text(str(category["count"])))]), (category["id"], category["count"]), "reveal focus") for category in categories] walker = urwid.SimpleListWalker(items) self.body = walker @@ -77,8 +81,10 @@ class LeftPane(urwid.ListBox): self.categoryPosition = idx categoryId = focus_widget.attr_map[None][0] 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] + feedItems = [urwid.AttrMap(urwid.Columns([(16, urwid.Text(tui.fetcher.unreadCounts[feed["id"]][2])), + urwid.Text(feed["title"]), + (5, urwid.Text(str(tui.fetcher.unreadCounts[feed["id"]][0])))]), + feed["id"], "reveal focus") for feed in feeds] walker = urwid.SimpleListWalker(feedItems) self.body = walker tui.leftBox.set_title(categoryId[13:]) @@ -90,8 +96,9 @@ class LeftPane(urwid.ListBox): elif key in ("h", "left"): 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] + items = [urwid.AttrMap(urwid.Columns([ + (16, urwid.Text(category["date"])), urwid.Text(category["name"]), (5, urwid.Text(str(category["count"])))]), + (category["id"], category["count"]), "reveal focus") for category in tui.fetcher.categories] walker = urwid.SimpleFocusListWalker(items) self.body = walker tui.leftBox.set_title("Categories") @@ -114,8 +121,14 @@ class RightPane(urwid.ListBox): self.chunkNumber = 0 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] + items = [ + urwid.AttrMap( + urwid.Columns( + [(2, urwid.Text("")), + (16, urwid.Text(Utils.timestampToDate(article["timestampUsec"]))), + urwid.Text(article["title"])]), + article["id"], + "reveal focus") for article in articles] walker = urwid.SimpleListWalker(items) self.body = walker @@ -208,7 +221,7 @@ class TUI(urwid.Frame): self.leftBox = urwid.LineBox(self.feedView, title="Categories") self.rightBox = urwid.LineBox(self.articleView, title="Articles") self.views = urwid.Columns( - [(40, self.leftBox), self.rightBox]) + [(56, self.leftBox), self.rightBox]) self.status = urwid.Text("") self.footer = urwid.ListBox([self.status]) self.container = urwid.Pile([self.views, (1, self.footer)]) @@ -238,6 +251,8 @@ class TUI(urwid.Frame): if key == "tab": self.activePane = not self.activePane self.views.set_focus(int(self.activePane)) + if self.activePane: + tui.articleView.isList = True elif key == "q": raise urwid.ExitMainLoop() elif key == "r": diff --git a/Render.py b/Render.py index b73835f..51e5c9d 100644 --- a/Render.py +++ b/Render.py @@ -1,14 +1,16 @@ from inscriptis import get_text import os +import Utils class Article: def __init__(self, articleObj): self.text = get_text(articleObj["summary"]["content"]) self.title = articleObj["title"] + self.date = Utils.timestampToDate(articleObj["timestampUsec"]) self.currentPageNumber = 1 terminal_width, terminal_height = os.get_terminal_size() - terminal_width -= 60 + terminal_width -= 76 terminal_height -= 1 start_of_chunk = 0 end_of_chunk = 0 diff --git a/Utils.py b/Utils.py new file mode 100644 index 0000000..bf23072 --- /dev/null +++ b/Utils.py @@ -0,0 +1,5 @@ +from datetime import datetime + + +def timestampToDate(ts): + return datetime.fromtimestamp(int(ts)/1000000).strftime("%y-%m-%d %H:%M")