Представляем Sad Boi Detector

Я не думаю, что грусть или депрессия - это шутка. С другой стороны, Sad Boi Detector - это точно. Приложение, созданное для Illenium, позволяет пользователям делиться временными рамками своей истории прослушивания Spotify (или плейлистом) и получать взамен оценку грусти. Это было добросовестно разработано для базы поклонников, которые не стесняются выражать свои чувства.

Но что такое Грустный Бой, скажете вы?

В Urban Dictionary есть множество определений этого термина, но я выберу Молодой мужчина, который большую часть времени проводит в чувствах. Он чувствует себя волной эмоций, которая бьет вас, как грузовик, и заставляет задуматься, черт возьми, почему. Можно было бы предположить, что человек в чувствах может потреблять музыку с таким же темпераментом, но как это проверить?

Конечно, Spotify.

Каждый трек, распространяемый в Spotify, анализируется на предмет наличия набора интересных характеристик, таких как его танцевальность (способность танцевать под него) или речевость (включение произнесенного слова). Одна из этих характеристик - валентность, которую психология определяет как хорошее качество. (положительная валентность) или плохая (отрицательная валентность) события, объекта или ситуации. Документы Spotify Платформа предлагают аналогичное определение.

A measure from 0.0 to 1.0 describing the musical positiveness conveyed by a track. Tracks with high valence sound more positive (e.g. happy, cheerful, euphoric), while tracks with low valence sound more negative (e.g. sad, depressed, angry).

Зная, что у нас есть эта переменная, довольно просто измерить среднее значение валентности на основе коллекции треков Spotify. К сожалению, платформа Spotify не предлагает (публично) поток всех треков, которые когда-либо просматривал пользователь, но они предоставляют 50 лучших треков, которые пользователь проиграл за три периода времени.

  • Долгосрочные: рассчитывается на основе данных за несколько лет и включает все новые данные по мере их поступления.
  • Среднесрочный: примерно за последние 6 месяцев.
  • Краткосрочный: примерно за последние 4 недели.

Мы оставим выбор термина на усмотрение пользователя, чтобы он мог увидеть, как его настроение могло измениться с течением времени.

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



Имея под рукой токен Spotify, мне нравится создавать axios экземпляр Spotify API для легкого доступа к платформе.

const spotify = axios.create({
  baseURL: 'https://api.spotify.com/v1/',
  headers: {
    'Content-Type': 'application/json',
    'Authorization': `Bearer ${token}`
  }
}

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

let term = 'medium-term'
spotify.get(`me/top/tracks?limit=50&time_range=${term}`)
.then(response => {
  let ids = response.data.items.map(item => item.id).join(",")
})

Теперь мы можем использовать наш параметр ids для одновременного получения звуковых функций всех наших треков, вызвав соответствующий метод. Как только мы их получим, мы рассчитаем среднее значение только функции валентности. Похоже, я снова обманул Math и использовал метод meanBy lodash. 😅

spotify.get(`audio-features/?ids=${ids}`)
.then(response => {
  let features = response.data.audio_features  
  let mean     = _.meanBy(features, f => 1 - feature.valence)
  let score    = Math.round(mean * 100)
})

Спасибо Astralwerks за то, что познакомили меня с этой забавной концепцией. Идите вперед и найдите свой собственный счет, посетив приложение. Я бы также посоветовал проверить эту ветку, чтобы посмотреть, как фанаты Illenium реагируют на свои собственные оценки. Кстати, я получил 55% за все время. У Принца много гимнов Sad Boi!