Как загрузить музыку из Shazam

Как загрузить музыку из Shazam?

Привет всем! Я большой меломан — музыка со мной всю жизнь. Собственно, потому, наверное, я частенько и использую сервис Shazam — понравилась мелодия, зашазамил, узнал — что же это за диво-дивное играет (даже в современной музыке встречается иногда что-то, что приходится «по душе»), и потом… А что — потом?

Буквально на днях я залез в свой Shazam-аккаунт, и увидел (с удивлением, чего уж тут скрывать?),что у меня в списке порядка полутора тысяч различных песен. Возник вопрос — как быть? Искать в ручном режиме? Так полторы тысячи — достаточно трудоемко и долго. Автоматизировать? Откуда качать? Как получить список всех сохраненных песен из Shazam? Не буду томить — прямо сейчас, пока я пишу данный пост — на соседнем мониторе бежит статистика загрузки песен 😉 Вот, кстати, скрин этого действа:
как загрузить музыку из Shazam

Код сыроват, и вообще выполняется просто в Sublime Text (было очень интересно запустить его в потоковую работу, потому не пережал в .exe — файл, да и в принципе нужно кое-что доделать-окультурить) — но главное, код работает. Итак, как все происходит?

1. Получение списка сохраненных песен из Shazam:
Начнем с простого — как получить список всех сохраненных в Shazam песен на свой компьютер? Достаточно просто зайти по ссылке: https://www.shazam.com/ru/privacy/login/download и увидев следующее окошко:
сохранить список песен из shazam на компьютер
пройти авторизацию. Например, у меня — авторизация привязана к аккаунту Google. Потому я просто авторизировался через свой Google-аккаунт, и, увидев следующее окошко — ввел свой адрес вручную:
сохранить список песен из shazam на компьютер
Нажимаете кнопочку «Отправить данные», и видите текст, в котором в течении 30 дней вам обещают прислать все сохраненные на серверах Shazam данные. Пусть вас это не пугает — мне прислали часа через два 🙂 Приходит, кстати, архив data.zip, в котором имеется следующий список файлов:
— AnalyticsSongs.jsonl
— AnalyticsUsage.jsonl
— Installations.json
— README.pdf
— SyncedSongs.csv

Мне было лениво разбираться что к чему (хотя, посмотрев в AnalyticsSongs.jsonl вы увидите массу интересного!), потому я просто сразу открыл SyncedSongs.csv. Тут и начинается следующий этап…

2. Получение текстового файла с исполнителем и названием песни:
Содержимое файла SyncedSongs.csv имеет следующую структуру:

artist,"title","status","date","longitude","latitude"

нас, понятное дело, интересует исполнитель музыки, и ее (этой самой музыки) — название. Можно делать обрезать лишнее с помощью Python, но зачем? Ведь можно использовать штатные средства Excel. И вот вам — целых два способа открыть файл, в котором значения разделены запятыми, причем так, что бы они открывались по столбам? :
Способ 1:
Открытие файла через Excel:

Откройте Excel.
— Перейдите на вкладку Данные.
— Нажмите кнопку Из текста/CSV (в старых версиях Excel — «Открыть» и выберите CSV-файл).
— В появившемся окне предварительного просмотра убедитесь, что выбран разделитель Запятая.
Нажмите Загрузить или ОК — данные будут распределены по столбцам.

Способ 2:
Использование мастера «Текст по столбцам»:

— Если файл уже открыт и все данные находятся в одном столбце, выделите этот столбец.
— Перейдите на вкладку Данные.
— Нажмите кнопку Текст по столбцам.
— Выберите С разделителями и нажмите Далее.
Отметьте разделитель Запятая (убедитесь, что другие разделители не выбраны) и нажмите Далее.
Нажмите Готово — данные разделятся по столбцам.

После того, как мы получили разделенные по столбцам данные — удаляем лишние столбцы, а все остальное сохраняем в текстовый файл (можно было бы, конечно, использовать и Excel-файл, но с текстовым как-то попроще, ибо мы обрабатываем конкретную строку). Для сохранения данных в текст используйте следующий метод:
— выбираем «Файл» → «Сохранить как»
— выбираем формат «Текст (разделенный знаками табуляции)» .txt
— сохраняем 🙂
Получаем текстовый файл, в котором каждая строка состоит из исполнителя, и через TAB — названия песни. Теперь, когда у нас имеются все необходимые данные — стоит вопрос загрузки музыки из Shazam.

3. Загрузка музыки:
Сразу скажу — загрузить песни с серверов Shazam — я не смог. И с серверов Spotify — к сожалению тоже… В теории, можно было бы заморочиться перехватом аудио-потока, но в таком случае запись даже одного трека займет много времени, да и перехват потока — такое себе удовольствие. Однако — у нас есть прекрасный сервис Youtube, на котором, наверное, есть все 🙂 Даже сейчас у меня в наушниках фоном играет трек из Youtube:

(кстати, как вам такой стиль?)

