From 576a85843dbd1834a8973aed6145ae0b9ddc1b2b Mon Sep 17 00:00:00 2001 From: Ben Sima Date: Thu, 4 Sep 2025 10:29:04 -0400 Subject: Add Episode Metadata: Author and Original URL Enhance episode tracking by adding support for author and original article URL. This allows users to see more context about each podcast episode, improving the overall user experience and providing additional information about the source material. --- Biz/PodcastItLater/Core.py | 47 +++++++++++++++++++++++++++++++++++++++----- Biz/PodcastItLater/Web.py | 19 ++++++++++++++++++ Biz/PodcastItLater/Worker.py | 2 ++ 3 files changed, 63 insertions(+), 5 deletions(-) (limited to 'Biz/PodcastItLater') diff --git a/Biz/PodcastItLater/Core.py b/Biz/PodcastItLater/Core.py index 86676b5..542bb8b 100644 --- a/Biz/PodcastItLater/Core.py +++ b/Biz/PodcastItLater/Core.py @@ -122,6 +122,9 @@ class Database: # noqa: PLR0904 # Run migration to add metadata fields Database.migrate_add_metadata_fields(db_path) + # Run migration to add episode metadata fields + Database.migrate_add_episode_metadata(db_path) + @staticmethod def add_to_queue( # noqa: PLR0913, PLR0917 url: str, @@ -218,6 +221,8 @@ class Database: # noqa: PLR0904 duration: int, content_length: int, user_id: int | None = None, + author: str | None = None, + original_url: str | None = None, db_path: str | None = None, ) -> int: """Insert episode record, return episode ID. @@ -231,9 +236,17 @@ class Database: # noqa: PLR0904 cursor = conn.cursor() cursor.execute( "INSERT INTO episodes " - "(title, audio_url, duration, content_length, user_id) " - "VALUES (?, ?, ?, ?, ?)", - (title, audio_url, duration, content_length, user_id), + "(title, audio_url, duration, content_length, user_id, author, " + "original_url) VALUES (?, ?, ?, ?, ?, ?, ?)", + ( + title, + audio_url, + duration, + content_length, + user_id, + author, + original_url, + ), ) conn.commit() episode_id = cursor.lastrowid @@ -316,7 +329,7 @@ class Database: # noqa: PLR0904 cursor.execute( """ SELECT id, title, audio_url, duration, created_at, - content_length + content_length, author, original_url FROM episodes WHERE user_id = ? ORDER BY created_at DESC @@ -326,7 +339,7 @@ class Database: # noqa: PLR0904 else: cursor.execute(""" SELECT id, title, audio_url, duration, created_at, - content_length + content_length, author, original_url FROM episodes ORDER BY created_at DESC """) @@ -520,6 +533,30 @@ class Database: # noqa: PLR0904 conn.commit() logger.info("Database migrated to support metadata fields") + @staticmethod + def migrate_add_episode_metadata(db_path: str | None = None) -> None: + """Add author and original_url fields to episodes table.""" + if db_path is None: + db_path = Database.get_default_db_path() + with Database.get_connection(db_path) as conn: + cursor = conn.cursor() + + # Check if columns already exist + cursor.execute("PRAGMA table_info(episodes)") + episodes_info = cursor.fetchall() + episodes_columns = [col[1] for col in episodes_info] + + if "author" not in episodes_columns: + cursor.execute("ALTER TABLE episodes ADD COLUMN author TEXT") + + if "original_url" not in episodes_columns: + cursor.execute( + "ALTER TABLE episodes ADD COLUMN original_url TEXT", + ) + + conn.commit() + logger.info("Database migrated to support episode metadata fields") + @staticmethod def create_user(email: str, db_path: str | None = None) -> tuple[int, str]: """Create a new user and return (user_id, token). diff --git a/Biz/PodcastItLater/Web.py b/Biz/PodcastItLater/Web.py index 8586aaf..3493b7b 100644 --- a/Biz/PodcastItLater/Web.py +++ b/Biz/PodcastItLater/Web.py @@ -432,6 +432,13 @@ class EpisodeList(Component[AnyChildren, EpisodeListAttrs]): episode_items.append( html.div( html.h4(episode["title"]), + # Show author if available + html.p( + f"by {episode['author']}", + style={"margin": "5px 0", "font-style": "italic"}, + ) + if episode.get("author") + else html.span(), html.audio( html.source( src=episode["audio_url"], @@ -445,6 +452,18 @@ class EpisodeList(Component[AnyChildren, EpisodeListAttrs]): f"Duration: {duration_str} | " f"Created: {episode['created_at']}", ), + # Show link to original article if available + html.div( + html.a( + "View original article", + href=episode["original_url"], + target="_blank", + style={"color": "#007cba"}, + ), + style={"margin-top": "10px"}, + ) + if episode.get("original_url") + else html.span(), style={ "border": "1px solid #ddd", "padding": "15px", diff --git a/Biz/PodcastItLater/Worker.py b/Biz/PodcastItLater/Worker.py index ce3d432..56a91bc 100644 --- a/Biz/PodcastItLater/Worker.py +++ b/Biz/PodcastItLater/Worker.py @@ -280,6 +280,8 @@ class ArticleProcessor: duration=duration, content_length=len(content), user_id=job.get("user_id"), + author=job.get("author"), # Pass author from job + original_url=url, # Pass the original article URL db_path=DATABASE_PATH, ) -- cgit v1.2.3