SARA is a wxPython-based automation suite for radio stations. It provides multiple playlists, independent audio outputs (WASAPI/ASIO), extensive keyboard control, and screen-reader friendly UI.
Work in progress – playback, multiple players per playlist, and loop tools are functional.
- Install system prerequisites (wxWidgets, audio backends such as WASAPI/ASIO where required).
- Optionally download BASS and place
bass.dllnext to the project (or setBASS_LIBRARY_PATH). - Install FFmpeg if you plan to play MP4/M4A audio (the executable must be visible in
PATH). - Create a virtualenv for Python 3.11+:
python -m venv .venv && source .venv/bin/activate(Windows:.venv\Scripts\activate). - Install dependencies:
pip install -r requirements-dev.txt.- Optional ASIO support:
pip install pythonnet>=3.0.3(orpip install -e .[asio]).
- Optional ASIO support:
- Run the app:
python -m sara.app. - In the UI:
- Add a playlist (
Ctrl+N). - Add tracks (
Ctrl+D). - Map players/devices (
Ctrl+Shift+D). - Set a marker with
Enterand toggle marker mode (Ctrl+Shift+Enter) so globalSpacestarts from it. - Playlist controls:
F1play,F2pause,F3stop,F4fade out,Ctrl+Shift+Ltoggle loop,Ctrl+Shift+Mauto-mix. - Loop dialog (
Shift+F10 → Loop…): fine-tune start/end, capture preview (Ctrl+P/Ctrl+Shift+P). Loop ranges are saved in APEv2 tags (SARA_LOOP_*). - Use
Ctrl+Shift+Lto toggle looping per track;Ctrl+Alt+Shift+Lannounces loop info. - Options (
Tools → Options…) let you adjust fade out, PFL device, startup playlists, alternate play mode and auto removal of played tracks. - Startup playlists in Options can now include both music and news panels, so you can reopen newsroom scripts automatically at launch.
- Edit menu provides standard clipboard actions, move items with
Alt+↑/↓. - News playlists expose
Load service…/Save service…buttons (andCtrl+O/Ctrl+S) to import/export.saranewsfiles. The same format is available in the standalonesara-news-editorapp, which remembers the last device you picked and lets newsroom staff preview clips without launching the full SARA UI. - Press
Ctrl+Eto toggle between edit and read-only mode; in read-only you can useH/Shift+Hto jump headings,C/Shift+Cto jump audio clips, and Tab to reach the toolbar (device chooser, line length, Apply).
- Add a playlist (
You can also paste straight from the system clipboard: copy audio files or folders in the Explorer, then press Ctrl+V in a playlist — SARA will expand folders, extract metadata, and insert tracks in place.
Configuration is stored in config/settings.yaml, but editing through the Options dialog is recommended. Bundled BASS binaries (Windows/Linux) are provided for convenience; commercial usage requires a license from Un4seen.
- On startup SARA installs/updates its NVDA helper (
sara.ui.nvda_sleep) so NVDA keeps quiet unless the playlist explicitly opens the speech window. - The repository ships an NVDA add-on (
artifacts/sara-silent-addon.nvda-addonin releases) that keeps Play Next silent while letting arrow navigation read every track. Install it via NVDA’s “Manage Add-ons” dialog for the best experience. - Playlist selection changes are optimized for screen readers; when audio focus switches back to a playing item, NVDA receives just one concise announcement.
PYTHONPATH=src python -m pytest
UI/E2E on Windows (optional): RUN_SARA_E2E=1 PYTHONPATH=src python -m pytest -m e2e tests/e2e (uses mock audio, isolated config under SARA_CONFIG_DIR).
./docs # documentation and project notes
./src/sara # application sources
./tests # unit and integration tests
- Multiple playlists with configurable output slots and device assignments.
- Streamed audio playback (sounddevice/pycaw/pythonnet) with ReplayGain support.
- Rich keyboard control and clipboard operations.
- Loop dialog with PFL preview and persistent loop metadata.
- Sample-accurate intro looping on BASS-based players.
- News playlists with Markdown editing, per-line read mode, and inline audio buttons.
- Music folder playlists: assign a directory, preview on the PFL device with
Space, and pressEnterto send tracks to the active music playlist. .saranewsimport/export plus a standalone News Editor (sara-news-editor) with persistent audio-device selection for preparing services outside the studio.- Options dialog for fade, PFL device, startup playlists, language, alternate play, auto-remove.
- Screen-reader announcements (NVDA) and coverage in the test suite.
- Edit mode (
Ctrl+E): plain Markdown editor withCtrl+Vclipboard paste (files/folders or[[audio:path]]placeholders). Use the toolbar buttons to load/save.saranewspackages or insert audio from the system clipboard. - Read-only mode (
Ctrl+Eagain): the text is wrapped to the configured line length;H/Shift+Hjumps between headings,C/Shift+Cbetween audio markers,Enter/Spaceplays the clip under the caret, and Tab moves focus to the toolbar (Load/Save, line length spinner, Apply, device selector). - Standalone editor (
sara-news-editor): shares the same panel, stores its configuration inconfig/news_editor.yamlnext to the executable, remembers the last device, and lets newsroom staff edit.saranewsfiles without running the full SARA UI.
- Ensure locale and vendor binaries are included (
MANIFEST.in,pyproject.toml). - Build distributables with
python -m build; thesaraconsole entry starts the GUI. - GitHub Actions provides a Windows Build workflow that publishes a downloadable
.zip(containingdist/SARA) on every push tomainand on tagged releases. - The Windows zip now ships both
SARA.exeandSARA-News-Editor.exe, sharing the same runtime files, NVDA/BASS DLLs, and anffmpeg.exehelper for MP4/M4A playback. - The CI bundle includes NVDA controller DLLs and the Windows
bass.dllso speech and optional BASS playback work out of the box. - The workflow also copies the bs1770gain CLI (
src/sara/audio/vendor/windows/bs1770gain) next toSARA.exe; do the same when preparing local PyInstaller builds so normalization keeps working. - Scripts
scripts/auto_download.shandscripts/download_latest_artifact.sh(install viascripts/install_hooks.sh) keep the latest Windows artifact underartifacts/after each successful build. - For frozen Windows builds, bundle NVDA controller DLLs and optional BASS binaries alongside the executable.
- Release notes live in
docs/releases/(seedocs/releases/0.0.28.mdfor the latest changes).
- Enhanced accessibility messages.
- Persisting extra track parameters.
- Advanced fade/crossfade scenarios and scheduling.
- Separate buffer settings for main players and PFL.
- Intro/outro mix-point editor compatible with StationPlaylist tags.
- Spoken countdown for remaining intro time and shortcut for remaining track time.
- Overlay playlist type that mixes without fading other outputs.
- Finer control over accessibility announcements.
- Investigate preloading tracks into memory to minimize disk I/O at cue time.
- Application code: BSD 3-Clause (see
LICENSE). - Bundled BASS libraries retain Un4seen licensing (see
src/sara/audio/vendor/bass.txt). - NVDA Controller binaries are distributed under the NV Access license; use subject to their terms.
Wersja rozwojowa – odtwarzanie, wielokrotne sloty odtwarzaczy i narzędzia pętli są gotowe.
- Zainstaluj zależności systemowe (wxWidgets, backendy audio typu WASAPI/ASIO).
- (Opcjonalnie) pobierz BASS i umieść
bass.dllw katalogu projektu (lub ustawBASS_LIBRARY_PATH). - Zainstaluj FFmpeg, jeśli chcesz odtwarzać pliki MP4/M4A (plik
ffmpeg.exemusi być wPATH). - Utwórz wirtualne środowisko Python 3.11+:
python -m venv .venv && source .venv/bin/activate(Windows:.venv\Scripts\activate). - Zainstaluj zależności projektu:
pip install -r requirements-dev.txt.- Opcjonalna obsługa ASIO:
pip install pythonnet>=3.0.3(lubpip install -e .[asio]).
- Opcjonalna obsługa ASIO:
- Uruchom aplikację:
python -m sara.app. - W interfejsie:
- Dodaj playlistę (
Ctrl+N). - Dodaj utwory (
Ctrl+D). - Przypisz odtwarzacze/urządzenia (
Ctrl+Shift+D). - Ustaw znacznik klawiszem
Enter, a tryb od znacznika (Ctrl+Shift+Enter) sprawi, że Spacja startuje od niego. - Sterowanie playlistą:
F1– start,F2– pauza,F3– stop,F4– fade out,Ctrl+Shift+L– pętla,Ctrl+Shift+M– auto mix. - Dialog pętli (
Shift+F10 → Zapętl…): precyzyjne start/koniec, odsłuch PFL (Ctrl+P/Ctrl+Shift+P). Pętle zapisują się w tagach APEv2. - Przełączanie zapętlenia utworu (
Ctrl+Shift+L) i informacja o pętli (Ctrl+Alt+Shift+L). Narzędzia → Opcje…udostępniają sterowanie fade, urządzeniem PFL, playlistami startowymi, językiem, trybem naprzemiennym i auto-usuwaniem.- W sekcji Startup playlists możesz dodać zarówno playlisty muzyczne, jak i newsowe, żeby po starcie Sary od razu otwierały się właściwe panele.
- Menu
Edycjaudostępnia operacje schowka,Alt+↑/↓przenosi pozycje. - Playlisty newsowe mają przyciski „Wczytaj serwis…” / „Zapisz serwis…” (oraz skróty
Ctrl+O/Ctrl+S) działające na plikach.saranews. Ten sam format obsługuje niezależna aplikacjasara-news-editor, która zapamiętuje ostatnio użyte urządzenie, pozwala wybrać kartę audio i odsłuchiwać klipy bez uruchamiania całej Sary. Ctrl+Eprzełącza tryb edycji i odczytu; w trybie odczytuH/Shift+Hskacze po nagłówkach,C/Shift+Cpo klipach, a Tab przenosi fokus na pasek narzędzi (w tym długość linii i urządzenie audio).
- Dodaj playlistę (
Konfiguracja trafia do config/settings.yaml, ale wygodniej edytować ją z poziomu okna „Opcje…”. Pamiętaj o licencjach BASS przy użyciu komercyjnym.
PYTHONPATH=src python -m pytest
Testy UI/E2E na Windows (opcjonalnie): RUN_SARA_E2E=1 PYTHONPATH=src python -m pytest -m e2e tests/e2e (mock audio, izolowana konfiguracja przez SARA_CONFIG_DIR).
./docs # dokumentacja i notatki
./src/sara # źródła aplikacji
./tests # testy jednostkowe/integracyjne
- Wiele playlist z niezależnymi slotami i przypisaniem urządzeń WASAPI/ASIO.
- Strumieniowe odtwarzanie (sounddevice/pycaw/pythonnet) z ReplayGain.
- Rozbudowane sterowanie klawiaturą i operacje schowka.
- Dialog pętli z odsłuchem PFL oraz zapisem w tagach.
- Dokładne zapętlanie intra w odtwarzaczu BASS.
- Playlisty newsowe z edycją Markdown, trybem tylko do odczytu i przyciskami audio.
- Playlisty folderów muzycznych: wskaż katalog, odsłuchuj na PFL klawiszem
Spacja, aEnterdodaje zaznaczone utwory do bieżącej playlisty muzycznej. - Import/eksport plików
.saranewsoraz niezależny News Editor (sara-news-editor) z zapamiętywaniem urządzenia audio do przygotowywania serwisów. - Opcje: fade, PFL, playlisty startowe, język interfejsu, tryb naprzemienny, auto-usuwanie.
- Komunikaty dostępności (NVDA) i testy pokrywające kluczowe moduły.
- Tryb edycji (
Ctrl+E): zwykły edytor Markdown z wklejaniemCtrl+V(pliki/foldery lub tokeny[[audio:ścieżka]]). Paski „Wczytaj/Zapisz/Wstaw audio” obsługują format.saranews. - Tryb tylko do odczytu (
Ctrl+Eponownie): tekst zawija się do zadanego limitu,H/Shift+Hprzechodzi po nagłówkach,C/Shift+Cpo klipach audio,Enter/Spacjaodtwarza bieżący klip, a Tab przechodzi do paska narzędzi (w tym spinnera długości linii, przycisku Apply i wyboru urządzenia). - Samodzielny edytor (
sara-news-editor): korzysta z tego samego panelu, zapisuje konfigurację wconfig/news_editor.yamlobok aplikacji, pamięta ostatnie urządzenie audio i pozwala przygotować serwis bez uruchamiania głównej Sary.
- Dopilnuj, by pliki lokalizacyjne i binaria NVDA/BASS trafiały do pakietu (zob.
MANIFEST.in,pyproject.toml). - Zbuduj paczki poleceniem
python -m build; po instalacji dostępny jest skryptsarauruchamiający GUI. - Tworząc wersję Windows (np. PyInstaller), dołącz biblioteki NVDA oraz ewentualne biblioteki BASS obok pliku wykonywalnego.
- Paczka Windows zawiera teraz zarówno
SARA.exe, jak iSARA-News-Editor.exe, korzystające ze wspólnych bibliotek i dll-i NVDA/BASS. - GitHub Actions udostępnia workflow Windows Build, który na każdym pushu do
main(oraz przy wydaniu) buduje paczkę.zipz katalogiemdist/SARAgotowym do pobrania. - Pakiet z CI zawiera biblioteki NVDA oraz
bass.dlldla Windows, więc mowa i opcjonalne odtwarzanie BASS działają od razu.
- Rozbudowa komunikatów dostępności.
- Persistencja dodatkowych parametrów utworu.
- Zaawansowane crossfade i planowanie emisji.
- Osobne buforowanie dla głównych odtwarzaczy i PFL.
- Edytor punktów intro/outro zgodny z tagami StationPlaylist.
- Wypowiadanie pozostałego czasu intra i skrót odczytujący czas do końca utworu.
- Playlista nakładkowa, która odtwarza bez wygaszania pozostałych playlist.
- Automatyczne pobieranie najnowszego buildu (skrypt + hooki git).
- Granulacja komunikatów dostępności.
- Wstępne ładowanie utworów do pamięci w celu ograniczenia opóźnień dyskowych.
- Kod aplikacji: BSD 3-Clause (
LICENSE). - Biblioteki BASS: zgodnie z licencją Un4seen (
src/sara/audio/vendor/bass.txt). - Dołączone biblioteki NVDA Controller podlegają licencji NV Access.