diff options
Diffstat (limited to 'Biz/PodcastItLater')
| -rw-r--r-- | Biz/PodcastItLater/Test.py | 6 | ||||
| -rw-r--r-- | Biz/PodcastItLater/Web.py | 62 |
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): |
