Привіт усім! Я великий меломан – музика зі мною все життя. Власне, мабуть, тому я часто використовую сервіс Shazam – сподобалася мелодія, зашазамив, дізнався, що це за диво-музика грає (навіть у сучасній музиці іноді трапляється щось, що припадає до душі), і потім… А що потім?
Буквально днями я зайшов у свій Shazam-акаунт і побачив (з подивом, що вже приховувати?), що у мене в списку близько півтори тисячі різних пісень. Виникло питання – що робити? Шукати вручну? Так півтори тисячі – це досить трудомістко і довго. Автоматизувати? Звідки завантажувати? Як отримати список усіх збережених пісень із Shazam? Не буду тягнути – прямо зараз, поки я пишу цей пост, на сусідньому моніторі біжить статистика завантаження пісень 😉 Ось, до речі, скрін цього процесу:
Код ще сируватий і взагалі виконується просто у Sublime Text (було цікаво запустити його у потокову роботу, тому не збирав у .exe-файл, та й загалом треба дещо доробити), але головне – код працює. Отже, як усе відбувається?
1. Отримання списку збережених пісень із Shazam:
Почнемо з простого – як отримати список усіх збережених у Shazam пісень на свій комп’ютер? Достатньо просто зайти за посиланням: https://www.shazam.com/ru/privacy/login/download і, побачивши таке вікно:
пройти авторизацію. Наприклад, у мене авторизація прив’язана до акаунту Google. Тому я просто авторизувався через свій Google-акаунт і, побачивши наступне вікно, ввів свою електронну пошту вручну:
Натискаєте кнопку “Надіслати дані”, і бачите текст, у якому протягом 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
– Збережіть 🙂
3. Завантаження музики:
Завантажити пісні з серверів Shazam мені не вдалося. Але є прекрасний сервіс Youtube, де є майже все! Отже, ось код, який шукає треки на YouTube і зберігає їх на комп’ютер за допомогою бібліотеки yt_dlp:
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.")
Надіюсь, тепер ви знаєте, як завантажити музику зі списку Shazam! Якщо є питання – пишіть на email або в Телеграм!
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! ❤️