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