Пока я составлял еще один плейлист для работы, у меня возникло подозрение, что некоторые песни в плейлисте не «работают» с другими. Я не знал, какой подход был лучший. Я мог бы прослушать весь плейлист от начала до конца, чтобы найти выбросы, но что, если плейлист состоит из нескольких сотен песен? А как насчет темпа - как проще всего увидеть, если некоторые песни слишком медленные или слишком быстрые по сравнению со средним значением? Именно в этот момент я начал жаждать чего-то визуального, на что можно было бы указать, сказать: «Вот как выглядит мой плейлист», что само по себе является странной концепцией.

Использование Spotify API и некоторых пакетов Python упрощает эту задачу. Spotify предоставляет невероятно богатые данные: каждая песня содержит метаданные, описывающие, где ее можно проигрывать, популярность, темп и даже насколько «танцевальная» композиция. Используя это, я решил пересмотреть свой плейлист с другой точки зрения и немного освежить свой Python, который в наши дни более чем ржавый.

Анализ плейлистов

Используя Spotipy API и некоторый код, в значительной степени вдохновленный отличным постом Хуана Де Диоса Сантоса, я смог собрать некоторые приблизительные детали по каждому треку. Затем я приступил к графическому отображению возвращаемых значений с помощью matplotlib, что дало мне визуализацию моего списка воспроизведения, которую я искал.

У каждой дорожки на Spotify есть список звуковых функций, которые описывают основную композицию этой дорожки. Это способ Spotify объективно сказать, каковы качества песни и как она звучит. Есть много функций звука, и, чтобы не отображать данные в графиках, которые мне не нужны, я выбираю только самые важные из них, а именно: энергию, танцевальность, валентность и темп. Я объясню, что каждый из них означает ниже.

Заявление об ограничении ответственности: я не аналитик данных, и я абсолютно несу чушь с Matplotlib и Python. Не стесняйтесь отправлять запросы на включение в репозиторий, указанный ниже, с любыми предложениями 👍

Энергия ✨

Энергия - это «мера от 0,0 до 1,0, представляющая перцептивную меру интенсивности и активности».

Как видите, у нас здесь довольно хороший выбор. Все песни имеют перекос чуть выше 0,4, но никогда не выше 0,85.

Валентность 😃 / 😠

Валентность - это «мера от 0,0 до 1,0, описывающая музыкальную позитивность, передаваемую треком». Удивительно, но Spotify считает, что этот плейлист немного смещен в сторону более мрачных вещей, при этом большинство треков имеют рейтинг ниже 0,4. Несколько ударов выше 0,5, но в целом мы немного капризны.

Танцевальность 🕺

Danceability, согласно документации Spotify API, «описывает, насколько подходит трек для танцев на основе комбинации музыкальных элементов, включая темп, стабильность ритма, силу удара и общую регулярность». Мой плейлист определенно танцевальный!

Темп 🎼

Темп - наиболее очевидная из всех функций. Это скорость музыки, измеряемая в ударах в минуту (BPM). Большинство песен попадают в довольно стабильный диапазон 110–130 ударов в минуту.

Хватит, покажи мне код!

Хорошо, хорошо, я тебя слышу. Вот код, но я все равно проведу вас по нему просто для объяснения.

Настраивать

Для работы с клиентом Spotipy Python вам необходимо установить две переменные среды: SPOTIPY_CLIENT_IDи SPOTIPY_CLIENT_SECRET. Вы можете получить их, создав учетную запись разработчика Spotify и зарегистрировав приложение, что занимает около 5 минут: https://developer.spotify.com/dashboard/login

Затем возьмите идентификатор плейлиста любого из ваших плейлистов Spotify. Вы также можете сделать это с общедоступными плейлистами, созданными другими пользователями или Spotify. ID - это первая группа символов перед ?si= в URI. Например, если URL-адрес списка воспроизведения - https://open.spotify.com/playlist/37i9dQZF1DX4wta20PHgwo?si=5f7fb3fef69c44d6, то идентификатор будет 37i9dQZF1DX4wta20PHgwo.

Получив эти данные, вы можете клонировать репозиторий, указанный выше, и выполнить основной скрипт Python:

> python main.py --username 'user123' --playlist-id='37i9dQZF1DX4wta20PHgwo'

Код разделен на один класс и несколько функций, которые выполняют следующее:

  1. class ScrollableWindow создает прокручиваемое окно с помощью PyQt5, поскольку в окнах matplotlib прокрутка не поддерживается
  2. get_playlist_enabled_songs получает список всех включенных песен в плейлисте. Иногда песни переключаются или вообще удаляются с рынка. Нам не следует показывать это в наших результатах, так как вы больше не можете слушать эту песню. Более подробную информацию об этом можно найти здесь.
  3. get_playlist_content извлекает все треки в данном списке воспроизведения. Он поддерживает пейджинг. Еще раз привет Хуану де Диос Сантосу, чей код я здесь широко использовал.
  4. get_playlist_audio_features извлекает звуковые функции для списка идентификаторов дорожек и возвращает объект, содержащий имя дорожки и ее функции.
  5. get_playlist_dataframe отображает данные, чтобы показать нам, как наш плейлист выглядит на основе звуковых функций, полученных с помощью функции выше.

И это все! Больше ничего особенного. Есть много вещей, которые я хотел бы здесь улучшить, но для небольшого побочного проекта это был отличный опыт обучения.