[patreon] raise proper exception if creator/post doesn't exist

This commit is contained in:
Mike Fährmann
2019-12-12 01:14:32 +01:00
parent 9e63804347
commit 76e60d10a6

View File

@@ -9,7 +9,7 @@
"""Extractors for https://www.patreon.com/""" """Extractors for https://www.patreon.com/"""
from .common import Extractor, Message from .common import Extractor, Message
from .. import text from .. import text, exception
from ..cache import memcache from ..cache import memcache
import collections import collections
import json import json
@@ -173,23 +173,28 @@ class PatreonCreatorExtractor(PatreonExtractor):
pattern = (r"(?:https?://)?(?:www\.)?patreon\.com" pattern = (r"(?:https?://)?(?:www\.)?patreon\.com"
r"/(?!(?:home|join|posts|login|signup)(?:$|[/?&#]))" r"/(?!(?:home|join|posts|login|signup)(?:$|[/?&#]))"
r"([^/?&#]+)/?") r"([^/?&#]+)/?")
test = ("https://www.patreon.com/koveliana", { test = (
"range": "1-25", ("https://www.patreon.com/koveliana", {
"count": ">= 25", "range": "1-25",
"keyword": { "count": ">= 25",
"attachments": list, "keyword": {
"comment_count": int, "attachments" : list,
"content": str, "comment_count": int,
"creator": dict, "content" : str,
"date": "type:datetime", "creator" : dict,
"id": int, "date" : "type:datetime",
"images": list, "id" : int,
"like_count": int, "images" : list,
"post_type": str, "like_count" : int,
"published_at": str, "post_type" : str,
"title": str, "published_at" : str,
}, "title" : str,
}) },
}),
("https://www.patreon.com/kovelianot", {
"exception": exception.NotFoundError,
}),
)
def __init__(self, match): def __init__(self, match):
PatreonExtractor.__init__(self, match) PatreonExtractor.__init__(self, match)
@@ -197,9 +202,12 @@ class PatreonCreatorExtractor(PatreonExtractor):
def posts(self): def posts(self):
url = "{}/{}".format(self.root, self.creator) url = "{}/{}".format(self.root, self.creator)
page = self.request(url).text page = self.request(url, notfound="creator").text
campaign_id = text.extract(page, "/campaign/", "/")[0] campaign_id = text.extract(page, "/campaign/", "/")[0]
if not campaign_id:
raise exception.NotFoundError("creator")
url = self._build_url("posts", ( url = self._build_url("posts", (
"&sort=-published_at" "&sort=-published_at"
"&filter[is_draft]=false" "&filter[is_draft]=false"
@@ -228,9 +236,14 @@ class PatreonPostExtractor(PatreonExtractor):
subcategory = "post" subcategory = "post"
pattern = (r"(?:https?://)?(?:www\.)?patreon\.com" pattern = (r"(?:https?://)?(?:www\.)?patreon\.com"
r"/posts/[^/?&#]*?(\d+)") r"/posts/[^/?&#]*?(\d+)")
test = ("https://www.patreon.com/posts/precious-metal-23563293", { test = (
"count": 4, ("https://www.patreon.com/posts/precious-metal-23563293", {
}) "count": 4,
}),
("https://www.patreon.com/posts/not-found-123", {
"exception": exception.NotFoundError,
}),
)
def __init__(self, match): def __init__(self, match):
PatreonExtractor.__init__(self, match) PatreonExtractor.__init__(self, match)
@@ -238,7 +251,7 @@ class PatreonPostExtractor(PatreonExtractor):
def posts(self): def posts(self):
url = "{}/posts/{}".format(self.root, self.post_id) url = "{}/posts/{}".format(self.root, self.post_id)
page = self.request(url).text page = self.request(url, notfound="post").text
data = text.extract(page, "window.patreon.bootstrap,", "\n});")[0] data = text.extract(page, "window.patreon.bootstrap,", "\n});")[0]
post = json.loads(data + "}")["post"] post = json.loads(data + "}")["post"]