paths / javascript-music-service
учебный путь · javascript

Музыкальный сервис «Волна»

  • JavaScript
  • Начинающий
  • 5 модулей
  • 25 задач
  • Бесплатно

Соберите клиентскую логику стриминга: каталог треков, плейлисты без дублей, очередь воспроизведения с иммутабельными шагами, статистику прослушиваний и детерминированный «Микс дня». Каждая задача — рабочий модуль сервиса.

AI-ассистент ведёт подсказками, но решение не выдаёт
intro

Что тебя ждёт в этом пути

// Что ты построишь

Музыкальный сервис «Волна» на чистом JavaScript — каталог треков, конструктор плейлистов, очередь воспроизведения, статистика прослушиваний и генератор «Микса дня». Каждый модуль — реальная фича стримингового сервиса: от кнопки «добавить в плейлист» без дублей до детерминированного тасования и отчёта об итогах месяца.

// Для кого

Ты знаешь основы JavaScript — переменные, функции, массивы — и готов впервые написать что-то большее, чем учебный скрипт. Опыт с DOM или браузером не нужен: весь путь — чистые функции и структуры данных.

// Чему научишься
  • Работа с массивами: map, filter, reduce и иммутабельные операции
  • Управление очередью воспроизведения: позиция, перемотка, вставка
  • Агрегация статистики: счётчики, процентные метрики, поиск лидера
  • Детерминированное тасование без Math.random
  • Сборка конвейера из независимых функций-модулей
  • Числовые ключи объектов и неочевидное поведение при автоприведении типов
curriculum

Задачи пути — 5 модулей, 25 задач

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

25 задач · 5 модулей
1.1
Подпись трека
Соберите единую подпись трека «Исполнитель — Название» — первый модуль музыкального сервиса «Волна»
1.2
Трек по id
Найдите трек в каталоге по идентификатору — базовый поиск, на который обопрётся вся «Волна»
1.3
Треки исполнителя
Посчитайте треки исполнителя в каталоге — счётчик со строгим сравнением для страницы артиста
1.4
Полка жанра
Соберите названия треков жанра в новый массив — жанровая полка каталога не трогает оригинал
1.5
Карточка трека
Соберите карточку «Транзит — Кофеин (3:08)» из двух готовых модулей каталога и форматирования длительности
2.1
Длительность плейлиста
Сложите секунды треков плейлиста, молча пропуская id, которых в каталоге уже нет
2.2
Уже в плейлисте?
Проверьте вхождение трека в плейлист и верните честный boolean — на нём держится кнопка «добавить»
2.3
Добавить без дублей
Добавьте трек в плейлист, только если его там нет, — и всегда верните новую копию массива
2.4
Слить два плейлиста
Объедините два плейлиста: first целиком, новинки из second — и ни одного нового дубля
2.5
Сводка плейлиста
Соберите шапку плейлиста из готовых модулей: имя, счётчик треков, общая длительность и самый долгий трек
3.1
Что играет
Мини-плеер спрашивает у очереди id текущего трека — число или null, когда играть нечего
3.2
Кнопки перемотки
«Вперёд» и «назад» в плеере: новая позиция очереди с зажимом в границы — за края не выпадаем
3.3
Играть следующим
Пункт меню «Играть следующим»: вставка id сразу после текущей позиции — дубли в очереди легальны
3.4
Дальше в очереди
Экран очереди берёт копию хвоста: текущий трек и все будущие, прошлое не показываем
3.5
Шаг плеера
Иммутабельный шаг на следующий трек: новая очередь с копией массива — спред { ...queue } здесь тихо ломает всё
4.1
Сколько раз слушали
Сосчитайте запуски трека в журнале прослушиваний — дослушан он или нет, запуск уже состоялся
4.2
Счётчики прослушиваний
Сверните журнал событий в объект-счётчик и узнайте, почему число 102 становится ключом "102"
4.3
Дослушиваемость
Посчитайте целый процент дослушанных треков — и спасите отчёт пустого журнала от «NaN%» ранним return
4.4
Хит слушателя
Найдите по готовым счётчикам самый игранный трек — и верните его id числом, а не строковым ключом
4.5
Экран «Итоги»
Соберите отчёт слушателя из четырёх готовых модулей: запуски, дослушиваемость и хит, переживший чистку каталога
5.1
Свежие треки
Отберите для «Микса дня» треки, которых нет в истории прослушиваний, — порядком каталога и новым массивом
5.2
Тасование разрезом
Перемешайте микс без Math.random: чётные индексы, затем нечётные — порядок воспроизводится при каждом построении
5.3
Лимит микса
Обрежьте перетасованный список до maxCount треков; полная копия — всё равно новый массив, а не сам вход
5.4
Подписи микса
Соедините готовые поиск и подпись: id микса превращаются в строки «Исполнитель — Название», битые id молча выпадают
5.5
Микс дня капстоун
Капстоун «Волны»: соберите конвейер из семи готовых модулей — свежее, тасование разрезом, лимит и подписи в одном объекте микса
koddo start javascript-music-service

Готов начать этот путь?

Зарегистрируйся — откроем путь прямо на первой задаче. Без установки и настройки, всё в браузере.