[tenor] add 'user' extractor (#6075)
This commit is contained in:
@@ -940,7 +940,7 @@ Consider all listed sites to potentially be NSFW.
|
||||
<tr>
|
||||
<td>Tenor</td>
|
||||
<td>https://tenor.com/</td>
|
||||
<td>individual Images, Search Results</td>
|
||||
<td>individual Images, Search Results, User Profiles</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
|
||||
@@ -57,6 +57,47 @@ class TenorExtractor(Extractor):
|
||||
if fmt in media_formats:
|
||||
return media_formats[fmt]
|
||||
|
||||
def _search_results(self, query):
|
||||
url = "https://tenor.googleapis.com/v2/search"
|
||||
params = {
|
||||
"appversion": "browser-r20250225-1",
|
||||
"prettyPrint": "false",
|
||||
"key": "AIzaSyC-P6_qz3FzCoXGLk6tgitZo4jEJ5mLzD8",
|
||||
"client_key": "tenor_web",
|
||||
"locale": "en",
|
||||
"anon_id": "",
|
||||
"q": query,
|
||||
"limit": "50",
|
||||
"contentfilter": "low",
|
||||
"media_filter": "gif,gif_transparent,mediumgif,tinygif,"
|
||||
"tinygif_transparent,webp,webp_transparent,"
|
||||
"tinywebp,tinywebp_transparent,tinymp4,mp4,webm,"
|
||||
"originalgif,gifpreview",
|
||||
"fields": "next,results.id,results.media_formats,results.title,"
|
||||
"results.h1_title,results.long_title,results.itemurl,"
|
||||
"results.url,results.created,results.user,"
|
||||
"results.shares,results.embed,results.hasaudio,"
|
||||
"results.policy_status,results.source_id,results.flags,"
|
||||
"results.tags,results.content_rating,results.bg_color,"
|
||||
"results.legacy_info,results.geographic_restriction,"
|
||||
"results.content_description",
|
||||
"pos": None,
|
||||
"component": "web_desktop",
|
||||
}
|
||||
headers = {
|
||||
"Referer": self.root + "/",
|
||||
"Origin" : self.root,
|
||||
}
|
||||
|
||||
while True:
|
||||
data = self.request(url, params=params, headers=headers).json()
|
||||
|
||||
yield from data["results"]
|
||||
|
||||
params["pos"] = data.get("next")
|
||||
if not params["pos"]:
|
||||
return
|
||||
|
||||
def metadata(self):
|
||||
return False
|
||||
|
||||
@@ -93,43 +134,14 @@ class TenorSearchExtractor(TenorExtractor):
|
||||
return {"search_tags": self.search_tags}
|
||||
|
||||
def gifs(self):
|
||||
url = "https://tenor.googleapis.com/v2/search"
|
||||
params = {
|
||||
"appversion": "browser-r20250225-1",
|
||||
"prettyPrint": "false",
|
||||
"key": "AIzaSyC-P6_qz3FzCoXGLk6tgitZo4jEJ5mLzD8",
|
||||
"client_key": "tenor_web",
|
||||
"locale": "en",
|
||||
"anon_id": "",
|
||||
"q": self.search_tags,
|
||||
"limit": "50",
|
||||
"contentfilter": "low",
|
||||
"media_filter": "gif,gif_transparent,mediumgif,tinygif,"
|
||||
"tinygif_transparent,webp,webp_transparent,"
|
||||
"tinywebp,tinywebp_transparent,tinymp4,mp4,webm,"
|
||||
"originalgif,gifpreview",
|
||||
"fields": "next,results.id,results.media_formats,results.title,"
|
||||
"results.h1_title,results.long_title,results.itemurl,"
|
||||
"results.url,results.created,results.user,"
|
||||
"results.shares,results.embed,results.hasaudio,"
|
||||
"results.policy_status,results.source_id,results.flags,"
|
||||
"results.tags,results.content_rating,results.bg_color,"
|
||||
"results.legacy_info,results.geographic_restriction,"
|
||||
"results.content_description",
|
||||
"searchfilter": "none",
|
||||
"pos": None,
|
||||
"component": "web_desktop",
|
||||
}
|
||||
headers = {
|
||||
"Referer": self.root + "/",
|
||||
"Origin" : self.root,
|
||||
}
|
||||
return self._search_results(self.search_tags)
|
||||
|
||||
while True:
|
||||
data = self.request(url, params=params, headers=headers).json()
|
||||
|
||||
yield from data["results"]
|
||||
class TenorUserExtractor(TenorExtractor):
|
||||
subcategory = "user"
|
||||
directory_fmt = ("{category}", "@{user[username]}")
|
||||
pattern = BASE_PATTERN + r"/users/([^/?#]+)"
|
||||
example = "https://tenor.com/users/USER"
|
||||
|
||||
params["pos"] = data.get("next")
|
||||
if not params["pos"]:
|
||||
return
|
||||
def gifs(self):
|
||||
return self._search_results("@" + self.groups[0])
|
||||
|
||||
@@ -17,7 +17,7 @@ __tests__ = (
|
||||
"content_description": "an illustration of a tree with green leaves",
|
||||
"created" : 1687512768.687436,
|
||||
"date" : "dt:2023-06-23 09:32:48",
|
||||
"embed" : "<div class=\"tenor-gif-embed\" data-postid=\"8525772382434057283\" data-share-method=\"host\" data-aspect-ratio=\"0.937751\" data-width=\"100%\"><a href=\"https://tenor.com/view/moving-gif-8525772382434057283\">Moving Sticker</a>from <a href=\"https://tenor.com/search/moving-stickers\">Moving Stickers</a></div> <script type=\"text/javascript\" async src=\"https://tenor.com/embed.js\"></script>",
|
||||
"embed" : r"re:<div class=.+",
|
||||
"extension": "gif",
|
||||
"filename" : "moving",
|
||||
"h1_title" : "Moving Sticker",
|
||||
@@ -30,7 +30,7 @@ __tests__ = (
|
||||
"long_title": "Moving Sticker - Moving Stickers",
|
||||
"media_formats": dict,
|
||||
"policy_status": "POLICY_STATUS_UNSPECIFIED",
|
||||
"shares" : 42528,
|
||||
"shares" : range(40000, 60000),
|
||||
"source_id": "",
|
||||
"title" : "Moving Sti",
|
||||
"url" : "https://tenor.com/kjYh53rdMGt.gif",
|
||||
@@ -88,4 +88,32 @@ __tests__ = (
|
||||
"search_tags": "trees water wind sun <&>",
|
||||
},
|
||||
|
||||
{
|
||||
"#url" : "https://tenor.com/users/robloxfan123",
|
||||
"#class" : tenor.TenorUserExtractor,
|
||||
"#urls" : "https://media1.tenor.com/m/1auSjzCikuoAAAAC/2016-roblox.gif",
|
||||
|
||||
"user": {
|
||||
"profile_id": "8180139772821505417",
|
||||
"url" : "https://tenor.com/users/ROBLOXfan123",
|
||||
"userid" : "11206759",
|
||||
"username" : "ROBLOXfan123",
|
||||
"usertype" : "user",
|
||||
},
|
||||
},
|
||||
|
||||
{
|
||||
"#url" : "https://tenor.com/users/annetv",
|
||||
"#class" : tenor.TenorUserExtractor,
|
||||
"#pattern": r"https://media\d+\.tenor\.com/m/[\w-]+/[\w%-]+\.gif",
|
||||
"#count" : range(70, 100),
|
||||
|
||||
"user": {
|
||||
"profile_id": "14727075564983373376",
|
||||
"url" : "https://tenor.com/users/annetv",
|
||||
"userid" : "8529134",
|
||||
"username" : "annetv",
|
||||
},
|
||||
},
|
||||
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user