import pytchat import sys import os import time import re from datetime import datetime from rich.console import Console from rich.style import Style console = Console() def main(): # Clear the terminal screen os.system('clear') video_id = input("Enter the YouTube Live Stream Video ID: ") # Setup chat logging log_dir = "chat_logs" os.makedirs(log_dir, exist_ok=True) timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") log_filename = os.path.join(log_dir, f"chat_{video_id}_{timestamp}.log") log_file = open(log_filename, "w", encoding="utf-8") console.print(f"[green]Chat will be logged to {log_filename}[/green]") try: livechat = pytchat.create(video_id=video_id) console.print(f"[green]Listening to live chat for video ID: {video_id}[/green]") console.print(f"[green]Video ID accepted: {video_id}[/green]") # Wait for 5 seconds, then clear the screen time.sleep(5) os.system('clear') message_count = 0 while livechat.is_alive(): for c in livechat.get().sync_items(): author_display_name = c.author.name message_text = c.message # pytchat does not provide explicit emote data like the official API # So we rely on regex for text-based emotes and standard emojis. # Process text-based emotes (e.g., :face-purple-sweating:) message_text = re.sub(r'(:[a-zA-Z0-9_-]+:)', r'[blue]\1[/blue]', message_text) # Add coloring for standard emojis emoji_pattern = re.compile( r"""( \U0001F600-\U0001F64F # emoticons \U0001F300-\U0001F5FF # symbols & pictographs \U0001F680-\U0001F6FF # transport & map symbols \U0001F1E0-\U0001F1FF # flags (iOS) \U00002702-\U000027B0 # Dingbats \U000024C2-\U0001F251 # Enclosed characters \U0001F900-\U0001F9FF # Supplemental Symbols and Pictographs \U0000200D # Zero Width Joiner (for emoji sequences) \U0000FE0F # Variation Selector-16 (for emoji presentation) )+""" , re.UNICODE | re.VERBOSE) message_text = emoji_pattern.sub(r'[magenta]\1[/magenta]', message_text) # Alternate background styles background_style = Style(bgcolor="#2B2B2B") if message_count % 2 == 0 else Style(bgcolor="#3A3A3A") # Simple color for username (can be expanded to unique colors per user) username_style = Style(color="#4CAF50", bold=True) # Format message for terminal and log file formatted_message = f"[{username_style}]{author_display_name}[/]: {message_text}" console.print(formatted_message, style=background_style) log_file.write(f"{datetime.now().strftime("%H:%M:%S")} {formatted_message}\n") message_count += 1 except Exception as e: console.print(f"[red]An error occurred: {e}[/red]") finally: log_file.close() save_log = input(f"\nDo you want to save the chat log to {log_filename}? (y/n): ").lower() if save_log != 'y' and save_log != 'yes': os.remove(log_filename) console.print(f"[red]Chat log not saved. {log_filename} deleted.[/red]") else: console.print(f"[green]Chat log saved to {log_filename}[/green]") if __name__ == '__main__': main()