[twitter] update/fix 'pinned' Tweet extraction (#8500)
- handle pins from 'pinned_tweet_ids_str' - provide 'pinned' metadata
This commit is contained in:
@@ -438,6 +438,8 @@ class TwitterExtractor(Extractor):
|
|||||||
txt, _, tco = content.rpartition(" ")
|
txt, _, tco = content.rpartition(" ")
|
||||||
tdata["content"] = txt if tco.startswith("https://t.co/") else content
|
tdata["content"] = txt if tco.startswith("https://t.co/") else content
|
||||||
|
|
||||||
|
if "pinned" in tweet:
|
||||||
|
tdata["pinned"] = True
|
||||||
if "birdwatch_pivot" in tweet:
|
if "birdwatch_pivot" in tweet:
|
||||||
try:
|
try:
|
||||||
tdata["birdwatch"] = \
|
tdata["birdwatch"] = \
|
||||||
@@ -1887,7 +1889,7 @@ class TwitterAPI():
|
|||||||
features=None, field_toggles=None):
|
features=None, field_toggles=None):
|
||||||
extr = self.extractor
|
extr = self.extractor
|
||||||
original_retweets = (extr.retweets == "original")
|
original_retweets = (extr.retweets == "original")
|
||||||
pinned_tweet = extr.pinned
|
pinned_tweet = True if extr.pinned else None
|
||||||
stop_tweets_max = stop_tweets
|
stop_tweets_max = stop_tweets
|
||||||
api_retries = None
|
api_retries = None
|
||||||
|
|
||||||
@@ -1927,7 +1929,7 @@ class TwitterAPI():
|
|||||||
elif instr_type == "TimelineAddToModule":
|
elif instr_type == "TimelineAddToModule":
|
||||||
entries = instr["moduleItems"]
|
entries = instr["moduleItems"]
|
||||||
elif instr_type == "TimelinePinEntry":
|
elif instr_type == "TimelinePinEntry":
|
||||||
if pinned_tweet:
|
if pinned_tweet is not None:
|
||||||
pinned_tweet = instr["entry"]
|
pinned_tweet = instr["entry"]
|
||||||
elif instr_type == "TimelineReplaceEntry":
|
elif instr_type == "TimelineReplaceEntry":
|
||||||
entry = instr["entry"]
|
entry = instr["entry"]
|
||||||
@@ -1984,12 +1986,10 @@ class TwitterAPI():
|
|||||||
tweet = None
|
tweet = None
|
||||||
api_tries = 1
|
api_tries = 1
|
||||||
|
|
||||||
if pinned_tweet:
|
if pinned_tweet is not None and isinstance(pinned_tweet, dict):
|
||||||
if isinstance(pinned_tweet, dict):
|
pinned_tweet["pinned"] = True
|
||||||
tweets.append(pinned_tweet)
|
tweets.append(pinned_tweet)
|
||||||
elif instructions[-1]["type"] == "TimelinePinEntry":
|
pinned_tweet = None
|
||||||
tweets.append(instructions[-1]["entry"])
|
|
||||||
pinned_tweet = False
|
|
||||||
|
|
||||||
for entry in entries:
|
for entry in entries:
|
||||||
esw = entry["entryId"].startswith
|
esw = entry["entryId"].startswith
|
||||||
@@ -2020,6 +2020,26 @@ class TwitterAPI():
|
|||||||
tweet = True
|
tweet = True
|
||||||
cursor = cursor.get("value")
|
cursor = cursor.get("value")
|
||||||
|
|
||||||
|
if pinned_tweet is not None:
|
||||||
|
if pinned := extr._user_obj["legacy"].get(
|
||||||
|
"pinned_tweet_ids_str"):
|
||||||
|
pinned = f"-tweet-{pinned[0]}"
|
||||||
|
for idx, entry in enumerate(tweets):
|
||||||
|
if entry["entryId"].endswith(pinned):
|
||||||
|
# mark as pinned / set 'pinned = True'
|
||||||
|
pinned_tweet = (
|
||||||
|
(entry.get("content") or entry["item"])
|
||||||
|
["itemContent"]["tweet_results"]["result"])
|
||||||
|
if "tweet" in pinned_tweet:
|
||||||
|
pinned_tweet = pinned_tweet["tweet"]
|
||||||
|
pinned_tweet["pinned"] = True
|
||||||
|
# move to front of 'tweets'
|
||||||
|
del tweets[idx]
|
||||||
|
tweets.insert(0, entry)
|
||||||
|
break
|
||||||
|
del pinned
|
||||||
|
pinned_tweet = None
|
||||||
|
|
||||||
for entry in tweets:
|
for entry in tweets:
|
||||||
try:
|
try:
|
||||||
item = ((entry.get("content") or entry["item"])
|
item = ((entry.get("content") or entry["item"])
|
||||||
|
|||||||
Reference in New Issue
Block a user