Я взял за основу эту мысль, и … вот, код, который построчно ищет данные в Youtube, а потом просто сохраняет их вам на компьютер. В основе — Python-библиотека yt_dlp. Есть еще библиотека tqdm — но она используется для организации показа симпатичного прогресс-бара (руки, надеюсь, дойдут поправить чуть позже динамическое отображение статистики загрузки песен). Все остальное — сугубо системные библиотеки.

import yt_dlp  # Библиотека для загрузки аудио/видео с YouTube
from tqdm import tqdm  # Библиотека для отображения прогресс-бара
import time
import os
import sys
# Файл со списком песен
song_list_file = "Song_list.txt"
# Файлы логов
success_file = "success.txt"  # Файл с успешными загрузками
failed_file = "failed.txt"  # Файл с ошибками загрузки
# Основной цикл обработки песен
while True:
# Читаем файл со списком песен
with open(song_list_file, "r", encoding="utf-8") as file:
songs = file.readlines()
# Если список песен пуст — завершаем работу
if not songs:
break
# Берем первую песню из списка
song = songs[0].strip()
if not song:  # Если строка пустая, пропускаем её
songs.pop(0)
continue
# Разделяем строку на исполнителя и название песни
try:
artist, title = song.split("\t", 1)  # Разделитель — табуляция
except ValueError:  # Если строка не соответствует формату, логируем ошибку
with open(failed_file, "a", encoding="utf-8") as failed_log:
failed_log.write(f"{song} - Неверный формат\n")
songs.pop(0)
continue
# Формируем строку поиска для YouTube
query = f"{artist} {title}"
# Формируем путь к файлу загрузки
output_filename = f"downloads/{artist} - {title}.mp3"
# Создаем папку для загрузок, если её нет
os.makedirs("downloads", exist_ok=True)
# Настройки yt-dlp для загрузки аудио
ydl_opts = {
"format": "bestaudio/best",  # Выбираем лучшее аудио
"outtmpl": f"downloads/{artist} - {title}.%(ext)s",  # Формат имени файла
"quiet": True,  # Отключаем лишний вывод в консоль
"postprocessors": [{  # Конвертация в MP3 после загрузки
"key": "FFmpegExtractAudio",
"preferredcodec": "mp3",
"preferredquality": "192",
}],
"progress_hooks": [],  # Хук для обновления прогресса
"noprogress": True,  # Отключение стандартного прогресса yt-dlp
}
print(f"\n🔍 Ищу: {query}")
# Создаём прогресс-бар
pbar = tqdm(total=100, desc=f"Загрузка {query}", ncols=100, unit="%", dynamic_ncols=True, file=sys.stdout)
def progress_hook(d):
"""Функция для обновления прогресса загрузки"""
if d["status"] == "downloading":
percent_str = d.get("_percent_str", "0.0%").strip("%")
try:
percent = float(percent_str)
pbar.update(percent - pbar.n)  # Обновляем разницу в процентах
except ValueError:
pass
elif d["status"] == "finished":
pbar.n = 100
pbar.update(0)
pbar.close()
# Добавляем хук прогресса в настройки yt-dlp
ydl_opts["progress_hooks"].append(progress_hook)
try:
# Запускаем загрузку через yt-dlp
with yt_dlp.YoutubeDL(ydl_opts) as ydl:
ydl.download([f"ytsearch:{query}"])  # Поиск и загрузка
# Проверяем, создан ли файл
if os.path.exists(output_filename):
with open(success_file, "a", encoding="utf-8") as success_log:
success_log.write(f"{query}\n")
print(f"\r✅ Успешно загружено: {query}{' ' * 30}")
else:
with open(failed_file, "a", encoding="utf-8") as failed_log:
failed_log.write(f"{query} - Ошибка конвертации\n")
print(f"\r❌ Ошибка конвертации: {query}{' ' * 30}")
except Exception as e:
# Логируем ошибку загрузки
with open(failed_file, "a", encoding="utf-8") as failed_log:
failed_log.write(f"{query} - {str(e)}\n")
print(f"\r❌ Ошибка при загрузке: {query} - {e}{' ' * 30}")
# Удаляем обработанную строку из файла
songs.pop(0)
with open(song_list_file, "w", encoding="utf-8") as file:
file.writelines(songs)
time.sleep(1)  # Короткая задержка перед следующей загрузкой
print("\n🎵 Завершено! Успешные загрузки в success.txt, ошибки в failed.txt.")

Скачать .py файл можно и вот тут 🙂
Надеюсь, теперь вы смогли разобраться с проблемой загрузки песен из списка своих сохраненных shazam 🙂 Как всегда — в случае возникновения вопросов пишите на почту, или в Телеграм.

И да, программка с графическим интерфейсом, которая позволит сохранять музыку, сохраненную в вашем аккаунте Shazam — скоро представлю 🙂

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! ❤️

PayPal Logo Donate via PayPal

Revolut Logo Donate via Revolut

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *