From 86d94ed32b08eb650b62f0ee4db8a5d3c1cbc5fa Mon Sep 17 00:00:00 2001 From: Teodor Podobnik Date: Sun, 5 Jan 2025 14:49:00 +0100 Subject: [PATCH] support custom domains --- substack_api/newsletter.py | 18 +++++++++--------- tests/test_newsletter.py | 12 ++++++------ 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/substack_api/newsletter.py b/substack_api/newsletter.py index aacc444..9069c36 100644 --- a/substack_api/newsletter.py +++ b/substack_api/newsletter.py @@ -93,7 +93,7 @@ def get_newsletters_in_category( def get_newsletter_post_metadata( - newsletter_subdomain: str, + newsletter_domain: str, slugs_only: bool = False, start_offset: int = None, end_offset: int = None, @@ -103,7 +103,7 @@ def get_newsletter_post_metadata( Parameters ---------- - newsletter_subdomain : Substack subdomain of newsletter + newsletter_domain : Substack domain of newsletter slugs_only : Whether to return only post slugs (needed for post content collection) start_page : Start page for paginated API results end_page : End page for paginated API results @@ -114,7 +114,7 @@ def get_newsletter_post_metadata( last_id_ref = 0 all_posts = [] while offset_start < offset_end: - full_url = f"https://{newsletter_subdomain}.substack.com/api/v1/archive?sort=new&search=&offset={offset_start}&limit=10" + full_url = f"https://{newsletter_domain}/api/v1/archive?sort=new&search=&offset={offset_start}&limit=10" posts = requests.get(full_url, headers=HEADERS, timeout=30).json() if len(posts) == 0: @@ -138,18 +138,18 @@ def get_newsletter_post_metadata( def get_post_contents( - newsletter_subdomain: str, slug: str, html_only: bool = False + newsletter_domain: str, slug: str, html_only: bool = False ) -> Union[Dict, str]: """ Gets individual post metadata and contents Parameters ---------- - newsletter_subdomain : Substack subdomain of newsletter + newsletter_domain : Substack domain of newsletter slug : Slug of post to retrieve (can be retrieved from `get_newsletter_post_metadata`) html_only : Whether to get only HTML of body text, or all metadata/content """ - endpoint = f"https://{newsletter_subdomain}.substack.com/api/v1/posts/{slug}" + endpoint = f"https://{newsletter_domain}/api/v1/posts/{slug}" post_info = requests.get(endpoint, headers=HEADERS, timeout=30).json() if html_only: return post_info["body_html"] @@ -157,15 +157,15 @@ def get_post_contents( return post_info -def get_newsletter_recommendations(newsletter_subdomain: str) -> List[Dict[str, str]]: +def get_newsletter_recommendations(newsletter_domain: str) -> List[Dict[str, str]]: """ Gets recommended newsletters for a given newsletter Parameters ---------- - newsletter_subdomain : Substack subdomain of newsletter + newsletter_domain : Substack domain of newsletter """ - endpoint = f"https://{newsletter_subdomain}.substack.com/recommendations" + endpoint = f"https://{newsletter_domain}/recommendations" r = requests.get(endpoint, headers=HEADERS, timeout=30) recs = r.text soup = BeautifulSoup(recs, "html.parser") diff --git a/tests/test_newsletter.py b/tests/test_newsletter.py index 591d6bd..ca3e638 100644 --- a/tests/test_newsletter.py +++ b/tests/test_newsletter.py @@ -18,7 +18,7 @@ def test_get_newsletter_post_metadata_slugs_only(self, mock_get): {"id": 2, "slug": "post-2"}, ] - result = get_newsletter_post_metadata("test_subdomain", slugs_only=True) + result = get_newsletter_post_metadata("test_subdomain.substack.com", slugs_only=True) self.assertEqual(result, ["post-1", "post-2"]) @patch("requests.get") @@ -29,7 +29,7 @@ def test_get_newsletter_post_metadata_all_metadata(self, mock_get): {"id": 2, "slug": "post-2", "title": "Post 2"}, ] - result = get_newsletter_post_metadata("test_subdomain", slugs_only=False) + result = get_newsletter_post_metadata("test_subdomain.substack.com", slugs_only=False) self.assertEqual( result, [ @@ -62,7 +62,7 @@ def test_get_newsletter_post_metadata_pagination(self, mock_get): ] result = get_newsletter_post_metadata( - "test_subdomain", slugs_only=True, start_offset=0, end_offset=20 + "test_subdomain.substack.com", slugs_only=True, start_offset=0, end_offset=20 ) self.assertEqual(result, ["post-1", "post-2", "post-3", "post-4"]) @@ -71,7 +71,7 @@ def test_get_newsletter_post_metadata_no_posts(self, mock_get): mock_get.return_value = Mock(ok=True) mock_get.return_value.json.return_value = [] - result = get_newsletter_post_metadata("test_subdomain") + result = get_newsletter_post_metadata("test_subdomain.substack.com") self.assertEqual(result, []) @@ -120,7 +120,7 @@ def test_get_post_contents_html_only(self, mock_get): "body_html": "Test post" } - result = get_post_contents("test_subdomain", "test_slug", html_only=True) + result = get_post_contents("test_subdomain.substack.com", "test_slug", html_only=True) self.assertEqual(result, "Test post") @patch("requests.get") @@ -133,7 +133,7 @@ def test_get_post_contents_all_metadata(self, mock_get): "date": "2022-01-01", } - result = get_post_contents("test_subdomain", "test_slug", html_only=False) + result = get_post_contents("test_subdomain.substack.com", "test_slug", html_only=False) self.assertEqual( result, {