Найти тему
Linux code

Mutagen. Сортируем музыкальную коллекцию

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("Готово...")