インストールコマンド

!pip install -q google-colab-selenium flask

%cd /content
!wget <https://archive.creativaier.com/bitadome/app01.tar.gz>

!tar -xzvf app01.tar.gz
!rm app01.tar.gz

%cd /content/app01
!nohup python app.py &

利用ファイル

materials.zip

生成コマンド

from google.colab import files
import zipfile
import os
import shutil

def upload_files():
    """アップロードされたファイルを受け取り、ZIPファイルを解凍する関数"""
    uploaded = files.upload()
    target_dir = '/content/images'
    clear_directory(target_dir)

    for fn in uploaded.keys():
        print(f'User uploaded file "{fn}" with length {len(uploaded[fn])} bytes')
        if fn.endswith('.zip'):
            extract_zip(fn, target_dir)

    remove_macosx_artifacts(target_dir)
    return target_dir

def clear_directory(path):
    """指定されたディレクトリをクリアする関数"""
    if os.path.exists(path):
        shutil.rmtree(path)
    os.makedirs(path)

def extract_zip(zip_path, extract_to):
    """ZIPファイルを解凍する関数"""
    with zipfile.ZipFile(zip_path, 'r') as zip_ref:
        zip_ref.extractall(extract_to)

def remove_macosx_artifacts(directory):
    """__MACOSXフォルダーを削除する関数"""
    macosx_path = os.path.join(directory, '__MACOSX')
    if os.path.exists(macosx_path):
        shutil.rmtree(macosx_path)

def flatten_directory(directory):
    """ディレクトリをフラット化する関数、移動されたファイルの数を返す"""
    total = 0
    for root, dirs, files in os.walk(directory, topdown=False):
        for file in files:
            original_path = os.path.join(root, file)
            new_path = os.path.join(directory, file)
            new_path = resolve_conflicts(new_path)
            shutil.move(original_path, new_path)
            total += 1

        for dir in dirs:
            dir_path = os.path.join(root, dir)
            if len(os.listdir(dir_path)) == 0:
                os.rmdir(dir_path)

    return total

def resolve_conflicts(path):
    """ファイル名の衝突を解決する関数"""
    base, extension = os.path.splitext(path)
    counter = 1
    while os.path.exists(path):
        path = f"{base}_{counter}{extension}"
        counter += 1
    return path

# アップロードされたファイルを処理し、指定されたディレクトリにZIPファイルを解凍
target_dir = upload_files()

# フラットにしたいディレクトリのパスを指定して関数を実行
total = flatten_directory(target_dir)

# 移動したファイルの総数を2で割った値をloop_countに格納
loop_count = total // 2

import google_colab_selenium as gs
from selenium.webdriver.chrome.options import Options
import time
import os

# Instantiate options
options = Options()

# Add extra options
options.add_argument("--window-size=1920,1080")  # Set the window size
options.add_argument("--disable-infobars")  # Disable the infobars
options.add_argument("--disable-popup-blocking")  # Disable pop-ups
options.add_argument("--ignore-certificate-errors")  # Ignore certificate errors
options.add_argument("--incognito")  # Use Chrome in incognito mode

# ダウンロードフォルダを設定
webm_files_dir = '/content/webm_files'
if os.path.exists(webm_files_dir):
  shutil.rmtree(webm_files_dir)
os.makedirs(webm_files_dir, exist_ok=True)
download_folder = webm_files_dir

prefs = {"download.default_directory" : download_folder}
options.add_experimental_option("prefs", prefs)

for i in range(1, loop_count + 1):
  shutil.copy(f'/content/images/{i:02d}_a.png', f'/content/app01/static/01_a.png')
  shutil.copy(f'/content/images/{i:02d}_b.png', f'/content/app01/static/01_b.png')

  driver = gs.Chrome(options=options)

  driver.get('<http://127.0.0.1:5000>')

  # 動画生成まで単純に1分待機させている
  # 生成されない場合は、この数値を増やす
  time.sleep(60)

  driver.quit()

ダウンロードコマンド

import subprocess
import os
import shutil
from google.colab import files

# 入力となる.webmファイルがあるディレクトリのパス
input_dir = "/content/webm_files"

# 出力.mp4ファイルを保存するディレクトリのパス
output_dir = "/content/mp4_files"

# 出力ディレクトリが存在する場合は削除し、再作成
if os.path.exists(output_dir):
    shutil.rmtree(output_dir)
os.makedirs(output_dir)

# 入力ディレクトリ内の全てのファイルを走査
for file_name in os.listdir(input_dir):
    if file_name.endswith(".webm"):
        # 入力ファイルの完全なパス
        input_file_path = os.path.join(input_dir, file_name)
        # 出力ファイル名(拡張子を.mp4に変更)
        output_file_name = os.path.splitext(file_name)[0] + ".mp4"
        # 出力ファイルの完全なパス
        output_file_path = os.path.join(output_dir, output_file_name)

        # ffmpegコマンドを構築
        command = [
            "ffmpeg",
            "-i", input_file_path,
            "-c:v", "libx264",
            "-crf", "23",
            "-c:a", "aac",
            "-strict", "experimental",
            output_file_path
        ]

        # ffmpegコマンドを実行
        subprocess.run(command)

# ZIPファイルのパスを正確に指定
zip_file_path = '/content/mp4_files.zip'

# 出力ディレクトリをZIPファイルに圧縮し、正確なパスを指定
shutil.make_archive(zip_file_path.replace('.zip', ''), 'zip', output_dir)

# ZIPファイルをダウンロード
files.download(zip_file_path)