diff --git a/docs/supportedsites.rst b/docs/supportedsites.rst index 729d4989..dda9f17a 100644 --- a/docs/supportedsites.rst +++ b/docs/supportedsites.rst @@ -20,7 +20,7 @@ Archived.Moe https://archived.moe/ Threads ArtStation https://www.artstation.com/ |artstation-C| baraag https://baraag.net/ Images from Statuses, User Profiles Optional (`OAuth `__) Behance https://www.behance.net/ Collections, Galleries, User Profiles -Blogger https://www.blogger.com/ Blogs, Posts +Blogger https://www.blogger.com/ Blogs, Posts, Search Results Danbooru https://danbooru.donmai.us/ Pools, Popular Images, Posts, Tag Searches Optional Desuarchive https://desuarchive.org/ Threads DeviantArt https://www.deviantart.com/ |deviantart-C| Optional (`OAuth `__) diff --git a/gallery_dl/extractor/blogger.py b/gallery_dl/extractor/blogger.py index a9ec7944..9c18e0e7 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 + "(?:/search/label/([^/?&#]+))?/?$" + pattern = BASE_PATTERN + r"/?$" test = ( ("https://julianbphotography.blogspot.com/", { "range": "1-25", @@ -160,13 +160,36 @@ class BloggerBlogExtractor(BloggerExtractor): }), ) + def posts(self, blog): + 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) - label = match.group(3) - self.label = text.unquote(label) if label else None + 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): - return self.api.blog_posts(blog["id"], self.label) + 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(): @@ -188,6 +211,11 @@ class BloggerAPI(): params = {"labels": label} return self._pagination(endpoint, params) + 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}, "post")