From e9a2738257d0b195b41cf3cf4e90aead64e823ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mike=20F=C3=A4hrmann?= Date: Sat, 13 May 2017 21:42:29 +0200 Subject: [PATCH] [deviantart] support images on top of journal entries example: http://raxnae.deviantart.com/art/Kami-s-Journal-679482236 --- gallery_dl/extractor/deviantart.py | 56 +++++++++++++++++++----------- 1 file changed, 36 insertions(+), 20 deletions(-) diff --git a/gallery_dl/extractor/deviantart.py b/gallery_dl/extractor/deviantart.py index fa866a47..629cee50 100644 --- a/gallery_dl/extractor/deviantart.py +++ b/gallery_dl/extractor/deviantart.py @@ -11,6 +11,7 @@ from .common import Extractor, Message from .. import text, exception from ..cache import cache +import itertools import datetime import time import re @@ -59,7 +60,8 @@ class DeviantartExtractor(Extractor): yield self.commit(deviation, deviation["flash"]) if "excerpt" in deviation: - yield self.commit_journal(deviation) + journal = self.api.deviation_content(deviation["deviationid"]) + yield self.commit_journal(deviation, journal) def deviations(self): """Return an iterable containing all relevant Deviation-objects""" @@ -68,7 +70,7 @@ class DeviantartExtractor(Extractor): @staticmethod def prepare(deviation): """Adjust the contents of a Deviation-object""" - for key in ("stats", "preview", "thumbs"): + for key in ("stats", "preview", "is_favourited", "allows_comments"): if key in deviation: del deviation[key] try: @@ -83,22 +85,27 @@ class DeviantartExtractor(Extractor): deviation["extension"] = deviation["target"]["extension"] return Message.Url, url, deviation - def commit_journal(self, deviation): - journal = self.api.deviation_content(deviation["deviationid"]) + @staticmethod + def commit_journal(deviation, journal): + title = text.escape(deviation["title"]) + date = datetime.datetime.utcfromtimestamp(deviation["published_time"]) + url = deviation["url"] + thumbs = deviation["thumbs"] + shadow = SHADOW_TEMPLATE.format_map(thumbs[0]) if thumbs else "" + catlist = deviation["category_path"].split("/") if "css" in journal: css, cls = journal["css"], "withskin" else: css, cls = "", "journal-green" - title = text.escape(deviation["title"]) - date = datetime.datetime.fromtimestamp(deviation["published_time"]) - url = deviation["url"] - categories = " / ".join( - ('{}').format(cat, cat.capitalize()) - for cat in deviation["category_path"].split("/") + ('' + '{}').format(catpath, cat.capitalize()) + for cat, catpath in zip( + catlist, + itertools.accumulate(catlist, lambda t, c: t + "/" + c) + ) ) header = HEADER_TEMPLATE.format( title=title, @@ -111,6 +118,7 @@ class DeviantartExtractor(Extractor): html = JOURNAL_TEMPLATE.format( title=title, html=journal["html"].replace('
', header, 1), + shadow=shadow, css=css, cls=cls, ) @@ -125,7 +133,7 @@ class DeviantartGalleryExtractor(DeviantartExtractor): pattern = [r"(?:https?://)?([^.]+)\.deviantart\.com(?:/gallery)?/?$"] test = [("http://shimoda7.deviantart.com/gallery/", { "url": "63bfa8efba199e27181943c9060f6770f91a8441", - "keyword": "b02f5487481142ca44c22542333191aa2cdfb7ee", + "keyword": "e017b1eec5d052dedbb219259ae8c01d0db678a3", })] def __init__(self, match): @@ -146,7 +154,7 @@ class DeviantartDeviationExtractor(DeviantartExtractor): (("http://shimoda7.deviantart.com/art/" "For-the-sake-of-a-memory-10073852"), { "url": "71345ce3bef5b19bd2a56d7b96e6b5ddba747c2e", - "keyword": "655b09c8719e40f623050df23cc7877093f0a449", + "keyword": "597be070582e105489e82cce531888d07f9d45b1", "content": "6a7c74dc823ebbd457bdd9b3c2838a6ee728091e", }), ("https://zzz.deviantart.com/art/zzz-1234567890", { @@ -154,7 +162,7 @@ class DeviantartDeviationExtractor(DeviantartExtractor): }), ("http://sta.sh/01ijs78ebagf", { "url": "1692cd075059d24657a01b954413c84a56e2de8f", - "keyword": "d62ba4e75bccf250672d06ab49c64c44a275e4f2", + "keyword": "659fdf02d7de2e9181468286de19c526348ca1a1", }), ("http://sta.sh/abcdefghijkl", { "exception": exception.NotFoundError, @@ -182,12 +190,12 @@ class DeviantartFavoriteExtractor(DeviantartExtractor): r"(?:/((\d+)/([^/?]+)|\?catpath=/))?"] test = [ ("http://rosuuri.deviantart.com/favourites/58951174/Useful", { - "url": "13c72f436f8324e52660a16b7bccedab92ce8186", - "keyword": "9ae736fd906d7b3a41d81dd5f2488fd8537a5858", + "url": "1ca1c56a1ed2e3df2f8fed267c0497cba4717cab", + "keyword": "44fe61c5b20db8d90d4e06b86346630289f1db7d", }), ("http://h3813067.deviantart.com/favourites/", { "url": "71345ce3bef5b19bd2a56d7b96e6b5ddba747c2e", - "keyword": "5469fc8c4701b13a9ca1c8b0450c6ac47c7f0e85", + "keyword": "f0c557470ca850da65ec94804a20551b7bda7af5", "content": "6a7c74dc823ebbd457bdd9b3c2838a6ee728091e", }), ] @@ -217,7 +225,6 @@ class DeviantartFavoriteExtractor(DeviantartExtractor): raise exception.NotFoundError("collection") def _deviations_all(self): - import itertools return itertools.chain.from_iterable([ self.api.collections(self.user, folder["folderid"], self.offset) for folder in self.api.collections_folders(self.user) @@ -233,8 +240,8 @@ class DeviantartJournalExtractor(DeviantartExtractor): subcategory = "journal" pattern = [r"(?:https?://)?([^.]+)\.deviantart\.com/journal/?$"] test = [("http://shimoda7.deviantart.com/journal/", { - "url": "05c8998dfc5fb4737e220edc2aa1090efaa9a71d", - "keyword": "8434f8bdd4b38634e206c8689a0906ac10c3fa77", + "url": "f081eb4f6807e77aac9fa0d4d1e62702d23acff5", + "keyword": "9ddc2e130198395c1dfaa55c65b6bf63713ec0a8", })] def __init__(self, match): @@ -360,6 +367,14 @@ class DeviantartAPI(): return +SHADOW_TEMPLATE = """ + + + +

+""" + + HEADER_TEMPLATE = """