From a3d33f9354a9bf0019cad97f6ecdb12781af0c43 Mon Sep 17 00:00:00 2001 From: Mars Ultor Date: Tue, 12 Aug 2025 23:26:31 -0500 Subject: [PATCH] should be done now --- .gitignore | 2 + main.py | 372 +++++++++++++++++++++++++++++++++++++++++++++++ rss_notifier.log | 278 +++++++++++++++++++++++++++++++++++ 3 files changed, 652 insertions(+) create mode 100644 .gitignore create mode 100644 main.py create mode 100644 rss_notifier.log diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..362f95a --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +venv/** +config.toml diff --git a/main.py b/main.py new file mode 100644 index 0000000..25e154e --- /dev/null +++ b/main.py @@ -0,0 +1,372 @@ +#!/usr/bin/env python3 +""" +RSS to MQTT Push Notification Script +Reads RSS feeds from config and sends new items as push notifications via MQTT +""" + +import json +import hashlib +import time +import logging +import re +from typing import Set, Dict, Any, Optional +from pathlib import Path +from html import unescape +from html.parser import HTMLParser + +import toml +import feedparser +import paho.mqtt.client as mqtt + + +class HTMLTextExtractor(HTMLParser): + """Simple HTML parser to extract text content""" + def __init__(self): + super().__init__() + self.text_content = [] + + def handle_data(self, data): + self.text_content.append(data.strip()) + + def get_text(self): + return ' '.join(self.text_content).strip() + + +def clean_html_text(html_content: str) -> str: + """Clean HTML content and extract plain text""" + if not html_content: + return "" + + # First unescape HTML entities + text = unescape(html_content) + + # Use HTML parser to extract text + parser = HTMLTextExtractor() + try: + parser.feed(text) + clean_text = parser.get_text() + except Exception: + # Fallback: use regex to strip HTML tags + clean_text = re.sub('<[^<]+?>', '', text) + + # Clean up whitespace + clean_text = re.sub(r'\s+', ' ', clean_text).strip() + + return clean_text + + +class RSSNotificationPusher: + def __init__(self, config_path: str = "config.toml"): + self.config_path = config_path + self.config = self.load_config() + self.seen_items: Dict[str, Set[str]] = {} + self.mqtt_client = None + self.setup_logging() + self.setup_mqtt() + + def setup_logging(self): + """Setup logging configuration""" + logging.basicConfig( + level=logging.INFO, + format='%(asctime)s - %(levelname)s - %(message)s', + handlers=[ + logging.FileHandler('rss_notifier.log'), + logging.StreamHandler() + ] + ) + self.logger = logging.getLogger(__name__) + + def load_config(self) -> Dict[str, Any]: + """Load configuration from TOML file""" + try: + with open(self.config_path, 'r') as f: + config = toml.load(f) + return config + except FileNotFoundError: + self.create_sample_config() + raise FileNotFoundError(f"Config file {self.config_path} not found. Sample created.") + except Exception as e: + raise Exception(f"Error loading config: {e}") + + def create_sample_config(self): + """Create a sample config file""" + sample_config = { + "broker": { + "address": "proliant.lan", + "client_id": "notification-pusher-client", + "topic": "notification-pusher" # MQTT topic + }, + "auth": { + "username": "mqttuser", + "password": "XXXXXXXXX" + }, + "notifications": { + "topic": "rss-feeds", # ntfy.sh topic for notifications + "max_body_length": 150 # Maximum length for notification body + }, + "rss": { + "feeds": [ + "https://feeds.feedburner.com/TechCrunch", + "https://rss.cnn.com/rss/edition.rss", + "https://feeds.bbci.co.uk/news/rss.xml" + ], + "check_interval": 300, # seconds + "max_items_per_feed": 5 # Only check top N items per feed + } + } + + with open(self.config_path, 'w') as f: + toml.dump(sample_config, f) + print(f"Sample config created at {self.config_path}") + + def setup_mqtt(self): + """Setup MQTT client connection""" + try: + self.mqtt_client = mqtt.Client(client_id=self.config["broker"]["client_id"]) + + # Set credentials if provided + if "auth" in self.config: + self.mqtt_client.username_pw_set( + self.config["auth"]["username"], + self.config["auth"]["password"] + ) + + # Setup callbacks + self.mqtt_client.on_connect = self.on_mqtt_connect + self.mqtt_client.on_disconnect = self.on_mqtt_disconnect + self.mqtt_client.on_publish = self.on_mqtt_publish + + # Connect to broker + self.mqtt_client.connect(self.config["broker"]["address"], 1883, 60) + self.mqtt_client.loop_start() + + except Exception as e: + self.logger.error(f"MQTT setup error: {e}") + raise + + def on_mqtt_connect(self, client, userdata, flags, rc): + """MQTT connection callback""" + if rc == 0: + self.logger.info("Connected to MQTT broker") + else: + self.logger.error(f"Failed to connect to MQTT broker: {rc}") + + def on_mqtt_disconnect(self, client, userdata, rc): + """MQTT disconnection callback""" + self.logger.warning("Disconnected from MQTT broker") + + def on_mqtt_publish(self, client, userdata, mid): + """MQTT publish callback""" + self.logger.debug(f"Message published: {mid}") + + def generate_item_id(self, feed_url: str, item: Dict[str, Any]) -> str: + """Generate unique ID for RSS item""" + # Use link if available, otherwise use title + published date + identifier = item.get('link', '') + item.get('title', '') + item.get('published', '') + return hashlib.md5((feed_url + identifier).encode()).hexdigest() + + def parse_rss_feed(self, feed_url: str) -> list: + """Parse RSS feed and return new items (limited to most recent items)""" + try: + self.logger.info(f"Parsing feed: {feed_url}") + feed = feedparser.parse(feed_url) + + if feed.bozo: + self.logger.warning(f"Feed parsing issues for {feed_url}: {feed.bozo_exception}") + + # Initialize seen items set for this feed if not exists + if feed_url not in self.seen_items: + self.seen_items[feed_url] = set() + + # Get max items to check from config (default 5) + max_items = self.config.get("rss", {}).get("max_items_per_feed", 5) + recent_entries = feed.entries[:max_items] + self.logger.debug(f"Processing top {len(recent_entries)} entries from {feed_url}") + + new_items = [] + for entry in recent_entries: + item_id = self.generate_item_id(feed_url, entry) + + if item_id not in self.seen_items[feed_url]: + self.seen_items[feed_url].add(item_id) + new_items.append(entry) + + self.logger.info(f"Found {len(new_items)} new items in {feed_url} (checked top {max_items})") + return new_items + + except Exception as e: + self.logger.error(f"Error parsing feed {feed_url}: {e}") + return [] + + def extract_clean_description(self, entry: Dict[str, Any]) -> str: + """Extract and clean description/summary from RSS entry""" + # Try different fields for content + content_candidates = [ + entry.get('summary', ''), + entry.get('description', ''), + entry.get('content', [{}])[0].get('value', '') if entry.get('content') else '', + entry.get('subtitle', '') + ] + + # Find the first non-empty content + raw_content = "" + for candidate in content_candidates: + if candidate and candidate.strip(): + raw_content = candidate + break + + if not raw_content: + return "No description available" + + # Clean HTML and extract text + clean_text = clean_html_text(raw_content) + + # If still empty after cleaning, try original with basic cleanup + if not clean_text: + clean_text = re.sub(r'<[^>]+>', '', raw_content) + clean_text = re.sub(r'\s+', ' ', clean_text).strip() + + return clean_text or "No description available" + + def create_notification(self, entry: Dict[str, Any], feed_title: str = "") -> Dict[str, Any]: + """Create notification object from RSS entry""" + # Extract and clean title + title = entry.get('title', 'No Title').strip() + title = clean_html_text(title) or title # Clean any HTML in title too + + if feed_title: + title = f"[{feed_title}] {title}" + + # Extract and clean description + body = self.extract_clean_description(entry) + + # Truncate body if too long + max_length = self.config.get("notifications", {}).get("max_body_length", 150) + if len(body) > max_length: + body = body[:max_length-3] + "..." + + # Get notification topic from config (for ntfy.sh) + notification_topic = self.config.get("notifications", {}).get("topic", "rss-feeds") + + # Create notification object matching the Rust struct format + notification = { + "title": title, + "body": body, + "topic": notification_topic # This is the ntfy.sh topic + } + + # Add link if available + if 'link' in entry and entry['link'].strip(): + notification["link"] = entry['link'].strip() + + return notification + + def send_notification(self, notification: Dict[str, Any]): + """Send notification via MQTT""" + try: + payload = json.dumps(notification, ensure_ascii=False) + result = self.mqtt_client.publish( + self.config["broker"]["topic"], + payload, + qos=1 + ) + + if result.rc == mqtt.MQTT_ERR_SUCCESS: + self.logger.info(f"Notification sent: {notification['title'][:50]}...") + self.logger.debug(f"Full notification: {notification}") + else: + self.logger.error(f"Failed to send notification: {result.rc}") + + except Exception as e: + self.logger.error(f"Error sending notification: {e}") + + def process_feeds(self): + """Process all RSS feeds and send notifications for new items""" + feeds = self.config.get("rss", {}).get("feeds", []) + + if not feeds: + self.logger.warning("No RSS feeds configured") + return + + for feed_url in feeds: + try: + # Parse feed + feed_data = feedparser.parse(feed_url) + feed_title = clean_html_text(feed_data.feed.get('title', '')) or 'RSS Feed' + + # Get new items + new_items = self.parse_rss_feed(feed_url) + + # Send notifications for new items + for item in new_items: + notification = self.create_notification(item, feed_title) + self.send_notification(notification) + + # Small delay to avoid overwhelming + time.sleep(0.5) + + except Exception as e: + self.logger.error(f"Error processing feed {feed_url}: {e}") + + def run_once(self): + """Run the notification process once""" + self.logger.info("Starting RSS notification check") + self.process_feeds() + self.logger.info("RSS notification check completed") + + def run_continuously(self): + """Run the notification process continuously""" + check_interval = self.config.get("rss", {}).get("check_interval", 300) + self.logger.info(f"Starting continuous RSS monitoring (interval: {check_interval}s)") + + try: + while True: + self.run_once() + time.sleep(check_interval) + + except KeyboardInterrupt: + self.logger.info("Shutting down...") + except Exception as e: + self.logger.error(f"Unexpected error: {e}") + finally: + self.cleanup() + + def cleanup(self): + """Cleanup resources""" + if self.mqtt_client: + self.mqtt_client.loop_stop() + self.mqtt_client.disconnect() + self.logger.info("Cleanup completed") + + +def main(): + """Main entry point""" + import argparse + + parser = argparse.ArgumentParser(description='RSS to MQTT Push Notification Script') + parser.add_argument('--config', default='config.toml', help='Config file path') + parser.add_argument('--once', action='store_true', help='Run once and exit') + parser.add_argument('--debug', action='store_true', help='Enable debug logging') + args = parser.parse_args() + + # Set debug level if requested + if args.debug: + logging.getLogger().setLevel(logging.DEBUG) + + try: + pusher = RSSNotificationPusher(args.config) + + if args.once: + pusher.run_once() + else: + pusher.run_continuously() + + except Exception as e: + print(f"Error: {e}") + return 1 + + return 0 + + +if __name__ == "__main__": + exit(main()) diff --git a/rss_notifier.log b/rss_notifier.log new file mode 100644 index 0000000..b98f76d --- /dev/null +++ b/rss_notifier.log @@ -0,0 +1,278 @@ +2025-08-12 22:59:08,751 - INFO - Starting continuous RSS monitoring (interval: 300s) +2025-08-12 22:59:08,751 - INFO - Starting RSS notification check +2025-08-12 22:59:08,752 - INFO - Connected to MQTT broker +2025-08-12 22:59:09,219 - INFO - Parsing feed: https://feeds.feedburner.com/TechCrunch +2025-08-12 22:59:09,609 - INFO - Found 20 new items in https://feeds.feedburner.com/TechCrunch +2025-08-12 22:59:09,609 - INFO - Notification sent: [Crunch Hype] Top 10 AI Tools That Will Transform Your Content Creation in 2025 +2025-08-12 22:59:10,110 - INFO - Notification sent: [Crunch Hype] LimeWire AI Studio Review 2023: Details, Pricing & Features +2025-08-12 22:59:10,610 - INFO - Notification sent: [Crunch Hype] Top 10 AI Tools in 2023 That Will Make Your Life Easier +2025-08-12 22:59:11,110 - INFO - Notification sent: [Crunch Hype] Top 10 AI Content Generator & Writer Tools in 2022 +2025-08-12 22:59:11,611 - INFO - Notification sent: [Crunch Hype] Beginner Guide to CJ Affiliate (Commission Junction) in 2022 +2025-08-12 22:59:12,111 - INFO - Notification sent: [Crunch Hype] TOP 11 AI MARKETING TOOLS YOU SHOULD USE (Updated 2022) +2025-08-12 22:59:12,611 - INFO - Notification sent: [Crunch Hype] Most Frequently Asked Questions About Affiliate Marketing +2025-08-12 22:59:13,112 - INFO - Notification sent: [Crunch Hype] What is Blockchain: Everything You Need to Know (2022) +2025-08-12 22:59:13,612 - INFO - Notification sent: [Crunch Hype] ProWritingAid VS Grammarly: Which Grammar Checker is Better in (2022) ? +2025-08-12 22:59:14,112 - INFO - Notification sent: [Crunch Hype] Sellfy Review 2022: How Good Is This Ecommerce Platform? +2025-08-12 22:59:14,612 - INFO - Notification sent: [Crunch Hype] Ahrefs vs SEMrush: Which SEO Tool Should You Use? +2025-08-12 22:59:15,113 - INFO - Notification sent: [Crunch Hype] Top 10 Best PLR(Private Label Rights) Websites | Which One You Should Join in 2022? +2025-08-12 22:59:15,613 - INFO - Notification sent: [Crunch Hype] Canva Review 2022: Details, Pricing & Features +2025-08-12 22:59:16,113 - INFO - Notification sent: [Crunch Hype] Top 7 Best Wordpress Plugin Of All Time +2025-08-12 22:59:16,614 - INFO - Notification sent: [Crunch Hype] Ginger VS Grammarly: Which Grammar Checker is Better in (2022) ? +2025-08-12 22:59:17,114 - INFO - Notification sent: [Crunch Hype] Most Frequently Asked Questions About NFTs(Non-Fungible Tokens) +2025-08-12 22:59:17,614 - INFO - Notification sent: [Crunch Hype] 10 Best Chrome Extensions That Are Perfect for Everyone +2025-08-12 22:59:18,025 - INFO - Shutting down... +2025-08-12 22:59:18,616 - WARNING - Disconnected from MQTT broker +2025-08-12 22:59:18,616 - INFO - Cleanup completed +2025-08-12 23:00:32,764 - INFO - Starting continuous RSS monitoring (interval: 300s) +2025-08-12 23:00:32,765 - INFO - Starting RSS notification check +2025-08-12 23:00:32,765 - INFO - Connected to MQTT broker +2025-08-12 23:00:33,161 - INFO - Parsing feed: https://feeds.feedburner.com/TechCrunch +2025-08-12 23:00:33,531 - INFO - Found 20 new items in https://feeds.feedburner.com/TechCrunch +2025-08-12 23:00:33,531 - INFO - Notification sent: [Crunch Hype] Top 10 AI Tools That Will Transform Your Content Creation in 2025 +2025-08-12 23:00:34,031 - INFO - Notification sent: [Crunch Hype] LimeWire AI Studio Review 2023: Details, Pricing & Features +2025-08-12 23:00:34,531 - INFO - Notification sent: [Crunch Hype] Top 10 AI Tools in 2023 That Will Make Your Life Easier +2025-08-12 23:00:35,032 - INFO - Notification sent: [Crunch Hype] Top 10 AI Content Generator & Writer Tools in 2022 +2025-08-12 23:00:35,532 - INFO - Notification sent: [Crunch Hype] Beginner Guide to CJ Affiliate (Commission Junction) in 2022 +2025-08-12 23:00:36,032 - INFO - Notification sent: [Crunch Hype] TOP 11 AI MARKETING TOOLS YOU SHOULD USE (Updated 2022) +2025-08-12 23:00:36,533 - INFO - Notification sent: [Crunch Hype] Most Frequently Asked Questions About Affiliate Marketing +2025-08-12 23:00:37,033 - INFO - Notification sent: [Crunch Hype] What is Blockchain: Everything You Need to Know (2022) +2025-08-12 23:00:37,533 - INFO - Notification sent: [Crunch Hype] ProWritingAid VS Grammarly: Which Grammar Checker is Better in (2022) ? +2025-08-12 23:00:38,034 - INFO - Notification sent: [Crunch Hype] Sellfy Review 2022: How Good Is This Ecommerce Platform? +2025-08-12 23:00:38,534 - INFO - Notification sent: [Crunch Hype] Ahrefs vs SEMrush: Which SEO Tool Should You Use? +2025-08-12 23:00:39,034 - INFO - Notification sent: [Crunch Hype] Top 10 Best PLR(Private Label Rights) Websites | Which One You Should Join in 2022? +2025-08-12 23:00:39,535 - INFO - Notification sent: [Crunch Hype] Canva Review 2022: Details, Pricing & Features +2025-08-12 23:00:40,035 - INFO - Notification sent: [Crunch Hype] Top 7 Best Wordpress Plugin Of All Time +2025-08-12 23:00:40,535 - INFO - Notification sent: [Crunch Hype] Ginger VS Grammarly: Which Grammar Checker is Better in (2022) ? +2025-08-12 23:00:41,036 - INFO - Notification sent: [Crunch Hype] Most Frequently Asked Questions About NFTs(Non-Fungible Tokens) +2025-08-12 23:00:41,536 - INFO - Notification sent: [Crunch Hype] 10 Best Chrome Extensions That Are Perfect for Everyone +2025-08-12 23:00:42,036 - INFO - Notification sent: [Crunch Hype] Most Frequently Asked Questions About Email Marketing +2025-08-12 23:00:42,537 - INFO - Notification sent: [Crunch Hype] 7 Free Websites Every Content Creator Needs to Know +2025-08-12 23:00:43,037 - INFO - Notification sent: [Crunch Hype] Top 9 Free AI Tools That Make Your Life Easier +2025-08-12 23:00:43,651 - INFO - Parsing feed: https://rss.cnn.com/rss/edition.rss +2025-08-12 23:00:43,701 - WARNING - Feed parsing issues for https://rss.cnn.com/rss/edition.rss: +2025-08-12 23:00:43,701 - INFO - Found 0 new items in https://rss.cnn.com/rss/edition.rss +2025-08-12 23:00:43,701 - INFO - RSS notification check completed +2025-08-12 23:02:28,925 - INFO - Shutting down... +2025-08-12 23:02:29,142 - WARNING - Disconnected from MQTT broker +2025-08-12 23:02:29,142 - INFO - Cleanup completed +2025-08-12 23:02:56,060 - INFO - Starting continuous RSS monitoring (interval: 300s) +2025-08-12 23:02:56,060 - INFO - Starting RSS notification check +2025-08-12 23:02:56,060 - INFO - Connected to MQTT broker +2025-08-12 23:02:56,425 - INFO - Parsing feed: https://feeds.feedburner.com/TechCrunch +2025-08-12 23:02:56,780 - INFO - Found 20 new items in https://feeds.feedburner.com/TechCrunch +2025-08-12 23:02:56,781 - INFO - Notification sent: [Crunch Hype] Top 10 AI Tools That Will Transform ... +2025-08-12 23:02:57,283 - INFO - Notification sent: [Crunch Hype] LimeWire AI Studio Review 2023: Deta... +2025-08-12 23:02:57,785 - INFO - Notification sent: [Crunch Hype] Top 10 AI Tools in 2023 That Will Ma... +2025-08-12 23:02:58,289 - INFO - Notification sent: [Crunch Hype] Top 10 AI Content Generator & Writer... +2025-08-12 23:02:58,791 - INFO - Notification sent: [Crunch Hype] Beginner Guide to CJ Affiliate (Comm... +2025-08-12 23:02:59,292 - INFO - Notification sent: [Crunch Hype] TOP 11 AI MARKETING TOOLS YOU SHOULD... +2025-08-12 23:02:59,793 - INFO - Notification sent: [Crunch Hype] Most Frequently Asked Questions Abou... +2025-08-12 23:03:00,295 - INFO - Notification sent: [Crunch Hype] What is Blockchain: Everything You N... +2025-08-12 23:03:00,796 - INFO - Notification sent: [Crunch Hype] ProWritingAid VS Grammarly: Which Gr... +2025-08-12 23:03:01,298 - INFO - Notification sent: [Crunch Hype] Sellfy Review 2022: How Good Is This... +2025-08-12 23:03:01,800 - INFO - Notification sent: [Crunch Hype] Ahrefs vs SEMrush: Which SEO Tool Sh... +2025-08-12 23:03:02,302 - INFO - Notification sent: [Crunch Hype] Top 10 Best PLR(Private Label Rights... +2025-08-12 23:03:02,804 - INFO - Notification sent: [Crunch Hype] Canva Review 2022: Details, Pricing ... +2025-08-12 23:03:03,305 - INFO - Notification sent: [Crunch Hype] Top 7 Best Wordpress Plugin Of All T... +2025-08-12 23:03:03,807 - INFO - Notification sent: [Crunch Hype] Ginger VS Grammarly: Which Grammar C... +2025-08-12 23:03:04,308 - INFO - Notification sent: [Crunch Hype] Most Frequently Asked Questions Abou... +2025-08-12 23:03:04,809 - INFO - Notification sent: [Crunch Hype] 10 Best Chrome Extensions That Are P... +2025-08-12 23:03:05,310 - INFO - Notification sent: [Crunch Hype] Most Frequently Asked Questions Abou... +2025-08-12 23:03:05,812 - INFO - Notification sent: [Crunch Hype] 7 Free Websites Every Content Creato... +2025-08-12 23:03:06,314 - INFO - Notification sent: [Crunch Hype] Top 9 Free AI Tools That Make Your L... +2025-08-12 23:03:06,879 - INFO - Parsing feed: https://rss.cnn.com/rss/edition.rss +2025-08-12 23:03:06,928 - WARNING - Feed parsing issues for https://rss.cnn.com/rss/edition.rss: +2025-08-12 23:03:06,928 - INFO - Found 0 new items in https://rss.cnn.com/rss/edition.rss +2025-08-12 23:03:06,928 - INFO - RSS notification check completed +2025-08-12 23:04:21,177 - INFO - Shutting down... +2025-08-12 23:04:21,387 - WARNING - Disconnected from MQTT broker +2025-08-12 23:04:21,387 - INFO - Cleanup completed +2025-08-12 23:14:06,934 - INFO - Starting continuous RSS monitoring (interval: 300s) +2025-08-12 23:14:06,934 - INFO - Starting RSS notification check +2025-08-12 23:14:06,935 - INFO - Connected to MQTT broker +2025-08-12 23:14:07,473 - INFO - Parsing feed: https://news.google.com/rss/search?q=Federal+Reserve+when:7d&hl=en-US&gl=US&ceid=US:en +2025-08-12 23:14:07,564 - INFO - Found 100 new items in https://news.google.com/rss/search?q=Federal+Reserve+when:7d&hl=en-US&gl=US&ceid=US:en +2025-08-12 23:14:07,565 - INFO - Notification sent: ["Federal Reserve when:7d" - Google News] Trump ta... +2025-08-12 23:14:08,065 - INFO - Notification sent: ["Federal Reserve when:7d" - Google News] Trump to... +2025-08-12 23:14:08,565 - INFO - Notification sent: ["Federal Reserve when:7d" - Google News] Fed Offi... +2025-08-12 23:14:09,066 - INFO - Notification sent: ["Federal Reserve when:7d" - Google News] A top Fe... +2025-08-12 23:14:09,566 - INFO - Notification sent: ["Federal Reserve when:7d" - Google News] Trump ma... +2025-08-12 23:14:10,066 - INFO - Notification sent: ["Federal Reserve when:7d" - Google News] The Fed ... +2025-08-12 23:14:10,567 - INFO - Notification sent: ["Federal Reserve when:7d" - Google News] Trump cr... +2025-08-12 23:14:11,067 - INFO - Notification sent: ["Federal Reserve when:7d" - Google News] Trump Ta... +2025-08-12 23:14:11,567 - INFO - Notification sent: ["Federal Reserve when:7d" - Google News] Trump no... +2025-08-12 23:14:12,068 - INFO - Notification sent: ["Federal Reserve when:7d" - Google News] Trump’s ... +2025-08-12 23:14:12,568 - INFO - Notification sent: ["Federal Reserve when:7d" - Google News] Trump pi... +2025-08-12 23:14:13,068 - INFO - Notification sent: ["Federal Reserve when:7d" - Google News] Meet Ste... +2025-08-12 23:14:13,569 - INFO - Notification sent: ["Federal Reserve when:7d" - Google News] Donald T... +2025-08-12 23:14:14,069 - INFO - Notification sent: ["Federal Reserve when:7d" - Google News] Trump Na... +2025-08-12 23:14:14,569 - INFO - Notification sent: ["Federal Reserve when:7d" - Google News] Trump th... +2025-08-12 23:14:15,070 - INFO - Notification sent: ["Federal Reserve when:7d" - Google News] ‘A Loyal... +2025-08-12 23:14:15,570 - INFO - Notification sent: ["Federal Reserve when:7d" - Google News] Trump to... +2025-08-12 23:14:16,070 - INFO - Notification sent: ["Federal Reserve when:7d" - Google News] Trump se... +2025-08-12 23:14:16,571 - INFO - Notification sent: ["Federal Reserve when:7d" - Google News] Fed's Bo... +2025-08-12 23:14:17,071 - INFO - Notification sent: ["Federal Reserve when:7d" - Google News] J.P.Morg... +2025-08-12 23:14:17,571 - INFO - Notification sent: ["Federal Reserve when:7d" - Google News] Trump fa... +2025-08-12 23:14:18,072 - INFO - Notification sent: ["Federal Reserve when:7d" - Google News] Trump is... +2025-08-12 23:14:18,572 - INFO - Notification sent: ["Federal Reserve when:7d" - Google News] Trump ma... +2025-08-12 23:14:19,073 - INFO - Notification sent: ["Federal Reserve when:7d" - Google News] Who Does... +2025-08-12 23:14:19,573 - INFO - Notification sent: ["Federal Reserve when:7d" - Google News] Why the ... +2025-08-12 23:14:20,073 - INFO - Notification sent: ["Federal Reserve when:7d" - Google News] US judge... +2025-08-12 23:14:20,574 - INFO - Notification sent: ["Federal Reserve when:7d" - Google News] Judge va... +2025-08-12 23:14:21,074 - INFO - Notification sent: ["Federal Reserve when:7d" - Google News] Inflatio... +2025-08-12 23:14:21,574 - INFO - Notification sent: ["Federal Reserve when:7d" - Google News] Fed's Co... +2025-08-12 23:14:22,075 - INFO - Notification sent: ["Federal Reserve when:7d" - Google News] Wilkinso... +2025-08-12 23:14:22,575 - INFO - Notification sent: ["Federal Reserve when:7d" - Google News] US Fed's... +2025-08-12 23:14:23,075 - INFO - Notification sent: ["Federal Reserve when:7d" - Google News] Trump Wi... +2025-08-12 23:14:23,576 - INFO - Notification sent: ["Federal Reserve when:7d" - Google News] Here Are... +2025-08-12 23:14:24,076 - INFO - Notification sent: ["Federal Reserve when:7d" - Google News] Trump of... +2025-08-12 23:14:24,577 - INFO - Notification sent: ["Federal Reserve when:7d" - Google News] Abolish ... +2025-08-12 23:14:25,077 - INFO - Notification sent: ["Federal Reserve when:7d" - Google News] Bessent ... +2025-08-12 23:14:25,577 - INFO - Notification sent: ["Federal Reserve when:7d" - Google News] Trump is... +2025-08-12 23:14:26,078 - INFO - Notification sent: ["Federal Reserve when:7d" - Google News] 3 things... +2025-08-12 23:14:26,578 - INFO - Notification sent: ["Federal Reserve when:7d" - Google News] Trump Ap... +2025-08-12 23:14:27,078 - INFO - Notification sent: ["Federal Reserve when:7d" - Google News] Trump an... +2025-08-12 23:14:27,579 - INFO - Notification sent: ["Federal Reserve when:7d" - Google News] Opinion ... +2025-08-12 23:14:28,079 - INFO - Notification sent: ["Federal Reserve when:7d" - Google News] Trump is... +2025-08-12 23:14:28,580 - INFO - Notification sent: ["Federal Reserve when:7d" - Google News] Fed's po... +2025-08-12 23:14:29,080 - INFO - Notification sent: ["Federal Reserve when:7d" - Google News] Trump th... +2025-08-12 23:14:29,580 - INFO - Notification sent: ["Federal Reserve when:7d" - Google News] Fed will... +2025-08-12 23:14:30,081 - INFO - Notification sent: ["Federal Reserve when:7d" - Google News] Trump ri... +2025-08-12 23:14:30,581 - INFO - Notification sent: ["Federal Reserve when:7d" - Google News] Bets on ... +2025-08-12 23:14:31,081 - INFO - Notification sent: ["Federal Reserve when:7d" - Google News] The Fede... +2025-08-12 23:14:31,582 - INFO - Notification sent: ["Federal Reserve when:7d" - Google News] Why Trum... +2025-08-12 23:14:32,082 - INFO - Notification sent: ["Federal Reserve when:7d" - Google News] Fed gove... +2025-08-12 23:14:32,582 - INFO - Notification sent: ["Federal Reserve when:7d" - Google News] Trump th... +2025-08-12 23:14:33,083 - INFO - Notification sent: ["Federal Reserve when:7d" - Google News] Trump no... +2025-08-12 23:14:33,583 - INFO - Notification sent: ["Federal Reserve when:7d" - Google News] Fed offi... +2025-08-12 23:14:34,084 - INFO - Notification sent: ["Federal Reserve when:7d" - Google News] Trump wi... +2025-08-12 23:14:34,584 - INFO - Notification sent: ["Federal Reserve when:7d" - Google News] Fed's Da... +2025-08-12 23:14:35,084 - INFO - Notification sent: ["Federal Reserve when:7d" - Google News] Who is S... +2025-08-12 23:14:35,585 - INFO - Notification sent: ["Federal Reserve when:7d" - Google News] The Impo... +2025-08-12 23:14:36,085 - INFO - Notification sent: ["Federal Reserve when:7d" - Google News] Is reval... +2025-08-12 23:14:36,586 - INFO - Notification sent: ["Federal Reserve when:7d" - Google News] A top Fe... +2025-08-12 23:14:36,655 - INFO - Shutting down... +2025-08-12 23:14:37,588 - WARNING - Disconnected from MQTT broker +2025-08-12 23:14:37,588 - INFO - Cleanup completed +2025-08-12 23:16:44,760 - INFO - Starting continuous RSS monitoring (interval: 300s) +2025-08-12 23:16:44,760 - INFO - Starting RSS notification check +2025-08-12 23:16:44,761 - INFO - Connected to MQTT broker +2025-08-12 23:16:45,384 - INFO - Parsing feed: https://news.google.com/rss/search?q=Federal+Reserve+when:7d&hl=en-US&gl=US&ceid=US:en +2025-08-12 23:16:45,497 - INFO - Found 5 new items in https://news.google.com/rss/search?q=Federal+Reserve+when:7d&hl=en-US&gl=US&ceid=US:en (checked top 5) +2025-08-12 23:16:45,497 - INFO - Notification sent: ["Federal Reserve when:7d" - Google News] Trump ta... +2025-08-12 23:16:45,997 - INFO - Notification sent: ["Federal Reserve when:7d" - Google News] Trump to... +2025-08-12 23:16:46,498 - INFO - Notification sent: ["Federal Reserve when:7d" - Google News] Fed Offi... +2025-08-12 23:16:46,998 - INFO - Notification sent: ["Federal Reserve when:7d" - Google News] A top Fe... +2025-08-12 23:16:47,498 - INFO - Notification sent: ["Federal Reserve when:7d" - Google News] Trump ma... +2025-08-12 23:16:48,456 - INFO - Parsing feed: https://news.google.com/rss/search?q=business+news&hl=en-US&gl=US&ceid=US:en +2025-08-12 23:16:48,550 - INFO - Found 5 new items in https://news.google.com/rss/search?q=business+news&hl=en-US&gl=US&ceid=US:en (checked top 5) +2025-08-12 23:16:48,550 - INFO - Notification sent: ["business news" - Google News] Rare earths: Austr... +2025-08-12 23:16:49,050 - INFO - Notification sent: ["business news" - Google News] Trump’s pick to le... +2025-08-12 23:16:49,551 - INFO - Notification sent: ["business news" - Google News] Spirit Airlines st... +2025-08-12 23:16:50,051 - INFO - Notification sent: ["business news" - Google News] Musk threatens 'im... +2025-08-12 23:16:50,551 - INFO - Notification sent: ["business news" - Google News] Cava stock plummet... +2025-08-12 23:16:51,326 - INFO - Parsing feed: https://www.federalreserve.gov/feeds/press_orders.xml +2025-08-12 23:16:51,436 - INFO - Found 5 new items in https://www.federalreserve.gov/feeds/press_orders.xml (checked top 5) +2025-08-12 23:16:51,436 - INFO - Notification sent: [FRB: Press Release - Banking Applications] Federa... +2025-08-12 23:16:51,936 - INFO - Notification sent: [FRB: Press Release - Banking Applications] Federa... +2025-08-12 23:16:52,436 - INFO - Notification sent: [FRB: Press Release - Banking Applications] Federa... +2025-08-12 23:16:52,936 - INFO - Notification sent: [FRB: Press Release - Banking Applications] Federa... +2025-08-12 23:16:53,437 - INFO - Notification sent: [FRB: Press Release - Banking Applications] Federa... +2025-08-12 23:16:54,086 - INFO - Parsing feed: https://www.federalreserve.gov/feeds/s_t_powell.xml +2025-08-12 23:16:54,209 - WARNING - Feed parsing issues for https://www.federalreserve.gov/feeds/s_t_powell.xml: document declared as us-ascii, but parsed as utf-8 +2025-08-12 23:16:54,209 - INFO - Found 5 new items in https://www.federalreserve.gov/feeds/s_t_powell.xml (checked top 5) +2025-08-12 23:16:54,209 - INFO - Notification sent: [FRB: Chair Powell: Speeches and Testimony] Powell... +2025-08-12 23:16:54,709 - INFO - Notification sent: [FRB: Chair Powell: Speeches and Testimony] Powell... +2025-08-12 23:16:55,209 - INFO - Notification sent: [FRB: Chair Powell: Speeches and Testimony] Powell... +2025-08-12 23:16:55,709 - INFO - Notification sent: [FRB: Chair Powell: Speeches and Testimony] Powell... +2025-08-12 23:16:56,210 - INFO - Notification sent: [FRB: Chair Powell: Speeches and Testimony] Powell... +2025-08-12 23:16:56,886 - INFO - Parsing feed: https://www.federalreserve.gov/feeds/g19.xml +2025-08-12 23:16:56,984 - WARNING - Feed parsing issues for https://www.federalreserve.gov/feeds/g19.xml: document declared as us-ascii, but parsed as utf-8 +2025-08-12 23:16:56,984 - INFO - Found 5 new items in https://www.federalreserve.gov/feeds/g19.xml (checked top 5) +2025-08-12 23:16:56,984 - INFO - Notification sent: [The Fed: DDP: Consumer Credit (G.19)] Data Downlo... +2025-08-12 23:16:57,485 - INFO - Notification sent: [The Fed: DDP: Consumer Credit (G.19)] Upcoming ch... +2025-08-12 23:16:57,985 - INFO - Notification sent: [The Fed: DDP: Consumer Credit (G.19)] Federal Res... +2025-08-12 23:16:58,485 - INFO - Notification sent: [The Fed: DDP: Consumer Credit (G.19)] Data Downlo... +2025-08-12 23:16:58,986 - INFO - Notification sent: [The Fed: DDP: Consumer Credit (G.19)] Upcoming ch... +2025-08-12 23:16:59,702 - INFO - Parsing feed: https://www.federalreserve.gov/feeds/prates.xml +2025-08-12 23:16:59,806 - WARNING - Feed parsing issues for https://www.federalreserve.gov/feeds/prates.xml: document declared as us-ascii, but parsed as utf-8 +2025-08-12 23:16:59,806 - INFO - Found 5 new items in https://www.federalreserve.gov/feeds/prates.xml (checked top 5) +2025-08-12 23:16:59,806 - INFO - Notification sent: [The Fed: DDP: Policy Rates] Data Download Program... +2025-08-12 23:17:00,307 - INFO - Notification sent: [The Fed: DDP: Policy Rates] Federal Reserve Board... +2025-08-12 23:17:00,807 - INFO - Notification sent: [The Fed: DDP: Policy Rates] Data Download Program... +2025-08-12 23:17:01,307 - INFO - Notification sent: [The Fed: DDP: Policy Rates] Federal Reserve Board... +2025-08-12 23:17:01,807 - INFO - Notification sent: [The Fed: DDP: Policy Rates] Federal Reserve Board... +2025-08-12 23:17:02,639 - INFO - Parsing feed: https://www.bls.gov/feed/cpi.rss +2025-08-12 23:17:02,709 - WARNING - Feed parsing issues for https://www.bls.gov/feed/cpi.rss: :19:27: not well-formed (invalid token) +2025-08-12 23:17:02,709 - INFO - Found 0 new items in https://www.bls.gov/feed/cpi.rss (checked top 5) +2025-08-12 23:17:02,772 - INFO - Parsing feed: https://www.bls.gov/feed/nlsoy.rss +2025-08-12 23:17:02,844 - WARNING - Feed parsing issues for https://www.bls.gov/feed/nlsoy.rss: :19:27: not well-formed (invalid token) +2025-08-12 23:17:02,844 - INFO - Found 0 new items in https://www.bls.gov/feed/nlsoy.rss (checked top 5) +2025-08-12 23:17:02,844 - INFO - RSS notification check completed +2025-08-12 23:17:21,113 - INFO - Shutting down... +2025-08-12 23:17:21,828 - WARNING - Disconnected from MQTT broker +2025-08-12 23:17:21,828 - INFO - Cleanup completed +2025-08-12 23:19:59,901 - INFO - Starting continuous RSS monitoring (interval: 300s) +2025-08-12 23:19:59,901 - INFO - Starting RSS notification check +2025-08-12 23:19:59,901 - INFO - Connected to MQTT broker +2025-08-12 23:20:00,421 - INFO - Parsing feed: https://news.google.com/rss/search?q=business+news&hl=en-US&gl=US&ceid=US:en +2025-08-12 23:20:00,520 - INFO - Found 5 new items in https://news.google.com/rss/search?q=business+news&hl=en-US&gl=US&ceid=US:en (checked top 5) +2025-08-12 23:20:00,520 - INFO - Notification sent: ["business news" - Google News] Rare earths: Austr... +2025-08-12 23:20:01,020 - INFO - Notification sent: ["business news" - Google News] Trump’s pick to le... +2025-08-12 23:20:01,521 - INFO - Notification sent: ["business news" - Google News] Spirit Airlines st... +2025-08-12 23:20:02,021 - INFO - Notification sent: ["business news" - Google News] Musk threatens 'im... +2025-08-12 23:20:02,521 - INFO - Notification sent: ["business news" - Google News] Cava stock plummet... +2025-08-12 23:20:03,191 - INFO - Parsing feed: https://www.federalreserve.gov/feeds/s_t_powell.xml +2025-08-12 23:20:03,320 - WARNING - Feed parsing issues for https://www.federalreserve.gov/feeds/s_t_powell.xml: document declared as us-ascii, but parsed as utf-8 +2025-08-12 23:20:03,320 - INFO - Found 5 new items in https://www.federalreserve.gov/feeds/s_t_powell.xml (checked top 5) +2025-08-12 23:20:03,320 - INFO - Notification sent: [FRB: Chair Powell: Speeches and Testimony] Powell... +2025-08-12 23:20:03,820 - INFO - Notification sent: [FRB: Chair Powell: Speeches and Testimony] Powell... +2025-08-12 23:20:04,321 - INFO - Notification sent: [FRB: Chair Powell: Speeches and Testimony] Powell... +2025-08-12 23:20:04,821 - INFO - Notification sent: [FRB: Chair Powell: Speeches and Testimony] Powell... +2025-08-12 23:20:05,321 - INFO - Notification sent: [FRB: Chair Powell: Speeches and Testimony] Powell... +2025-08-12 23:20:05,989 - INFO - Parsing feed: https://www.federalreserve.gov/feeds/g19.xml +2025-08-12 23:20:06,088 - WARNING - Feed parsing issues for https://www.federalreserve.gov/feeds/g19.xml: document declared as us-ascii, but parsed as utf-8 +2025-08-12 23:20:06,088 - INFO - Found 5 new items in https://www.federalreserve.gov/feeds/g19.xml (checked top 5) +2025-08-12 23:20:06,088 - INFO - Notification sent: [The Fed: DDP: Consumer Credit (G.19)] Data Downlo... +2025-08-12 23:20:06,588 - INFO - Notification sent: [The Fed: DDP: Consumer Credit (G.19)] Upcoming ch... +2025-08-12 23:20:07,089 - INFO - Notification sent: [The Fed: DDP: Consumer Credit (G.19)] Federal Res... +2025-08-12 23:20:07,589 - INFO - Notification sent: [The Fed: DDP: Consumer Credit (G.19)] Data Downlo... +2025-08-12 23:20:08,089 - INFO - Notification sent: [The Fed: DDP: Consumer Credit (G.19)] Upcoming ch... +2025-08-12 23:20:08,688 - INFO - Parsing feed: https://www.bls.gov/feed/cpi.rss +2025-08-12 23:20:08,749 - WARNING - Feed parsing issues for https://www.bls.gov/feed/cpi.rss: :19:27: not well-formed (invalid token) +2025-08-12 23:20:08,749 - INFO - Found 0 new items in https://www.bls.gov/feed/cpi.rss (checked top 5) +2025-08-12 23:20:08,813 - INFO - Parsing feed: https://www.bls.gov/feed/nlsoy.rss +2025-08-12 23:20:08,864 - WARNING - Feed parsing issues for https://www.bls.gov/feed/nlsoy.rss: :19:27: not well-formed (invalid token) +2025-08-12 23:20:08,864 - INFO - Found 0 new items in https://www.bls.gov/feed/nlsoy.rss (checked top 5) +2025-08-12 23:20:08,864 - INFO - RSS notification check completed +2025-08-12 23:22:52,237 - INFO - Shutting down... +2025-08-12 23:22:52,246 - WARNING - Disconnected from MQTT broker +2025-08-12 23:22:52,246 - INFO - Cleanup completed +2025-08-12 23:23:10,184 - INFO - Starting continuous RSS monitoring (interval: 300s) +2025-08-12 23:23:10,184 - INFO - Starting RSS notification check +2025-08-12 23:23:10,184 - INFO - Connected to MQTT broker +2025-08-12 23:23:10,823 - INFO - Parsing feed: https://news.google.com/rss/search?q=business+news&hl=en-US&gl=US&ceid=US:en +2025-08-12 23:23:10,914 - INFO - Found 5 new items in https://news.google.com/rss/search?q=business+news&hl=en-US&gl=US&ceid=US:en (checked top 5) +2025-08-12 23:23:10,914 - INFO - Notification sent: ["business news" - Google News] Rare earths: Austr... +2025-08-12 23:23:11,415 - INFO - Notification sent: ["business news" - Google News] Trump’s pick to le... +2025-08-12 23:23:11,915 - INFO - Notification sent: ["business news" - Google News] Spirit Airlines st... +2025-08-12 23:23:12,415 - INFO - Notification sent: ["business news" - Google News] Musk threatens 'im... +2025-08-12 23:23:12,916 - INFO - Notification sent: ["business news" - Google News] Cava stock plummet... +2025-08-12 23:23:13,646 - INFO - Parsing feed: https://www.federalreserve.gov/feeds/s_t_powell.xml +2025-08-12 23:23:13,742 - WARNING - Feed parsing issues for https://www.federalreserve.gov/feeds/s_t_powell.xml: document declared as us-ascii, but parsed as utf-8 +2025-08-12 23:23:13,742 - INFO - Found 5 new items in https://www.federalreserve.gov/feeds/s_t_powell.xml (checked top 5) +2025-08-12 23:23:13,742 - INFO - Notification sent: [FRB: Chair Powell: Speeches and Testimony] Powell... +2025-08-12 23:23:14,242 - INFO - Notification sent: [FRB: Chair Powell: Speeches and Testimony] Powell... +2025-08-12 23:23:14,743 - INFO - Notification sent: [FRB: Chair Powell: Speeches and Testimony] Powell... +2025-08-12 23:23:15,243 - INFO - Notification sent: [FRB: Chair Powell: Speeches and Testimony] Powell... +2025-08-12 23:23:15,744 - INFO - Notification sent: [FRB: Chair Powell: Speeches and Testimony] Powell... +2025-08-12 23:23:16,551 - INFO - Parsing feed: https://www.bls.gov/feed/cpi.rss +2025-08-12 23:23:16,615 - WARNING - Feed parsing issues for https://www.bls.gov/feed/cpi.rss: :19:27: not well-formed (invalid token) +2025-08-12 23:23:16,615 - INFO - Found 0 new items in https://www.bls.gov/feed/cpi.rss (checked top 5) +2025-08-12 23:23:16,673 - INFO - Parsing feed: https://www.bls.gov/feed/nlsoy.rss +2025-08-12 23:23:16,742 - WARNING - Feed parsing issues for https://www.bls.gov/feed/nlsoy.rss: :19:27: not well-formed (invalid token) +2025-08-12 23:23:16,742 - INFO - Found 0 new items in https://www.bls.gov/feed/nlsoy.rss (checked top 5) +2025-08-12 23:23:16,742 - INFO - RSS notification check completed +2025-08-12 23:23:48,992 - INFO - Shutting down... +2025-08-12 23:23:49,779 - WARNING - Disconnected from MQTT broker +2025-08-12 23:23:49,779 - INFO - Cleanup completed