Explanation: The upgrade to Liquidsoap 2.0 now means that Liquidsoap itself can hold more than one song in its upcoming queue, which allows us to make functionality like "skip song" work as expected for the first time, but also meant that our previous methods of tracking what songs were and weren't queued didn't work well at all. This overhauls the queue builder by adding a new "is_played" status to each queue entry and treating the entire "unplayed" queue (whether sent to the AutoDJ or not) as the "upcoming" queue, fixing a number of issues.
Instruct the AutoDJ to use its own generated queue for playback checking instead of SongHistory (the public playback timeline) for more accurate history.
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.
- Make the Analytics table in the database the primary one for handling statistics for all stations, removing the InfluxDB dependency entirely
- Expand the Analytics table to also track unique listeners per hour and day
- Properly clean up the Listeners table according to each installation's history retention settings
- Implement a cute new animated "waiting for services" startup message that avoids previous wait messages that looked more like errors
* Song database and entity overhaul, part 1.
* Remove Songs table from a number of qeries and reports.
* Fix references to Songs table; rewrite StationMedia processing.
* Remove song reference in queue page.
* Allow custom log level via environment variable.
* Add configurable time range for duplicate prevention
* Add missing belongsTo to duplicate prevention range setting
* Fix bug in calculation of least played song when duplicate can't be prevented by taking history timestamp_start into account
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.
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.
This fixes one significant issue in the AzuraCast system where NowPlaying responses don't respect the "always use HTTPS" or "prefer browser URL" settings.