** Кейс ШІзації №5.   **Зробив собі AI-бота, який перетворює лайк у Spotify на повноцінну картку треку та додає його до плейлістів за стилями та лейблами**

** Як це виглядає**

Тисну лайк у Spotify — і в Telegram прилітає інформація:

 стиль (Beatport + Discogs, окремо);
 лейбл і рік;
 BPM і тональність;
 звідки артист (із прапорцем);
 хто заснував лейбл, коли, в якому місті.

Окремим блоком — у які плейлісти трек уже розкладено. 

Кожен плейліст — це назва стилю. Окремо — плейлісти по лейблах, оскільки я паралельно їх вивчаю. Це головна перевага: бот не просто пише — він одразу **сортує**.

Якщо потрібного плейліста немає, бот його створює. Якщо є — додає й пише, скільки в ньому треків.

Бібліотека розкладається сама, поки я просто слухаю музику, і дає мені контент по лейблах, який я вивчаю та паралельно прокачую себе.


** Що потрібно**

1. **Бот у Telegram** — токен у [@BotFather](https://t.me/BotFather) за хвилину.

2. **Cloudflare Workers** — там крутиться вся логіка, cron смикає Spotify що 2 хвилини. Потрібен платний план &#036;5/міс: на безкоштовному встановлено ліміт — 10 мс процесорного часу, а один пост — це ~50 секунд зовнішніх запитів.

3. **Spotify Web API** — безплатно. Потрібен свій додаток і refresh-токен зі скоупами на читання лайків і запис у плейлісти. Платного тарифу не існує взагалі, а розширена квота вимагає зареєстрованого бізнесу і 250 000 користувачів — особистому боту це не потрібно.

4. **Discogs API** — безплатно, але обов'язково з персональним токеном. Без нього ліміт рахується за IP, а в Cloudflare вони спільні, і ти ловиш 429 одразу.

5. **Beatport** — публічного API немає з 2016 року. Дані дістаються з `__NEXT_DATA__` на сторінці пошуку. Важливо: з локальної машини Beatport повертає 403, а з воркера відповідає нормально.

6. **Claude API** — описи артиста й лейбла пише модель, живою мовою, а не копіпастом з Discogs. Копійки за пост.


**Чим корисний бот**

1. **Навчає через лейбли.** Замість «о, файний трек» ти поступово бачиш систему: хто це видає, звідки вони, що ще в них є. Через місяць починаєш упізнавати саунд лейбла з першого такту.

2. **Готовий пост для каналу.** Картка одразу оформлена — можна переслати без правок.

3. **Плейлісти наповнюють самі себе.** Жодного ручного розкладання за теками.

4. **Перевірка на росію.** Бот дивиться профіль артиста і зазначає, якщо це рф. Мені це важливо.

5. **Архів рішень.** Через півроку видно, які лейбли реально тримають планку, а які були разовим збігом.

 **Промт для збірки:**
Зроби Telegram-бота на Cloudflare Worker, який реагує на нові лайки у Spotify.

ЛОГІКА
1. Cron кожні 2 хвилини читає GET /me/tracks?limit=10 (лайки, найновіші зверху).
2. Стан зберігай як ПОЗНАЧКУ ЧАСУ останнього обробленого added_at + список id за цю ж мітку. Не тримай масив усіх бачених треків — він росте нескінченно.
3. Обробляй РІВНО ОДИН новий трек за прохід.
4. Для треку збери: стиль, лейбл, рік, BPM, тональність, країну артиста.
   - Стиль і BPM — з Beatport: витягни __NEXT_DATA__ зі сторінки /search/tracks?q=<артист+трек>, знайди об'єкт із track_name і bpm.
   - Якщо на Beatport немає — Discogs search API (потрібен персональний токен).
   - Якщо немає ніде — пиши «не знайдено». НЕ ВГАДУЙ.
5. Описи артиста і лейбла згенеруй LLM-ом, живою мовою, 1-2 абзаци: хто заснував, коли, місто, чим відомий.
6. Додай трек у плейліст за кожним стилем і в плейліст за назвою лейбла. Немає — створи, є — додай.
7. Запость картку в Telegram (parse_mode HTML), плейлісти — окремим блоком з клікабельними назвами.

ГРАБЛІ, НА ЯКИХ Я ВЖЕ НАСТУПИВ

 Spotify змінив API в лютому 2026. Старі ендпойнти віддають 403 усім:
   POST /users/{id}/playlists  →  POST /me/playlists
   /playlists/{id}/tracks      →  /playlists/{id}/items
   поле tracks у відповідях    →  items
   Ще: limit=12 валить 400 «Invalid limit», валідні 10/20/50.

 У scheduled() роби await, а НЕ ctx.waitUntil(). З waitUntil планувальник вважає крон
   завершеним одразу і вбиває роботу на півдорозі: трек додається в плейлісти,
   але мітка не ставиться — і наступний крон бере той самий трек по колу.

 Постав замок у KV з TTL ~180 с. Робота триває довше за інтервал крона,
   без замка два запуски хапають один трек і дублюють пост.

 Кеш списку плейлістів НЕ МОЖНА зберігати недочитаним. Якщо пагінація обірвалась
   на 429 — не пиши результат у сховище. Інакше бот перестане бачити наявні плейлісти
   і почне плодити дублі з тими самими назвами.

 На 429 від Spotify не роби нескінченних ретраїв. Retry-After може бути в ГОДИНАХ.
   Чекай тільки якщо там кілька секунд, інакше виходь і чекай наступного крона.

 Не роби масових догонів по історії лайків. Саме це вибиває денну квоту
   і дає бан на багато годин.

 Перевірку на країну роби через LLM, а не регуляркою по тексту профілю.
   Регулярка ловить фрази типу «Russian hardbass scene» і хибно позначає
   українських артистів.

До речі, найкращі треки я додаю потім у канал «[Айc слухає](https://t.me/ice_listens)», підписуйтесь.

Більше — в інших дописах рубрики:

[Кейс ШІзації №1.](https://t.me/artemborodatiuk/1735)Зібрав собі редакцію: 25 корисних подкастів, 13 світових медіа.
[🤖 Кейс ШІзації №2.](https://t.me/artemborodatiuk/1736)Створюємо власноруч AI-бот, який робить зустріч із переписки. 
[Кейс ШІзації №3](https://t.me/artemborodatiuk/1750)**. **Створив персонального AI-коуча: він контролює мене, щоб я виконував власні цілі.
** [Кейс ШІзації №4](https://t.me/artemborodatiuk/1776). Бот, що робить із войса гарно оформлені пости, які приємно читати.

III > I

**ask digital me: **[artemborodatiukbot](https://link.fractal.partners/ICL3WV)
**watch**: [YouTube](https://link.fractal.partners/ORVv7S)** **
**services and products of FRACTAL**: [BDO](https://fractal.partners/#contact)
**join:** [managers community](https://link.fractal.partners/cb2Hjo)
**work with me:** [Вакансії](https://link.fractal.partners/JzuSF2) 
**my experience in algorithms**: «[Книга Для менеджерів](https://link.fractal.partners/tqprAr)»
**follow**: [TikTok](https://link.fractal.partners/GxF8Yz)** •** [Instagram](https://link.fractal.partners/dzWiWG)** • **[Threads](https://link.fractal.partners/81nqo0)