Интересная библиотека под названием 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) #Подключаем функцию
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('TPE2') #Получаем исполнителя
print('Исполнитель:', singer_title[0]) #Выводим исполнителя
print('Название песни:', song_title[0], '\n') #Выводим название трека
track = str(input('Название песни: ')) #Просим пользователя ввести название файла
get_data(track) #Подключаем функцию
Логичным действием будет желание навести порядок в фонотеке на компьютере. Для этого мы сделаем программу, которая будет получать данные об исполнителе песни, ее названии, и — отправлять эти данные с куском трека на сверку. Если отправленные данные верны — переходим к следующему треку, если отправленные данные ошибочны — запрашиваем верные данные, перезаписываем их в теги трека и переходим к следующему треку. Но это уже — другая история 😉 Пока же все, что касается вопроса: 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()
Support the Blog!
Running a blog takes a lot of effort, time, and passion. Your donations help improve the content, inspire new ideas, and keep the project going.
If you’ve enjoyed the blog’s materials, any support would mean the world to me. Thank you for being here! ❤️