From 23675b39b8055a8568cdcf71f66482b9d0cf90a9 Mon Sep 17 00:00:00 2001 From: Tyler Date: Sat, 28 Mar 2026 23:01:14 -0700 Subject: Initial commit — Prism financial analysis dashboard MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Streamlit app with market bar, price chart, financial statements, DCF valuation engine, comparable companies, and news feed. Co-Authored-By: Claude Sonnet 4.6 --- services/news_service.py | 53 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 services/news_service.py (limited to 'services/news_service.py') diff --git a/services/news_service.py b/services/news_service.py new file mode 100644 index 0000000..b060c54 --- /dev/null +++ b/services/news_service.py @@ -0,0 +1,53 @@ +"""Finnhub news service — company news with sentiment.""" +import os +import time +import requests +import streamlit as st +from dotenv import load_dotenv + +load_dotenv() + +BASE_URL = "https://finnhub.io/api/v1" + + +def _api_key() -> str: + return os.getenv("FINNHUB_API_KEY", "") + + +def _get(endpoint: str, params: dict = None) -> dict | list | None: + params = params or {} + params["token"] = _api_key() + try: + resp = requests.get(f"{BASE_URL}{endpoint}", params=params, timeout=10) + resp.raise_for_status() + return resp.json() + except Exception: + return None + + +@st.cache_data(ttl=600) +def get_company_news(ticker: str, days_back: int = 7) -> list[dict]: + """Return recent news articles with sentiment for a ticker.""" + end = int(time.time()) + start = end - days_back * 86400 + from datetime import datetime + date_from = datetime.utcfromtimestamp(start).strftime("%Y-%m-%d") + date_to = datetime.utcfromtimestamp(end).strftime("%Y-%m-%d") + + data = _get("/company-news", params={ + "symbol": ticker.upper(), + "from": date_from, + "to": date_to, + }) + if not data or not isinstance(data, list): + return [] + return data[:30] + + +@st.cache_data(ttl=600) +def get_news_sentiment(ticker: str) -> dict: + """Return sentiment scores for a ticker.""" + data = _get("/news-sentiment", params={"symbol": ticker.upper()}) + if data and isinstance(data, dict): + return data + return {} -- cgit v1.3-2-g0d8e