@@ -236,8 +236,12 @@ def _load_curl(self) -> None:
236236 self ._req = {}
237237
238238 def _log_request_health_hint (self ) -> None :
239- headers = {str (k ).lower (): str (v ) for k , v in self ._req .get ("headers" , {}).items ()}
240- cookies = {str (k ).lower (): str (v ) for k , v in self ._req .get ("cookies" , {}).items ()}
239+ headers = {
240+ str (k ).lower (): str (v ) for k , v in self ._req .get ("headers" , {}).items ()
241+ }
242+ cookies = {
243+ str (k ).lower (): str (v ) for k , v in self ._req .get ("cookies" , {}).items ()
244+ }
241245 warnings : list [str ] = []
242246
243247 if "authorization" not in headers :
@@ -465,11 +469,7 @@ def _save_errored_tweet(self, tweet: dict, error_msg: str) -> None:
465469 )
466470
467471 def _user_field (self , tweet : dict , key : str ) -> str :
468- result = (
469- tweet .get ("core" , {})
470- .get ("user_results" , {})
471- .get ("result" , {})
472- )
472+ result = tweet .get ("core" , {}).get ("user_results" , {}).get ("result" , {})
473473 # New API shape: name/screen_name live in result.core; image in result.avatar
474474 if key in ("name" , "screen_name" , "created_at" ):
475475 value = result .get ("core" , {}).get (key , "" )
@@ -590,6 +590,9 @@ def _parse_single_tweet(self, tw: dict) -> Tweet | None:
590590 # media
591591 media_items , media_types = self ._collect_media (tw )
592592
593+ # subscriber-only (creator subscription / Super Follow)
594+ is_subscriber_only = bool (tw .get ("exclusivityInfo" ))
595+
593596 # reply/quote/retweet handling (best-effort)
594597 title = f"{ user_name } tweeted"
595598 quoted = tw .get ("quoted_status_result" ) or None
@@ -666,6 +669,7 @@ def _parse_nested(n: dict) -> Tweet | None:
666669 retweets = retweets ,
667670 replies = replies ,
668671 views = views ,
672+ is_subscriber_only = is_subscriber_only ,
669673 quoted_tweet = quoted_tweet ,
670674 )
671675
@@ -791,7 +795,7 @@ async def _example_stream():
791795
792796
793797# if __name__ == "__main__":
794- # asyncio.run(_example_stream())
795- # Set os env XCLIENT_DEBUG_HTTP
796- # os.environ["XCLIENT_DEBUG_HTTP"] = "1"
797- # asyncio.run(_example_once())
798+ # asyncio.run(_example_stream())
799+ # Set os env XCLIENT_DEBUG_HTTP
800+ # os.environ["XCLIENT_DEBUG_HTTP"] = "1"
801+ # asyncio.run(_example_once())
0 commit comments