#!/usr/bin/env python3 import subprocess from datetime import datetime, timedelta, timezone import package.utils as utils from package.config import DB as DB from package.database import TwitchVideo def download_videos(): """Find all undownloaded videos and clips, and download them safely.""" undownloaded = DB.get_undownloaded() print("Starting downloads...") for row in undownloaded: # 1. Define your data's timestamp (Example: April 10, 2026, at 10:00 AM) #datetime.strptime(created_at, "%Y-%m-%dT%H:%M:%SZ") data_timestamp = datetime.fromisoformat(row.created_at) # 2. Get the exact current date and time current_time = datetime.now(timezone.utc) # 3. Calculate the difference between the two times time_difference = current_time - data_timestamp # 4. Check if the difference is greater than 24 hours if time_difference > timedelta(hours=24): print("The data is more than 24 hours old.") else: #lets wait 24 hours befor downloading print("The data is less than 24 hours old.") continue data = [attr for attr in vars(TwitchVideo) if not attr.startswith('__')] print(f"ID: {row.id} | Date: {row.created_at} | Game: {row.game_name} | Title: {row.title}") # 1. Define paths and isolate base directory if row.clip_is: target_dir = f"download/clips/{row.id}" cmd = f"TwitchDownloaderCLI clipdownload --id {row.id} -o {target_dir}/{row.id}.mp4 --collision Overwrite --temp-path download/temp" else: target_dir = f"download/videos/{row.id}" # FIXED: Removed the duplicated command string combined with '&&' cmd = f"TwitchDownloaderCLI videodownload --id {row.id} -o {target_dir}/{row.id}.mp4 --collision Overwrite --threads 2 --temp-path download/temp" csv_file = f"{target_dir}/{row.id}.csv" # 3. FIXED: Use the live streaming function to prevent Out-Of-Memory crashes output = utils.run_command(cmd, look_for=["[STATUS]"]) output2 = utils.run_command(f"TwitchDownloaderCLI chatdownload --id {row.id} -o {target_dir}/{row.id}_chat.json -E --collision Overwrite --temp-path download/temp", look_for=["[STATUS]"]) if output: # Only write CSV and update database if download actually completed data = [attr for attr in vars(TwitchVideo) if not attr.startswith('__')] utils.write_csv(data, csv_file) print(f"✅ Success: TwitchDownloaderCLI video. {target_dir}") DB.mark_as_downloaded(row.id) else: print(f"ID: {row.id} | Download Process failed.") #print(f"❌ Reason/Error: {output.get('error', 'Unknown Error')}") #if output.get("stderr"): # print(f"Details: {output['stderr']}") # Clear temporary chunk clutter immediately if a VOD crashes out if not row.clip_is: print("Flushing temporary crash chunks...") subprocess.run("rm -rf download/temp/*", shell=True) print("Finished Downloading Pipeline.") if __name__ == "__main__": download_videos()