Задача:
Разработать кроссплатформенное десктопное приложение для прослушивания Lo-Fi радио с уникальным визуальным стилем
в ретро-эстетике. Клиент хотел создать атмосферный плеер, который передаёт тёплое винтажное настроение и при этом
остаётся функциональным инструментом для фоновой работы или отдыха.
Цель:
Спроектировать и реализовать полноценное GUI-приложение с нуля, включая:
- Стильный интерфейс в warm retro design (кремовый фон, оранжевые акценты, скруглённые формы)
- Анимацию вращающейся виниловой пластинки с индикатором воспроизведения
- 15-полосный визуализатор в реальном времени
- Поддержку 7 потоковых радиостанций (SomaFM: Drone Zone, Groove Salad, Space Station и др.)
- Режим мини-плеера с возможностью сворачивания
- Таймер сна для автоматического отключения
- Плавные переходы между станциями без прерывания воспроизведения
- Регулировку громкости с визуальной индикацией
- Возможность сборки в standalone EXE-файл для распространения без установки Python
Технический стек:
Python 3.12, PyQt6 (QtMultimedia для аудио, QPainter для кастомной графики), PyInstaller для сборки
1. Проектирование дизайн-системы
- Определил цветовую палитру: кремовый фон (#FFF9F0), оранжевый акцент (#FFC085), тёмно-серый для текста
(#2D3748)
- Разработал единый стиль компонентов: скруглённые углы (12–25px), мягкие тени через QGraphicsDropShadowEffect,
контрастные рамки
- Создал класс IconGenerator для программной отрисовки иконок через QPainter (play, pause, volume, heart, sleep)
2. Реализация кастомных виджетов
- VinylRecord: виджет пластинки с mask для идеального круга, QPropertyAnimation для вращения (360° за 6 сек),
градиентная заливка с бороздками, белый индикатор на краю
- VisualizerWidget: 15 вертикальных баров, анимированных через QTimer (50ms), случайная высота для имитации
аудио-спектра
- SleepTimerDialog: модальное окно с ползунком (0–120 мин), live-отображение выбранного времени
3. Аудио-движок на QtMultimedia
- QMediaPlayer + QAudioOutput для потокового воспроизведения
- 7 станций SomaFM в списке STREAMS с прямыми MP3-потоками
- Обработка состояний: playbackStateChanged для синхронизации UI, errorOccurred для отлова ошибок сети
- Плавное переключение станций с сохранением состояния play/pause
4. Оконный менеджер
- Frameless window (Qt.WindowType.FramelessWindowHint) + WA_TranslucentBackground
- Кастомный paintEvent для отрисовки rounded rectangle background
- Перетаскивание окна через mousePressEvent/mouseMoveEvent
- Режим мини-плеера (400×110px) с кнопкой Expand для возврата к полному виду
5. Анимации и полировка
- Fade-in при запуске (QPropertyAnimation на windowOpacity, 400ms)
- Плавные hover-эффекты на кнопках через stylesheet
- Авто-пауза визуализатора и пластинки при остановке воспроизведения
6. Сборка в EXE
- PyInstaller с флагами --onefile --windowed --name "Lo-Fi Radio"
- Включение шрифта Nunito.ttf и папки assets через .spec-файл
- Финальный размер ~15 МБ, время запуска <2 сек
7. Тестирование
- Проверка потоков на стабильность (все 7 станций SomaFM работают)
- Тест на Windows 10/11 без установленного Python
- Валидация таймера сна и корректного закрытия потоков
Разработано полностью функциональное десктопное приложение Lo-Fi Radio Player с уникальным визуальным стилем.
Итоговые характеристики:
- 7 рабочих радиостанций (SomaFM) с мгновенным переключением
- Анимированная виниловая пластинка (вращается при воспроизведении, замирает на паузе)
- 15-полосный визуализатор в реальном времени
- Таймер сна (0–120 минут) с плавным отсчётом
- Два режима: полный (400×800px) и мини-плеер (400×110px)
- Регулировка громкости с процентным индикатором
- Автономный EXE-файл (~15 МБ), не требующий установки Python
Практическое применение:
1. Фоновая музыка для работы — приложение создано для длительных сессий кодирования, дизайна, учёбы. Lo-Fi жанр не
отвлекает, а таймер сна позволяет автоматически отключать поток после завершения работы.
2. Портфолио для фриланса — проект демонстрирует заказчику комплексные навыки:
- Работа с PyQt6 (кастомные виджеты, анимации, мультимедиа)
- Графика на QPainter (отрисовка иконок, масок, градиентов)
- Сборка кроссплатформенных EXE через PyInstaller
- UI/UX дизайн (тёплая палитра, микро-взаимодействия, hover-эффекты)
3. База для масштабирования — архитектура позволяет легко добавить:
- Сохранение избранных станций
- Поддержку локальных файлов
- Интеграцию с другими потоковыми сервисами
- Темы оформления (тёмная/светлая)
4. Готовое решение для распространения — приложение упаковано в один файл, запускается на любой Windows 10/11 без
зависимостей. Может использоваться как личный продукт или white-label решение для музыкальных сервисов.
Технический результат:
Код полностью документирован, разделён на логические модули (дизайн-система, виджеты, диалоги, аудио-движок).
Сборка автоматизирована через build.ps1. Проект готов к публикации на GitHub как open-source или к коммерческому
использованию.