summaryrefslogtreecommitdiffstats
path: root/gallery_dl/extractor/blogger.py
diff options
context:
space:
mode:
Diffstat (limited to 'gallery_dl/extractor/blogger.py')
-rw-r--r--gallery_dl/extractor/blogger.py50
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: