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']})")