[tiktok] add 'covers' option (#8515)
This commit is contained in:
@@ -5782,6 +5782,16 @@ Description
|
|||||||
Ignore audio tracks
|
Ignore audio tracks
|
||||||
|
|
||||||
|
|
||||||
|
extractor.tiktok.covers
|
||||||
|
-----------------------
|
||||||
|
Type
|
||||||
|
``bool``
|
||||||
|
Default
|
||||||
|
``false``
|
||||||
|
Description
|
||||||
|
Download video covers.
|
||||||
|
|
||||||
|
|
||||||
extractor.tiktok.videos
|
extractor.tiktok.videos
|
||||||
-----------------------
|
-----------------------
|
||||||
Type
|
Type
|
||||||
|
|||||||
@@ -824,6 +824,7 @@
|
|||||||
{
|
{
|
||||||
"audio" : true,
|
"audio" : true,
|
||||||
"videos": true,
|
"videos": true,
|
||||||
|
"covers": false,
|
||||||
|
|
||||||
"user": {
|
"user": {
|
||||||
"avatar": true,
|
"avatar": true,
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ class TiktokExtractor(Extractor):
|
|||||||
def _init(self):
|
def _init(self):
|
||||||
self.audio = self.config("audio", True)
|
self.audio = self.config("audio", True)
|
||||||
self.video = self.config("videos", True)
|
self.video = self.config("videos", True)
|
||||||
|
self.cover = self.config("covers", False)
|
||||||
|
|
||||||
def items(self):
|
def items(self):
|
||||||
for tiktok_url in self.urls():
|
for tiktok_url in self.urls():
|
||||||
@@ -73,8 +74,11 @@ class TiktokExtractor(Extractor):
|
|||||||
elif url := self._extract_audio(post):
|
elif url := self._extract_audio(post):
|
||||||
yield Message.Url, url, post
|
yield Message.Url, url, post
|
||||||
|
|
||||||
elif self.video and "video" in post:
|
elif "video" in post:
|
||||||
ytdl_media = "video"
|
if self.video:
|
||||||
|
ytdl_media = "video"
|
||||||
|
if self.cover and (url := self._extract_cover(post, "video")):
|
||||||
|
yield Message.Url, url, post
|
||||||
|
|
||||||
else:
|
else:
|
||||||
self.log.info("%s: Skipping post", tiktok_url)
|
self.log.info("%s: Skipping post", tiktok_url)
|
||||||
@@ -143,6 +147,30 @@ class TiktokExtractor(Extractor):
|
|||||||
post["extension"] = "mp3"
|
post["extension"] = "mp3"
|
||||||
return url
|
return url
|
||||||
|
|
||||||
|
def _extract_cover(self, post, type):
|
||||||
|
media = post[type]
|
||||||
|
|
||||||
|
for cover_id in ("thumbnail", "cover", "originCover", "dynamicCover"):
|
||||||
|
if url := media.get(cover_id):
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
return
|
||||||
|
|
||||||
|
text.nameext_from_url(url, post)
|
||||||
|
post.update({
|
||||||
|
"type" : "cover",
|
||||||
|
"extension": "jpg",
|
||||||
|
"image" : url,
|
||||||
|
"title" : post["desc"] or f"TikTok {type} cover #{post['id']}",
|
||||||
|
"duration" : media.get("duration"),
|
||||||
|
"num" : 0,
|
||||||
|
"img_id" : "",
|
||||||
|
"cover_id" : cover_id,
|
||||||
|
"width" : 0,
|
||||||
|
"height" : 0,
|
||||||
|
})
|
||||||
|
return url
|
||||||
|
|
||||||
def _check_status_code(self, detail, url):
|
def _check_status_code(self, detail, url):
|
||||||
status = detail.get("statusCode")
|
status = detail.get("statusCode")
|
||||||
if not status:
|
if not status:
|
||||||
|
|||||||
@@ -111,6 +111,16 @@ __tests__ = (
|
|||||||
"#options" : {"videos": True, "audio": True},
|
"#options" : {"videos": True, "audio": True},
|
||||||
},
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
"#url" : "https://www.tiktok.com/@memezar/video/7449708266168274208",
|
||||||
|
"#comment" : "video post cover image",
|
||||||
|
"#class" : tiktok.TiktokPostExtractor,
|
||||||
|
"#pattern" : r"https://p19-common-sign-useastred.tiktokcdn-eu.com/tos-useast2a-p-0037-euttp/o4rVzhI1bABhooAaEqtCAYGi6nijIsDib8NGfC~tplv-tiktokx-origin.image\?dr=10395&x-expires=\d+&x-signature=.+",
|
||||||
|
"#options" : {"videos": False, "covers": True},
|
||||||
|
|
||||||
|
|
||||||
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
"#url" : "https://www.tiktok.com/@memezar/photo/7449708266168274208",
|
"#url" : "https://www.tiktok.com/@memezar/photo/7449708266168274208",
|
||||||
"#comment" : "Video post as a /photo/ link",
|
"#comment" : "Video post as a /photo/ link",
|
||||||
|
|||||||
Reference in New Issue
Block a user