[artstation] support video clips (#2566, #3309, #3911)

- add 'videos' and 'previews' options
- fix 403 errors for video previews
pull/5280/head
Mike Fährmann 7 months ago
parent 982880615d
commit 1a9b9aa310
No known key found for this signature in database
GPG Key ID: 5680CA389D365A88

@ -1124,6 +1124,26 @@ Description
Limit the number of posts/projects to download. Limit the number of posts/projects to download.
extractor.artstation.previews
-----------------------------
Type
``bool``
Default
``false``
Description
Download video previews.
extractor.artstation.videos
---------------------------
Type
``bool``
Default
``true``
Description
Download video clips.
extractor.artstation.search.pro-first extractor.artstation.search.pro-first
------------------------------------- -------------------------------------
Type Type

@ -29,11 +29,13 @@ class ArtstationExtractor(Extractor):
self.user = match.group(1) or match.group(2) self.user = match.group(1) or match.group(2)
def items(self): def items(self):
data = self.metadata() videos = self.config("videos", True)
previews = self.config("previews", False)
projects = self.projects()
external = self.config("external", False) external = self.config("external", False)
max_posts = self.config("max-posts") max_posts = self.config("max-posts")
data = self.metadata()
projects = self.projects()
if max_posts: if max_posts:
projects = itertools.islice(projects, max_posts) projects = itertools.islice(projects, max_posts)
@ -45,13 +47,29 @@ class ArtstationExtractor(Extractor):
asset["num"] = num asset["num"] = num
yield Message.Directory, asset yield Message.Directory, asset
if adict["has_embedded_player"] and external: if adict["has_embedded_player"]:
player = adict["player_embedded"] player = adict["player_embedded"]
url = (text.extr(player, 'src="', '"') or url = (text.extr(player, 'src="', '"') or
text.extr(player, "src='", "'")) text.extr(player, "src='", "'"))
if url and not url.startswith(self.root): if url.startswith(self.root):
asset["extension"] = None # video clip hosted on artstation
if videos:
page = self.request(url).text
url = text.extr(page, ' src="', '"')
text.nameext_from_url(url, asset)
yield Message.Url, url, asset
elif url:
# external URL
if external:
asset["extension"] = "mp4"
yield Message.Url, "ytdl:" + url, asset yield Message.Url, "ytdl:" + url, asset
else:
self.log.debug(player)
self.log.warning(
"Failed to extract embedded player URL (%s)",
adict.get("id"))
if not previews:
continue continue
if adict["has_image"]: if adict["has_image"]:
@ -59,6 +77,7 @@ class ArtstationExtractor(Extractor):
text.nameext_from_url(url, asset) text.nameext_from_url(url, asset)
url = self._no_cache(url) url = self._no_cache(url)
if "/video_clips/" not in url:
lhs, _, rhs = url.partition("/large/") lhs, _, rhs = url.partition("/large/")
if rhs: if rhs:
url = lhs + "/4k/" + rhs url = lhs + "/4k/" + rhs

@ -71,14 +71,14 @@ __tests__ = (
"#count" : 10, "#count" : 10,
"collection": { "collection": {
"active_projects_count": 3,
"id" : 2647023, "id" : 2647023,
"is_private" : False, "is_private" : False,
"micro_square_image_url": "https://cdna.artstation.com/p/assets/images/images/005/131/434/micro_square/gaeri-kim-cat-front.jpg?1488720625",
"name" : "テスト", "name" : "テスト",
"projects_count": 3, "projects_count": 3,
"small_square_image_url": "https://cdna.artstation.com/p/assets/images/images/005/131/434/small_square/gaeri-kim-cat-front.jpg?1488720625",
"user_id" : 697975, "user_id" : 697975,
"active_projects_count" : 3,
"micro_square_image_url": "https://cdna.artstation.com/p/assets/images/images/005/131/434/micro_square/gaeri-kim-cat-front.jpg?1488720625",
"small_square_image_url": "https://cdna.artstation.com/p/assets/images/images/005/131/434/small_square/gaeri-kim-cat-front.jpg?1488720625",
}, },
"user": "mikf", "user": "mikf",
}, },
@ -92,14 +92,14 @@ __tests__ = (
"https://www.artstation.com/mikf/collections/2647719", "https://www.artstation.com/mikf/collections/2647719",
), ),
"active_projects_count": int,
"id" : range(2647023, 2647719), "id" : range(2647023, 2647719),
"is_private" : False, "is_private" : False,
"micro_square_image_url": str,
"name" : r"re:テスト|empty", "name" : r"re:テスト|empty",
"projects_count": int, "projects_count": int,
"small_square_image_url": str,
"user_id" : 697975, "user_id" : 697975,
"active_projects_count" : int,
"micro_square_image_url": str,
"small_square_image_url": str,
}, },
{ {
@ -156,6 +156,19 @@ __tests__ = (
"#count" : 4, "#count" : 4,
}, },
{
"#url" : "https://www.artstation.com/artwork/lR8b5k",
"#comment" : "artstation video clips (#2566)",
"#category": ("", "artstation", "image"),
"#class" : artstation.ArtstationImageExtractor,
"#options" : {"videos": True},
"#range" : "2-3",
"#urls" : (
"https://cdn.artstation.com/p/video_sources/000/819/843/infection-4.mp4",
"https://cdn.artstation.com/p/video_sources/000/819/725/infection-veinonly-2.mp4",
),
},
{ {
"#url" : "https://www.artstation.com/artwork/g4WPK", "#url" : "https://www.artstation.com/artwork/g4WPK",
"#comment" : "embedded youtube video", "#comment" : "embedded youtube video",

Loading…
Cancel
Save