ОбзорOverview
Latency — десктопный медиаплеер на Electron + React + TypeScript с архитектурой подключаемых источников (PlaybackProvider). Локальные файлы и SoundCloud работают через единое ядро: очередь, плеер-бар, лайки и плейлисты не зависят от источника.Latency is a desktop media player built on Electron + React + TypeScript with a pluggable-source architecture (PlaybackProvider). Local files and SoundCloud run through one engine: queue, player bar, likes and playlists are source-agnostic.
УстановкаInstallation
Все сборки лежат на вкладке Releases. Выберите файл под свою платформу.All builds are on the Releases page. Pick the file for your platform.
Windows
- Скачайте
Latency-0.2.0-x64.exe(установщик NSIS) илиLatency-0.2.0-portable.exe(без установки).DownloadLatency-0.2.0-x64.exe(NSIS installer) orLatency-0.2.0-portable.exe(no install). - Запустите установщик и выберите папку (можно изменить путь установки), либо просто запустите портативный
.exe.Run the installer and choose a folder (the install path is changeable), or just run the portable.exe. - Если SmartScreen ругается на неизвестного издателя — «Подробнее» → «Выполнить в любом случае» (сборка без платной подписи кода).If SmartScreen warns about an unknown publisher — “More info” → “Run anyway” (the build isn't paid-code-signed).
Android
- Скачайте
Latency.apkна телефон.DownloadLatency.apkto your phone. - Откройте файл — система попросит разрешить «Установка из неизвестных источников» для браузера/проводника. Включите.Open the file — the system will ask to allow “Install from unknown sources” for your browser/file manager. Enable it.
- Подтвердите установку. Это debug-APK — обновления раз в 7 дней не требуются.Confirm the install. It's a debug APK — no 7-day re-signing needed.
iOS
iOS-сборка — неподписанный Latency-unsigned.ipa. Подпишите своим Apple ID через сайдлоадер:The iOS build is an unsigned Latency-unsigned.ipa. Sign it with your Apple ID via a sideloader:
- Установите AltStore или Sideloadly на компьютер.Install AltStore or Sideloadly on your computer.
- Подключите iPhone, перетащите
.ipaи подпишите своим Apple ID.Connect your iPhone, drop the.ipain and sign with your Apple ID. - На бесплатном аккаунте подпись действует 7 дней — потом перевыпуск.On a free account the signature lasts 7 days — re-sign after that.
Локальные файлыLocal files
Добавьте папки с музыкой — Latency просканирует их, прочитает теги и обложки (music-metadata) и закэширует обложки в userData. Файлы отдаются через собственный протокол media://. Без ограничений по форматам и количеству.Add your music folders — Latency scans them, reads tags and cover art (music-metadata) and caches covers in userData. Files are served through a custom media:// protocol. No format or count limits.
SoundCloud
Поиск треков и артистов работает без входа: client_id подбирается автоматически (скрейпится на лету, авто-рефреш при 401). Стрим — progressive (MP3) и HLS (через hls.js).Track & artist search works without logging in: client_id is fetched automatically (scraped on the fly, auto-refreshed on 401). Streaming is progressive (MP3) and HLS (via hls.js).
Вход в аккаунт (опционально)Logging in (optional)
Вход открывает персональные миксы и лайки. Подключение — в Profile или Settings → SoundCloud: после логина OAuth-токен перехватывается из вашей же сессии и хранится локально в %APPDATA%/latency-player/soundcloud.json. В репозиторий он не попадает.Logging in unlocks personal mixes and likes. Connect in Profile or Settings → SoundCloud: after login the OAuth token is captured from your own session and stored locally in %APPDATA%/latency-player/soundcloud.json. It never enters the repo.
Discord Rich Presence
Показывает в профиле Discord название трека, by Автор, статус играет/пауза, таймер и обложку трека вместо иконки приложения.Shows the track title, by Artist, playing/paused status, a timer and the track cover (instead of an app icon) in your Discord profile.
- Создайте приложение на discord.com/developers и скопируйте Application ID.Create an app at discord.com/developers and copy its Application ID.
- В Latency: Settings → Discord → включите тумблер и вставьте Application ID.In Latency: Settings → Discord → toggle it on and paste the Application ID.
- Запустите Discord-десктоп. Если он не запущен — плеер просто не показывает статус, без падений.Run the Discord desktop app. If it isn't running, the player just skips presence — no crashes.
ЭквалайзерEqualizer
10 полос (32 Гц … 16 кГц, BiquadFilter peaking), вертикальные ползунки ±12 дБ, тумблер вкл/выкл и 7 пресетов: Flat, Bass Boost, Treble Boost, Vocal, Electronic, Rock, Loudness. Открывается кнопкой EQ в правой панели. Работает и на локальных файлах, и на SoundCloud.10 bands (32 Hz … 16 kHz, peaking BiquadFilter), vertical ±12 dB sliders, an on/off toggle and 7 presets: Flat, Bass Boost, Treble Boost, Vocal, Electronic, Rock, Loudness. Opened via the EQ button in the right panel. Works for both local files and SoundCloud.
Тексты и караокеLyrics & karaoke
- LRCLIB — синхронизированный LRC: построчная подсветка по позиции, автоскролл, клик по строке = перемотка.LRCLIB — synced LRC: per-line highlight by position, auto-scroll, click a line to seek.
- Genius — фолбэк (plain-текст) с оценочной авто-разбивкой по времени.Genius — fallback (plain text) with estimated time-splitting.
- Ручная синхронизация (SyncEditor) — свои тайминги, защищённые от перезаписи. Кэш — в
userData/lyrics.Manual sync (SyncEditor) — your own timings, protected from overwrite. Cached inuserData/lyrics.
АвтопилотAutopilot
Тумблер на нижнем прогресс-баре (рядом с караоке). Когда включён и очередь заканчивается, плеер автоматически находит похожие треки через SoundCloud (scRelated) и продолжает играть без остановки.A toggle on the bottom progress bar (next to karaoke). When on and the queue runs out, the player automatically finds similar tracks via SoundCloud (scRelated) and keeps playing non-stop.
Офлайн-кэшOffline cache
Кнопка скачивания (↓) на каждом SoundCloud-треке сохраняет MP3 в userData/offline — потом он играет без интернета. Вкладка Скачанное в сайдбаре → «Моя музыка». В Settings → Storage видно количество и размер кэша с кнопкой очистки.The download button (↓) on any SoundCloud track saves the MP3 to userData/offline — it then plays offline. A Downloaded tab in the sidebar → “My music”. Settings → Storage shows cache count and size with a clear button.
ОформлениеTheming
- Темы: Green, Purple, Blue, Pink + кастомный акцент (собственный HSV-пикер с hex и пресетами).Themes: Green, Purple, Blue, Pink + a custom accent (built-in HSV picker with hex and presets).
- Кастомный фон: своя картинка с недеструктивным кадрированием (пан/зум), область применения — полноэкранный / интерфейс / везде.Custom background: your own image with non-destructive cropping (pan/zoom), applied to fullscreen / UI / everywhere.
- Компактный режим, размер текста караоке (S/M/L), два языка интерфейса (EN/RU).Compact mode, karaoke text size (S/M/L), two UI languages (EN/RU).
Данные и приватностьData & privacy
| Где | Что хранится |
|---|---|
localStorage | очередь, громкость, история, тема, профиль, фонqueue, volume, history, theme, profile, background |
userData | лайки, плейлисты, кэш обложек/текстов, офлайн-треки, токен SoundCloudlikes, playlists, cover/lyrics cache, offline tracks, SoundCloud token |
В коде нет захардкоженных секретов. client_id берётся на лету, OAuth-токен SoundCloud перехватывается из вашего логина и хранится только локально. Обход DRM и риппинг защищённого аудио (Spotify/Яндекс) не делается.There are no hardcoded secrets in the code. client_id is fetched on the fly, the SoundCloud OAuth token is captured from your own login and kept locally only. No DRM circumvention or protected-audio ripping (Spotify/Yandex) is done.
Сборка из исходниковBuild from source
npm install
npm run dev # десктоп, дев-режим с hot-reloaddesktop dev with hot-reload
npm run dev:mobile # мобильный таргет в браузереmobile target in the browser
npm run build # main + preload + renderer → out/
npm run typecheck # проверка типовtype checking
npm run dist:win # установщик NSIS + портативный exe → release/NSIS installer + portable exe → release/
dist:win локально на Windows нужен включённый Developer Mode (иначе electron-builder падает на распаковке winCodeSign). Все три артефакта (Win/Android/iOS) собираются в GitHub Actions при пуше тега v*.For dist:win locally on Windows you need Developer Mode enabled (otherwise electron-builder fails unpacking winCodeSign). All three artifacts (Win/Android/iOS) are built in GitHub Actions on pushing a v* tag.FAQ
Это бесплатно?Is it free?
Да. Полностью бесплатно, открытый исходный код под лицензией MIT.Yes. Completely free and open source under the MIT license.
Нужен ли аккаунт SoundCloud?Do I need a SoundCloud account?
Нет, поиск и воспроизведение работают без входа. Аккаунт нужен только для персональных миксов и лайков.No, search and playback work without logging in. An account is only needed for personal mixes and likes.
Поддерживается ли Spotify?Is Spotify supported?
Нет. Обход DRM и риппинг защищённого аудио в проекте не делается. Источники — локальные файлы и SoundCloud.No. DRM circumvention and protected-audio ripping are out of scope. The sources are local files and SoundCloud.
Работает ли в России?Does it work in Russia?
SoundCloud в России заблокирован (ограничение площадки), поэтому онлайн-поиск и стрим SoundCloud работают только через VPN. Локальные файлы работают без VPN, поиск текстов (LRCLIB / Genius) — скорее всего тоже.SoundCloud is blocked in Russia (a platform-side restriction), so its online search and streaming need a VPN. Local files work without a VPN, and lyrics search (LRCLIB / Genius) most likely works too.
Можно ли добавить свой источник?Can I add my own source?
Да. Реализуйте интерфейс PlaybackProvider и зарегистрируйте его в registry.ts — ядро (стор, UI, очередь) не меняется.Yes. Implement the PlaybackProvider interface and register it in registry.ts — the core (store, UI, queue) stays unchanged.
Почему мобильная версия сырая?Why is the mobile version rough?
Плеер делался для десктопа; мобильные порты на Capacitor добавлены ради кроссплатформенности. Эталонный опыт — на Windows.The player was built for desktop; the Capacitor mobile ports were added for cross-platform coverage. The reference experience is on Windows.
Решение проблемTroubleshooting
SmartScreen / Windows Defender
Сборка не подписана платным сертификатом. «Подробнее» → «Выполнить в любом случае». Исходники открыты — можно собрать самому.The build isn't signed with a paid certificate. “More info” → “Run anyway”. The source is open — you can build it yourself.
SoundCloud не ищет / ошибка 401SoundCloud search fails / 401 error
client_id авто-обновляется при 401. Если поиск всё ещё не работает — проверьте интернет и перезапустите плеер; client_id подберётся заново.The client_id auto-refreshes on 401. If search still fails — check your connection and restart the player; the client_id will be re-fetched.
Нет текста песниNo lyrics
Не для всех треков есть синхронный LRC. Включите фолбэк на Genius в настройках или задайте тайминги вручную через SyncEditor.Not every track has a synced LRC. Enable the Genius fallback in settings, or set timings manually via the SyncEditor.
Error: Electron uninstall (dev)
Бинарник Electron не распаковался при установке. Выполните: node node_modules/electron/install.js.The Electron binary didn't unpack on install. Run: node node_modules/electron/install.js.