diff options
Diffstat (limited to 'gallery_dl/extractor/blogger.py')
| -rw-r--r-- | gallery_dl/extractor/blogger.py | 50 |
1 files changed, 43 insertions, 7 deletions
diff --git a/gallery_dl/extractor/blogger.py b/gallery_dl/extractor/blogger.py index 331cfc2..9c18e0e 100644 --- a/gallery_dl/extractor/blogger.py +++ b/gallery_dl/extractor/blogger.py @@ -147,7 +147,7 @@ class BloggerPostExtractor(BloggerExtractor): class BloggerBlogExtractor(BloggerExtractor): """Extractor for an entire Blogger blog""" subcategory = "blog" - pattern = BASE_PATTERN + "/?$" + pattern = BASE_PATTERN + r"/?$" test = ( ("https://julianbphotography.blogspot.com/", { "range": "1-25", @@ -164,6 +164,34 @@ class BloggerBlogExtractor(BloggerExtractor): return self.api.blog_posts(blog["id"]) +class BloggerSearchExtractor(BloggerExtractor): + """Extractor for search resuls and labels""" + subcategory = "search" + pattern = BASE_PATTERN + r"/search(?:/?\?q=([^/?&#]+)|/label/([^/?&#]+))" + test = ( + ("https://julianbphotography.blogspot.com/search?q=400mm", { + "count": "< 10" + }), + ("https://dmmagazine.blogspot.com/search/label/D%26D", { + "range": "1-25", + "count": 25, + }), + ) + + def __init__(self, match): + BloggerExtractor.__init__(self, match) + query = match.group(3) + if query: + self.query, self.label = query, None + else: + self.query, self.label = None, match.group(4) + + def posts(self, blog): + if self.query: + return self.api.blog_search(blog["id"], text.unquote(self.query)) + return self.api.blog_posts(blog["id"], text.unquote(self.label)) + + class BloggerAPI(): """Minimal interface for the Blogger v3 API @@ -176,19 +204,27 @@ class BloggerAPI(): self.api_key = extractor.config("api-key", self.API_KEY) def blog_by_url(self, url): - return self._call("blogs/byurl", {"url": url}) + return self._call("blogs/byurl", {"url": url}, "blog") + + def blog_posts(self, blog_id, label=None): + endpoint = "blogs/{}/posts".format(blog_id) + params = {"labels": label} + return self._pagination(endpoint, params) - def blog_posts(self, blog_id): - return self._pagination("blogs/{}/posts".format(blog_id), {}) + def blog_search(self, blog_id, query): + endpoint = "blogs/{}/posts/search".format(blog_id) + params = {"q": query} + return self._pagination(endpoint, params) def post_by_path(self, blog_id, path): endpoint = "blogs/{}/posts/bypath".format(blog_id) - return self._call(endpoint, {"path": path}) + return self._call(endpoint, {"path": path}, "post") - def _call(self, endpoint, params): + def _call(self, endpoint, params, notfound=None): url = "https://www.googleapis.com/blogger/v3/" + endpoint params["key"] = self.api_key - return self.extractor.request(url, params=params).json() + return self.extractor.request( + url, params=params, notfound=notfound).json() def _pagination(self, endpoint, params): while True: |
