From fcbf07b14101dc2a0e34ff6a6a953095f0196993 Mon Sep 17 00:00:00 2001 From: Jarian Cottingham Date: Sat, 27 Dec 2025 00:00:01 -0600 Subject: [PATCH] multi video support, yt-dlp fix --- config.json | 14 - structure.md | 36 + youtube_cli/__main__.py | 9 - youtube_cli/main.py | 1066 ++++++--- ~/Downloads/youtube/downloaded_videos.json | 2347 ++++++++++++++++++++ 5 files changed, 3137 insertions(+), 335 deletions(-) delete mode 100644 config.json create mode 100644 structure.md create mode 100644 ~/Downloads/youtube/downloaded_videos.json diff --git a/config.json b/config.json deleted file mode 100644 index 3c2c482..0000000 --- a/config.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "download_dir": "~/Downloads/youtube", - "default_locations": [ - "~/Downloads/youtube", - "~/Movies/youtube", - "/tmp/youtube" - ], - "max_videos_per_page": 15, - "yt_dlp_args": { - "format": "bestvideo[height=1080]+bestaudio/bestvideo[height<=1080]+bestaudio", - "write_thumbnail": true, - "extractor_args": "youtube:player-client=default,-tv_simply" - } -} diff --git a/structure.md b/structure.md new file mode 100644 index 0000000..41b839a --- /dev/null +++ b/structure.md @@ -0,0 +1,36 @@ +# YouTube CLI Project Structure + +## Root Directory Files + +- **.gitignore** - Git ignore file to exclude unnecessary files from version control +- **README.md** - Project documentation and usage instructions +- **requirements.txt** - Python dependencies required for the project +- **run.sh** - Shell script to run the application +- **setup.py** - Python package setup configuration +- **config.json** - Configuration file for the application settings +- **prompt.md** - Prompt template used for generating markdown content + +## Package Directory: youtube_cli + +- **youtube_cli/__init__.py** - Package initialization file +- **youtube_cli/__main__.py** - Main entry point for running the package as a module +- **youtube_cli/main.py** - Core application logic and main functions + +## Package Cache Directory: youtube_cli/__pycache__ + +- **youtube_cli/__pycache__/__init__.cpython-314.pyc** - Compiled Python cache file for __init__.py +- **youtube_cli/__pycache__/__main__.cpython-314.pyc** - Compiled Python cache file for __main__.py +- **youtube_cli/__pycache__/main.cpython-314.pyc** - Compiled Python cache file for main.py + +## Package Info Directory: youtube_cli.egg-info + +- **youtube_cli.egg-info/dependency_links.txt** - Dependency links for the package +- **youtube_cli.egg-info/entry_points.txt** - Entry points for console scripts +- **youtube_cli.egg-info/PKG-INFO** - Package metadata information +- **youtube_cli.egg-info/requires.txt** - Required dependencies for the package +- **youtube_cli.egg-info/SOURCES.txt** - List of source files in the package +- **youtube_cli.egg-info/top_level.txt** - Top-level package names + +## User Data Directory + +- **~/Downloads/youtube/downloaded_videos.json** - JSON file storing information about downloaded videos (user-specific path) \ No newline at end of file diff --git a/youtube_cli/__main__.py b/youtube_cli/__main__.py index b9e4e3e..e69de29 100644 --- a/youtube_cli/__main__.py +++ b/youtube_cli/__main__.py @@ -1,9 +0,0 @@ -#!/usr/bin/env python3 -""" -YouTube CLI - A command-line interface for browsing and downloading YouTube videos -""" - -from .main import main - -if __name__ == "__main__": - main() diff --git a/youtube_cli/main.py b/youtube_cli/main.py index eb716a8..15e54b3 100644 --- a/youtube_cli/main.py +++ b/youtube_cli/main.py @@ -8,6 +8,8 @@ import json import os import subprocess import sys +import time +from datetime import datetime from pathlib import Path from rich.console import Console @@ -17,343 +19,783 @@ from rich.table import Table console = Console() +class YouTubeCLI: + def __init__(self, config_path=None): + self.config = self.load_config(config_path) + self.original_query = None + self.current_page = 1 + self.archive_file = ( + Path(self.config.get("download_dir", "./")) / "downloaded_videos.json" + ) + self.downloaded_videos = self.load_archive() + + def load_config(self, config_path=None): + """Load configuration from file or use defaults.""" + default_config = { + "download_dir": str(Path.home() / "Downloads" / "youtube"), + "default_locations": [ + str(Path.home() / "Downloads" / "youtube"), + str(Path.home() / "Movies" / "youtube"), + "/tmp/youtube", + ], + "max_videos_per_page": 15, + "yt_dlp_args": { + "format": "best", + "write_thumbnail": True, + "extractor_args": "youtube:player-client=default,-tv_simply", + }, + "network_share_path": "/Volumes/MediaServer/Youtube/", + "default_network_subfolder": "General", + } + + if config_path and os.path.exists(config_path): + try: + with open(config_path, "r") as f: + config = json.load(f) + # Merge with defaults + for key, value in default_config.items(): + if key not in config: + config[key] = value + return config + except Exception as e: + console.print(f"[red]Error loading config: {e}[/red]") + + return default_config + + def load_archive(self): + """Load the archive of already downloaded videos.""" + try: + if self.archive_file.exists(): + with open(self.archive_file, "r") as f: + return json.load(f) + else: + # Initialize empty archive + self.save_archive({}) + return {} + except Exception as e: + console.print(f"[red]Error loading archive: {e}[/red]") + return {} + + def save_archive(self, videos_dict): + """Save the archive of downloaded videos.""" + try: + with open(self.archive_file, "w") as f: + json.dump(videos_dict, f, indent=2) + except Exception as e: + console.print(f"[red]Error saving archive: {e}[/red]") + + def is_video_downloaded(self, video_id): + """Check if a video has already been downloaded.""" + return video_id in self.downloaded_videos + + def add_to_archive(self, video_info): + """Add a video to the archive of downloaded videos.""" + try: + video_id = video_info.get("id") + if video_id: + self.downloaded_videos[video_id] = { + "title": video_info.get("title", "Unknown Title"), + "url": video_info.get("url", ""), + "downloaded_at": datetime.now().isoformat(), + } + self.save_archive(self.downloaded_videos) + except Exception as e: + console.print(f"[red]Error adding to archive: {e}[/red]") + console.print(f"[red]Video info being added: {video_info}[/red]") + + def prefill_archive_from_downloads(self): + """Pre-fill the archive with videos that already exist in download directory.""" + try: + download_dir = Path(self.config.get("download_dir", "./")) + if not download_dir.exists(): + return + + # Find existing video files + video_extensions = [".mp4", ".mkv", ".webm", ".flv"] + + for file_path in download_dir.iterdir(): + if file_path.is_file() and file_path.suffix.lower() in video_extensions: + # Extract filename-based identifier + base_name = file_path.stem + # Add this as a pre-downloaded item in archive + self.downloaded_videos[base_name] = { + "title": base_name, + "url": "", + "downloaded_at": datetime.now().isoformat(), + } + + self.save_archive(self.downloaded_videos) + except Exception as e: + console.print(f"[red]Error pre-filling archive: {e}[/red]") + + def copy_to_network_share(self, url, config, network_folder_name): + """Copy downloaded video to network share after download.""" + try: + # Get the download directory + download_dir = Path(config["download_dir"]) + + # Get network share path from config + network_path = Path(config["network_share_path"]) + + # Create the destination folder on network share + if network_folder_name: + dest_dir = network_path / network_folder_name + else: + dest_dir = network_path / config["default_network_subfolder"] + + # Ensure the directory exists on the network share + dest_dir.mkdir(parents=True, exist_ok=True) + + # Find the most recently downloaded video in the download directory + video_files = list(download_dir.glob("*.*")) + if not video_files: + console.print("[yellow]No video files found to copy[/yellow]") + return + + # Sort by modification time to get newest file first + latest_file = max(video_files, key=lambda f: f.stat().st_mtime) + + # Check that it's a video file + if latest_file.suffix.lower() in [".mp4", ".mkv", ".webm", ".flv"]: + dest_path = dest_dir / latest_file.name + import shutil + + shutil.copy2(latest_file, dest_path) + console.print( + f"[green]Copied {latest_file.name} to network share[/green]" + ) + else: + console.print("[yellow]No valid video file found for copying[/yellow]") + + except Exception as e: + console.print(f"[red]Error copying to network share: {e}[/red]") + + def search_videos(self, query, config, page=1): + """Search YouTube videos based on the query using yt-dlp.""" + console.print(f"[blue]Searching YouTube for:[/blue] {query}") + + # Store original query for pagination + self.original_query = query + self.current_page = page + + # Sanitize search query to prevent issues with special characters + import re + + sanitized_query = re.sub(r'[^\w\s\-\'"\.]+', "", query) + + # Construct yt-dlp command for search + cmd = [ + "yt-dlp", + "--flat-playlist", # Get video info without downloading + "--dump-single-json", # Output as JSON single item + f"--playlist-start={15 * (page - 1) + 1}", + f"--playlist-end={15 * page}", + "--no-warnings", + "--no-progress", + "--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36", + "--remote-components", + "ejs:github", + f"ytsearch{15 * page}:{sanitized_query}", + ] + + try: + result = subprocess.run(cmd, capture_output=True, text=True, timeout=60) + + if result.returncode != 0: + console.print(f"[red]Error searching videos: {result.stderr}[/red]") + console.print("[yellow]Try with a simpler search query.[/yellow]") + return + + # Parse JSON output + import json + + try: + data = json.loads(result.stdout.strip()) + except json.JSONDecodeError as e: + console.print(f"[red]Error parsing search results: {e}[/red]") + console.print("[yellow]Try with a simpler search query.[/yellow]") + return + + # Process videos into our format + videos = [] + + if isinstance(data, list): + videos_data = data + elif "entries" in data: + videos_data = data["entries"] + else: + videos_data = [data] + + for entry in videos_data: + if not entry: + continue + + title = entry.get("title", "Unknown Title") + author = entry.get("uploader", "Unknown Author") + duration = entry.get("duration", 0) + url = entry.get("url", "") or entry.get("webpage_url", "") + view_count = entry.get("view_count", None) + playlist_title = entry.get("playlist_title", "") + + # Format duration + length = self.format_duration(duration) + + # Check if this is a short video + is_short = "/shorts/" in url or "/shorts" in url + + # Check if this is a playlist (look for playlist-specific attributes) + is_playlist = "playlist" in url.lower() or "list=" in url + + # Validate URL before adding to videos list + if not url or url.strip() == "": + continue # Skip videos with invalid/missing URLs + + # Create video object + videos.append( + { + "title": title, + "author": author, + "length": length, + "url": url, + "is_short": is_short, + "is_playlist": is_playlist, + "id": entry.get("id", ""), + "thumbnail": entry.get("thumbnail", ""), + "view_count": view_count, + } + ) + + if not videos: + console.print("[yellow]No videos found for your search.[/yellow]") + # Ask user what they'd like to do next + console.print("[blue]Options:[/blue]") + console.print(" [green]s[/green] - Search for a new term") + console.print(" [red]q[/red] - Quit") + user_choice = input("\nChoose an option: ").strip().lower() + + if user_choice == "q": + console.print("[green]Goodbye![/green]") + return + elif user_choice == "s": + search_term = input("Enter search term: ").strip() + if search_term: + console.print(f"[blue]Searching for: {search_term}[/blue]") + self.search_videos(search_term, config, page=1) + else: + console.print("[red]No search term provided.[/red]") + # Return to previous search + if self.original_query: + self.search_videos( + self.original_query, config, page=self.current_page + ) + else: + self.search_videos("placeholder", config, page=1) + else: + console.print( + "[yellow]Invalid option. Returning to search results...[/yellow]" + ) + if self.original_query: + self.search_videos( + self.original_query, config, page=self.current_page + ) + else: + self.search_videos("placeholder", config, page=1) + return + + self.display_videos(videos, config, page=page) + + except subprocess.TimeoutExpired: + console.print("[red]Search timed out. Please try again.[/red]") + except Exception as e: + console.print(f"[red]Error during search: {str(e)}[/red]") + + def format_duration(self, seconds): + """Convert seconds to MM:SS or HH:MM:SS format.""" + if not seconds: + return "0:00" + + hours = int(seconds // 3600) + minutes = int((seconds % 3600) // 60) + secs = int(seconds % 60) + + if hours > 0: + return f"{hours}:{minutes:02d}:{secs:02d}" + else: + return f"{minutes}:{secs:02d}" + + def display_videos(self, videos, config, page=1): + """Display videos in a formatted table.""" + console.print("\n" + "=" * 80) + console.print(f"[bold]YouTube Search Results - Page {page}[/bold]") + console.print("=" * 80) + + table = Table( + title=f"Page {page} of search results", + show_header=True, + header_style="bold magenta", + ) + table.add_column("No.", style="dim", width=3) + table.add_column("Title", width=35) + table.add_column("Author", width=20) + table.add_column("Duration", width=10) + table.add_column("Type", width=8) + + for i, video in enumerate(videos, 1): + title = video["title"] + author = video["author"] + length = video["length"] + + # Mark short videos + if video["is_short"]: + title = f"(short) {title}" + + # Determine type for display + if video["is_playlist"]: + display_type = "Playlist" + elif video["is_short"]: + display_type = "Short" + else: + display_type = "Video" + + table.add_row( + str(i), + title, + author[:18] + "..." if len(author) > 18 else author, + length, + display_type, + ) + + console.print(table) + + # Show pagination options + console.print("=" * 80) + console.print("[blue]Options:[/blue]") + console.print(" [green]n[/green] - Next page") + console.print(" [green]s[/green] - Search for new term (e.g. 's red bananas')") + console.print(" [red]q[/red] - Quit") + console.print( + " [yellow]Number(s)[/yellow] - Select and download video(s) (e.g., 1,2,3 or 1-3)" + ) + + # Get user input + user_input = input("\nChoose an option: ").strip().lower() + + if user_input == "q": + console.print("[green]Goodbye![/green]") + return + + elif user_input == "n": + console.print(f"[blue]Loading page {page + 1}...[/blue]") + # Use the original query for pagination - this preserves the search term + if self.original_query: + self.search_videos(self.original_query, config, page=page + 1) + else: + # Fallback in case original query isn't available (shouldn't happen) + self.search_videos("placeholder", config, page=page + 1) + return + + elif user_input.startswith("s "): + # Search for a new term after 's' + search_term = user_input[2:].strip() # Remove 's ' prefix + if search_term: + console.print(f"[blue]Searching for: {search_term}[/blue]") + self.search_videos(search_term, config, page=1) + else: + console.print("[red]Please provide a search term after 's'.[/red]") + return + + elif user_input == "s": + # Simple search command - prompt for search term + search_term = input("Enter search term: ").strip() + if search_term: + console.print(f"[blue]Searching for: {search_term}[/blue]") + self.search_videos(search_term, config, page=1) + else: + console.print("[red]No search term provided.[/red]") + return + + else: + # Handle download selection (single or multiple videos) + try: + # Check if it's a range format like "1-3" + if "-" in user_input: + try: + start, end = map(int, user_input.split("-")) + video_indices = list(range(start, end + 1)) + except ValueError: + console.print(f"[red]Invalid range format: {user_input}[/red]") + console.print( + "[red]Please use format like '1-7' or '1,2,3'[/red]" + ) + return + else: + # Handle comma-separated numbers + try: + video_indices = [ + int(x.strip()) for x in user_input.split(",") if x.strip() + ] + except ValueError: + console.print(f"[red]Invalid format: {user_input}[/red]") + console.print( + "[red]Please use format like '1-7' or '1,2,3'[/red]" + ) + return + + # Validate indices and download videos in sequence + valid_videos = [] + for idx in video_indices: + if 1 <= idx <= len(videos): + valid_videos.append(videos[idx - 1]) + else: + console.print(f"[red]Invalid video number: {idx}[/red]") + + # Debug information for empty selection + if not valid_videos: + console.print( + "[red]Could not find any valid videos to download.[/red]" + ) + return + + if valid_videos: + # Ask user for network folder name (optional) + network_folder = None + console.print("[blue]Choose download destination:[/blue]") + console.print( + " [green]Enter folder name[/green] - Copy to network share" + ) + console.print( + " [yellow]Press [enter] for default[/yellow] - Download only locally" + ) + + network_input = input("Network folder name: ").strip() + if network_input: + network_folder = network_input + else: + network_folder = None + + console.print( + f"[blue]Downloading {len(valid_videos)} videos in sequence...[/blue]" + ) + for i, selected_video in enumerate(valid_videos): + console.print( + f"\n[blue]Downloading video {i + 1}/{len(valid_videos)}:[/blue] {selected_video['title']}" + ) + # Check if this is a playlist and download accordingly + if selected_video.get("is_playlist", False): + self.download_playlist( + selected_video["url"], config, network_folder + ) + else: + self.download_video( + selected_video["url"], + config, + network_folder=network_folder, + ) + + # Give a small pause between downloads to avoid rate limiting + if ( + i < len(valid_videos) - 1 + ): # Don't pause after the last download + time.sleep(2) + + # Return to search results after all downloads complete + if self.original_query: + console.print("[blue]Returning to search results...[/blue]") + self.search_videos( + self.original_query, config, page=self.current_page + ) + else: + console.print("[red]No valid videos selected for download.[/red]") + + except ValueError: + console.print( + "[red]Invalid input. Please enter a number or range of numbers, 'n', 's', or 'q'.[/red]" + ) + + def download_video(self, url, config, network_folder=None): + """Download a video using yt-dlp with progress bar.""" + + # Validate URL before proceeding + if not url or not isinstance(url, str) or url.strip() == "": + console.print("[red]Error: Invalid or empty video URL provided.[/red]") + return + + console.print(f"[blue]Preparing to download:[/blue] {url}") + + # Check if yt-dlp is available + try: + subprocess.run(["yt-dlp", "--version"], capture_output=True, check=True) + except (subprocess.CalledProcessError, FileNotFoundError): + console.print( + "[red]Error: yt-dlp not found. Please install it with 'pip install yt-dlp'[/red]" + ) + return + + # Set download directory + download_dir = Path(config["download_dir"]) + download_dir.mkdir(parents=True, exist_ok=True) + + # Prepare yt-dlp command with better handling for JS challenges + cmd = [ + "yt-dlp", + "--no-warnings", + "-o", + str(download_dir / "%(title)s.%(ext)s"), + "--write-thumbnail", + "--remote-components", + "ejs:github", + ] + + # Add custom args from config if they exist + ytdlp_args = config.get("yt_dlp_args", {}) + if "format" in ytdlp_args: + cmd.extend(["--format", ytdlp_args["format"]]) + if ytdlp_args.get("write_thumbnail", False): + cmd.append("--write-thumbnail") + + # Add extractor args + if "extractor_args" in ytdlp_args: + cmd.extend(["--extractor-args", ytdlp_args["extractor_args"]]) + + # For problematic videos, also add retries and better error handling + cmd.extend( + ["--no-check-certificates", "--retries", "3", "--fragment-retries", "3"] + ) + + # Add URL + cmd.append(url) + + try: + console.print("[blue]Starting download...[/blue]") + + # Run command and let yt-dlp handle progress natively + result = subprocess.run( + cmd, + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, + universal_newlines=True, + timeout=300, # 5 minute timeout + ) + + if result.returncode == 0: + console.print("[green]Download completed successfully![/green]") + + # Copy to network share if specified + if network_folder: + self.copy_to_network_share(url, config, network_folder) + + # Add video to archive for tracking + try: + # Extract video ID from URL for archive + import re + + video_id = None + id_match = re.search(r"(?:v=|\/)([0-9A-Za-z_-]{11})", url) + if id_match: + video_id = id_match.group(1) + + if video_id: + self.add_to_archive( + {"url": url, "id": video_id, "title": "Unknown Title"} + ) + except Exception as e: + console.print( + f"[yellow]Could not track video in archive: {e}[/yellow]" + ) + else: + console.print( + f"[red]Download failed with return code {result.returncode}[/red]" + ) + if result.stdout: + console.print("[red]Error details:[/red]") + console.print(result.stdout) + + # Try to check if we have a different problem + # Check for specific JavaScript challenge errors and recommend solutions + if ( + "Solving JS challenges" in result.stdout + or "challenge solving failed" in result.stdout + ): + console.print( + "[yellow]Note: This video requires JavaScript challenge solving.[/yellow]" + ) + console.print("[yellow]Install required components with:[/yellow]") + console.print( + "[yellow]yt-dlp --remote-components ejs:github[/yellow]" + ) + + except subprocess.TimeoutExpired: + console.print("[red]Download timed out. Please try again.[/red]") + except Exception as e: + console.print(f"[red]Error during download: {str(e)}[/red]") + + def download_playlist(self, url, config, network_folder=None): + """Download a YouTube playlist into a dedicated folder.""" + console.print(f"[blue]Preparing to download playlist:[/blue] {url}") + + # Check if yt-dlp is available + try: + subprocess.run(["yt-dlp", "--version"], capture_output=True, check=True) + except (subprocess.CalledProcessError, FileNotFoundError): + console.print( + "[red]Error: yt-dlp not found. Please install it with 'pip install yt-dlp'[/red]" + ) + return + + # Get playlist title for folder naming + try: + cmd_get_title = [ + "yt-dlp", + "--flat-playlist", + "--dump-single-json", + "--no-warnings", + url, + ] + + result = subprocess.run( + cmd_get_title, capture_output=True, text=True, timeout=30 + ) + if result.returncode == 0: + import json + + try: + playlist_data = json.loads(result.stdout.strip()) + playlist_title = playlist_data.get("title", "Unknown Playlist") + except json.JSONDecodeError: + playlist_title = "Unknown Playlist" + else: + playlist_title = "Unknown Playlist" + except Exception: + playlist_title = "Unknown Playlist" + + # Set download directory + download_dir = Path(config["download_dir"]) + playlist_dir = download_dir / playlist_title + playlist_dir.mkdir(parents=True, exist_ok=True) + + # Prepare yt-dlp command for playlist + cmd = [ + "yt-dlp", + "-o", + str(playlist_dir / "%(title)s.%(ext)s"), + "--write-thumbnail", + "--remote-components", + "ejs:github", + ] + + # Use best available format that includes both video and audio + # cmd.extend(["--format", "best[ext=mp4]"]) + + # Add extractor args from config if they exist + ytdlp_args = config.get("yt_dlp_args", {}) + if "extractor_args" in ytdlp_args: + cmd.extend(["--extractor-args", ytdlp_args["extractor_args"]]) + + # Add retries for playlist downloads + cmd.extend(["--retries", "3", "--fragment-retries", "3"]) + + # Add URL + cmd.append(url) + + try: + console.print("[blue]Starting playlist download...[/blue]") + + # Run command and let yt-dlp handle progress natively + result = subprocess.run( + cmd, + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, + universal_newlines=True, + timeout=600, # 10 minute timeout for playlist downloads + ) + + if result.returncode == 0: + console.print( + "[green]Playlist download completed successfully![/green]" + ) + + # Copy to network share if specified + if network_folder: + self.copy_to_network_share(url, config, network_folder) + + # Note playlist in archive - we'll track each playlist download + try: + # Extract playlist ID from URL + import re + + playlist_id = None + id_match = re.search(r"(?:list=|\/)([0-9A-Za-z_-]{30,})", url) + if id_match: + playlist_id = id_match.group(1) + + # For playlist tracking, we need to get the actual title differently since + # it's not available from within search results + playlist_title_for_archive = "Unknown Playlist" + + if playlist_id: + self.add_to_archive( + { + "url": url, + "id": f"playlist_{playlist_id}", + "title": f"Playlist: {playlist_title_for_archive}", + } + ) + + except Exception as e: + console.print( + f"[yellow]Could not track playlist in archive: {e}[/yellow]" + ) + else: + console.print( + f"[red]Playlist download failed with return code {result.returncode}[/red]" + ) + if result.stdout: + console.print("[red]Error details:[/red]") + console.print(result.stdout) + + except subprocess.TimeoutExpired: + console.print("[red]Playlist download timed out. Please try again.[/red]") + except Exception as e: + console.print(f"[red]Error during playlist download: {str(e)}[/red]") + + def main(): """Main entry point for the YouTube CLI application.""" parser = argparse.ArgumentParser( - description="YouTube CLI - Browse and download YouTube videos" + description="YouTube CLI - Browse and download videos from YouTube" ) parser.add_argument("query", nargs="?", help="Search query for YouTube") parser.add_argument( - "--download", action="store_true", help="Download a specific video" + "--download", action="store_true", help="Download a video by URL" ) parser.add_argument("--config", help="Configuration file path") - parser.add_argument( - "--list", action="store_true", help="List videos (default behavior)" - ) parser.add_argument("--page", type=int, default=1, help="Page number for results") args = parser.parse_args() - # Initialize configuration - config = load_config(args.config) + # Create CLI instance + cli = YouTubeCLI(args.config) + + # Pre-fill archive with existing downloads + cli.prefill_archive_from_downloads() if args.download: # Handle download functionality if not args.query: - print("Error: You must provide a video URL for downloading") + console.print( + "[red]Error: You must provide a video URL for downloading[/red]" + ) return - download_video(args.query, config) + cli.download_video(args.query, cli.config) return # Default behavior - show search results if args.query: - search_videos(args.query, config, page=args.page) + cli.search_videos(args.query, cli.config, page=args.page) else: # Show help if no arguments given parser.print_help() -def load_config(config_path=None): - """Load configuration from file or use defaults.""" - default_config = { - "download_dir": str(Path.home() / "Downloads" / "youtube"), - "default_locations": [ - str(Path.home() / "Downloads" / "youtube"), - str(Path.home() / "Movies" / "youtube"), - "/tmp/youtube", - ], - "max_videos_per_page": 15, - "yt_dlp_args": { - "format": "bestvideo[height=1080]+bestaudio/bestvideo[height<=1080]+bestaudio", - "write_thumbnail": True, - "extractor_args": "youtube:player-client=default,-tv_simply", - }, - } - - if config_path and os.path.exists(config_path): - try: - with open(config_path, "r") as f: - config = json.load(f) - # Merge with defaults - for key, value in default_config.items(): - if key not in config: - config[key] = value - return config - except Exception as e: - print(f"Error loading config: {e}") - - return default_config - - -def search_videos(query, config, page=1): - """Search YouTube videos based on the query using yt-dlp.""" - console.print(f"[blue]Searching YouTube for:[/blue] {query}") - - # Construct yt-dlp command for search - cmd = [ - "yt-dlp", - "--flat-playlist", # Get video info without downloading - "--dump-single-json", # Output as JSON for single video - f"--playlist-start={15 * (page - 1) + 1}", - f"--playlist-end={15 * page}", - "--no-warnings", - "--no-progress", - "--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36", - f"ytsearch{15 * page}:{query}", - ] - - try: - result = subprocess.run(cmd, capture_output=True, text=True, timeout=60) - - if result.returncode != 0: - console.print(f"[red]Error searching videos: {result.stderr}[/red]") - return - - # Parse JSON output - import json - - try: - data = json.loads(result.stdout.strip()) - except json.JSONDecodeError: - console.print( - "[red]Error parsing search results. Try another search.[/red]" - ) - return - - # Process videos into our format - videos = [] - - if isinstance(data, list): - videos_data = data - elif "entries" in data: - videos_data = data["entries"] - else: - videos_data = [data] - - for entry in videos_data: - if not entry: - continue - - title = entry.get("title", "Unknown Title") - author = entry.get("uploader", "Unknown Author") - duration = entry.get("duration", 0) - url = entry.get("url", "") or entry.get("webpage_url", "") - - # Format duration - length = format_duration(duration) - - # Check if this is a short video - is_short = "/shorts/" in url - - # Create video object - videos.append( - { - "title": title, - "author": author, - "length": length, - "url": url, - "is_short": is_short, - "id": entry.get("id", ""), - "thumbnail": entry.get("thumbnail", ""), - } - ) - - if not videos: - console.print("[yellow]No videos found for your search.[/yellow]") - return - - display_videos(videos, config, page=page) - - except subprocess.TimeoutExpired: - console.print("[red]Search timed out. Please try again.[/red]") - except Exception as e: - console.print(f"[red]Error during search: {str(e)}[/red]") - - -def format_duration(seconds): - """Convert seconds to MM:SS or HH:MM:SS format.""" - if not seconds: - return "0:00" - - hours = int(seconds // 3600) - minutes = int((seconds % 3600) // 60) - secs = int(seconds % 60) - - if hours > 0: - return f"{hours}:{minutes:02d}:{secs:02d}" - else: - return f"{minutes}:{secs:02d}" - - -def display_videos(videos, config, page=1): - """Display videos in a formatted table.""" - console.print("\n" + "=" * 80) - console.print(f"[bold]YouTube Search Results - Page {page}[/bold]") - console.print("=" * 80) - - table = Table( - title=f"Page {page} of search results", - show_header=True, - header_style="bold magenta", - ) - table.add_column("No.", style="dim", width=3) - table.add_column("Title", width=35) - table.add_column("Author", width=20) - table.add_column("Duration", width=10) - table.add_column("Type", width=8) - - for i, video in enumerate(videos, 1): - title = video["title"] - author = video["author"] - length = video["length"] - - # Mark short videos - if video["is_short"]: - title = f"(short) {title}" - - table.add_row( - str(i), - title, - author[:18] + "..." if len(author) > 18 else author, - length, - "Short" if video["is_short"] else "Video", - ) - - console.print(table) - - # Show pagination options - console.print("=" * 80) - console.print("[blue]Options:[/blue]") - console.print(" [green]n[/green] - Next page") - console.print(" [red]q[/red] - Quit") - console.print(" [yellow]Number[/yellow] - Select and download video (e.g., 1)") - - # Get user input - user_input = input("\nChoose an option: ").strip().lower() - - if user_input == "q": - console.print("[green]Goodbye![/green]") - return - - elif user_input == "n": - console.print(f"[blue]Loading page {page + 1}...[/blue]") - search_videos( - videos[0]["title"].split(" ")[0], config, page=page + 1 - ) # Simple approach - return - - else: - try: - choice = int(user_input) - if 1 <= choice <= len(videos): - selected_video = videos[choice - 1] - console.print( - f"\n[blue]Selected video:[/blue] {selected_video['title']}" - ) - - # Download the video - download_video(selected_video["url"], config) - else: - console.print("[red]Invalid selection. Please try again.[/red]") - except ValueError: - console.print("[red]Invalid input. Please enter a number or 'q'/'n'.[/red]") - - -def download_video(url, config): - """Download a video using yt-dlp with progress bar.""" - console.print(f"[blue]Preparing to download:[/blue] {url}") - - # Check if yt-dlp is available - try: - subprocess.run(["yt-dlp", "--version"], capture_output=True, check=True) - except (subprocess.CalledProcessError, FileNotFoundError): - console.print( - "[red]Error: yt-dlp not found. Please install it with 'pip install yt-dlp'[/red]" - ) - return - - # Set download directory - download_dir = Path(config["download_dir"]) - download_dir.mkdir(parents=True, exist_ok=True) - - # Prepare yt-dlp command - cmd = [ - "yt-dlp", - "--no-warnings", - "-o", - str(download_dir / "%(title)s.%(ext)s"), - "--write-thumbnail", - ] - - # Add custom args from config if they exist - ytdlp_args = config.get("yt_dlp_args", {}) - if "format" in ytdlp_args: - cmd.extend(["--format", ytdlp_args["format"]]) - if ytdlp_args.get("write_thumbnail", False): - cmd.append("--write-thumbnail") - - # Add extractor args - if "extractor_args" in ytdlp_args: - cmd.extend(["--extractor-args", ytdlp_args["extractor_args"]]) - - # Add URL - cmd.append(url) - - try: - console.print("[blue]Starting download...[/blue]") - - # Run command with progress tracking - process = subprocess.Popen( - cmd, - stdout=subprocess.PIPE, - stderr=subprocess.STDOUT, - universal_newlines=True, - bufsize=1, - ) - - # Create a simple status indicator - progress_console = Console() - with Progress( - SpinnerColumn(), - TextColumn("[progress.description]{task.description}"), - console=progress_console, - ) as progress: - task = progress.add_task("[blue]Downloading...", total=100) - - while True: - output = process.stdout.readline() - if output == "" and process.poll() is not None: - break - if output: - # Simple progress tracking (yt-dlp doesn't support progress events directly) - progress.update(task, advance=1) - - # Check if download completed successfully - return_code = process.poll() - if return_code == 0: - console.print("[green]Download completed successfully![/green]") - else: - console.print("[red]Download failed.[/red]") - - except Exception as e: - console.print(f"[red]Error during download: {str(e)}[/red]") - - # Optionally, ask to select a different download location - locations = config.get("default_locations", [config["download_dir"]]) - if len(locations) > 1: - console.print("\n[blue]Select download location:[/blue]") - for i, loc in enumerate(locations, 1): - console.print(f" {i}. {loc}") - - try: - choice = int(input("Enter selection (or press Enter to use default): ")) - if 1 <= choice <= len(locations): - new_dir = Path(locations[choice - 1]) - config["download_dir"] = str(new_dir) - console.print(f"[green]Download location set to: {new_dir}[/green]") - except ValueError: - pass - - if __name__ == "__main__": main() diff --git a/~/Downloads/youtube/downloaded_videos.json b/~/Downloads/youtube/downloaded_videos.json new file mode 100644 index 0000000..afc7de6 --- /dev/null +++ b/~/Downloads/youtube/downloaded_videos.json @@ -0,0 +1,2347 @@ +{ + "xsNna_Zof6Y": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=xsNna_Zof6Y", + "downloaded_at": "2025-12-14T18:47:34.470985" + }, + "5No8WLPQzdg": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=5No8WLPQzdg", + "downloaded_at": "2025-12-14T18:50:21.649564" + }, + "8oxJiUEgR5I": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=8oxJiUEgR5I", + "downloaded_at": "2025-12-14T18:51:33.121495" + }, + "zRJ2x-Yqq4s": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=zRJ2x-Yqq4s", + "downloaded_at": "2025-12-14T18:52:07.684259" + }, + "91kfolYkRNM": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=91kfolYkRNM", + "downloaded_at": "2025-12-14T18:53:24.946976" + }, + "kZ7L5Bfsy5w": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=kZ7L5Bfsy5w", + "downloaded_at": "2025-12-14T18:55:19.704970" + }, + "ik9yv4BVGlg": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=ik9yv4BVGlg", + "downloaded_at": "2025-12-14T18:59:14.215761" + }, + "AbJxnEwgNBM": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=AbJxnEwgNBM", + "downloaded_at": "2025-12-14T19:03:38.465557" + }, + "_gmGAFoNWIA": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=_gmGAFoNWIA", + "downloaded_at": "2025-12-14T19:04:24.562283" + }, + "ruFtQD0Tb_Q": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=ruFtQD0Tb_Q", + "downloaded_at": "2025-12-14T19:08:22.978421" + }, + "SIW52U05I4M": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=SIW52U05I4M", + "downloaded_at": "2025-12-14T19:12:46.907626" + }, + "lF_tchFqKNE": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=lF_tchFqKNE", + "downloaded_at": "2025-12-14T19:16:45.781181" + }, + "QuYVQ5i94AI": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=QuYVQ5i94AI", + "downloaded_at": "2025-12-14T19:18:02.301155" + }, + "iZvpSckbd-o": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=iZvpSckbd-o", + "downloaded_at": "2025-12-14T19:21:27.332894" + }, + "NX2pf3YjGWU": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=NX2pf3YjGWU", + "downloaded_at": "2025-12-14T19:24:10.928193" + }, + "piLbjdg4hGc": { + "title": "Unknown Title", + "url": "https://www.youtube.com/shorts/piLbjdg4hGc", + "downloaded_at": "2025-12-14T19:29:09.791221" + }, + "K8yzx-rVJxE": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=K8yzx-rVJxE", + "downloaded_at": "2025-12-14T19:33:19.248697" + }, + "9rKoxR0w-CI": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=9rKoxR0w-CI", + "downloaded_at": "2025-12-14T23:55:42.184565" + }, + "KHatYI0LvOo": { + "title": "Unknown Title", + "url": "https://www.youtube.com/shorts/KHatYI0LvOo", + "downloaded_at": "2025-12-14T23:55:52.467002" + }, + "j3ZPLzkGVx4": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=j3ZPLzkGVx4", + "downloaded_at": "2025-12-14T23:56:16.011080" + }, + "Vl74FwoCqhw": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=Vl74FwoCqhw", + "downloaded_at": "2025-12-14T23:56:43.180856" + }, + "LaLdKhVi1EE": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=LaLdKhVi1EE", + "downloaded_at": "2025-12-15T00:01:54.631693" + }, + "2kn13EftlxY": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=2kn13EftlxY", + "downloaded_at": "2025-12-15T00:02:34.454126" + }, + "5rlZtasM-Pk": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=5rlZtasM-Pk", + "downloaded_at": "2025-12-15T00:03:21.181555" + }, + "2OAbU3WSPV4": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=2OAbU3WSPV4", + "downloaded_at": "2025-12-15T00:03:47.646263" + }, + "cCMR47L5D5k": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=cCMR47L5D5k", + "downloaded_at": "2025-12-15T00:04:08.036117" + }, + "A1yopv8Kl34": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=A1yopv8Kl34", + "downloaded_at": "2025-12-15T00:04:58.220356" + }, + "ZNaT03-xamE": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=ZNaT03-xamE", + "downloaded_at": "2025-12-15T00:06:02.079133" + }, + "7AQtAKKxvIw": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=7AQtAKKxvIw", + "downloaded_at": "2025-12-15T00:06:15.011739" + }, + "k8NZMYTZx9g": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=k8NZMYTZx9g", + "downloaded_at": "2025-12-15T02:10:44.569554" + }, + "q4w5kOcudVA": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=q4w5kOcudVA", + "downloaded_at": "2025-12-15T02:11:02.724974" + }, + "rIPsNGmIKlU": { + "title": "Unknown Title", + "url": "https://www.youtube.com/shorts/rIPsNGmIKlU", + "downloaded_at": "2025-12-15T02:11:12.927487" + }, + "D3coZntThbw": { + "title": "Unknown Title", + "url": "https://www.youtube.com/shorts/D3coZntThbw", + "downloaded_at": "2025-12-15T02:11:23.618902" + }, + "UqM4P4M5DVk": { + "title": "Unknown Title", + "url": "https://www.youtube.com/shorts/UqM4P4M5DVk", + "downloaded_at": "2025-12-15T02:11:34.636663" + }, + "qc2GCcdvCIU": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=qc2GCcdvCIU", + "downloaded_at": "2025-12-15T02:11:59.132693" + }, + "HrV86GqlY8o": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=HrV86GqlY8o", + "downloaded_at": "2025-12-15T02:12:33.034445" + }, + "df5hcP4tBBA": { + "title": "Unknown Title", + "url": "https://www.youtube.com/shorts/df5hcP4tBBA", + "downloaded_at": "2025-12-15T02:12:43.309561" + }, + "MIC7TVk0nWU": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=MIC7TVk0nWU", + "downloaded_at": "2025-12-15T02:13:12.864541" + }, + "YL8J2cpqht4": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=YL8J2cpqht4", + "downloaded_at": "2025-12-15T02:13:49.453424" + }, + "L6iMmCSayBQ": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=L6iMmCSayBQ", + "downloaded_at": "2025-12-15T02:14:09.138585" + }, + "xm1okr2y9oM": { + "title": "Unknown Title", + "url": "https://www.youtube.com/shorts/xm1okr2y9oM", + "downloaded_at": "2025-12-15T02:14:19.200131" + }, + "2qZG0C5xYkw": { + "title": "Unknown Title", + "url": "https://www.youtube.com/shorts/2qZG0C5xYkw", + "downloaded_at": "2025-12-15T02:14:29.287203" + }, + "m7uZUN1Z8HY": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=m7uZUN1Z8HY", + "downloaded_at": "2025-12-15T02:16:10.269249" + }, + "isvgOSoe1Es": { + "title": "Unknown Title", + "url": "https://www.youtube.com/shorts/isvgOSoe1Es", + "downloaded_at": "2025-12-15T02:16:20.678252" + }, + "fhph4TUY80I": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=fhph4TUY80I", + "downloaded_at": "2025-12-15T03:33:54.639818" + }, + "micZWf6i35g": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=micZWf6i35g", + "downloaded_at": "2025-12-15T03:42:50.872217" + }, + "PBBotIgRHMg": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=PBBotIgRHMg", + "downloaded_at": "2025-12-15T03:44:27.465926" + }, + "fRTaOqiTq9c": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=fRTaOqiTq9c", + "downloaded_at": "2025-12-15T14:47:52.383011" + }, + "kc4dPuzcHJA": { + "title": "Unknown Title", + "url": "https://www.youtube.com/shorts/kc4dPuzcHJA", + "downloaded_at": "2025-12-15T14:48:02.649492" + }, + "jozNEpY8iik": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=jozNEpY8iik", + "downloaded_at": "2025-12-15T14:48:24.738280" + }, + "3pslPbfpnzk": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=3pslPbfpnzk", + "downloaded_at": "2025-12-15T14:49:04.041791" + }, + "AmeP6MWwCAo": { + "title": "Unknown Title", + "url": "https://www.youtube.com/shorts/AmeP6MWwCAo", + "downloaded_at": "2025-12-15T14:49:14.267484" + }, + "tz1RWzSelWs": { + "title": "Unknown Title", + "url": "https://www.youtube.com/shorts/tz1RWzSelWs", + "downloaded_at": "2025-12-15T14:49:24.916427" + }, + "0YA4AkY6HxU": { + "title": "Unknown Title", + "url": "https://www.youtube.com/shorts/0YA4AkY6HxU", + "downloaded_at": "2025-12-15T14:49:35.703896" + }, + "BK5U111oGRk": { + "title": "Unknown Title", + "url": "https://www.youtube.com/shorts/BK5U111oGRk", + "downloaded_at": "2025-12-15T14:49:46.093091" + }, + "NnfpELU7Iao": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=NnfpELU7Iao", + "downloaded_at": "2025-12-15T14:53:12.135383" + }, + "K1aL1rNGcA0": { + "title": "Unknown Title", + "url": "https://www.youtube.com/shorts/K1aL1rNGcA0", + "downloaded_at": "2025-12-15T14:53:22.632606" + }, + "4ysyybi4068": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=4ysyybi4068", + "downloaded_at": "2025-12-15T14:53:48.991648" + }, + "AnQVwV7cPXw": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=AnQVwV7cPXw", + "downloaded_at": "2025-12-15T14:55:28.496261" + }, + "jKIpc6rS8iA": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=jKIpc6rS8iA", + "downloaded_at": "2025-12-15T14:56:29.384917" + }, + "UsQzAzysehI": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=UsQzAzysehI", + "downloaded_at": "2025-12-15T14:56:57.975066" + }, + "gIZhle4AmtQ": { + "title": "Unknown Title", + "url": "https://www.youtube.com/shorts/gIZhle4AmtQ", + "downloaded_at": "2025-12-15T14:57:08.275474" + }, + "Rjuqe8gkNNI": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=Rjuqe8gkNNI", + "downloaded_at": "2025-12-15T23:14:58.605692" + }, + "gquMyGx-CPo": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=gquMyGx-CPo", + "downloaded_at": "2025-12-15T23:15:15.807121" + }, + "Q46Vs_Cdj48": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=Q46Vs_Cdj48", + "downloaded_at": "2025-12-15T23:15:48.168931" + }, + "V_Mhk8cLMcw": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=V_Mhk8cLMcw", + "downloaded_at": "2025-12-15T23:16:37.983621" + }, + "y_tbBLh8fFI": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=y_tbBLh8fFI", + "downloaded_at": "2025-12-15T23:16:52.534017" + }, + "nU-FyzKOvoQ": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=nU-FyzKOvoQ", + "downloaded_at": "2025-12-15T23:17:45.602404" + }, + "mrCiwkWMvuo": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=mrCiwkWMvuo", + "downloaded_at": "2025-12-15T23:19:18.461840" + }, + "UYCeAt8RHC4": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=UYCeAt8RHC4", + "downloaded_at": "2025-12-15T23:29:33.689346" + }, + "BSXpDDB5mb0": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=BSXpDDB5mb0", + "downloaded_at": "2025-12-15T23:30:33.899913" + }, + "Vt_GVKG-kaE": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=Vt_GVKG-kaE", + "downloaded_at": "2025-12-15T23:32:02.134687" + }, + "BbmR7Ly8AWQ": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=BbmR7Ly8AWQ", + "downloaded_at": "2025-12-15T23:33:37.890518" + }, + "jOJ-3Ucc50s": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=jOJ-3Ucc50s", + "downloaded_at": "2025-12-15T23:35:12.232382" + }, + "4hCBkfgqUQE": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=4hCBkfgqUQE", + "downloaded_at": "2025-12-15T23:35:37.301447" + }, + "E_dk57HPtO8": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=E_dk57HPtO8", + "downloaded_at": "2025-12-15T23:37:02.522920" + }, + "8TCCgaY8RKw": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=8TCCgaY8RKw", + "downloaded_at": "2025-12-15T23:37:29.430923" + }, + "tT1Irx0ae14": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=tT1Irx0ae14", + "downloaded_at": "2025-12-15T23:38:11.705569" + }, + "DHM488CpT7Y": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=DHM488CpT7Y", + "downloaded_at": "2025-12-15T23:39:35.268871" + }, + "jhdFOxMvNr4": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=jhdFOxMvNr4", + "downloaded_at": "2025-12-15T23:42:06.272059" + }, + "quuGgwWVUfc": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=quuGgwWVUfc", + "downloaded_at": "2025-12-15T23:45:36.175144" + }, + "fpk6Sj_JYTY": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=fpk6Sj_JYTY", + "downloaded_at": "2025-12-15T23:55:35.142230" + }, + "2LipRRwy_Ms": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=2LipRRwy_Ms", + "downloaded_at": "2025-12-19T22:21:00.214518" + }, + "qSVq2EkwGjk": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=qSVq2EkwGjk", + "downloaded_at": "2025-12-16T10:10:51.240066" + }, + "O04RM-KCP68": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=O04RM-KCP68", + "downloaded_at": "2025-12-16T10:11:18.260190" + }, + "GalgkA42Qw0": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=GalgkA42Qw0", + "downloaded_at": "2025-12-16T10:13:51.345273" + }, + "nYMIV3HDGSE": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=nYMIV3HDGSE", + "downloaded_at": "2025-12-16T10:14:02.627579" + }, + "14U8KFThIY4": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=14U8KFThIY4", + "downloaded_at": "2025-12-16T10:16:40.198380" + }, + "01RIL-3a6tc": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=01RIL-3a6tc", + "downloaded_at": "2025-12-16T10:17:31.400142" + }, + "teAbKrSuBHA": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=teAbKrSuBHA", + "downloaded_at": "2025-12-16T10:17:58.408049" + }, + "xhOWBnfcJ90": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=xhOWBnfcJ90", + "downloaded_at": "2025-12-16T10:18:34.036037" + }, + "8cqa3b7Tncg": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=8cqa3b7Tncg", + "downloaded_at": "2025-12-16T10:19:46.963158" + }, + "Hj_kSCEBktI": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=Hj_kSCEBktI", + "downloaded_at": "2025-12-16T10:20:41.330537" + }, + "z6Rd-k9lPEA": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=z6Rd-k9lPEA", + "downloaded_at": "2025-12-16T10:55:21.863455" + }, + "D_Tk9aoEBHM": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=D_Tk9aoEBHM", + "downloaded_at": "2025-12-16T11:01:14.307889" + }, + "x_Esrxt7GII": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=x_Esrxt7GII", + "downloaded_at": "2025-12-16T10:25:29.066198" + }, + "WilsiH8bOws": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=WilsiH8bOws", + "downloaded_at": "2025-12-16T10:25:41.828679" + }, + "r2yR5rrUtWw": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=r2yR5rrUtWw", + "downloaded_at": "2025-12-16T10:52:05.026229" + }, + "1OCe8EDn1NU": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=1OCe8EDn1NU", + "downloaded_at": "2025-12-16T10:53:09.364042" + }, + "Tmw2IBV5eQM": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=Tmw2IBV5eQM", + "downloaded_at": "2025-12-16T10:54:04.091996" + }, + "xbj9bmlEW4c": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=xbj9bmlEW4c", + "downloaded_at": "2025-12-16T10:55:17.159822" + }, + "8ae2ZnAp9d8": { + "title": "Unknown Title", + "url": "https://www.youtube.com/shorts/8ae2ZnAp9d8", + "downloaded_at": "2025-12-16T10:55:33.067704" + }, + "TdMPzIN51Fo": { + "title": "Unknown Title", + "url": "https://www.youtube.com/shorts/TdMPzIN51Fo", + "downloaded_at": "2025-12-16T10:55:47.407939" + }, + "5WrWk0HFCAM": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=5WrWk0HFCAM", + "downloaded_at": "2025-12-16T10:56:43.567068" + }, + "0EztmFNyScc": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=0EztmFNyScc", + "downloaded_at": "2025-12-16T10:59:38.829825" + }, + "jR6yyu7snVc": { + "title": "Unknown Title", + "url": "https://www.youtube.com/shorts/jR6yyu7snVc", + "downloaded_at": "2025-12-16T10:59:51.014906" + }, + "w1Pi79TDhMQ": { + "title": "Unknown Title", + "url": "https://www.youtube.com/shorts/w1Pi79TDhMQ", + "downloaded_at": "2025-12-16T11:00:04.811986" + }, + "mmkMFqT8ENk": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=mmkMFqT8ENk", + "downloaded_at": "2025-12-16T11:01:09.414712" + }, + "U1L_4g-P0gU": { + "title": "Unknown Title", + "url": "https://www.youtube.com/shorts/U1L_4g-P0gU", + "downloaded_at": "2025-12-16T11:01:25.868149" + }, + "AZlF1BJjtaU": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=AZlF1BJjtaU", + "downloaded_at": "2025-12-16T11:02:13.201631" + }, + "pfVhAtJt5_o": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=pfVhAtJt5_o", + "downloaded_at": "2025-12-16T12:18:53.889159" + }, + "y0aodYDLA1E": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=y0aodYDLA1E", + "downloaded_at": "2025-12-16T12:19:46.452578" + }, + "INi-xKpYjbE": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=INi-xKpYjbE", + "downloaded_at": "2025-12-16T12:21:51.786903" + }, + "A2UDhfw0eFU": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=A2UDhfw0eFU", + "downloaded_at": "2025-12-16T12:23:50.082059" + }, + "dbysj18RMII": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=dbysj18RMII", + "downloaded_at": "2025-12-16T12:24:17.053248" + }, + "_p6NemXF_BY": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=_p6NemXF_BY", + "downloaded_at": "2025-12-16T12:24:33.922879" + }, + "2iMTROFAH0Y": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=2iMTROFAH0Y", + "downloaded_at": "2025-12-16T12:25:16.566454" + }, + "PjDFk8xdtGw": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=PjDFk8xdtGw", + "downloaded_at": "2025-12-16T12:30:54.784098" + }, + "jHbyxG6Cc74": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=jHbyxG6Cc74", + "downloaded_at": "2025-12-16T12:31:12.042251" + }, + "ZulRRv3h6nw": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=ZulRRv3h6nw", + "downloaded_at": "2025-12-16T12:32:10.918079" + }, + "yQkLSTxytEU": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=yQkLSTxytEU", + "downloaded_at": "2025-12-16T12:33:03.960096" + }, + "GZGHK_f4rrc": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=GZGHK_f4rrc", + "downloaded_at": "2025-12-16T12:33:35.598514" + }, + "V5sG2M2aWSA": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=V5sG2M2aWSA", + "downloaded_at": "2025-12-16T12:34:06.302307" + }, + "z7EM5WtLvxo": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=z7EM5WtLvxo", + "downloaded_at": "2025-12-16T12:34:18.346396" + }, + "UC_gGzYa6jk": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=UC_gGzYa6jk", + "downloaded_at": "2025-12-16T13:12:38.744453" + }, + "5yuq34HQAdc": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=5yuq34HQAdc", + "downloaded_at": "2025-12-16T13:13:16.224233" + }, + "A_YeFflgTp8": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=A_YeFflgTp8", + "downloaded_at": "2025-12-16T13:14:35.605960" + }, + "X3uV-nNsLAE": { + "title": "Unknown Title", + "url": "https://www.youtube.com/shorts/X3uV-nNsLAE", + "downloaded_at": "2025-12-16T13:19:49.315064" + }, + "xnSew-tCuPo": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=xnSew-tCuPo", + "downloaded_at": "2025-12-16T13:22:03.534547" + }, + "HhbKRWesOY8": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=HhbKRWesOY8", + "downloaded_at": "2025-12-16T13:22:39.666993" + }, + "weeG9yOp3i4": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=weeG9yOp3i4", + "downloaded_at": "2025-12-16T13:26:38.423693" + }, + "GPja-uhdGq8": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=GPja-uhdGq8", + "downloaded_at": "2025-12-16T13:27:17.691272" + }, + "dYPW5Rlwn8g": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=dYPW5Rlwn8g", + "downloaded_at": "2025-12-16T13:28:42.313734" + }, + "ZXk-HRmkTPk": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=ZXk-HRmkTPk", + "downloaded_at": "2025-12-16T13:30:10.278336" + }, + "vSwumoSlZTo": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=vSwumoSlZTo", + "downloaded_at": "2025-12-16T13:33:08.074252" + }, + "osuI3fD6L3g": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=osuI3fD6L3g", + "downloaded_at": "2025-12-16T13:34:32.544122" + }, + "XAnBcAVkC5Q": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=XAnBcAVkC5Q", + "downloaded_at": "2025-12-16T13:35:27.497563" + }, + "sddZ4kCLZ68": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=sddZ4kCLZ68", + "downloaded_at": "2025-12-16T13:36:45.969141" + }, + "Ha_xrFHyuUY": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=Ha_xrFHyuUY", + "downloaded_at": "2025-12-16T13:38:33.689731" + }, + "0eGK21JxgTY": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=0eGK21JxgTY", + "downloaded_at": "2025-12-16T13:39:08.806448" + }, + "_0IUm5Ac9ZM": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=_0IUm5Ac9ZM", + "downloaded_at": "2025-12-16T13:41:45.965386" + }, + "WK-61N-dE8E": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=WK-61N-dE8E", + "downloaded_at": "2025-12-16T13:43:30.137987" + }, + "IfSTf8xnaX4": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=IfSTf8xnaX4", + "downloaded_at": "2025-12-16T13:46:39.045135" + }, + "iiwByWHs6UU": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=iiwByWHs6UU", + "downloaded_at": "2025-12-16T13:48:47.253839" + }, + "qajTuTQUPsQ": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=qajTuTQUPsQ", + "downloaded_at": "2025-12-16T13:49:13.010693" + }, + "cwMzqflzmAs": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=cwMzqflzmAs", + "downloaded_at": "2025-12-17T18:13:54.798467" + }, + "7gLCfNqo7PM": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=7gLCfNqo7PM", + "downloaded_at": "2025-12-16T21:43:20.581066" + }, + "54pzwSVa2IE": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=54pzwSVa2IE", + "downloaded_at": "2025-12-16T21:44:26.766003" + }, + "UwDCaZ8Gb5Y": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=UwDCaZ8Gb5Y", + "downloaded_at": "2025-12-17T18:07:37.906506" + }, + "-H86wDzyAJE": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=-H86wDzyAJE", + "downloaded_at": "2025-12-16T21:46:12.437141" + }, + "AEP44_I5pRg": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=AEP44_I5pRg", + "downloaded_at": "2025-12-17T18:28:11.390533" + }, + "nSzUT10jJFU": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=nSzUT10jJFU", + "downloaded_at": "2025-12-16T21:47:31.062655" + }, + "0FWOMdLVRjg": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=0FWOMdLVRjg", + "downloaded_at": "2025-12-16T21:50:21.561723" + }, + "_ECH5g6YTTE": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=_ECH5g6YTTE", + "downloaded_at": "2025-12-16T21:51:02.814558" + }, + "HBd0olxI-No": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=HBd0olxI-No", + "downloaded_at": "2025-12-16T21:52:28.404843" + }, + "RI_QenA39Rc": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=RI_QenA39Rc", + "downloaded_at": "2025-12-16T21:53:01.654264" + }, + "7mDwk6ZupY4": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=7mDwk6ZupY4", + "downloaded_at": "2025-12-16T21:53:28.185198" + }, + "uWsD2HoId9I": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=uWsD2HoId9I", + "downloaded_at": "2025-12-16T21:54:11.820304" + }, + "lxvqwxHvCXY": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=lxvqwxHvCXY", + "downloaded_at": "2025-12-16T21:55:27.655443" + }, + "DBKmMKceGZM": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=DBKmMKceGZM", + "downloaded_at": "2025-12-16T21:57:38.115412" + }, + "84Tv1cDRL2I": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=84Tv1cDRL2I", + "downloaded_at": "2025-12-16T22:01:57.706937" + }, + "q08zU2kdPf4": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=q08zU2kdPf4", + "downloaded_at": "2025-12-16T22:02:14.699961" + }, + "x9Uui23F4oc": { + "title": "Unknown Title", + "url": "https://www.youtube.com/shorts/x9Uui23F4oc", + "downloaded_at": "2025-12-16T22:30:28.333320" + }, + "ntZYePxeBog": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=ntZYePxeBog", + "downloaded_at": "2025-12-16T22:53:16.458701" + }, + "yYf2yFD-iIk": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=yYf2yFD-iIk", + "downloaded_at": "2025-12-16T23:04:53.244237" + }, + "MIAjIkknlfc": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=MIAjIkknlfc", + "downloaded_at": "2025-12-17T17:20:56.746536" + }, + "w9nDOXY06SQ": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=w9nDOXY06SQ", + "downloaded_at": "2025-12-17T18:09:12.384535" + }, + "mQGVIo5_kFo": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=mQGVIo5_kFo", + "downloaded_at": "2025-12-17T18:16:09.277412" + }, + "IDGEMP0EDNQ": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=IDGEMP0EDNQ", + "downloaded_at": "2025-12-17T18:16:51.568468" + }, + "FG75hVA0xsw": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=FG75hVA0xsw", + "downloaded_at": "2025-12-17T18:18:01.504959" + }, + "LLLTlzh6-SI": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=LLLTlzh6-SI", + "downloaded_at": "2025-12-17T18:24:01.441318" + }, + "r6oFa7pUhEk": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=r6oFa7pUhEk", + "downloaded_at": "2025-12-17T18:24:49.419198" + }, + "RRNbUATtHbk": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=RRNbUATtHbk", + "downloaded_at": "2025-12-17T18:25:14.553971" + }, + "TEplZWBPJNY": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=TEplZWBPJNY", + "downloaded_at": "2025-12-17T18:25:33.802720" + }, + "QEgZqpJFFl0": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=QEgZqpJFFl0", + "downloaded_at": "2025-12-17T18:27:32.169010" + }, + "G7vcW2AclRg": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=G7vcW2AclRg", + "downloaded_at": "2025-12-17T18:30:39.194015" + }, + "1OlxkxW0CVs": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=1OlxkxW0CVs", + "downloaded_at": "2025-12-17T18:33:12.447522" + }, + "_HZ-EQ8Hc8E": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=_HZ-EQ8Hc8E", + "downloaded_at": "2025-12-17T20:12:37.629889" + }, + "Dl1gFBNa0Ik": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=Dl1gFBNa0Ik", + "downloaded_at": "2025-12-17T20:13:20.364631" + }, + "pMIEZwaybWI": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=pMIEZwaybWI", + "downloaded_at": "2025-12-17T20:16:39.695873" + }, + "vJ4zu4sqHl8": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=vJ4zu4sqHl8", + "downloaded_at": "2025-12-17T20:17:19.962537" + }, + "uQDgtME-7DQ": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=uQDgtME-7DQ", + "downloaded_at": "2025-12-17T20:21:10.000880" + }, + "9cps7Q_IrX0": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=9cps7Q_IrX0", + "downloaded_at": "2025-12-17T20:21:46.226218" + }, + "qtVmq0JE-IA": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=qtVmq0JE-IA", + "downloaded_at": "2025-12-17T20:25:22.945341" + }, + "tMiYBmfkyqc": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=tMiYBmfkyqc", + "downloaded_at": "2025-12-17T20:26:12.816626" + }, + "la5BafeXsUI": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=la5BafeXsUI", + "downloaded_at": "2025-12-17T22:45:20.176552" + }, + "MxRGXIe1qPo": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=MxRGXIe1qPo", + "downloaded_at": "2025-12-17T20:29:44.980649" + }, + "Cfd1eO7hRiw": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=Cfd1eO7hRiw", + "downloaded_at": "2025-12-18T22:16:28.878529" + }, + "-saXw1EipX0": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=-saXw1EipX0", + "downloaded_at": "2025-12-17T20:34:09.214933" + }, + "lEsTDlPr9Vg": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=lEsTDlPr9Vg", + "downloaded_at": "2025-12-17T20:37:47.985811" + }, + "GHhcyH99inE": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=GHhcyH99inE", + "downloaded_at": "2025-12-17T20:38:41.883319" + }, + "HOFp8bHTN30": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=HOFp8bHTN30", + "downloaded_at": "2025-12-17T20:39:54.430676" + }, + "MsdJgEinb34": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=MsdJgEinb34", + "downloaded_at": "2025-12-17T22:45:15.445892" + }, + "EF7SxgcDfCo": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=EF7SxgcDfCo", + "downloaded_at": "2025-12-17T22:45:24.523009" + }, + "67mRFXSbCw0": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=67mRFXSbCw0", + "downloaded_at": "2025-12-17T22:46:04.266181" + }, + "R3w4Go1s1hM": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=R3w4Go1s1hM", + "downloaded_at": "2025-12-17T22:46:08.811581" + }, + "Z9nycymUd-I": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=Z9nycymUd-I", + "downloaded_at": "2025-12-17T22:46:13.617577" + }, + "9B66SqaYCZs": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=9B66SqaYCZs", + "downloaded_at": "2025-12-17T22:45:59.921160" + }, + "0RNkbcD1NyA": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=0RNkbcD1NyA", + "downloaded_at": "2025-12-17T22:53:25.458327" + }, + "EEb_0dja8tE": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=EEb_0dja8tE", + "downloaded_at": "2025-12-17T22:53:29.814039" + }, + "RfGuJ5nTeVw": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=RfGuJ5nTeVw", + "downloaded_at": "2025-12-17T23:00:10.882317" + }, + "YJr-kHy6STg": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=YJr-kHy6STg", + "downloaded_at": "2025-12-17T23:05:48.203740" + }, + "slTmWbaungY": { + "title": "Unknown Title", + "url": "https://www.youtube.com/shorts/slTmWbaungY", + "downloaded_at": "2025-12-17T23:06:07.886515" + }, + "aVUqaB0IMh4": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=aVUqaB0IMh4", + "downloaded_at": "2025-12-17T23:08:30.103320" + }, + "Lqc1jmbSxnE": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=Lqc1jmbSxnE", + "downloaded_at": "2025-12-17T23:20:40.399854" + }, + "3FGNw28xBr0": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=3FGNw28xBr0", + "downloaded_at": "2025-12-18T21:54:46.654039" + }, + "Z2LgmIGE2nI": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=Z2LgmIGE2nI", + "downloaded_at": "2025-12-17T23:22:40.050626" + }, + "IclJ9nbtYgI": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=IclJ9nbtYgI", + "downloaded_at": "2025-12-17T23:24:19.210099" + }, + "XD1jqFaA-uI": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=XD1jqFaA-uI", + "downloaded_at": "2025-12-17T23:26:08.733576" + }, + "fezdPuh7Szw": { + "title": "Unknown Title", + "url": "https://www.youtube.com/shorts/fezdPuh7Szw", + "downloaded_at": "2025-12-17T23:26:30.739987" + }, + "QVtfWsZNUSE": { + "title": "Unknown Title", + "url": "https://www.youtube.com/shorts/QVtfWsZNUSE", + "downloaded_at": "2025-12-17T23:26:46.177355" + }, + "YTGzncKU5RY": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=YTGzncKU5RY", + "downloaded_at": "2025-12-17T23:28:44.521622" + }, + "6-tw3-UVfuA": { + "title": "Unknown Title", + "url": "https://www.youtube.com/shorts/6-tw3-UVfuA", + "downloaded_at": "2025-12-17T23:29:00.585680" + }, + "P2oLu7F4S8c": { + "title": "Unknown Title", + "url": "https://www.youtube.com/shorts/P2oLu7F4S8c", + "downloaded_at": "2025-12-17T23:29:22.656505" + }, + "Kih9GqZhokA": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=Kih9GqZhokA", + "downloaded_at": "2025-12-17T23:30:30.471970" + }, + "qMwcFIByL2g": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=qMwcFIByL2g", + "downloaded_at": "2025-12-17T23:32:43.642874" + }, + "8IZnj4Z9CHU": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=8IZnj4Z9CHU", + "downloaded_at": "2025-12-17T23:34:42.621270" + }, + "NpyDM_F2ZO0": { + "title": "Unknown Title", + "url": "https://www.youtube.com/shorts/NpyDM_F2ZO0", + "downloaded_at": "2025-12-17T23:34:59.498372" + }, + "EdEwRXiQsfc": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=EdEwRXiQsfc", + "downloaded_at": "2025-12-17T23:36:16.297812" + }, + "bcUNGhaJ5K8": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=bcUNGhaJ5K8", + "downloaded_at": "2025-12-18T00:38:25.593858" + }, + "v1nsZIim9pU": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=v1nsZIim9pU", + "downloaded_at": "2025-12-18T00:44:55.086534" + }, + "nj0omDxupGg": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=nj0omDxupGg", + "downloaded_at": "2025-12-18T00:39:17.535740" + }, + "CelbuKz9sgg": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=CelbuKz9sgg", + "downloaded_at": "2025-12-18T00:40:48.123370" + }, + "M_izsszzW8U": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=M_izsszzW8U", + "downloaded_at": "2025-12-18T00:44:50.583066" + }, + "UBqh6ud5LqY": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=UBqh6ud5LqY", + "downloaded_at": "2025-12-18T00:50:41.515379" + }, + "6wfNLN96ZUk": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=6wfNLN96ZUk", + "downloaded_at": "2025-12-18T00:51:12.499354" + }, + "P5YXTTS8OFk": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=P5YXTTS8OFk", + "downloaded_at": "2025-12-18T00:52:23.134923" + }, + "7AImkA96mE8": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=7AImkA96mE8", + "downloaded_at": "2025-12-18T00:53:10.071059" + }, + "0DET4YFzS6A": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=0DET4YFzS6A", + "downloaded_at": "2025-12-18T00:54:21.582668" + }, + "asZ1zhef8Ss": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=asZ1zhef8Ss", + "downloaded_at": "2025-12-18T01:24:14.544186" + }, + "yZqrrq6VpKY": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=yZqrrq6VpKY", + "downloaded_at": "2025-12-18T01:24:19.026137" + }, + "sdKK8a5j8Rg": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=sdKK8a5j8Rg", + "downloaded_at": "2025-12-18T01:24:23.068873" + }, + "bz6OONg5hmg": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=bz6OONg5hmg", + "downloaded_at": "2025-12-18T01:16:35.945131" + }, + "KatLQzWpphI": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=KatLQzWpphI", + "downloaded_at": "2025-12-18T01:24:27.247372" + }, + "trcxW8mPBWY": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=trcxW8mPBWY", + "downloaded_at": "2025-12-18T01:32:39.510048" + }, + "QarizoUnRfk": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=QarizoUnRfk", + "downloaded_at": "2025-12-18T01:25:40.152151" + }, + "kOX4Xf_oCGs": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=kOX4Xf_oCGs", + "downloaded_at": "2025-12-18T01:26:19.745366" + }, + "spV3tUWPpBM": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=spV3tUWPpBM", + "downloaded_at": "2025-12-18T01:27:33.145739" + }, + "8IZIGu6rKEs": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=8IZIGu6rKEs", + "downloaded_at": "2025-12-18T01:36:30.734429" + }, + "Zw53kxy7yL0": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=Zw53kxy7yL0", + "downloaded_at": "2025-12-18T01:37:21.324875" + }, + "DYrucIWig24": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=DYrucIWig24", + "downloaded_at": "2025-12-18T01:38:46.319412" + }, + "BiwTMKF2CGw": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=BiwTMKF2CGw", + "downloaded_at": "2025-12-18T01:38:59.912162" + }, + "g51xTKOXkk0": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=g51xTKOXkk0", + "downloaded_at": "2025-12-18T01:41:02.583867" + }, + "mjfnpjvw9jY": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=mjfnpjvw9jY", + "downloaded_at": "2025-12-18T01:42:13.701776" + }, + "p_UKL0Sjy84": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=p_UKL0Sjy84", + "downloaded_at": "2025-12-18T02:35:10.678126" + }, + "GgDqgixKTpU": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=GgDqgixKTpU", + "downloaded_at": "2025-12-18T02:35:14.778083" + }, + "EW9Y8rDm4kE": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=EW9Y8rDm4kE", + "downloaded_at": "2025-12-18T02:35:19.124436" + }, + "JBeSvg4B7Us": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=JBeSvg4B7Us", + "downloaded_at": "2025-12-18T02:35:23.431033" + }, + "RekIzxuvGXY": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=RekIzxuvGXY", + "downloaded_at": "2025-12-18T02:35:29.980913" + }, + "MjiJgniYZmY": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=MjiJgniYZmY", + "downloaded_at": "2025-12-18T02:35:34.400464" + }, + "VL5mSLma4D4": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=VL5mSLma4D4", + "downloaded_at": "2025-12-18T02:40:41.588594" + }, + "f9fbqks3BS8": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=f9fbqks3BS8", + "downloaded_at": "2025-12-18T02:24:19.738667" + }, + "YUryJOAiPa4": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=YUryJOAiPa4", + "downloaded_at": "2025-12-18T02:32:13.765067" + }, + "fYInlAmPnGo": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=fYInlAmPnGo", + "downloaded_at": "2025-12-18T02:35:06.283562" + }, + "NxPWwHUJCqM": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=NxPWwHUJCqM", + "downloaded_at": "2025-12-18T02:40:46.125898" + }, + "s_-nIgo71_w": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=s_-nIgo71_w", + "downloaded_at": "2025-12-18T21:11:47.723389" + }, + "3NM_ZZgLqJM": { + "title": "Unknown Title", + "url": "https://www.youtube.com/shorts/3NM_ZZgLqJM", + "downloaded_at": "2025-12-18T21:11:59.407105" + }, + "a87-fd4ADkM": { + "title": "Unknown Title", + "url": "https://www.youtube.com/shorts/a87-fd4ADkM", + "downloaded_at": "2025-12-18T21:12:11.276639" + }, + "7x1P80X1V3E": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=7x1P80X1V3E", + "downloaded_at": "2025-12-18T21:15:24.413609" + }, + "j-7pDFmdbc0": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=j-7pDFmdbc0", + "downloaded_at": "2025-12-18T21:20:00.856162" + }, + "qsxlNb2tpcY": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=qsxlNb2tpcY", + "downloaded_at": "2025-12-18T21:21:56.713564" + }, + "HVHVkKt-ldc": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=HVHVkKt-ldc", + "downloaded_at": "2025-12-18T21:23:43.684749" + }, + "wEbGhYjn4QI": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=wEbGhYjn4QI", + "downloaded_at": "2025-12-18T21:28:03.386584" + }, + "2vAwohg-gMQ": { + "title": "Unknown Title", + "url": "https://www.youtube.com/shorts/2vAwohg-gMQ", + "downloaded_at": "2025-12-18T21:28:16.933129" + }, + "___p9JYbTc0": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=___p9JYbTc0", + "downloaded_at": "2025-12-18T21:29:26.641402" + }, + "5vaH5vRKlPk": { + "title": "Unknown Title", + "url": "https://www.youtube.com/shorts/5vaH5vRKlPk", + "downloaded_at": "2025-12-18T21:29:39.248510" + }, + "-nECx4DOE84": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=-nECx4DOE84", + "downloaded_at": "2025-12-18T21:30:28.833055" + }, + "o3PhC_VJdXo": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=o3PhC_VJdXo", + "downloaded_at": "2025-12-18T21:32:34.139114" + }, + "x3IXMAgWXls": { + "title": "Unknown Title", + "url": "https://www.youtube.com/shorts/x3IXMAgWXls", + "downloaded_at": "2025-12-18T21:32:49.057846" + }, + "IIe3DMzaRSA": { + "title": "Unknown Title", + "url": "https://www.youtube.com/shorts/IIe3DMzaRSA", + "downloaded_at": "2025-12-18T21:33:01.446631" + }, + "vLnu21fS22s": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=vLnu21fS22s", + "downloaded_at": "2025-12-18T21:54:41.754589" + }, + "jTMjb-1SVHo": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=jTMjb-1SVHo", + "downloaded_at": "2025-12-18T21:55:46.246683" + }, + "RWEnT11cQLc": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=RWEnT11cQLc", + "downloaded_at": "2025-12-18T21:58:08.914664" + }, + "e1P_6pw5JGo": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=e1P_6pw5JGo", + "downloaded_at": "2025-12-18T22:00:53.084193" + }, + "pgKfaFI4T4Y": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=pgKfaFI4T4Y", + "downloaded_at": "2025-12-18T22:01:54.211061" + }, + "dbtVgZGaFmE": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=dbtVgZGaFmE", + "downloaded_at": "2025-12-18T22:04:16.227667" + }, + "X0hd_v8qRiY": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=X0hd_v8qRiY", + "downloaded_at": "2025-12-18T22:07:34.662466" + }, + "iqIRjMkHVjY": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=iqIRjMkHVjY", + "downloaded_at": "2025-12-18T22:08:33.998702" + }, + "_iz7rFTQ4Ec": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=_iz7rFTQ4Ec", + "downloaded_at": "2025-12-18T22:09:39.336968" + }, + "l9b_6WLemmg": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=l9b_6WLemmg", + "downloaded_at": "2025-12-18T22:10:28.197001" + }, + "e9FQ3dms_70": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=e9FQ3dms_70", + "downloaded_at": "2025-12-18T22:12:59.844729" + }, + "Ne9g2Jhs7Xw": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=Ne9g2Jhs7Xw", + "downloaded_at": "2025-12-18T22:13:44.723952" + }, + "jiJGbWOSdMo": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=jiJGbWOSdMo", + "downloaded_at": "2025-12-18T22:16:24.066311" + }, + "CpaVG2LeXLs": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=CpaVG2LeXLs", + "downloaded_at": "2025-12-18T23:36:45.820056" + }, + "IDrWtgTb3D4": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=IDrWtgTb3D4", + "downloaded_at": "2025-12-18T23:39:30.889787" + }, + "Wrizk-TqsGY": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=Wrizk-TqsGY", + "downloaded_at": "2025-12-18T23:39:35.536348" + }, + "P9aVMgBbs5M": { + "title": "Unknown Title", + "url": "https://www.youtube.com/shorts/P9aVMgBbs5M", + "downloaded_at": "2025-12-18T23:39:40.122908" + }, + "KNjaSJa6mf4": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=KNjaSJa6mf4", + "downloaded_at": "2025-12-18T23:39:57.305793" + }, + "jiWXxAueYlU": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=jiWXxAueYlU", + "downloaded_at": "2025-12-18T23:39:44.480342" + }, + "XsBIcuiLyks": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=XsBIcuiLyks", + "downloaded_at": "2025-12-18T23:39:50.553012" + }, + "8oWKB26xUng": { + "title": "Unknown Title", + "url": "https://www.youtube.com/shorts/8oWKB26xUng", + "downloaded_at": "2025-12-18T23:29:29.183737" + }, + "m0esUvVu9W8": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=m0esUvVu9W8", + "downloaded_at": "2025-12-18T23:41:40.108049" + }, + "KK-TJ4ovy2Y": { + "title": "Unknown Title", + "url": "https://www.youtube.com/shorts/KK-TJ4ovy2Y", + "downloaded_at": "2025-12-18T23:41:44.168138" + }, + "ct0QFRz3tKY": { + "title": "Unknown Title", + "url": "https://www.youtube.com/shorts/ct0QFRz3tKY", + "downloaded_at": "2025-12-18T23:41:48.323632" + }, + "pLm01vW1UxY": { + "title": "Unknown Title", + "url": "https://www.youtube.com/shorts/pLm01vW1UxY", + "downloaded_at": "2025-12-18T23:41:52.611467" + }, + "Mub-xo619PY": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=Mub-xo619PY", + "downloaded_at": "2025-12-18T23:41:57.202756" + }, + "8obcTTYtjQM": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=8obcTTYtjQM", + "downloaded_at": "2025-12-18T23:39:26.093016" + }, + "W9GpPW-u71s": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=W9GpPW-u71s", + "downloaded_at": "2025-12-18T23:41:35.547038" + }, + "SjVwQgBYb30": { + "title": "Unknown Title", + "url": "https://www.youtube.com/shorts/SjVwQgBYb30", + "downloaded_at": "2025-12-18T23:42:11.327294" + }, + "bZqwJgxDAbQ": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=bZqwJgxDAbQ", + "downloaded_at": "2025-12-19T00:02:55.266250" + }, + "YJbC1bFiVIk": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=YJbC1bFiVIk", + "downloaded_at": "2025-12-19T00:03:24.275961" + }, + "XF39adTfubc": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=XF39adTfubc", + "downloaded_at": "2025-12-20T13:43:35.980475" + }, + "FjIJsmxLGZY": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=FjIJsmxLGZY", + "downloaded_at": "2025-12-19T00:08:13.928454" + }, + "DRRRsU9ieX0": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=DRRRsU9ieX0", + "downloaded_at": "2025-12-19T00:08:55.200754" + }, + "5HQR8TqLJCs": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=5HQR8TqLJCs", + "downloaded_at": "2025-12-19T00:09:44.014258" + }, + "hZTl83iopzY": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=hZTl83iopzY", + "downloaded_at": "2025-12-19T00:10:32.334175" + }, + "5OVg6CBFkXI": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=5OVg6CBFkXI", + "downloaded_at": "2025-12-19T00:17:21.563855" + }, + "KnclgciVucM": { + "title": "Unknown Title", + "url": "https://www.youtube.com/shorts/KnclgciVucM", + "downloaded_at": "2025-12-19T00:17:43.080159" + }, + "7bmBr2g7sXI": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=7bmBr2g7sXI", + "downloaded_at": "2025-12-19T00:23:59.879378" + }, + "9nOp5Yl89f0": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=9nOp5Yl89f0", + "downloaded_at": "2025-12-20T13:41:59.776960" + }, + "LQ-0wT7mLAc": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=LQ-0wT7mLAc", + "downloaded_at": "2025-12-19T00:31:22.168993" + }, + "3Wq_Wh508MQ": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=3Wq_Wh508MQ", + "downloaded_at": "2025-12-19T00:33:45.061741" + }, + "X9PIGRruuSs": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=X9PIGRruuSs", + "downloaded_at": "2025-12-19T00:43:11.999748" + }, + "dei4SOGUEKs": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=dei4SOGUEKs", + "downloaded_at": "2025-12-19T00:43:51.156943" + }, + "eG9mQfaf0cI": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=eG9mQfaf0cI", + "downloaded_at": "2025-12-19T00:47:28.240196" + }, + "ff20MI6vz5c": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=ff20MI6vz5c", + "downloaded_at": "2025-12-19T00:48:07.688940" + }, + "FYMVMi1Fg1M": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=FYMVMi1Fg1M", + "downloaded_at": "2025-12-19T00:49:08.443998" + }, + "-9xwUrEnShQ": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=-9xwUrEnShQ", + "downloaded_at": "2025-12-19T00:51:39.479415" + }, + "85Dy9RIAvmo": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=85Dy9RIAvmo", + "downloaded_at": "2025-12-19T00:52:04.777057" + }, + "eZN-3qt0X7M": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=eZN-3qt0X7M", + "downloaded_at": "2025-12-19T20:23:59.129260" + }, + "zlt1ye9jN8o": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=zlt1ye9jN8o", + "downloaded_at": "2025-12-19T20:16:08.775625" + }, + "ucxFNmLmuc8": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=ucxFNmLmuc8", + "downloaded_at": "2025-12-19T08:26:34.034382" + }, + "OeHTXayrHLw": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=OeHTXayrHLw", + "downloaded_at": "2025-12-19T08:25:05.394039" + }, + "i9GRxprugYQ": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=i9GRxprugYQ", + "downloaded_at": "2025-12-19T07:59:53.203625" + }, + "RiJNUFo8pHM": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=RiJNUFo8pHM", + "downloaded_at": "2025-12-19T08:13:15.677865" + }, + "LUPB9Z_W76Q": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=LUPB9Z_W76Q", + "downloaded_at": "2025-12-19T08:15:10.005049" + }, + "C0giU9A-4JA": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=C0giU9A-4JA", + "downloaded_at": "2025-12-19T08:16:31.519374" + }, + "K9NZJ1-z0G8": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=K9NZJ1-z0G8", + "downloaded_at": "2025-12-19T08:19:28.314103" + }, + "LbPd_Z5Kf8g": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=LbPd_Z5Kf8g", + "downloaded_at": "2025-12-19T08:20:09.125807" + }, + "n3L5lbY7wrY": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=n3L5lbY7wrY", + "downloaded_at": "2025-12-19T20:24:03.824999" + }, + "QaotWGAKYrc": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=QaotWGAKYrc", + "downloaded_at": "2025-12-19T08:24:53.601310" + }, + "sysCAmIwEvg": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=sysCAmIwEvg", + "downloaded_at": "2025-12-19T08:26:29.417648" + }, + "dYEMBHInlC0": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=dYEMBHInlC0", + "downloaded_at": "2025-12-19T08:43:22.678182" + }, + "fTWz4ttnGY8": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=fTWz4ttnGY8", + "downloaded_at": "2025-12-19T08:43:56.533623" + }, + "oZWzghXsosE": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=oZWzghXsosE", + "downloaded_at": "2025-12-19T08:44:11.665038" + }, + "ivnNVP5NIVQ": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=ivnNVP5NIVQ", + "downloaded_at": "2025-12-19T08:44:27.635168" + }, + "XyB_k3qs3fE": { + "title": "Unknown Title", + "url": "https://www.youtube.com/shorts/XyB_k3qs3fE", + "downloaded_at": "2025-12-19T08:53:36.842417" + }, + "vYZYlobyxjo": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=vYZYlobyxjo", + "downloaded_at": "2025-12-19T08:49:23.690016" + }, + "yFJhwik9WR8": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=yFJhwik9WR8", + "downloaded_at": "2025-12-19T08:49:36.351397" + }, + "LdsvzhOWybc": { + "title": "Unknown Title", + "url": "https://www.youtube.com/shorts/LdsvzhOWybc", + "downloaded_at": "2025-12-19T08:49:49.259851" + }, + "xWu7kIhMi1I": { + "title": "Unknown Title", + "url": "https://www.youtube.com/shorts/xWu7kIhMi1I", + "downloaded_at": "2025-12-19T08:50:08.120127" + }, + "mvh0Q45mxB8": { + "title": "Unknown Title", + "url": "https://www.youtube.com/shorts/mvh0Q45mxB8", + "downloaded_at": "2025-12-19T08:50:24.245052" + }, + "f90zoVJY07U": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=f90zoVJY07U", + "downloaded_at": "2025-12-19T08:50:37.083138" + }, + "o194LGEnH14": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=o194LGEnH14", + "downloaded_at": "2025-12-19T08:50:57.793290" + }, + "g7A_Nzb220g": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=g7A_Nzb220g", + "downloaded_at": "2025-12-19T08:51:14.429280" + }, + "zNpw8yO5wBY": { + "title": "Unknown Title", + "url": "https://www.youtube.com/shorts/zNpw8yO5wBY", + "downloaded_at": "2025-12-19T08:51:25.306341" + }, + "Js6Q4H9WV9A": { + "title": "Unknown Title", + "url": "https://www.youtube.com/shorts/Js6Q4H9WV9A", + "downloaded_at": "2025-12-19T08:51:37.104754" + }, + "V70Ljv2RsFY": { + "title": "Unknown Title", + "url": "https://www.youtube.com/shorts/V70Ljv2RsFY", + "downloaded_at": "2025-12-19T08:53:05.063747" + }, + "6bqvwgDH2ig": { + "title": "Unknown Title", + "url": "https://www.youtube.com/shorts/6bqvwgDH2ig", + "downloaded_at": "2025-12-19T08:53:19.798208" + }, + "6aMPmolZmhg": { + "title": "Unknown Title", + "url": "https://www.youtube.com/shorts/6aMPmolZmhg", + "downloaded_at": "2025-12-19T08:53:32.614389" + }, + "IAxGG5Lu54U": { + "title": "Unknown Title", + "url": "https://www.youtube.com/shorts/IAxGG5Lu54U", + "downloaded_at": "2025-12-19T08:53:48.255735" + }, + "FZ8Oj3pOryo": { + "title": "Unknown Title", + "url": "https://www.youtube.com/shorts/FZ8Oj3pOryo", + "downloaded_at": "2025-12-19T08:54:00.231732" + }, + "ZDkLDQmF_KU": { + "title": "Unknown Title", + "url": "https://www.youtube.com/shorts/ZDkLDQmF_KU", + "downloaded_at": "2025-12-19T08:54:14.277993" + }, + "hMup1HUrYxQ": { + "title": "Unknown Title", + "url": "https://www.youtube.com/shorts/hMup1HUrYxQ", + "downloaded_at": "2025-12-19T08:54:37.774417" + }, + "SkcuKtB8iHI": { + "title": "Unknown Title", + "url": "https://www.youtube.com/shorts/SkcuKtB8iHI", + "downloaded_at": "2025-12-19T08:54:55.455478" + }, + "kAOgUjdFVtU": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=kAOgUjdFVtU", + "downloaded_at": "2025-12-19T08:59:05.445246" + }, + "doB4uO-Nsk8": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=doB4uO-Nsk8", + "downloaded_at": "2025-12-19T08:59:36.995923" + }, + "FPAE8kVlzIA": { + "title": "Unknown Title", + "url": "https://www.youtube.com/shorts/FPAE8kVlzIA", + "downloaded_at": "2025-12-19T08:59:54.670397" + }, + "EXW-Ly9NBVM": { + "title": "Unknown Title", + "url": "https://www.youtube.com/shorts/EXW-Ly9NBVM", + "downloaded_at": "2025-12-19T09:00:09.847773" + }, + "nBy3PKdVJHQ": { + "title": "Unknown Title", + "url": "https://www.youtube.com/shorts/nBy3PKdVJHQ", + "downloaded_at": "2025-12-19T09:00:22.329164" + }, + "bs3ORNMJTc4": { + "title": "Unknown Title", + "url": "https://www.youtube.com/shorts/bs3ORNMJTc4", + "downloaded_at": "2025-12-19T09:00:38.524592" + }, + "9j-y6XlaE80": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=9j-y6XlaE80", + "downloaded_at": "2025-12-19T09:16:55.750194" + }, + "KJh4ytDeuL8": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=KJh4ytDeuL8", + "downloaded_at": "2025-12-19T09:17:32.577850" + }, + "NWiPVMDh7GE": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=NWiPVMDh7GE", + "downloaded_at": "2025-12-19T09:18:10.970276" + }, + "sKMH9dgqPdU": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=sKMH9dgqPdU", + "downloaded_at": "2025-12-19T09:18:22.302978" + }, + "feBvhLFQEDk": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=feBvhLFQEDk", + "downloaded_at": "2025-12-19T09:18:41.358776" + }, + "6HCqOF7K890": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=6HCqOF7K890", + "downloaded_at": "2025-12-19T09:19:18.809302" + }, + "p18UayMMIWk": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=p18UayMMIWk", + "downloaded_at": "2025-12-19T09:20:03.307079" + }, + "FAKOnN5BCzs": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=FAKOnN5BCzs", + "downloaded_at": "2025-12-19T09:21:31.362967" + }, + "ceEBC_aGWdg": { + "title": "Unknown Title", + "url": "https://www.youtube.com/shorts/ceEBC_aGWdg", + "downloaded_at": "2025-12-19T09:21:48.234919" + }, + "QE4IQlwOgiA": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=QE4IQlwOgiA", + "downloaded_at": "2025-12-19T09:22:22.352428" + }, + "6JnKf5voTSE": { + "title": "Unknown Title", + "url": "https://www.youtube.com/shorts/6JnKf5voTSE", + "downloaded_at": "2025-12-19T09:22:34.146825" + }, + "iwyARHUbvNI": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=iwyARHUbvNI", + "downloaded_at": "2025-12-19T09:23:12.935100" + }, + "-yrMgNJz8tY": { + "title": "Unknown Title", + "url": "https://www.youtube.com/shorts/-yrMgNJz8tY", + "downloaded_at": "2025-12-19T09:23:29.597947" + }, + "Y4bbMrlHqm4": { + "title": "Unknown Title", + "url": "https://www.youtube.com/shorts/Y4bbMrlHqm4", + "downloaded_at": "2025-12-19T09:23:42.361827" + }, + "I_-3HN1ueNk": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=I_-3HN1ueNk", + "downloaded_at": "2025-12-19T09:24:06.141323" + }, + "wyOcb2MHzIs": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=wyOcb2MHzIs", + "downloaded_at": "2025-12-19T09:37:32.288381" + }, + "40gZBLdDSZA": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=40gZBLdDSZA", + "downloaded_at": "2025-12-19T09:37:55.002825" + }, + "xCGPH4_RyPc": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=xCGPH4_RyPc", + "downloaded_at": "2025-12-19T09:40:28.079052" + }, + "ZQaJ5yUxugE": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=ZQaJ5yUxugE", + "downloaded_at": "2025-12-19T09:48:55.693305" + }, + "vZ4_DNBfy4c": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=vZ4_DNBfy4c", + "downloaded_at": "2025-12-19T09:49:16.200078" + }, + "OL2lAx2N-Dw": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=OL2lAx2N-Dw", + "downloaded_at": "2025-12-19T09:49:30.250624" + }, + "9meeVehRS6A": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=9meeVehRS6A", + "downloaded_at": "2025-12-19T09:49:55.011967" + }, + "qym-P4GTdIU": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=qym-P4GTdIU", + "downloaded_at": "2025-12-19T09:50:41.972143" + }, + "_YhTUtE1Y7E": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=_YhTUtE1Y7E", + "downloaded_at": "2025-12-19T09:53:24.009674" + }, + "d3hnFM2UHa4": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=d3hnFM2UHa4", + "downloaded_at": "2025-12-19T09:54:54.597024" + }, + "Y7ylUu6esIY": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=Y7ylUu6esIY", + "downloaded_at": "2025-12-19T09:55:20.266444" + }, + "InWYwM2DwpM": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=InWYwM2DwpM", + "downloaded_at": "2025-12-19T09:56:03.278283" + }, + "1O8oguP35i0": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=1O8oguP35i0", + "downloaded_at": "2025-12-19T20:10:56.970064" + }, + "EV1OmO1_a8A": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=EV1OmO1_a8A", + "downloaded_at": "2025-12-19T20:11:01.775614" + }, + "hM7WtIUllw0": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=hM7WtIUllw0", + "downloaded_at": "2025-12-19T20:24:23.684270" + }, + "5XvU8QB4CaE": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=5XvU8QB4CaE", + "downloaded_at": "2025-12-19T20:24:19.427708" + }, + "BL92-769Ops": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=BL92-769Ops", + "downloaded_at": "2025-12-19T19:59:55.722394" + }, + "cB8q5OmlsPw": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=cB8q5OmlsPw", + "downloaded_at": "2025-12-19T20:16:13.292422" + }, + "CKldgtpNHmQ": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=CKldgtpNHmQ", + "downloaded_at": "2025-12-19T20:24:09.098397" + }, + "JbJA6oCphFI": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=JbJA6oCphFI", + "downloaded_at": "2025-12-19T20:24:13.401317" + }, + "i0LI02MhY6I": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=i0LI02MhY6I", + "downloaded_at": "2025-12-19T20:23:54.039640" + }, + "X5o_C6CX5W4": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=X5o_C6CX5W4", + "downloaded_at": "2025-12-19T20:27:36.543227" + }, + "7m5-eAxxu34": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=7m5-eAxxu34", + "downloaded_at": "2025-12-19T20:31:54.464461" + }, + "1P-ZPK7ZTSk": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=1P-ZPK7ZTSk", + "downloaded_at": "2025-12-19T22:20:55.295661" + }, + "32NRN-QBm3E": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=32NRN-QBm3E", + "downloaded_at": "2025-12-19T22:20:43.073635" + }, + "yaLb8bqOPO4": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=yaLb8bqOPO4", + "downloaded_at": "2025-12-19T23:12:14.717166" + }, + "pSbOj09n-Bc": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=pSbOj09n-Bc", + "downloaded_at": "2025-12-19T23:12:18.942090" + }, + "365Yqn4Ir3U": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=365Yqn4Ir3U", + "downloaded_at": "2025-12-19T23:12:23.895416" + }, + "pxeZAPwHvAo": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=pxeZAPwHvAo", + "downloaded_at": "2025-12-19T23:12:28.282284" + }, + "TbJikS-Sy0U": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=TbJikS-Sy0U", + "downloaded_at": "2025-12-19T23:12:33.383571" + }, + "4dYHBthPRng": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=4dYHBthPRng", + "downloaded_at": "2025-12-19T23:12:37.995802" + }, + "1bYix1fxFSI": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=1bYix1fxFSI", + "downloaded_at": "2025-12-19T23:12:42.810479" + }, + "OFTa8aXI4rU": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=OFTa8aXI4rU", + "downloaded_at": "2025-12-19T23:13:32.945898" + }, + "e7XSyurZz94": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=e7XSyurZz94", + "downloaded_at": "2025-12-19T23:13:37.321499" + }, + "DWf_fts2mIk": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=DWf_fts2mIk", + "downloaded_at": "2025-12-19T23:13:41.702748" + }, + "oxBEjKHIJd8": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=oxBEjKHIJd8", + "downloaded_at": "2025-12-19T23:13:46.409394" + }, + "VmFtcsjIkeg": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=VmFtcsjIkeg", + "downloaded_at": "2025-12-19T23:19:50.326161" + }, + "3-O8OFuuVtQ": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=3-O8OFuuVtQ", + "downloaded_at": "2025-12-19T23:13:28.640300" + }, + "1kLlZFnruBw": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=1kLlZFnruBw", + "downloaded_at": "2025-12-19T23:19:45.975810" + }, + "7Vv69qZELYg": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=7Vv69qZELYg", + "downloaded_at": "2025-12-20T09:49:26.835185" + }, + "MbSPm6sv7aw": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=MbSPm6sv7aw", + "downloaded_at": "2025-12-20T09:50:47.606286" + }, + "VDxe0qomBPA": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=VDxe0qomBPA", + "downloaded_at": "2025-12-20T09:54:17.875289" + }, + "7armU_28U3s": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=7armU_28U3s", + "downloaded_at": "2025-12-20T09:56:11.629490" + }, + "vmrieVOcnrk": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=vmrieVOcnrk", + "downloaded_at": "2025-12-20T09:56:42.399487" + }, + "EWIuoCZNoRo": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=EWIuoCZNoRo", + "downloaded_at": "2025-12-20T09:57:31.164871" + }, + "XGrnqKSPOLY": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=XGrnqKSPOLY", + "downloaded_at": "2025-12-20T09:58:35.375464" + }, + "VIl30b5cG9U": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=VIl30b5cG9U", + "downloaded_at": "2025-12-20T10:00:04.238086" + }, + "ZOlNe9_kHks": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=ZOlNe9_kHks", + "downloaded_at": "2025-12-20T10:01:11.529290" + }, + "9l6fBIgSEbA": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=9l6fBIgSEbA", + "downloaded_at": "2025-12-20T10:02:46.236817" + }, + "Cv8_2IntsmA": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=Cv8_2IntsmA", + "downloaded_at": "2025-12-20T10:03:43.172682" + }, + "aCXJ5dwiklM": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=aCXJ5dwiklM", + "downloaded_at": "2025-12-20T10:04:39.866219" + }, + "XiKzDLAgpAM": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=XiKzDLAgpAM", + "downloaded_at": "2025-12-20T10:07:27.758700" + }, + "xFpGqC949qU": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=xFpGqC949qU", + "downloaded_at": "2025-12-20T10:09:16.129868" + }, + "JzwvxG0WxN4": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=JzwvxG0WxN4", + "downloaded_at": "2025-12-20T10:11:08.307187" + }, + "bEwejna-Mr4": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=bEwejna-Mr4", + "downloaded_at": "2025-12-20T13:20:06.867257" + }, + "88hPimt3kSU": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=88hPimt3kSU", + "downloaded_at": "2025-12-20T13:23:27.747478" + }, + "dXp_xkP4Mg4": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=dXp_xkP4Mg4", + "downloaded_at": "2025-12-20T13:32:48.304565" + }, + "PUPEidO1Cqw": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=PUPEidO1Cqw", + "downloaded_at": "2025-12-20T13:36:05.440073" + }, + "vjsuFibjWUk": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=vjsuFibjWUk", + "downloaded_at": "2025-12-20T13:39:33.677347" + }, + "yNfMv8VEwwk": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=yNfMv8VEwwk", + "downloaded_at": "2025-12-20T13:41:36.531343" + }, + "hRh1KtOIPNA": { + "title": "Unknown Title", + "url": "https://www.youtube.com/shorts/hRh1KtOIPNA", + "downloaded_at": "2025-12-20T13:41:55.019199" + }, + "RgwT5AkPFlQ": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=RgwT5AkPFlQ", + "downloaded_at": "2025-12-20T13:43:31.254564" + }, + "xh1PbW8vWv4": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=xh1PbW8vWv4", + "downloaded_at": "2025-12-20T13:44:49.057037" + }, + "eccPKbwaWBE": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=eccPKbwaWBE", + "downloaded_at": "2025-12-20T13:47:39.615418" + }, + "PTmwGbfeLgo": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=PTmwGbfeLgo", + "downloaded_at": "2025-12-20T14:28:19.081273" + }, + "4_t13chPpEI": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=4_t13chPpEI", + "downloaded_at": "2025-12-20T14:30:10.026565" + }, + "Jvk-goQTtig": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=Jvk-goQTtig", + "downloaded_at": "2025-12-20T14:30:59.684105" + }, + "v2eHA1JiYXU": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=v2eHA1JiYXU", + "downloaded_at": "2025-12-20T14:32:47.980947" + }, + "2MubfoNz5Yw": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=2MubfoNz5Yw", + "downloaded_at": "2025-12-20T14:33:46.553706" + }, + "jh-W8ybsb6k": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=jh-W8ybsb6k", + "downloaded_at": "2025-12-20T14:34:54.479936" + }, + "ndPG4gqBTUU": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=ndPG4gqBTUU", + "downloaded_at": "2025-12-20T14:35:23.994218" + }, + "QoXSg0_JyPM": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=QoXSg0_JyPM", + "downloaded_at": "2025-12-20T14:36:00.284633" + }, + "_u89243SFj0": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=_u89243SFj0", + "downloaded_at": "2025-12-20T14:40:34.520723" + }, + "PJ6ZEYMhzgs": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=PJ6ZEYMhzgs", + "downloaded_at": "2025-12-20T14:43:06.775071" + }, + "wI-KYRdmx-E": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=wI-KYRdmx-E", + "downloaded_at": "2025-12-20T14:44:03.429149" + }, + "nhrBuYADREk": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=nhrBuYADREk", + "downloaded_at": "2025-12-20T14:46:04.407558" + }, + "exXuCPzcbUw": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=exXuCPzcbUw", + "downloaded_at": "2025-12-20T14:48:25.145219" + }, + "2gulzClYkbc": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=2gulzClYkbc", + "downloaded_at": "2025-12-20T14:49:36.042948" + }, + "nVpgO6xEF8Y": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=nVpgO6xEF8Y", + "downloaded_at": "2025-12-20T15:55:58.748408" + }, + "5zV7_TQiSO0": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=5zV7_TQiSO0", + "downloaded_at": "2025-12-20T17:03:27.808014" + }, + "nj7Uw7oCbL4": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=nj7Uw7oCbL4", + "downloaded_at": "2025-12-20T17:06:40.903444" + }, + "pHIYTTS4MEQ": { + "title": "Unknown Title", + "url": "https://www.youtube.com/shorts/pHIYTTS4MEQ", + "downloaded_at": "2025-12-20T17:06:45.889319" + }, + "ke0mjYAeSVQ": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=ke0mjYAeSVQ", + "downloaded_at": "2025-12-20T17:06:36.149913" + }, + "-ldSlx5VMo0": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=-ldSlx5VMo0", + "downloaded_at": "2025-12-20T23:59:41.533646" + }, + "v-En7qY5vzY": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=v-En7qY5vzY", + "downloaded_at": "2025-12-21T13:08:27.248555" + }, + "5HFRs8X4gU0": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=5HFRs8X4gU0", + "downloaded_at": "2025-12-21T20:51:42.843085" + }, + "jTsUQ7vlbD8": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=jTsUQ7vlbD8", + "downloaded_at": "2025-12-26T16:23:34.782181" + }, + "mzmz1rIRxzA": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=mzmz1rIRxzA", + "downloaded_at": "2025-12-26T16:49:28.495897" + }, + "UdLRAYjsgso": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=UdLRAYjsgso", + "downloaded_at": "2025-12-26T16:49:41.359951" + }, + "fSDp4M1hfjY": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=fSDp4M1hfjY", + "downloaded_at": "2025-12-26T16:20:29.658222" + }, + "x3s0C-7shz4": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=x3s0C-7shz4", + "downloaded_at": "2025-12-26T16:20:47.266285" + }, + "1T1VmylvTRc": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=1T1VmylvTRc", + "downloaded_at": "2025-12-26T16:21:05.149096" + }, + "HvE6UhHuDOI": { + "title": "Unknown Title", + "url": "https://www.youtube.com/watch?v=HvE6UhHuDOI", + "downloaded_at": "2025-12-26T16:21:22.176042" + } +} \ No newline at end of file