#!/usr/bin/env python3 import csv import subprocess import linux from database import Database CHANNEL_NAME = 'teampgp' DB = None def write_csv(data, file_name): # Open file with newline='' to prevent extra blank rows across platforms with open(file_name, "w", newline="", encoding="utf-8") as file: writer = csv.writer(file) # Write all rows at once writer.writerows(data) def download(): """Find all undownloaded videos and clips, and download them safely.""" undownloaded = DB.get_undownloaded() print("Starting downloads...") for row in undownloaded: # Unpack variables clearly ( id, title, created_at, view_count, duration, url, thumbnail_url, game_id, game_name, stream_id, creator_name, clip_is, downloaded, uploaded_yt, uploaded_yt_chats, uploaded_yt_shorts, ) = row data = [list(row)] print( f"ID: {id} | Date: {created_at} | Game: {game_name} | Title: {title}" ) # 1. Define paths and isolate base directory if clip_is: target_dir = f"download/clips/{id}" cmd = f"TwitchDownloaderCLI clipdownload --id {id} -o {target_dir}/{id}.mp4 --collision Overwrite --temp-path download/temp" else: target_dir = f"download/videos/{id}" # FIXED: Removed the duplicated command string combined with '&&' cmd = f"TwitchDownloaderCLI videodownload --id {id} -o {target_dir}/{id}.mp4 --collision Overwrite --threads 2 --temp-path download/temp" csv_file = f"{target_dir}/{id}.csv" # 3. FIXED: Use the live streaming function to prevent Out-Of-Memory crashes output = linux.run_command(cmd, look_for=["[STATUS]"]) output2 = linux.run_command(f"TwitchDownloaderCLI chatdownload --id {id} -o {target_dir}/{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 write_csv(data, csv_file) print(f"✅ Success: TwitchDownloaderCLI video. {target_dir}") DB.mark_as_downloaded(id) else: print(f"ID: {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 clip_is: print("Flushing temporary crash chunks...") subprocess.run("rm -rf download/temp/*", shell=True) print("Finished Downloading Pipeline.") if __name__ == "__main__": DB = Database() download()