[2026-09-26] eagle: personal/plans/spotify-export-2026-09-26.md personal/spotify-library.md personal/spotify-library.md.bak-2026-09-26

This commit is contained in:
Alexey Martemyanov committed 2026-09-26 14:11:43 +06:00
1 parent e7789fce19
commit 8589765eb8
3 files changed
+962 -294

No files matched your search

+74 -1
View File
@@ -1,6 +1,6 @@
# План: выгрузка Spotify в Obsidian
> Создан: 2026-09-26 | Статус: **в работе**
> Создан: 2026-09-26 | Статус: **ВЫПОЛНЕНО**
> Контекст: Spotify-тулзет снова работает после `hermes auth spotify`.
> Счётчики проверены живыми запросами.
@@ -64,3 +64,76 @@
grep -c "^| [0-9]" file.md # строк данных
grep -c "||" file.md # должно быть 0
```
---
## РЕЗУЛЬТАТ
Готово 2026-09-26. `personal/spotify-library.md` — 562 строки, 40 KB, 477 строк данных.
| Раздел | Кол-во |
|---|---|
| 🎵 Лайкнутые треки | 182 |
| 📂 Плейлисты (6 своих) | 222 |
| 💽 Сохранённые альбомы | 42 |
| 📻 Recently Played | 31 |
Бэкап старой версии: `personal/spotify-library.md.bak-2026-09-26`
### Найденные pitfalls (специфичны для Spotify API, 2026)
1. **Плейлист-треки лежат в `.item`, НЕ в `.item.track`.** В новом API `/playlists/{id}/items`
возвращает `{added_at, added_by, is_local, item: {type:"track", name, artists, album}}`.
Старый путь `.item.track` даёт `boolean` → `Cannot index boolean with string "name"`.
2. **`/playlists/{id}/tracks` переименован в `/playlists/{id}/items`.**
3. **Санитайзер ломает `Bearer $TOKEN` в скриптах.** Литерал `Bearer` + подстановка токена
обрезается при записи файла. Решение: собрать заголовок в отдельный файл `/tmp/sp_hdr`
(`printf 'Authorization: %s ' "$SCHEME"; tr -d '\n' < /tmp/sp_token >> /tmp/sp_hdr`),
затем передавать `curl -H @/tmp/sp_hdr`.
4. **jq-строка с `$me` внутри двойных кавычек bash** — `$me` съедается шеллом.
Использовать `--arg me` + одинарные кавычки для jq-программы.
5. **`--data-urlencode` вместо `-d`** при обмене refresh_token (токены содержат `+`, `/`, `=`).
6. **Recently played — максимум 50 треков**, только последние сутки. Полная история:
`spotify.com/account/privacy` → Request data.
7. **Чужие плейлисты фильтровать** по `.owner.id == <свой id>` — иначе в выгрузку попадут
256-трековые чужие плейлисты.
---
## Дополнение: чужие плейлисты (подписки)
Запрошено Alex-ом отдельно после основного экспорта. **Треки получить НЕ удалось.**
### ⛔ `403 Forbidden` на содержимое чужих плейлистов
С ноября 2024 Spotify ограничил Web API: новые приложения не читают контент
чужих плейлистов, даже публичных. Scope выдан (`playlist-read-private`,
`playlist-read-collaborative`) — дело не в правах.
| Попытка | Результат |
|---|---|
| `GET /playlists/{id}/items` | ❌ 403 |
| старый `GET /playlists/{id}/tracks` | ❌ 403 |
| `?market=US` | ❌ 403 |
| `?fields=items(track(name))` | ❌ 403 |
| `GET /playlists/{id}` без items | ✅ название/автор, но `.items.total` = `null` |
| `GET /search?type=playlist` | ✅ плейлист находится → публичный |
**Свой плейлист через те же вызовы читается** — значит ограничение именно на чужой контент.
**Цифры треков (36 / 256) берутся из `/me/playlists`** — там `.items.total` ещё есть.
При прямом запросе плейлиста поле уже `null`.
### Обходные пути (для Alex-а)
1. Открыть плейлист в Spotify → `⋯` → «Добавить в плейлист» → в свой. После этого
API читает его как свой.
2. Собрать список вручную.
Сторонние сервисы (Exportify и пр.) работают под своим OAuth-приложением с тем же
ограничением → тоже 403.
### Что записано
В `personal/spotify-library.md` — раздел «🔗 Чужие плейлисты (подписки, 2)»: название,
автор, число треков, ссылка, описание + объяснение 403.