summaryrefslogtreecommitdiffstats
path: root/gallery_dl/extractor/deviantart.py
diff options
context:
space:
mode:
Diffstat (limited to 'gallery_dl/extractor/deviantart.py')
-rw-r--r--gallery_dl/extractor/deviantart.py107
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