Интересная библиотека под названием Mutagen попалась мне на днях. Служит она для обработки метаданных в медиафайлах, а значит сегодняшняя тема будет звучать как: Mutagen — пример работы.
Библиотека Mutagen хороша не только большим количеством поддерживаемых форматов — важно, что библиотека рабочая (в отличии от десятка других, в Google и Wiki-Python упомянутых, но теперь уже заброшенных и устаревших). По заявлению разработчиков — библиотека поддерживает ASF, FLAC, MP4, Monkey’s Audio, MP3, Musepack, Ogg Opus, Ogg FLAC, Ogg Speex, Ogg Theora, Ogg Vorbis, True Audio, WavPack, OptimFROG, и AIFF, а так же получать данные о битрейте трека и его продолжительности. Очень хорошая документация доступна на сайте разработчика, я же поделюсь примером кода, который позволяет выгребать данные о продолжительности трека, его битрейте, исполнителе, и названии песни — такая себе краткая шпаргалка по работе с Mutagen 🙂
import mutagen #Подключили библиотеку Mutagen import datetime #Подключили библиотеку для работы с временем def get_data(track): #Создаем функцию, которая будет получать данные из трека audiofile = mutagen.File(track) #создаем переменную, которая состоит из запроса библиотеки к файлу print('Продолжительность трека:', datetime.timedelta(seconds=audiofile.info.length)) #Выводим продолжительность трека print('Битрейт:', audiofile.info.bitrate) #Выводим битрейт трека song_title = audiofile.tags.getall('TIT2') #Получаем название трека singer_title = audiofile.tags.getall('TPE1') #Получаем исполнителя print('Исполнитель:', singer_title[0]) #Выводим исполнителя print('Название песни:', song_title[0], '\n') #Выводим название трека track = str(input('Название песни: ')) #Просим пользователя ввести название файла get_data(track) #Подключаем функцию
20724064036701606e7c112_000001
Логичным действием будет желание навести порядок в фонотеке на компьютере. Для этого мы сделаем программу, которая будет получать данные об исполнителе песни, ее названии, и — отправлять эти данные с куском трека на сверку. Если отправленные данные верны — переходим к следующему треку, если отправленные данные ошибочны — запрашиваем верные данные, перезаписываем их в теги трека и переходим к следующему треку. Но это уже — другая история 😉 Пока же все, что касается вопроса: Mutagen — пример работы к настоящему моменту описано 🙂
Следите за обновлениями!
Как всегда — в случае возникновения вопросов пишите на почту, или в Telegram.
upd: читатель моего блога Владимир прислал несколько дней вопрос, который звучит следующим образом:
«… Но, к сожалению, моя программа выдает ошибку при выполнении оператора
audiofile = mutagen.File(track).
Я открываю аудиофайл через диалог открытия файлов
fname = QFileDialog.getOpenFileName()[0].
Файл успешно открывается и его имя выводится в окно программы. Но когда я пытаюсь получить некоторые метаданные из этого файла, подставляя вместо «track» «fname», получаю сообщение об ошибке, заложенное мной в «except:».
Из вашей публикации неясно, что вводит пользователь при выполнении оператора track = str(input(‘Название песни: ‘)): только имя файла, имя файла с расширением или полное имя файла (т. е. вместе с путем). Я попробовал все эти варианты, но всегда получал ошибку.
Что же все-таки надо передавать в функцию mutagen.File()?»
Надеюсь, Владимир простит цитирование его письма. Решил кардинально ответить на вопрос Владимира, и набросать программу получения метаданных с оконным интерфейсом. Код программы — ниже.
import mutagen import datetime import tkinter as tk from tkinter import filedialog def get_data(track): audiofile = mutagen.File(track) duration = datetime.timedelta(seconds=audiofile.info.length) bitrate = audiofile.info.bitrate song_title = audiofile.tags.getall('TIT2') singer_title = audiofile.tags.getall('TPE2') return duration, bitrate, song_title[0], singer_title[0] def browse_file(): file_path = filedialog.askopenfilename() if file_path: duration_var.set('') bitrate_var.set('') song_var.set('') singer_var.set('') duration, bitrate, song, singer = get_data(file_path) duration_var.set(duration) bitrate_var.set(bitrate) song_var.set(song) singer_var.set(singer) # Создание окна window = tk.Tk() window.title('Get mp3-info') # Создание элементов интерфейса browse_button = tk.Button(window, text='Выбрать файл', command=browse_file) browse_button.pack(pady=10) duration_label = tk.Label(window, text='Продолжительность трека:') duration_label.pack() duration_var = tk.StringVar() duration_entry = tk.Entry(window, textvariable=duration_var, state='readonly') duration_entry.pack(pady=5) bitrate_label = tk.Label(window, text='Битрейт:') bitrate_label.pack() bitrate_var = tk.StringVar() bitrate_entry = tk.Entry(window, textvariable=bitrate_var, state='readonly') bitrate_entry.pack(pady=5) song_label = tk.Label(window, text='Название песни:') song_label.pack() song_var = tk.StringVar() song_entry = tk.Entry(window, textvariable=song_var, state='readonly') song_entry.pack(pady=5) singer_label = tk.Label(window, text='Исполнитель:') singer_label.pack() singer_var = tk.StringVar() singer_entry = tk.Entry(window, textvariable=singer_var, state='readonly') singer_entry.pack(pady=5) window.mainloop()