### Description
It is good to have a deterministic order when doing explicit file
sorting. This sorts by filename when last played time is null. I would
expect filename to be the next sort after last played time in case of a
tie, and was surprised to find it was not explicit. It should not break
any existing use cases.
**This is a new feature**:
Kind of?
**I have updated the documentation to reflect these changes**:
I did not update any documentation as this way seems like the logical
expected way to do the sort.
### Testing Notes
**What I did:**
I loaded up some tracks into a local libretime instance, let some of
them play, and tested that all the old sorts worked as before as well as
tracks getting sorted by filepath in case of a last played time
### Description
The filename criteria searched the full file path and as such does not
work as expected.
**This is a new feature**:
No
**I have updated the documentation to reflect these changes**:
No docs changes are required as this is fixing a bug to make things work
as expected and documented.
### Testing Notes
**What I did:**
I uploaded some files, and tested that the file name criteria worked as
expected.
**How you can replicate my testing:**
Spin up the stack, upload some files and make sure the filename criteria
works as expected.
### Description
It is useful to be able to automatically filter tracks to a certain date
or day when scheduling tracks for playback. This adds the ability to do
just that in any string filter with the `date{format}` macro.
Closes: #3012
### Description
In the existing logic of `retrieveMediaFiles`, the time remaining in
show is calculated incorrectly in some scenarios. Each time a duration
is subtracted from `showLimit`, it is not the duration of the files just
added, but instead the length of all files scheduled. This can cause
cases where a smart block set to "time remaining in show" fails to
completely fill the program.
For example, given a 30 minute show, and a playlist like follows:
1. a 5 minute track
2. another 5 minute track
3. smart block, set to time remaining in show
When item 1 is added, `showLimit` is reduced by 5 minutes as expected.
When item 2 is added, `showLimit` is reduced by 10 minutes (as both
items 1 and 2 are counted). As a result, the smart block is only run to
fill 15 minutes, leaving 5 minutes unfilled.
This PR resolves this issue, by recalculating `showLimit` from the
original duration rather than subtracting from a running total.
This change not does implement a new feature and should not require any
changes to documentation.
### Testing Notes
**What I did:**
- On a dev environment, set up a playlist as described above.
- Before applying this PR, created a show and scheduled playlist, and
confirmed issue was reproducible
- Applied PR and repeated, and confirmed show was filled completely.
Also repeated this testing with sample data from our production
instance.
Here is a sample schedule of the "before" case with sample data, showing
the issue

The smartblock that scheduled the music is set to allow last track to
overflow, but 3m55s was left unscheduled.
Using the same playlist and same track library, here is a sample
schedule after the PR applied:

As expected, the show is fully scheduled with the last track
overflowing.
Additionally, I've applied this PR as a hot fix to our production
instance, where it has been running for a week without issue.
Also performed spot tests of playlists without smart blocks, smart
blocks scheduled directly (not in playlists) and autoloading playlists,
with no change in behaviour observed as a result of this change.
**How you can replicate my testing:**
Same test steps as I followed should be able to reproduce issue &
validate fix on any instance.
### **Links**
Not directly related to issue fixed by #3019, but also addresses the
issue of dead air left at end of blocks.
Co-authored-by: Kyle Robbertze <paddatrapper@users.noreply.github.com>
When calling DELETE "/rest/media/<id>" the call fails with 'unknown error'
if it's not within a GUI session. The StoredFile delete method checks
for user permissions regardless of if a user is even known.
### Description
Build and use the schedule events only in playout, the events generated
by legacy are not used anymore.
This ensure that we don't have to maintain 2 different implementation in
2 different languages. We still need the php function to run to make
sure the side effects of this function are executed (filling the
schedule in the DB).
### Description
Some combination of preload/postload and autoloding playlists with
smartblocks generate massively overbooked shows that clutter up the
interface. This addition performs a 'trim overbooked' after filling up
the autoload list, and does the same as pushing the 'trim overbooked'
button in the UI.
### Testing Notes
Define an autoloading playlist of 2 hours and schedule it for a one hour
show. Without patch, you'll get entries for 2 hours, with the patch, you
only get one hour and a 'overboarding' orange entry at most.
---------
Co-authored-by: Kyle Robbertze <paddatrapper@users.noreply.github.com>
Co-authored-by: Thomas Göttgens <tgoettgens@mail.com>
Co-authored-by: jo <ljonas@riseup.net>
### Description
Many people don't need the public page and use libretime purely for
playout management. This adds the ability to have libretime publicly
available but only present the login page to the user.
**I have updated the documentation to reflect these changes**:
no, but i will add documentation if this PR is accepted.
### Testing Notes
**What I did:**
Toggle the new ceckbox on the general settings, log out and back in and
check behaviour.
note: this may have conflicts with the trim overbooked PR since the
toggle sits in the same place. If both are accepted this needs to be
formatted nicely :-)
---------
Co-authored-by: Thomas Göttgens <tgoettgens@mail.com>
Co-authored-by: Jonas L. <jooola@users.noreply.github.com>
Co-authored-by: Kyle Robbertze <paddatrapper@users.noreply.github.com>
Co-authored-by: jo <ljonas@riseup.net>
### Description
Closes#2798
COALESCE last played null values with date -infinity, to ensure newly
added files are found by the last played smart block criteria.
* fix(deps): update dependency friendsofphp/php-cs-fixer to <3.41.2
* style: format files using php-cs-fixer
---------
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: jo <ljonas@riseup.net>
* fix(deps): update dependency friendsofphp/php-cs-fixer to <3.23.1
* style: format files using php-cs-fixer
---------
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: jo <ljonas@riseup.net>
* fix(deps): update dependency friendsofphp/php-cs-fixer to <3.17.1
* style(legacy): format using php-cs-fixer
---------
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: jo <ljonas@riseup.net>