418 Commits

Author SHA1 Message Date
dakriy
f780994996
feat(legacy): add config option for group separator in header auth (#3181)
### Description

Not all forward auth solutions use a comma for group seperator.

**This is a new feature**:

Yes

**I have updated the documentation to reflect these changes**:

Yes

### **Links**

[Authentik uses `|` so may as well make the group separator
configurable](https://docs.goauthentik.io/docs/add-secure-apps/providers/proxy/)
2025-07-16 20:32:34 +02:00
Jonas L.
63ff50b82c
feat: rename airtime-pypo exchange to playout (#3170)
### Description

The playout exchange was changed to `fanout` without migrating the
previous `direct` exchange. This cause issues during upgrades, such as:

```
amqp.exceptions.PreconditionFailed: Exchange.declare: (406) PRECONDITION_FAILED - inequivalent arg 'type' for exchange 'airtime-pypo' in vhost '/libretime': received 'fanout' but current is 'direct'
```

This is documented upstream in
https://www.rabbitmq.com/docs/queues#property-equivalence

This change provides an upgrade path by renaming the exchange, and leave
the old exchange behind. Loosing messages is not a concern for the
playout queue.

### Testing Notes

- Checkout version `4.4.0`
- Run `make dev`
- Checkout 9e55d3bb6f2fa0f9a4dc858359a99e9d50c826a4
- Run `make dev`
- See the exception in playout: `docker compose logs -f playout`
- Checkout this PR
- Run `make dev`
- See playout fine working.


### **Links**

https://github.com/libretime/libretime/pull/3161
2025-06-14 17:56:21 +02:00
dakriy
9e55d3bb6f
feat: use fanout queue type for playout queue (#3161)
### Description

Currently, only one service can listen to libretime schedule change
events. This change allows for as many services as desired to listen for
schedule change events.

**This is a new feature**:

Yes

**I have updated the documentation to reflect these changes**:

No, as this seems like the obvious default

### Testing Notes

**What I did:**

I created 2 playout blocks, connected them both to the fanout queue and
saw that they could all connect and receive schedule change events at
the same time.

**How you can replicate my testing:**

See testing notes
2025-06-07 05:05:04 +01:00
dakriy
5743a0f582
fix(legacy): scheduled show length should not add track fade times (#3144)
### Description

When generating a show that contains a playlist with dynamic blocks, the
show will be incorrectly under scheduled because the fade time was added
onto the total track length. Fade should not add time to an overall
track length as then it wouldn't be a fade.

**This is a new feature**:

No

**I have updated the documentation to reflect these changes**:

No, none needed.

### Testing Notes

**What I did:**

I created a playlist with 3 dynamic blocks:

1. 10 minute length dynamic block
2. 1 item dynamic block
3. fill rest of show dynamic block

I then created a show with the defined auto loading playlist. I then saw
that on auto-load the show was not under scheduled.

**How you can replicate my testing:**

See testing notes

Co-authored-by: Kyle Robbertze <paddatrapper@users.noreply.github.com>
2025-03-19 11:13:30 +00:00
dakriy
c5548632e4
fix(legacy): now macro should use station timezone (#3143)
### Description

The `now{}` macro for criteria filtering used UTC rather than station
timezone leading to confusing results.

**This is a new feature**:

No

**I have updated the documentation to reflect these changes**:

Yes

### Testing Notes

**What I did:**

I named a track the current date and hour, and used the date macro to
try to select it. It failed, I then implemented this fix and saw that
the track was selected.

**How you can replicate my testing:**

See what I did.

### **Links**

None
2025-03-18 13:12:01 +00:00
Julien Valentin
3a8dcbce60
feat(legacy): update deprecated PHP code (#2789)
### Description
update deprecated code. It's mergeable with master without syntax
conflicts across php versions
remove deprecated((https://www.php.net/manual/fr/function.strftime.php))
and unsafe (https://cve.mitre.org/cgi-bin/cvekey.cgi?keyword=strftime)
**strftime** syntax

---------

Co-authored-by: mp3butcher <mp3butcher@gmail.com>
Co-authored-by: jo <ljonas@riseup.net>
Co-authored-by: Kyle Robbertze <kyle@paddatrapper.com>
2025-03-12 23:19:18 +00:00
Weblate (bot)
eb3f160eae
chore(legacy): translations update from Hosted Weblate (#3136)
Translations update from [Hosted Weblate](https://hosted.weblate.org)
for
[LibreTime/Legacy](https://hosted.weblate.org/projects/libretime/legacy/).



Current translation status:

![Weblate translation
status](https://hosted.weblate.org/widget/libretime/legacy/horizontal-auto.svg)

---------

Co-authored-by: Monstorix <monstorix@outlook.com>
2025-02-25 10:42:57 +00:00
nosbig
203c927554
feat: add flac support to Web player (#3128)
### Description

Added support for previewing FLAC files in the web interface, provided
in #509 by marmotte32 on Github in the comments for this issue.

I have tested this against a script-installed copy of 4.2.0, and FLAC
preview is working, although auto-play isn't. I haven't tested to
confirm if this behavior matches MP3 and OGG uploads.

**This is a new feature**:

_Do the changes in this PR implement a new feature?_

**I have updated the documentation to reflect these changes**:

No changes needed; this bug is a missing file format in preview, and it
requires no updates to the documentation.

### Testing Notes

**What I did:**

I installed a LibreTime 4.2.0 system using the default installation
script against a fully-updated, brand new Debian 11 system. I logged
into the web interface, uploaded some FLAC files, and attempted to
preview them. They failed to preview.

I then replaced the preview_jplayer.js file with the contents in this PR
and then refreshed the page. I was able to preview the FLAC files and
hear the results in my local browser audio output.

**How you can replicate my testing:**

Perform the same steps above, or replace the same file in the
libretime_legacy_1 docker image to see the same results.

### **Links**

Closes: #509

---------

Co-authored-by: Kyle Robbertze <kyle@paddatrapper.com>
2025-01-10 15:46:18 +00:00
Scott McGrath
644d2b9ce5
fix(legacy): additional specifics added to CSVexport.js for RFC 4180 (#3131)
### Description

The existing implementation for exporting playout logs to a CSV file
incorporates a very simplified CSV format. Some aspects of the complete
[RFC](https://www.rfc-editor.org/rfc/rfc4180) are missing, such as
escaping of quotes, and quoting of fields that contain certain
characters. This is problematic for common office spreadsheet tools, and
practically, anything else. Many radio stations rely on this
functionality to work well for exporting playout data, for example, in
order to compile data for reporting requirements.

**This is a new feature**:

The changes in this PR add quoting of fields containing a comma, as well
as those containing a CR/LF. It also escapes quotes by doubling them.
I'm not sure it makes CSVexport.js completely RFC 4180 compliant, but it
is much closer than it was.

**I have updated the documentation to reflect these changes**:

I don't think there are any documentation changes necessary; this is
probably expected behavior for anyone trying to use the CSV exporter.

### Testing Notes

**What I did:**

To validate this, I did a clean install of Debian, cloned from the
official libretime repo, and applied the code as a patch to the
installer. I then proceeded with the install and then loaded a database
from a running system (so that I had some playout data to test with). I
then performed the playout history export and examined the resulting CSV
file and after seeing previously problematic fields properly quoted, was
convinced it looked the way I expected. I loaded the csv file into
Libreoffice Calc and did not see any errors.

**How you can replicate my testing:**

See "What I did" above, basically run the patch after cloning the
installer from the repo. You could also apply the changes to a running
system by applying the patch to the file:
/usr/share/libretime/legacy/public/js/libs/CSVexport.js
Be sure to clear your browser cache and do a hard reload of the web
interface, before re-testing.

### **Links**

Closes: #2477
2025-01-09 08:34:13 +00:00
Weblate (bot)
7f40743d83
chore(legacy): translations update from Hosted Weblate (#3129)
Translations update from [Hosted Weblate](https://hosted.weblate.org)
for
[LibreTime/Legacy](https://hosted.weblate.org/projects/libretime/legacy/).



Current translation status:

![Weblate translation
status](https://hosted.weblate.org/widget/libretime/legacy/horizontal-auto.svg)

Co-authored-by: marmotte <serge@e.email>
2025-01-08 10:48:31 +00:00
libretime-bot
cf172d5c7c chore(legacy): update locales 2024-12-09 02:37:27 +00:00
dakriy
2985d8554a
feat(legacy): trused header sso auth (#3095)
### Description

Allows LibreTime to support Trusted Header SSO Authentication.

**This is a new feature**:

Yes

**I have updated the documentation to reflect these changes**:

Yes

### Testing Notes

**What I did:**

I spun up an Authelia/Traefik pair and configured them to protect
LibreTime according to Authelia's documentation, I then tested that you
could log in via the trusted headers, and tested that old methods of
authentication were not affected.

**How you can replicate my testing:**

Using the following `docker-compose.yml` file

```yml
services:
  postgres:
    image: postgres:15
    networks:
      - internal
    volumes:
      - postgres_data:/var/lib/postgresql/data
    environment:
      POSTGRES_USER: ${POSTGRES_USER:-libretime}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-libretime} # Change me !
    healthcheck:
      test: pg_isready -U libretime

  rabbitmq:
    image: rabbitmq:3.13-alpine
    networks:
      - internal
    environment:
      RABBITMQ_DEFAULT_VHOST: ${RABBITMQ_DEFAULT_VHOST:-/libretime}
      RABBITMQ_DEFAULT_USER: ${RABBITMQ_DEFAULT_USER:-libretime}
      RABBITMQ_DEFAULT_PASS: ${RABBITMQ_DEFAULT_PASS:-libretime} # Change me !
    healthcheck:
      test: nc -z 127.0.0.1 5672

  playout:
    image: ghcr.io/libretime/libretime-playout:${LIBRETIME_VERSION:-latest}
    networks:
      - internal
    init: true
    ulimits:
      nofile: 1024
    depends_on:
      - rabbitmq
    volumes:
      - ${LIBRETIME_CONFIG_FILEPATH:-./config.yml}:/etc/libretime/config.yml:ro
      - libretime_playout:/app
    environment:
      LIBRETIME_GENERAL_PUBLIC_URL: http://nginx:8080

  liquidsoap:
    image: ghcr.io/libretime/libretime-playout:${LIBRETIME_VERSION:-latest}
    networks:
      - internal
    command: /usr/local/bin/libretime-liquidsoap
    init: true
    ulimits:
      nofile: 1024
    ports:
      - 8001:8001
      - 8002:8002
    depends_on:
      - rabbitmq
    volumes:
      - ${LIBRETIME_CONFIG_FILEPATH:-./config.yml}:/etc/libretime/config.yml:ro
      - libretime_playout:/app
    environment:
      LIBRETIME_GENERAL_PUBLIC_URL: http://nginx:8080

  analyzer:
    image: ghcr.io/libretime/libretime-analyzer:${LIBRETIME_VERSION:-latest}
    networks:
      - internal
    init: true
    ulimits:
      nofile: 1024
    depends_on:
      - rabbitmq
    volumes:
      - ${LIBRETIME_CONFIG_FILEPATH:-./config.yml}:/etc/libretime/config.yml:ro
      - libretime_storage:/srv/libretime
    environment:
      LIBRETIME_GENERAL_PUBLIC_URL: http://nginx:8080

  worker:
    image: ghcr.io/libretime/libretime-worker:${LIBRETIME_VERSION:-latest}
    networks:
      - internal
    init: true
    ulimits:
      nofile: 1024
    depends_on:
      - rabbitmq
    volumes:
      - ${LIBRETIME_CONFIG_FILEPATH:-./config.yml}:/etc/libretime/config.yml:ro
    environment:
      LIBRETIME_GENERAL_PUBLIC_URL: http://nginx:8080

  api:
    image: ghcr.io/libretime/libretime-api:${LIBRETIME_VERSION:-latest}
    networks:
      - internal
    init: true
    ulimits:
      nofile: 1024
    depends_on:
      - postgres
      - rabbitmq
    volumes:
      - ${LIBRETIME_CONFIG_FILEPATH:-./config.yml}:/etc/libretime/config.yml:ro
      - libretime_storage:/srv/libretime

  legacy:
    image: ghcr.io/libretime/libretime-legacy:${LIBRETIME_VERSION:-latest}
    networks:
      - internal
    init: true
    ulimits:
      nofile: 1024
    depends_on:
      - postgres
      - rabbitmq
    volumes:
      - ${LIBRETIME_CONFIG_FILEPATH:-./config.yml}:/etc/libretime/config.yml:ro
      - libretime_assets:/var/www/html
      - libretime_storage:/srv/libretime

  nginx:
    image: nginx
    networks:
      - internal
      - net
    ports:
      - 8080:8080
    depends_on:
      - legacy
    volumes:
      - libretime_assets:/var/www/html:ro
      - libretime_storage:/srv/libretime:ro
      - ${NGINX_CONFIG_FILEPATH:-./nginx.conf}:/etc/nginx/conf.d/default.conf:ro
    labels:
      - 'traefik.enable=true'
      - 'traefik.docker.network=libretime_net'
      - 'traefik.http.routers.libretime.rule=Host(`libretime.example.com`)'
      - 'traefik.http.routers.libretime.entrypoints=https'
      - 'traefik.http.routers.libretime.tls=true'
      - 'traefik.http.routers.libretime.tls.options=default'
      - 'traefik.http.routers.libretime.middlewares=authelia@docker'
      - 'traefik.http.services.libretime.loadbalancer.server.port=8080'

  icecast:
    image: ghcr.io/libretime/icecast:2.4.4
    networks:
      - internal
    ports:
      - 8000:8000
    environment:
      ICECAST_SOURCE_PASSWORD: ${ICECAST_SOURCE_PASSWORD:-hackme} # Change me !
      ICECAST_ADMIN_PASSWORD: ${ICECAST_ADMIN_PASSWORD:-hackme} # Change me !
      ICECAST_RELAY_PASSWORD: ${ICECAST_RELAY_PASSWORD:-hackme} # Change me !

  traefik:
    image: traefik:v2.11.12
    container_name: traefik
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    networks:
      - net
    labels:
      - 'traefik.enable=true'
      - 'traefik.http.routers.api.rule=Host(`traefik.example.com`)'
      - 'traefik.http.routers.api.entrypoints=https'
      - 'traefik.http.routers.api.service=api@internal'
      - 'traefik.http.routers.api.tls=true'
      - 'traefik.http.routers.api.tls.options=default'
      - 'traefik.http.routers.api.middlewares=authelia@docker'
    ports:
      - '80:80'
      - '443:443'
    command:
      - '--api'
      - '--providers.docker=true'
      - '--providers.docker.exposedByDefault=false'
      - '--entrypoints.http=true'
      - '--entrypoints.http.address=:80'
      - '--entrypoints.http.http.redirections.entrypoint.to=https'
      - '--entrypoints.http.http.redirections.entrypoint.scheme=https'
      - '--entrypoints.https=true'
      - '--entrypoints.https.address=:443'
      - '--log=true'
      - '--log.level=DEBUG'

  authelia:
    image: authelia/authelia
    container_name: authelia
    networks:
      - net
    volumes:
      - ./authelia:/config
    labels:
      - 'traefik.enable=true'
      - 'traefik.http.routers.authelia.rule=Host(`auth.example.com`)'
      - 'traefik.http.routers.authelia.entrypoints=https'
      - 'traefik.http.routers.authelia.tls=true'
      - 'traefik.http.routers.authelia.tls.options=default'
      - 'traefik.http.middlewares.authelia.forwardauth.address=http://authelia:9091/api/authz/forward-auth'  # yamllint disable-line rule:line-length
      - 'traefik.http.middlewares.authelia.forwardauth.trustForwardHeader=true'
      - 'traefik.http.middlewares.authelia.forwardauth.authResponseHeaders=Remote-User,Remote-Groups,Remote-Name,Remote-Email'  # yamllint disable-line rule:line-length
      - 'traefik.http.services.authelia.loadbalancer.server.port=9091'
    restart: unless-stopped
    environment:
      - TZ=America/Los_Angeles

volumes:
  postgres_data: {}
  libretime_storage: {}
  libretime_assets: {}
  libretime_playout: {}

networks:
  internal:
  net:
```

The following libretime dev config modification:
```yml
general:
  public_url: https://libretime.example.com
  auth: LibreTime_Auth_Adaptor_Header

header_auth:
  group_map:
    host: lt-host
    program_manager: lt-pm
    admin: lt-admin
    superadmin: lt-superadmin
```

And the following authelia config file:

```yml
---
###############################################################
#                   Authelia configuration                    #
###############################################################

server:
  address: 'tcp://:9091'
  buffers:
    read: 16384
    write: 16384

log:
  level: 'debug'

totp:
  issuer: 'authelia.com'

identity_validation:
  reset_password:
    jwt_secret: 'a_very_important_secret'

authentication_backend:
  file:
    path: '/config/users_database.yml'

access_control:
  default_policy: 'deny'
  rules:
    - domain: 'traefik.example.com'
      policy: 'one_factor'
    - domain: 'libretime.example.com'
      policy: 'one_factor'

session:
  secret: 'insecure_session_secret'

  cookies:
    - name: 'authelia_session'
      domain: 'example.com'  # Should match whatever your root protected domain is
      authelia_url: 'https://auth.example.com'
      expiration: '1 hour'  # 1 hour
      inactivity: '5 minutes'  # 5 minutes

regulation:
  max_retries: 3
  find_time: '2 minutes'
  ban_time: '5 minutes'

storage:
  encryption_key: 'you_must_generate_a_random_string_of_more_than_twenty_chars_and_configure_this'
  local:
    path: '/config/db.sqlite3'

notifier:
  filesystem:
    filename: '/config/notification.txt'
...
```

And the following authelia users database:

```yml
---
###############################################################
#                         Users Database                      #
###############################################################

# This file can be used if you do not have an LDAP set up.

# List of users
users:
  test:
    disabled: false
    displayname: "First Last"
    password: "$argon2id$v=19$m=16,t=2,p=1$SWVVVzcySlRLUEFkWWh2eA$qPs1ZmzmDXR/9WckDzIN9Q"
    email: test@example.com
    groups:
      - admins
      - dev
      - lt-admin
...
```

add the following entries to your `hosts` file:

```
127.0.0.1 traefik.example.com
127.0.0.1 auth.example.com
127.0.0.1 libretime.example.com
```

Then visit `libretime.example.com` in your browser, and login as the
user `test` with password of `password`. You should then be taken to the
LibreTime homepage, and when you click on login, you should be
automatically logged in.

### **Links**

https://www.authelia.com/integration/trusted-header-sso/introduction/
https://doc.traefik.io/traefik/middlewares/http/forwardauth/

---------

Co-authored-by: Kyle Robbertze <paddatrapper@users.noreply.github.com>
2024-12-07 10:21:57 +00:00
Weblate (bot)
f709c5026d
chore(legacy): translations update from Hosted Weblate (#3116)
Translations update from [Hosted Weblate](https://hosted.weblate.org)
for
[LibreTime/Legacy](https://hosted.weblate.org/projects/libretime/legacy/).



Current translation status:

![Weblate translation
status](https://hosted.weblate.org/widget/libretime/legacy/horizontal-auto.svg)

Co-authored-by: gfbdrgng <hnaofegnp@hldrive.com>
2024-12-07 10:12:20 +00:00
renovate[bot]
c0bb7df0ed
chore(deps): lock file maintenance (legacy/composer.json) (#3118)
This PR contains the following updates:

| Update | Change |
|---|---|
| lockFileMaintenance | All locks refreshed |

🔧 This Pull Request updates lock files to use the latest dependency
versions.

---

### Configuration

📅 **Schedule**: Branch creation - "after 4am and before 5am on monday"
(UTC), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

👻 **Immortal**: This PR will be recreated if closed unmerged. Get
[config
help](https://redirect.github.com/renovatebot/renovate/discussions) if
that's undesired.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/libretime/libretime).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzOS40Mi40IiwidXBkYXRlZEluVmVyIjoiMzkuNDIuNCIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiZGVwZW5kZW5jaWVzIiwicGhwIl19-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-12-03 06:39:40 +00:00
renovate[bot]
d09bf04379
chore(deps): lock file maintenance (legacy/composer.json) (#3115)
This PR contains the following updates:

| Update | Change |
|---|---|
| lockFileMaintenance | All locks refreshed |

🔧 This Pull Request updates lock files to use the latest dependency
versions.

---

### Configuration

📅 **Schedule**: Branch creation - "after 4am and before 5am on monday"
(UTC), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

👻 **Immortal**: This PR will be recreated if closed unmerged. Get
[config
help](https://redirect.github.com/renovatebot/renovate/discussions) if
that's undesired.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/libretime/libretime).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzOS4xOS4wIiwidXBkYXRlZEluVmVyIjoiMzkuMTkuMCIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiZGVwZW5kZW5jaWVzIiwicGhwIl19-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-11-26 06:13:26 +00:00
Weblate (bot)
1939b0aec0
chore(legacy): translations update from Hosted Weblate (#3112)
Translations update from [Hosted Weblate](https://hosted.weblate.org)
for
[LibreTime/Legacy](https://hosted.weblate.org/projects/libretime/legacy/).



Current translation status:

![Weblate translation
status](https://hosted.weblate.org/widget/libretime/legacy/horizontal-auto.svg)

Co-authored-by: gallegonovato <fran-carro@hotmail.es>
2024-11-18 20:35:19 +00:00
Weblate (bot)
013d68e880
chore(legacy): translations update from Hosted Weblate (#3110)
Translations update from [Hosted Weblate](https://hosted.weblate.org)
for
[LibreTime/Legacy](https://hosted.weblate.org/projects/libretime/legacy/).



Current translation status:

![Weblate translation
status](https://hosted.weblate.org/widget/libretime/legacy/horizontal-auto.svg)

Co-authored-by: gallegonovato <fran-carro@hotmail.es>
2024-11-14 00:00:22 +00:00
renovate[bot]
c4e10ed861 chore(deps): lock file maintenance (legacy/composer.json) 2024-10-29 09:42:02 +00:00
libretime-bot
8d80e70580 chore(legacy): update locales 2024-10-28 02:21:53 +00:00
Weblate (bot)
26db439d34
chore(legacy): translations update from Hosted Weblate (#3105)
Translations update from [Hosted Weblate](https://hosted.weblate.org)
for
[LibreTime/Legacy](https://hosted.weblate.org/projects/libretime/legacy/).



Current translation status:

![Weblate translation
status](https://hosted.weblate.org/widget/libretime/legacy/horizontal-auto.svg)

Co-authored-by: Ihor Hordiichuk <igor_ck@outlook.com>
2024-10-26 17:03:52 +01:00
Thomas Göttgens
7992a9be2d
fix: intro/outro playlist unset was impossible (#3101)
this reinstates the boolean fields in the database from the original PR
to work around a foreign key contraint. THE UI remains unchanged
2024-10-21 18:34:39 +01:00
libretime-bot
2870857abc chore(legacy): update locales 2024-10-21 02:20:09 +00:00
Thomas Göttgens
0b221f4fff
fix(legacy): support Postgresql 12 syntax (#3103)
fixes #3102
2024-10-19 23:20:30 +01:00
Weblate (bot)
74da2ef0b4
chore(legacy): translations update from Hosted Weblate (#3099)
Translations update from [Hosted Weblate](https://hosted.weblate.org)
for
[LibreTime/Legacy](https://hosted.weblate.org/projects/libretime/legacy/).



Current translation status:

![Weblate translation
status](https://hosted.weblate.org/widget/libretime/legacy/horizontal-auto.svg)

Co-authored-by: Maurizio Castelvetro <castelvetro@gmail.com>
2024-10-17 17:49:06 +01:00
renovate[bot]
08b85a44bc chore(deps): lock file maintenance (legacy/composer.json) 2024-10-17 08:23:20 +00:00
Thomas Göttgens
299be3c142
feat: use custom intro/outro playlists per show (#2941)
### Description

Having a global intro and outro playlist in settings is not very
flexible for special programming. This adds an override intro/outro
playlist per show. If it is not set, the global one is used. also it's
ignored if there's no autloading at all.

**I have updated the documentation to reflect these changes**:

Yes

### Testing Notes

**What I did:**
Schedule 2 shows, one without defining custom lists, one with defining
custom lists. one hour before the show starts it should be populated
correctly. If you define a global list it shojuld be replaced with the
per-show list.

---------

Co-authored-by: Thomas Göttgens <tgoettgens@mail.com>
2024-10-14 21:07:41 +01:00
dakriy
5b5c68c628
feat(legacy): implement subset sum solution to show scheduling (#3019)
### Description

When running a radio station it is generally a good idea to reduce dead
air time. The current algorithm for adding tracks to a block/show can
leave a lot of dead air time at the end as it doesn't use a very good
algorithm. Adding tracks to a show until it is full while making it as
full as possible is a well known problem in computer science. It is the
[Subset Sum Problem](https://en.wikipedia.org/wiki/Subset_sum_problem).
This PR implements a Randomized Greedy with Local Improvement (RGLI)
approximation solution for the Subset Sum Problem. The new algorithm is
only used when sort type is random and overflow is not enabled and there
is no limit on the number of tracks that can be used.

**This is a new feature**:

Improvement on an existing feature. 

**I have not updated the documentation to reflect these changes**:

I did not update the documentation because the current scheduling
algorithm is not currently documented and its existing features have not
changed.

### Testing Notes

**What I did:**

I first attempted a fully polynomial time approximation scheme solution,
however it is really bad at finding good solutions for high density
values and can kinda slow the more tracks/time you have. So I instead
implemented an RGLI which is O(nlogn) and has been giving much better
results.

I implemented the solution in a separate project and tested it and timed
the values with a normal distribution of 500 songs with a mean of 3
minutes and a standard deviation of 1 minute. With a show size of 1 hour
the algorithm took around 10-15 ms to run. When adjusting the block size
and track size the algorithm still was pretty quick to run. Am going to
be testing on an instance with lots of tracks later, will update PR when
I have done that.

**How you can replicate my testing:**

_How can the reviewer validate this PR?_

### **Links**

Closes #3018
2024-10-13 15:31:08 +02:00
dakriy
16deaf08c6
feat(legacy): show filename and size on edit page and add filename datatable column (#3083)
### Description

Add File Name and Size to the metadata editor screen, and added a File
Name column to the tracks data table.

**This is a new feature**:

Yes

**I have updated the documentation to reflect these changes**:

No, just some simple UI additions so no documentation needed.

### Testing Notes

**What I did:**

I uploaded some tracks, clicked on edit, and saw that the filename and
size showed up at the top. I also went out to the tracks view and added
the File Name column and saw that the filename displayed properly.

**How you can replicate my testing:**

Do what I did

### **Links**

Fixes #3053
2024-10-13 08:45:54 +01:00
renovate[bot]
004b784d09 chore(deps): lock file maintenance (legacy/composer.json) 2024-09-17 09:26:00 +00:00
Weblate (bot)
1ae9a7b368
chore(legacy): translations update from Hosted Weblate (#3077)
Translations update from [Hosted Weblate](https://hosted.weblate.org)
for
[LibreTime/Legacy](https://hosted.weblate.org/projects/libretime/legacy/).



Current translation status:

![Weblate translation
status](https://hosted.weblate.org/widget/libretime/legacy/horizontal-auto.svg)

Co-authored-by: Ihor Hordiichuk <igor_ck@outlook.com>
2024-09-11 21:37:19 +01:00
Weblate (bot)
905008d72c
chore(legacy): translations update from Hosted Weblate (#3076)
Translations update from [Hosted Weblate](https://hosted.weblate.org)
for
[LibreTime/Legacy](https://hosted.weblate.org/projects/libretime/legacy/).



Current translation status:

![Weblate translation
status](https://hosted.weblate.org/widget/libretime/legacy/horizontal-auto.svg)

Co-authored-by: gallegonovato <fran-carro@hotmail.es>
2024-09-10 21:40:35 +01:00
libretime-bot
3b768644b2 chore(legacy): update locales 2024-09-09 02:14:15 +00:00
renovate[bot]
43f286c53d
chore(deps): update dependency friendsofphp/php-cs-fixer to <3.64.1 (#3058) 2024-09-07 21:14:32 +02:00
Jonas L.
a3865aa6ee
fix: add missing file for nb_NO locale (#3075)
### Description

Related to #3073
2024-09-07 21:13:52 +02:00
Jonas L.
e614fbcf6c
feat: add Norwegian Bokmål locale (#3073)
### Description

Locale was requested on Weblate.
2024-09-06 14:43:40 +01:00
renovate[bot]
d929871060 chore(deps): lock file maintenance (legacy/composer.json) 2024-09-03 10:37:34 +00:00
dakriy
8c26505622
feat(legacy): order by filename when lptime is null (#3069)
### 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
2024-08-24 07:47:25 +01:00
dakriy
c883d0f2d5
fix(legacy): fix filename criteria searching (#3068)
### 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.
2024-08-20 22:39:53 +01:00
renovate[bot]
f5355d6b61
chore(deps): lock file maintenance (legacy/composer.json) (#3067)
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Update | Change |
|---|---|
| lockFileMaintenance | All locks refreshed |

🔧 This Pull Request updates lock files to use the latest dependency
versions.

---

### Configuration

📅 **Schedule**: Branch creation - "after 4am and before 5am on monday"
(UTC), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

👻 **Immortal**: This PR will be recreated if closed unmerged. Get
[config help](https://togithub.com/renovatebot/renovate/discussions) if
that's undesired.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend
Renovate](https://www.mend.io/free-developer-tools/renovate/). View the
[repository job
log](https://developer.mend.io/github/libretime/libretime).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzOC4yMC4xIiwidXBkYXRlZEluVmVyIjoiMzguMjAuMSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiZGVwZW5kZW5jaWVzIiwicGhwIl19-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-08-13 12:39:37 +01:00
Weblate (bot)
482f2215a0
chore(legacy): translations update from Hosted Weblate (#3055)
Translations update from [Hosted Weblate](https://hosted.weblate.org)
for
[LibreTime/Legacy](https://hosted.weblate.org/projects/libretime/legacy/).



Current translation status:

![Weblate translation
status](https://hosted.weblate.org/widget/libretime/legacy/horizontal-auto.svg)

Co-authored-by: Ihor Hordiichuk <igor_ck@outlook.com>
2024-07-08 21:20:21 +01:00
Weblate (bot)
dad3d74188
chore(legacy): translations update from Hosted Weblate (#3046)
Translations update from [Hosted Weblate](https://hosted.weblate.org)
for
[LibreTime/Legacy](https://hosted.weblate.org/projects/libretime/legacy/).



Current translation status:

![Weblate translation
status](https://hosted.weblate.org/widget/libretime/legacy/horizontal-auto.svg)

Co-authored-by: gallegonovato <fran-carro@hotmail.es>
2024-06-28 19:23:03 +01:00
renovate[bot]
609b4e7a03 chore(deps): lock file maintenance (legacy/composer.json) 2024-06-25 09:45:08 +00:00
libretime-bot
e5aceef71a chore(legacy): update locales 2024-06-24 02:01:54 +00:00
Jonas L
4e0953d513
refactor: remove non existent asset file (#3042)
The file is non existent.

Added in c669d3cb47a3092ac27fb3995f0dc72955f0740d

Removed in ea2a6b3f68c59d98986b6d3f4c9b70137366990f
2024-06-22 17:18:16 +02:00
dakriy
4642b6c08e
feat(legacy): add filename block criteria (#3015)
### Description

Adds filename block criteria because sometimes you just need the
filename and the ID3 tags won't do.

Closes  #3014
2024-06-22 11:51:59 +02:00
renovate[bot]
7f3f318601
chore(deps): update dependency friendsofphp/php-cs-fixer to <3.59.4 (#3030)
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
|
[friendsofphp/php-cs-fixer](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer)
| `<3.58.2` -> `<3.59.4` |
[![age](https://developer.mend.io/api/mc/badges/age/packagist/friendsofphp%2fphp-cs-fixer/3.59.3?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/packagist/friendsofphp%2fphp-cs-fixer/3.59.3?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/packagist/friendsofphp%2fphp-cs-fixer/3.58.1/3.59.3?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/packagist/friendsofphp%2fphp-cs-fixer/3.58.1/3.59.3?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>PHP-CS-Fixer/PHP-CS-Fixer (friendsofphp/php-cs-fixer)</summary>

###
[`v3.59.3`](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/blob/HEAD/CHANGELOG.md#Changelog-for-v3593)

[Compare
Source](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/compare/v3.59.2...v3.59.3)

- refactor: refactor to templated trait+interface
([#&#8203;7988](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7988))

###
[`v3.59.2`](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/blob/HEAD/CHANGELOG.md#Changelog-for-v3592)

[Compare
Source](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/compare/v3.59.1...v3.59.2)

- fix: "list" is reserved type
([#&#8203;8087](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/8087))
- chore: add missing type in method prototype
([#&#8203;8088](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/8088))
- CI: bump Ubuntu version
([#&#8203;8086](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/8086))
- deps: bump infection to unblock PHPUnit 11, and few more as chore
([#&#8203;8083](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/8083))

###
[`v3.59.1`](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/blob/HEAD/CHANGELOG.md#Changelog-for-v3591)

[Compare
Source](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/compare/v3.59.0...v3.59.1)

- fix: Bump React's JSON decoder buffer size
([#&#8203;8068](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/8068))
- docs: options - handle enums in dicts
([#&#8203;8082](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/8082))

###
[`v3.59.0`](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/blob/HEAD/CHANGELOG.md#Changelog-for-v3590)

[Compare
Source](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/compare/v3.58.1...v3.59.0)

- feat(Docker): Multi-arch build (support for `arm64`)
([#&#8203;8079](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/8079))
- feat: `@PhpCsFixer` ruleset - normalise implicit backslashes in single
quoted strings
([#&#8203;7965](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7965))
- feat: `SimpleToComplexStringVariableFixer` - support variable being an
array
([#&#8203;8064](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/8064))
- fix: Look up for PHPDoc's variable name by only chars allowed in the
variables
([#&#8203;8062](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/8062))
- fix: Update `PhpUnitTestCaseStaticMethodCallsFixer::STATIC_METHODS`
([#&#8203;8073](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/8073))
- fix: `native_constant_invocation` - array constants with native
constant names
([#&#8203;8008](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/8008))
- chore: update PHPStan
([#&#8203;8060](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/8060))
- CI: Update PHPStan to 1.11.4
([#&#8203;8074](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/8074))
- docs: don't expose list as config type for dicts
([#&#8203;8081](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/8081))
- docs: Make wording in `final_class` docs less dismissive
([#&#8203;8065](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/8065))
- docs: Update 1-bug_report.yml
([#&#8203;8067](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/8067))
- DX: Remove version from Docker Compose files
([#&#8203;8061](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/8061))

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR has been generated by [Mend
Renovate](https://www.mend.io/free-developer-tools/renovate/). View
repository job log
[here](https://developer.mend.io/github/libretime/libretime).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNy4zOTMuMCIsInVwZGF0ZWRJblZlciI6IjM3LjM5My4wIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJkZXBlbmRlbmNpZXMiLCJwaHAiXX0=-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-06-22 11:45:50 +02:00
dakriy
451652bc40
feat(legacy): add current date macro to string block criteria (#3013)
### 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
2024-06-22 11:19:21 +02:00
renovate[bot]
826aac1c05
chore(deps): lock file maintenance (legacy/composer.json) (#3033)
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Update | Change |
|---|---|
| lockFileMaintenance | All locks refreshed |

🔧 This Pull Request updates lock files to use the latest dependency
versions.

---

### Configuration

📅 **Schedule**: Branch creation - "after 4am and before 5am on monday"
(UTC), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

👻 **Immortal**: This PR will be recreated if closed unmerged. Get
[config help](https://togithub.com/renovatebot/renovate/discussions) if
that's undesired.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR has been generated by [Mend
Renovate](https://www.mend.io/free-developer-tools/renovate/). View
repository job log
[here](https://developer.mend.io/github/libretime/libretime).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNy40MTAuMSIsInVwZGF0ZWRJblZlciI6IjM3LjQxMC4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJkZXBlbmRlbmNpZXMiLCJwaHAiXX0=-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-06-18 09:18:21 +01:00
libretime-bot
01253b31fc chore(legacy): update locales 2024-06-10 02:02:19 +00:00
renovate[bot]
5ed15f9722
chore(deps): update dependency friendsofphp/php-cs-fixer to <3.58.2 (#3016)
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
|
[friendsofphp/php-cs-fixer](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer)
| `<3.56.2` -> `<3.58.2` |
[![age](https://developer.mend.io/api/mc/badges/age/packagist/friendsofphp%2fphp-cs-fixer/3.58.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/packagist/friendsofphp%2fphp-cs-fixer/3.58.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/packagist/friendsofphp%2fphp-cs-fixer/3.56.1/3.58.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/packagist/friendsofphp%2fphp-cs-fixer/3.56.1/3.58.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>PHP-CS-Fixer/PHP-CS-Fixer (friendsofphp/php-cs-fixer)</summary>

###
[`v3.58.1`](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/blob/HEAD/CHANGELOG.md#Changelog-for-v3581)

[Compare
Source](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/compare/v3.58.0...v3.58.1)

- fix: `ConstantCaseFixer` - do not change class constant usages
([#&#8203;8055](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/8055))
- fix: `PhpUnitTestClassRequiresCoversFixer` - do not add annotation
when attribute with leading slash present
([#&#8203;8054](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/8054))

###
[`v3.58.0`](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/blob/HEAD/CHANGELOG.md#Changelog-for-v3580)

[Compare
Source](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/compare/v3.57.2...v3.58.0)

- chore(doc): Use FQCN for parallel config in documentation
([#&#8203;8029](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/8029))
- chore: fix typo in `PhpUnitTestClassRequiresCoversFixerTest`
([#&#8203;8047](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/8047))
- chore: RandomApiMigrationFixer - do not modify configuration property
([#&#8203;8033](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/8033))
- chore: Tokens::setCode - further improvements to cache
([#&#8203;8053](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/8053))
- chore: update PHPStan
([#&#8203;8045](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/8045))
- docs: Add missing imports in a cookbook about creating custom rules
([#&#8203;8031](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/8031))
- docs: fix deprecated string interpolation style
([#&#8203;8036](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/8036))
- docs: global_namespace_import - simplify allowed config types
([#&#8203;8023](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/8023))
- feat(GroupImportFixer): Ability to configure which type of imports
should be grouped
([#&#8203;8046](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/8046))
- fix: clear `Tokens::$blockStartCache` and `Tokens::$blockEndCache`
when calling `Tokens::setCode`
([#&#8203;8051](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/8051))
- fix: correctly handle PHP closing tag with `simplified_null_return`
([#&#8203;8049](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/8049))
- fix: `ConstantCaseFixer` - do not change namespace
([#&#8203;8004](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/8004))
- fix: `PhpUnitAttributesFixer` - do not add attribute if already
present
([#&#8203;8043](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/8043))
- fix: `PhpUnitSizeClassFixer` - do not add annotation when there are
attributes
([#&#8203;8044](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/8044))
- fix: `PhpUnitTestClassRequiresCoversFixer` - attribute detection when
class is `readonly`
([#&#8203;8042](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/8042))

###
[`v3.57.2`](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/blob/HEAD/CHANGELOG.md#Changelog-for-v3572)

[Compare
Source](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/compare/v3.57.1...v3.57.2)

- docs: better ConfigurableFixer allowed types
([#&#8203;8024](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/8024))
- docs: Improve Docker usage example
([#&#8203;8021](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/8021))
- feat: Report used memory to 2 decimal digits only
([#&#8203;8017](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/8017))
- fix: Support named args in `ParallelConfigFactory::detect()`
([#&#8203;8026](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/8026))
- fix: `php_unit_test_class_requires_covers` Attribute detection when
class is final
([#&#8203;8016](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/8016))

###
[`v3.57.1`](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/blob/HEAD/CHANGELOG.md#Changelog-for-v3571)

[Compare
Source](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/compare/v3.57.0...v3.57.1)

- chore: update PHPDoc in `Preg::matchAll`
([#&#8203;8012](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/8012))
- fix: Runner - handle no files while in parallel runner
([#&#8203;8015](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/8015))

###
[`v3.57.0`](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/blob/HEAD/CHANGELOG.md#Changelog-for-v3570)

[Compare
Source](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/compare/v3.56.2...v3.57.0)

- feat: Ability to run Fixer with parallel runner 🎉
([#&#8203;7777](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7777))

###
[`v3.56.2`](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/blob/HEAD/CHANGELOG.md#Changelog-for-v3562)

[Compare
Source](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/compare/v3.56.1...v3.56.2)

- chore: update PHPStan
([#&#8203;8010](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/8010))
- DX: Fix Mess Detector violations
([#&#8203;8007](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/8007))
- DX: Install PCov extension for local Docker
([#&#8203;8006](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/8006))

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR has been generated by [Mend
Renovate](https://www.mend.io/free-developer-tools/renovate/). View
repository job log
[here](https://developer.mend.io/github/libretime/libretime).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNy4zNjMuNSIsInVwZGF0ZWRJblZlciI6IjM3LjM3Ny44IiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJkZXBlbmRlbmNpZXMiLCJwaHAiXX0=-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-06-07 21:52:47 +02:00