summaryrefslogtreecommitdiff
path: root/Biz/PodcastItLater
diff options
context:
space:
mode:
Diffstat (limited to 'Biz/PodcastItLater')
-rw-r--r--Biz/PodcastItLater/Test.py6
-rw-r--r--Biz/PodcastItLater/Web.py62
2 files changed, 52 insertions, 16 deletions
diff --git a/Biz/PodcastItLater/Test.py b/Biz/PodcastItLater/Test.py
index 373467f..b2a1d24 100644
--- a/Biz/PodcastItLater/Test.py
+++ b/Biz/PodcastItLater/Test.py
@@ -169,7 +169,7 @@ class TestEndToEnd(BaseWebTest):
self.assertEqual(episode["user_id"], self.user_id)
# Step 5: Verify episode appears in RSS feed
- response = self.client.get(f"/feed/{self.token}.xml")
+ response = self.client.get(f"/feed/{self.token}.rss")
self.assertEqual(response.status_code, 200)
self.assertEqual(
@@ -198,12 +198,12 @@ class TestEndToEnd(BaseWebTest):
)
# Original user's feed should not contain other user's episode
- response = self.client.get(f"/feed/{self.token}.xml")
+ response = self.client.get(f"/feed/{self.token}.rss")
self.assertIn("Great Article Title", response.text)
self.assertNotIn("Other User's Article", response.text)
# Other user's feed should only contain their episode
- response = self.client.get(f"/feed/{token2}.xml")
+ response = self.client.get(f"/feed/{token2}.rss")
self.assertNotIn("Great Article Title", response.text)
self.assertIn("Other User's Article", response.text)
diff --git a/Biz/PodcastItLater/Web.py b/Biz/PodcastItLater/Web.py
index f996dbd..7a9f63a 100644
--- a/Biz/PodcastItLater/Web.py
+++ b/Biz/PodcastItLater/Web.py
@@ -884,7 +884,7 @@ class HomePage(Component[AnyChildren, HomePageAttrs]):
QueueStatus(items=queue_items),
EpisodeList(
episodes=episodes,
- rss_url=f"{BASE_URL}/feed/{user['token']}.xml",
+ rss_url=f"{BASE_URL}/feed/{user['token']}.rss",
user=user,
viewing_own_feed=True,
),
@@ -1419,7 +1419,7 @@ def submit_article( # noqa: PLR0911, PLR0914
)
-@app.get("/feed/{token}.xml")
+@app.get("/feed/{token}.rss")
def rss_feed(request: Request, token: str) -> Response: # noqa: ARG001
"""Generate user-specific RSS podcast feed."""
try:
@@ -1441,8 +1441,8 @@ def rss_feed(request: Request, token: str) -> Response: # noqa: ARG001
fg.description(f"Web articles converted to audio for {user['email']}")
fg.author(name=RSS_CONFIG["author"])
fg.language(RSS_CONFIG["language"])
- fg.link(href=f"{RSS_CONFIG['base_url']}/feed/{token}.xml")
- fg.id(f"{RSS_CONFIG['base_url']}/feed/{token}.xml")
+ fg.link(href=f"{RSS_CONFIG['base_url']}/feed/{token}.rss")
+ fg.id(f"{RSS_CONFIG['base_url']}/feed/{token}.rss")
for episode in episodes:
fe = fg.add_entry()
@@ -1471,6 +1471,13 @@ def rss_feed(request: Request, token: str) -> Response: # noqa: ARG001
return Response(f"Error generating feed: {e}", status_code=500)
+# Backwards compatibility: .xml extension
+@app.get("/feed/{token}.xml")
+def rss_feed_xml_alias(request: Request, token: str) -> Response:
+ """Alias for .rss feed (backwards compatibility)."""
+ return rss_feed(request, token)
+
+
@app.get("/public.rss")
def public_rss_feed(request: Request) -> Response: # noqa: ARG001
"""Generate public RSS podcast feed."""
@@ -1513,6 +1520,13 @@ def public_rss_feed(request: Request) -> Response: # noqa: ARG001
return Response(f"Error generating feed: {e}", status_code=500)
+# Backwards compatibility: .xml extension
+@app.get("/public.xml")
+def public_rss_feed_xml_alias(request: Request) -> Response:
+ """Alias for .rss feed (backwards compatibility)."""
+ return public_rss_feed(request)
+
+
@app.get("/episode/{episode_id:int}")
def episode_detail_legacy(
request: Request, # noqa: ARG001
@@ -1615,7 +1629,7 @@ def dashboard_updates(request: Request) -> Response:
# Get user info for RSS URL
user = Core.Database.get_user_by_id(user_id)
- rss_url = f"{BASE_URL}/feed/{user['token']}.xml" if user else None
+ rss_url = f"{BASE_URL}/feed/{user['token']}.rss" if user else None
# Get user-specific queue items and episodes
queue_items = Core.Database.get_user_queue_status(user_id)
@@ -2083,7 +2097,7 @@ class TestRSSFeed(BaseWebTest):
def test_feed_generation(self) -> None:
"""Generate valid RSS XML."""
- response = self.client.get(f"/feed/{self.token}.xml")
+ response = self.client.get(f"/feed/{self.token}.rss")
self.assertEqual(response.status_code, 200)
self.assertEqual(
@@ -2113,7 +2127,7 @@ class TestRSSFeed(BaseWebTest):
Core.Database.add_episode_to_user(user2_id, other_ep_id)
# Get first user's feed
- response = self.client.get(f"/feed/{self.token}.xml")
+ response = self.client.get(f"/feed/{self.token}.rss")
# Should only have user's episodes
self.assertIn("Episode 1", response.text)
@@ -2122,13 +2136,13 @@ class TestRSSFeed(BaseWebTest):
def test_feed_invalid_token(self) -> None:
"""Return 404 for bad tokens."""
- response = self.client.get("/feed/invalid-token.xml")
+ response = self.client.get("/feed/invalid-token.rss")
self.assertEqual(response.status_code, 404)
def test_feed_metadata(self) -> None:
"""Verify personalized feed titles."""
- response = self.client.get(f"/feed/{self.token}.xml")
+ response = self.client.get(f"/feed/{self.token}.rss")
# Should personalize based on email
self.assertIn("Test's Article Podcast", response.text)
@@ -2136,7 +2150,7 @@ class TestRSSFeed(BaseWebTest):
def test_feed_episode_order(self) -> None:
"""Ensure reverse chronological order."""
- response = self.client.get(f"/feed/{self.token}.xml")
+ response = self.client.get(f"/feed/{self.token}.rss")
# Episode 2 should appear before Episode 1
ep2_pos = response.text.find("Episode 2")
@@ -2145,13 +2159,35 @@ class TestRSSFeed(BaseWebTest):
def test_feed_enclosures(self) -> None:
"""Verify audio URLs and metadata."""
- response = self.client.get(f"/feed/{self.token}.xml")
+ response = self.client.get(f"/feed/{self.token}.rss")
# Check enclosure tags
self.assertIn("<enclosure", response.text)
self.assertIn('type="audio/mpeg"', response.text)
- self.assertIn("https://example.com/ep1.mp3", response.text)
- self.assertIn("https://example.com/ep2.mp3", response.text)
+
+ def test_feed_xml_alias_works(self) -> None:
+ """Test .xml extension works for backwards compatibility."""
+ # Get feed with .xml extension
+ response_xml = self.client.get(f"/feed/{self.token}.xml")
+ # Get feed with .rss extension
+ response_rss = self.client.get(f"/feed/{self.token}.rss")
+
+ # Both should work and return same content
+ self.assertEqual(response_xml.status_code, 200)
+ self.assertEqual(response_rss.status_code, 200)
+ self.assertEqual(response_xml.text, response_rss.text)
+
+ def test_public_feed_xml_alias_works(self) -> None:
+ """Test .xml extension works for public feed."""
+ # Get feed with .xml extension
+ response_xml = self.client.get("/public.xml")
+ # Get feed with .rss extension
+ response_rss = self.client.get("/public.rss")
+
+ # Both should work and return same content
+ self.assertEqual(response_xml.status_code, 200)
+ self.assertEqual(response_rss.status_code, 200)
+ self.assertEqual(response_xml.text, response_rss.text)
class TestAdminInterface(BaseWebTest):