Skip to content

Instantly share code, notes, and snippets.

@Dobby233Liu
Last active December 30, 2022 13:59
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Dobby233Liu/94572a12c2473a3d68103326665c9b24 to your computer and use it in GitHub Desktop.
Save Dobby233Liu/94572a12c2473a3d68103326665c9b24 to your computer and use it in GitHub Desktop.
I hate the live_chat data format
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