================================================================================ CRUNCHYROLL DOWNLOADER - CHALLENGE 2 SOLUTION Chapter 4: Building Utilities Challenge: Episode Parsing ================================================================================ PROBLEM: Parse episode data to extract show name, episode name, date watched. SOLUTION: ================================================================================ File: crunchyroll_utils.py (episode parsing) def parse_episode(episode: dict) -> dict: """Parse episode data into clean format.""" return { 'show_name': episode.get('series_title', 'Unknown'), 'episode_name': episode.get('title', 'Unknown'), 'episode_number': episode.get('episode_number', ''), 'date_watched': episode.get('last_watch_date', 'Not watched'), 'duration': episode.get('duration_ms', 0) // 1000 // 60, # Convert to minutes 'crunchyroll_id': episode.get('id', '') } def parse_episodes(episodes: list) -> list: """Parse all episodes.""" parsed = [] for ep in episodes: try: parsed_ep = parse_episode(ep) parsed.append(parsed_ep) except Exception as e: print(f"Warning: Could not parse episode: {e}") continue return parsed USAGE ================================================================================ from crunchyroll_utils import parse_episodes raw_episodes = [ { 'series_title': 'Attack on Titan', 'title': 'Colossus', 'episode_number': '1', 'last_watch_date': '2026-06-15T12:30:00', 'duration_ms': 1380000, 'id': 'G123456' }, ... ] parsed = parse_episodes(raw_episodes) for ep in parsed[:3]: print(f"{ep['show_name']} - Ep {ep['episode_number']}: {ep['episode_name']}") OUTPUT ================================================================================ Attack on Titan - Ep 1: Colossus Demon Slayer - Ep 1: Demon Slayer Jujutsu Kaisen - Ep 1: Curse Womb ================================================================================