Загрузка mp3 файлов с сайта

Загрузка mp3 файлов с сайта

Категория статьи: Нейронные сети

Проект: Shazam своими руками

Описание процесса загрузки файлов mp3 с сайта, используя пакет requests

Всем привет!

Как я уже говорил раньше, для обучения модели нам понадобятся музыкальные файлы записанные с микрофона. Я загрузил их на сайт и подготовил обработчик, который возвращает данные в формате json. Посмотреть его можно перейдя по этой ссылке https://evgenykondratev.ru/shazam/j?train=1

Давайте быстренько разберем что здесь есть:
• filecount - количество файлов mp3
• filename_prefix_train - это префикс файлов, которые используются для обучения модели (если префикс отсутствует - это оригинальный файл)
• path - Путь к директории с файлами
• status - Статус ответа сервера (Если 200, значит все в порядке)
• data - это список, каждый элемент которого состоит из 2х полей filename - имя файла mp3 и id - идентификатор mp3 файла (будем использовать для классификации звуковых файлов)

Давайте откроем файл проекта Colab и напишем код, который загрузит mp3 файлы в проект для дальнейшей работы с ними, используя формат json

Сначала создадим директорию, куда будем сохранять mp3 файлы. Так как создание директории будет использоваться несколько раз для разных папок предлагаю оформить в виде функции

import os
def create_dir_if_not_exists(src_dir, echo=False):
  if not os.path.exists(src_dir):
    os.makedirs(src_dir)
    if echo:
      print(f"Создана директория '{src_dir}'")
  else:
    if echo:
      print(f"Директория '{src_dir}' уже существует")

Назовем нашу директорию "mp3" и вызовем функцию создания директории

mp3_dir = 'mp3'
create_dir_if_not_exists(mp3_dir, True)

Теперь перейдем, непосредственно, к запросу для получения данных в формате json

import requests
import json

response = requests.get(url="https://evgenykondratev.ru/shazam/j?train=1")

if response.headers['Content-Type'] == 'application/json':
  mp3_data = json.loads(response.text)
  print(list(mp3_data.keys()))
  print(f"Префикс к файлами mp3: { mp3_data['filename_prefix_train'] }")
  print(f"Путь к директории с файлами mp3: { mp3_data['path'] }")
  print(f"Количество файлов для загрузки: {mp3_data['filecount']}")

Сначала импортируем пакеты requests и json, затем выполняем запрос и получаем ответ, далее анализируем тип заголовка ответа (убеждаемся, что данные пришли действительно в формате json). Загружаем данные из json в словарь mp3_data и выводим информацию на экран.

Следующий код тоже использует запрос, но уже на получение данных самих файлов mp3

from google.colab import output

for item in mp3_data['data']:
  output.clear()
  print(f"{item['id']} / {mp3_data['filecount']}")
  r = requests.get(url=mp3_data['path'] + mp3_data['filename_prefix_train'] + item['filename'])
  with open(os.path.join(mp3_dir, str(item['id'] - 1).zfill(4) + ".mp3"), 'wb') as f:
    f.write(r.content)
  f.close()

Результатом данного запроса будет ответ, в котором присутствуют определенные заголовки, а сам контент представлен в виде бинарных данных. Я просто открываю файл и сохраняю информацию. Обратите внимание на имя нового файла, оно составляется из идентификатора файла - 1 и дополняется 4-мя нулями (то есть будет так: 0000.mp3, 0001.mp3, 0002.mp3 ...). Единицу отняли, потому что списки в python начинаются с 0, а данные в json ответе начинаются с 1

Теперь у нас есть директория с mp3 файлами на основе которых мы будем подготавливать данные для обучения модели