/

noizr.com

Український музичний журнал, лейбл і крамниця платівок — на новому стеку, де крамниця, каталог і бекофіс власні.

В роботі musiclabelrecord-storepayloaddrizzlepostgrese-commerceai

Noizr: логотип — Dmythro, ілюстрація — Yura X-Ninja
Noizr: логотип — Dmythro, ілюстрація — Yura X-Ninja

Noizr — це музичний журнал і звукозаписний лейбл, який ми з невеликою командою тримали роками з любові до музики, що заслуговувала на більше уваги, ніж їй діставалося. Уже якийсь час усе це на паузі — і журнал, і лейбл, і решта.

За ним — PHP-CMS, яку я написав 2011-го, коли вів Annexare. Вона працює, і SEO в неї краще, ніж я очікував би. Просто я більше не хочу її супроводжувати — а коли більше нікому, цієї причини цілком достатньо. І це чи не головна причина, чому перезапуск ніколи не був простою справою.

Тож v2 — це не переїзд. Новий стек і ширший обсяг, ніж був колись: журнал і лейбл повертаються разом, а за ними — крамниця платівок.

Що буде

Спершу фізична крамниця — куди можна зайти, з наповненням і обліком на софті, який ми тримаємо самі. Поруч перезапускається лейбл, нове оформлення в роботі, і разом із ними повертається журнал. Логотип угорі — мій: намальований у векторі багато років тому й досі робить свою справу. Повноцінний онлайн-магазин — наступним кроком, коли крамниця стане на ноги: той самий каталог, той самий облік, одна система під обома.

Двомовність — наскрізна, як і була завжди.

Чому робимо своє, а не беремо готове

Готова платформа запрацювала б ще кілька місяців тому. Але тоді довелося б описувати каталог лейбла словником, придуманим для товарів із розмірами й кольорами, — і платити за кожну транзакцію.

Реліз — це не товар. У нього є видання й пресинги, каталожні номери, склад учасників, артисти, які виходять і на інших лейблах, та архів, що пише про все це з 2011-го. Крамниця — це один із поглядів на цей каталог, а не окрема база, яка принагідно щось продає. Працює це лише тоді, коли каталог, крамниця й бекофіс говорять однією мовою — і саме це дає власний софт.

Архітектура

Payload CMS на PostgreSQL тримає каталог і редакційну частину, а панель для команди генерується з тієї самої схеми, яку читає публічний сайт. Читає він її через типізований шар Drizzle, а не через API самої CMS: один запит на все дерево сутностей, повністю типізований, — а саме це й потрібно сторінці релізу, яка одночасно тягне артистів, видання, склад учасників і пов’язані матеріали.

Фонова робота живе в черзі завдань в окремому воркері, осторонь від обробки запитів: ніщо з того, що робить відвідувач, не чекає на зовнішній сервіс.

Усе, що потрібно крамниці, — наше: облік і оприбуткування, кошики, оформлення, замовлення, ролі покупців і команди та бекофіс навколо цього. Назовні винесені лише ті дві речі, які нашими бути не можуть: POS-термінал для оплат карткою на касі та сервіс фіскальних чеків для чеків, яких вимагає держава.

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

Інтеграції — і ліміти, які з ними приходять

Каталог крамниці платівок — це здебільшого чужі дані. Discogs знає пресинги й видання, MusicBrainz тримає канонічну ідентичність артистів і релізів, Apple Music і подібні дають посилання на прослуховування. Збагачення звертається до них постійно: на кожну позицію, що надходить, і на кожен прогін архіву.

У кожного з тих API є ліміт, і саме ліміти — справжнє обмеження. Якщо робити все синхронно, лишається або повзти, або нарватися на обмеження в найгірший момент — коли людина стоїть біля каси й чекає, щоб поставити платівку на полицю.

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

Де AI справді допомагає

Перебудова архіву. Стара CMS зберігала статті як HTML: вставки вклеєні просто в текст, зв’язки — натяком у самому тексті. Новій потрібна реляційна структура: релізи, пов’язані з артистами, склад учасників окремими записами, вставки структурованими блоками замість розмітки. AI взяв на себе те, що було надто різнорідним для скрипта й надто великим, щоб робити руками: читав наявне, пропонував структуру, яка в ньому ховалася, і перетворював плаский архів на щось ближче до графа.

Він також знайшов те, чого скрипт міграції не побачить. Переклади, які тихо розійшлися між мовами. Вставки на сервіси, яких уже немає або які давно змінили формат посилань. Склад учасників, записаний трьома різними способами за стільки ж років. Кожен випадок — окреме рішення, а їх було надто багато, щоб ухвалювати по одному.

Щоденний облік. Зрозуміти, що це за позиція, з фотографії й уривка тексту, зіставити її з каталогом і заповнити поля, які інакше довелося б набирати руками.

Правило скрізь одне: AI пропонує, людина приймає. Перший начерк структури він дає чудово — але останнє слово щодо каталожного номера точно не за ним.

Статус

У роботі, і це поки що найближче до анонсу. Нинішній noizr.com досі крутиться на тій старій CMS; v2 замінює його цілком, а не частинами, — тому так довго й не було чого показати. Сама CMS при цьому не йде на спокій: вона й далі обслуговує інші сайти, задля яких писалася. Це Noizr іде з неї, а не її кінець.

Спершу відкриється крамниця, далі онлайн-магазин, айдентика робиться зараз. Я доповнюватиму цю сторінку в міру того, як це ставатиме на місце: те, що тут зараз, — ще не остаточний вигляд, хоча має ним стати вже скоро.

Деталі

Автор
Dmytro Klymenko
Зроблено на
Payload CMS — каталог і бекофіс, Next.js — публічний сайт, Drizzle ORM — типізований шар даних, PostgreSQL — база даних, countries-list — дані країн і валют
Початок
Оновлено

Інші проєкти