diff options
Diffstat (limited to 'gallery_dl/extractor/deviantart.py')
| -rw-r--r-- | gallery_dl/extractor/deviantart.py | 107 |
1 files changed, 91 insertions, 16 deletions
diff --git a/gallery_dl/extractor/deviantart.py b/gallery_dl/extractor/deviantart.py index 69934b4..8172f62 100644 --- a/gallery_dl/extractor/deviantart.py +++ b/gallery_dl/extractor/deviantart.py @@ -440,7 +440,8 @@ class DeviantartExtractor(Extractor): html.append("text-align:") html.append(attrs["textAlign"]) html.append(";") - html.append('margin-inline-start:0px">') + self._tiptap_process_indentation(html, attrs) + html.append('">') for block in children: self._tiptap_process_content(html, block) @@ -460,17 +461,32 @@ class DeviantartExtractor(Extractor): html.append(' style="text-align:') html.append(attrs.get("textAlign") or "left") html.append('">') - html.append('<span style="margin-inline-start:0px">') - - children = content.get("content") - if children: - for block in children: - self._tiptap_process_content(html, block) - + html.append('<span style="') + self._tiptap_process_indentation(html, attrs) + html.append('">') + self._tiptap_process_children(html, content) html.append("</span></h") html.append(level) html.append(">") + elif type in ("listItem", "bulletList", "orderedList", "blockquote"): + c = type[1] + tag = ( + "li" if c == "i" else + "ul" if c == "u" else + "ol" if c == "r" else + "blockquote" + ) + html.append("<" + tag + ">") + self._tiptap_process_children(html, content) + html.append("</" + tag + ">") + + elif type == "anchor": + attrs = content["attrs"] + html.append('<a id="') + html.append(attrs.get("id") or "") + html.append('" data-testid="anchor"></a>') + elif type == "hardBreak": html.append("<br/><br/>") @@ -488,6 +504,44 @@ class DeviantartExtractor(Extractor): html.append(user) html.append('</a>') + elif type == "da-gif": + attrs = content["attrs"] + width = str(attrs.get("width") or "") + height = str(attrs.get("height") or "") + url = text.escape(attrs.get("url") or "") + + html.append('<div data-da-type="da-gif" data-width="') + html.append(width) + html.append('" data-height="') + html.append(height) + html.append('" data-alignment="') + html.append(attrs.get("alignment") or "") + html.append('" data-url="') + html.append(url) + html.append('" class="t61qu"><video role="img" autoPlay="" ' + 'muted="" loop="" style="pointer-events:none" ' + 'controlsList="nofullscreen" playsInline="" ' + 'aria-label="gif" data-da-type="da-gif" width="') + html.append(width) + html.append('" height="') + html.append(height) + html.append('" src="') + html.append(url) + html.append('" class="_1Fkk6"></video></div>') + + elif type == "da-video": + src = text.escape(content["attrs"].get("src") or "") + html.append('<div data-testid="video" data-da-type="da-video" ' + 'data-src="') + html.append(src) + html.append('" class="_1Uxvs"><div data-canfs="yes" data-testid="v' + 'ideo-inner" class="main-video" style="width:780px;hei' + 'ght:438px"><div style="width:780px;height:438px">' + '<video src="') + html.append(src) + html.append('" style="width:100%;height:100%;" preload="auto" cont' + 'rols=""></video></div></div></div>') + else: self.log.warning("Unsupported content type '%s'", type) @@ -501,7 +555,13 @@ class DeviantartExtractor(Extractor): attrs = mark.get("attrs") or {} html.append('<a href="') html.append(text.escape(attrs.get("href") or "")) - html.append('" rel="noopener noreferrer nofollow ugc">') + if "target" in attrs: + html.append('" target="') + html.append(attrs["target"]) + html.append('" rel="') + html.append(attrs.get("rel") or + "noopener noreferrer nofollow ugc") + html.append('">') close.append("</a>") elif type == "bold": html.append("<strong>") @@ -525,6 +585,18 @@ class DeviantartExtractor(Extractor): else: html.append(text.escape(content["text"])) + def _tiptap_process_children(self, html, content): + children = content.get("content") + if children: + for block in children: + self._tiptap_process_content(html, block) + + def _tiptap_process_indentation(self, html, attrs): + itype = ("text-indent" if attrs.get("indentType") == "line" else + "margin-inline-start") + isize = str((attrs.get("indentation") or 0) * 24) + html.append(itype + ":" + isize + "px") + def _tiptap_process_deviation(self, html, content): dev = content["attrs"]["deviation"] media = dev.get("media") or () @@ -758,19 +830,22 @@ x2="45.4107524%" y2="71.4898596%" id="app-root-3">\ self.api.user_friends_unwatch(username) def _eclipse_media(self, media, format="preview"): - url = [media["baseUri"], ] + url = [media["baseUri"]] formats = { fmt["t"]: fmt for fmt in media["types"] } - tokens = media["token"] - if len(tokens) == 1: - fmt = formats[format] - url.append(fmt["c"].replace("<prettyName>", media["prettyName"])) - url.append("?token=") - url.append(tokens[-1]) + tokens = media.get("token") or () + if tokens: + if len(tokens) <= 1: + fmt = formats[format] + if "c" in fmt: + url.append(fmt["c"].replace( + "<prettyName>", media["prettyName"])) + url.append("?token=") + url.append(tokens[-1]) return "".join(url), formats |
