【python勉強中】」タグアーカイブ

【Python】mp4ファイルからアーティスト名を取得してアーティスト名ごとに自動振り分けする

#@mp4ファイルからアーティスト名を取得してアーティスト名ごとに自動振り分けする
import os
import re
import pandas as pd
import csv
import shutil
from mutagen.mp4 import MP4

# mp4ファイルからタイトルとアーティスト情報を取得する関数
def get_metadata(filepath):
    metadata = {}
    mp4 = MP4(filepath)
    metadata['title'] = mp4.get('\xa9nam', [''])[0]
    metadata['artist'] = mp4.get('\xa9ART', [''])[0]
    return metadata

# ファイルを移動する関数
def move_file(src_path, dst_path):
    try:
        shutil.move(src_path, dst_path)
    except Exception as e:
        print(f"Could not move file {src_path} to {dst_path}: {e}")

# mp4ファイルのディレクトリを指定
dir_path = input("mp4 file directory path >> ")
dir_path = re.sub(r"[\"\' ]", "", dir_path)

# CSVファイルの保存先を指定
csv_path = input("CSV file path >> ")
csv_path = re.sub(r"[\"\' ]", "", csv_path)

# ディレクトリを自動生成する先のパスを指定
make_dir_path = input("directory path to create new directories >> ")
make_dir_path = re.sub(r"[\"\' ]", "", make_dir_path)

# ファイル名、タイトル、アーティストのリストを格納するリストを初期化
data = []

# ディレクトリ内の全てのmp4ファイルに対して処理を実行
for filename in os.listdir(dir_path):
    if filename.endswith('.mp4'):
        filepath = os.path.join(dir_path, filename)
        metadata = get_metadata(filepath)
        data.append([filename, metadata['title'], metadata['artist']])

        # アーティスト名のフォルダがあるか確認し、なければ作成
        artist_dir_path = os.path.join(make_dir_path, metadata['artist'])
        if not os.path.exists(artist_dir_path):
            try:
                os.mkdir(artist_dir_path)
            except OSError as e:
                print(f"Could not create directory {artist_dir_path}: {e}")

        # ファイルを移動
        move_file(filepath, os.path.join(artist_dir_path, filename))

# データをDataFrameに変換してCSVに書き出し
df = pd.DataFrame(data, columns=['filename', 'title', 'artist'])
df.to_csv(os.path.join(csv_path, "list.csv"), index=False)

# CSVファイルからディレクトリを生成する処理
load_csv_path = os.path.join(csv_path, "list.csv")
encode_type = "UTF-8"

# スキップする行数
skip_rows = 1 # 1行目はヘッダ行なので除外

with open(load_csv_path, encoding = encode_type) as f:
    # CSVファイルをロード
    reader = csv.reader(f)

    # 1行ずつデータを取り出し
    for cnt, row in enumerate(reader):
        # スキップする行数分は何もしない
        if(cnt < skip_rows):
            continue
        # 2列目(アーティスト名)をディレクトリ名にする
        dir_name = row[2]
        # ディレクトリがなければ新規作成
        dir_path = os.path.join(make_dir_path, dir_name)
        try:
            os.mkdir(dir_path)
        except OSError as e:
            print(f"Could not create directory {dir_path}: {e}")