[4chan] more metadata entries (size, width, height)
This commit is contained in:
@@ -18,51 +18,55 @@ info = {
|
|||||||
"directory": ["{category}", "{board}-{thread-id}"],
|
"directory": ["{category}", "{board}-{thread-id}"],
|
||||||
"filename": "{timestamp}-{name}",
|
"filename": "{timestamp}-{name}",
|
||||||
"pattern": [
|
"pattern": [
|
||||||
r"(?:https?://)?boards\.4chan\.org/([^/]+)/thread/(\d+)(?:/([^#]*))?",
|
r"(?:https?://)?boards\.4chan\.org/([^/]+)/thread/(\d+).*",
|
||||||
],
|
],
|
||||||
}
|
}
|
||||||
|
|
||||||
class FourChanExtractor(SequentialExtractor):
|
class FourChanExtractor(SequentialExtractor):
|
||||||
|
|
||||||
url_fmt = "https://boards.4chan.org/{board}/res/{thread-id}.html"
|
url_fmt = "https://boards.4chan.org/{0}/res/{1}.html"
|
||||||
regex = (
|
regex = (
|
||||||
r'<a href="(//i.4cdn.org/[^/]+/(\d+)\.([^"]+))"'
|
r'<a (?:title="(?P<orig_name>[^"]+)" )?href="'
|
||||||
r' target="_blank">([^<]+)</a>'
|
r'(?P<url>//i.4cdn.org/[^/]+/(?P<timestamp>\d+)\.(?P<extension>[^"]+))'
|
||||||
|
r'" target="_blank">(?P<name>[^<]+)</a> '
|
||||||
|
r'\((?P<size>[^,]+), (?P<width>\d+)x(?P<height>\d+)\)'
|
||||||
)
|
)
|
||||||
|
|
||||||
def __init__(self, match, config):
|
def __init__(self, match, config):
|
||||||
SequentialExtractor.__init__(self, config)
|
SequentialExtractor.__init__(self, config)
|
||||||
self.metadata = self.get_job_metadata(match)
|
self.match = match
|
||||||
|
self.metadata = None
|
||||||
|
|
||||||
def items(self):
|
def items(self):
|
||||||
yield Message.Version, 1
|
yield Message.Version, 1
|
||||||
yield Message.Directory, self.metadata
|
|
||||||
|
|
||||||
url = self.url_fmt.format(**self.metadata)
|
url = self.url_fmt.format(*self.match.groups())
|
||||||
text = self.request(url).text
|
text = self.request(url).text
|
||||||
|
self.metadata = self.get_job_metadata(text)
|
||||||
|
|
||||||
|
yield Message.Directory, self.metadata
|
||||||
for match in re.finditer(self.regex, text):
|
for match in re.finditer(self.regex, text):
|
||||||
yield Message.Url, self.get_file_url(match), self.get_file_metadata(match)
|
yield Message.Url, self.get_file_url(match), self.get_file_metadata(match)
|
||||||
|
|
||||||
@staticmethod
|
def get_job_metadata(self, text):
|
||||||
def get_job_metadata(match):
|
|
||||||
"""Collect metadata for extractor-job"""
|
"""Collect metadata for extractor-job"""
|
||||||
board, thread_id, title = match.groups()
|
board, thread_id = self.match.groups()
|
||||||
|
title, _ = self.extract(text, '"description" content="', ' - "/')
|
||||||
return {
|
return {
|
||||||
"category": info["category"],
|
"category": info["category"],
|
||||||
"board": board,
|
"board": board,
|
||||||
"thread-id": thread_id,
|
"thread-id": thread_id,
|
||||||
"title": title,
|
"title": unquote(title),
|
||||||
}
|
}
|
||||||
|
|
||||||
def get_file_metadata(self, match):
|
def get_file_metadata(self, match):
|
||||||
"""Collect metadata for a downloadable file"""
|
"""Collect metadata for a downloadable file"""
|
||||||
data = self.metadata
|
data = self.metadata
|
||||||
data["timestamp"] = match.group(2)
|
data.update(match.groupdict(default=""))
|
||||||
data["extension"] = match.group(3)
|
data["name"] = unquote(data["orig_name"] or data["name"])
|
||||||
data["name"] = unquote(match.group(4))
|
|
||||||
return data
|
return data
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def get_file_url(match):
|
def get_file_url(match):
|
||||||
"""Extract download-url from 'match'"""
|
"""Extract download-url from 'match'"""
|
||||||
return "https:" + match.group(1)
|
return "https:" + match.group("url")
|
||||||
|
|||||||
Reference in New Issue
Block a user