[wikiart] add extractor for single paintings (closes #1233)

There is no API endpoint for single paintings from what I can tell,
so this uses the site's search.
This commit is contained in:
Mike Fährmann
2021-01-08 23:15:20 +01:00
parent e2d4ca4955
commit 20bd9cd296
2 changed files with 43 additions and 8 deletions

View File

@@ -1,6 +1,6 @@
# -*- coding: utf-8 -*-
# Copyright 2019-2020 Mike Fährmann
# Copyright 2019-2021 Mike Fährmann
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License version 2 as
@@ -40,7 +40,7 @@ class WikiartExtractor(Extractor):
def paintings(self):
"""Return an iterable containing all relevant 'painting' objects"""
def _pagination(self, url, extra_params=None, key="Paintings"):
def _pagination(self, url, extra_params=None, key="Paintings", stop=False):
headers = {
"X-Requested-With": "XMLHttpRequest",
"Referer": url,
@@ -60,6 +60,8 @@ class WikiartExtractor(Extractor):
if not items:
return
yield from items
if stop:
return
params["page"] += 1
@@ -67,7 +69,7 @@ class WikiartArtistExtractor(WikiartExtractor):
"""Extractor for an artist's paintings on wikiart.org"""
subcategory = "artist"
directory_fmt = ("{category}", "{artist[artistName]}")
pattern = BASE_PATTERN + r"/(?!\w+-by-)([\w-]+)"
pattern = BASE_PATTERN + r"/(?!\w+-by-)([\w-]+)/?$"
test = ("https://www.wikiart.org/en/thomas-cole", {
"url": "5ba2fbe6783fcce34e65014d16e5fbc581490c98",
"keyword": "6d92913c55675e05553f000cfee5daff0b4107cf",
@@ -75,18 +77,50 @@ class WikiartArtistExtractor(WikiartExtractor):
def __init__(self, match):
WikiartExtractor.__init__(self, match)
self.artist = match.group(2)
self.artist_name = match.group(2)
self.artist = None
def metadata(self):
url = "{}/{}/{}?json=2".format(self.root, self.lang, self.artist)
return {"artist": self.request(url).json()}
url = "{}/{}/{}?json=2".format(self.root, self.lang, self.artist_name)
self.artist = self.request(url).json()
return {"artist": self.artist}
def paintings(self):
url = "{}/{}/{}/mode/all-paintings".format(
self.root, self.lang, self.artist)
self.root, self.lang, self.artist_name)
return self._pagination(url)
class WikiartImageExtractor(WikiartArtistExtractor):
"""Extractor for individual paintings on wikiart.org"""
subcategory = "image"
pattern = BASE_PATTERN + r"/(?!(?:paintings|artists)-by-)([\w-]+)/([\w-]+)"
test = (
("https://www.wikiart.org/en/thomas-cole/the-departure-1838", {
"url": "4d9fd87680a2620eaeaf1f13e3273475dec93231",
"keyword": "a1b083d500ce2fd364128e35b026e4ca526000cc",
}),
# no year or '-' in slug
("https://www.wikiart.org/en/huang-shen/summer", {
"url": "d7f60118c34067b2b37d9577e412dc1477b94207",
}),
)
def __init__(self, match):
WikiartArtistExtractor.__init__(self, match)
self.title = match.group(3)
def paintings(self):
title, sep, year = self.title.rpartition("-")
if not sep or not year.isdecimal():
title = self.title
url = "{}/{}/Search/{} {}".format(
self.root, self.lang,
self.artist.get("artistName") or self.artist_name, title,
)
return self._pagination(url, stop=True)
class WikiartArtworksExtractor(WikiartExtractor):
"""Extractor for artwork collections on wikiart.org"""
subcategory = "artworks"