* [vk] Added extractor for VK wall posts
* update
- fix flake8
- rename to 'wall-post'
- remove __init__() / use self.groups
- simplify 'description' extraction
* add test
* add to docs/supportedsites
---------
Co-authored-by: Mike Fährmann <mike_faehrmann@web.de>
This commit is contained in:
@@ -1042,7 +1042,7 @@ Consider all listed sites to potentially be NSFW.
|
|||||||
<tr id="vk" title="vk">
|
<tr id="vk" title="vk">
|
||||||
<td>VK</td>
|
<td>VK</td>
|
||||||
<td>https://vk.com/</td>
|
<td>https://vk.com/</td>
|
||||||
<td>Albums, Photos, Tagged Photos</td>
|
<td>Albums, Photos, Tagged Photos, individual Wall Posts</td>
|
||||||
<td></td>
|
<td></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr id="vsco" title="vsco">
|
<tr id="vsco" title="vsco">
|
||||||
|
|||||||
@@ -108,6 +108,10 @@ class VkExtractor(Extractor):
|
|||||||
total = payload[1]
|
total = payload[1]
|
||||||
photos = payload[3]
|
photos = payload[3]
|
||||||
|
|
||||||
|
for i in range(len(photos)):
|
||||||
|
photos[i]["num"] = self.offset + i + 1
|
||||||
|
photos[i]["count"] = total
|
||||||
|
|
||||||
offset_next = self.offset + len(photos)
|
offset_next = self.offset + len(photos)
|
||||||
if offset_next >= total:
|
if offset_next >= total:
|
||||||
# the last chunk of photos also contains the first few photos
|
# the last chunk of photos also contains the first few photos
|
||||||
@@ -128,7 +132,7 @@ class VkPhotosExtractor(VkExtractor):
|
|||||||
subcategory = "photos"
|
subcategory = "photos"
|
||||||
pattern = (BASE_PATTERN + r"/(?:"
|
pattern = (BASE_PATTERN + r"/(?:"
|
||||||
r"(?:albums|photos|id)(-?\d+)"
|
r"(?:albums|photos|id)(-?\d+)"
|
||||||
r"|(?!(?:album|tag)-?\d+_?)([^/?#]+))")
|
r"|(?!(?:album|tag|wall)-?\d+_?)([^/?#]+))")
|
||||||
example = "https://vk.com/id12345"
|
example = "https://vk.com/id12345"
|
||||||
|
|
||||||
def __init__(self, match):
|
def __init__(self, match):
|
||||||
@@ -209,3 +213,35 @@ class VkTaggedExtractor(VkExtractor):
|
|||||||
|
|
||||||
def metadata(self):
|
def metadata(self):
|
||||||
return {"user": {"id": self.user_id}}
|
return {"user": {"id": self.user_id}}
|
||||||
|
|
||||||
|
|
||||||
|
class VkWallPostExtractor(VkExtractor):
|
||||||
|
"""Extractor for a vk wall post"""
|
||||||
|
subcategory = "wall-post"
|
||||||
|
directory_fmt = ("{category}", "{user[id]}", "wall")
|
||||||
|
filename_fmt = "{wall[id]}_{num}.{extension}"
|
||||||
|
pattern = BASE_PATTERN + r"/wall(-?\d+)_(\d+)"
|
||||||
|
example = "https://vk.com/wall12345_123"
|
||||||
|
|
||||||
|
def photos(self):
|
||||||
|
user_id, wall_id = self.groups
|
||||||
|
return self._pagination(f"wall{user_id}_{wall_id}")
|
||||||
|
|
||||||
|
def metadata(self):
|
||||||
|
user_id, wall_id = self.groups
|
||||||
|
|
||||||
|
url = f"{self.root}/wall{user_id}_{wall_id}"
|
||||||
|
page = self.request(url).text
|
||||||
|
desc = text.unescape(
|
||||||
|
text.extr(page, 'data-testid="post_description">', "</div>") or
|
||||||
|
text.extr(page, 'name="description" content="', '"'))
|
||||||
|
|
||||||
|
return {
|
||||||
|
"user": {
|
||||||
|
"id": user_id,
|
||||||
|
},
|
||||||
|
"wall": {
|
||||||
|
"id": wall_id,
|
||||||
|
"description": desc,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|||||||
@@ -403,6 +403,7 @@ SUBCATEGORY_MAP = {
|
|||||||
},
|
},
|
||||||
"vk": {
|
"vk": {
|
||||||
"tagged": "Tagged Photos",
|
"tagged": "Tagged Photos",
|
||||||
|
"wall-post": "individual Wall Posts",
|
||||||
},
|
},
|
||||||
"vsco": {
|
"vsco": {
|
||||||
"spaces": "",
|
"spaces": "",
|
||||||
|
|||||||
@@ -99,4 +99,31 @@ __tests__ = (
|
|||||||
"#count" : 44,
|
"#count" : 44,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
"#url" : "https://vk.com/wall-213352498_2115",
|
||||||
|
"#class" : vk.VkWallPostExtractor,
|
||||||
|
"#results" : (
|
||||||
|
"https://sun9-42.userapi.com/s/v1/ig2/53qxcL7M8408L2HNDTHdHz-HXbprXBn1BLbE5HTuj-OsZD4I483jtZb8yMk9Mr4zzfPJhqBIJlAprWVhIqlk4Fn4.jpg?quality=95&as=32x57,48x85,72x128,108x192,160x284,240x427,360x640,480x853,540x960,640x1138,720x1280&from=bu&cs=720x0",
|
||||||
|
"https://sun9-49.userapi.com/s/v1/ig2/FnvT8T3mC2yQWc5yJTOe25Kj864ohqvTgOcTudqrE4sPfCMexS1mzNmgUndgxUbqhht-YmIVKW_edDFtzCLXzf7h.jpg?quality=95&as=32x57,48x85,72x128,108x192,160x284,240x427,360x640,480x853,540x960,640x1138,720x1280&from=bu&cs=720x0",
|
||||||
|
"https://sun9-78.userapi.com/s/v1/ig2/6VB0Cnmdtb9rDNFd5iHv5QJAJ-y-xSVELEoCLlOf_ej2BWVf61G3DSXbnXgmx-QFtQkOOnHIhCLFFLTIFKeVBR5Q.jpg?quality=95&as=32x57,48x85,72x128,108x192,160x284,240x427,360x640,480x853,540x960,640x1138,720x1280&from=bu&cs=720x0",
|
||||||
|
"https://sun9-60.userapi.com/s/v1/ig2/KO5SzdRUHjZRKlHii4oJ4BrTo5nbdyP3CCpf6_RfHhrEIx6jiVPlWH1R--fpoK5-0rigqXuaG68q39m5VQVy6YFo.jpg?quality=95&as=32x57,48x85,72x128,108x192,160x284,240x427,360x640,480x853,540x960,640x1138,720x1280&from=bu&cs=720x0",
|
||||||
|
"https://sun9-33.userapi.com/s/v1/ig2/IAN1ZHmVVtjRj0U7wGAfnMc5Xp83EFFYZAVqNgMKpfthLHOe6wh0bodM_xDwIALvVl4pcZ66Fv3bOROG4sUTwY21.jpg?quality=95&as=32x57,48x85,72x128,108x192,160x284,240x427,360x640,480x853,540x960,640x1138,720x1280&from=bu&cs=720x0",
|
||||||
|
"https://sun9-44.userapi.com/s/v1/ig2/RLzDGnlmu7C0sLh2YI2R4L9RBgZ061QLOsxogjEtC0cBZJ9HvhNwe1V16QX0tNLkTOLELAp8JDHwOo6dMvoWydeh.jpg?quality=95&as=32x57,48x85,72x128,108x192,160x284,240x427,360x640,480x853,540x960,640x1138,720x1280&from=bu&cs=720x0",
|
||||||
|
),
|
||||||
|
|
||||||
|
"id" : r"re:^\d+$",
|
||||||
|
"width" : 720,
|
||||||
|
"height" : 1280,
|
||||||
|
"count" : 6,
|
||||||
|
"num" : range(1, 6),
|
||||||
|
"likes" : int,
|
||||||
|
"user" : {
|
||||||
|
"id": "-213352498",
|
||||||
|
},
|
||||||
|
"wall" : {
|
||||||
|
"description": "🎄 Обновляем не только аватарки, но и обои на телефоне",
|
||||||
|
"id" : "2115",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
)
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user