Default (GPT-3.5)



指定されたディレクトリー内の動画ファイルの一覧とトータルの長さを収録するコードを生成してください

ChatGPT

指定されたディレクトリ内の動画ファイルの一覧を取得し、それらの動画ファイルの合計再生時間を計算するPythonのコードを生成しましょう。このコードにはいくつかのライブラリを使用します。必要なライブラリをインストールしてから以下のコードを実行できます。

  1. os ライブラリはディレクトリ内のファイルを取得するために使用します。
  2. moviepy.editor ライブラリは動画ファイルの長さを取得するために使用します。これをインストールするには、pip install moviepy を実行してください。

以下はコードの例です:

python
import os
from moviepy.editor import VideoFileClip

# 動画ファイルが含まれるディレクトリのパス
directory_path = '/path/to/your/directory'

# ディレクトリ内の動画ファイルの一覧を取得
video_files = [f for f in os.listdir(directory_path) if f.endswith(('.mp4', '.avi', '.mkv'))]

total_duration = 0 # 合計再生時間(秒)

# 各動画ファイルの再生時間を計算し、合計に追加
for video_file in video_files:
video_path = os.path.join(directory_path, video_file)
try:
video_clip = VideoFileClip(video_path)
duration = video_clip.duration
total_duration += duration
except Exception as e:
print(f"エラー: {video_file} を処理中にエラーが発生しました。")
print(e)

# 合計再生時間を時間単位に変換
total_hours = total_duration // 3600
total_minutes = (total_duration % 3600) // 60
total_seconds = total_duration % 60

print("動画ファイル一覧:")
for video_file in video_files:
print(video_file)

print(f"\n合計再生時間: {total_hours} 時間, {total_minutes} 分, {total_seconds} 秒")

このコードは、指定されたディレクトリ内の動画ファイルの一覧を取得し、各動画ファイルの再生時間を計算して、最終的に合計再生時間を表示します。必要に応じて、ディレクトリのパスを適切に変更してください。

            :
            :
            :



合計再生時間表示部で時間と分の扱いが、floatのデータを整数扱いしています。
整数化するか、02f 書式にする必要はありませんか?

ChatGPT

合計再生時間の表示部分において、時間と分の扱いが float のデータを整数として扱うか、02f の書式を使って表示するかの選択肢があります。どちらを選択するかは、表示の形式に合わせて決定できます。

  • 整数化する場合:時間と分は整数として扱い、秒は小数点以下2桁で表示されます。この場合、秒数の小数部が切り捨てられ、秒数が整数になります。

  • 02f 書式を使う場合:時間、分、秒をそれぞれ2桁で表示します。秒数は必ず2桁表示になり、小数部が0埋めされます。たとえば、1時間30分15.25秒は "01時間 30分 15.25秒" となります。

どちらの方法を選択するかは、表示の好みや目的によります。例えば、小数部を切り捨てて秒数を整数にすることが重要な場合には整数化が適しています。一方、秒数の精度を保ちつつ見栄えを整えたい場合には 02f 書式を使うことができます。

修正する方法について、以下に示します:

整数化する場合:

python
total_hours = int(total_duration) // 3600
total_minutes = (int(total_duration) % 3600) // 60
total_seconds = int(total_duration) % 60

02f 書式を使う場合:

python
total_hours = total_duration // 3600
total_minutes = (total_duration % 3600) // 60
total_seconds = total_duration % 60
total_seconds_formatted = f"{total_seconds:02f}"

どちらを選択するかは、具体的な要件に合わせてお選びいただけます。

各データの表示では整数化しているので、支障がなければ統一した方式の方が誤解を与えないと思います。

ChatGPT

ご提案いただいた通り、各データの表示を整数化して統一する方法が誤解を防ぐために良い選択です。整数化によって、合計再生時間の表示が整数の形式で統一されます。以下が修正済みのコードです:

python
import os
import sys
from moviepy.editor import VideoFileClip

def format_filesize(size):
# ファイルサイズを3桁毎にカンマを入れてフォーマット
return f"{size:,.0f}"

def format_duration(duration, use_hms=False):
if use_hms:
hours, remainder = divmod(duration, 3600)
minutes, seconds = divmod(remainder, 60)
# 時間、分、秒が1桁の場合も空白を含めて2桁で表示
return f"{int(hours):02d}時間 {int(minutes):02d}{int(seconds):02d}秒"
else:
return f"{int(duration)}秒"

def calculate_total_duration(directory_path, use_hms=False):
# ディレクトリ内の動画ファイルの一覧を取得
video_files = [f for f in os.listdir(directory_path) if f.endswith(('.mp4', '.avi', '.mkv'))]

total_duration = 0 # 合計再生時間(秒)

# HTML出力の開始部分
if use_hms:
html_output = "<html><body><h1>動画ファイル一覧</h1><table><tr><th width='160'>再生時間</th><th width='160'>ファイルサイズ</th><th>ファイル名</th></tr>"
else:
html_output = "<html><body><h1>動画ファイル一覧</h1><table><tr><th width='130'>再生時間</th><th width='160'>ファイルサイズ</th><th>ファイル名</th></tr>"

# 各動画ファイルの再生時間とファイルサイズを計算し、HTMLに追加
for video_file in video_files:
video_path = os.path.join(directory_path, video_file)
try:
video_clip = VideoFileClip(video_path)
duration = video_clip.duration
size = os.path.getsize(video_path) # ファイルサイズ(バイト)

# ファイル名が長すぎる場合にはセル内で改行
if len(video_file) > 70:
video_file = "<br>".join([video_file[i:i+70] for i in range(0, len(video_file), 70)])

# 個別の再生時間、ファイルサイズをフォーマットしてHTMLの表に追加
formatted_duration = format_duration(duration, use_hms)
formatted_size = format_filesize(size)
if use_hms:
html_output += f"<tr><td style='text-align:right;' width='160'>{formatted_duration}</td><td style='text-align:right;' width='160'>{formatted_size}バイト</td><td>{video_file}</td></tr>"
else:
html_output += f"<tr><td style='text-align:right;' width='130'>{formatted_duration}</td><td style='text-align:right;' width='160'>{formatted_size}バイト</td><td>{video_file}</td></tr>"

total_duration += duration
video_clip.close() # 明示的にクローズ
except Exception as e:
print(f"エラー: {video_file} を処理中にエラーが発生しました。")
print(e)

# 合計再生時間を時間単位に変換
total_hours = int(total_duration) // 3600
total_minutes = (int(total_duration) % 3600) // 60
total_seconds = int(total_duration) % 60

# 合計再生時間をHTMLに追加
html_output += f"</table><h2>合計再生時間: {total_hours:02d} 時間, {total_minutes:02d} 分, {total_seconds:02d} 秒</h2></body></html>"

# 出力ファイル名を生成
base_directory_name = os.path.basename(directory_path)
output_filename = f"video_info_{base_directory_name}.html"

# 結果を生成された出力ファイルに保存
with open(output_filename, "w") as html_file:
html_file.write(html_output)

if __name__ == "__main__":
# コマンドライン引数からディレクトリパスを取得
if len(sys.argv) >= 2:
directory_path = sys.argv[1]
use_hms = "-hms" in sys.argv # -hms オプションが指定されたら True にする
else:
print("使用法: python script.py ディレクトリパス [-hms]")
sys.exit(1)

calculate_total_duration(directory_path, use_hms)

この修正済みのコードでは、時間と分を整数として扱い、秒数も整数として表示されるようになります。