Mutagen - это модуль Python для обработки аудио-метаданных. Он поддерживает аудио-файлы ASF, FLAC, MP4, Monkey's Audio, MP3, Musepack, Ogg Opus, Ogg FLAC, Ogg Speex, Ogg Theora, Ogg Vorbis, True Audio, WavPack, OptimFROG и AIFF. Поддерживаются все версии ID3v2, и все стандартные кадры ID3v2.4 анализируются. Он может читать заголовки Xing, чтобы точно рассчитать битрейт и длину MP3. Теги ID3 и APEv2 можно редактировать независимо от формата аудио. Он также может манипулировать потоками Ogg на уровне отдельных пакетов / страниц.
Mutagen работает с Python 3.5+ (CPython и PyPy) и не имеет зависимостей вне стандартной библиотеки Python. Мутаген распространяется по лицензии GPL версии 2 или более поздней.
Установка:
pip3 install mutagen
или
sudo apt-get install python3-mutagen
Импорт:
from mutagen.id3 import ID3, TIT2, TALB, TPE1, TCON, APIC
from mutagen.flac import FLAC
from mutagen.mp3 import MP3
Получить список файлов:
def get_filelist(path):
filelist = []
for name in sorted(os.listdir(path)):
ext = os.path.splitext(name)[1]
for index in [".mp3",".flac"]:
if ext == index:
filelist.append(name)
return filelist
Получить аудио файл:
def get_audio(ext, filepath):
if ext == ".flac":
audio = FLAC(filepath)
elif ext == ".mp3":
audio = MP3(filepath)
return audio
Получить данные из файла:
def get_title(audio, ext):
title = "Unknown title"
if ext == ".flac" and 'title' in audio:
title = audio['title'][0]
elif ext == ".mp3" and 'TIT2' in audio:
title = audio['TIT2'].text[0].replace("/", ",")
return title
def get_album(audio, ext):
album = "Unknown album"
if ext == ".flac" and 'album' in audio:
album = audio['album'][0]
elif ext == ".mp3" and 'TALB' in audio:
album = audio['TALB'].text[0].replace("/", ",")
return album
def get_artist(audio, ext):
artist = "Unknown artist"
if ext == ".flac" and 'artist' in audio:
artist = audio['artist'][0]
elif ext == ".mp3" and 'TPE1' in audio:
artist = audio['TPE1'].text[0].replace("/", ",")
return artist
def get_autor(audio, ext):
autor = "Unknown autor"
if ext == ".flac" and 'composer' in audio:
array = audio['composer'][0].split(" ")
autor = array[len(array) - 1]
elif ext == ".mp3" and 'TCOM' in audio:
array = audio['TCOM'].text[0].split(" ")
autor = array[len(array) - 1]
return autor
def get_content(audio, ext):
content = "Unknown content"
if ext == ".flac" and 'title' in audio:
title = audio['title'][0]
elif ext == ".mp3" and 'TCON' in audio:
title = audio['TCON'].text[0].replace("/", ",")
return content
def get_data(audio, ext):
title = get_title(audio, ext)
album = get_album(audio, ext)
artist = get_artist(audio, ext)
autor = get_autor(audio, ext)
content = get_content(audio, ext)
return {'title': title, 'album': album, 'artist': artist, 'autor': autor, 'content': content}
Изменить данные:
def set_title(audio, ext, title):
if ext == ".flac" and 'title' in audio:
audio['title'] = title
elif ext == ".mp3" and 'TIT2' in audio:
audio['TIT2'] = TIT2(encoding=3, text=title)
def set_album(audio, ext, album):
if ext == ".flac" and 'album' in audio:
audio['album'] = album
elif ext == ".mp3" and 'TALB' in audio:
audio['TALB'] = TALB(encoding=3, text=album)
def set_artist(audio, ext, artist):
if ext == ".flac" and 'artist' in audio:
audio['artist'] = artist
elif ext == ".mp3" and 'TPE1' in audio:
audio['TPE1'] = TPE1(encoding=3, text=artist)
def set_genre(audio, ext, genre):
if ext == ".flac" and 'genre' in audio:
audio['genre'] = genre
elif ext == ".mp3" and 'TCON' in audio:
audio['TCON'] = TCON(encoding=3, text=genre)
def set_data(audio, path, filepath, ext, data, new_album, new_artist, new_genre):
new_name = data['artist'] + " - " + data['title'] + ext
new_path = os.path.join(path, new_name)
new_title = data['artist'] + " - " + data['title'] + " [" + data['album'] + "]"
set_title (audio, ext, new_title)
set_album (audio, ext, new_album)
set_artist (audio, ext, new_artist)
set_genre (audio, ext, new_genre)
audio.save()
os.rename(filepath, new_path)
Осталось указать новое название альбома, артиста, жанр и каталог:
if __name__ == "__main__":
path = "./music"
album = "Selected"
artist = "Избранные исполнители"
genre = "Избранное"
for filename in get_filelist(path):
filepath = os.path.join(path, filename)
ext = os.path.splitext(filename)[1]
audio = get_audio(filepath, ext)
data = get_data(audio, ext)
set_data(audio, path, filepath, ext, data, album, artist, genre)
print("Готово...")