diff --git a/build_videos.py b/build_videos.py new file mode 100644 index 0000000..c39f9fe --- /dev/null +++ b/build_videos.py @@ -0,0 +1,108 @@ +import database +import youtube_short +import transcribe_video +import twitch_chat_vod + +DB = None + +def build_chat_video(): + chats = DB.get_unuploaded_chats() + + for chat in chats: + ( + 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, + ) = chat + + print("====================================================") + print(f"🚀 Transcribe: {title}") + print("====================================================") + + twitch_chat_vod.combine_twitch_vod_and_chat(f"download/videos/{id}/{id}.mp4", "overlay") + + +def build_transcribe(): + unuploadeds = DB.get_unuploaded() + + for unuploaded in unuploadeds: + ( + 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, + ) = unuploaded + + if clip_is: + target_dir = f"download/clips" + else: + target_dir = f"download/videos" + + print("====================================================") + print(f"🚀 Transcribe: {title}") + print("====================================================") + + transcribe_video.transcribe_to_srt(f"{target_dir}/{id}/{id}.mp4") + + +def build_shorts(): + shorts = DB.get_unuploaded_shorts() + + top_txt = "TeamPGP Live on Twitch...\n Every Friday and Sunday @7:30 ET.\n twitch.tv/teampgp" + + for short in shorts: + ( + 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, + ) = short + + target_dir = f"download/clips/{id}/{id}.mp4" + + print("====================================================") + print(f"🚀 Processing: Clip to Youtube Short {title}") + print("====================================================") + + youtube_short.fit_to_9_16_letterbox(target_dir, top_txt, f"Clipped By: {creator_name}.", True) + +if __name__ =="__main__": + DB = database.Database() + build_shorts() \ No newline at end of file diff --git a/database.py b/database.py index 7d15e2d..32916ce 100755 --- a/database.py +++ b/database.py @@ -34,7 +34,7 @@ class Database: duration TEXT NOT NULL, url TEXT NOT NULL, thumbnail_url TEXT NOT NULL, - game_id INTEGER NOT NULL, + game_id TEXT NOT NULL, game_name TEXT NOT NULL, stream_id TEXT NOT NULL, creator_name TEXT NOT NULL, diff --git a/transcribe_video.py b/transcribe_video.py index 7223195..4dffcaf 100755 --- a/transcribe_video.py +++ b/transcribe_video.py @@ -8,15 +8,16 @@ from whisper.utils import get_writer model = whisper.load_model("base") -def extract_audio(video_path: str, audio_temp_path: str): +def extract_audio(video_path: str): # Create a temporary path for a sanitized copy of the video sanitized_video_path = video_path.replace(".mp4", "_clean.mp4") + audio_temp_path = video_path.replace(".mp4", ".wav") print("Sanitizing video metadata for MoviePy parser...") # -map_chapters -1 removes chapter layouts that break the parser. # -sn strips text/subtitle streams that crash MoviePy. # -c copy copies video and audio instantly without quality loss. - linux.run_command(f"ffmpeg -y -i {video_path} -map_chapters -1 -sn -c copy {sanitized_video_path}") + linux.run_command_ffmpeg(f"ffmpeg -y -i {video_path} -map_chapters -1 -sn -c copy {sanitized_video_path}") print("Extracting uncompressed WAV audio...") try: @@ -34,15 +35,20 @@ def extract_audio(video_path: str, audio_temp_path: str): os.remove(sanitized_video_path) -def transcribe_to_srt(audio_path: str, output_directory: str, output_filename: str): +def transcribe_to_srt(video_path: str): + + extract_audio(video_path) + + transcribe_path = video_path.replace(".mp4", ".str") + audio_path = video_path.replace(".mp4", ".wav") print("Transcribing audio...") result = model.transcribe(audio_path) print("Creating SRT file...") - srt_writer = get_writer("srt", output_directory) - srt_writer(result, output_filename, {}) + srt_writer = get_writer("srt", transcribe_path) + srt_writer(result, transcribe_path, {}) - print(f"SRT subtitle file saved in: {output_directory}") + print(f"SRT subtitle file saved in: {transcribe_path}") if os.path.exists(audio_path): os.remove(audio_path)