Previously AzuraCast had two very similar `$settings` variables, one that was from environment and the other from the database. This refactor distinguishes the two much more clearly.
This migration adds "Storage Locations", managed via a new System Administration panel, that can hold Station Media data, live broadcast recordings, and backups. These storage locations can be local (as they are by default) or remote via any S3-compatible service.
Create a new "StationQueue" entity that contains the upcoming song queue, and split the important AutoDJ functionality across multiple classes (Annotations, Queue and Scheduler).
- Switch to EntityManagerInterface for EM uses
- Wrap EntityManager in close-resilient wrapper
- Close/clear/reopen EM with every request
- Rework tests to be em->clear() resilient.
- Refactor Flysystem to use constants instead of magic strings for URL prefixes
- Add audiowaveform installation to both Docker and Ansible installations
- Use audiowaveform to generate waveforms saved to disk for every track
- Load these waveforms when visiting the visual waveform editor page instead of using the browser to calculate them
- Add volume control and use app-wide storage of default volume
- Remove "beta" tag from waveform editor header
* Add form entries and LS config writing for live stream recording.
* Create new Broadcast entity; implement new djon/djoff handling.
* Rework record command procedure and add Station relation to Broadcast.
* Run code reformat on JS to add semicolons back.
* Properly save recording path on entity.
* Initial commit of new streamers Vue component.
* Finish frontend Vue dev and add necessary API endpoints.
* Add loader to Datatable; update npm deps; polish on components.
Implement an upgrade of the codebase to use Slim Framework version 4, which includes the following changes:
- Updating to Slim version 4 and the corresponding AzuraCore updates.
- Making all objects PSR-7 Request/Response agnostic (and creating RequestHelper and ResponseHelper objects to interact with the PSR-7 Req/Resp objects).
- Moving to PHP-DI as a DI container and implementing its autowiring support.
* Create new backup and restore commands allowing live backups.
* Switch migrate script to use new backup method.
* Avoid loading fixtures, ensure directories exist when restarting stations.
* Include album art in media backup.
* First portion of automated backup management code.
* Further backup page work; add download/delete functionality.
* Implement automatic backups and "manual run" page.
* Switch automatic backup filename to match text.
* Add new locales.
* Add restore instructions and ability to view latest backup log.
Rationale: under the current system, Supervisord simply pipes its per-process logs out to stdout/stderr on Docker, meaning it has no ability to read back those logs in the case of an error, leading to cryptic error messages like "SPAWN_ERROR" instead of the actual problem. This refactors the logging to be handled by Supervisord, which also is itself capable of log rotation (removing the need for AzuraCast to rotate radio software logs).
* Fix access to an undefined property
* Fix usage of undefined variable
* Fix undefined class Throwable error
* Fix undefined class Throwable error
* Fix undefined class Throwable error
* Fix class not found error and remove unused class import
* Remove usage and instantiation of non-existent controller
* Remove implicit declaration of property that is not used