You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

103 lines
4.4 KiB

from _rss import RSSReader
import streamlit as st
from _base_class import StreamlitBaseClass
from colorprinter.print_color import *
class RSSFeedsPage(StreamlitBaseClass):
def __init__(self, username: str):
super().__init__(username=username)
self.page_name = "RSS Feeds"
self.reader = RSSReader(username=username)
# Initialize attributes from session state if available
for k, v in st.session_state.get(self.page_name, {}).items():
setattr(self, k, v)
def run(self):
if "selected_feed" not in st.session_state:
st.session_state["selected_feed"] = None
self.update_current_page(self.page_name)
self.display_feed()
self.sidebar_actions()
self.update_session_state(page_name=self.page_name)
def select_rss_feeds(self):
rss_feeds = self.reader.get_rss_feeds()
if rss_feeds:
feed_options = [feed["title"] for feed in rss_feeds]
with st.sidebar:
st.subheader("Show your feeds")
selected_feed_title = st.selectbox(
"Select a feed", options=feed_options, index=None
)
if selected_feed_title:
st.session_state["selected_feed"] = [
feed["_key"]
for feed in rss_feeds
if feed["title"] == selected_feed_title
][0]
st.rerun()
else:
st.write("You have no RSS feeds added.")
def search_feeds(self, rss_url):
with st.spinner("Discovering feeds..."):
feeds = self.reader.discover_feeds(rss_url)
if feeds:
st.session_state["discovered_feeds"] = feeds
else:
st.error("No RSS feeds found at the provided URL.")
def sidebar_actions(self):
if "discovered_feeds" not in st.session_state:
st.session_state["discovered_feeds"] = None
with st.sidebar:
self.select_rss_feeds()
st.subheader("Add a New RSS Feed")
with st.form("add_rss_feed"):
rss_url = st.text_input("Website URL or RSS Feed URL")
submitted = st.form_submit_button("Discover Feeds")
if submitted:
print_green(rss_url)
feeds = self.reader.discover_feeds(rss_url)
st.session_state["discovered_feeds"] = feeds
if st.session_state["discovered_feeds"]:
st.subheader("Select a Feed to Add")
feeds = st.session_state["discovered_feeds"]
feed_options = [f"{feed['title']} ({feed['href']})" for feed in feeds]
selected_feed = st.selectbox("Available Feeds", options=feed_options)
selected_feed_url = feeds[feed_options.index(selected_feed)]["href"]
if st.button("Preview Feed"):
feed = self.reader.parse_feed(selected_feed_url)
st.write(f"{feed.title}")
description = self.reader.html_to_markdown(feed.description)
st.write(f"_{description}_")
for entry in feed.entries[:5]:
with st.expander(entry["title"]):
summary = entry.get("summary", "No summary available")
markdown_summary = self.reader.html_to_markdown(summary)
st.markdown(markdown_summary)
print_yellow(selected_feed_url)
if st.button(
"Add RSS Feed",
on_click=self.reader.add_rss_feed,
args=[selected_feed_url],
):
del st.session_state["discovered_feeds"]
st.success("RSS Feed added.")
st.rerun()
def display_feed(self):
if st.session_state["selected_feed"]:
self.reader.get_feed(st.session_state["selected_feed"])
st.title(self.reader.feed.title)
st.write(f"_{self.reader.feed.description}_")
for entry in self.reader.feed.entries[:5]:
with st.expander(entry["title"]):
summary = entry.get("summary", "No summary available")
markdown_summary = self.reader.html_to_markdown(summary)
st.markdown(markdown_summary)
st.markdown(f"[Read more]({entry['link']})")