Show
This commit is contained in:
parent
cbeadbd302
commit
26353a2779
3 changed files with 91 additions and 0 deletions
23
cry/cli.py
23
cry/cli.py
|
|
@ -117,3 +117,26 @@ def refresh(url):
|
||||||
new_count = new_count + db.store_feed(f)
|
new_count = new_count + db.store_feed(f)
|
||||||
|
|
||||||
click.echo(f"Fetched {new_count} new entries.")
|
click.echo(f"Fetched {new_count} new entries.")
|
||||||
|
|
||||||
|
|
||||||
|
@cli.command(name="show")
|
||||||
|
def show():
|
||||||
|
"""Show feeds."""
|
||||||
|
|
||||||
|
db = database.Database.local()
|
||||||
|
feeds = db.load_all()
|
||||||
|
|
||||||
|
def feed_sort_key(f: feed.Feed) -> int:
|
||||||
|
if len(f.entries) > 0:
|
||||||
|
return max(e.inserted_at for e in f.entries)
|
||||||
|
return -1
|
||||||
|
|
||||||
|
feeds.sort(key=feed_sort_key)
|
||||||
|
for f in feeds:
|
||||||
|
click.echo(f"{f.title}")
|
||||||
|
if len(f.entries) > 0:
|
||||||
|
for entry in f.entries:
|
||||||
|
click.echo(f" {entry.title}")
|
||||||
|
else:
|
||||||
|
click.echo(f" <No Entries>")
|
||||||
|
click.echo()
|
||||||
|
|
|
||||||
|
|
@ -153,6 +153,72 @@ class Database:
|
||||||
for url, last_fetched_ts, retry_after_ts, status, etag, modified in rows
|
for url, last_fetched_ts, retry_after_ts, status, etag, modified in rows
|
||||||
]
|
]
|
||||||
|
|
||||||
|
def load_all(self, feed_limit: int = 20) -> list[feed.Feed]:
|
||||||
|
cursor = self.db.execute(
|
||||||
|
"""
|
||||||
|
SELECT
|
||||||
|
url,
|
||||||
|
last_fetched_ts,
|
||||||
|
retry_after_ts,
|
||||||
|
status,
|
||||||
|
etag,
|
||||||
|
modified,
|
||||||
|
title,
|
||||||
|
link
|
||||||
|
FROM feeds
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
rows = cursor.fetchall()
|
||||||
|
|
||||||
|
almost_feeds = []
|
||||||
|
for row in rows:
|
||||||
|
(
|
||||||
|
url,
|
||||||
|
last_fetched_ts,
|
||||||
|
retry_after_ts,
|
||||||
|
status,
|
||||||
|
etag,
|
||||||
|
modified,
|
||||||
|
title,
|
||||||
|
link,
|
||||||
|
) = row
|
||||||
|
meta = feed.FeedMeta(
|
||||||
|
url=url,
|
||||||
|
last_fetched_ts=last_fetched_ts,
|
||||||
|
retry_after_ts=retry_after_ts,
|
||||||
|
status=status,
|
||||||
|
etag=etag,
|
||||||
|
modified=modified,
|
||||||
|
origin=self.origin,
|
||||||
|
)
|
||||||
|
almost_feeds.append((meta, title, link))
|
||||||
|
|
||||||
|
feeds = []
|
||||||
|
for meta, title, link in almost_feeds:
|
||||||
|
cursor = self.db.execute(
|
||||||
|
"""
|
||||||
|
SELECT
|
||||||
|
id,
|
||||||
|
inserted_at,
|
||||||
|
title,
|
||||||
|
link
|
||||||
|
FROM entries
|
||||||
|
WHERE feed_url=?
|
||||||
|
ORDER BY inserted_at DESC
|
||||||
|
LIMIT ?
|
||||||
|
""",
|
||||||
|
[meta.url, feed_limit],
|
||||||
|
)
|
||||||
|
rows = cursor.fetchall()
|
||||||
|
entries = [
|
||||||
|
feed.Entry(id=id, inserted_at=inserted_at, title=title, link=link)
|
||||||
|
for id, inserted_at, title, link in rows
|
||||||
|
]
|
||||||
|
f = feed.Feed(meta=meta, title=title, link=link, entries=entries)
|
||||||
|
feeds.append(f)
|
||||||
|
|
||||||
|
return feeds
|
||||||
|
|
||||||
def load_feed(self, url: str) -> feed.Feed | None:
|
def load_feed(self, url: str) -> feed.Feed | None:
|
||||||
cursor = self.db.execute(
|
cursor = self.db.execute(
|
||||||
"""
|
"""
|
||||||
|
|
|
||||||
|
|
@ -144,6 +144,7 @@ async def fetch_feed(
|
||||||
Regardless, the new FeedMeta has the latest state of the feed.
|
Regardless, the new FeedMeta has the latest state of the feed.
|
||||||
"""
|
"""
|
||||||
if feed.status == FEED_STATUS_DEAD:
|
if feed.status == FEED_STATUS_DEAD:
|
||||||
|
LOG.info(f"{feed.url} is dead")
|
||||||
return (None, feed)
|
return (None, feed)
|
||||||
|
|
||||||
if time.time() < feed.retry_after_ts:
|
if time.time() < feed.retry_after_ts:
|
||||||
|
|
@ -198,6 +199,7 @@ async def fetch_feed(
|
||||||
# permanently redirected URL, not just whatever the last thing
|
# permanently redirected URL, not just whatever the last thing
|
||||||
# is... e.g. imagine a permanent followed by a temporary
|
# is... e.g. imagine a permanent followed by a temporary
|
||||||
# redirect, then what?
|
# redirect, then what?
|
||||||
|
LOG.info(f"{feed.url} permanently redirected to {response.url}")
|
||||||
assert response.url is not None
|
assert response.url is not None
|
||||||
feed = dataclasses.replace(feed, url=response.url)
|
feed = dataclasses.replace(feed, url=response.url)
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue