Эта статья основана на большой работе rob_med по созданию полноценного CLI-приложения генератора списков воспроизведения с использованием Python!

Что мы построим

Да, Spotify уже создает для нас списки воспроизведения на основе нашей истории прослушивания, но было бы здорово иметь собственный инструмент для создания собственных списков воспроизведения на основе любой песни, которая вам нравится!?

В этой статье вы узнаете, как создать CLI-приложение на Python, которое будет создавать и сохранять список воспроизведения в Spotify на основе выбранной вами песни.

Стек технологий

В наборе технологий для этого проекта нет ничего особенного, мы будем использовать Python вместе с библиотекой Spotipy для создания приложения CLI. Мы также будем использовать ключ API от API Spotify, чтобы обеспечить доступ к нужным нам данным пользователя и конечным точкам.

Если вы хотите расширить этот учебник, вы можете включить пользовательский интерфейс, возможно, с помощью Flask.

Требования

  • Питон 3.7+
  • Учетная запись Spotify Web API и ключ API

Начало настройки с помощью веб-API Spotify

Веб-API Spotify хорошо задокументирован, что позволяет разработчикам интуитивно понятно создавать любые формы приложений, используя свои конечные точки. Чтобы создать учетную запись разработчика Spotify, достаточно просто войти в панель управления с помощью собственной учетной записи Spotify!

Мы будем использовать несколько различных конечных точек API, но мы будем делать это с помощью аккуратно упакованной библиотеки Spotipy (облегченная библиотека Python для веб-API Spotify) — мы также будем использовать Spotipy для процесса авторизации пользователя!

После входа в систему вы захотите продолжить и создать себе новое приложение, используя кнопку «Создать приложение» — появится форма для заполнения, подобная приведенной ниже. Не забудьте назвать свое приложение чем-то запоминающимся и значимым, чтобы оно было интуитивно понятным и легким.

Теперь наше приложение создано, не забудьте записать идентификатор клиента, а также секрет клиента, так как они понадобятся нам позже!

Пока мы все еще на панели инструментов, мы также добавим URI обратного вызова, на который также будет ссылаться наш скрипт Python, когда мы начнем сборку. В этом примере мы будем использовать «http://localhost:8888/callback».

Авторизация пользователя с помощью Spotipy

Библиотека Spotipy предлагает нам два типа поддерживаемых потоков авторизации. В этом проекте мы будем использовать поток кода авторизации. Согласно документации Spotipy:

Этот метод подходит для долго работающих приложений, в которые пользователь входит один раз. Он предоставляет токен доступа, который можно обновить.

Обратите внимание, что этот метод авторизации потребует от вас добавления URI перенаправления в ваше приложение на панели инструментов Spotify Web API, как мы сделали в предыдущем разделе!

Обзор функциональности

Прежде чем мы начнем конкретизировать наш сценарий, мы разобьем нашу идею на отдельные функции:

  • Получение сидов исполнителя и песни — Spotify кодирует каждый трек и исполнителя в «начальные числа», поэтому нам придется «переводить» исполнителя и входные данные трека в понятные исходные данные для API.
  • Получите токен API, чтобы мы могли использовать нужные нам конечные точки.
  • Токен Cache API — мы будем использовать кеширование токена с помощью Pickle (ПРИМЕЧАНИЕ: этот подход не рекомендуется для многопользовательских общедоступных приложений из-за проблем с безопасностью).
  • Получить жанры трека — Spotify предоставляет каждому треку/исполнителю до 5 разных жанров в качестве тегов, мы будем случайным образом выбирать и использовать один из них для создания списка воспроизведения похожих песен.
  • Создайте 25 рекомендуемых песен!
  • Создайте новый список воспроизведения. В зависимости от того, как работают конечные точки веб-API Spotify, функциональность создания списка воспроизведения разделена на 2 этапа, первый из которых.
  • Добавьте рекомендуемые песни во вновь созданный плейлист.
  • Необязательно — распечатайте список воспроизведения в командной строке.

Пока мы в настроении планировать, мы должны подумать о том, какими будут ожидаемые входные/выходные данные нашего сценария.

С точки зрения аргументов запуск нашего скрипта будет выглядеть примерно так:

python ./spotify_playlist_gen.py --artist 'rand_artist' --track 'rand_track'

И возврат этого будет либо оператором печати, сообщающим, что список воспроизведения был сохранен, либо список воспроизведения напечатан:

The playlist based on 'rand_track' is:
1. track by artist
...

Создание скрипта Python

Давайте перейдем к созданию сценария сейчас! Мы будем решать каждую из функций одну за другой, а также просматривать фрагменты кода по мере продвижения. Давайте прыгать прямо в!

Во-первых, мы сосредоточимся на параметрах интерфейса командной строки, которые будут обрабатывать аргументы нашего скрипта. Мы будем использовать библиотеку argparse, так как она очень удобна и не требует установки pip!

Сначала мы создадим синтаксический анализатор argparse, а затем добавим 3 аргумента для сценария — исполнитель, трек и необязательный аргумент для сохранения плейлиста. Обратите внимание, что требуются аргументы исполнителя и дорожки — это означает, что если скрипт запускается без них, он вернет ошибку, а не попытается запустить все это целиком.

Далее мы сосредоточимся на функциях для определения URL-адреса конечной точки, а также получения токена API — это в тех случаях, когда нам понадобится секрет клиента и т. д. Мы будем иметь это как глобальные переменные в верхней части файл, чтобы мы могли легко ссылаться на них повсюду.

Наряду с процессом получения токена мы включим функцию кэширования токена — мы сделаем это, используя библиотеку Pickle для сериализации токена. Мы также добавим некоторые функции для проверки необходимости обновления токена — это будет сделано путем проверки даты изменения файла Pickle с помощью библиотеки ОС и определения необходимости нового токена (см. строку 12).

Процесс получения токена включает в себя вызов конечной точки API (как показано в строке 21 приведенного выше описания) и последующую обработку ответа json. Процесс кэширования довольно прост и почти такой же, как запись в файл любого другого типа в Python.

Как упоминалось ранее в разбивке по функциям, этот процесс кэширования небезопасен для общедоступных приложений!

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

Для этой функции мы будем использовать конечную точку «https://api.spotify.com/v1/search?». Мы будем использовать эту конечную точку в качестве основы для создания URL-адреса с использованием аргументов скрипта, которые мы можем запросить для получения необходимых нам семян — это можно увидеть в строках 21–23. При обработке ответа json мы включили «защитное программирование» в форме обработки исключений, чтобы защититься от любых потенциальных проблем при запросе API.

В этом разделе мы также включим выбор жанра, который будет использоваться для рекомендаций песен. Это делается путем извлечения всех жанров, связанных с исполнителем/треком, и использования ГСЧ для выбора случайного из них для использования. Обратите внимание, что в этом разделе также есть обработка исключений, потому что Spotify может хранить жанры не для всех исполнителей — это одна из наиболее распространенных причин, по которой этот скрипт не работает, обратите внимание.

Теперь мы сосредоточимся на основной функциональности этого приложения — запросе конечной точки рекомендации для получения 25 песен для нашего плейлиста!

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

  • settings[0, 1] ->[конечная точка рекомендации, токен API]
  • фильтры[0, 1, 2, 3, 4] -> [количество треков, рынок, исходное число жанров, исходное число исполнителей, исходное число треков]
  • seed[0, 1 ,2] -> [начальное число исполнителя, исходное число трека, исходное число жанра]

Надеюсь, это дает хороший обзор того, что содержит каждая ссылка на переменную выше, без необходимости возвращаться ко всей сути! Прежде чем двигаться дальше, краткое замечание о рыночной переменной — ее нужно будет изменить, чтобы она соответствовала региону, в котором вы находитесь.

Чтобы проверить доступные рынки, перейдите по этой ссылке — https://developer.spotify.com/console/get-available-markets

Функция define_settings здесь довольно прямолинейна, она действительно объединяет необходимые метаданные для запроса API в основной функции. Сам запрос API, подобно тому, как мы запрашивали семена, создается с использованием конечной точки, а затем с использованием фильтров!

Полученный ответ json будет содержать 25 песен, которые были рекомендованы с использованием алгоритма Spotify на основе введенного исполнителя и трека!

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

Функциональность «сохранения в новый список воспроизведения» разделена на несколько функций — создание списка воспроизведения, последующее определение идентификатора этого списка воспроизведения и добавление дорожек. Все это можно сделать с помощью пакета Spotipy, и обычно это выглядит примерно так: сначала мы объявляем область запроса, а затем передаем секрет клиента, идентификатор и URI перенаправления в экземпляр Spotipy перед вызовом соответствующей функции, например. ‘user_playlist_create’.

Для добавления дорожек в список воспроизведения нам нужно добавить уникальный URI, прикрепленный к каждой дорожке в ответе json от API, к идентификатору списка воспроизведения нового списка воспроизведения.

Пример вывода из готового скрипта

python .\playlist_recommendations.py --artist "Killers" --track "When The Dreams Run Dry"
Playlist: 
1) "Arabella" by Arctic Monkeys 
2) "Spaceman" by The Killers 
3) "Black Madonna" by Cage The Elephant 
4) "Everybody's Changing" by Keane
5) "Blinding Lights" by The Naked And Famous 
6) "To Death's Heart (In Three Parts)" by Bright Eyes 
7) "Simmer" by Hayley Williams 
8) "Here With Me" by The Killers 
9) "Knee Socks" by Arctic Monkeys 
10) "1901" by Phoenix 
11) "Don’t Worry" by The 1975 
12) "Agoraphobia - Acoustic" by Incubus 
13) "Maybe Tomorrow" by Stereophonics 
14) "Run For Cover" by The Killers 
15) "Imagination" by Foster The People 
16) "Mariana Trench" by Bright Eyes 
17) "Violent Sun" by Everything Everything 
18) "The Birthday Party" by The 1975 
19) "Little Secrets" by Passion Pit 
20) "Exitlude" by The Killers 
21) "Golden Touch - Full Length" by Razorlight 
22) "The Colour Of Love" by The Smashing Pumpkins
23) "Cathedrals Of The Mind" by Doves 
24) "Chelsea Dagger" by The Fratellis 
25) "Shot At The Night" by The Killers

Выше приведен краткий пример того, как будет выглядеть печатный вывод приложения. Сейчас я не претендую на звание музыкального всезнайки (во всяком случае, не всегда!), но я думаю, что сгенерированный плейлист довольно близок и соответствует нашему введенному исполнителю и треку!

И вот оно, приложение CLI генератора плейлистов Spotify, использующее Python и библиотеку Spotipy!

Вы можете найти полный репозиторий кода здесь

https://github.com/ejones18/spotify_playlist_gen

Репозиторий содержит требования к приложению в полном объеме, а также все фрагменты кода в одном скрипте. Как объяснялось в начале, это приложение может быть построено разными способами, поэтому, надеюсь, это даст вам твердое начало / понимание, чтобы углубиться в свои собственные проекты!

~ Итан

Дополнительные материалы на PlainEnglish.io. Подпишитесь на нашу бесплатную еженедельную рассылку новостей. Подпишитесь на нас в Twitter, LinkedIn, YouTube и Discord.