Last active
December 30, 2022 13:59
-
-
Save Dobby233Liu/94572a12c2473a3d68103326665c9b24 to your computer and use it in GitHub Desktop.
I hate the live_chat data format
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import json | |
import sys | |
def cmd_maybe(cmd, type): | |
return type in cmd | |
def cmd_as(cmd, type): | |
return cmd[type] | |
def cmds_iter(real_iter, type): | |
for i in real_iter: | |
yield cmd_as(i, type) | |
def msg_has_moderator_badge(msg): | |
if "authorBadges" not in msg: | |
return False | |
for badge in cmds_iter(msg["authorBadges"], "liveChatAuthorBadgeRenderer"): | |
if "icon" not in badge: | |
continue | |
icon_type = badge["icon"]["iconType"] | |
if icon_type == "MODERATOR": | |
return True | |
return False | |
def msg_renderer_from_action(action_data): | |
if cmd_maybe(action_data, "addChatItemAction"): | |
action = cmd_as(action_data, "addChatItemAction") | |
renderer_data = action["item"] | |
renderer_potential_types = [ | |
"liveChatTextMessageRenderer", | |
"liveChatPaidMessageRenderer", | |
"liveChatPaidStickerRenderer", | |
"liveChatSponsorshipsGiftPurchaseAnnouncementRenderer", | |
"liveChatSponsorshipsGiftRedemptionAnnouncementRenderer" | |
] | |
renderer = None | |
for type in renderer_potential_types: | |
if cmd_maybe(renderer_data, type): | |
renderer = cmd_as(renderer_data, type) | |
break | |
if renderer is not None and cmd_maybe(renderer_data, "liveChatSponsorshipsGiftPurchaseAnnouncementRenderer"): | |
# Why, YouTube? | |
return cmd_as(renderer["header"], "liveChatSponsorshipsHeaderRenderer") | |
return renderer | |
elif cmd_maybe(action_data, "addBannerToLiveChatCommand"): | |
action = cmd_as(action_data, "addBannerToLiveChatCommand") | |
parent_renderer = cmd_as(action["bannerRenderer"], "liveChatBannerRenderer") | |
return cmd_as(parent_renderer["contents"], "liveChatTextMessageRenderer") | |
elif cmd_maybe(action_data, "addLiveChatTickerItemAction"): | |
action = cmd_as(action_data, "addLiveChatTickerItemAction") | |
parent_renderer_data = action["item"] | |
if cmd_maybe(parent_renderer_data, "liveChatTickerPaidMessageItemRenderer"): | |
parent_renderer = cmd_as(parent_renderer_data, "liveChatTickerPaidMessageItemRenderer") | |
renderer_type = "liveChatPaidMessageRenderer" | |
elif cmd_maybe(parent_renderer_data, "liveChatTickerPaidStickerItemRenderer"): | |
parent_renderer = cmd_as(parent_renderer_data, "liveChatTickerPaidStickerItemRenderer") | |
renderer_type = "liveChatPaidStickerRenderer" | |
else: | |
return None | |
render_container = cmd_as(parent_renderer["showItemEndpoint"], "showLiveChatItemEndpoint") | |
return cmd_as(render_container["renderer"], renderer_type) | |
def retrieve_mods_from_lc_cmds(lc): | |
moderators = {} | |
for cmd in cmds_iter(lc, "replayChatItemAction"): | |
for action_data in cmd["actions"]: | |
msg = msg_renderer_from_action(action_data) | |
if not msg: | |
continue | |
if msg_has_moderator_badge(msg): | |
ucid = msg["authorExternalChannelId"] | |
display_name = msg["authorName"]["simpleText"] | |
if ucid not in moderators: | |
moderators[ucid] = display_name | |
return moderators | |
with open(sys.argv[1], "r") as f: | |
lc = json.load(f) | |
moderators = retrieve_mods_from_lc_cmds(lc) | |
print("Mods found: %i" % len(moderators)) | |
for ucid, display_name in moderators.items(): | |
print (""" | |
* %s | |
https://www.youtube.com/channel/%s""" % (display_name, ucid)) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment