Mutagen - пример работы

Python: Mutagen -пример работы

Интересная библиотека под названием 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) #Подключаем функцию

202238613466061251ade91_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()