└─ cd ../projects

// case study · personal project · [●] live

Scrobble Vault

20 лет музыкальной истории Last.fm с двух аккаунтов, объединённых в одну базу — скроблы с 2005 года превращены в исследуемый дашборд: вкус, привычки, эволюция жанров и созвездия артистов.

pythonaiohttppostgresqltimescaledbexpressprismavue3pinia
270 403скробла
12 973артиста
72 404трека
21 777альбома
2005–2520 лет
3аккаунта слиты
└─01

ИДЕЯ

Last.fm копит скроблы годами, но история разбросана по аккаунтам, а встроенная аналитика — поверхностная. У меня их три: santych, crust_botan и santozzzzzz — суммарно с 2005 года.

Идея — слить все три в одну базу и построить дашборд для настоящих раскопок: 20 лет вкуса одним полотном. Не просто «топ-100 артистов», а эволюция жанров, сезонность, лояльность, одержимости и даже «созвездия» — граф артистов, связанных общими тегами.

└─02

ВХОДНЫЕ ДАННЫЕ

// last.fm api → база → дашборд
Last.fm API 3 аккаунта santych · crust_botan
santozzzzzz
scrape
scraper Python · aiohttp rate-limit + пагинация
→ JSON
store
database PostgreSQL + TimescaleDB time-series над 270k скроблов
Prisma REST
app Express → Vue 3 Pinia · SPA · 20+ вью
└─03

ЧТО ВНУТРИ

// 20+ вью
dashboard

Сводка: тоталы, первый/последний скробл, топ артистов, треков и альбомов

evolution

Стримграф эволюции жанров за 20 лет — как менялся вкус год к году

constellations

Граф «созвездий» — артисты, связанные общими тегами/жанрами

journey

Музыкальное путешествие — нарратив по эпохам прослушивания

obsessions

Одержимости — артисты и треки, захватившие конкретный период

loyalty

Лояльность — кого слушаю стабильно годами, а кто пропал

seasonal

Сезонность — что играет зимой vs летом, паттерны по месяцам

years

Year in review — разбор каждого года отдельной страницей

drill-down

Страницы артиста, альбома, трека, жанра и конкретного дня

└─04

СКРИНШОТЫ

// клик = полный размер · music.devisfun.ru
music.devisfun.ru⤢ развернуть
Дашборд Дашборд — 270 403 скробла, первый/последний, топы

└─ drill-down страницы // артист / альбом / день

└─05

СТЕК & АРХИТЕКТУРА

Монорепо из четырёх частей: скрапер на Python тянет историю из Last.fm API, PostgreSQL + TimescaleDB хранит её как time-series, Express + Prisma отдаёт REST с фильтрами и пагинацией, а Vue 3 + Pinia рисует 20+ аналитических вью. Оркестрация — PM2 и Docker.

├─ ingestion
Python aiohttp Last.fm API
├─ data
PostgreSQL TimescaleDB Prisma
├─ backend
Express TypeScript
└─ frontend & ops
Vue 3 Pinia Vite PM2 Docker

20 лет вкуса — пощупай вживую:

$ open music.devisfun.ru └─ вернуться ко всем проектам