71 lines
3.1 KiB
Python
71 lines
3.1 KiB
Python
#!/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() |