Compare commits

...

196 Commits
4.0.0 ... main

Author SHA1 Message Date
Scott McGrath 5b4c720e10
fix(playout): improve the way hashlib is called in libretime_playout/player ()
### Description

Improves the way hashlib is called in libretime_playout/player so that
is isn't broken on systems with python < 3.9

The way it is currently called in
site-packages/libretime_playout/player/file.py, in the section where
scheduled files are copied to the cache dir for playout, specifies the
usedforsecurity=False flag as follows:
`hasher = hashlib.md5(usedforsecurity=False)`

hashlib.md5 did not support this flag until Python 3.9. Attempting to
specify the flag directly as an argument to hashlib.md5(), in an older
python environment (such as that in Ubuntu Focal 20.04), is unsafe, and
can cause hashlib.md5() to balk/throw an exception, which results in
file copy operations failing. This then precipitates into playout
problems, as scheduled media is missing from the cache folder.


This PR instead calls using hashlib.new(), and passes the argument to
that, as follows:
`hasher = hashlib.new('md5', usedforsecurity=False)`

This method of calling with the flag argument is safer, because the
constructor will take it or leave it gracefully, regardless of whether
the system has a version of hashlib that supports the `usedforsecurity`
flag. AFAICT, it improves (fixes) function on older systems without
negatively impacting others.

### Testing Notes

**What I did:**
Before applying this patch, we were experiencing occasional but fairly
regular periods of silence when the system was supposed to be playing a
song or track. This behavior was consistent with errors such as the
following being present in the playout log:
```
2025-01-15 14:01:28,331 | INFO     | libretime_playout.player.file:copy_file:47 - copying file 19834 to cache /var/lib/libretime/playout/scheduler/19834.mp3
2025-01-15 14:01:28,466 | ERROR    | libretime_playout.player.file:copy_file:77 - could not copy file 19834 to /var/lib/libretime/playout/scheduler/19834.mp3: 'usedforsecurity' is an invalid keyword argument for openssl_md5()
Traceback (most recent call last):
  File "/opt/libretime/lib/python3.8/site-packages/libretime_playout/player/file.py", line 70, in copy_file
    file_event.filesize = self.report_file_size_and_md5_to_api(
  File "/opt/libretime/lib/python3.8/site-packages/libretime_playout/player/file.py", line 89, in report_file_size_and_md5_to_api
    hasher = hashlib.md5(usedforsecurity=False)
TypeError: 'usedforsecurity' is an invalid keyword argument for openssl_md5()
```
_For more information about the characterization and results of this
problem, see issue #3134_

**Testing on running systems**
After the patch was applied, these errors were no longer seen. I first
tested this on a dev server, and then on a live server, with
approximately 100 distinct tracks of playout occurring over about 24
hours. There were no file copy failures, and no related playout
problems, which was a major and immediate improvement.

**Testing installer, fresh installs**
***Ubuntu 20.04***
I deployed a patch to the installer and installed it on a blank system
running Ubuntu 20.04 and tested it to make sure the fix was applied and
worked.

***Debian 11***
I deployed patch to the installer and installed it on a blank system
running Debian Bullseye (which runs python = 3.9) , and tested it there
to make sure it did not break anything or introduce a regression.


### **Links**

Closes: 
2025-01-17 23:11:02 +00:00
Kyle Robbertze a14f1bec0b
ci: only check last commit for API schema in PRs ()
### Description

PRs are intended to be squashed to a single commit. Only checking the
last commit gives us the intended state of the repo and ensures that if
the author commits the schema fixes later, the CI passes as expected.
Currently, the CI will fail because the earlier commits still have an
out of date schema.
2025-01-10 16:56:39 +00:00
nosbig 203c927554
feat: add flac support to Web player ()
### Description

Added support for previewing FLAC files in the web interface, provided
in  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: 

---------

Co-authored-by: Kyle Robbertze <kyle@paddatrapper.com>
2025-01-10 15:46:18 +00:00
Kyle Robbertze 6f5275176e
chore: update docker compose commands ()
### Description

Upstream has renamed docker-compose to docker compose for all commands

**This is a new feature**:

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

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

Yes
2025-01-09 16:09:28 +00:00
Scott McGrath 644d2b9ce5
fix(legacy): additional specifics added to CSVexport.js for RFC 4180 ()
### 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: 
2025-01-09 08:34:13 +00:00
Kyle Robbertze 267da9e438
chore: add pre-commit API check ()
### Description

This is a way of ensuring the schema is up to date with every change.
This should be extended by fixing the PR api schema pipeline to squash
down all PR commits into a single change and checking the API schema for
that. Otherwise people will fix the schema after a failed pipeline and
the pipeline will continue to fail
2025-01-09 07:53:49 +00:00
Keoni Mahelona b1bdd6d9be
feat(api): added filters on genre & md5 for files api ()
### Description
Added filters for genre and md5 to the files API, e.g.
`/api/v2/files?genre=soul`

**This is a new feature**: Yes

**I have updated the documentation to reflect these changes**: No
There should be a schema and docs that are generated automatically. I
don't know where that is.


### Testing Notes

**What I did:**
- Used docker to deploy locally
- Confirmed filters work at
http://localhost:8080/api/v2/files?genre=Soul

**How you can replicate my testing:**
- `make clean dev`
- Upload some files!
- Visit http://localhost:8080/api/v2/files
- You can use the filters
<img width="658" alt="Screenshot 2024-12-23 at 01 36 01"
src="https://github.com/user-attachments/assets/ba19f7f3-fb3e-495d-8937-d451c70d326c"
/>
<img width="652" alt="Screenshot 2024-12-23 at 01 35 56"
src="https://github.com/user-attachments/assets/c7191131-a963-463a-b52f-9d0952192555"
/>

_How can the reviewer validate this PR?_
- See above
- wrote tests to confirm filters work
2025-01-08 16:54:53 +00:00
Kyle Robbertze 92ca6b0341
ci: make libretime test user owner of test database ()
Fix the legacy tests
2025-01-08 16:53:45 +00:00
Weblate (bot) 7f40743d83
chore(legacy): translations update from Hosted Weblate ()
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
Scott McGrath 82d5af2dfb
fix(legacy): migrations from airtime 2.5.1 ()
### Description

This fixes various problems in legacy migrations that were preventing a
successful database migration from Airtime 2.5.1. Previously, following
[the
procedure](https://libretime.org/docs/admin-manual/install/migrate-from-airtime/)
using the migrations provided in the Libretime 4.2.0 installer, without
the fixes in this PR, would either fail completely, or cause all of the
imported data to be completely deleted.


_migrations.py
If schema_version is not found in the table cc_prefs, it then checks for
system_version to have a value of '2.5.1' (in case this is an airtime
2.5.1 migration which will not have any schema_version in cc_pref). If
found, it prevents loading of the schema file, which is critical to
preserving the imported Airtime data.

0006_2_5_5
Removed a redundant addition of the image_path and description columns
to cc_show (done in earlier migration 003_2_5_2)

0015_2_5_17
Fixed a syntax error with adding the artwork column to cc_files

0023_3_0_0_alpha_9_1
Removed a redundant addition of the artwork column to cc_files (done in
earlier migration 0015_2_5_7)

### Documentation Changes

The [airtime migration
documentation](https://libretime.org/docs/admin-manual/install/migrate-from-airtime/)
already suggests a procedure to be followed, it just didn't work because
of problems within these migrations. The procedure as documented should
now work for those coming from Airtime 2.5.1.

### Testing Notes

**What I did:**

I attempted to migrate an actual airtime 2.5.1 database from a
production system containing a large amount of shows, tracks, and users.
I observed that the migration completed without errors, and that the
expected system state was achieved within Libretime. Specifically, the
calendar, library, authentication, and other aspects are populated with
the data that was present in the migrated Airtime database, and
Libretime is able to function using this data.

**How you can replicate my testing:**

Install Libretime 4.2.0. Restore a sample postrgresql database backup
from an Airtime 2.5.1 server. Apply the database migration. Restart the
services. Login and view the library, calender, etc.

### **Links**

Closes:   
May also be related to, or even close (as a duplicate): 
2024-12-21 10:09:19 +00:00
libretime-bot cf172d5c7c chore(legacy): update locales 2024-12-09 02:37:27 +00:00
renovate[bot] f1c9ebf6f2
chore(deps): update dependency drf-spectacular to >=0.22.1,<0.29 ()
This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
|
[drf-spectacular](https://redirect.github.com/tfranzel/drf-spectacular)
| `>=0.22.1,<0.28` -> `>=0.22.1,<0.29` |
[![age](https://developer.mend.io/api/mc/badges/age/pypi/drf-spectacular/0.28.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/pypi/drf-spectacular/0.28.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/pypi/drf-spectacular/0.27.2/0.28.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/drf-spectacular/0.27.2/0.28.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>tfranzel/drf-spectacular (drf-spectacular)</summary>

###
[`v0.28.0`](https://redirect.github.com/tfranzel/drf-spectacular/blob/HEAD/CHANGELOG.rst#0280-2024-11-30)

[Compare
Source](https://redirect.github.com/tfranzel/drf-spectacular/compare/0.27.2...0.28.0)

- Fix lazy_reverse bug in views (`#&#8203;1339
<https://github.com/tfranzel/drf-spectacular/issues/1339>`\_)
- Extend query params explosion of non-DRF serializer `#&#8203;1315
<https://github.com/tfranzel/drf-spectacular/issues/1315>`\_
- consider pk_field on PrimaryKeyRelatedField when set `#&#8203;1335
<https://github.com/tfranzel/drf-spectacular/issues/1335>`\_
- fix unused OAuth2 scopes override `#&#8203;1319
<https://github.com/tfranzel/drf-spectacular/issues/1319>`\_
-   bugfix @&#8203;extend_schema_field raw schema already in OAS3.1
- some minors (resolves `#&#8203;1147
<https://github.com/tfranzel/drf-spectacular/issues/1147>`\_)
- fix OAS3.1 validator omission `#&#8203;1302
<https://github.com/tfranzel/drf-spectacular/issues/1302>`\_
- guard against broken **dir** impl `#&#8203;1296
<https://github.com/tfranzel/drf-spectacular/issues/1296>`\_
-   Add Django 5.1 as classifier \[jelmert]
-   No extra items in the oneOf list \[Vladimir]
- parametrize component registry identity `#&#8203;1288
<https://github.com/tfranzel/drf-spectacular/issues/1288>`\_
- make operation_id action position configurable `#&#8203;1264
<https://github.com/tfranzel/drf-spectacular/issues/1264>`\_
-   Fix for incorrect `issubclass()` check. \[Mike Moore]
- Correct the documentation of how to import extension snippets \[Alan
Crosswell]
-   Update OpenAPI docs links \[Nils Van Zuijlen]
- mitigate false positive in Django Debug Toolbar `#&#8203;1159
<https://github.com/tfranzel/drf-spectacular/issues/1159>`\_
-   Additional testcase \[Marti Raudsepp]
- Fix ChoiceField schema type with empty `choices=[]` \[Marti Raudsepp]
-   handle examples with nested properties pagination \[François Rejeté]
- add choice field display method handling `#&#8203;1228
<https://github.com/tfranzel/drf-spectacular/issues/1228>`\_
- Add support for stateless user authentication in SimpleJWT
(`#&#8203;1221
<https://github.com/tfranzel/drf-spectacular/issues/1221>`\_) \[Willem
Meints]
-   fix: set pydantic json mode to serialization \[Eric Butler]
-   fix: extend_schema_field with dict param and oas 3.1 \[Eric Butler]

Breaking changes / important additions:

-   Y-stream release due to the amount of small but important changes.
- Pydantic users might see a slightly different schema due to the change
in serialization method.

</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 these
updates again.

---

- [ ] <!-- 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:eyJjcmVhdGVkSW5WZXIiOiIzOS4xOS4wIiwidXBkYXRlZEluVmVyIjoiMzkuNDIuNCIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiZGVwZW5kZW5jaWVzIiwicHl0aG9uIl19-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-12-07 12:13:03 +00:00
dakriy 2985d8554a
feat(legacy): trused header sso auth ()
### 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 ()
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
Kyle Robbertze 38a0bf98b2 fix: regenerate API schema 2024-12-07 10:06:24 +00:00
renovate[bot] 3be4bd7da1
chore(deps): update pre-commit hook adamchainz/django-upgrade to v1.22.2 ()
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
|
[adamchainz/django-upgrade](https://redirect.github.com/adamchainz/django-upgrade)
| repository | patch | `1.22.1` -> `1.22.2` |

Note: The `pre-commit` manager in Renovate is not supported by the
`pre-commit` maintainers or community. Please do not report any problems
there, instead [create a Discussion in the Renovate
repository](https://redirect.github.com/renovatebot/renovate/discussions/new)
if you have any questions.

---

### Release Notes

<details>
<summary>adamchainz/django-upgrade (adamchainz/django-upgrade)</summary>

###
[`v1.22.2`](https://redirect.github.com/adamchainz/django-upgrade/blob/HEAD/CHANGELOG.rst#1222-2024-12-02)

[Compare
Source](https://redirect.github.com/adamchainz/django-upgrade/compare/1.22.1...1.22.2)

- Make these fixers work when `django.contrib.gis.db.models` is used to
import objects from `django.db.models`:

    -   `check_constraint_condition`
    -   `index_together`

`Issue #&#8203;513
<https://github.com/adamchainz/django-upgrade/issues/513>`\__.

</details>

---

### Configuration

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

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, 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 was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/libretime/libretime).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzOS40Mi40IiwidXBkYXRlZEluVmVyIjoiMzkuNDIuNCIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiZGVwZW5kZW5jaWVzIl19-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-12-04 10:22:41 +00:00
renovate[bot] c0bb7df0ed
chore(deps): lock file maintenance (legacy/composer.json) ()
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) ()
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
dakriy 02a779b413
feat(analyzer): parse comment fields from mp3 files ()
### Description

Upload comments from mp3 files into libretime `comments` and
`description` fields.

**This is a new feature**:

Yes

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

No none required

### Testing Notes

**What I did:**

I uploaded tracks that contained comments into LibreTime and checked the
database to ensure that the `comments` and `description` fields were
correctly populated. I then went to the UI and confirmed that the
description field had the MP3 comment in it inside of the metadata
editor. I then uploaded some files that did not have comments to make
sure I did not break any existing functionality.

**How you can replicate my testing:**

Follow the steps in what I did

### **Links**

Fixes 

---------

Co-authored-by: Kyle Robbertze <paddatrapper@users.noreply.github.com>
2024-11-22 18:28:06 +00:00
Kyle Robbertze ce257a1f35 fix: regenerate API schema 2024-11-22 18:21:03 +00:00
Weblate (bot) 1939b0aec0
chore(legacy): translations update from Hosted Weblate ()
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
Thomas Göttgens 2ac7e8a506
feat(api): enable writes to schedule table ()
this fixes 

---------

Co-authored-by: Kyle Robbertze <paddatrapper@users.noreply.github.com>
2024-11-18 16:10:54 +00:00
renovate[bot] 824f6d2f1b
chore(deps): update codecov/codecov-action action to v5 ()
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
|
[codecov/codecov-action](https://redirect.github.com/codecov/codecov-action)
| action | major | `v4` -> `v5` |

---

### Release Notes

<details>
<summary>codecov/codecov-action (codecov/codecov-action)</summary>

###
[`v5`](https://redirect.github.com/codecov/codecov-action/compare/v4...v5)

[Compare
Source](https://redirect.github.com/codecov/codecov-action/compare/v4...v5)

</details>

---

### Configuration

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

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, 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 was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/libretime/libretime).

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

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-11-16 00:29:08 +00:00
Weblate (bot) 013d68e880
chore(legacy): translations update from Hosted Weblate ()
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] 83b56f9cd0
chore(deps): update lycheeverse/lychee-action action to v2.1.0 ()
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
|
[lycheeverse/lychee-action](https://redirect.github.com/lycheeverse/lychee-action)
| action | minor | `v2.0.2` -> `v2.1.0` |

---

### Release Notes

<details>
<summary>lycheeverse/lychee-action (lycheeverse/lychee-action)</summary>

###
[`v2.1.0`](https://redirect.github.com/lycheeverse/lychee-action/releases/tag/v2.1.0):
Version 2.1.0

[Compare
Source](https://redirect.github.com/lycheeverse/lychee-action/compare/v2.0.2...v2.1.0)

#### What's Changed

- Add missing argument `failIfEmpty` by
[@&#8203;LitoMore](https://redirect.github.com/LitoMore) in
[https://github.com/lycheeverse/lychee-action/pull/261](https://redirect.github.com/lycheeverse/lychee-action/pull/261)
- Fix bugs about the exit code by
[@&#8203;YDX-2147483647](https://redirect.github.com/YDX-2147483647) in
[https://github.com/lycheeverse/lychee-action/pull/262](https://redirect.github.com/lycheeverse/lychee-action/pull/262)
- Bump lychee version to 0.17.0 by
[@&#8203;mre](https://redirect.github.com/mre) in
[https://github.com/lycheeverse/lychee-action/pull/263](https://redirect.github.com/lycheeverse/lychee-action/pull/263)

#### New Contributors

- [@&#8203;LitoMore](https://redirect.github.com/LitoMore) made their
first contribution in
[https://github.com/lycheeverse/lychee-action/pull/261](https://redirect.github.com/lycheeverse/lychee-action/pull/261)
- [@&#8203;YDX-2147483647](https://redirect.github.com/YDX-2147483647)
made their first contribution in
[https://github.com/lycheeverse/lychee-action/pull/262](https://redirect.github.com/lycheeverse/lychee-action/pull/262)

**Full Changelog**:
https://github.com/lycheeverse/lychee-action/compare/v2...v2.1.0

</details>

---

### Configuration

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

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, 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 was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/libretime/libretime).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzOS43LjEiLCJ1cGRhdGVkSW5WZXIiOiIzOS43LjEiLCJ0YXJnZXRCcmFuY2giOiJtYWluIiwibGFiZWxzIjpbImNpIiwiZGVwZW5kZW5jaWVzIl19-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-11-08 18:08:43 +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 ()
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
renovate[bot] 380c6d0944 chore(deps): update pre-commit hook asottile/pyupgrade to v3.19.0 2024-10-23 11:21:05 +00:00
Thomas Göttgens 7992a9be2d
fix: intro/outro playlist unset was impossible ()
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 ()
fixes 
2024-10-19 23:20:30 +01:00
renovate[bot] 188cd5d671
chore(deps): update dependency uvicorn to >=0.17.6,<0.33.0 ()
This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [uvicorn](https://redirect.github.com/encode/uvicorn)
([changelog](https://redirect.github.com/encode/uvicorn/blob/master/CHANGELOG.md))
| `>=0.17.6,<0.32.0` -> `>=0.17.6,<0.33.0` |
[![age](https://developer.mend.io/api/mc/badges/age/pypi/uvicorn/0.32.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/pypi/uvicorn/0.32.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/pypi/uvicorn/0.31.1/0.32.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/uvicorn/0.31.1/0.32.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>encode/uvicorn (uvicorn)</summary>

###
[`v0.32.0`](https://redirect.github.com/encode/uvicorn/blob/HEAD/CHANGELOG.md#0320-2024-10-15)

[Compare
Source](https://redirect.github.com/encode/uvicorn/compare/0.31.1...0.32.0)

##### Added

- Officially support Python 3.13
([#&#8203;2482](https://redirect.github.com/encode/uvicorn/issues/2482))
- Warn when `max_request_limit` is exceeded
([#&#8203;2430](https://redirect.github.com/encode/uvicorn/issues/2430))

</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 these
updates again.

---

- [ ] <!-- 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:eyJjcmVhdGVkSW5WZXIiOiIzOC4xMjAuMSIsInVwZGF0ZWRJblZlciI6IjM4LjEyMC4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJkZXBlbmRlbmNpZXMiLCJweXRob24iXX0=-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-10-17 17:49:25 +01:00
Weblate (bot) 74da2ef0b4
chore(legacy): translations update from Hosted Weblate ()
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
renovate[bot] 2f0422b1ae chore(deps): update lycheeverse/lychee-action action to v2.0.2 2024-10-16 00:51:33 +00:00
renovate[bot] 9ce88538d3 chore(deps): update pre-commit hook asottile/pyupgrade to v3.18.0 2024-10-15 22:03:30 +00:00
Thomas Göttgens 299be3c142
feat: use custom intro/outro playlists per show ()
### 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 ()
### 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 
2024-10-13 15:31:08 +02:00
dakriy 16deaf08c6
feat(legacy): show filename and size on edit page and add filename datatable column ()
### 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 
2024-10-13 08:45:54 +01:00
renovate[bot] 6d474c2733 chore(deps): update pre-commit hook adamchainz/django-upgrade to v1.22.1 2024-10-12 15:04:49 +00:00
renovate[bot] 2202618150
chore(deps): update lycheeverse/lychee-action action to v2 ()
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
|
[lycheeverse/lychee-action](https://redirect.github.com/lycheeverse/lychee-action)
| action | major | `v1.10.0` -> `v2.0.0` |

---

### Release Notes

<details>
<summary>lycheeverse/lychee-action (lycheeverse/lychee-action)</summary>

###
[`v2.0.0`](https://redirect.github.com/lycheeverse/lychee-action/releases/tag/v2.0.0):
Version 2.0.0

[Compare
Source](https://redirect.github.com/lycheeverse/lychee-action/compare/v1.10.0...v2.0.0)

#### Breaking Changes

**Note:** This release improves the action's robustness by changing
default behaviors. Changes are only required if you want to opt out of
the new failure conditions. Most users won't need to modify their
existing configurations.

##### Fail pipeline on error by default

We've changed the default behavior: pipelines will now fail on broken
links automatically. This addresses user feedback that not failing on
broken links was unexpected (see [issue
#&#8203;71](https://redirect.github.com/lycheeverse/lychee-action/issues/71)).

**What you need to do:**

-   Update to version 2 of this action to apply this change.
- Users of the `lychee-action@master` branch don't need to make any
changes, as `fail: true` has been the default there for a while.
- If you prefer the old behavior, explicitly set `fail` to `false` when
updating:

```yaml
- name: Link Checker
  id: lychee
  uses: lycheeverse/lychee-action@v2
  with:
    fail: false  # Don't fail action on broken links
```

##### Fail pipeline if no links were found

Similar to the above change, we now fail the pipeline if no links are
found during a run. This helps warn users about potential configuration
issues.

**What you need to do:**

- If you expect links to be found in your pipeline run, you don't need
to do anything.
- If you expect no links in your pipeline run, you can opt out like
this:

```yaml
- name: Link Checker
  id: lychee
  uses: lycheeverse/lychee-action@v2
  with:
    failIfEmpty: false  # Don't fail action if no links were found
```

For a more detailed description of the technical aspects behind these
changes, please see the full changelog below.

#### What's Changed

- feat: change to use the full version tag with v-\* prefix by
[@&#8203;kemingy](https://redirect.github.com/kemingy) in
[https://github.com/lycheeverse/lychee-action/pull/204](https://redirect.github.com/lycheeverse/lychee-action/pull/204)
- Add `failIfEmpty` argument (fixes
[#&#8203;84](https://redirect.github.com/lycheeverse/lychee-action/issues/84))
by [@&#8203;mre](https://redirect.github.com/mre) in
[https://github.com/lycheeverse/lychee-action/pull/86](https://redirect.github.com/lycheeverse/lychee-action/pull/86)
- Fail pipeline on error by default (fixes
[#&#8203;71](https://redirect.github.com/lycheeverse/lychee-action/issues/71))
by [@&#8203;mre](https://redirect.github.com/mre) in
[https://github.com/lycheeverse/lychee-action/pull/85](https://redirect.github.com/lycheeverse/lychee-action/pull/85)
- Exit in case output is set in args and action input by
[@&#8203;mre](https://redirect.github.com/mre) in
[https://github.com/lycheeverse/lychee-action/pull/227](https://redirect.github.com/lycheeverse/lychee-action/pull/227)
- v1 will automatically use latest version by
[@&#8203;jacobdalamb](https://redirect.github.com/jacobdalamb) in
[https://github.com/lycheeverse/lychee-action/pull/228](https://redirect.github.com/lycheeverse/lychee-action/pull/228)
- Remove unneeded text by
[@&#8203;jacobdalamb](https://redirect.github.com/jacobdalamb) in
[https://github.com/lycheeverse/lychee-action/pull/229](https://redirect.github.com/lycheeverse/lychee-action/pull/229)
- Clarify README.md defaults by
[@&#8203;paddyroddy](https://redirect.github.com/paddyroddy) in
[https://github.com/lycheeverse/lychee-action/pull/230](https://redirect.github.com/lycheeverse/lychee-action/pull/230)
- Adjust for new asset naming scheme by
[@&#8203;dscho](https://redirect.github.com/dscho) in
[https://github.com/lycheeverse/lychee-action/pull/234](https://redirect.github.com/lycheeverse/lychee-action/pull/234)
- Test various lychee versions by
[@&#8203;mre](https://redirect.github.com/mre) in
[https://github.com/lycheeverse/lychee-action/pull/235](https://redirect.github.com/lycheeverse/lychee-action/pull/235)
- Better cleanup of old lychee assets by
[@&#8203;mre](https://redirect.github.com/mre) in
[https://github.com/lycheeverse/lychee-action/pull/237](https://redirect.github.com/lycheeverse/lychee-action/pull/237)
- Bump peter-evans/create-issue-from-file from v4 to v5 by
[@&#8203;AndreiCherniaev](https://redirect.github.com/AndreiCherniaev)
in
[https://github.com/lycheeverse/lychee-action/pull/241](https://redirect.github.com/lycheeverse/lychee-action/pull/241)
- Remove dots from table by
[@&#8203;AndreiCherniaev](https://redirect.github.com/AndreiCherniaev)
in
[https://github.com/lycheeverse/lychee-action/pull/242](https://redirect.github.com/lycheeverse/lychee-action/pull/242)
- README: update actions/cache to v4 by
[@&#8203;sebastiaanspeck](https://redirect.github.com/sebastiaanspeck)
in
[https://github.com/lycheeverse/lychee-action/pull/243](https://redirect.github.com/lycheeverse/lychee-action/pull/243)
- Set exit_code correctly as output by
[@&#8203;sebastiaanspeck](https://redirect.github.com/sebastiaanspeck)
in
[https://github.com/lycheeverse/lychee-action/pull/245](https://redirect.github.com/lycheeverse/lychee-action/pull/245)
- action: fix failing CI by
[@&#8203;sebastiaanspeck](https://redirect.github.com/sebastiaanspeck)
in
[https://github.com/lycheeverse/lychee-action/pull/246](https://redirect.github.com/lycheeverse/lychee-action/pull/246)
- Split up steps in action by
[@&#8203;mre](https://redirect.github.com/mre) in
[https://github.com/lycheeverse/lychee-action/pull/248](https://redirect.github.com/lycheeverse/lychee-action/pull/248)
- Bump version to 0.16.x, respect new tag names by
[@&#8203;mre](https://redirect.github.com/mre) in
[https://github.com/lycheeverse/lychee-action/pull/249](https://redirect.github.com/lycheeverse/lychee-action/pull/249)
- Test latest lychee version tag by
[@&#8203;mre](https://redirect.github.com/mre) in
[https://github.com/lycheeverse/lychee-action/pull/236](https://redirect.github.com/lycheeverse/lychee-action/pull/236)

#### New Contributors

- [@&#8203;kemingy](https://redirect.github.com/kemingy) made their
first contribution in
[https://github.com/lycheeverse/lychee-action/pull/204](https://redirect.github.com/lycheeverse/lychee-action/pull/204)
- [@&#8203;paddyroddy](https://redirect.github.com/paddyroddy) made
their first contribution in
[https://github.com/lycheeverse/lychee-action/pull/230](https://redirect.github.com/lycheeverse/lychee-action/pull/230)
- [@&#8203;dscho](https://redirect.github.com/dscho) made their first
contribution in
[https://github.com/lycheeverse/lychee-action/pull/234](https://redirect.github.com/lycheeverse/lychee-action/pull/234)
- [@&#8203;AndreiCherniaev](https://redirect.github.com/AndreiCherniaev)
made their first contribution in
[https://github.com/lycheeverse/lychee-action/pull/241](https://redirect.github.com/lycheeverse/lychee-action/pull/241)
- [@&#8203;sebastiaanspeck](https://redirect.github.com/sebastiaanspeck)
made their first contribution in
[https://github.com/lycheeverse/lychee-action/pull/243](https://redirect.github.com/lycheeverse/lychee-action/pull/243)

**Full Changelog**:
https://github.com/lycheeverse/lychee-action/compare/v1...v1.11.0

</details>

---

### Configuration

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

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, 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 was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/libretime/libretime).

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

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-10-10 10:17:10 +01:00
renovate[bot] ba69de0a2b chore(deps): update pre-commit hook psf/black-pre-commit-mirror to v24.10.0 2024-10-09 04:05:54 +00:00
dakriy 32cad0faa4
fix(analyzer): make ffmpeg filters less aggressive ()
### Description

FFMPEG filters for silence detection are too aggressive.

**This is a new feature**:

No

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

No

### Testing Notes

**What I did:**

Ran tests and made sure they passed

**How you can replicate my testing:**

Upload files that start out quiet or end quiet and see that the
cue-in/cue-out points don't cut off the track. Or just run tests as
there are files that do that

### **Links**

Closes: 
2024-10-07 20:55:18 +01:00
renovate[bot] 2643813fb7 chore(deps): update pre-commit hook pre-commit/pre-commit-hooks to v5 2024-10-07 03:56:39 +00:00
renovate[bot] a37050df9e
chore(deps): update dependency uvicorn to >=0.17.6,<0.32.0 ()
This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [uvicorn](https://redirect.github.com/encode/uvicorn)
([changelog](https://redirect.github.com/encode/uvicorn/blob/master/CHANGELOG.md))
| `>=0.17.6,<0.31.0` -> `>=0.17.6,<0.32.0` |
[![age](https://developer.mend.io/api/mc/badges/age/pypi/uvicorn/0.31.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/pypi/uvicorn/0.31.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/pypi/uvicorn/0.30.6/0.31.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/uvicorn/0.30.6/0.31.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>encode/uvicorn (uvicorn)</summary>

###
[`v0.31.0`](https://redirect.github.com/encode/uvicorn/blob/HEAD/CHANGELOG.md#0310-2024-09-27)

[Compare
Source](https://redirect.github.com/encode/uvicorn/compare/0.30.6...0.31.0)

##### Added

Improve `ProxyHeadersMiddleware`
([#&#8203;2468](https://redirect.github.com/encode/uvicorn/issues/2468))
and
([#&#8203;2231](https://redirect.github.com/encode/uvicorn/issues/2231)):

- Fix the host for requests from clients running on the proxy server
itself.
- Fallback to host that was already set for empty x-forwarded-for
headers.
- Also allow to specify IP Networks as trusted hosts. This greatly
simplifies deployments
on docker swarm/kubernetes, where the reverse proxy might have a dynamic
IP.
    -   This includes support for IPv6 Address/Networks.

</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 these
updates again.

---

- [ ] <!-- 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:eyJjcmVhdGVkSW5WZXIiOiIzOC45Ny4wIiwidXBkYXRlZEluVmVyIjoiMzguOTcuMCIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiZGVwZW5kZW5jaWVzIiwicHl0aG9uIl19-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-09-30 16:32:04 +01:00
Kyle Robbertze bac903f4e5
chore: update django-stubs version ()
Upstream has fixed the issue.

Closes: 
2024-09-30 16:15:28 +01:00
Kyle Robbertze 81e8fa90ed
chore: fix linting ignore comments ()
### Description

There is now a too-many-positional-arguments check
2024-09-30 16:08:23 +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 ()
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 ()
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 () 2024-09-07 21:14:32 +02:00
Jonas L. a3865aa6ee
fix: add missing file for nb_NO locale ()
### Description

Related to #3073
2024-09-07 21:13:52 +02:00
renovate[bot] 4d737319d8 chore(deps): update pre-commit hook adamchainz/django-upgrade to v1.21.0 2024-09-07 18:41:07 +00:00
Jonas L. e614fbcf6c
feat: add Norwegian Bokmål locale ()
### 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
cdr78621 e344154d42
docs: update SoundExchange costs ()
updated the minimum SoundExchange royalties for
non-profits/non-commercial

### Description

_Short summary of what is the issue and the solution._

**This is a new feature**:

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

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

_Are there documentation changes required as a result of these changes?
See
https://github.com/libretime/libretime/wiki/Documentation-Requirements_

### Testing Notes

**What I did:**

_What did you do to validate this PR?_

**How you can replicate my testing:**

_How can the reviewer validate this PR?_

### **Links**

_Issues links or other related resources. Use the line Closes:
#bug_number to
link a bug in the issue tracker._
2024-08-29 08:57:12 +01:00
dakriy 8c26505622
feat(legacy): order by filename when lptime is null ()
### 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 ()
### 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) ()
[![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
renovate[bot] fdad983b48
chore(deps): update dependency gunicorn to v23 ()
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [gunicorn](https://togithub.com/benoitc/gunicorn)
([changelog](https://docs.gunicorn.org/en/stable/news.html)) |
`>=22.0.0,<22.1` -> `>=22.0.0,<23.1` |
[![age](https://developer.mend.io/api/mc/badges/age/pypi/gunicorn/23.0.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/pypi/gunicorn/23.0.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/pypi/gunicorn/22.0.0/23.0.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/gunicorn/22.0.0/23.0.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>benoitc/gunicorn (gunicorn)</summary>

###
[`v23.0.0`](https://togithub.com/benoitc/gunicorn/releases/tag/23.0.0)

[Compare
Source](https://togithub.com/benoitc/gunicorn/compare/22.0.0...23.0.0)

Gunicorn 23.0.0 has been released. This version fix the numerous
security vulnerabilities. You're invited to upgrade asap your own
installation.

# 23.0.0 - 2024-08-10

-   minor docs fixes (:pr:`3217`, :pr:`3089`, :pr:`3167`)
-   worker_class parameter accepts a class (:pr:`3079`)
- fix deadlock if request terminated during chunked parsing (:pr:`2688`)
- permit receiving Transfer-Encodings: compress, deflate, gzip
(:pr:`3261`)
- permit Transfer-Encoding headers specifying multiple encodings. note:
no parameters, still (:pr:`3261`)
- sdist generation now explicitly excludes sphinx build folder
(:pr:`3257`)
- decode bytes-typed status (as can be passed by gevent) as utf-8
instead of raising `TypeError` (:pr:`2336`)
- raise correct Exception when encounting invalid chunked requests
(:pr:`3258`)
- the SCRIPT_NAME and PATH_INFO headers, when received from allowed
forwarders, are no longer restricted for containing an underscore
(:pr:`3192`)
- include IPv6 loopback address `[::1]` in default for
:ref:`forwarded-allow-ips` and :ref:`proxy-allow-ips` (:pr:`3192`)

\*\* NOTE \*\*

- The SCRIPT_NAME change mitigates a regression that appeared first in
the 22.0.0 release
- Review your :ref:`forwarded-allow-ips` setting if you are still not
seeing the SCRIPT_NAME transmitted
- Review your :ref:`forwarder-headers` setting if you are missing
headers after upgrading from a version prior to 22.0.0

\*\* Breaking changes \*\*

-   refuse requests where the uri field is empty (:pr:`3255`)
- refuse requests with invalid CR/LR/NUL in heade field values
(:pr:`3253`)
- remove temporary `--tolerate-dangerous-framing` switch from 22.0
(:pr:`3260`)
- If any of the breaking changes affect you, be aware that now refused
requests can post a security problem, especially so in setups involving
request pipe-lining and/or proxies.

</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 these
updates again.

---

- [ ] <!-- 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:eyJjcmVhdGVkSW5WZXIiOiIzOC4yMC4xIiwidXBkYXRlZEluVmVyIjoiMzguMjAuMSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiZGVwZW5kZW5jaWVzIiwicHl0aG9uIl19-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-08-12 09:11:02 +01:00
renovate[bot] 4b5ab6a2ad
chore(deps): update pre-commit hook psf/black-pre-commit-mirror to v24.8.0 ()
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
|
[psf/black-pre-commit-mirror](https://togithub.com/psf/black-pre-commit-mirror)
| repository | minor | `24.4.2` -> `24.8.0` |

Note: The `pre-commit` manager in Renovate is not supported by the
`pre-commit` maintainers or community. Please do not report any problems
there, instead [create a Discussion in the Renovate
repository](https://togithub.com/renovatebot/renovate/discussions/new)
if you have any questions.

---

### Release Notes

<details>
<summary>psf/black-pre-commit-mirror
(psf/black-pre-commit-mirror)</summary>

###
[`v24.8.0`](https://togithub.com/psf/black-pre-commit-mirror/compare/24.4.2...24.8.0)

[Compare
Source](https://togithub.com/psf/black-pre-commit-mirror/compare/24.4.2...24.8.0)

</details>

---

### Configuration

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

🚦 **Automerge**: Enabled.

♻ **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 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:eyJjcmVhdGVkSW5WZXIiOiIzOC4yMC4xIiwidXBkYXRlZEluVmVyIjoiMzguMjAuMSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiZGVwZW5kZW5jaWVzIl19-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-08-07 16:29:11 +01:00
renovate[bot] 72692c4b77
chore(deps): update dependency django-filter to >=2.4.0,<24.4 ()
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [django-filter](https://togithub.com/carltongibson/django-filter)
([changelog](https://togithub.com/carltongibson/django-filter/blob/main/CHANGES.rst))
| `>=2.4.0,<24.3` -> `>=2.4.0,<24.4` |
[![age](https://developer.mend.io/api/mc/badges/age/pypi/django-filter/24.3?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/pypi/django-filter/24.3?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/pypi/django-filter/24.2/24.3?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/django-filter/24.2/24.3?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>carltongibson/django-filter (django-filter)</summary>

###
[`v24.3`](https://togithub.com/carltongibson/django-filter/blob/HEAD/CHANGES.rst#Version-243-2024-08-02)

[Compare
Source](https://togithub.com/carltongibson/django-filter/compare/24.2...24.3)

-   Adds official support for Django 5.1.

-   Allow using dictionaries for grouped choices on Django 5.0+.

    Thanks to Sævar Öfjörð Magnússon.

- Adds `unknown_field_behavior` FilterSet option to allowing warning and
ignore behaviours for unknown field types during FilterSet generation.

    Thanks to Loes.

</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 these
updates again.

---

- [ ] <!-- 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:eyJjcmVhdGVkSW5WZXIiOiIzNy40NDAuNyIsInVwZGF0ZWRJblZlciI6IjM3LjQ0MC43IiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJkZXBlbmRlbmNpZXMiLCJweXRob24iXX0=-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-08-04 12:43:07 +09:00
Kyle Robbertze 1f9a504996
ci: downgrade django-stubs to not install v5.x ()
### Description

This is until upstream fixes
https://github.com/typeddjango/django-stubs/issues/2304
2024-08-04 12:00:56 +09:00
Kyle Robbertze 65d435d9e7
ci: fix broken link check ()
### Description

Ubuntu no longer maintains the package list for bionic. Linked to from
old release notes
2024-08-04 11:47:37 +09:00
renovate[bot] 8136160125
chore(deps): update pre-commit hook asottile/pyupgrade to v3.17.0 ()
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [asottile/pyupgrade](https://togithub.com/asottile/pyupgrade) |
repository | minor | `v3.16.0` -> `v3.17.0` |

Note: The `pre-commit` manager in Renovate is not supported by the
`pre-commit` maintainers or community. Please do not report any problems
there, instead [create a Discussion in the Renovate
repository](https://togithub.com/renovatebot/renovate/discussions/new)
if you have any questions.

---

### Release Notes

<details>
<summary>asottile/pyupgrade (asottile/pyupgrade)</summary>

###
[`v3.17.0`](https://togithub.com/asottile/pyupgrade/compare/v3.16.0...v3.17.0)

[Compare
Source](https://togithub.com/asottile/pyupgrade/compare/v3.16.0...v3.17.0)

</details>

---

### Configuration

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

🚦 **Automerge**: Enabled.

♻ **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 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:eyJjcmVhdGVkSW5WZXIiOiIzNy40NDAuNyIsInVwZGF0ZWRJblZlciI6IjM3LjQ0MC43IiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJkZXBlbmRlbmNpZXMiXX0=-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-07-30 10:20:07 +09:00
renovate[bot] 9ee1783afd
chore(deps): update pre-commit hook adamchainz/django-upgrade to v1.20.0 ()
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
|
[adamchainz/django-upgrade](https://togithub.com/adamchainz/django-upgrade)
| repository | minor | `1.19.0` -> `1.20.0` |

Note: The `pre-commit` manager in Renovate is not supported by the
`pre-commit` maintainers or community. Please do not report any problems
there, instead [create a Discussion in the Renovate
repository](https://togithub.com/renovatebot/renovate/discussions/new)
if you have any questions.

---

### Release Notes

<details>
<summary>adamchainz/django-upgrade (adamchainz/django-upgrade)</summary>

###
[`v1.20.0`](https://togithub.com/adamchainz/django-upgrade/blob/HEAD/CHANGELOG.rst#1200-2024-07-19)

[Compare
Source](https://togithub.com/adamchainz/django-upgrade/compare/1.19.0...1.20.0)

- Fix the `admin_register` fixer to avoid rewriting when there are
duplicate `ModelAdmin` classes in the file.

`Issue #&#8203;471
<https://github.com/adamchainz/django-upgrade/issues/471>`\__.

</details>

---

### Configuration

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

🚦 **Automerge**: Enabled.

♻ **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:eyJjcmVhdGVkSW5WZXIiOiIzNy40MzEuNCIsInVwZGF0ZWRJblZlciI6IjM3LjQzMS40IiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJkZXBlbmRlbmNpZXMiXX0=-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-07-20 17:48:56 +01:00
Weblate (bot) 482f2215a0
chore(legacy): translations update from Hosted Weblate ()
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
Harry W 70735d4431
docs: use new docker compose command ()
Improve the Docker install documentation, along with the `docker
compose` commands.
2024-07-06 10:48:30 +01:00
renovate[bot] e0b1eba1bb chore(deps): update amannn/action-semantic-pull-request action to v5.5.3 2024-06-30 21:04:32 +00:00
Thomas Göttgens e095cb2a5f
fix: docker warnings "keywords casing do not match" ()
### Description

docker wants the 'AS' in uppercase if the 'FROM' is also in uppercase

### Testing Notes

These warnings are eliminated with this patch

``` => WARN: FromAsCasing: 'as' and 'FROM' keywords' casing do not match (line 5)                                                                                                                                    0.1s
 => WARN: FromAsCasing: 'as' and 'FROM' keywords' casing do not match (line 21)                                                                                                                                   0.1s
 => WARN: FromAsCasing: 'as' and 'FROM' keywords' casing do not match (line 51)                                                                                                                                   0.1s
 => WARN: FromAsCasing: 'as' and 'FROM' keywords' casing do not match (line 62)
[...]
```
2024-06-29 20:26:44 +01:00
Weblate (bot) dad3d74188
chore(legacy): translations update from Hosted Weblate ()
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] d97c4d427a
chore(deps): update pre-commit hook adamchainz/django-upgrade to v1.19.0 ()
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
|
[adamchainz/django-upgrade](https://togithub.com/adamchainz/django-upgrade)
| repository | minor | `1.18.0` -> `1.19.0` |

Note: The `pre-commit` manager in Renovate is not supported by the
`pre-commit` maintainers or community. Please do not report any problems
there, instead [create a Discussion in the Renovate
repository](https://togithub.com/renovatebot/renovate/discussions/new)
if you have any questions.

---

### Release Notes

<details>
<summary>adamchainz/django-upgrade (adamchainz/django-upgrade)</summary>

###
[`v1.19.0`](https://togithub.com/adamchainz/django-upgrade/blob/HEAD/CHANGELOG.rst#1190-2024-06-27)

[Compare
Source](https://togithub.com/adamchainz/django-upgrade/compare/1.18.0...1.19.0)

- Add Django 4.2+ fixer to rewrite `index_together` declarations into
`indexes` declarations in model `Meta` classes.
    This fixer can make changes that require migrations.
Add a `test for pending migrations
<https://adamj.eu/tech/2024/06/23/django-test-pending-migrations/>`\__
to ensure that you do not miss these.

`PR #&#8203;464
<https://github.com/adamchainz/django-upgrade/pull/464>`\__.

-   Fix tracking of AST node parents.
    This may have fixed some subtle bugs in these fixers:

    -   `admin_register`
    -   `assert_form_error`
    -   `default_app_config`
    -   `management_commands`
    -   `request_headers`
    -   `settings_database_postgresql`
    -   `settings_storages`
    -   `testcase_databases`
    -   `use_l10n`
    -   `utils_timezone`

If you see any new changes, or had them previously disabled, please
report an issue so we can extra tests to the test suite.

`PR #&#8203;465
<https://github.com/adamchainz/django-upgrade/pull/465>`\__.

</details>

---

### Configuration

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

🚦 **Automerge**: Enabled.

♻ **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:eyJjcmVhdGVkSW5WZXIiOiIzNy40MjAuMSIsInVwZGF0ZWRJblZlciI6IjM3LjQyMC4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJkZXBlbmRlbmNpZXMiXX0=-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-06-28 13:59:31 +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 63572fdab9
docs: add missing v4.2.0 release note ()
Forgot to prepare the release note for v4.2.0.
2024-06-22 22:58:15 +02:00
libretime-bot 60db15e8e5
chore(main): release 4.2.0 ()
🤖 I have created a release *beep* *boop*
---


## [4.2.0](https://github.com/libretime/libretime/compare/4.1.0...4.2.0)
(2024-06-22)


### Features

* **legacy:** add current date macro to string block criteria
([](https://github.com/libretime/libretime/issues/3013))
([451652b](451652bc40))
* **legacy:** add filename block criteria
([](https://github.com/libretime/libretime/issues/3015))
([4642b6c](4642b6c08e))


### Bug Fixes

* pin pip version to &lt;24.1 to allow installing pytz (celery)
([](https://github.com/libretime/libretime/issues/3043))
([646bc81](646bc81724))
* playlist allocates inaccurate time to smartblocks
([](https://github.com/libretime/libretime/issues/3026))
([2b43e51](2b43e51ed1))


### Performance Improvements

* optimize the api image health check
([](https://github.com/libretime/libretime/issues/3038))
([d99d6e1](d99d6e1a68))
* optimize the rabbitmq health check
([](https://github.com/libretime/libretime/issues/3037))
([9684214](9684214425))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).
2024-06-22 18:16:49 +02:00
Cristian Oneț 9684214425
perf: optimize the rabbitmq health check ()
### Description

Running `rabbitmq-diagnostics` every 30s is a resource intensive
operation wasting cpu cycles.
2024-06-22 18:10:55 +02:00
renovate[bot] 97b2f0e257
chore(deps): update dependency requests to >=2.32.2,<2.33 [security] ()
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [requests](https://requests.readthedocs.io)
([source](https://togithub.com/psf/requests),
[changelog](https://togithub.com/psf/requests/blob/master/HISTORY.md)) |
`>=2.31.0,<2.32` -> `>=2.32.2,<2.33` |
[![age](https://developer.mend.io/api/mc/badges/age/pypi/requests/2.32.2?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/pypi/requests/2.32.2?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/pypi/requests/2.31.0/2.32.2?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/requests/2.31.0/2.32.2?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

### GitHub Vulnerability Alerts

####
[CVE-2024-35195](https://togithub.com/psf/requests/security/advisories/GHSA-9wx4-h78v-vm56)

When making requests through a Requests `Session`, if the first request
is made with `verify=False` to disable cert verification, all subsequent
requests to the same origin will continue to ignore cert verification
regardless of changes to the value of `verify`. This behavior will
continue for the lifecycle of the connection in the connection pool.

### Remediation
Any of these options can be used to remediate the current issue, we
highly recommend upgrading as the preferred mitigation.

* Upgrade to `requests>=2.32.0`.
* For `requests<2.32.0`, avoid setting `verify=False` for the first
request to a host while using a Requests Session.
* For `requests<2.32.0`, call `close()` on `Session` objects to clear
existing connections if `verify=False` is used.

### Related Links
*
[https://github.com/psf/requests/pull/6655](https://togithub.com/psf/requests/pull/6655)

---

### Release Notes

<details>
<summary>psf/requests (requests)</summary>

###
[`v2.32.2`](https://togithub.com/psf/requests/blob/HEAD/HISTORY.md#2322-2024-05-21)

[Compare
Source](https://togithub.com/psf/requests/compare/v2.32.1...v2.32.2)

**Deprecations**

-   To provide a more stable migration for custom HTTPAdapters impacted
    by the CVE changes in 2.32.0, we've renamed `_get_connection` to
    a new public API, `get_connection_with_tls_context`. Existing custom
    HTTPAdapters will need to migrate their code to use this new API.
`get_connection` is considered deprecated in all versions of
Requests>=2.32.0.

A minimal (2-line) example has been provided in the linked PR to ease
migration, but we strongly urge users to evaluate if their custom
adapter
is subject to the same issue described in CVE-2024-35195.
([#&#8203;6710](https://togithub.com/psf/requests/issues/6710))

###
[`v2.32.1`](https://togithub.com/psf/requests/blob/HEAD/HISTORY.md#2321-2024-05-20)

[Compare
Source](https://togithub.com/psf/requests/compare/v2.32.0...v2.32.1)

**Bugfixes**

-   Add missing test certs to the sdist distributed on PyPI.

###
[`v2.32.0`](https://togithub.com/psf/requests/blob/HEAD/HISTORY.md#2320-2024-05-20)

[Compare
Source](https://togithub.com/psf/requests/compare/v2.31.0...v2.32.0)

**Security**

- Fixed an issue where setting `verify=False` on the first request from
a
Session will cause subsequent requests to the *same origin* to also
ignore
    cert verification, regardless of the value of `verify`.

(https://github.com/psf/requests/security/advisories/GHSA-9wx4-h78v-vm56)

**Improvements**

-   `verify=True` now reuses a global SSLContext which should improve
request time variance between first and subsequent requests. It should
also minimize certificate load time on Windows systems when using a
Python
version built with OpenSSL 3.x.
([#&#8203;6667](https://togithub.com/psf/requests/issues/6667))
-   Requests now supports optional use of character detection
    (`chardet` or `charset_normalizer`) when repackaged or vendored.
    This enables `pip` and other projects to minimize their vendoring
    surface area. The `Response.text()` and `apparent_encoding` APIs
will default to `utf-8` if neither library is present.
([#&#8203;6702](https://togithub.com/psf/requests/issues/6702))

**Bugfixes**

-   Fixed bug in length detection where emoji length was incorrectly
calculated in the request content-length.
([#&#8203;6589](https://togithub.com/psf/requests/issues/6589))
- Fixed deserialization bug in JSONDecodeError.
([#&#8203;6629](https://togithub.com/psf/requests/issues/6629))
-   Fixed bug where an extra leading `/` (path separator) could lead
urllib3 to unnecessarily reparse the request URI.
([#&#8203;6644](https://togithub.com/psf/requests/issues/6644))

**Deprecations**

- Requests has officially added support for CPython 3.12
([#&#8203;6503](https://togithub.com/psf/requests/issues/6503))
- Requests has officially added support for PyPy 3.9 and 3.10
([#&#8203;6641](https://togithub.com/psf/requests/issues/6641))
- Requests has officially dropped support for CPython 3.7
([#&#8203;6642](https://togithub.com/psf/requests/issues/6642))
- Requests has officially dropped support for PyPy 3.7 and 3.8
([#&#8203;6641](https://togithub.com/psf/requests/issues/6641))

**Documentation**

-   Various typo fixes and doc improvements.

**Packaging**

-   Requests has started adopting some modern packaging practices.
The source files for the projects (formerly `requests`) is now located
in `src/requests` in the Requests sdist.
([#&#8203;6506](https://togithub.com/psf/requests/issues/6506))
- Starting in Requests 2.33.0, Requests will migrate to a PEP 517 build
system
using `hatchling`. This should not impact the average user, but
extremely old
versions of packaging utilities may have issues with the new packaging
format.

</details>

---

### Configuration

📅 **Schedule**: Branch creation - "" (UTC), 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 these
updates 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:eyJjcmVhdGVkSW5WZXIiOiIzNy40MTAuMSIsInVwZGF0ZWRJblZlciI6IjM3LjQxMy4yIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJkZXBlbmRlbmNpZXMiLCJweXRob24iXX0=-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-06-22 17:47:09 +02:00
Jonas L 646bc81724
fix: pin pip version to <24.1 to allow installing pytz (celery) ()
Related to https://github.com/libretime/libretime/issues/2983
2024-06-22 17:35:30 +02:00
Jonas L 4e0953d513
refactor: remove non existent asset file ()
The file is non existent.

Added in c669d3cb47

Removed in ea2a6b3f68
2024-06-22 17:18:16 +02:00
Jonas L c96f78df9f
fix: pin pip version to <21.4 to allow installing pytz (celery) ()
Related to https://github.com/libretime/libretime/issues/2983
2024-06-22 16:33:23 +02:00
Jonas L 6958070eec
test: ensure the context cleanup is executed ()
See
https://pylint.readthedocs.io/en/latest/user_guide/messages/warning/contextmanager-generator-missing-cleanup.html
2024-06-22 13:31:13 +02:00
Cristian Oneț d99d6e1a68
perf: optimize the api image health check ()
### Description

Having curl installed in the API container improves operations and the
efficiency of the health check. Launching python to do a single http
call is an overkill.


Co-authored-by: Jonas L <jooola@users.noreply.github.com>
2024-06-22 13:18:50 +02:00
dakriy 4642b6c08e
feat(legacy): add filename block criteria ()
### Description

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

Closes  
2024-06-22 11:51:59 +02:00
renovate[bot] 7f3f318601
chore(deps): update dependency friendsofphp/php-cs-fixer to <3.59.4 ()
[![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
renovate[bot] f12392e276
chore(deps): update dependency django-cors-headers to >=3.14.0,<4.5 ()
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
|
[django-cors-headers](https://togithub.com/adamchainz/django-cors-headers)
([changelog](https://togithub.com/adamchainz/django-cors-headers/blob/main/CHANGELOG.rst))
| `>=3.14.0,<4.4` -> `>=3.14.0,<4.5` |
[![age](https://developer.mend.io/api/mc/badges/age/pypi/django-cors-headers/4.4.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/pypi/django-cors-headers/4.4.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/pypi/django-cors-headers/4.3.1/4.4.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/django-cors-headers/4.3.1/4.4.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>adamchainz/django-cors-headers (django-cors-headers)</summary>

###
[`v4.4.0`](https://togithub.com/adamchainz/django-cors-headers/blob/HEAD/CHANGELOG.rst#440-2024-06-19)

[Compare
Source](https://togithub.com/adamchainz/django-cors-headers/compare/4.3.1...4.4.0)

-   Support Django 5.1.

</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 these
updates 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:eyJjcmVhdGVkSW5WZXIiOiIzNy40MTAuMSIsInVwZGF0ZWRJblZlciI6IjM3LjQxMC4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJkZXBlbmRlbmNpZXMiLCJweXRob24iXX0=-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-06-22 11:45:37 +02:00
Jonas L e5a8baafa8
chore: fix broken link check ()
Only show organizations avatars.
2024-06-22 11:44:35 +02:00
dakriy 451652bc40
feat(legacy): add current date macro to string block criteria ()
### 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:  
2024-06-22 11:19:21 +02:00
renovate[bot] 13a8e38beb chore(deps): update docker/build-push-action action to v6 2024-06-19 14:52:05 +00:00
renovate[bot] 02cd85a845 chore(deps): update docker/bake-action action to v5 2024-06-19 14:51:31 +00:00
renovate[bot] 826aac1c05
chore(deps): lock file maintenance (legacy/composer.json) ()
[![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] f09bae6856 chore(deps): update pre-commit hook asottile/pyupgrade to v3.16.0 2024-06-10 01:03:36 +00:00
renovate[bot] 5ed15f9722
chore(deps): update dependency friendsofphp/php-cs-fixer to <3.58.2 ()
[![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
renovate[bot] 23c7411996
chore(deps): update dependency uvicorn to >=0.17.6,<0.31.0 ()
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [uvicorn](https://togithub.com/encode/uvicorn)
([changelog](https://togithub.com/encode/uvicorn/blob/master/CHANGELOG.md))
| `>=0.17.6,<0.30.0` -> `>=0.17.6,<0.31.0` |
[![age](https://developer.mend.io/api/mc/badges/age/pypi/uvicorn/0.30.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/pypi/uvicorn/0.30.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/pypi/uvicorn/0.29.0/0.30.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/uvicorn/0.29.0/0.30.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>encode/uvicorn (uvicorn)</summary>

###
[`v0.30.0`](https://togithub.com/encode/uvicorn/blob/HEAD/CHANGELOG.md#0300-2024-05-28)

[Compare
Source](https://togithub.com/encode/uvicorn/compare/0.29.0...0.30.0)

##### Added

- New multiprocess manager
([#&#8203;2183](https://togithub.com/encode/uvicorn/issues/2183))
- Allow `ConfigParser` or a `io.IO[Any]` on `log_config`
([#&#8203;1976](https://togithub.com/encode/uvicorn/issues/1976))

##### Fixed

- Suppress side-effects of signal propagation
([#&#8203;2317](https://togithub.com/encode/uvicorn/issues/2317))
- Send `content-length` header on 5xx
([#&#8203;2304](https://togithub.com/encode/uvicorn/issues/2304))

##### Deprecated

- Deprecate the `uvicorn.workers` module
([#&#8203;2302](https://togithub.com/encode/uvicorn/issues/2302))

</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 these
updates 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:eyJjcmVhdGVkSW5WZXIiOiIzNy4zNzcuOCIsInVwZGF0ZWRJblZlciI6IjM3LjM3Ny44IiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJkZXBlbmRlbmNpZXMiLCJweXRob24iXX0=-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-06-07 21:52:36 +02:00
Rob Hailman 2b43e51ed1
fix: playlist allocates inaccurate time to smartblocks ()
### 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

![image](https://github.com/libretime/libretime/assets/8541186/f91849fb-606f-410e-bef5-a7abc8e7b7f4)
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:

![image](https://github.com/libretime/libretime/assets/8541186/e9d46fbb-50e6-4859-a3de-f5a90a6021c0)
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 , but also addresses the
issue of dead air left at end of blocks.

Co-authored-by: Kyle Robbertze <paddatrapper@users.noreply.github.com>
2024-06-05 17:01:57 +01:00
renovate[bot] 10996e847b chore(deps): lock file maintenance (legacy/composer.json) 2024-06-05 15:55:53 +00:00
Kyle Robbertze 6432efd791
docs: fix typo ()
Minor typo that was being picked up by pre-commit
2024-06-05 16:54:12 +01:00
renovate[bot] c3e30f1857 chore(deps): update pre-commit hook codespell-project/codespell to v2.3.0 2024-05-30 01:58:26 +00:00
renovate[bot] 9974b4631d chore(deps): update pre-commit hook adamchainz/django-upgrade to v1.18.0 2024-05-30 01:57:22 +00:00
renovate[bot] 5d2ad43039 chore(deps): lock file maintenance (legacy/composer.json) 2024-05-14 11:11:50 +00:00
renovate[bot] 848612ae6f chore(deps): update pre-commit hook adamchainz/django-upgrade to v1.17.0 2024-05-12 16:43:03 +00:00
renovate[bot] f77c8dbaaa
chore(deps): update dependency friendsofphp/php-cs-fixer to <3.56.2 ()
[![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.54.1` -> `<3.56.2` |
[![age](https://developer.mend.io/api/mc/badges/age/packagist/friendsofphp%2fphp-cs-fixer/3.56.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/packagist/friendsofphp%2fphp-cs-fixer/3.56.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/packagist/friendsofphp%2fphp-cs-fixer/3.54.0/3.56.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/packagist/friendsofphp%2fphp-cs-fixer/3.54.0/3.56.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.56.1`](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/blob/HEAD/CHANGELOG.md#Changelog-for-v3561)

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

- chore: improve PHPDoc typehints
([#&#8203;7994](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7994))
- CI: Allow any integer in PHPStan error for Token's constructor
([#&#8203;8000](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/8000))
- fix: Better array shape in `PhpUnitDedicateAssertFixer`
([#&#8203;7999](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7999))
- fix: `ConstantCaseFixer` - do not touch typed constants
([#&#8203;7998](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7998))

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

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

- feat: `TrailingCommaInMultilineFixer` - handle trailing comma in
language constructs
([#&#8203;7989](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7989))
- fix: `TrailingCommaInMultilineFixer` - language constructs should be
covered by arguments, not parameters
([#&#8203;7990](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7990))
- chore: remove invalid comment
([#&#8203;7987](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7987))
- DX: Cache optimisation
([#&#8203;7985](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7985))

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

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

- feat: Introduce `OrderedAttributesFixer`
([#&#8203;7395](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7395))
- chore: few SCA fixes and dev-tools update
([#&#8203;7969](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7969))
- chore: fix phpdoc types
([#&#8203;7977](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7977))
- chore: narrow PHPDoc types
([#&#8203;7979](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7979))
- chore: Normalize implicit backslahes in single quoted strings
internally
([#&#8203;7786](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7786))
- chore: phpdoc - rely on strict list/tuple/assoc instead of array
([#&#8203;7978](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7978))
- chore: PhpUnitDataProviderNameFixer - follow config creation pattern
([#&#8203;7980](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7980))
- chore: Preg - drop half-support for array-pattern
([#&#8203;7976](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7976))
- chore: re-use CodeHasher
([#&#8203;7984](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7984))
- chore: RuleSetsTest - assert that Fixer is configurable
([#&#8203;7961](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7961))
- chore: sugar syntax
([#&#8203;7986](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7986))
- chore: Tokens should be always a list
([#&#8203;7698](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7698))
- CI: Ad-hoc fix for MacOS jobs
([#&#8203;7970](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7970))
- CI: Fix calculating diff between branches in PRs
([#&#8203;7973](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7973))
- DX: allow to enforce cache mechanism by env var
([#&#8203;7983](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7983))
- DX: do not typehint fixed-length arrays as lists
([#&#8203;7974](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7974))
- DX: Prevent having deprecated fixers listed as successors of other
deprecated fixers
([#&#8203;7967](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7967))
- DX: Resolve/Ignore PHPStan issues on level 6 + bump to level 7 with
new baseline
([#&#8203;7971](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7971))
- DX: use `list` type in PHPDoc
([#&#8203;7975](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7975))
- fix: `PhpUnitAttributesFixer` - fix for `#[RequiresPhp]` exceeding its
constructor parameters
([#&#8203;7966](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7966))
- test: don't count comment after class as another classy element
([#&#8203;7982](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7982))

</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:eyJjcmVhdGVkSW5WZXIiOiIzNy4zNDAuMTAiLCJ1cGRhdGVkSW5WZXIiOiIzNy4zNTEuMiIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiZGVwZW5kZW5jaWVzIiwicGhwIl19-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-05-11 11:10:18 +02:00
libretime-bot 4442664c36 chore(legacy): update locales 2024-05-06 01:56:09 +00:00
libretime-bot 1a985a4b37
chore(main): release 4.1.0 ()
🤖 I have created a release *beep* *boop*
---


## [4.1.0](https://github.com/libretime/libretime/compare/4.0.0...4.1.0)
(2024-05-05)


### Features

* **api:** implement file deletion
([](https://github.com/libretime/libretime/issues/2960))
([9757b1b](9757b1b78c))
* build schedule events exclusively in playout
([](https://github.com/libretime/libretime/issues/2946))
([40b4fc7](40b4fc7f66))
* **legacy:** add aac/opus support to dashboard player
([](https://github.com/libretime/libretime/issues/2881))
([95283ef](95283efc1f))
* **legacy:** disable public radio page and redirect to login
([](https://github.com/libretime/libretime/issues/2903))
([170d095](170d09545e))
* **legacy:** trim overbooked shows after autoloading a playlist
([](https://github.com/libretime/libretime/issues/2897))
([a95ce3d](a95ce3d229))
* **legacy:** visual cue point editor
([](https://github.com/libretime/libretime/issues/2947))
([da02e74](da02e74f21))
* start celery worker programmatically
([](https://github.com/libretime/libretime/issues/2988))
([9c548b3](9c548b365e))


### Bug Fixes

* **analyzer:** backslash non utf-8 data when probing replaygain
([](https://github.com/libretime/libretime/issues/2931))
([29f73e0](29f73e0dcb)),
closes [](https://github.com/libretime/libretime/issues/2910)
* apply replay gain preferences on scheduled files
([](https://github.com/libretime/libretime/issues/2945))
([35d0dec](35d0dec4a8))
* **deps:** update dependency friendsofphp/php-cs-fixer to &lt;3.49.1
([](https://github.com/libretime/libretime/issues/2899))
([3e05748](3e05748d2d))
* **deps:** update dependency friendsofphp/php-cs-fixer to &lt;3.51.1
([](https://github.com/libretime/libretime/issues/2963))
([22c303c](22c303cfff))
* **deps:** update dependency friendsofphp/php-cs-fixer to &lt;3.53.1
([](https://github.com/libretime/libretime/issues/2972))
([9192aaa](9192aaa2bb))
* **deps:** update dependency gunicorn to v22 (security)
([](https://github.com/libretime/libretime/issues/2993))
([a2cf769](a2cf7697a9))
* incorrect docker compose version
([](https://github.com/libretime/libretime/issues/2975))
([634e6e2](634e6e236d))
* **installer:** setup the worker entrypoint
([](https://github.com/libretime/libretime/issues/2996))
([71b20ae](71b20ae3c9))
* **legacy:** allow deleting file with api token
([](https://github.com/libretime/libretime/issues/2995))
([86da46e](86da46ee3a))
* **legacy:** allow updating track types code
([](https://github.com/libretime/libretime/issues/2955))
([270aa08](270aa08ae6))
* **legacy:** avoid crash when lot of streams in configuration
([](https://github.com/libretime/libretime/issues/2915))
([12dd477](12dd477312))
* **legacy:** ensure validation is performed on the track type form
([](https://github.com/libretime/libretime/issues/2985))
([5ad69bf](5ad69bf0b7))
* **legacy:** fix hidden fields in edit file form
([](https://github.com/libretime/libretime/issues/2932))
([f4b260f](f4b260fdf7))
* **legacy:** replay_gain_modifier should be a system preference
([](https://github.com/libretime/libretime/issues/2943))
([37d1a76](37d1a7685e))
* remove obsolete docker compose version
([](https://github.com/libretime/libretime/issues/2982))
([fb0584b](fb0584b021))
* trigger legacy tasks manager every 5m
([](https://github.com/libretime/libretime/issues/2987))
([7040d0e](7040d0e4bd))
* **worker:** ensure celery beat is started
([](https://github.com/libretime/libretime/issues/3007))
([bfde17e](bfde17edf7))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

---------

Co-authored-by: jo <ljonas@riseup.net>
2024-05-05 23:45:39 +02:00
Jonas L bfde17edf7
fix(worker): ensure celery beat is started ()
The celery seem to ignore the first flag when `worker` is not part of
the `argv`.
2024-05-05 23:32:29 +02:00
Thomas Göttgens 9757b1b78c
feat(api): implement file deletion ()
This implements the file delete to the Django API. Previously, the code was only manipulating the database while leaving the file in place.

Co-authored-by: jo <ljonas@riseup.net>
2024-05-05 22:44:30 +02:00
Thomas Göttgens 86da46ee3a
fix(legacy): allow deleting file with api token ()
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.
2024-05-05 22:26:27 +02:00
renovate[bot] 201e85e537
chore(deps): update dependency django-stubs to v5 ()
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [django-stubs](https://togithub.com/typeddjango/django-stubs)
([changelog](https://togithub.com/typeddjango/django-stubs/releases)) |
`>=1.14.0,<5` -> `>=1.14.0,<6` |
[![age](https://developer.mend.io/api/mc/badges/age/pypi/django-stubs/5.0.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/pypi/django-stubs/5.0.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/pypi/django-stubs/4.2.7/5.0.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/django-stubs/4.2.7/5.0.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>typeddjango/django-stubs (django-stubs)</summary>

###
[`v5.0.0`](https://togithub.com/typeddjango/django-stubs/releases/tag/5.0.0)

[Compare
Source](https://togithub.com/typeddjango/django-stubs/compare/4.2.7...5.0.0)

#### Announcements

- `QuerySet` class no longer derives from `Collection`. If you run into
errors like `incompatible type "_QuerySet[User, User]"; expected
"Collection[User]"`, [please read this
announcement](https://togithub.com/typeddjango/django-stubs/discussions/2095).

#### Headline changes

- Remove incorrect `Collection` base class and `__contains__` method
from `QuerySet` by [@&#8203;fidoriel](https://togithub.com/fidoriel) in
[https://github.com/typeddjango/django-stubs/pull/1925](https://togithub.com/typeddjango/django-stubs/pull/1925)
- Pyright joins the workflow in an advisory capacity by
[@&#8203;jorenham](https://togithub.com/jorenham) in
[https://github.com/typeddjango/django-stubs/pull/2019](https://togithub.com/typeddjango/django-stubs/pull/2019)
- feat: Allow setting django_settings_module from env by
[@&#8203;armanckeser](https://togithub.com/armanckeser) in
[https://github.com/typeddjango/django-stubs/pull/2021](https://togithub.com/typeddjango/django-stubs/pull/2021)
- Add `ManyRelatedManager.through` attribute and generic type parameter
by [@&#8203;flaeppe](https://togithub.com/flaeppe) in
[https://github.com/typeddjango/django-stubs/pull/2026](https://togithub.com/typeddjango/django-stubs/pull/2026)

#### What's Changed

- Make `StrPromise` not inherit from `Sequence[str]` by
[@&#8203;intgr](https://togithub.com/intgr) in
[https://github.com/typeddjango/django-stubs/pull/1841](https://togithub.com/typeddjango/django-stubs/pull/1841)
- Update and prepare for Django 5.0 by
[@&#8203;intgr](https://togithub.com/intgr) in
[https://github.com/typeddjango/django-stubs/pull/1859](https://togithub.com/typeddjango/django-stubs/pull/1859)
- Ensure mypy plugin processes inherited many to many fields by
[@&#8203;flaeppe](https://togithub.com/flaeppe) in
[https://github.com/typeddjango/django-stubs/pull/1864](https://togithub.com/typeddjango/django-stubs/pull/1864)
- Include ModelBase subclasses in plugin base class hook condition by
[@&#8203;flaeppe](https://togithub.com/flaeppe) in
[https://github.com/typeddjango/django-stubs/pull/1863](https://togithub.com/typeddjango/django-stubs/pull/1863)
- \[5.0] Added many new a-prefixed asynchronous methods by
[@&#8203;bigfootjon](https://togithub.com/bigfootjon) in
[https://github.com/typeddjango/django-stubs/pull/1741](https://togithub.com/typeddjango/django-stubs/pull/1741)
- Remove section regarding custom queryset methods from README by
[@&#8203;flaeppe](https://togithub.com/flaeppe) in
[https://github.com/typeddjango/django-stubs/pull/1865](https://togithub.com/typeddjango/django-stubs/pull/1865)
- Fix type of `AppConfig.models_module` by
[@&#8203;Viicos](https://togithub.com/Viicos) in
[https://github.com/typeddjango/django-stubs/pull/1866](https://togithub.com/typeddjango/django-stubs/pull/1866)
- Allow `None` in settings `MIGRATION_MODULES` dict values by
[@&#8203;asottile](https://togithub.com/asottile) in
[https://github.com/typeddjango/django-stubs/pull/1871](https://togithub.com/typeddjango/django-stubs/pull/1871)
- Add type hints for `JSONField.from_db_value` by
[@&#8203;flaeppe](https://togithub.com/flaeppe) in
[https://github.com/typeddjango/django-stubs/pull/1879](https://togithub.com/typeddjango/django-stubs/pull/1879)
- Fix/pyright unknown by
[@&#8203;dephiros](https://togithub.com/dephiros) in
[https://github.com/typeddjango/django-stubs/pull/1873](https://togithub.com/typeddjango/django-stubs/pull/1873)
- Fix type hints of `converters` in `urls.resolvers` by
[@&#8203;Viicos](https://togithub.com/Viicos) in
[https://github.com/typeddjango/django-stubs/pull/1892](https://togithub.com/typeddjango/django-stubs/pull/1892)
- Update mypy to 1.8.0 by
[@&#8203;sobolevn](https://togithub.com/sobolevn) in
[https://github.com/typeddjango/django-stubs/pull/1885](https://togithub.com/typeddjango/django-stubs/pull/1885)
- Add `@type_check_only` to all Protocols and known stubs-only classes
by [@&#8203;intgr](https://togithub.com/intgr) in
[https://github.com/typeddjango/django-stubs/pull/1894](https://togithub.com/typeddjango/django-stubs/pull/1894)
- Fix types for UniqueConstraint instantiation by
[@&#8203;flaeppe](https://togithub.com/flaeppe) in
[https://github.com/typeddjango/django-stubs/pull/1880](https://togithub.com/typeddjango/django-stubs/pull/1880)
- Add `ModuleType` as a possible type to `URLResolver.urlconf_name` by
[@&#8203;Viicos](https://togithub.com/Viicos) in
[https://github.com/typeddjango/django-stubs/pull/1891](https://togithub.com/typeddjango/django-stubs/pull/1891)
- Fix type hint of `URLPattern.default_args` by
[@&#8203;Viicos](https://togithub.com/Viicos) in
[https://github.com/typeddjango/django-stubs/pull/1895](https://togithub.com/typeddjango/django-stubs/pull/1895)
- Update ruff and silence `PYI046` by
[@&#8203;sobolevn](https://togithub.com/sobolevn) in
[https://github.com/typeddjango/django-stubs/pull/1907](https://togithub.com/typeddjango/django-stubs/pull/1907)
- Use PEP 570 syntax by [@&#8203;Viicos](https://togithub.com/Viicos) in
[https://github.com/typeddjango/django-stubs/pull/1908](https://togithub.com/typeddjango/django-stubs/pull/1908)
- Fix readme settings example by
[@&#8203;Viicos](https://togithub.com/Viicos) in
[https://github.com/typeddjango/django-stubs/pull/1910](https://togithub.com/typeddjango/django-stubs/pull/1910)
- Fix type hint of `EmailBackend.ssl_keyfile` and
`EmailBackend.ssl_certfile` by
[@&#8203;Viicos](https://togithub.com/Viicos) in
[https://github.com/typeddjango/django-stubs/pull/1911](https://togithub.com/typeddjango/django-stubs/pull/1911)
- Add type of `django.VERSION` by
[@&#8203;Viicos](https://togithub.com/Viicos) in
[https://github.com/typeddjango/django-stubs/pull/1916](https://togithub.com/typeddjango/django-stubs/pull/1916)
- Added `CommandParser` to `commands.__init__` by
[@&#8203;jamesbraza](https://togithub.com/jamesbraza) in
[https://github.com/typeddjango/django-stubs/pull/1927](https://togithub.com/typeddjango/django-stubs/pull/1927)
- \[5.0] add `assume_scheme` to forms.URLField by
[@&#8203;asottile](https://togithub.com/asottile) in
[https://github.com/typeddjango/django-stubs/pull/1929](https://togithub.com/typeddjango/django-stubs/pull/1929)
- Fix return type of `BaseModelAdmin.formfield_for_dbfield` by
[@&#8203;Viicos](https://togithub.com/Viicos) in
[https://github.com/typeddjango/django-stubs/pull/1934](https://togithub.com/typeddjango/django-stubs/pull/1934)
- Revert `pre-commit==3.6.1` by
[@&#8203;sobolevn](https://togithub.com/sobolevn) in
[https://github.com/typeddjango/django-stubs/pull/1936](https://togithub.com/typeddjango/django-stubs/pull/1936)
- Fix type hint of `Response.set_cookie.max_age` by
[@&#8203;Viicos](https://togithub.com/Viicos) in
[https://github.com/typeddjango/django-stubs/pull/1941](https://togithub.com/typeddjango/django-stubs/pull/1941)
- 5.0: Add ChoicesType by [@&#8203;q0w](https://togithub.com/q0w) in
[https://github.com/typeddjango/django-stubs/pull/1942](https://togithub.com/typeddjango/django-stubs/pull/1942)
- Add through_defaults for RelatedManager methods by
[@&#8203;mfosterw](https://togithub.com/mfosterw) in
[https://github.com/typeddjango/django-stubs/pull/1943](https://togithub.com/typeddjango/django-stubs/pull/1943)
- Update type hints of `core.signing` by
[@&#8203;Viicos](https://togithub.com/Viicos) in
[https://github.com/typeddjango/django-stubs/pull/1945](https://togithub.com/typeddjango/django-stubs/pull/1945)
- \[5.0] Update `core.validators` by
[@&#8203;Viicos](https://togithub.com/Viicos) in
[https://github.com/typeddjango/django-stubs/pull/1947](https://togithub.com/typeddjango/django-stubs/pull/1947)
- \[5.0] Update `core.paginator` by
[@&#8203;Viicos](https://togithub.com/Viicos) in
[https://github.com/typeddjango/django-stubs/pull/1946](https://togithub.com/typeddjango/django-stubs/pull/1946)
- Generic `forms.ModelChoiceField` by
[@&#8203;UnknownPlatypus](https://togithub.com/UnknownPlatypus) in
[https://github.com/typeddjango/django-stubs/pull/1889](https://togithub.com/typeddjango/django-stubs/pull/1889)
- Support processing of other relations and fields when one is broken by
[@&#8203;flaeppe](https://togithub.com/flaeppe) in
[https://github.com/typeddjango/django-stubs/pull/1877](https://togithub.com/typeddjango/django-stubs/pull/1877)
- Allowing `set` in `model_to_dict`'s `exclude` by
[@&#8203;jamesbraza](https://togithub.com/jamesbraza) in
[https://github.com/typeddjango/django-stubs/pull/1952](https://togithub.com/typeddjango/django-stubs/pull/1952)
- \[5.0] Add django.db.models.GeneratedField by
[@&#8203;palfrey](https://togithub.com/palfrey) in
[https://github.com/typeddjango/django-stubs/pull/1944](https://togithub.com/typeddjango/django-stubs/pull/1944)
- Fix type hint of `BaseEngine.template_dirs` by
[@&#8203;Viicos](https://togithub.com/Viicos) in
[https://github.com/typeddjango/django-stubs/pull/1954](https://togithub.com/typeddjango/django-stubs/pull/1954)
- Update type hints of contrib.auth.hashers by
[@&#8203;yhay81](https://togithub.com/yhay81) in
[https://github.com/typeddjango/django-stubs/pull/1955](https://togithub.com/typeddjango/django-stubs/pull/1955)
- deps: Upgrade pre-commit for newer versions of python by
[@&#8203;delfick](https://togithub.com/delfick) in
[https://github.com/typeddjango/django-stubs/pull/1961](https://togithub.com/typeddjango/django-stubs/pull/1961)
- 5.0: Add auth.middleware.auser by
[@&#8203;q0w](https://togithub.com/q0w) in
[https://github.com/typeddjango/django-stubs/pull/1966](https://togithub.com/typeddjango/django-stubs/pull/1966)
- 5.0: Add ModelAdmin.show_facets by
[@&#8203;q0w](https://togithub.com/q0w) in
[https://github.com/typeddjango/django-stubs/pull/1967](https://togithub.com/typeddjango/django-stubs/pull/1967)
- ruff: Fix config warnings by [@&#8203;q0w](https://togithub.com/q0w)
in
[https://github.com/typeddjango/django-stubs/pull/1964](https://togithub.com/typeddjango/django-stubs/pull/1964)
- 5.0: Add BaseConstraint.violation_error_code by
[@&#8203;q0w](https://togithub.com/q0w) in
[https://github.com/typeddjango/django-stubs/pull/1969](https://togithub.com/typeddjango/django-stubs/pull/1969)
- 5.0: Add Signal.asend and Signal.asend_robust by
[@&#8203;q0w](https://togithub.com/q0w) in
[https://github.com/typeddjango/django-stubs/pull/1965](https://togithub.com/typeddjango/django-stubs/pull/1965)
- 5.0: Add QuerySet.(a)update_or_create new create_defaults arg by
[@&#8203;q0w](https://togithub.com/q0w) in
[https://github.com/typeddjango/django-stubs/pull/1970](https://togithub.com/typeddjango/django-stubs/pull/1970)
- 5.0: Add AdminSite.get_log_entries by
[@&#8203;q0w](https://togithub.com/q0w) in
[https://github.com/typeddjango/django-stubs/pull/1963](https://togithub.com/typeddjango/django-stubs/pull/1963)
- 5.0: Add gis ClosestPoint by [@&#8203;q0w](https://togithub.com/q0w)
in
[https://github.com/typeddjango/django-stubs/pull/1968](https://togithub.com/typeddjango/django-stubs/pull/1968)
- 5.0: Rename save_existing arg instance to obj by
[@&#8203;q0w](https://togithub.com/q0w) in
[https://github.com/typeddjango/django-stubs/pull/1971](https://togithub.com/typeddjango/django-stubs/pull/1971)
- 5.0: Remove admin.helpers.checkbox by
[@&#8203;q0w](https://togithub.com/q0w) in
[https://github.com/typeddjango/django-stubs/pull/1972](https://togithub.com/typeddjango/django-stubs/pull/1972)
- 5.0: Change annotation_select_mask from set\[str] to list\[str] by
[@&#8203;q0w](https://togithub.com/q0w) in
[https://github.com/typeddjango/django-stubs/pull/1973](https://togithub.com/typeddjango/django-stubs/pull/1973)
- fixup: Pass violation_error_code to init by
[@&#8203;q0w](https://togithub.com/q0w) in
[https://github.com/typeddjango/django-stubs/pull/1975](https://togithub.com/typeddjango/django-stubs/pull/1975)
- Avoid returning None from get_field_related_model_cls by
[@&#8203;SingingTree](https://togithub.com/SingingTree) in
[https://github.com/typeddjango/django-stubs/pull/1956](https://togithub.com/typeddjango/django-stubs/pull/1956)
- 5.0: Pass positional args name and violation_error_message to
BaseConstraint by [@&#8203;q0w](https://togithub.com/q0w) in
[https://github.com/typeddjango/django-stubs/pull/1974](https://togithub.com/typeddjango/django-stubs/pull/1974)
- 5.0: Remove pytz support by [@&#8203;q0w](https://togithub.com/q0w) in
[https://github.com/typeddjango/django-stubs/pull/1980](https://togithub.com/typeddjango/django-stubs/pull/1980)
- 5.0: Remove global setting USE_L10N by
[@&#8203;q0w](https://togithub.com/q0w) in
[https://github.com/typeddjango/django-stubs/pull/1979](https://togithub.com/typeddjango/django-stubs/pull/1979)
- 5.0: Remove OSMGeoAdmin, GeoModelAdmin by
[@&#8203;q0w](https://togithub.com/q0w) in
[https://github.com/typeddjango/django-stubs/pull/1981](https://togithub.com/typeddjango/django-stubs/pull/1981)
- 5.0: Remove extra_tests arg for DiscoverRunner.build_suite/run_tests
by [@&#8203;q0w](https://togithub.com/q0w) in
[https://github.com/typeddjango/django-stubs/pull/1978](https://togithub.com/typeddjango/django-stubs/pull/1978)
- 5.0: Remove django.utils baseconv and datetime_safe modules by
[@&#8203;q0w](https://togithub.com/q0w) in
[https://github.com/typeddjango/django-stubs/pull/1977](https://togithub.com/typeddjango/django-stubs/pull/1977)
- 5.0: Add request arg to ModelAdmin.lookup_allowed by
[@&#8203;q0w](https://togithub.com/q0w) in
[https://github.com/typeddjango/django-stubs/pull/1976](https://togithub.com/typeddjango/django-stubs/pull/1976)
- Add URL converter protocol type by
[@&#8203;adamchainz](https://togithub.com/adamchainz) in
[https://github.com/typeddjango/django-stubs/pull/1984](https://togithub.com/typeddjango/django-stubs/pull/1984)
- Fix type annotation for RegisterLookupMixin.class_lookups by
[@&#8203;avoronov-box](https://togithub.com/avoronov-box) in
[https://github.com/typeddjango/django-stubs/pull/1962](https://togithub.com/typeddjango/django-stubs/pull/1962)
- Update django to 5.0.3 by
[@&#8203;sobolevn](https://togithub.com/sobolevn) in
[https://github.com/typeddjango/django-stubs/pull/1990](https://togithub.com/typeddjango/django-stubs/pull/1990)
- Remove some deprecated Django 3.x APIs by
[@&#8203;sobolevn](https://togithub.com/sobolevn) in
[https://github.com/typeddjango/django-stubs/pull/1991](https://togithub.com/typeddjango/django-stubs/pull/1991)
- Fix BaseModelAdmin.view_on_site annotation by
[@&#8203;cuu508](https://togithub.com/cuu508) in
[https://github.com/typeddjango/django-stubs/pull/1993](https://togithub.com/typeddjango/django-stubs/pull/1993)
- Allow immutable `extra_context` on `TemplateView`s by
[@&#8203;samueljsb](https://togithub.com/samueljsb) in
[https://github.com/typeddjango/django-stubs/pull/1994](https://togithub.com/typeddjango/django-stubs/pull/1994)
- Add BoundField.**html**() by
[@&#8203;pelme](https://togithub.com/pelme) in
[https://github.com/typeddjango/django-stubs/pull/1999](https://togithub.com/typeddjango/django-stubs/pull/1999)
- Allow timedelta type for session.set_expiry() argument by
[@&#8203;mlazar-endear](https://togithub.com/mlazar-endear) in
[https://github.com/typeddjango/django-stubs/pull/2001](https://togithub.com/typeddjango/django-stubs/pull/2001)
- Bump `pytest-mypy-plugins` to 3.1.1 by
[@&#8203;sobolevn](https://togithub.com/sobolevn) in
[https://github.com/typeddjango/django-stubs/pull/2003](https://togithub.com/typeddjango/django-stubs/pull/2003)
- Update mypy, add a bit more metadata by
[@&#8203;sobolevn](https://togithub.com/sobolevn) in
[https://github.com/typeddjango/django-stubs/pull/1997](https://togithub.com/typeddjango/django-stubs/pull/1997)
- 5.0: Update `django.contrib.auth` by
[@&#8203;ngnpope](https://togithub.com/ngnpope) in
[https://github.com/typeddjango/django-stubs/pull/2009](https://togithub.com/typeddjango/django-stubs/pull/2009)
- 5.0: Update `django.conf` by
[@&#8203;ngnpope](https://togithub.com/ngnpope) in
[https://github.com/typeddjango/django-stubs/pull/2008](https://togithub.com/typeddjango/django-stubs/pull/2008)
- 5.0: Update `django.views` by
[@&#8203;ngnpope](https://togithub.com/ngnpope) in
[https://github.com/typeddjango/django-stubs/pull/2007](https://togithub.com/typeddjango/django-stubs/pull/2007)
- 5.0: Update `django.test` by
[@&#8203;ngnpope](https://togithub.com/ngnpope) in
[https://github.com/typeddjango/django-stubs/pull/2005](https://togithub.com/typeddjango/django-stubs/pull/2005)
- 5.0: Update `django.utils` by
[@&#8203;ngnpope](https://togithub.com/ngnpope) in
[https://github.com/typeddjango/django-stubs/pull/2006](https://togithub.com/typeddjango/django-stubs/pull/2006)
- Specify d.c.serializers.base.DeserializedObject.object type by
[@&#8203;j00bar](https://togithub.com/j00bar) in
[https://github.com/typeddjango/django-stubs/pull/2010](https://togithub.com/typeddjango/django-stubs/pull/2010)
- Clean the cache on each run of `stubtest` by
[@&#8203;sobolevn](https://togithub.com/sobolevn) in
[https://github.com/typeddjango/django-stubs/pull/2015](https://togithub.com/typeddjango/django-stubs/pull/2015)
- Keep abstract Django models internally in the plugin by
[@&#8203;flaeppe](https://togithub.com/flaeppe) in
[https://github.com/typeddjango/django-stubs/pull/2017](https://togithub.com/typeddjango/django-stubs/pull/2017)
- Add GitHub actions release workflow by
[@&#8203;flaeppe](https://togithub.com/flaeppe) in
[https://github.com/typeddjango/django-stubs/pull/1950](https://togithub.com/typeddjango/django-stubs/pull/1950)
- Adding missing `Q` methods: `check()`, `flatten()` by
[@&#8203;Alexerson](https://togithub.com/Alexerson) in
[https://github.com/typeddjango/django-stubs/pull/1899](https://togithub.com/typeddjango/django-stubs/pull/1899)
- Improve types in `utils.termcolors` by
[@&#8203;Viicos](https://togithub.com/Viicos) in
[https://github.com/typeddjango/django-stubs/pull/1901](https://togithub.com/typeddjango/django-stubs/pull/1901)
- Set the calculated metaclass when creating type info in the plugin by
[@&#8203;flaeppe](https://togithub.com/flaeppe) in
[https://github.com/typeddjango/django-stubs/pull/2025](https://togithub.com/typeddjango/django-stubs/pull/2025)
- Do not annotate PRs with pyright by
[@&#8203;sobolevn](https://togithub.com/sobolevn) in
[https://github.com/typeddjango/django-stubs/pull/2023](https://togithub.com/typeddjango/django-stubs/pull/2023)
- Use `PRI_MYPY` in `get_additional_deps` hook by
[@&#8203;sobolevn](https://togithub.com/sobolevn) in
[https://github.com/typeddjango/django-stubs/pull/2024](https://togithub.com/typeddjango/django-stubs/pull/2024)
- Update `_default_manager` and `_base_manager` to be `Manager` by
[@&#8203;flaeppe](https://togithub.com/flaeppe) in
[https://github.com/typeddjango/django-stubs/pull/2022](https://togithub.com/typeddjango/django-stubs/pull/2022)
- Determine the type of queryset methods on unions by
[@&#8203;delfick](https://togithub.com/delfick) in
[https://github.com/typeddjango/django-stubs/pull/2027](https://togithub.com/typeddjango/django-stubs/pull/2027)
- Add first stub for get_model_admin by
[@&#8203;nebiyuelias1](https://togithub.com/nebiyuelias1) in
[https://github.com/typeddjango/django-stubs/pull/2029](https://togithub.com/typeddjango/django-stubs/pull/2029)
- 5.0: Update `django.contrib.admin` by
[@&#8203;ngnpope](https://togithub.com/ngnpope) in
[https://github.com/typeddjango/django-stubs/pull/2004](https://togithub.com/typeddjango/django-stubs/pull/2004)
- \[5.0] Update `core.files` by
[@&#8203;Viicos](https://togithub.com/Viicos) in
[https://github.com/typeddjango/django-stubs/pull/1949](https://togithub.com/typeddjango/django-stubs/pull/1949)
- \[5.0] Update `core.cache.backends`, add `RedisCache` and related
classes by [@&#8203;Viicos](https://togithub.com/Viicos) in
[https://github.com/typeddjango/django-stubs/pull/1948](https://togithub.com/typeddjango/django-stubs/pull/1948)
- Fix `AsyncClient.defaults` attribute typing by
[@&#8203;flaeppe](https://togithub.com/flaeppe) in
[https://github.com/typeddjango/django-stubs/pull/1878](https://togithub.com/typeddjango/django-stubs/pull/1878)
- Relax type for `fields` argument of `Model.refresh_from_db()` by
[@&#8203;mthuurne](https://togithub.com/mthuurne) in
[https://github.com/typeddjango/django-stubs/pull/2035](https://togithub.com/typeddjango/django-stubs/pull/2035)
- \[5.0] Add missing stubs for geos by
[@&#8203;nebiyuelias1](https://togithub.com/nebiyuelias1) in
[https://github.com/typeddjango/django-stubs/pull/2034](https://togithub.com/typeddjango/django-stubs/pull/2034)
- Make `AdminSite.get_model_admin` generic by
[@&#8203;Viicos](https://togithub.com/Viicos) in
[https://github.com/typeddjango/django-stubs/pull/2038](https://togithub.com/typeddjango/django-stubs/pull/2038)
- \[5.0] Add `db_default=` parameter to models `Field` classes by
[@&#8203;Skorpyon](https://togithub.com/Skorpyon) in
[https://github.com/typeddjango/django-stubs/pull/1876](https://togithub.com/typeddjango/django-stubs/pull/1876)
- Remove `class Meta` from `Model` and `Form` class stubs by
[@&#8203;jorenham](https://togithub.com/jorenham) in
[https://github.com/typeddjango/django-stubs/pull/2000](https://togithub.com/typeddjango/django-stubs/pull/2000)
- Add datetime.timedelta as valid type for
HttpRequest.get_signed_cookie() max_age argument. by
[@&#8203;pelme](https://togithub.com/pelme) in
[https://github.com/typeddjango/django-stubs/pull/2045](https://togithub.com/typeddjango/django-stubs/pull/2045)
- CI: Update Django 4.2 version used for test suite by
[@&#8203;intgr](https://togithub.com/intgr) in
[https://github.com/typeddjango/django-stubs/pull/2049](https://togithub.com/typeddjango/django-stubs/pull/2049)
- Refine return type for `ManyToOneRel.get_accessor_name()` by
[@&#8203;mthuurne](https://togithub.com/mthuurne) in
[https://github.com/typeddjango/django-stubs/pull/2052](https://togithub.com/typeddjango/django-stubs/pull/2052)
- Add `DeferredAttribute.__get__()` by
[@&#8203;mthuurne](https://togithub.com/mthuurne) in
[https://github.com/typeddjango/django-stubs/pull/2050](https://togithub.com/typeddjango/django-stubs/pull/2050)
- Add missing methods and superclass to `FieldFile` by
[@&#8203;mthuurne](https://togithub.com/mthuurne) in
[https://github.com/typeddjango/django-stubs/pull/2051](https://togithub.com/typeddjango/django-stubs/pull/2051)
- Add `db_comment=` parameter to Postgres and GIS model fields by
[@&#8203;saJaeHyukc](https://togithub.com/saJaeHyukc) in
[https://github.com/typeddjango/django-stubs/pull/2054](https://togithub.com/typeddjango/django-stubs/pull/2054)
- Correct type for `db.models.sql.query.Query.join()` argument by
[@&#8203;mthuurne](https://togithub.com/mthuurne) in
[https://github.com/typeddjango/django-stubs/pull/2055](https://togithub.com/typeddjango/django-stubs/pull/2055)
- 5.0: Update `django.db.backends.oracle.base` by
[@&#8203;sudosubin](https://togithub.com/sudosubin) in
[https://github.com/typeddjango/django-stubs/pull/2057](https://togithub.com/typeddjango/django-stubs/pull/2057)
- 5.0: Update `django.test.client` by
[@&#8203;sudosubin](https://togithub.com/sudosubin) in
[https://github.com/typeddjango/django-stubs/pull/2059](https://togithub.com/typeddjango/django-stubs/pull/2059)
- 5.0: Update `django.test.html` by
[@&#8203;sudosubin](https://togithub.com/sudosubin) in
[https://github.com/typeddjango/django-stubs/pull/2060](https://togithub.com/typeddjango/django-stubs/pull/2060)
- 5.0: Update `django.test.runner` by
[@&#8203;sudosubin](https://togithub.com/sudosubin) in
[https://github.com/typeddjango/django-stubs/pull/2061](https://togithub.com/typeddjango/django-stubs/pull/2061)
- 5.0: Update `django.template`, `django.templatetags` by
[@&#8203;sudosubin](https://togithub.com/sudosubin) in
[https://github.com/typeddjango/django-stubs/pull/2063](https://togithub.com/typeddjango/django-stubs/pull/2063)
- 5.0: Update `django.test.testcases` by
[@&#8203;sudosubin](https://togithub.com/sudosubin) in
[https://github.com/typeddjango/django-stubs/pull/2062](https://togithub.com/typeddjango/django-stubs/pull/2062)
- 5.0: Update `django.http` by
[@&#8203;sudosubin](https://togithub.com/sudosubin) in
[https://github.com/typeddjango/django-stubs/pull/2064](https://togithub.com/typeddjango/django-stubs/pull/2064)
- 5.0: Update `django.core.management` by
[@&#8203;sudosubin](https://togithub.com/sudosubin) in
[https://github.com/typeddjango/django-stubs/pull/2067](https://togithub.com/typeddjango/django-stubs/pull/2067)
- 5.0: Update `django.core.handlers` by
[@&#8203;sudosubin](https://togithub.com/sudosubin) in
[https://github.com/typeddjango/django-stubs/pull/2066](https://togithub.com/typeddjango/django-stubs/pull/2066)
- 5.0: Update `django.contrib.sessions.serializers`,
`django.core.serializers` by
[@&#8203;sudosubin](https://togithub.com/sudosubin) in
[https://github.com/typeddjango/django-stubs/pull/2068](https://togithub.com/typeddjango/django-stubs/pull/2068)
- Update django app related types by
[@&#8203;sudosubin](https://togithub.com/sudosubin) in
[https://github.com/typeddjango/django-stubs/pull/2071](https://togithub.com/typeddjango/django-stubs/pull/2071)
- Add a `returncode` attribute to `CommandError` by
[@&#8203;flaeppe](https://togithub.com/flaeppe) in
[https://github.com/typeddjango/django-stubs/pull/2072](https://togithub.com/typeddjango/django-stubs/pull/2072)
- Disable mypy `ignore_missing_imports` option by
[@&#8203;sudosubin](https://togithub.com/sudosubin) in
[https://github.com/typeddjango/django-stubs/pull/2058](https://togithub.com/typeddjango/django-stubs/pull/2058)
- fix typing for URL validator.**call** by
[@&#8203;asottile](https://togithub.com/asottile) in
[https://github.com/typeddjango/django-stubs/pull/2074](https://togithub.com/typeddjango/django-stubs/pull/2074)
- Use field generic types for descriptors by
[@&#8203;md384](https://togithub.com/md384) in
[https://github.com/typeddjango/django-stubs/pull/2048](https://togithub.com/typeddjango/django-stubs/pull/2048)
- 5.0: Update `django.core.servers.basehttp` by
[@&#8203;sudosubin](https://togithub.com/sudosubin) in
[https://github.com/typeddjango/django-stubs/pull/2070](https://togithub.com/typeddjango/django-stubs/pull/2070)
- Update `django.template.base.Template.render()` argument type by
[@&#8203;Majsvaffla](https://togithub.com/Majsvaffla) in
[https://github.com/typeddjango/django-stubs/pull/1160](https://togithub.com/typeddjango/django-stubs/pull/1160)
- 5.0: Add `django.utils.choices` by
[@&#8203;sudosubin](https://togithub.com/sudosubin) in
[https://github.com/typeddjango/django-stubs/pull/2075](https://togithub.com/typeddjango/django-stubs/pull/2075)
- 5.0: Update `django.contrib.sitemaps`, `django.contrib.staticfiles` by
[@&#8203;sudosubin](https://togithub.com/sudosubin) in
[https://github.com/typeddjango/django-stubs/pull/2076](https://togithub.com/typeddjango/django-stubs/pull/2076)
- Update pyright report options (`reportMissingTypeArgument`,
`reportPrivateUsage`) by
[@&#8203;sudosubin](https://togithub.com/sudosubin) in
[https://github.com/typeddjango/django-stubs/pull/2077](https://togithub.com/typeddjango/django-stubs/pull/2077)
- 5.0: Update `django.contrib.postgres` by
[@&#8203;sudosubin](https://togithub.com/sudosubin) in
[https://github.com/typeddjango/django-stubs/pull/2078](https://togithub.com/typeddjango/django-stubs/pull/2078)
- Add `path` signature for async views by
[@&#8203;jlost](https://togithub.com/jlost) in
[https://github.com/typeddjango/django-stubs/pull/2085](https://togithub.com/typeddjango/django-stubs/pull/2085)
- Remove incorrect `Reversible` base class from `QuerySet` by
[@&#8203;intgr](https://togithub.com/intgr) in
[https://github.com/typeddjango/django-stubs/pull/2094](https://togithub.com/typeddjango/django-stubs/pull/2094)
- Version 5.0.0 release (django-stubs, django-stubs-ext) by
[@&#8203;flaeppe](https://togithub.com/flaeppe) in
[https://github.com/typeddjango/django-stubs/pull/2087](https://togithub.com/typeddjango/django-stubs/pull/2087)

#### New Contributors

- [@&#8203;Viicos](https://togithub.com/Viicos) made their first
contribution in
[https://github.com/typeddjango/django-stubs/pull/1866](https://togithub.com/typeddjango/django-stubs/pull/1866)
- [@&#8203;dephiros](https://togithub.com/dephiros) made their first
contribution in
[https://github.com/typeddjango/django-stubs/pull/1873](https://togithub.com/typeddjango/django-stubs/pull/1873)
- [@&#8203;jamesbraza](https://togithub.com/jamesbraza) made their first
contribution in
[https://github.com/typeddjango/django-stubs/pull/1927](https://togithub.com/typeddjango/django-stubs/pull/1927)
- [@&#8203;mfosterw](https://togithub.com/mfosterw) made their first
contribution in
[https://github.com/typeddjango/django-stubs/pull/1943](https://togithub.com/typeddjango/django-stubs/pull/1943)
- [@&#8203;palfrey](https://togithub.com/palfrey) made their first
contribution in
[https://github.com/typeddjango/django-stubs/pull/1944](https://togithub.com/typeddjango/django-stubs/pull/1944)
- [@&#8203;yhay81](https://togithub.com/yhay81) made their first
contribution in
[https://github.com/typeddjango/django-stubs/pull/1955](https://togithub.com/typeddjango/django-stubs/pull/1955)
- [@&#8203;delfick](https://togithub.com/delfick) made their first
contribution in
[https://github.com/typeddjango/django-stubs/pull/1961](https://togithub.com/typeddjango/django-stubs/pull/1961)
- [@&#8203;SingingTree](https://togithub.com/SingingTree) made their
first contribution in
[https://github.com/typeddjango/django-stubs/pull/1956](https://togithub.com/typeddjango/django-stubs/pull/1956)
- [@&#8203;avoronov-box](https://togithub.com/avoronov-box) made their
first contribution in
[https://github.com/typeddjango/django-stubs/pull/1962](https://togithub.com/typeddjango/django-stubs/pull/1962)
- [@&#8203;cuu508](https://togithub.com/cuu508) made their first
contribution in
[https://github.com/typeddjango/django-stubs/pull/1993](https://togithub.com/typeddjango/django-stubs/pull/1993)
- [@&#8203;samueljsb](https://togithub.com/samueljsb) made their first
contribution in
[https://github.com/typeddjango/django-stubs/pull/1994](https://togithub.com/typeddjango/django-stubs/pull/1994)
- [@&#8203;pelme](https://togithub.com/pelme) made their first
contribution in
[https://github.com/typeddjango/django-stubs/pull/1999](https://togithub.com/typeddjango/django-stubs/pull/1999)
- [@&#8203;mlazar-endear](https://togithub.com/mlazar-endear) made their
first contribution in
[https://github.com/typeddjango/django-stubs/pull/2001](https://togithub.com/typeddjango/django-stubs/pull/2001)
- [@&#8203;j00bar](https://togithub.com/j00bar) made their first
contribution in
[https://github.com/typeddjango/django-stubs/pull/2010](https://togithub.com/typeddjango/django-stubs/pull/2010)
- [@&#8203;jorenham](https://togithub.com/jorenham) made their first
contribution in
[https://github.com/typeddjango/django-stubs/pull/2019](https://togithub.com/typeddjango/django-stubs/pull/2019)
- [@&#8203;fidoriel](https://togithub.com/fidoriel) made their first
contribution in
[https://github.com/typeddjango/django-stubs/pull/1925](https://togithub.com/typeddjango/django-stubs/pull/1925)
- [@&#8203;armanckeser](https://togithub.com/armanckeser) made their
first contribution in
[https://github.com/typeddjango/django-stubs/pull/2021](https://togithub.com/typeddjango/django-stubs/pull/2021)
- [@&#8203;nebiyuelias1](https://togithub.com/nebiyuelias1) made their
first contribution in
[https://github.com/typeddjango/django-stubs/pull/2029](https://togithub.com/typeddjango/django-stubs/pull/2029)
- [@&#8203;Skorpyon](https://togithub.com/Skorpyon) made their first
contribution in
[https://github.com/typeddjango/django-stubs/pull/1876](https://togithub.com/typeddjango/django-stubs/pull/1876)
- [@&#8203;saJaeHyukc](https://togithub.com/saJaeHyukc) made their first
contribution in
[https://github.com/typeddjango/django-stubs/pull/2054](https://togithub.com/typeddjango/django-stubs/pull/2054)
- [@&#8203;sudosubin](https://togithub.com/sudosubin) made their first
contribution in
[https://github.com/typeddjango/django-stubs/pull/2057](https://togithub.com/typeddjango/django-stubs/pull/2057)
- [@&#8203;md384](https://togithub.com/md384) made their first
contribution in
[https://github.com/typeddjango/django-stubs/pull/2048](https://togithub.com/typeddjango/django-stubs/pull/2048)
- [@&#8203;Majsvaffla](https://togithub.com/Majsvaffla) made their first
contribution in
[https://github.com/typeddjango/django-stubs/pull/1160](https://togithub.com/typeddjango/django-stubs/pull/1160)
- [@&#8203;jlost](https://togithub.com/jlost) made their first
contribution in
[https://github.com/typeddjango/django-stubs/pull/2085](https://togithub.com/typeddjango/django-stubs/pull/2085)

**Full Changelog**:
https://github.com/typeddjango/django-stubs/compare/4.2.7...5.0.0

</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:eyJjcmVhdGVkSW5WZXIiOiIzNy4zMjEuMiIsInVwZGF0ZWRJblZlciI6IjM3LjMyMS4yIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJkZXBlbmRlbmNpZXMiLCJweXRob24iXX0=-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-05-05 21:21:20 +02:00
Thomas Göttgens 064c435b09
refactor(legacy): remove unused waveform related code ()
Co-authored-by: Thomas Göttgens <tgoettgens@mail.com>
Co-authored-by: Kyle Robbertze <paddatrapper@users.noreply.github.com>
2024-05-05 21:15:11 +02:00
renovate[bot] a556b73d2a chore(deps): lock file maintenance (legacy/composer.json) 2024-04-30 09:09:41 +00:00
libretime-bot ad16a9b3f8 chore(legacy): update locales 2024-04-29 01:54:43 +00:00
Jonas L 40b4fc7f66
feat: build schedule events exclusively in playout ()
### 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).
2024-04-27 20:09:16 +02:00
renovate[bot] c02502ad9d chore(deps): update pre-commit hook psf/black-pre-commit-mirror to v24.4.2 2024-04-27 10:51:08 +00:00
renovate[bot] c5a9c75946 chore(deps): update lycheeverse/lychee-action action to v1.10.0 2024-04-27 07:25:29 +00:00
renovate[bot] 50e5767963 chore(deps): update amannn/action-semantic-pull-request action to v5.5.2 2024-04-26 00:50:54 +00:00
renovate[bot] 8615c85572
chore(deps): update dependency friendsofphp/php-cs-fixer to <3.54.1 ()
[![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.53.1` -> `<3.54.1` |
[![age](https://developer.mend.io/api/mc/badges/age/packagist/friendsofphp%2fphp-cs-fixer/3.54.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/packagist/friendsofphp%2fphp-cs-fixer/3.54.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/packagist/friendsofphp%2fphp-cs-fixer/3.53.0/3.54.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/packagist/friendsofphp%2fphp-cs-fixer/3.53.0/3.54.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

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

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

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

- feat: introduce `PhpUnitAttributesFixer`
([#&#8203;7831](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7831))
- chore: Properly determine self-approval trigger commit
([#&#8203;7936](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7936))
- chore: Revert ref for self-approval Git checkout
([#&#8203;7944](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7944))
- CI: check if proper array key is declared
([#&#8203;7912](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7912))
- DX: cleanup `FullyQualifiedStrictTypesFixerTest`
([#&#8203;7954](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7954))
- DX: cleanup `PhpdocNoAccessFixerTest`
([#&#8203;7933](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7933))
- DX: cleanup `PhpUnitMethodCasingFixerTest`
([#&#8203;7948](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7948))
- DX: cleanup `PhpUnitStrictFixerTest`
([#&#8203;7938](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7938))
- DX: Improve internal dist config for Fixer
([#&#8203;7952](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7952))
- DX: Improve issue templates
([#&#8203;7942](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7942))
- DX: there is no namespace if there is no PHP code
([#&#8203;7953](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7953))
- DX: update .gitattributes
([#&#8203;7931](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7931))
- fix: Remove Infection during Docker release
([#&#8203;7937](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7937))
- fix: `FullyQualifiedStrictTypesFixer` - do not add imports before PHP
opening tag
([#&#8203;7955](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7955))
- fix: `PhpUnitMethodCasingFixer` - do not double underscore
([#&#8203;7949](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7949))
- fix: `PhpUnitTestClassRequiresCoversFixer` - do not add annotation
when there are attributes
([#&#8203;7880](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7880))
- test: Ignore PHP version related mutations
([#&#8203;7935](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7935))

</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:eyJjcmVhdGVkSW5WZXIiOiIzNy4zMDEuNCIsInVwZGF0ZWRJblZlciI6IjM3LjMwMS40IiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJkZXBlbmRlbmNpZXMiLCJwaHAiXX0=-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-04-23 18:54:41 +02:00
Weblate (bot) 7e92bc50cc
chore(legacy): translations update from Hosted Weblate ()
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-04-23 11:20:55 +01:00
libretime-bot 046aa724cc chore(legacy): update locales 2024-04-22 01:54:41 +00:00
Thomas Göttgens da02e74f21
feat(legacy): visual cue point editor ()
A visual cue point editor in the track editor view. This view displays the track as a waveform and allows you to set where the in- and out-cue points are set. These cue points determine the start and end points of the track.

---------

Co-authored-by: Thomas Göttgens <tgoettgens@mail.com>
Co-authored-by: Kyle Robbertze <paddatrapper@users.noreply.github.com>
2024-04-21 10:13:43 +01:00
Thomas Göttgens 71b20ae3c9
fix(installer): setup the worker entrypoint ()
Worker service fails after upgrade.

Related to 
2024-04-18 14:27:20 +02:00
renovate[bot] a2cf7697a9
fix(deps): update dependency gunicorn to v22 (security) ()
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [gunicorn](https://gunicorn.org)
([source](https://togithub.com/benoitc/gunicorn),
[changelog](https://docs.gunicorn.org/en/stable/news.html)) |
`>=20.1.0,<21.3` -> `>=22.0.0,<22.1` |
[![age](https://developer.mend.io/api/mc/badges/age/pypi/gunicorn/22.0.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/pypi/gunicorn/22.0.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/pypi/gunicorn/20.1.0/22.0.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/gunicorn/20.1.0/22.0.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

### GitHub Vulnerability Alerts

#### [CVE-2024-1135](https://nvd.nist.gov/vuln/detail/CVE-2024-1135)

Gunicorn fails to properly validate Transfer-Encoding headers, leading
to HTTP Request Smuggling (HRS) vulnerabilities. By crafting requests
with conflicting Transfer-Encoding headers, attackers can bypass
security restrictions and access restricted endpoints. This issue is due
to Gunicorn's handling of Transfer-Encoding headers, where it
incorrectly processes requests with multiple, conflicting
Transfer-Encoding headers, treating them as chunked regardless of the
final encoding specified. This vulnerability has been shown to allow
access to endpoints restricted by gunicorn. This issue has been
addressed in version 22.0.0.

To be affected users must have a network path which does not filter out
invalid requests. These users are advised to block access to restricted
endpoints via a firewall or other mechanism if they are unable to
update.

---

### Release Notes

<details>
<summary>benoitc/gunicorn (gunicorn)</summary>

###
[`v22.0.0`](https://togithub.com/benoitc/gunicorn/releases/tag/22.0.0):
Gunicorn 22.0 has been released

[Compare
Source](https://togithub.com/benoitc/gunicorn/compare/21.2.0...22.0.0)

**Gunicorn 22.0.0 has been released.** This version fix the numerous
security vulnerabilities. You're invited to upgrade asap your own
installation.

Changes:

    22.0.0 - 2024-04-17
    ===================

    - use `utime` to notify workers liveness
    - migrate setup to pyproject.toml
- fix numerous security vulnerabilities in HTTP parser (closing some
request smuggling vectors)
- parsing additional requests is no longer attempted past unsupported
request framing
- on HTTP versions < 1.1 support for chunked transfer is refused (only
used in exploits)
- requests conflicting configured or passed SCRIPT_NAME now produce a
verbose error
- Trailer fields are no longer inspected for headers indicating secure
scheme
    - support Python 3.12

    ** Breaking changes **

    - minimum version is Python 3.7
- the limitations on valid characters in the HTTP method have been
bounded to Internet Standards
- requests specifying unsupported transfer coding (order) are refused by
default (rare)
- HTTP methods are no longer casefolded by default (IANA method registry
contains none affected)
- HTTP methods containing the number sign (#) are no longer accepted by
default (rare)
- HTTP versions < 1.0 or >= 2.0 are no longer accepted by default (rare,
only HTTP/1.1 is supported)
- HTTP versions consisting of multiple digits or containing a
prefix/suffix are no longer accepted
- HTTP header field names Gunicorn cannot safely map to variables are
silently dropped, as in other software
- HTTP headers with empty field name are refused by default (no
legitimate use cases, used in exploits)
- requests with both Transfer-Encoding and Content-Length are refused by
default (such a message might indicate an attempt to perform request
smuggling)
- empty transfer codings are no longer permitted (reportedly seen with
really old & broken proxies)

    ** SECURITY **

    - fix CVE-2024-1135

1. Documentation is available there:
https://docs.gunicorn.org/en/stable/news.html
2.  Packages: https://pypi.org/project/gunicorn/

###
[`v21.2.0`](https://togithub.com/benoitc/gunicorn/releases/tag/21.2.0):
Gunicorn 21.2.0 has been released

[Compare
Source](https://togithub.com/benoitc/gunicorn/compare/21.1.0...21.2.0)

**Gunicorn 21.2.0 has been released.** This version fix the issue
introduced in the threaded worker.

Changes:

    21.2.0 - 2023-07-19
    ===================
    fix thread worker: revert change considering connection as idle .

    *** NOTE ***

    This is fixing the bad file description error.

1. Documentation is available there:
https://docs.gunicorn.org/en/stable/news.html
2.  Packages: https://pypi.org/project/gunicorn/

###
[`v21.1.0`](https://togithub.com/benoitc/gunicorn/releases/tag/21.1.0):
Gunicorn 21.1.0 has been released

[Compare
Source](https://togithub.com/benoitc/gunicorn/compare/21.0.1...21.1.0)

gunicorn 21.1.0 has been released. This version fix the issue introduced
in the threaded worker.

# 21.1.0 - 2023-07-18

-   fix thread worker: fix socket removal from the queuet checkout 21.x

###
[`v21.0.1`](https://togithub.com/benoitc/gunicorn/releases/tag/21.0.1):
Gunicorn 21 has been released

[Compare
Source](https://togithub.com/benoitc/gunicorn/compare/21.0.0...21.0.1)

Gunicorn 21 is out with miscellaneous changes.  Enjoy!

We made this release major to start our new release cycle. More info
will be provided on our discussion forum.

##### 21.0.1 - 2023-07-17

fix documentation build

##### 21.0.0 - 2023-07-17

support python 3.11
fix gevent and eventlet workers
fix threads support (gththread): improve performance and unblock
requests
SSL: noaw use SSLContext object
HTTP parser: miscellaneous fixes
remove unecessary setuid calls
fix testing
improve logging
miscellaneous fixes to core engine

**Full Changelog**:
https://github.com/benoitc/gunicorn/compare/21.0.0...21.0.1

###
[`v21.0.0`](https://togithub.com/benoitc/gunicorn/compare/20.1.0...21.0.0)

[Compare
Source](https://togithub.com/benoitc/gunicorn/compare/20.1.0...21.0.0)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - "" (UTC), 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:eyJjcmVhdGVkSW5WZXIiOiIzNy4zMDEuNCIsInVwZGF0ZWRJblZlciI6IjM3LjMwMS40IiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJkZXBlbmRlbmNpZXMiLCJweXRob24iXX0=-->

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: jo <ljonas@riseup.net>
2024-04-17 08:43:11 +02:00
libretime-bot a56edd9e98 chore(legacy): update locales 2024-04-15 03:48:57 +00:00
renovate[bot] b721dbecd1 chore(deps): lock file maintenance (legacy/composer.json) 2024-04-15 01:39:59 +00:00
renovate[bot] 7575b68472 chore(deps): update pre-commit hook psf/black-pre-commit-mirror to v24.4.0 2024-04-15 01:38:50 +00:00
Jonas L 9c548b365e
feat: start celery worker programmatically ()
### Description

Allow us to be more flexible with the option passed the celery worker,
for example, to change the logging level.
2024-04-13 21:03:57 +02:00
Jonas L 7040d0e4bd
fix: trigger legacy tasks manager every 5m ()
### Description

This ensures that when the LibreTime interface is not used for a long
time, we still have the task manager run essential tasks for the
schedule.

Related to 
2024-04-13 19:12:45 +02:00
renovate[bot] bcaa77ff3c
chore(deps): update dependency djangorestframework to >=3.14.0,<3.16 ()
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [djangorestframework](https://www.django-rest-framework.org/)
([source](https://togithub.com/encode/django-rest-framework),
[changelog](https://www.django-rest-framework.org/community/release-notes/))
| `>=3.14.0,<3.15` -> `>=3.14.0,<3.16` |
[![age](https://developer.mend.io/api/mc/badges/age/pypi/djangorestframework/3.15.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/pypi/djangorestframework/3.15.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/pypi/djangorestframework/3.14.0/3.15.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/djangorestframework/3.14.0/3.15.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>encode/django-rest-framework (djangorestframework)</summary>

###
[`v3.15.1`](https://togithub.com/encode/django-rest-framework/compare/3.15.0...3.15.1)

[Compare
Source](https://togithub.com/encode/django-rest-framework/compare/3.15.0...3.15.1)

###
[`v3.15.0`](https://togithub.com/encode/django-rest-framework/compare/3.14.0...3.15.0)

[Compare
Source](https://togithub.com/encode/django-rest-framework/compare/3.14.0...3.15.0)

</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 these
updates 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:eyJjcmVhdGVkSW5WZXIiOiIzNy4yNDUuMCIsInVwZGF0ZWRJblZlciI6IjM3LjI2OS4yIiwidGFyZ2V0QnJhbmNoIjoibWFpbiJ9-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-04-13 16:13:32 +02:00
Jonas L a63df8c989
chore: mark php-cs-fixer as dev dependency ()
### Description

This should remove the update entries from the release-please changelog,
as renovate will now consider updates for this dep as `chore` and not
`fix`.
2024-04-13 16:08:45 +02:00
Jonas L 5ad69bf0b7
fix(legacy): ensure validation is performed on the track type form ()
### Description

Fixes 

The zend form validation was not performed, only a custom method to
validate the code was used. This merge both validation, and leverage the
Zend form validation framework.

Also allow updating the track type code from the track type form.
Related to 
2024-04-13 15:54:47 +02:00
Jonas L f1c7dd89f1
docs: prevent reverse proxy from constraining the upload limits ()
### Description

The upload limits settings are configured in the libretime nginx config,
but must also be part of the reverse proxy.
2024-04-13 15:12:07 +02:00
Jonas L fb0584b021
fix: remove obsolete docker compose version ()
### Description

```
WARN[0000] /home/jo/code/github.com/libretime/libretime/docker-compose.yml: `version` is obsolete 
WARN[0000] /home/jo/code/github.com/libretime/libretime/docker-compose.override.yml: `version` is obsolete 
```
2024-04-13 14:37:04 +02:00
renovate[bot] 9192aaa2bb
fix(deps): update dependency friendsofphp/php-cs-fixer to <3.53.1 ()
[![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.51.1` -> `<3.53.1` |
[![age](https://developer.mend.io/api/mc/badges/age/packagist/friendsofphp%2fphp-cs-fixer/3.53.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/packagist/friendsofphp%2fphp-cs-fixer/3.53.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/packagist/friendsofphp%2fphp-cs-fixer/3.51.0/3.53.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/packagist/friendsofphp%2fphp-cs-fixer/3.51.0/3.53.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

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

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

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

- chore: Use `list` over `array` in more places
([#&#8203;7905](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7905))
- CI: allow for self-approvals for maintainers
([#&#8203;7921](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7921))
- CI: Improve Infection setup
([#&#8203;7913](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7913))
- CI: no need to trigger enable auto-merge when self-approve
([#&#8203;7929](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7929))
- DX: reduce `array_filter` function usages
([#&#8203;7923](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7923))
- DX: remove duplicated character from `trim` call
([#&#8203;7930](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7930))
- DX: update actions producing warnings
([#&#8203;7925](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7925))
- DX: update actions producing warnings
([#&#8203;7928](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7928))
- DX: update `phpstan/phpstan-strict-rules`
([#&#8203;7924](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7924))
- feat: Add trailing comma in multiline to PER-CS 2.0
([#&#8203;7916](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7916))
- feat: Introduce `AttributeAnalysis`
([#&#8203;7909](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7909))
- feat: `@PHP84Migration` introduction
([#&#8203;7774](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7774))
- fix: Constant invocation detected in typed constants
([#&#8203;7892](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7892))
- fix: `PhpdocArrayTypeFixer` - JIT stack limit exhausted
([#&#8203;7895](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7895))
- test: Introduce Infection for mutation tests
([#&#8203;7874](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7874))

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

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

- fix: StatementIndentationFixer - do not crash on ternary operator in
class property
([#&#8203;7899](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7899))
- fix: `PhpCsFixer\Tokenizer\Tokens::setSize` return type
([#&#8203;7900](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7900))

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

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

- chore: fix PHP 8.4 deprecations
([#&#8203;7894](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7894))
- chore: fix PHPStan 1.10.60 issues
([#&#8203;7873](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7873))
- chore: list over array in more places
([#&#8203;7876](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7876))
- chore: replace template with variable in Preg class
([#&#8203;7882](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7882))
- chore: update PHPStan
([#&#8203;7871](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7871))
- depr: `nullable_type_declaration_for_default_null_value` - deprecate
option that is against `@PHP84Migration`
([#&#8203;7872](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7872))
- docs: Fix typo
([#&#8203;7889](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7889))
- feat: Add support for callable template in PHPDoc parser
([#&#8203;7084](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7084))
- feat: Add `array_indentation` to `PER-CS2.0` ruleset
([#&#8203;7881](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7881))
- feat: `@Symfony:risky` - add `no_unreachable_default_argument_value`
([#&#8203;7863](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7863))
- feat: `PhpCsFixer` ruleset - enable
`nullable_type_declaration_for_default_null_value`
([#&#8203;7870](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7870))
- fix: Constant invocation detected in DNF types
([#&#8203;7869](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7869))
- fix: Correctly indent multiline constants and properties
([#&#8203;7875](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7875))
- fix: `no_useless_concat_operator` - do not break variable
([#&#8203;7827](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7827))
- fix: `TokensAnalyzer` - handle unary operator in arrow functions
([#&#8203;7862](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7862))
- fix: `TypeExpression` - fix "JIT stack limit exhausted" error
([#&#8203;7843](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7843))

</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:eyJjcmVhdGVkSW5WZXIiOiIzNy4yNDUuMCIsInVwZGF0ZWRJblZlciI6IjM3LjI2OS4yIiwidGFyZ2V0QnJhbmNoIjoibWFpbiJ9-->

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: jo <ljonas@riseup.net>
2024-04-13 14:36:31 +02:00
renovate[bot] 0296446b70
chore(deps): update dependency pydantic to >=2.5.0,<2.8 ()
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [pydantic](https://togithub.com/pydantic/pydantic)
([changelog](https://docs.pydantic.dev/latest/changelog/)) |
`>=2.5.0,<2.7` -> `>=2.5.0,<2.8` |
[![age](https://developer.mend.io/api/mc/badges/age/pypi/pydantic/2.7.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/pypi/pydantic/2.7.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/pypi/pydantic/2.6.4/2.7.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/pydantic/2.6.4/2.7.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>pydantic/pydantic (pydantic)</summary>

###
[`v2.7.0`](https://togithub.com/pydantic/pydantic/blob/HEAD/HISTORY.md#v270-2024-04-11)

[Compare
Source](https://togithub.com/pydantic/pydantic/compare/v2.6.4...v2.7.0)

[GitHub
release](https://togithub.com/pydantic/pydantic/releases/tag/v2.7.0)

The code released in v2.7.0 is practically identical to that of
v2.7.0b1.

##### What's Changed

##### Packaging

- Reorganize `pyproject.toml` sections by
[@&#8203;Viicos](https://togithub.com/Viicos) in
[#&#8203;8899](https://togithub.com/pydantic/pydantic/pull/8899)
- Bump `pydantic-core` to `v2.18.1` by
[@&#8203;sydney-runkle](https://togithub.com/sydney-runkle) in
[#&#8203;9211](https://togithub.com/pydantic/pydantic/pull/9211)
- Adopt `jiter` `v0.2.0` by
[@&#8203;samuelcolvin](https://togithub.com/samuelcolvin) in
[](https://togithub.com/pydantic/pydantic-core/pull/1250)

##### New Features

- Extract attribute docstrings from `FieldInfo.description` by
[@&#8203;Viicos](https://togithub.com/Viicos) in
[#&#8203;6563](https://togithub.com/pydantic/pydantic/pull/6563)
- Add a `with_config` decorator to comply with typing spec by
[@&#8203;Viicos](https://togithub.com/Viicos) in
[#&#8203;8611](https://togithub.com/pydantic/pydantic/pull/8611)
- Allow an optional separator splitting the value and unit of the result
of `ByteSize.human_readable` by
[@&#8203;jks15satoshi](https://togithub.com/jks15satoshi) in
[#&#8203;8706](https://togithub.com/pydantic/pydantic/pull/8706)
- Add generic `Secret` base type by
[@&#8203;conradogarciaberrotaran](https://togithub.com/conradogarciaberrotaran)
in [#&#8203;8519](https://togithub.com/pydantic/pydantic/pull/8519)
- Make use of `Sphinx` inventories for cross references in docs by
[@&#8203;Viicos](https://togithub.com/Viicos) in
[#&#8203;8682](https://togithub.com/pydantic/pydantic/pull/8682)
- Add environment variable to disable plugins by
[@&#8203;geospackle](https://togithub.com/geospackle) in
[#&#8203;8767](https://togithub.com/pydantic/pydantic/pull/8767)
- Add support for `deprecated` fields by
[@&#8203;Viicos](https://togithub.com/Viicos) in
[#&#8203;8237](https://togithub.com/pydantic/pydantic/pull/8237)
- Allow `field_serializer('*')` by
[@&#8203;ornariece](https://togithub.com/ornariece) in
[#&#8203;9001](https://togithub.com/pydantic/pydantic/pull/9001)
- Handle a case when `model_config` is defined as a model property by
[@&#8203;alexeyt101](https://togithub.com/alexeyt101) in
[#&#8203;9004](https://togithub.com/pydantic/pydantic/pull/9004)
- Update `create_model()` to support `typing.Annotated` as input by
[@&#8203;wannieman98](https://togithub.com/wannieman98) in
[#&#8203;8947](https://togithub.com/pydantic/pydantic/pull/8947)
- Add `ClickhouseDsn` support by
[@&#8203;solidguy7](https://togithub.com/solidguy7) in
[#&#8203;9062](https://togithub.com/pydantic/pydantic/pull/9062)
- Add support for `re.Pattern[str]` to `pattern` field by
[@&#8203;jag-k](https://togithub.com/jag-k) in
[#&#8203;9053](https://togithub.com/pydantic/pydantic/pull/9053)
- Support for `serialize_as_any` runtime setting by
[@&#8203;sydney-runkle](https://togithub.com/sydney-runkle) in
[#&#8203;8830](https://togithub.com/pydantic/pydantic/pull/8830)
- Add support for `typing.Self` by
[@&#8203;Youssefares](https://togithub.com/Youssefares) in
[#&#8203;9023](https://togithub.com/pydantic/pydantic/pull/9023)
- Ability to pass `context` to serialization by
[@&#8203;ornariece](https://togithub.com/ornariece) in
[#&#8203;8965](https://togithub.com/pydantic/pydantic/pull/8965)
- Add feedback widget to docs with flarelytics integration by
[@&#8203;sydney-runkle](https://togithub.com/sydney-runkle) in
[#&#8203;9129](https://togithub.com/pydantic/pydantic/pull/9129)
- Support for parsing partial JSON strings in Python by
[@&#8203;samuelcolvin](https://togithub.com/samuelcolvin) in
[](https://togithub.com/pydantic/jiter/pull/66)

**Finalized in v2.7.0, rather than v2.7.0b1:**

- Add support for field level number to str coercion option by
[@&#8203;NeevCohen](https://togithub.com/NeevCohen) in
[#&#8203;9137](https://togithub.com/pydantic/pydantic/pull/9137)
- Update `warnings` parameter for serialization utilities to allow
raising a warning by
[@&#8203;Lance-Drane](https://togithub.com/Lance-Drane) in
[#&#8203;9166](https://togithub.com/pydantic/pydantic/pull/9166)

##### Changes

- Correct docs, logic for `model_construct` behavior with `extra` by
[@&#8203;sydney-runkle](https://togithub.com/sydney-runkle) in
[#&#8203;8807](https://togithub.com/pydantic/pydantic/pull/8807)
- Improve error message for improper `RootModel` subclasses by
[@&#8203;sydney-runkle](https://togithub.com/sydney-runkle) in
[#&#8203;8857](https://togithub.com/pydantic/pydantic/pull/8857)
- Use `PEP570` syntax by [@&#8203;Viicos](https://togithub.com/Viicos)
in [#&#8203;8940](https://togithub.com/pydantic/pydantic/pull/8940)
- Add `enum` and `type` to the JSON schema for single item literals by
[@&#8203;dmontagu](https://togithub.com/dmontagu) in
[#&#8203;8944](https://togithub.com/pydantic/pydantic/pull/8944)
- Deprecate `update_json_schema` internal function by
[@&#8203;sydney-runkle](https://togithub.com/sydney-runkle) in
[#&#8203;9125](https://togithub.com/pydantic/pydantic/pull/9125)
- Serialize duration to hour minute second, instead of just seconds by
[@&#8203;kakilangit](https://togithub.com/kakilangit) in
[](https://togithub.com/pydantic/speedate/pull/50)
- Trimming str before parsing to int and float by
[@&#8203;hungtsetse](https://togithub.com/hungtsetse) in
[](https://togithub.com/pydantic/pydantic-core/pull/1203)

##### Performance

- `enum` validator improvements by
[@&#8203;samuelcolvin](https://togithub.com/samuelcolvin) in
[#&#8203;9045](https://togithub.com/pydantic/pydantic/pull/9045)
- Move `enum` validation and serialization to Rust by
[@&#8203;samuelcolvin](https://togithub.com/samuelcolvin) in
[#&#8203;9064](https://togithub.com/pydantic/pydantic/pull/9064)
- Improve schema generation for nested dataclasses by
[@&#8203;sydney-runkle](https://togithub.com/sydney-runkle) in
[#&#8203;9114](https://togithub.com/pydantic/pydantic/pull/9114)
- Fast path for ASCII python string creation in JSON by
[@&#8203;samuelcolvin](https://togithub.com/samuelcolvin) in in
[](https://togithub.com/pydantic/jiter/pull/72)
- SIMD integer and string JSON parsing on `aarch64`(**Note:** SIMD on
x86 will be implemented in a future release) by
[@&#8203;samuelcolvin](https://togithub.com/samuelcolvin) in in
[](https://togithub.com/pydantic/jiter/pull/65)
- Support JSON `Cow<str>` from `jiter` by
[@&#8203;davidhewitt](https://togithub.com/davidhewitt) in
[](https://togithub.com/pydantic/pydantic-core/pull/1231)
- MAJOR performance improvement: update to PyO3 0.21 final by
[@&#8203;davidhewitt](https://togithub.com/davidhewitt) in
[](https://togithub.com/pydantic/pydantic-core/pull/1248)
- cache Python strings by
[@&#8203;samuelcolvin](https://togithub.com/samuelcolvin) in
[](https://togithub.com/pydantic/pydantic-core/pull/1240)

##### Fixes

- Fix strict parsing for some `Sequence`s by
[@&#8203;sydney-runkle](https://togithub.com/sydney-runkle) in
[#&#8203;8614](https://togithub.com/pydantic/pydantic/pull/8614)
- Add a check on the existence of `__qualname__` by
[@&#8203;anci3ntr0ck](https://togithub.com/anci3ntr0ck) in
[#&#8203;8642](https://togithub.com/pydantic/pydantic/pull/8642)
- Handle `__pydantic_extra__` annotation being a string or inherited by
[@&#8203;alexmojaki](https://togithub.com/alexmojaki) in
[#&#8203;8659](https://togithub.com/pydantic/pydantic/pull/8659)
- Fix json validation for `NameEmail` by
[@&#8203;Holi0317](https://togithub.com/Holi0317) in
[#&#8203;8650](https://togithub.com/pydantic/pydantic/pull/8650)
- Fix type-safety of attribute access in `BaseModel` by
[@&#8203;bluenote10](https://togithub.com/bluenote10) in
[#&#8203;8651](https://togithub.com/pydantic/pydantic/pull/8651)
- Fix bug with `mypy` plugin and `no_strict_optional = True` by
[@&#8203;dmontagu](https://togithub.com/dmontagu) in
[#&#8203;8666](https://togithub.com/pydantic/pydantic/pull/8666)
- Fix `ByteSize` error `type` change by
[@&#8203;sydney-runkle](https://togithub.com/sydney-runkle) in
[#&#8203;8681](https://togithub.com/pydantic/pydantic/pull/8681)
- Fix inheriting annotations in dataclasses by
[@&#8203;sydney-runkle](https://togithub.com/sydney-runkle) in
[#&#8203;8679](https://togithub.com/pydantic/pydantic/pull/8679)
- Fix regression in core schema generation for indirect definition
references by [@&#8203;dmontagu](https://togithub.com/dmontagu) in
[#&#8203;8702](https://togithub.com/pydantic/pydantic/pull/8702)
- Fix unsupported types bug with plain validator by
[@&#8203;sydney-runkle](https://togithub.com/sydney-runkle) in
[#&#8203;8710](https://togithub.com/pydantic/pydantic/pull/8710)
- Reverting problematic fix from 2.6 release, fixing schema building bug
by [@&#8203;sydney-runkle](https://togithub.com/sydney-runkle) in
[#&#8203;8718](https://togithub.com/pydantic/pydantic/pull/8718)
- fixes `__pydantic_config__` ignored for TypeDict by
[@&#8203;13sin](https://togithub.com/13sin) in
[#&#8203;8734](https://togithub.com/pydantic/pydantic/pull/8734)
- Fix test failures with `pytest v8.0.0` due to `pytest.warns()`
starting to work inside `pytest.raises()` by
[@&#8203;mgorny](https://togithub.com/mgorny) in
[#&#8203;8678](https://togithub.com/pydantic/pydantic/pull/8678)
- Use `is_valid_field` from 1.x for `mypy` plugin by
[@&#8203;DanielNoord](https://togithub.com/DanielNoord) in
[#&#8203;8738](https://togithub.com/pydantic/pydantic/pull/8738)
- Better-support `mypy` strict equality flag by
[@&#8203;dmontagu](https://togithub.com/dmontagu) in
[#&#8203;8799](https://togithub.com/pydantic/pydantic/pull/8799)
- model_json_schema export with Annotated types misses 'required'
parameters by [@&#8203;LouisGobert](https://togithub.com/LouisGobert) in
[#&#8203;8793](https://togithub.com/pydantic/pydantic/pull/8793)
- Fix default inclusion in `FieldInfo.__repr_args__` by
[@&#8203;sydney-runkle](https://togithub.com/sydney-runkle) in
[#&#8203;8801](https://togithub.com/pydantic/pydantic/pull/8801)
- Fix resolution of forward refs in dataclass base classes that are not
present in the subclass module namespace by
[@&#8203;matsjoyce-refeyn](https://togithub.com/matsjoyce-refeyn) in
[#&#8203;8751](https://togithub.com/pydantic/pydantic/pull/8751)
- Fix `BaseModel` type annotations to be resolvable by
`typing.get_type_hints` by
[@&#8203;devmonkey22](https://togithub.com/devmonkey22) in
[#&#8203;7680](https://togithub.com/pydantic/pydantic/pull/7680)
- Fix: allow empty string aliases with `AliasGenerator` by
[@&#8203;sydney-runkle](https://togithub.com/sydney-runkle) in
[#&#8203;8810](https://togithub.com/pydantic/pydantic/pull/8810)
- Fix test along with `date` -> `datetime` timezone assumption fix by
[@&#8203;sydney-runkle](https://togithub.com/sydney-runkle) in
[#&#8203;8823](https://togithub.com/pydantic/pydantic/pull/8823)
- Fix deprecation warning with usage of `ast.Str` by
[@&#8203;Viicos](https://togithub.com/Viicos) in
[#&#8203;8837](https://togithub.com/pydantic/pydantic/pull/8837)
- Add missing `deprecated` decorators by
[@&#8203;Viicos](https://togithub.com/Viicos) in
[#&#8203;8877](https://togithub.com/pydantic/pydantic/pull/8877)
- Fix serialization of `NameEmail` if name includes an email address by
[@&#8203;NeevCohen](https://togithub.com/NeevCohen) in
[#&#8203;8860](https://togithub.com/pydantic/pydantic/pull/8860)
- Add information about class in error message of schema generation by
[@&#8203;Czaki](https://togithub.com/Czaki) in
[#&#8203;8917](https://togithub.com/pydantic/pydantic/pull/8917)
- Make `TypeAdapter`'s typing compatible with special forms by
[@&#8203;adriangb](https://togithub.com/adriangb) in
[#&#8203;8923](https://togithub.com/pydantic/pydantic/pull/8923)
- Fix issue with config behavior being baked into the ref schema for
`enum`s by [@&#8203;dmontagu](https://togithub.com/dmontagu) in
[#&#8203;8920](https://togithub.com/pydantic/pydantic/pull/8920)
- More helpful error re wrong `model_json_schema` usage by
[@&#8203;sydney-runkle](https://togithub.com/sydney-runkle) in
[#&#8203;8928](https://togithub.com/pydantic/pydantic/pull/8928)
- Fix nested discriminated union schema gen, pt 2 by
[@&#8203;sydney-runkle](https://togithub.com/sydney-runkle) in
[#&#8203;8932](https://togithub.com/pydantic/pydantic/pull/8932)
- Fix schema build for nested dataclasses / TypedDicts with
discriminators by
[@&#8203;sydney-runkle](https://togithub.com/sydney-runkle) in
[#&#8203;8950](https://togithub.com/pydantic/pydantic/pull/8950)
- Remove unnecessary logic for definitions schema gen with discriminated
unions by [@&#8203;sydney-runkle](https://togithub.com/sydney-runkle) in
[#&#8203;8951](https://togithub.com/pydantic/pydantic/pull/8951)
- Fix handling of optionals in `mypy` plugin by
[@&#8203;dmontagu](https://togithub.com/dmontagu) in
[#&#8203;9008](https://togithub.com/pydantic/pydantic/pull/9008)
- Fix `PlainSerializer` usage with std type constructor by
[@&#8203;sydney-runkle](https://togithub.com/sydney-runkle) in
[#&#8203;9031](https://togithub.com/pydantic/pydantic/pull/9031)
- Remove unnecessary warning for config in plugin by
[@&#8203;dmontagu](https://togithub.com/dmontagu) in
[#&#8203;9039](https://togithub.com/pydantic/pydantic/pull/9039)
- Fix default value serializing by
[@&#8203;NeevCohen](https://togithub.com/NeevCohen) in
[#&#8203;9066](https://togithub.com/pydantic/pydantic/pull/9066)
- Fix extra fields check in `Model.__getattr__()` by
[@&#8203;NeevCohen](https://togithub.com/NeevCohen) in
[#&#8203;9082](https://togithub.com/pydantic/pydantic/pull/9082)
- Fix `ClassVar` forward ref inherited from parent class by
[@&#8203;alexmojaki](https://togithub.com/alexmojaki) in
[#&#8203;9097](https://togithub.com/pydantic/pydantic/pull/9097)
- fix sequence like validator with strict `True` by
[@&#8203;andresliszt](https://togithub.com/andresliszt) in
[#&#8203;8977](https://togithub.com/pydantic/pydantic/pull/8977)
- Improve warning message when a field name shadows a field in a parent
model by [@&#8203;chan-vince](https://togithub.com/chan-vince) in
[#&#8203;9105](https://togithub.com/pydantic/pydantic/pull/9105)
- Do not warn about shadowed fields if they are not redefined in a child
class by [@&#8203;chan-vince](https://togithub.com/chan-vince) in
[#&#8203;9111](https://togithub.com/pydantic/pydantic/pull/9111)
- Fix discriminated union bug with unsubstituted type var by
[@&#8203;sydney-runkle](https://togithub.com/sydney-runkle) in
[#&#8203;9124](https://togithub.com/pydantic/pydantic/pull/9124)
- Support serialization of `deque` when passed to `Sequence[blah blah
blah]` by [@&#8203;sydney-runkle](https://togithub.com/sydney-runkle) in
[#&#8203;9128](https://togithub.com/pydantic/pydantic/pull/9128)
- Init private attributes from super-types in `model_post_init` by
[@&#8203;Viicos](https://togithub.com/Viicos) in
[#&#8203;9134](https://togithub.com/pydantic/pydantic/pull/9134)
- fix `model_construct` with `validation_alias` by
[@&#8203;ornariece](https://togithub.com/ornariece) in
[#&#8203;9144](https://togithub.com/pydantic/pydantic/pull/9144)
- Ensure json-schema generator handles `Literal` `null` types by
[@&#8203;bruno-f-cruz](https://togithub.com/bruno-f-cruz) in
[#&#8203;9135](https://togithub.com/pydantic/pydantic/pull/9135)
- **Fixed in v2.7.0**: Fix allow extra generic by
[@&#8203;dmontagu](https://togithub.com/dmontagu) in
[#&#8203;9193](https://togithub.com/pydantic/pydantic/pull/9193)

##### New Contributors

- [@&#8203;hungtsetse](https://togithub.com/hungtsetse) made their first
contribution in
[#&#8203;8546](https://togithub.com/pydantic/pydantic/pull/8546)
- [@&#8203;StrawHatDrag0n](https://togithub.com/StrawHatDrag0n) made
their first contribution in
[#&#8203;8583](https://togithub.com/pydantic/pydantic/pull/8583)
- [@&#8203;anci3ntr0ck](https://togithub.com/anci3ntr0ck) made their
first contribution in
[#&#8203;8642](https://togithub.com/pydantic/pydantic/pull/8642)
- [@&#8203;Holi0317](https://togithub.com/Holi0317) made their first
contribution in
[#&#8203;8650](https://togithub.com/pydantic/pydantic/pull/8650)
- [@&#8203;bluenote10](https://togithub.com/bluenote10) made their first
contribution in
[#&#8203;8651](https://togithub.com/pydantic/pydantic/pull/8651)
- [@&#8203;ADSteele916](https://togithub.com/ADSteele916) made their
first contribution in
[#&#8203;8703](https://togithub.com/pydantic/pydantic/pull/8703)
- [@&#8203;musicinmybrain](https://togithub.com/musicinmybrain) made
their first contribution in
[#&#8203;8731](https://togithub.com/pydantic/pydantic/pull/8731)
- [@&#8203;jks15satoshi](https://togithub.com/jks15satoshi) made their
first contribution in
[#&#8203;8706](https://togithub.com/pydantic/pydantic/pull/8706)
- [@&#8203;13sin](https://togithub.com/13sin) made their first
contribution in
[#&#8203;8734](https://togithub.com/pydantic/pydantic/pull/8734)
- [@&#8203;DanielNoord](https://togithub.com/DanielNoord) made their
first contribution in
[#&#8203;8738](https://togithub.com/pydantic/pydantic/pull/8738)
-
[@&#8203;conradogarciaberrotaran](https://togithub.com/conradogarciaberrotaran)
made their first contribution in
[#&#8203;8519](https://togithub.com/pydantic/pydantic/pull/8519)
- [@&#8203;chris-griffin](https://togithub.com/chris-griffin) made their
first contribution in
[#&#8203;8775](https://togithub.com/pydantic/pydantic/pull/8775)
- [@&#8203;LouisGobert](https://togithub.com/LouisGobert) made their
first contribution in
[#&#8203;8793](https://togithub.com/pydantic/pydantic/pull/8793)
- [@&#8203;matsjoyce-refeyn](https://togithub.com/matsjoyce-refeyn) made
their first contribution in
[#&#8203;8751](https://togithub.com/pydantic/pydantic/pull/8751)
- [@&#8203;devmonkey22](https://togithub.com/devmonkey22) made their
first contribution in
[#&#8203;7680](https://togithub.com/pydantic/pydantic/pull/7680)
- [@&#8203;adamency](https://togithub.com/adamency) made their first
contribution in
[#&#8203;8847](https://togithub.com/pydantic/pydantic/pull/8847)
- [@&#8203;MamfTheKramf](https://togithub.com/MamfTheKramf) made their
first contribution in
[#&#8203;8851](https://togithub.com/pydantic/pydantic/pull/8851)
- [@&#8203;ornariece](https://togithub.com/ornariece) made their first
contribution in
[#&#8203;9001](https://togithub.com/pydantic/pydantic/pull/9001)
- [@&#8203;alexeyt101](https://togithub.com/alexeyt101) made their first
contribution in
[#&#8203;9004](https://togithub.com/pydantic/pydantic/pull/9004)
- [@&#8203;wannieman98](https://togithub.com/wannieman98) made their
first contribution in
[#&#8203;8947](https://togithub.com/pydantic/pydantic/pull/8947)
- [@&#8203;solidguy7](https://togithub.com/solidguy7) made their first
contribution in
[#&#8203;9062](https://togithub.com/pydantic/pydantic/pull/9062)
- [@&#8203;kloczek](https://togithub.com/kloczek) made their first
contribution in
[#&#8203;9047](https://togithub.com/pydantic/pydantic/pull/9047)
- [@&#8203;jag-k](https://togithub.com/jag-k) made their first
contribution in
[#&#8203;9053](https://togithub.com/pydantic/pydantic/pull/9053)
- [@&#8203;priya-gitTest](https://togithub.com/priya-gitTest) made their
first contribution in
[#&#8203;9088](https://togithub.com/pydantic/pydantic/pull/9088)
- [@&#8203;Youssefares](https://togithub.com/Youssefares) made their
first contribution in
[#&#8203;9023](https://togithub.com/pydantic/pydantic/pull/9023)
- [@&#8203;chan-vince](https://togithub.com/chan-vince) made their first
contribution in
[#&#8203;9105](https://togithub.com/pydantic/pydantic/pull/9105)
- [@&#8203;bruno-f-cruz](https://togithub.com/bruno-f-cruz) made their
first contribution in
[#&#8203;9135](https://togithub.com/pydantic/pydantic/pull/9135)
- [@&#8203;Lance-Drane](https://togithub.com/Lance-Drane) made their
first contribution in
[#&#8203;9166](https://togithub.com/pydantic/pydantic/pull/9166)

</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 these
updates 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:eyJjcmVhdGVkSW5WZXIiOiIzNy4yNjkuMiIsInVwZGF0ZWRJblZlciI6IjM3LjI2OS4yIiwidGFyZ2V0QnJhbmNoIjoibWFpbiJ9-->

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: jo <ljonas@riseup.net>
2024-04-13 14:29:58 +02:00
renovate[bot] 66436a7b9e chore(deps): update pre-commit hook pre-commit/pre-commit-hooks to v4.6.0 2024-04-08 03:37:17 +00:00
renovate[bot] a5949ee155
chore(deps): update dependency django-filter to >=2.4.0,<24.3 ()
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [django-filter](https://togithub.com/carltongibson/django-filter)
([changelog](https://togithub.com/carltongibson/django-filter/blob/main/CHANGES.rst))
| `>=2.4.0,<24.2` -> `>=2.4.0,<24.3` |
[![age](https://developer.mend.io/api/mc/badges/age/pypi/django-filter/24.2?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/pypi/django-filter/24.2?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/pypi/django-filter/24.1/24.2?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/django-filter/24.1/24.2?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>carltongibson/django-filter (django-filter)</summary>

###
[`v24.2`](https://togithub.com/carltongibson/django-filter/blob/HEAD/CHANGES.rst#Version-242-2024-03-27)

[Compare
Source](https://togithub.com/carltongibson/django-filter/compare/24.1...24.2)

- Fixed a regression in v23.4 where callable choices were incorrectly
evaluated
    at filter instantiation, on Django versions prior to 5.0.

    Thanks to Craig de Stigter for the report and reproduce.

</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 these
updates 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:eyJjcmVhdGVkSW5WZXIiOiIzNy4yNjkuMiIsInVwZGF0ZWRJblZlciI6IjM3LjI2OS4yIiwidGFyZ2V0QnJhbmNoIjoibWFpbiJ9-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-04-06 18:48:14 +02:00
renovate[bot] d31d4fc5bf
chore(deps): update dependency uvicorn to >=0.17.6,<0.30.0 ()
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [uvicorn](https://togithub.com/encode/uvicorn)
([changelog](https://togithub.com/encode/uvicorn/blob/master/CHANGELOG.md))
| `>=0.17.6,<0.29.0` -> `>=0.17.6,<0.30.0` |
[![age](https://developer.mend.io/api/mc/badges/age/pypi/uvicorn/0.29.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/pypi/uvicorn/0.29.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/pypi/uvicorn/0.28.1/0.29.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/uvicorn/0.28.1/0.29.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>encode/uvicorn (uvicorn)</summary>

###
[`v0.29.0`](https://togithub.com/encode/uvicorn/blob/HEAD/CHANGELOG.md#0290---2024-03-19)

[Compare
Source](https://togithub.com/encode/uvicorn/compare/0.28.1...0.29.0)

##### Added

- Cooperative signal handling
([#&#8203;1600](https://togithub.com/encode/uvicorn/issues/1600))
19/03/24

</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 these
updates 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:eyJjcmVhdGVkSW5WZXIiOiIzNy4yNDUuMCIsInVwZGF0ZWRJblZlciI6IjM3LjI2MS4wIiwidGFyZ2V0QnJhbmNoIjoibWFpbiJ9-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-04-06 18:48:02 +02:00
renovate[bot] 78f4fcfec8
chore(deps): update dependency pytest-cov to v5 ()
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [pytest-cov](https://togithub.com/pytest-dev/pytest-cov)
([changelog](https://pytest-cov.readthedocs.io/en/latest/changelog.html))
| `>=4.0.0,<5` -> `>=4.0.0,<6` |
[![age](https://developer.mend.io/api/mc/badges/age/pypi/pytest-cov/5.0.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/pypi/pytest-cov/5.0.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/pypi/pytest-cov/4.1.0/5.0.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/pytest-cov/4.1.0/5.0.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>pytest-dev/pytest-cov (pytest-cov)</summary>

###
[`v5.0.0`](https://togithub.com/pytest-dev/pytest-cov/blob/HEAD/CHANGELOG.rst#500-2024-03-24)

[Compare
Source](https://togithub.com/pytest-dev/pytest-cov/compare/v4.1.0...v5.0.0)

-   Removed support for xdist rsync (now deprecated).
Contributed by Matthias Reichenbach in `#&#8203;623
<https://github.com/pytest-dev/pytest-cov/pull/623>`\_.
-   Switched docs theme to Furo.
-   Various legacy Python cleanup and CI improvements.
    Contributed by Christian Clauss and Hugo van Kemenade in
    `#&#8203;630 <https://github.com/pytest-dev/pytest-cov/pull/630>`*,
    `#&#8203;631 <https://github.com/pytest-dev/pytest-cov/pull/631>`*,
`#&#8203;632 <https://github.com/pytest-dev/pytest-cov/pull/632>`\_ and
    `#&#8203;633 <https://github.com/pytest-dev/pytest-cov/pull/633>`\_.
-   Added a `pyproject.toml` example in the docs.
Contributed by Dawn James in `#&#8203;626
<https://github.com/pytest-dev/pytest-cov/pull/626>`\_.
- Modernized project's pre-commit hooks to use ruff. Initial POC
contributed by
Christian Clauss in `#&#8203;584
<https://github.com/pytest-dev/pytest-cov/pull/584>`\_.

</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:eyJjcmVhdGVkSW5WZXIiOiIzNy4yNjkuMiIsInVwZGF0ZWRJblZlciI6IjM3LjI2OS4yIiwidGFyZ2V0QnJhbmNoIjoibWFpbiJ9-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-04-06 18:47:53 +02:00
renovate[bot] f6092e84d7 chore(deps): lock file maintenance (legacy/composer.json) 2024-03-27 15:29:40 +00:00
Keoni Mahelona 634e6e236d
fix: incorrect docker compose version ()
### Description

There is no docker compose file version 3.9, see
https://docs.docker.com/compose/compose-file/compose-versioning/. The
`init` command is used in the compose file and I wonder if we can set
this to 3.7. When I followed the docs here
https://libretime.org/docs/admin-manual/install/install-using-docker/, I
was unable to get the docker compose to work because of a version issue.
So I upgraded docker (on Ubuntu focal) but realised that 3.9 isn't even
mentioned on the Docker website. 3.8 is, which I tried to use but it
failed. 3.7 worked for me.

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

Docs are not affected.

### Testing Notes

**What I did:**

I was following the
[docs](https://libretime.org/docs/admin-manual/install/install-using-docker/)
but then rand into a docker compose file version error. I'm using docker
engine version 26,

```
Client: Docker Engine - Community
 Version:           26.0.0
 API version:       1.45
 Go version:        go1.21.8
 Git commit:        2ae903e
 Built:             Wed Mar 20 15:17:51 2024
 OS/Arch:           linux/amd64
 Context:           default

Server: Docker Engine - Community
 Engine:
  Version:          26.0.0
  API version:      1.45 (minimum version 1.24)
  Go version:       go1.21.8
  Git commit:       8b79278
  Built:            Wed Mar 20 15:17:51 2024
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.6.28
  GitCommit:        ae07eda36dd25f8a1b98dfbf587313b99c0190bb
 runc:
  Version:          1.1.12
  GitCommit:        v1.1.12-0-g51d5e94
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

Ubuntu Version
Distributor ID:	Ubuntu
Description:	Ubuntu 20.04.6 LTS
Release:	20.04
Codename:	focal
```

which is very recent. When I checked the docker compose version
[page](https://docs.docker.com/compose/compose-file/compose-versioning/),
it doesn't even list 3.9 as a version, only 3.8. For whatever reason 3.8
did not work for me, but 3.7 does.

**How you can replicate my testing:**

Follow the docs,
https://libretime.org/docs/admin-manual/install/install-using-docker/.
If docker compose fails to run, and says
```
ERROR: Version in "./docker-compose.yml" is unsupported. You might be seeing this error because you're using the wrong Compose file version. Either specify a supported version (e.g "2.2" or "3.3") and place your service definitions under the `services` key, or omit the `version` key and place your service definitions at the root of the file to use version 1.
```
then change the version to 3.7.

### **Links**

N/A
2024-03-26 10:29:16 +01:00
renovate[bot] c286774e99 chore(deps): update pre-commit hook asottile/pyupgrade to v3.15.2 2024-03-25 21:13:53 +00:00
renovate[bot] e8e88f7d46 chore(deps): lock file maintenance (legacy/composer.json) 2024-03-19 19:32:13 +00:00
renovate[bot] f44445ae21 chore(deps): update pre-commit hook psf/black-pre-commit-mirror to v24.3.0 2024-03-18 15:27:43 +00:00
Weblate (bot) d067d640dc
chore(legacy): translations update from Hosted Weblate ()
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: Mikachu <micah.sh@proton.me>
2024-03-17 08:49:52 +00:00
renovate[bot] 18a0eec000
chore(deps): update dependency django-filter to v24 ()
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [django-filter](https://togithub.com/carltongibson/django-filter)
([changelog](https://togithub.com/carltongibson/django-filter/blob/main/CHANGES.rst))
| `>=2.4.0,<23.6` -> `>=2.4.0,<24.2` |
[![age](https://developer.mend.io/api/mc/badges/age/pypi/django-filter/24.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/pypi/django-filter/24.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/pypi/django-filter/23.5/24.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/django-filter/23.5/24.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>carltongibson/django-filter (django-filter)</summary>

###
[`v24.1`](https://togithub.com/carltongibson/django-filter/blob/HEAD/CHANGES.rst#Version-241-2024-03-08)

[Compare
Source](https://togithub.com/carltongibson/django-filter/compare/23.5...24.1)

- Updated supported Python and Django versions, and resolved upcoming
Django
    deprecations.

    Required versions are now at least Python 3.8 and Django 4.2.

    Thanks to Michael Manganiello.

-   Allowed passing a FilterSet class to the filterset_factory().

    Thanks to Birger Schacht.

-   Set empty default value of filterset data to MultiValueDict.

    Thanks to Shlomo Gordon.

-   Preserve list values passed to the data dict in CSV widgets.

    Thanks to Bryan Brancotte.

-   Updates French and Ukrainian localisations.

    Thanks to Weblate.

</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 these
updates 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:eyJjcmVhdGVkSW5WZXIiOiIzNy4yMzAuMCIsInVwZGF0ZWRJblZlciI6IjM3LjIzMC4wIiwidGFyZ2V0QnJhbmNoIjoibWFpbiJ9-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-03-10 11:46:52 +01:00
renovate[bot] 8ddd601b35
chore(deps): update dependency uvicorn to >=0.17.6,<0.29.0 ()
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [uvicorn](https://togithub.com/encode/uvicorn)
([changelog](https://togithub.com/encode/uvicorn/blob/master/CHANGELOG.md))
| `>=0.17.6,<0.28.0` -> `>=0.17.6,<0.29.0` |
[![age](https://developer.mend.io/api/mc/badges/age/pypi/uvicorn/0.28.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/pypi/uvicorn/0.28.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/pypi/uvicorn/0.27.1/0.28.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/uvicorn/0.27.1/0.28.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>encode/uvicorn (uvicorn)</summary>

###
[`v0.28.0`](https://togithub.com/encode/uvicorn/blob/HEAD/CHANGELOG.md#0280---2024-03-09)

[Compare
Source](https://togithub.com/encode/uvicorn/compare/0.27.1...0.28.0)

##### Added

- Raise `ClientDisconnected` on `send()` when client disconnected
([#&#8203;2220](https://togithub.com/encode/uvicorn/issues/2220))
12/02/24

##### Fixed

- Except `AttributeError` on `sys.stdin.fileno()` for Windows IIS10
([#&#8203;1947](https://togithub.com/encode/uvicorn/issues/1947))
29/02/24
- Use `X-Forwarded-Proto` for WebSockets scheme when the proxy provides
it ([#&#8203;2258](https://togithub.com/encode/uvicorn/issues/2258))
01/03/24

</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 these
updates 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:eyJjcmVhdGVkSW5WZXIiOiIzNy4yMzAuMCIsInVwZGF0ZWRJblZlciI6IjM3LjIzMC4wIiwidGFyZ2V0QnJhbmNoIjoibWFpbiJ9-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-03-10 11:46:05 +01:00
renovate[bot] d92168ac19 chore(deps): update softprops/action-gh-release action to v2 2024-03-10 06:20:07 +00:00
Jonas L cc28293150
chore: reenable vale rule after fix ()
Fixes 
2024-03-02 14:15:50 +01:00
renovate[bot] 200dffef44
chore(deps): update dependency python-dateutil to >=2.8.1,<2.10 ()
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [python-dateutil](https://togithub.com/dateutil/dateutil) |
`>=2.8.1,<2.9` -> `>=2.8.1,<2.10` |
[![age](https://developer.mend.io/api/mc/badges/age/pypi/python-dateutil/2.9.0.post0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/pypi/python-dateutil/2.9.0.post0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/pypi/python-dateutil/2.8.2/2.9.0.post0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/python-dateutil/2.8.2/2.9.0.post0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>dateutil/dateutil (python-dateutil)</summary>

###
[`v2.9.0.post0`](https://togithub.com/dateutil/dateutil/releases/tag/2.9.0.post0)

[Compare
Source](https://togithub.com/dateutil/dateutil/compare/2.9.0...2.9.0.post0)

### Version 2.9.0.post0 (2024-03-01)

#### Bugfixes

- Pinned `setuptools_scm` to `<8`, which should make the generated
`_version.py` file compatible with all supported versions of Python.

###
[`v2.9.0`](https://togithub.com/dateutil/dateutil/releases/tag/2.9.0)

[Compare
Source](https://togithub.com/dateutil/dateutil/compare/2.8.2...2.9.0)

### Version 2.9.0 (2024-02-29)

#### Data updates

- Updated tzdata version to 2024a. (gh pr
[#&#8203;1342](https://togithub.com/dateutil/dateutil/issues/1342))

#### Features

- Made all `dateutil` submodules lazily imported using [PEP
562](https://www.python.org/dev/peps/pep-0562/). On Python 3.7+, things
like `import dateutil; dateutil.tz.gettz("America/New_York")` will now
work without explicitly importing `dateutil.tz`, with the import
occurring behind the scenes on first use. The old behavior remains on
Python 3.6 and earlier. Fixed by Orson Adams. (gh issue
[#&#8203;771](https://togithub.com/dateutil/dateutil/issues/771), gh pr
[#&#8203;1007](https://togithub.com/dateutil/dateutil/issues/1007))

#### Bugfixes

- Removed a call to `datetime.utcfromtimestamp`, which is deprecated as
of Python 3.12. Reported by Hugo van Kemenade (gh pr
[#&#8203;1284](https://togithub.com/dateutil/dateutil/issues/1284)),
fixed by Thomas Grainger (gh pr
[#&#8203;1285](https://togithub.com/dateutil/dateutil/issues/1285)).

#### Documentation changes

- Added note into docs and tests where relativedelta would return last
day of the month only if the same day on a different month resolves to a
date that doesn't exist. Reported by
[@&#8203;hawkEye-01](https://togithub.com/hawkEye-01) (gh issue
[#&#8203;1167](https://togithub.com/dateutil/dateutil/issues/1167)).
Fixed by [@&#8203;Mifrill](https://togithub.com/Mifrill) (gh pr
[#&#8203;1168](https://togithub.com/dateutil/dateutil/issues/1168))

</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 these
updates 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:eyJjcmVhdGVkSW5WZXIiOiIzNy4yMjAuMiIsInVwZGF0ZWRJblZlciI6IjM3LjIyMC4yIiwidGFyZ2V0QnJhbmNoIjoibWFpbiJ9-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-03-02 14:12:37 +01:00
Thomas Göttgens feca75b28b
docs: get libfdk-aac from non-free source for debian 11 ()
Co-authored-by: Jonas L <jooola@users.noreply.github.com>
2024-02-29 22:08:51 +01:00
renovate[bot] 22c303cfff
fix(deps): update dependency friendsofphp/php-cs-fixer to <3.51.1 ()
[![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.49.1` -> `<3.51.1` |
[![age](https://developer.mend.io/api/mc/badges/age/packagist/friendsofphp%2fphp-cs-fixer/3.51.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/packagist/friendsofphp%2fphp-cs-fixer/3.51.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/packagist/friendsofphp%2fphp-cs-fixer/3.49.0/3.51.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/packagist/friendsofphp%2fphp-cs-fixer/3.49.0/3.51.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

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

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

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

- chore: add missing tests for non-documentation classes
([#&#8203;7848](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7848))
- chore: do not perform type analysis in tests
([#&#8203;7852](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7852))
- chore: list over array in more places
([#&#8203;7857](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7857))
- chore: tests documentation classes
([#&#8203;7855](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7855))
- feat: `@Symfony` - add nullable_type_declaration
([#&#8203;7856](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7856))
- test: fix wrong type in param annotation
([#&#8203;7858](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7858))

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

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

- chore: add missing types
([#&#8203;7842](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7842))
- chore: BlocksAnalyzer - raise exception on invalid index
([#&#8203;7819](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7819))
- chore: DataProviderAnalysis - expect list over array
([#&#8203;7800](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7800))
- chore: do not use `@large` on method level
([#&#8203;7832](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7832))
- chore: do not use `@medium` on method level
([#&#8203;7833](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7833))
- chore: Fix typos
([#&#8203;7835](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7835))
- chore: rename variables
([#&#8203;7847](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7847))
- chore: some improvements around array typehints
([#&#8203;7799](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7799))
- CI: fix PHP 8.4 job
([#&#8203;7829](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7829))
- DX: Include `symfony/var-dumper` in dev tools
([#&#8203;7795](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7795))
- feat: Ability to remove unused imports from multi-use statements
([#&#8203;7815](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7815))
- feat: allow PHPUnit 11
([#&#8203;7824](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7824))
- feat: Allow shortening symbols from multi-use statements (only classes
for now)
([#&#8203;7816](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7816))
- feat: introduce `PhpdocArrayTypeFixer`
([#&#8203;7812](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7812))
- feat: PhpUnitTestCaseStaticMethodCallsFixer - cover PHPUnit v11
methods
([#&#8203;7822](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7822))
- feat: Support for multi-use statements in `NamespaceUsesAnalyzer`
([#&#8203;7814](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7814))
- feat: `MbStrFunctionsFixer` - add support for `mb_trim`, `mb_ltrim`
and `mb_rtrim` functions
([#&#8203;7840](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7840))
- feat: `NoEmptyPhpdocFixer` - do not leave empty line after removing
PHPDoc
([#&#8203;7820](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7820))
- feat: `no_superfluous_phpdoc_tags` - introduce `allow_future_params`
option
([#&#8203;7743](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7743))
- fix: do not use wrongly named arguments in data providers
([#&#8203;7823](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7823))
- fix: Ensure PCNTL extension is always installed in Docker
([#&#8203;7782](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7782))
- fix: PhpdocListTypeFixer - support key types containing `<…>`
([#&#8203;7817](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7817))
- fix: Proper build target for local Docker Compose
([#&#8203;7834](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7834))
- fix: union PHPDoc support in `fully_qualified_strict_types` fixer
([#&#8203;7719](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7719))
- fix: `ExecutorWithoutErrorHandler` - remove invalid PHP 7.4 type
([#&#8203;7845](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7845))
- fix: `fully_qualified_strict_types` must honor template/local type
identifiers
([#&#8203;7724](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7724))
- fix: `MethodArgumentSpaceFixer` - do not break heredoc/nowdoc
([#&#8203;7828](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7828))
- fix: `NumericLiteralSeparatorFixer` - do not change `float` to `int`
when there is nothing after the dot
([#&#8203;7805](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7805))
- fix: `PhpUnitStrictFixer` - do not crash on property having the name
of method to fix
([#&#8203;7804](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7804))
- fix: `SingleSpaceAroundConstructFixer` - correctly recognise multiple
constants
([#&#8203;7700](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7700))
- fix: `TypeExpression` - handle array shape key with dash
([#&#8203;7841](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7841))

</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:eyJjcmVhdGVkSW5WZXIiOiIzNy4yMDAuMCIsInVwZGF0ZWRJblZlciI6IjM3LjIxMi4wIiwidGFyZ2V0QnJhbmNoIjoibWFpbiJ9-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-02-29 22:00:17 +01:00
renovate[bot] 9ef153fc6b
chore(deps): update rabbitmq docker tag to v3.13 ()
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
| rabbitmq | minor | `3.12-alpine` -> `3.13-alpine` |

---

### 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:eyJjcmVhdGVkSW5WZXIiOiIzNy4yMDAuMCIsInVwZGF0ZWRJblZlciI6IjM3LjIwMC4wIiwidGFyZ2V0QnJhbmNoIjoibWFpbiJ9-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-02-25 05:39:10 +00:00
renovate[bot] 288a30d77b chore(deps): lock file maintenance (legacy/composer.json) 2024-02-21 17:12:41 +00:00
renovate[bot] 6acf2e3f5a
chore(deps): lock file maintenance (legacy/composer.json) ()
[![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:eyJjcmVhdGVkSW5WZXIiOiIzNy4yMDAuMCIsInVwZGF0ZWRJblZlciI6IjM3LjIwMC4wIiwidGFyZ2V0QnJhbmNoIjoibWFpbiJ9-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-02-20 10:37:45 +00:00
renovate[bot] 8deebb3f85
chore(deps): update pre-commit hook asottile/pyupgrade to v3.15.1 ()
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [asottile/pyupgrade](https://togithub.com/asottile/pyupgrade) |
repository | patch | `v3.15.0` -> `v3.15.1` |

Note: The `pre-commit` manager in Renovate is not supported by the
`pre-commit` maintainers or community. Please do not report any problems
there, instead [create a Discussion in the Renovate
repository](https://togithub.com/renovatebot/renovate/discussions/new)
if you have any questions.

---

### Release Notes

<details>
<summary>asottile/pyupgrade (asottile/pyupgrade)</summary>

###
[`v3.15.1`](https://togithub.com/asottile/pyupgrade/compare/v3.15.0...v3.15.1)

[Compare
Source](https://togithub.com/asottile/pyupgrade/compare/v3.15.0...v3.15.1)

</details>

---

### Configuration

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

🚦 **Automerge**: Enabled.

♻ **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:eyJjcmVhdGVkSW5WZXIiOiIzNy4yMDAuMCIsInVwZGF0ZWRJblZlciI6IjM3LjIwMC4wIiwidGFyZ2V0QnJhbmNoIjoibWFpbiJ9-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-02-20 10:37:26 +00:00
Kyle Robbertze bace9ed917 ci: disable overly-sensitive vale rule 2024-02-19 08:27:23 +00:00
Kyle Robbertze 4584b52121 docs: fix broken link 2024-02-19 08:27:23 +00:00
Thomas Göttgens 270aa08ae6
fix(legacy): allow updating track types code ()
Since moving to an indexed track_type model for 3.0, the constraint of the code being immutable is no longer
valid, since it's not used as index anymore. This commit removes the readonly flag from that form field.
2024-02-18 19:10:30 +01:00
renovate[bot] 0e6e9ff7ff chore(deps): update pre-commit hook psf/black-pre-commit-mirror to v24.2.0 2024-02-14 16:39:07 +00:00
renovate[bot] 64401150b1 chore(deps): update pre-commit hook adamchainz/django-upgrade to v1.16.0 2024-02-13 12:26:23 +00:00
Weblate (bot) 12461c4597
chore(legacy): translations update from Hosted Weblate ()
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-02-12 05:48:36 +00:00
renovate[bot] 117bc79809
chore(deps): update pre-commit/action action to v3.0.1 ()
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [pre-commit/action](https://togithub.com/pre-commit/action) | action |
patch | `v3.0.0` -> `v3.0.1` |

---

### Release Notes

<details>
<summary>pre-commit/action (pre-commit/action)</summary>

###
[`v3.0.1`](https://togithub.com/pre-commit/action/releases/tag/v3.0.1):
pre-commit/action@v3.0.1

[Compare
Source](https://togithub.com/pre-commit/action/compare/v3.0.0...v3.0.1)

##### Misc

-   Update actions/cache to v4
- [#&#8203;190](https://togithub.com/pre-commit/action/issues/190) PR by
[@&#8203;SukiCZ](https://togithub.com/SukiCZ).
- [#&#8203;189](https://togithub.com/pre-commit/action/issues/189) issue
by [@&#8203;bakerkj](https://togithub.com/bakerkj).

</details>

---

### Configuration

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

🚦 **Automerge**: Enabled.

♻ **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:eyJjcmVhdGVkSW5WZXIiOiIzNy4xNzMuMCIsInVwZGF0ZWRJblZlciI6IjM3LjE3My4wIiwidGFyZ2V0QnJhbmNoIjoibWFpbiJ9-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-02-09 23:37:02 +00:00
Jonas L 35d0dec4a8
fix: apply replay gain preferences on scheduled files ()
### Description

The replay gain preferences are applied in the legacy code, but the
playout code was missing this feature. The replay gain was not applied
when playout fetched the schedules.


37d1a7685e/legacy/application/models/Schedule.php (L881-L886)
2024-02-08 20:29:10 +01:00
Jonas L 37d1a7685e
fix(legacy): replay_gain_modifier should be a system preference () 2024-02-08 19:48:49 +01:00
Weblate (bot) 3b353ec74b
chore(legacy): translations update from Hosted Weblate ()
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-02-07 23:47:31 +00:00
renovate[bot] f7405f18ed chore(deps): update codecov/codecov-action action to v4 2024-02-05 03:32:06 +00:00
libretime-bot 2b119adab2 chore(legacy): update locales 2024-02-05 01:52:47 +00:00
Thomas Göttgens f4b260fdf7
fix(legacy): fix hidden fields in edit file form ()
this removes a visual gap between artwork and editor fields. I stumbled
across this while updating the form to include replay gain.


![grafik](https://github.com/libretime/libretime/assets/25002/267f4d7b-e12e-4c86-b37e-420311dc3dec)
2024-02-03 22:31:00 +01:00
Jonas L 29f73e0dcb
fix(analyzer): backslash non utf-8 data when probing replaygain ()
### Description

Fixes 
2024-02-02 20:44:15 +01:00
renovate[bot] 3e05748d2d
fix(deps): update dependency friendsofphp/php-cs-fixer to <3.49.1 ()
[![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.46.1` -> `<3.49.1` |
[![age](https://developer.mend.io/api/mc/badges/age/packagist/friendsofphp%2fphp-cs-fixer/3.49.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/packagist/friendsofphp%2fphp-cs-fixer/3.49.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/packagist/friendsofphp%2fphp-cs-fixer/3.46.0/3.49.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/packagist/friendsofphp%2fphp-cs-fixer/3.46.0/3.49.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

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

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

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

- chore(checkbashisms): update to 2.23.7
([#&#8203;7780](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7780))
- chore: add missing key types in PHPDoc types
([#&#8203;7779](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7779))
- chore: Exclude `topic/core` issues/PRs from Stale Bot
([#&#8203;7788](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7788))
- chore: `DescribeCommand` - better handling of deprecations
([#&#8203;7778](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7778))
- docs: docker - use gitlab reporter in GitLab integration example
([#&#8203;7764](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7764))
- docs: docker in CI - don't suggest command that overrides path from
config file
([#&#8203;7763](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7763))
- DX: check deprecations exactly
([#&#8203;7742](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7742))
- feat: Add `ordered_types` to `@Symfony`
([#&#8203;7356](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7356))
- feat: introduce `PhpdocListTypeFixer`
([#&#8203;7796](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7796))
- feat: introduce `string_implicit_backslashes` as
`escape_implicit_backslashes` replacement
([#&#8203;7669](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7669))
- feat: update
`Symfony.nullable_type_declaration_for_default_null_value` config
([#&#8203;7773](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7773))
- feat: `@PhpCsFixer` ruleset - enable `php_unit_data_provider_static`
([#&#8203;7685](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7685))
- fix: Allow using cache when running in Docker distribution
([#&#8203;7769](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7769))
- fix: ClassDefinitionFixer for anonymous class with phpdoc/attribute on
separate line
([#&#8203;7546](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7546))
- fix: `ClassKeywordFixer` must run before
`FullyQualifiedStrictTypesFixer`
([#&#8203;7767](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7767))
- fix: `function_to_constant` `get_class()` replacement
([#&#8203;7770](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7770))
- fix: `LowercaseStaticReferenceFixer` - do not change typed constants
([#&#8203;7775](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7775))
- fix: `PhpdocTypesFixer` - handle more complex types
([#&#8203;7791](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7791))
- fix: `TypeExpression` - do not break type using `walkTypes` method
([#&#8203;7785](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7785))

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

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

- chore: `FullyQualifiedStrictTypesFixer` must run before
`OrderedInterfacesFixer`
([#&#8203;7762](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7762))
- docs: Add PHP-CS-Fixer integration in a GitHub Action step
([#&#8203;7757](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7757))
- feat: `PhpdocTypesOrderFixer` Support DNF types
([#&#8203;7732](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7732))
- fix: Support shebang in fixers operating on PHP opening tag
([#&#8203;7687](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7687))
- fix: work correctly for a switch/case with ternary operator
([#&#8203;7756](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7756))
- fix: `NoUselessConcatOperatorFixer` - do not remove new line
([#&#8203;7759](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7759))

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

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

- fix: Do not override short name with relative reference
([#&#8203;7752](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7752))
- fix: make `BinaryOperatorSpacesFixer` work as pre-v3.47
([#&#8203;7751](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7751))
- fix: Proper Docker image name suffix
([#&#8203;7739](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7739))
- fix: `FullyQualifiedStrictTypesFixer` - do not change case of the
symbol when there's name collision between imported class and imported
function
([#&#8203;7750](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7750))
- fix: `FullyQualifiedStrictTypesFixer` - do not modify statements with
property fetch and `::`
([#&#8203;7749](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7749))

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

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

- chore: better identify EXPERIMENTAL rules
([#&#8203;7729](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7729))
- chore: fix issue detected by unlocked PHPStan + upgrade dev-tools
([#&#8203;7678](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7678))
- chore: handle extract()
([#&#8203;7684](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7684))
- chore: Mention contributors in app info
([#&#8203;7668](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7668))
- chore: no need to mark private methods as internal
([#&#8203;7715](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7715))
- chore: ProjectCodeTests - dry for function usage extractions
([#&#8203;7690](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7690))
- chore: reduce PHPStan baseline
([#&#8203;7644](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7644))
- chore: use numeric literal separator for PHP version IDs
([#&#8203;7712](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7712))
- chore: use numeric_literal_separator for project
([#&#8203;7713](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7713))
- chore: Utils::sortElements - better typing
([#&#8203;7646](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7646))
- CI: Allow running Stale Bot on demand
([#&#8203;7711](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7711))
- CI: Fix PHP 8.4
([#&#8203;7702](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7702))
- CI: Give write permissions to Stale Bot
([#&#8203;7716](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7716))
- CI: Use `actions/stale` v9
([#&#8203;7710](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7710))
- docs: Add information about allowing maintainers to update PRs
([#&#8203;7683](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7683))
- docs: CONTRIBUTING.md - update Opening a PR
([#&#8203;7691](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7691))
- docs: Display/include tool info/version by default in commands and
reports
([#&#8203;7733](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7733))
- DX: fix deprecation tests warnings for PHP 7.4
([#&#8203;7725](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7725))
- DX: update `host.docker.internal` in Compose override template
([#&#8203;7661](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7661))
- DX: `NumericLiteralSeparatorFixer` - change default strategy to
`use_separator`
([#&#8203;7730](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7730))
- feat: Add support for official Docker images of Fixer
([#&#8203;7555](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7555))
- feat: Add `spacing` option to `PhpdocAlignFixer`
([#&#8203;6505](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/6505))
- feat: Add `union_types` option to `phpdoc_to_param_type`,
`phpdoc_to_property_type`, and `phpdoc_to_return_type` fixers
([#&#8203;7672](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7672))
- feat: Introduce `heredoc_closing_marker` fixer
([#&#8203;7660](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7660))
- feat: Introduce `multiline_string_to_heredoc` fixer
([#&#8203;7665](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7665))
- feat: Introduce `NumericLiteralSeparatorFixer`
([#&#8203;6761](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/6761))
- feat: no_superfluous_phpdoc_tags - support for arrow function
([#&#8203;7666](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7666))
- feat: Simplify closing marker when possible in
`heredoc_closing_marker` fixer
([#&#8203;7676](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7676))
- feat: Support typed properties and attributes in
`fully_qualified_strict_types`
([#&#8203;7659](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7659))
- feat: `@PhpCsFixer` ruleset - enable
no_whitespace_before_comma_in_array.after_heredoc
([#&#8203;7670](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7670))
- fix: Improve progress bar visual layer
([#&#8203;7708](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7708))
- fix: indentation of control structure body without braces
([#&#8203;7663](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7663))
- fix: make sure all PHP extensions required by PHPUnit are installed
([#&#8203;7727](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7727))
- fix: PhpdocToReturnTypeFixerTest - support for arrow functions
([#&#8203;7645](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7645))
- fix: Several improvements for `fully_qualified_strict_types` (respect
declared symbols, relative imports, leading backslash in global
namespace)
([#&#8203;7679](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7679))
- fix: SimplifiedNullReturnFixer - support array return typehint
([#&#8203;7728](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7728))
- fix: Support numeric values without leading zero in
`numeric_literal_separator`
([#&#8203;7735](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7735))
- fix: `BinaryOperatorSpacesFixer` - align correctly when multiple
shifts occurs in single line
([#&#8203;7593](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7593))
- fix: `ClassReferenceNameCasingFixer` capitalizes the property name
after the nullsafe operator
([#&#8203;7696](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7696))
- fix: `fully_qualified_strict_types` with
`leading_backslash_in_global_namespace` enabled - handle reserved types
in phpDoc
([#&#8203;7648](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7648))
- fix: `NoSpaceAroundDoubleColonFixer` must run before
`MethodChainingIndentationFixer`
([#&#8203;7723](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7723))
- fix: `no_superfluous_phpdoc_tags` must honor multiline docs
([#&#8203;7697](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7697))
- fix: `numeric_literal_separator` - Handle zero-leading floats properly
([#&#8203;7737](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7737))
- refactor: increase performance by ~7% thanks to `Tokens::block*Cache`
hit increased by ~12%
([#&#8203;6176](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/6176))
- refactor: Tokens - fast check for non-block in 'detectBlockType',
evaluate definitions only once in 'getBlockEdgeDefinitions'
([#&#8203;7655](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7655))
- refactor: `Tokens::clearEmptyTokens` - play defensive with cache
clearing
([#&#8203;7658](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7658))
- test: ensure we do not forget to test any short_open_tag test
([#&#8203;7638](https://togithub.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7638))

</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:eyJjcmVhdGVkSW5WZXIiOiIzNy4xMjcuMCIsInVwZGF0ZWRJblZlciI6IjM3LjE1My4yIiwidGFyZ2V0QnJhbmNoIjoibWFpbiJ9-->

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: jo <ljonas@riseup.net>
2024-02-02 20:39:10 +01:00
renovate[bot] ed2f874633
chore(deps): update dependency black to v24 ()
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [black](https://togithub.com/psf/black)
([changelog](https://togithub.com/psf/black/blob/main/CHANGES.md)) |
`>=23.1.0,<24` -> `>=23.1.0,<25` |
[![age](https://developer.mend.io/api/mc/badges/age/pypi/black/24.1.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/pypi/black/24.1.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/pypi/black/23.12.1/24.1.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/black/23.12.1/24.1.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>psf/black (black)</summary>

###
[`v24.1.1`](https://togithub.com/psf/black/blob/HEAD/CHANGES.md#2411)

[Compare Source](https://togithub.com/psf/black/compare/24.1.0...24.1.1)

Bugfix release to fix a bug that made Black unusable on certain file
systems with strict
limits on path length.

##### Preview style

- Consistently add trailing comma on typed parameters
([#&#8203;4164](https://togithub.com/psf/black/issues/4164))

##### Configuration

- Shorten the length of the name of the cache file to fix crashes on
file systems that
do not support long paths
([#&#8203;4176](https://togithub.com/psf/black/issues/4176))

###
[`v24.1.0`](https://togithub.com/psf/black/blob/HEAD/CHANGES.md#2410)

[Compare
Source](https://togithub.com/psf/black/compare/23.12.1...24.1.0)

##### Highlights

This release introduces the new 2024 stable style
([#&#8203;4106](https://togithub.com/psf/black/issues/4106)),
stabilizing the following
changes:

- Add parentheses around `if`-`else` expressions
([#&#8203;2278](https://togithub.com/psf/black/issues/2278))
- Dummy class and function implementations consisting only of `...` are
formatted more
compactly ([#&#8203;3796](https://togithub.com/psf/black/issues/3796))
- If an assignment statement is too long, we now prefer splitting on the
right-hand side
    ([#&#8203;3368](https://togithub.com/psf/black/issues/3368))
- Hex codes in Unicode escape sequences are now standardized to
lowercase ([#&#8203;2916](https://togithub.com/psf/black/issues/2916))
- Allow empty first lines at the beginning of most blocks
([#&#8203;3967](https://togithub.com/psf/black/issues/3967),
[#&#8203;4061](https://togithub.com/psf/black/issues/4061))
- Add parentheses around long type annotations
([#&#8203;3899](https://togithub.com/psf/black/issues/3899))
- Enforce newline after module docstrings
([#&#8203;3932](https://togithub.com/psf/black/issues/3932),
[#&#8203;4028](https://togithub.com/psf/black/issues/4028))
- Fix incorrect magic trailing comma handling in return types
([#&#8203;3916](https://togithub.com/psf/black/issues/3916))
- Remove blank lines before class docstrings
([#&#8203;3692](https://togithub.com/psf/black/issues/3692))
- Wrap multiple context managers in parentheses if combined in a single
`with` statement
    ([#&#8203;3489](https://togithub.com/psf/black/issues/3489))
- Fix bug in line length calculations for power operations
([#&#8203;3942](https://togithub.com/psf/black/issues/3942))
- Add trailing commas to collection literals even if there's a comment
after the last
    entry ([#&#8203;3393](https://togithub.com/psf/black/issues/3393))
- When using `--skip-magic-trailing-comma` or `-C`, trailing commas are
stripped from
subscript expressions with more than 1 element
([#&#8203;3209](https://togithub.com/psf/black/issues/3209))
- Add extra blank lines in stubs in a few cases
([#&#8203;3564](https://togithub.com/psf/black/issues/3564),
[#&#8203;3862](https://togithub.com/psf/black/issues/3862))
- Accept raw strings as docstrings
([#&#8203;3947](https://togithub.com/psf/black/issues/3947))
- Split long lines in case blocks
([#&#8203;4024](https://togithub.com/psf/black/issues/4024))
- Stop removing spaces from walrus operators within subscripts
([#&#8203;3823](https://togithub.com/psf/black/issues/3823))
- Fix incorrect formatting of certain async statements
([#&#8203;3609](https://togithub.com/psf/black/issues/3609))
- Allow combining `# fmt: skip` with other comments
([#&#8203;3959](https://togithub.com/psf/black/issues/3959))

There are already a few improvements in the `--preview` style, which are
slated for the
2025 stable style. Try them out and
[share your feedback](https://togithub.com/psf/black/issues). In the
past, the preview
style has included some features that we were not able to stabilize.
This year, we're
adding a separate `--unstable` style for features with known problems.
Now, the
`--preview` style only includes features that we actually expect to make
it into next
year's stable style.

##### Stable style

Several bug fixes were made in features that are moved to the stable
style in this
release:

- Fix comment handling when parenthesising conditional expressions
([#&#8203;4134](https://togithub.com/psf/black/issues/4134))
- Fix bug where spaces were not added around parenthesized walruses in
subscripts,
unlike other binary operators
([#&#8203;4109](https://togithub.com/psf/black/issues/4109))
- Remove empty lines before docstrings in async functions
([#&#8203;4132](https://togithub.com/psf/black/issues/4132))
- Address a missing case in the change to allow empty lines at the
beginning of all
blocks, except immediately before a docstring
([#&#8203;4130](https://togithub.com/psf/black/issues/4130))
- For stubs, fix logic to enforce empty line after nested classes with
bodies ([#&#8203;4141](https://togithub.com/psf/black/issues/4141))

##### Preview style

- Add `--unstable` style, covering preview features that have known
problems that would
block them from going into the stable style. Also add the
`--enable-unstable-feature`
    flag; for example, use
`--enable-unstable-feature hug_parens_with_braces_and_square_brackets`
to apply this
preview feature throughout 2024, even if a later Black release
downgrades the feature
to unstable ([#&#8203;4096](https://togithub.com/psf/black/issues/4096))
- Format module docstrings the same as class and function docstrings
([#&#8203;4095](https://togithub.com/psf/black/issues/4095))
- Fix crash when using a walrus in a dictionary
([#&#8203;4155](https://togithub.com/psf/black/issues/4155))
- Fix unnecessary parentheses when wrapping long dicts
([#&#8203;4135](https://togithub.com/psf/black/issues/4135))
- Stop normalizing spaces before `# fmt: skip` comments
([#&#8203;4146](https://togithub.com/psf/black/issues/4146))

##### Configuration

- Print warning when configuration in `pyproject.toml` contains an
invalid key ([#&#8203;4165](https://togithub.com/psf/black/issues/4165))
- Fix symlink handling, properly ignoring symlinks that point outside of
root ([#&#8203;4161](https://togithub.com/psf/black/issues/4161))
- Fix cache mtime logic that resulted in false positive cache hits
([#&#8203;4128](https://togithub.com/psf/black/issues/4128))
- Remove the long-deprecated `--experimental-string-processing` flag.
This feature can
currently be enabled with `--preview --enable-unstable-feature
string_processing`.
    ([#&#8203;4096](https://togithub.com/psf/black/issues/4096))

##### Integrations

- Revert the change to run Black's pre-commit integration only on
specific git hooks
([#&#8203;3940](https://togithub.com/psf/black/issues/3940)) for better
compatibility with older versions of pre-commit
([#&#8203;4137](https://togithub.com/psf/black/issues/4137))

</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:eyJjcmVhdGVkSW5WZXIiOiIzNy4xMzUuMCIsInVwZGF0ZWRJblZlciI6IjM3LjE1My4yIiwidGFyZ2V0QnJhbmNoIjoibWFpbiJ9-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-02-02 20:39:00 +01:00
renovate[bot] 7a3fffd45f
chore(deps): update pre-commit hook psf/black-pre-commit-mirror to v24 ()
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
|
[psf/black-pre-commit-mirror](https://togithub.com/psf/black-pre-commit-mirror)
| repository | major | `23.12.1` -> `24.1.1` |

Note: The `pre-commit` manager in Renovate is not supported by the
`pre-commit` maintainers or community. Please do not report any problems
there, instead [create a Discussion in the Renovate
repository](https://togithub.com/renovatebot/renovate/discussions/new)
if you have any questions.

---

### Release Notes

<details>
<summary>psf/black-pre-commit-mirror
(psf/black-pre-commit-mirror)</summary>

###
[`v24.1.1`](https://togithub.com/psf/black-pre-commit-mirror/compare/24.1.0...24.1.1)

[Compare
Source](https://togithub.com/psf/black-pre-commit-mirror/compare/24.1.0...24.1.1)

###
[`v24.1.0`](https://togithub.com/psf/black-pre-commit-mirror/compare/23.12.1...24.1.0)

[Compare
Source](https://togithub.com/psf/black-pre-commit-mirror/compare/23.12.1...24.1.0)

</details>

---

### Configuration

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

🚦 **Automerge**: Enabled.

♻ **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:eyJjcmVhdGVkSW5WZXIiOiIzNy4xMzUuMCIsInVwZGF0ZWRJblZlciI6IjM3LjE1My4yIiwidGFyZ2V0QnJhbmNoIjoibWFpbiJ9-->

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: jo <ljonas@riseup.net>
2024-02-02 20:24:25 +01:00
Thomas Göttgens a95ce3d229
feat(legacy): trim overbooked shows after autoloading a playlist ()
### 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>
2024-02-02 20:17:23 +01:00
Thomas Göttgens 170d09545e
feat(legacy): disable public radio page and redirect to login ()
### 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>
2024-02-02 19:04:12 +01:00
renovate[bot] 199831458f
chore(deps): update docker/metadata-action action to v5.5.1 ()
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [docker/metadata-action](https://togithub.com/docker/metadata-action)
| action | minor | `v5.4.0` -> `v5.5.1` |

---

### Release Notes

<details>
<summary>docker/metadata-action (docker/metadata-action)</summary>

###
[`v5.5.1`](https://togithub.com/docker/metadata-action/releases/tag/v5.5.1)

[Compare
Source](https://togithub.com/docker/metadata-action/compare/v5.5.0...v5.5.1)

- Don't set `cwd://` prefix for local bake files by
[@&#8203;crazy-max](https://togithub.com/crazy-max) in
[https://github.com/docker/metadata-action/pull/382](https://togithub.com/docker/metadata-action/pull/382)

**Full Changelog**:
https://github.com/docker/metadata-action/compare/v5.5.0...v5.5.1

###
[`v5.5.0`](https://togithub.com/docker/metadata-action/releases/tag/v5.5.0)

[Compare
Source](https://togithub.com/docker/metadata-action/compare/v5.4.0...v5.5.0)

- Set `cwd://` prefix for bake files path by
[@&#8203;crazy-max](https://togithub.com/crazy-max) in
[https://github.com/docker/metadata-action/pull/370](https://togithub.com/docker/metadata-action/pull/370)
- Bump
[@&#8203;docker/actions-toolkit](https://togithub.com/docker/actions-toolkit)
from 0.16.0 to 0.16.1 in
[https://github.com/docker/metadata-action/pull/371](https://togithub.com/docker/metadata-action/pull/371)
- Bump moment from 2.29.4 to 2.30.1 in
[https://github.com/docker/metadata-action/pull/373](https://togithub.com/docker/metadata-action/pull/373)
- Bump moment-timezone from 0.5.43 to 0.5.44 in
[https://github.com/docker/metadata-action/pull/374](https://togithub.com/docker/metadata-action/pull/374)

**Full Changelog**:
https://github.com/docker/metadata-action/compare/v5.4.0...v5.5.0

</details>

---

### Configuration

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

🚦 **Automerge**: Enabled.

♻ **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:eyJjcmVhdGVkSW5WZXIiOiIzNy4xNTMuMiIsInVwZGF0ZWRJblZlciI6IjM3LjE1My4yIiwidGFyZ2V0QnJhbmNoIjoibWFpbiJ9-->

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Kyle Robbertze <kyle@paddatrapper.com>
2024-02-01 16:23:04 +00:00
renovate[bot] 88a293370d
chore(deps): update dependency pytest to v8 ()
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [pytest](https://docs.pytest.org/en/latest/)
([source](https://togithub.com/pytest-dev/pytest),
[changelog](https://docs.pytest.org/en/stable/changelog.html)) |
`>=7.2.1,<8` -> `>=7.2.1,<9` |
[![age](https://developer.mend.io/api/mc/badges/age/pypi/pytest/8.0.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/pypi/pytest/8.0.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/pypi/pytest/7.4.4/8.0.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/pytest/7.4.4/8.0.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>pytest-dev/pytest (pytest)</summary>

###
[`v8.0.0`](https://togithub.com/pytest-dev/pytest/compare/7.4.4...8.0.0)

[Compare
Source](https://togithub.com/pytest-dev/pytest/compare/7.4.4...8.0.0)

</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:eyJjcmVhdGVkSW5WZXIiOiIzNy4xMzUuMCIsInVwZGF0ZWRJblZlciI6IjM3LjE1My4yIiwidGFyZ2V0QnJhbmNoIjoibWFpbiJ9-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-01-30 17:34:11 +00:00
renovate[bot] c2e6d15014
chore(deps): update dependency pydantic to >=2.5.0,<2.7 ()
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [pydantic](https://togithub.com/pydantic/pydantic)
([changelog](https://docs.pydantic.dev/latest/changelog/)) |
`>=2.5.0,<2.6` -> `>=2.5.0,<2.7` |
[![age](https://developer.mend.io/api/mc/badges/age/pypi/pydantic/2.6.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/pypi/pydantic/2.6.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/pypi/pydantic/2.5.3/2.6.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/pydantic/2.5.3/2.6.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>pydantic/pydantic (pydantic)</summary>

###
[`v2.6.0`](https://togithub.com/pydantic/pydantic/blob/HEAD/HISTORY.md#v260-2024-01-23)

[Compare
Source](https://togithub.com/pydantic/pydantic/compare/v2.5.3...v2.6.0)

[GitHub
release](https://togithub.com/pydantic/pydantic/releases/tag/v2.6.0)

The code released in v2.6.0 is practically identical to that of
v2.6.0b1.

##### What's Changed

##### Packaging

- Check for `email-validator` version >= 2.0 by
[@&#8203;commonism](https://togithub.com/commonism) in
[#&#8203;6033](https://togithub.com/pydantic/pydantic/pull/6033)
- Upgrade \`ruff\`\` target version to Python 3.8 by
[@&#8203;Elkiwa](https://togithub.com/Elkiwa) in
[#&#8203;8341](https://togithub.com/pydantic/pydantic/pull/8341)
- Update to `pydantic-extra-types==2.4.1` by
[@&#8203;yezz123](https://togithub.com/yezz123) in
[#&#8203;8478](https://togithub.com/pydantic/pydantic/pull/8478)
- Update to `pyright==1.1.345` by
[@&#8203;Viicos](https://togithub.com/Viicos) in
[#&#8203;8453](https://togithub.com/pydantic/pydantic/pull/8453)
- Update pydantic-core from 2.14.6 to 2.16.1, significant changes from
these updates are described below, full changelog
[here](https://togithub.com/pydantic/pydantic-core/compare/v2.14.6...v2.16.1)

##### New Features

- Add `NatsDsn` by [@&#8203;ekeew](https://togithub.com/ekeew) in
[#&#8203;6874](https://togithub.com/pydantic/pydantic/pull/6874)
- Add `ConfigDict.ser_json_inf_nan` by
[@&#8203;davidhewitt](https://togithub.com/davidhewitt) in
[#&#8203;8159](https://togithub.com/pydantic/pydantic/pull/8159)
- Add `types.OnErrorOmit` by
[@&#8203;adriangb](https://togithub.com/adriangb) in
[#&#8203;8222](https://togithub.com/pydantic/pydantic/pull/8222)
- Support `AliasGenerator` usage by
[@&#8203;sydney-runkle](https://togithub.com/sydney-runkle) in
[#&#8203;8282](https://togithub.com/pydantic/pydantic/pull/8282)
- Add Pydantic People Page to docs by
[@&#8203;sydney-runkle](https://togithub.com/sydney-runkle) in
[#&#8203;8345](https://togithub.com/pydantic/pydantic/pull/8345)
- Support `yyyy-MM-DD` datetime parsing by
[@&#8203;sydney-runkle](https://togithub.com/sydney-runkle) in
[#&#8203;8404](https://togithub.com/pydantic/pydantic/pull/8404)
- Added bits conversions to the `ByteSize` class
[#&#8203;8415](https://togithub.com/pydantic/pydantic/issues/8415) by
[@&#8203;luca-matei](https://togithub.com/luca-matei) in
[#&#8203;8507](https://togithub.com/pydantic/pydantic/pull/8507)
- Enable json schema creation with type `ByteSize` by
[@&#8203;geospackle](https://togithub.com/geospackle) in
[#&#8203;8537](https://togithub.com/pydantic/pydantic/pull/8537)
- Add `eval_type_backport` to handle union operator and builtin generic
subscripting in older Pythons by
[@&#8203;alexmojaki](https://togithub.com/alexmojaki) in
[#&#8203;8209](https://togithub.com/pydantic/pydantic/pull/8209)
- Add support for `dataclass` fields `init` by
[@&#8203;dmontagu](https://togithub.com/dmontagu) in
[#&#8203;8552](https://togithub.com/pydantic/pydantic/pull/8552)
- Implement pickling for `ValidationError` by
[@&#8203;davidhewitt](https://togithub.com/davidhewitt) in
[](https://togithub.com/pydantic/pydantic-core/pull/1119)
- Add unified tuple validator that can handle "variadic" tuples via
PEP-646 by [@&#8203;dmontagu](https://togithub.com/dmontagu) in
[](https://togithub.com/pydantic/pydantic-core/pull/865)

##### Changes

- Drop Python3.7 support by
[@&#8203;hramezani](https://togithub.com/hramezani) in
[#&#8203;7188](https://togithub.com/pydantic/pydantic/pull/7188)
- Drop Python 3.7, and PyPy 3.7 and 3.8 by
[@&#8203;davidhewitt](https://togithub.com/davidhewitt) in
[](https://togithub.com/pydantic/pydantic-core/pull/1129)
- Use positional-only `self` in `BaseModel` constructor, so no field
name can ever conflict with it by
[@&#8203;ariebovenberg](https://togithub.com/ariebovenberg) in
[#&#8203;8072](https://togithub.com/pydantic/pydantic/pull/8072)
- Make `@validate_call` return a function instead of a custom descriptor
- fixes binding issue with inheritance and adds `self/cls` argument to
validation errors by
[@&#8203;alexmojaki](https://togithub.com/alexmojaki) in
[#&#8203;8268](https://togithub.com/pydantic/pydantic/pull/8268)
- Exclude `BaseModel` docstring from JSON schema description by
[@&#8203;sydney-runkle](https://togithub.com/sydney-runkle) in
[#&#8203;8352](https://togithub.com/pydantic/pydantic/pull/8352)
- Introducing `classproperty` decorator for `model_computed_fields` by
[@&#8203;Jocelyn-Gas](https://togithub.com/Jocelyn-Gas) in
[#&#8203;8437](https://togithub.com/pydantic/pydantic/pull/8437)
- Explicitly raise an error if field names clashes with types by
[@&#8203;Viicos](https://togithub.com/Viicos) in
[#&#8203;8243](https://togithub.com/pydantic/pydantic/pull/8243)
- Use stricter serializer for unions of simple types by
[@&#8203;alexdrydew](https://togithub.com/alexdrydew)
[](https://togithub.com/pydantic/pydantic-core/pull/1132)

##### Performance

- Add Codspeed profiling Actions workflow by
[@&#8203;lambertsbennett](https://togithub.com/lambertsbennett) in
[#&#8203;8054](https://togithub.com/pydantic/pydantic/pull/8054)
- Improve `int` extraction by
[@&#8203;samuelcolvin](https://togithub.com/samuelcolvin) in
[](https://togithub.com/pydantic/pydantic-core/pull/1155)
- Improve performance of recursion guard by
[@&#8203;samuelcolvin](https://togithub.com/samuelcolvin) in
[](https://togithub.com/pydantic/pydantic-core/pull/1156)
- `dataclass` serialization speedups by
[@&#8203;samuelcolvin](https://togithub.com/samuelcolvin) in
[](https://togithub.com/pydantic/pydantic-core/pull/1162)
- Avoid `HashMap` creation when looking up small JSON objects in
`LazyIndexMaps` by
[@&#8203;samuelcolvin](https://togithub.com/samuelcolvin) in
[](https://togithub.com/pydantic/jiter/pull/55)
- use hashbrown to speedup python string caching by
[@&#8203;davidhewitt](https://togithub.com/davidhewitt) in
[](https://togithub.com/pydantic/jiter/pull/51)
- Replace `Peak` with more efficient `Peek` by
[@&#8203;davidhewitt](https://togithub.com/davidhewitt) in
[](https://togithub.com/pydantic/jiter/pull/48)

##### Fixes

- Move `getattr` warning in deprecated `BaseConfig` by
[@&#8203;tlambert03](https://togithub.com/tlambert03) in
[#&#8203;7183](https://togithub.com/pydantic/pydantic/pull/7183)
- Only hash `model_fields`, not whole `__dict__` by
[@&#8203;alexmojaki](https://togithub.com/alexmojaki) in
[#&#8203;7786](https://togithub.com/pydantic/pydantic/pull/7786)
- Fix mishandling of unions while freezing types in the `mypy` plugin by
[@&#8203;dmontagu](https://togithub.com/dmontagu) in
[#&#8203;7411](https://togithub.com/pydantic/pydantic/pull/7411)
- Fix `mypy` error on untyped `ClassVar` by
[@&#8203;vincent-hachin-wmx](https://togithub.com/vincent-hachin-wmx) in
[#&#8203;8138](https://togithub.com/pydantic/pydantic/pull/8138)
- Only compare pydantic fields in `BaseModel.__eq__` instead of whole
`__dict__` by
[@&#8203;QuentinSoubeyranAqemia](https://togithub.com/QuentinSoubeyranAqemia)
in [#&#8203;7825](https://togithub.com/pydantic/pydantic/pull/7825)
- Update `strict` docstring in `model_validate` method. by
[@&#8203;LukeTonin](https://togithub.com/LukeTonin) in
[#&#8203;8223](https://togithub.com/pydantic/pydantic/pull/8223)
- Fix overload position of `computed_field` by
[@&#8203;Viicos](https://togithub.com/Viicos) in
[#&#8203;8227](https://togithub.com/pydantic/pydantic/pull/8227)
- Fix custom type type casting used in multiple attributes by
[@&#8203;ianhfc](https://togithub.com/ianhfc) in
[#&#8203;8066](https://togithub.com/pydantic/pydantic/pull/8066)
- Fix issue not allowing `validate_call` decorator to be dynamically
assigned to a class method by
[@&#8203;jusexton](https://togithub.com/jusexton) in
[#&#8203;8249](https://togithub.com/pydantic/pydantic/pull/8249)
- Fix issue `unittest.mock` deprecation warnings by
[@&#8203;ibleedicare](https://togithub.com/ibleedicare) in
[#&#8203;8262](https://togithub.com/pydantic/pydantic/pull/8262)
- Added tests for the case `JsonValue` contains subclassed primitive
values by [@&#8203;jusexton](https://togithub.com/jusexton) in
[#&#8203;8286](https://togithub.com/pydantic/pydantic/pull/8286)
- Fix `mypy` error on free before validator (classmethod) by
[@&#8203;sydney-runkle](https://togithub.com/sydney-runkle) in
[#&#8203;8285](https://togithub.com/pydantic/pydantic/pull/8285)
- Fix `to_snake` conversion by
[@&#8203;jevins09](https://togithub.com/jevins09) in
[#&#8203;8316](https://togithub.com/pydantic/pydantic/pull/8316)
- Fix type annotation of `ModelMetaclass.__prepare__` by
[@&#8203;slanzmich](https://togithub.com/slanzmich) in
[#&#8203;8305](https://togithub.com/pydantic/pydantic/pull/8305)
- Disallow `config` specification when initializing a `TypeAdapter` when
the annotated type has config already by
[@&#8203;sydney-runkle](https://togithub.com/sydney-runkle) in
[#&#8203;8365](https://togithub.com/pydantic/pydantic/pull/8365)
- Fix a naming issue with JSON schema for generics parametrized by
recursive type aliases by
[@&#8203;dmontagu](https://togithub.com/dmontagu) in
[#&#8203;8389](https://togithub.com/pydantic/pydantic/pull/8389)
- Fix type annotation in pydantic people script by
[@&#8203;shenxiangzhuang](https://togithub.com/shenxiangzhuang) in
[#&#8203;8402](https://togithub.com/pydantic/pydantic/pull/8402)
- Add support for field `alias` in `dataclass` signature by
[@&#8203;NeevCohen](https://togithub.com/NeevCohen) in
[#&#8203;8387](https://togithub.com/pydantic/pydantic/pull/8387)
- Fix bug with schema generation with `Field(...)` in a forward ref by
[@&#8203;dmontagu](https://togithub.com/dmontagu) in
[#&#8203;8494](https://togithub.com/pydantic/pydantic/pull/8494)
- Fix ordering of keys in `__dict__` with `model_construct` call by
[@&#8203;sydney-runkle](https://togithub.com/sydney-runkle) in
[#&#8203;8500](https://togithub.com/pydantic/pydantic/pull/8500)
- Fix module `path_type` creation when globals does not contain
`__name__` by [@&#8203;hramezani](https://togithub.com/hramezani) in
[#&#8203;8470](https://togithub.com/pydantic/pydantic/pull/8470)
- Fix for namespace issue with dataclasses with `from __future__ import
annotations` by
[@&#8203;sydney-runkle](https://togithub.com/sydney-runkle) in
[#&#8203;8513](https://togithub.com/pydantic/pydantic/pull/8513)
- Fix: make function validator types positional-only by
[@&#8203;pmmmwh](https://togithub.com/pmmmwh) in
[#&#8203;8479](https://togithub.com/pydantic/pydantic/pull/8479)
- Fix usage of `@deprecated` by
[@&#8203;Viicos](https://togithub.com/Viicos) in
[#&#8203;8294](https://togithub.com/pydantic/pydantic/pull/8294)
- Add more support for private attributes in `model_construct` call by
[@&#8203;sydney-runkle](https://togithub.com/sydney-runkle) in
[#&#8203;8525](https://togithub.com/pydantic/pydantic/pull/8525)
- Use a stack for the types namespace by
[@&#8203;dmontagu](https://togithub.com/dmontagu) in
[#&#8203;8378](https://togithub.com/pydantic/pydantic/pull/8378)
- Fix schema-building bug with `TypeAliasType` for types with refs by
[@&#8203;dmontagu](https://togithub.com/dmontagu) in
[#&#8203;8526](https://togithub.com/pydantic/pydantic/pull/8526)
- Support `pydantic.Field(repr=False)` in dataclasses by
[@&#8203;tigeryy2](https://togithub.com/tigeryy2) in
[#&#8203;8511](https://togithub.com/pydantic/pydantic/pull/8511)
- Override `dataclass_transform` behavior for `RootModel` by
[@&#8203;Viicos](https://togithub.com/Viicos) in
[#&#8203;8163](https://togithub.com/pydantic/pydantic/pull/8163)
- Refactor signature generation for simplicity by
[@&#8203;sydney-runkle](https://togithub.com/sydney-runkle) in
[#&#8203;8572](https://togithub.com/pydantic/pydantic/pull/8572)
- Fix ordering bug of PlainValidator annotation by
[@&#8203;Anvil](https://togithub.com/Anvil) in
[#&#8203;8567](https://togithub.com/pydantic/pydantic/pull/8567)
- Fix `exclude_none` for json serialization of `computed_field`s by
[@&#8203;sydney-runkle](https://togithub.com/sydney-runkle) in
[](https://togithub.com/pydantic/pydantic-core/pull/1098)
- Support yyyy-MM-DD string for datetimes by
[@&#8203;sydney-runkle](https://togithub.com/sydney-runkle) in
[](https://togithub.com/pydantic/pydantic-core/pull/1124)
- Tweak ordering of definitions in generated schemas by
[@&#8203;StrawHatDrag0n](https://togithub.com/StrawHatDrag0n) in
[#&#8203;8583](https://togithub.com/pydantic/pydantic/pull/8583)

##### New Contributors

##### `pydantic`

- [@&#8203;ekeew](https://togithub.com/ekeew) made their first
contribution in
[#&#8203;6874](https://togithub.com/pydantic/pydantic/pull/6874)
- [@&#8203;lambertsbennett](https://togithub.com/lambertsbennett) made
their first contribution in
[#&#8203;8054](https://togithub.com/pydantic/pydantic/pull/8054)
- [@&#8203;vincent-hachin-wmx](https://togithub.com/vincent-hachin-wmx)
made their first contribution in
[#&#8203;8138](https://togithub.com/pydantic/pydantic/pull/8138)
-
[@&#8203;QuentinSoubeyranAqemia](https://togithub.com/QuentinSoubeyranAqemia)
made their first contribution in
[#&#8203;7825](https://togithub.com/pydantic/pydantic/pull/7825)
- [@&#8203;ariebovenberg](https://togithub.com/ariebovenberg) made their
first contribution in
[#&#8203;8072](https://togithub.com/pydantic/pydantic/pull/8072)
- [@&#8203;LukeTonin](https://togithub.com/LukeTonin) made their first
contribution in
[#&#8203;8223](https://togithub.com/pydantic/pydantic/pull/8223)
- [@&#8203;denisart](https://togithub.com/denisart) made their first
contribution in
[#&#8203;8231](https://togithub.com/pydantic/pydantic/pull/8231)
- [@&#8203;ianhfc](https://togithub.com/ianhfc) made their first
contribution in
[#&#8203;8066](https://togithub.com/pydantic/pydantic/pull/8066)
- [@&#8203;eonu](https://togithub.com/eonu) made their first
contribution in
[#&#8203;8255](https://togithub.com/pydantic/pydantic/pull/8255)
- [@&#8203;amandahla](https://togithub.com/amandahla) made their first
contribution in
[#&#8203;8263](https://togithub.com/pydantic/pydantic/pull/8263)
- [@&#8203;ibleedicare](https://togithub.com/ibleedicare) made their
first contribution in
[#&#8203;8262](https://togithub.com/pydantic/pydantic/pull/8262)
- [@&#8203;jevins09](https://togithub.com/jevins09) made their first
contribution in
[#&#8203;8316](https://togithub.com/pydantic/pydantic/pull/8316)
- [@&#8203;cuu508](https://togithub.com/cuu508) made their first
contribution in
[#&#8203;8322](https://togithub.com/pydantic/pydantic/pull/8322)
- [@&#8203;slanzmich](https://togithub.com/slanzmich) made their first
contribution in
[#&#8203;8305](https://togithub.com/pydantic/pydantic/pull/8305)
- [@&#8203;jensenbox](https://togithub.com/jensenbox) made their first
contribution in
[#&#8203;8331](https://togithub.com/pydantic/pydantic/pull/8331)
- [@&#8203;szepeviktor](https://togithub.com/szepeviktor) made their
first contribution in
[#&#8203;8356](https://togithub.com/pydantic/pydantic/pull/8356)
- [@&#8203;Elkiwa](https://togithub.com/Elkiwa) made their first
contribution in
[#&#8203;8341](https://togithub.com/pydantic/pydantic/pull/8341)
- [@&#8203;parhamfh](https://togithub.com/parhamfh) made their first
contribution in
[#&#8203;8395](https://togithub.com/pydantic/pydantic/pull/8395)
- [@&#8203;shenxiangzhuang](https://togithub.com/shenxiangzhuang) made
their first contribution in
[#&#8203;8402](https://togithub.com/pydantic/pydantic/pull/8402)
- [@&#8203;NeevCohen](https://togithub.com/NeevCohen) made their first
contribution in
[#&#8203;8387](https://togithub.com/pydantic/pydantic/pull/8387)
- [@&#8203;zby](https://togithub.com/zby) made their first contribution
in [#&#8203;8497](https://togithub.com/pydantic/pydantic/pull/8497)
- [@&#8203;patelnets](https://togithub.com/patelnets) made their first
contribution in
[#&#8203;8491](https://togithub.com/pydantic/pydantic/pull/8491)
- [@&#8203;edwardwli](https://togithub.com/edwardwli) made their first
contribution in
[#&#8203;8503](https://togithub.com/pydantic/pydantic/pull/8503)
- [@&#8203;luca-matei](https://togithub.com/luca-matei) made their first
contribution in
[#&#8203;8507](https://togithub.com/pydantic/pydantic/pull/8507)
- [@&#8203;Jocelyn-Gas](https://togithub.com/Jocelyn-Gas) made their
first contribution in
[#&#8203;8437](https://togithub.com/pydantic/pydantic/pull/8437)
- [@&#8203;bL34cHig0](https://togithub.com/bL34cHig0) made their first
contribution in
[#&#8203;8501](https://togithub.com/pydantic/pydantic/pull/8501)
- [@&#8203;tigeryy2](https://togithub.com/tigeryy2) made their first
contribution in
[#&#8203;8511](https://togithub.com/pydantic/pydantic/pull/8511)
- [@&#8203;geospackle](https://togithub.com/geospackle) made their first
contribution in
[#&#8203;8537](https://togithub.com/pydantic/pydantic/pull/8537)
- [@&#8203;Anvil](https://togithub.com/Anvil) made their first
contribution in
[#&#8203;8567](https://togithub.com/pydantic/pydantic/pull/8567)
- [@&#8203;hungtsetse](https://togithub.com/hungtsetse) made their first
contribution in
[#&#8203;8546](https://togithub.com/pydantic/pydantic/pull/8546)
- [@&#8203;StrawHatDrag0n](https://togithub.com/StrawHatDrag0n) made
their first contribution in
[#&#8203;8583](https://togithub.com/pydantic/pydantic/pull/8583)

##### `pydantic-core`

- [@&#8203;mariuswinger](https://togithub.com/mariuswinger) made their
first contribution in
[](https://togithub.com/pydantic/pydantic-core/pull/1087)
- [@&#8203;adamchainz](https://togithub.com/adamchainz) made their first
contribution in
[](https://togithub.com/pydantic/pydantic-core/pull/1090)
- [@&#8203;akx](https://togithub.com/akx) made their first contribution
in
[](https://togithub.com/pydantic/pydantic-core/pull/1123)

</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 these
updates 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:eyJjcmVhdGVkSW5WZXIiOiIzNy4xNTMuMiIsInVwZGF0ZWRJblZlciI6IjM3LjE1My4yIiwidGFyZ2V0QnJhbmNoIjoibWFpbiJ9-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-01-30 17:25:55 +00:00
Julien Valentin 12dd477312
fix(legacy): avoid crash when lot of streams in configuration ()
### Description

lot of streams forbid
http://libretime.example.org/preference/stream-setting to open (max=4)
this patch prevent the crash by displaying an error message and truncate
streamcount to 4.

Co-authored-by: Kyle Robbertze <paddatrapper@users.noreply.github.com>
2024-01-30 17:24:28 +00:00
renovate[bot] f6d7be9b1c
chore(deps): update lycheeverse/lychee-action action to v1.9.3 ()
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
|
[lycheeverse/lychee-action](https://togithub.com/lycheeverse/lychee-action)
| action | patch | `v1.9.1` -> `v1.9.3` |

---

### Release Notes

<details>
<summary>lycheeverse/lychee-action (lycheeverse/lychee-action)</summary>

###
[`v1.9.3`](https://togithub.com/lycheeverse/lychee-action/releases/tag/v1.9.3):
Version 1.9.3

[Compare
Source](https://togithub.com/lycheeverse/lychee-action/compare/v1.9.2...v1.9.3)

#### What's Changed

- Bugfix: Pass custom `token` as input argument to action by
[@&#8203;mre](https://togithub.com/mre) in
[https://github.com/lycheeverse/lychee-action/pull/222](https://togithub.com/lycheeverse/lychee-action/pull/222)
Previously, the name of the token was incorrect, leading to no token
being used if the user specified `with: [token: ...]`.
Thanks to [@&#8203;tobon4](https://togithub.com/tobon4) for pointing
this out.

**Full Changelog**:
https://github.com/lycheeverse/lychee-action/compare/v1...v1.9.3

###
[`v1.9.2`](https://togithub.com/lycheeverse/lychee-action/releases/tag/v1.9.2):
Version 1.9.2

[Compare
Source](https://togithub.com/lycheeverse/lychee-action/compare/v1.9.1...v1.9.2)

#### What's Changed

- Bump actions/cache from 3 to 4 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[https://github.com/lycheeverse/lychee-action/pull/221](https://togithub.com/lycheeverse/lychee-action/pull/221)
- Bump peter-evans/create-issue-from-file from 4 to 5 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[https://github.com/lycheeverse/lychee-action/pull/223](https://togithub.com/lycheeverse/lychee-action/pull/223)
- Bump to lychee 0.14.2 in
eeb9cb63fe

**Full Changelog**:
https://github.com/lycheeverse/lychee-action/compare/v1...v1.9.2

</details>

---

### Configuration

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

🚦 **Automerge**: Enabled.

♻ **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:eyJjcmVhdGVkSW5WZXIiOiIzNy4xMzUuMCIsInVwZGF0ZWRJblZlciI6IjM3LjE1My4yIiwidGFyZ2V0QnJhbmNoIjoibWFpbiJ9-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-01-30 17:22:44 +00:00
renovate[bot] 0c89350c2f
chore(deps): update peter-evans/dockerhub-description action to v4 ()
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
|
[peter-evans/dockerhub-description](https://togithub.com/peter-evans/dockerhub-description)
| action | major | `v3` -> `v4` |

---

### Release Notes

<details>
<summary>peter-evans/dockerhub-description
(peter-evans/dockerhub-description)</summary>

###
[`v4`](https://togithub.com/peter-evans/dockerhub-description/compare/v3...v4)

[Compare
Source](https://togithub.com/peter-evans/dockerhub-description/compare/v3...v4)

</details>

---

### Configuration

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

🚦 **Automerge**: Enabled.

♻ **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:eyJjcmVhdGVkSW5WZXIiOiIzNy4xMzUuMCIsInVwZGF0ZWRJblZlciI6IjM3LjEzNS4wIiwidGFyZ2V0QnJhbmNoIjoibWFpbiJ9-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-01-30 17:22:28 +00:00
Kyle Robbertze 3d13f41bbd
ci: pin docker/metadata-action to working version ()
Pin docker/metadata-action to 5.4 until
https://github.com/docker/metadata-action/issues/381 is fixed
2024-01-30 17:15:15 +00:00
renovate[bot] dab6c486b8
chore(deps): update dependency uvicorn to >=0.17.6,<0.28.0 ()
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [uvicorn](https://togithub.com/encode/uvicorn)
([changelog](https://togithub.com/encode/uvicorn/blob/master/CHANGELOG.md))
| `>=0.17.6,<0.27.0` -> `>=0.17.6,<0.28.0` |
[![age](https://developer.mend.io/api/mc/badges/age/pypi/uvicorn/0.27.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/pypi/uvicorn/0.27.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/pypi/uvicorn/0.26.0/0.27.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/uvicorn/0.26.0/0.27.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>encode/uvicorn (uvicorn)</summary>

###
[`v0.27.0`](https://togithub.com/encode/uvicorn/blob/HEAD/CHANGELOG.md#0270---2024-01-20)

[Compare
Source](https://togithub.com/encode/uvicorn/compare/0.26.0...0.27.0)

##### Added

- Raise `ClientDisconnect(IOError)` on `send()` when client disconnected
([#&#8203;2218](https://togithub.com/encode/uvicorn/issues/2218))
19/01/24
- Bump ASGI WebSocket spec version to 2.4
([#&#8203;2221](https://togithub.com/encode/uvicorn/issues/2221))
20/01/24

</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 these
updates 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:eyJjcmVhdGVkSW5WZXIiOiIzNy4xMzUuMCIsInVwZGF0ZWRJblZlciI6IjM3LjEzNS4wIiwidGFyZ2V0QnJhbmNoIjoibWFpbiJ9-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-01-23 21:57:06 +01:00
Thomas Göttgens b14469722e
docs(playout): close warning box properly () 2024-01-20 17:06:35 +00:00
Kyle Robbertze 54ec07d2bd
docs: fix broken link to install guide ()
### Description

Follow up to 
2024-01-19 17:12:30 +00:00
renovate[bot] 0b5d63c547
chore(deps): update actions/cache action to v4 ()
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [actions/cache](https://togithub.com/actions/cache) | action | major |
`v3` -> `v4` |

---

### Release Notes

<details>
<summary>actions/cache (actions/cache)</summary>

### [`v4`](https://togithub.com/actions/cache/compare/v3...v4)

[Compare Source](https://togithub.com/actions/cache/compare/v3...v4)

</details>

---

### Configuration

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

🚦 **Automerge**: Enabled.

♻ **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:eyJjcmVhdGVkSW5WZXIiOiIzNy4xMzUuMCIsInVwZGF0ZWRJblZlciI6IjM3LjEzNS4wIiwidGFyZ2V0QnJhbmNoIjoibWFpbiJ9-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-01-19 17:05:01 +00:00
Thomas Göttgens b6c3ece7d9
docs(playout): add a tutorial to enable AAC in liquidsoap ()
Documentation update regarding 

---------

Co-authored-by: Thomas Göttgens <tgoettgens@mail.com>
2024-01-19 16:58:22 +00:00
Weblate (bot) c42a1c6660
chore(legacy): translations update from Hosted Weblate ()
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: Domenik Töfflinger <domenikt96@yahoo.de>
2024-01-19 16:56:16 +00:00
renovate[bot] 2a91320bb5
chore(deps): update dependency uvicorn to >=0.17.6,<0.27.0 ()
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [uvicorn](https://togithub.com/encode/uvicorn)
([changelog](https://togithub.com/encode/uvicorn/blob/master/CHANGELOG.md))
| `>=0.17.6,<0.26.0` -> `>=0.17.6,<0.27.0` |
[![age](https://developer.mend.io/api/mc/badges/age/pypi/uvicorn/0.26.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/pypi/uvicorn/0.26.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/pypi/uvicorn/0.25.0/0.26.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/uvicorn/0.25.0/0.26.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>encode/uvicorn (uvicorn)</summary>

###
[`v0.26.0`](https://togithub.com/encode/uvicorn/blob/HEAD/CHANGELOG.md#0260---2024-01-16)

[Compare
Source](https://togithub.com/encode/uvicorn/compare/0.25.0...0.26.0)

##### Changed

- Update `--root-path` to include the root path prefix in the full ASGI
`path` as per the ASGI spec
([#&#8203;2213](https://togithub.com/encode/uvicorn/issues/2213))
16/01/24
- Use `__future__.annotations` on some internal modules
([#&#8203;2199](https://togithub.com/encode/uvicorn/issues/2199))
16/01/24

</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 these
updates 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:eyJjcmVhdGVkSW5WZXIiOiIzNy4xMzUuMCIsInVwZGF0ZWRJblZlciI6IjM3LjEzNS4wIiwidGFyZ2V0QnJhbmNoIjoibWFpbiJ9-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-01-17 19:19:27 +01:00
renovate[bot] 5a581c034e chore(deps): lock file maintenance (legacy/composer.json) 2024-01-16 10:21:21 +00:00
Thomas Göttgens 95283efc1f
feat(legacy): add aac/opus support to dashboard player ()
### Description

The Player on the dashbaord does not correctly play an AAC stream. The
rewritng logic only takes into account the ogg format. Add rewriting
from aac to m4a in the javascript calls so the player works.

**This is a new feature**:

AAC output currently only works with replacing liquidsoap, so
technically this is a new feature.

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

The dashboard player is not documented. The player widget works with AAC
streams already.

### Testing Notes

**What I did:**

Swapped liquidsoap and reconfigured the default mp3 stream as AAC

**How you can replicate my testing:**

on ubuntu focal, drop in the upstream liquidsoap deb to enable aac, then
configure the secondary output to use 128kbit aac instead of mp3.
Restart the target, login to the dashboard and open the dashboard
player. Both streams from the dropdown should work.

---------

Co-authored-by: Thomas Göttgens <tgoettgens@mail.com>
Co-authored-by: Jonas L <jooola@users.noreply.github.com>
2024-01-13 13:47:54 +01:00
Jonas L f6d57d5f2d
chore: introduce the stable-4.x branch ()
### Description

Related to https://github.com/libretime/libretime/issues/2887
2024-01-13 12:50:51 +01:00
renovate[bot] 4c40fab58e
chore(deps): update dependency lxml to >=4.5.0,<6.0.0 (main) ()
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [lxml](https://lxml.de/) ([source](https://togithub.com/lxml/lxml),
[changelog](https://git.launchpad.net/lxml/plain/CHANGES.txt)) |
`>=4.5.0,<5.1.0` -> `>=4.5.0,<6.0.0` |
[![age](https://developer.mend.io/api/mc/badges/age/pypi/lxml/5.1.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/pypi/lxml/5.1.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/pypi/lxml/5.0.1/5.1.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/lxml/5.0.1/5.1.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>lxml/lxml (lxml)</summary>

###
[`v5.1.0`](https://togithub.com/lxml/lxml/blob/HEAD/CHANGES.txt#510-2024-01-05)

[Compare
Source](https://togithub.com/lxml/lxml/compare/lxml-5.0.1...lxml-5.1.0)

\==================

## Features added

-   Parsing ASCII strings is slightly faster.

## Bugs fixed

- [GH#349](https://togithub.com/GH/lxml/issues/349): The HTML
`Cleaner()` interpreted an accidentally provided string parameter
for the `host_whitelist` as list of characters and silently failed to
reject any hosts.
    Passing a non-collection is now rejected.

## Other changes

-   Support for Python 2.7 and Python versions < 3.6 was removed.

-   The wheel build was migrated to use `cibuildwheel`.
    Patch by Primož Godec.

</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 these
updates 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:eyJjcmVhdGVkSW5WZXIiOiIzNy4xMjEuMCIsInVwZGF0ZWRJblZlciI6IjM3LjEyMS4wIiwidGFyZ2V0QnJhbmNoIjoibWFpbiJ9-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-01-12 21:04:49 +01:00
renovate[bot] 02e258500b chore(deps): update lycheeverse/lychee-action action to v1.9.1 2024-01-11 06:01:32 +00:00
renovate[bot] ee33c0c56a chore(deps): lock file maintenance (legacy/composer.json) 2024-01-09 09:35:34 +00:00
224 changed files with 24865 additions and 9768 deletions
.github
.pre-commit-config.yamlCHANGELOG.mdDockerfileMakefileREADME.md
analyzer
api-client
libretime_api_client
requirements.txtsetup.py
api
docker-compose.override.ymldocker-compose.yml
docs
install
legacy/application

View File

@ -1 +1 @@
{".":"4.0.0"}
{".":"4.2.0"}

View File

@ -10,7 +10,7 @@
"automerge": true,
"automergeType": "branch"
},
"baseBranches": ["main", "stable"],
"baseBranches": ["main"],
"labels": ["dependencies"],
"packageRules": [
{

View File

@ -29,7 +29,7 @@ jobs:
- uses: actions/setup-python@v5
with:
python-version: "3.x"
- uses: actions/cache@v3
- uses: actions/cache@v4
with:
path: ~/.cache/pip
key: ${{ runner.os }}-pip-${{ inputs.context }}-${{ hashFiles(format('{0}/{1}', inputs.context, '**/setup.py')) }}
@ -65,7 +65,7 @@ jobs:
steps:
- uses: actions/checkout@v4
- uses: actions/cache@v3
- uses: actions/cache@v4
with:
path: ~/.cache/pip
key: ${{ matrix.release }}-pip-${{ inputs.context }}-${{ hashFiles(format('{0}/{1}', inputs.context, '**/setup.py')) }}
@ -77,7 +77,7 @@ jobs:
working-directory: ${{ inputs.context }}
- name: Report coverage
uses: codecov/codecov-action@v3
uses: codecov/codecov-action@v5
with:
files: ${{ inputs.context }}/coverage.xml
flags: ${{ inputs.context }}

View File

@ -3,7 +3,7 @@ name: Analyzer
on:
workflow_dispatch:
push:
branches: [main, stable]
branches: [main, stable-*]
paths:
- .github/workflows/_python.yml
- .github/workflows/analyzer.yml
@ -12,7 +12,7 @@ on:
- tools/python*
pull_request:
branches: [main, stable]
branches: [main, stable-*]
paths:
- .github/workflows/_python.yml
- .github/workflows/analyzer.yml

View File

@ -3,7 +3,7 @@ name: API Client
on:
workflow_dispatch:
push:
branches: [main, stable]
branches: [main, stable-*]
paths:
- .github/workflows/_python.yml
- .github/workflows/api-client.yml
@ -12,7 +12,7 @@ on:
- tools/python*
pull_request:
branches: [main, stable]
branches: [main, stable-*]
paths:
- .github/workflows/_python.yml
- .github/workflows/api-client.yml

View File

@ -29,7 +29,7 @@ jobs:
with:
python-version: "3.x"
- uses: actions/cache@v3
- uses: actions/cache@v4
with:
path: ~/.cache/pip
key: ${{ runner.os }}-pip-api-${{ hashFiles('api/**/setup.py') }}
@ -42,7 +42,7 @@ jobs:
- name: Get pull request commit range
if: github.event_name == 'pull_request'
run: echo "COMMIT_RANGE=origin/${{ github.base_ref }}..${{ github.sha }}" >> $GITHUB_ENV
run: echo "COMMIT_RANGE=${{ github.sha }}~1...${{ github.sha }}" >> $GITHUB_ENV
- name: Get push commit range
if: github.event_name == 'push'

View File

@ -3,7 +3,7 @@ name: API
on:
workflow_dispatch:
push:
branches: [main, stable]
branches: [main, stable-*]
paths:
- .github/workflows/_python.yml
- .github/workflows/api.yml
@ -12,7 +12,7 @@ on:
- tools/python*
pull_request:
branches: [main, stable]
branches: [main, stable-*]
paths:
- .github/workflows/_python.yml
- .github/workflows/api.yml
@ -64,7 +64,7 @@ jobs:
steps:
- uses: actions/checkout@v4
- uses: actions/cache@v3
- uses: actions/cache@v4
with:
path: ~/.cache/pip
key: ${{ matrix.release }}-pip-api-${{ hashFiles('api/**/setup.py') }}
@ -76,7 +76,7 @@ jobs:
working-directory: api
- name: Report coverage
uses: codecov/codecov-action@v3
uses: codecov/codecov-action@v5
with:
files: api/coverage.xml
flags: api

View File

@ -3,9 +3,9 @@ name: Container
on:
push:
tags: ["[0-9]+.[0-9]+.[0-9]+*"]
branches: [main, stable]
branches: [main, stable-*]
pull_request:
branches: [main, stable]
branches: [main, stable-*]
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
@ -24,7 +24,7 @@ jobs:
- name: Update Docker Hub description
if: github.event_name == 'push'
uses: peter-evans/dockerhub-description@v3
uses: peter-evans/dockerhub-description@v4
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
@ -86,7 +86,7 @@ jobs:
echo "LIBRETIME_VERSION=$(cat VERSION | tr -d [:blank:])" >> $GITHUB_ENV
- name: Build
uses: docker/bake-action@v4
uses: docker/bake-action@v5
with:
pull: true
push: ${{ github.event_name == 'push' }}

View File

@ -78,7 +78,7 @@ jobs:
EOF
- name: Build and push
uses: docker/build-push-action@v5
uses: docker/build-push-action@v6
with:
context: .
push: ${{ github.repository_owner == 'libretime' }}

View File

@ -2,14 +2,14 @@ name: Docs
on:
push:
branches: [main, stable]
branches: [main, stable-*]
paths:
- .github/vale/**
- .github/workflows/docs.yml
- docs/**
pull_request:
branches: [main, stable]
branches: [main, stable-*]
paths:
- .github/vale/**
- .github/workflows/docs.yml
@ -26,7 +26,7 @@ jobs:
steps:
- uses: actions/checkout@v4
- uses: actions/cache@v3
- uses: actions/cache@v4
with:
path: |
/usr/local/bin/vale*

View File

@ -40,7 +40,7 @@ jobs:
steps:
- uses: actions/checkout@v4
- uses: actions/cache@v3
- uses: actions/cache@v4
with:
path: .lycheecache
key: housekeeping-find-broken-links-${{ github.sha }}
@ -48,13 +48,12 @@ jobs:
- name: Check Links
id: lychee
uses: lycheeverse/lychee-action@v1.9.0
uses: lycheeverse/lychee-action@v2.1.0
with:
args: >-
'**/*.md'
--require-https
--exclude-all-private
--exclude-mail
--exclude 'example\.(com|org)'
--exclude '\$server_name\$request_uri'
--exclude '%7Bvars.version%7D'
@ -63,6 +62,8 @@ jobs:
--exclude 'https://www.ascap.com'
--exclude 'https://www.youtube-nocookie.com'
--exclude 'github\.com/libretime/libretime/(issues|pulls)'
--exclude 'https://packages.ubuntu.com/bionic/php7.2'
--exclude 'https://packages.ubuntu.com/bionic/python3'
--cache
--max-cache-age 2d
fail: true

View File

@ -3,14 +3,14 @@ name: Legacy
on:
workflow_dispatch:
push:
branches: [main, stable]
branches: [main, stable-*]
paths:
- .github/workflows/legacy.yml
- api/**
- legacy/**
pull_request:
branches: [main, stable]
branches: [main, stable-*]
paths:
- .github/workflows/legacy.yml
- api/**
@ -62,6 +62,7 @@ jobs:
sudo -u postgres psql -c 'CREATE DATABASE libretime;'
sudo -u postgres psql -c "CREATE USER libretime WITH PASSWORD 'libretime';"
sudo -u postgres psql -c 'GRANT CONNECT ON DATABASE libretime TO libretime;'
sudo -u postgres psql -c 'ALTER DATABASE libretime OWNER TO libretime;'
sudo -u postgres psql -c 'ALTER USER libretime CREATEDB;'
- name: Setup PHP
@ -74,7 +75,7 @@ jobs:
run: |
echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT
- uses: actions/cache@v3
- uses: actions/cache@v4
with:
path: ${{ steps.composer-cache.outputs.dir }}
key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}

View File

@ -3,7 +3,7 @@ name: Playout
on:
workflow_dispatch:
push:
branches: [main, stable]
branches: [main, stable-*]
paths:
- .github/workflows/_python.yml
- .github/workflows/playout.yml
@ -13,7 +13,7 @@ on:
- tools/python*
pull_request:
branches: [main, stable]
branches: [main, stable-*]
paths:
- .github/workflows/_python.yml
- .github/workflows/playout.yml

View File

@ -12,7 +12,7 @@ jobs:
name: Validate PR title
runs-on: ubuntu-latest
steps:
- uses: amannn/action-semantic-pull-request@v5.4.0
- uses: amannn/action-semantic-pull-request@v5.5.3
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:

View File

@ -3,10 +3,10 @@ name: Project
on:
workflow_dispatch:
push:
branches: [main, stable]
branches: [main, stable-*]
pull_request:
types: [opened, reopened, synchronize, edited]
branches: [main, stable]
branches: [main, stable-*]
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
@ -21,14 +21,14 @@ jobs:
with:
python-version: "3.x"
- uses: actions/cache@v3
- uses: actions/cache@v4
with:
path: ~/.cache/pip
key: ${{ runner.os }}-project-pre-commit-pip-${{ hashFiles('.pre-commit-config.yaml') }}
restore-keys: |
${{ runner.os }}-project-pre-commit-pip
- uses: pre-commit/action@v3.0.0
- uses: pre-commit/action@v3.0.1
test-tools:
runs-on: ubuntu-latest

View File

@ -23,7 +23,7 @@ jobs:
run: make tarball
- name: Upload tarball
uses: softprops/action-gh-release@v1
uses: softprops/action-gh-release@v2
with:
files: |
libretime-*.tar.gz

View File

@ -3,7 +3,7 @@ name: Shared
on:
workflow_dispatch:
push:
branches: [main, stable]
branches: [main, stable-*]
paths:
- .github/workflows/_python.yml
- .github/workflows/shared.yml
@ -11,7 +11,7 @@ on:
- tools/python*
pull_request:
branches: [main, stable]
branches: [main, stable-*]
paths:
- .github/workflows/_python.yml
- .github/workflows/shared.yml

View File

@ -3,7 +3,7 @@ name: Worker
on:
workflow_dispatch:
push:
branches: [main, stable]
branches: [main, stable-*]
paths:
- .github/workflows/_python.yml
- .github/workflows/worker.yml
@ -11,7 +11,7 @@ on:
- tools/python*
pull_request:
branches: [main, stable]
branches: [main, stable-*]
paths:
- .github/workflows/_python.yml
- .github/workflows/worker.yml

View File

@ -3,7 +3,7 @@
# See https://pre-commit.com/hooks.html for more hooks
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v4.5.0
rev: v5.0.0
hooks:
- id: check-added-large-files
- id: check-case-conflict
@ -36,13 +36,13 @@ repos:
exclude: ^(legacy/public(?!/js/airtime)|CHANGELOG.md$|.github/release-please-manifest.json)
- repo: https://github.com/asottile/pyupgrade
rev: v3.15.0
rev: v3.19.0
hooks:
- id: pyupgrade
args: [--py38-plus]
- repo: https://github.com/adamchainz/django-upgrade
rev: 1.15.0
rev: 1.22.2
hooks:
- id: django-upgrade
args: [--target-version, "4.2"]
@ -54,12 +54,12 @@ repos:
args: [--resolve-all-configs]
- repo: https://github.com/psf/black-pre-commit-mirror
rev: 23.12.1
rev: 24.10.0
hooks:
- id: black
- repo: https://github.com/codespell-project/codespell
rev: v2.2.6
rev: v2.3.0
hooks:
- id: codespell
args: [--ignore-words=.codespellignore]
@ -110,3 +110,11 @@ repos:
pass_filenames: false
language: script
files: ^legacy
- id: api-schema-update
name: api-schema-update
description: Ensure API schema is up to date
entry: make -C api schema
pass_filenames: false
language: system
files: ^api

View File

@ -1,5 +1,59 @@
# Changelog
## [4.2.0](https://github.com/libretime/libretime/compare/4.1.0...4.2.0) (2024-06-22)
### Features
* **legacy:** add current date macro to string block criteria ([#3013](https://github.com/libretime/libretime/issues/3013)) ([451652b](https://github.com/libretime/libretime/commit/451652bc4002b142ab9cf33ae517451c4966134f))
* **legacy:** add filename block criteria ([#3015](https://github.com/libretime/libretime/issues/3015)) ([4642b6c](https://github.com/libretime/libretime/commit/4642b6c08ef813ab5dc7354f73141239f5c145e0))
### Bug Fixes
* pin pip version to &lt;24.1 to allow installing pytz (celery) ([#3043](https://github.com/libretime/libretime/issues/3043)) ([646bc81](https://github.com/libretime/libretime/commit/646bc817246a1e3e0d8107c2b69d726681c643b6))
* playlist allocates inaccurate time to smartblocks ([#3026](https://github.com/libretime/libretime/issues/3026)) ([2b43e51](https://github.com/libretime/libretime/commit/2b43e51ed140bf307e491f0fcb7b84f95709d604))
### Performance Improvements
* optimize the api image health check ([#3038](https://github.com/libretime/libretime/issues/3038)) ([d99d6e1](https://github.com/libretime/libretime/commit/d99d6e1a68f20b3f4255296cd22ac80a90adc020))
* optimize the rabbitmq health check ([#3037](https://github.com/libretime/libretime/issues/3037)) ([9684214](https://github.com/libretime/libretime/commit/96842144257855df86085b052ed8ff87562bc049))
## [4.1.0](https://github.com/libretime/libretime/compare/4.0.0...4.1.0) (2024-05-05)
### Features
* **api:** implement file deletion ([#2960](https://github.com/libretime/libretime/issues/2960)) ([9757b1b](https://github.com/libretime/libretime/commit/9757b1b78c98a33f233163c77eb1b2ad6e0f0efe))
* build schedule events exclusively in playout ([#2946](https://github.com/libretime/libretime/issues/2946)) ([40b4fc7](https://github.com/libretime/libretime/commit/40b4fc7f66004ee3bcb61c9961ec2c48bbcbc6cb))
* **legacy:** add aac/opus support to dashboard player ([#2881](https://github.com/libretime/libretime/issues/2881)) ([95283ef](https://github.com/libretime/libretime/commit/95283efc1f9a63376a99184ef69b699beba45802))
* **legacy:** disable public radio page and redirect to login ([#2903](https://github.com/libretime/libretime/issues/2903)) ([170d095](https://github.com/libretime/libretime/commit/170d09545e4fcfeeb95f9fc5c355329764501854))
* **legacy:** trim overbooked shows after autoloading a playlist ([#2897](https://github.com/libretime/libretime/issues/2897)) ([a95ce3d](https://github.com/libretime/libretime/commit/a95ce3d2296bb864b379dcce14090bd821c1dfc9))
* **legacy:** visual cue point editor ([#2947](https://github.com/libretime/libretime/issues/2947)) ([da02e74](https://github.com/libretime/libretime/commit/da02e74f2115cb76a6435fab5ab2667a8c622b98))
* start celery worker programmatically ([#2988](https://github.com/libretime/libretime/issues/2988)) ([9c548b3](https://github.com/libretime/libretime/commit/9c548b365ec114c6789d2a69e66cc721da6ae100))
### Bug Fixes
* **analyzer:** backslash non utf-8 data when probing replaygain ([#2931](https://github.com/libretime/libretime/issues/2931)) ([29f73e0](https://github.com/libretime/libretime/commit/29f73e0dcb1fd668a79a2ffedc33e16172277376)), closes [#2910](https://github.com/libretime/libretime/issues/2910)
* apply replay gain preferences on scheduled files ([#2945](https://github.com/libretime/libretime/issues/2945)) ([35d0dec](https://github.com/libretime/libretime/commit/35d0dec4a887cdaea2d73dc9bee60eb6624a2aca))
* **deps:** update dependency friendsofphp/php-cs-fixer to &lt;3.49.1 ([#2899](https://github.com/libretime/libretime/issues/2899)) ([3e05748](https://github.com/libretime/libretime/commit/3e05748d2d1180b8dad55b6f997e6aa7117735f1))
* **deps:** update dependency friendsofphp/php-cs-fixer to &lt;3.51.1 ([#2963](https://github.com/libretime/libretime/issues/2963)) ([22c303c](https://github.com/libretime/libretime/commit/22c303cfffdc777177bd74273e2c24da58cf1682))
* **deps:** update dependency friendsofphp/php-cs-fixer to &lt;3.53.1 ([#2972](https://github.com/libretime/libretime/issues/2972)) ([9192aaa](https://github.com/libretime/libretime/commit/9192aaa2bb2dada470e03537493160d9b14a42f4))
* **deps:** update dependency gunicorn to v22 (security) ([#2993](https://github.com/libretime/libretime/issues/2993)) ([a2cf769](https://github.com/libretime/libretime/commit/a2cf7697a97bbc4faf89fd7bc9ba9ecc235bf873))
* incorrect docker compose version ([#2975](https://github.com/libretime/libretime/issues/2975)) ([634e6e2](https://github.com/libretime/libretime/commit/634e6e236d908994d586c946bbe28bcba8a357fa))
* **installer:** setup the worker entrypoint ([#2996](https://github.com/libretime/libretime/issues/2996)) ([71b20ae](https://github.com/libretime/libretime/commit/71b20ae3c974680d814062c5a0bfa51a105dde61))
* **legacy:** allow deleting file with api token ([#2995](https://github.com/libretime/libretime/issues/2995)) ([86da46e](https://github.com/libretime/libretime/commit/86da46ee3a54676298e30301846be890d1ea93ae))
* **legacy:** allow updating track types code ([#2955](https://github.com/libretime/libretime/issues/2955)) ([270aa08](https://github.com/libretime/libretime/commit/270aa08ae6c7207de1cc3ea552dabeb018bcfe0d))
* **legacy:** avoid crash when lot of streams in configuration ([#2915](https://github.com/libretime/libretime/issues/2915)) ([12dd477](https://github.com/libretime/libretime/commit/12dd47731290bf539be7a2a81571f8ada223e9c4))
* **legacy:** ensure validation is performed on the track type form ([#2985](https://github.com/libretime/libretime/issues/2985)) ([5ad69bf](https://github.com/libretime/libretime/commit/5ad69bf0b76ff2e5065551b6a7d154cb26834605))
* **legacy:** fix hidden fields in edit file form ([#2932](https://github.com/libretime/libretime/issues/2932)) ([f4b260f](https://github.com/libretime/libretime/commit/f4b260fdf70c0dd1830166d3856239dae5366599))
* **legacy:** replay_gain_modifier should be a system preference ([#2943](https://github.com/libretime/libretime/issues/2943)) ([37d1a76](https://github.com/libretime/libretime/commit/37d1a7685e37e45734553a0eb4a4da793ca858cb))
* remove obsolete docker compose version ([#2982](https://github.com/libretime/libretime/issues/2982)) ([fb0584b](https://github.com/libretime/libretime/commit/fb0584b021fd1c966181c7ab3989938cdfe4e642))
* trigger legacy tasks manager every 5m ([#2987](https://github.com/libretime/libretime/issues/2987)) ([7040d0e](https://github.com/libretime/libretime/commit/7040d0e4bd92911a9072226f49ad59ce575d6ed9))
* **worker:** ensure celery beat is started ([#3007](https://github.com/libretime/libretime/issues/3007)) ([bfde17e](https://github.com/libretime/libretime/commit/bfde17edf7fcc2bfd55263756e6ec3e455f11740))
## [4.0.0](https://github.com/libretime/libretime/compare/3.2.0...4.0.0) (2024-01-07)

View File

@ -2,7 +2,7 @@ ARG LIBRETIME_VERSION
#======================================================================================#
# Python Builder #
#======================================================================================#
FROM python:3.10-slim-bullseye as python-builder
FROM python:3.10-slim-bullseye AS python-builder
WORKDIR /build
@ -18,7 +18,7 @@ RUN pip wheel --wheel-dir . --no-deps .
#======================================================================================#
# Python base #
#======================================================================================#
FROM python:3.10-slim-bullseye as python-base
FROM python:3.10-slim-bullseye AS python-base
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
@ -48,7 +48,7 @@ RUN set -eux \
#======================================================================================#
# Python base with ffmpeg #
#======================================================================================#
FROM python-base as python-base-ffmpeg
FROM python-base AS python-base-ffmpeg
RUN set -eux \
&& DEBIAN_FRONTEND=noninteractive apt-get update \
@ -59,7 +59,7 @@ RUN set -eux \
#======================================================================================#
# Analyzer #
#======================================================================================#
FROM python-base-ffmpeg as libretime-analyzer
FROM python-base-ffmpeg AS libretime-analyzer
COPY tools/packages.py /tmp/packages.py
COPY analyzer/packages.ini /tmp/packages.ini
@ -97,7 +97,7 @@ ENV LIBRETIME_VERSION=$LIBRETIME_VERSION
#======================================================================================#
# Playout #
#======================================================================================#
FROM python-base-ffmpeg as libretime-playout
FROM python-base-ffmpeg AS libretime-playout
COPY tools/packages.py /tmp/packages.py
COPY playout/packages.ini /tmp/packages.ini
@ -136,11 +136,12 @@ ENV LIBRETIME_VERSION=$LIBRETIME_VERSION
#======================================================================================#
# API #
#======================================================================================#
FROM python-base as libretime-api
FROM python-base AS libretime-api
RUN set -eux \
&& DEBIAN_FRONTEND=noninteractive apt-get update \
&& DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
curl \
gcc \
libc6-dev \
libpq-dev \
@ -174,13 +175,12 @@ CMD ["/usr/local/bin/gunicorn", \
ARG LIBRETIME_VERSION
ENV LIBRETIME_VERSION=$LIBRETIME_VERSION
HEALTHCHECK CMD ["python3", "-c", \
"import requests; requests.get('http://localhost:9001/api/v2/version').raise_for_status()"]
HEALTHCHECK CMD ["curl", "--fail", "http://localhost:9001/api/v2/version"]
#======================================================================================#
# Worker #
#======================================================================================#
FROM python-base as libretime-worker
FROM python-base AS libretime-worker
WORKDIR /src
@ -189,6 +189,7 @@ RUN --mount=type=cache,target=/root/.cache/pip \
pip install --no-compile -r requirements.txt
COPY --from=python-builder /build/shared/*.whl .
COPY --from=python-builder /build/api-client/*.whl .
RUN --mount=type=cache,target=/root/.cache/pip \
pip install --no-compile *.whl && rm -Rf *.whl
@ -200,20 +201,14 @@ RUN --mount=type=cache,target=/root/.cache/pip \
USER ${UID}:${GID}
WORKDIR /app
CMD ["/usr/local/bin/celery", "worker", \
"--app=libretime_worker.tasks:worker", \
"--config=libretime_worker.config", \
"--time-limit=1800", \
"--concurrency=1", \
"--loglevel=info"]
CMD ["/usr/local/bin/libretime-worker"]
ARG LIBRETIME_VERSION
ENV LIBRETIME_VERSION=$LIBRETIME_VERSION
#======================================================================================#
# Legacy #
#======================================================================================#
FROM php:7.4-fpm as libretime-legacy
FROM php:7.4-fpm AS libretime-legacy
ENV LIBRETIME_CONFIG_FILEPATH=/etc/libretime/config.yml
ENV LIBRETIME_LOG_FILEPATH=php://stderr

View File

@ -22,10 +22,10 @@ dev-certs:
cat dev/certs/fake.{key,crt} > dev/certs/fake.pem
dev: .env dev-certs
DOCKER_BUILDKIT=1 docker-compose build
docker-compose run --rm legacy make build
docker-compose run --rm api libretime-api migrate
docker-compose up -d
DOCKER_BUILDKIT=1 docker compose build
docker compose run --rm legacy make build
docker compose run --rm api libretime-api migrate
docker compose up -d
.PHONY: VERSION
VERSION:

View File

@ -52,23 +52,8 @@ Become a financial contributor and help us sustain our community on
[Support](https://opencollective.com/libretime/contribute) this project with
your organization. Your logo will show up here with a link to your website.
<a href="https://opencollective.com/libretime/organization/0/website">
<img src="https://opencollective.com/libretime/organization/0/avatar.svg">
</a>
<a href="https://opencollective.com/libretime/organization/1/website">
<img src="https://opencollective.com/libretime/organization/1/avatar.svg">
</a>
<a href="https://opencollective.com/libretime/organization/2/website">
<img src="https://opencollective.com/libretime/organization/2/avatar.svg">
</a>
<a href="https://opencollective.com/libretime/organization/3/website">
<img src="https://opencollective.com/libretime/organization/3/avatar.svg">
</a>
<a href="https://opencollective.com/libretime/organization/4/website">
<img src="https://opencollective.com/libretime/organization/4/avatar.svg">
</a>
<a href="https://opencollective.com/libretime/organization/5/website">
<img src="https://opencollective.com/libretime/organization/5/avatar.svg">
<a href="https://opencollective.com/libretime">
<img src="https://opencollective.com/libretime/organizations.svg?width=890">
</a>
## License

View File

@ -36,7 +36,7 @@ def probe_replaygain(filepath: Path) -> Optional[float]:
"""
Probe replaygain will probe the given audio file and return the replaygain if available.
"""
cmd = _ffprobe("-i", filepath)
cmd = _ffprobe("-i", filepath, errors="backslashreplace")
track_gain_match = _PROBE_REPLAYGAIN_RE.search(cmd.stderr)
@ -75,8 +75,7 @@ def compute_silences(filepath: Path) -> List[Tuple[float, float]]:
cmd = _ffmpeg(
*("-i", filepath),
"-vn",
*("-filter", "highpass=frequency=1000"),
*("-filter", "silencedetect=noise=0.15:duration=1"),
*("-filter", "highpass=frequency=80,silencedetect=noise=-60dB:duration=0.9"),
)
starts, ends = [], []

View File

@ -5,10 +5,24 @@ from typing import Any, Dict
import mutagen
from libretime_shared.files import compute_md5
from mutagen.easyid3 import EasyID3
logger = logging.getLogger(__name__)
def flatten(xss):
return [x for xs in xss for x in xs]
def comment_get(id3, _):
comments = [v.text for k, v in id3.items() if "COMM" in k or "comment" in k]
return flatten(comments)
EasyID3.RegisterKey("comment", comment_get)
def analyze_metadata(filepath_: str, metadata: Dict[str, Any]):
"""
Extract audio metadata from tags embedded in the file using mutagen.
@ -71,34 +85,36 @@ def analyze_metadata(filepath_: str, metadata: Dict[str, Any]):
except (AttributeError, KeyError, IndexError):
pass
extracted_tags_mapping = {
"title": "track_title",
"artist": "artist_name",
"album": "album_title",
"bpm": "bpm",
"composer": "composer",
"conductor": "conductor",
"copyright": "copyright",
"comment": "comment",
"encoded_by": "encoder",
"genre": "genre",
"isrc": "isrc",
"label": "label",
"organization": "label",
# "length": "length",
"language": "language",
"last_modified": "last_modified",
"mood": "mood",
"bit_rate": "bit_rate",
"replay_gain": "replaygain",
# "tracknumber": "track_number",
# "track_total": "track_total",
"website": "website",
"date": "year",
# "mime_type": "mime",
}
extracted_tags_mapping = [
("title", "track_title"),
("artist", "artist_name"),
("album", "album_title"),
("bpm", "bpm"),
("composer", "composer"),
("conductor", "conductor"),
("copyright", "copyright"),
("comment", "comment"),
("comment", "comments"),
("comment", "description"),
("encoded_by", "encoder"),
("genre", "genre"),
("isrc", "isrc"),
("label", "label"),
("organization", "label"),
# ("length", "length"),
("language", "language"),
("last_modified", "last_modified"),
("mood", "mood"),
("bit_rate", "bit_rate"),
("replay_gain", "replaygain"),
# ("tracknumber", "track_number"),
# ("track_total", "track_total"),
("website", "website"),
("date", "year"),
# ("mime_type", "mime"),
]
for extracted_key, metadata_key in extracted_tags_mapping.items():
for extracted_key, metadata_key in extracted_tags_mapping:
try:
metadata[metadata_key] = extracted[extracted_key]
if isinstance(metadata[metadata_key], list):

View File

@ -16,8 +16,7 @@ logger = logging.getLogger(__name__)
class Step(Protocol):
@staticmethod
def __call__(filename: str, metadata: Dict[str, Any]):
...
def __call__(filename: str, metadata: Dict[str, Any]): ...
class PipelineStatus(int, Enum):

View File

@ -2,5 +2,5 @@
# This file is auto-generated by tools/extract_requirements.py.
mutagen>=1.45.1,<1.48
pika>=1.0.0,<1.4
requests>=2.31.0,<2.32
requests>=2.32.2,<2.33
typing_extensions

View File

@ -1,6 +1,6 @@
from setuptools import find_packages, setup
version = "4.0.0" # x-release-please-version
version = "4.2.0" # x-release-please-version
setup(
name="libretime-analyzer",
@ -24,7 +24,7 @@ setup(
install_requires=[
"mutagen>=1.45.1,<1.48",
"pika>=1.0.0,<1.4",
"requests>=2.31.0,<2.32",
"requests>=2.32.2,<2.33",
"typing_extensions",
],
extras_require={

View File

@ -23,28 +23,28 @@ FILES = [
# 8s -> 9s: silence
# 9s -> 12s: musik
# 12s -> 15s: pink noise fade out
Fixture(here / "s1-jointstereo.mp3", 15.0, 6.0, 13.0, -5.9 ),
Fixture(here / "s1-mono.mp3", 15.0, 6.0, 13.0, -2.0 ),
Fixture(here / "s1-stereo.mp3", 15.0, 6.0, 13.0, -5.9 ),
Fixture(here / "s1-mono-12.mp3", 15.0, 9.0, 12.0, +7.0 ),
Fixture(here / "s1-stereo-12.mp3", 15.0, 9.0, 12.0, +6.1 ),
Fixture(here / "s1-mono+12.mp3", 15.0, 3.5, 13.0, -17.0 ),
Fixture(here / "s1-stereo+12.mp3", 15.0, 3.5, 13.0, -17.8 ),
Fixture(here / "s1-mono.flac", 15.0, 6.0, 13.0, -2.3 ),
Fixture(here / "s1-stereo.flac", 15.0, 6.0, 13.0, -6.0 ),
Fixture(here / "s1-mono-12.flac", 15.0, 9.0, 12.0, +10.0 ),
Fixture(here / "s1-stereo-12.flac", 15.0, 9.0, 12.0, +5.9 ),
Fixture(here / "s1-mono+12.flac", 15.0, 3.5, 13.0, -12.0 ),
Fixture(here / "s1-stereo+12.flac", 15.0, 3.5, 13.0, -14.9 ),
Fixture(here / "s1-mono.m4a", 15.0, 6.0, 13.0, -4.5 ),
Fixture(here / "s1-stereo.m4a", 15.0, 6.0, 13.0, -5.8 ),
Fixture(here / "s1-mono.ogg", 15.0, 6.0, 13.0, -4.9 ),
Fixture(here / "s1-stereo.ogg", 15.0, 6.0, 13.0, -5.7 ),
Fixture(here / "s1-stereo", 15.0, 6.0, 13.0, -5.7 ),
Fixture(here / "s1-mono.wav", 15.0, 6.0, 13.0, -2.3 ),
Fixture(here / "s1-stereo.wav", 15.0, 6.0, 13.0, -6.0 ),
Fixture(here / "s1-jointstereo.mp3", 15.0, 1.4, 15.0, -5.9 ),
Fixture(here / "s1-mono.mp3", 15.0, 1.5, 15.0, -2.0 ),
Fixture(here / "s1-stereo.mp3", 15.0, 1.4, 15.0, -5.9 ),
Fixture(here / "s1-mono-12.mp3", 15.0, 1.2, 15.0, +7.0 ),
Fixture(here / "s1-stereo-12.mp3", 15.0, 1.2, 15.0, +6.1 ),
Fixture(here / "s1-mono+12.mp3", 15.0, 1.2, 15.0, -17.0 ),
Fixture(here / "s1-stereo+12.mp3", 15.0, 1.2, 15.0, -17.8 ),
Fixture(here / "s1-mono.flac", 15.0, 1.4, 15.0, -2.3 ),
Fixture(here / "s1-stereo.flac", 15.0, 1.4, 15.0, -6.0 ),
Fixture(here / "s1-mono-12.flac", 15.0, 2.0, 15.0, +10.0 ),
Fixture(here / "s1-stereo-12.flac", 15.0, 1.8, 15.0, +5.9 ),
Fixture(here / "s1-mono+12.flac", 15.0, 0.0, 15.0, -12.0 ),
Fixture(here / "s1-stereo+12.flac", 15.0, 0.0, 15.0, -14.9 ),
Fixture(here / "s1-mono.m4a", 15.0, 1.4, 15.0, -4.5 ),
Fixture(here / "s1-stereo.m4a", 15.0, 1.4, 15.0, -5.8 ),
Fixture(here / "s1-mono.ogg", 15.0, 1.4, 15.0, -4.9 ),
Fixture(here / "s1-stereo.ogg", 15.0, 1.4, 15.0, -5.7 ),
Fixture(here / "s1-stereo", 15.0, 1.4, 15.0, -5.7 ),
Fixture(here / "s1-mono.wav", 15.0, 1.5, 15.0, -2.3 ),
Fixture(here / "s1-stereo.wav", 15.0, 1.4, 15.0, -6.0 ),
# sample 1 large (looped for 2 hours)
Fixture(here / "s1-large.flac", 7200, 6.0, 7198, -6.0 ),
Fixture(here / "s1-large.flac", 7200, 1.4, 7200, -6.0 ),
# sample 2
# 0s -> 1.8s: silence
# 1.8s : noise
@ -96,12 +96,18 @@ tags = {
"comment": "Test Comment",
}
mp3Tags = {
**tags,
"comments": tags["comment"],
"description": tags["comment"],
}
FILES_TAGGED = [
FixtureMeta(
here / "s1-jointstereo-tagged.mp3",
{
**meta,
**tags,
**mp3Tags,
"bit_rate": approx(128000, abs=1e2),
"channels": 2,
"mime": "audio/mp3",
@ -111,7 +117,7 @@ FILES_TAGGED = [
here / "s1-mono-tagged.mp3",
{
**meta,
**tags,
**mp3Tags,
"bit_rate": approx(64000, abs=1e2),
"channels": 1,
"mime": "audio/mp3",
@ -121,7 +127,7 @@ FILES_TAGGED = [
here / "s1-stereo-tagged.mp3",
{
**meta,
**tags,
**mp3Tags,
"bit_rate": approx(128000, abs=1e2),
"channels": 2,
"mime": "audio/mp3",
@ -151,7 +157,7 @@ FILES_TAGGED = [
here / "s1-mono-tagged.m4a",
{
**meta,
**tags,
**mp3Tags,
"bit_rate": approx(65000, abs=5e4),
"channels": 2, # Weird
"mime": "audio/mp4",
@ -161,7 +167,7 @@ FILES_TAGGED = [
here / "s1-stereo-tagged.m4a",
{
**meta,
**tags,
**mp3Tags,
"bit_rate": approx(128000, abs=1e5),
"channels": 2,
"mime": "audio/mp4",
@ -228,12 +234,18 @@ tags = {
"comment": "Ł Ą Ż Ę Ć Ń Ś Ź",
}
mp3Tags = {
**tags,
"comments": tags["comment"],
"description": tags["comment"],
}
FILES_TAGGED += [
FixtureMeta(
here / "s1-jointstereo-tagged-utf8.mp3",
{
**meta,
**tags,
**mp3Tags,
"bit_rate": approx(128000, abs=1e2),
"channels": 2,
"mime": "audio/mp3",
@ -243,7 +255,7 @@ FILES_TAGGED += [
here / "s1-mono-tagged-utf8.mp3",
{
**meta,
**tags,
**mp3Tags,
"bit_rate": approx(64000, abs=1e2),
"channels": 1,
"mime": "audio/mp3",
@ -253,7 +265,7 @@ FILES_TAGGED += [
here / "s1-stereo-tagged-utf8.mp3",
{
**meta,
**tags,
**mp3Tags,
"bit_rate": approx(128000, abs=1e2),
"channels": 2,
"mime": "audio/mp3",
@ -283,7 +295,7 @@ FILES_TAGGED += [
here / "s1-mono-tagged-utf8.m4a",
{
**meta,
**tags,
**mp3Tags,
"bit_rate": approx(65000, abs=5e4),
"channels": 2, # Weird
"mime": "audio/mp4",
@ -293,7 +305,7 @@ FILES_TAGGED += [
here / "s1-stereo-tagged-utf8.m4a",
{
**meta,
**tags,
**mp3Tags,
"bit_rate": approx(128000, abs=1e5),
"channels": 2,
"mime": "audio/mp4",

View File

@ -27,8 +27,8 @@ def test_analyze_metadata(filepath: Path, metadata: dict):
del metadata["length"]
del found["length"]
# mp3,ogg,flac files does not support comments yet
if not filepath.suffix == ".m4a":
# ogg,flac files does not support comments yet
if not filepath.suffix == ".m4a" and not filepath.suffix == ".mp3":
if "comment" in metadata:
del metadata["comment"]

View File

@ -214,3 +214,6 @@ class ApiClient:
def update_metadata_on_tunein(self):
self._base_client.update_metadata_on_tunein()
def trigger_task_manager(self):
self._base_client.version()

View File

@ -1,4 +1,4 @@
# Please do not edit this file, edit the setup.py file!
# This file is auto-generated by tools/extract_requirements.py.
python-dateutil>=2.8.1,<2.9
requests>=2.31.0,<2.32
python-dateutil>=2.8.1,<2.10
requests>=2.32.2,<2.33

View File

@ -1,6 +1,6 @@
from setuptools import find_packages, setup
version = "4.0.0" # x-release-please-version
version = "4.2.0" # x-release-please-version
setup(
name="libretime-api-client",
@ -18,8 +18,8 @@ setup(
package_data={"": ["py.typed"]},
python_requires=">=3.8",
install_requires=[
"python-dateutil>=2.8.1,<2.9",
"requests>=2.31.0,<2.32",
"python-dateutil>=2.8.1,<2.10",
"requests>=2.32.2,<2.33",
],
extras_require={
"dev": [

View File

@ -18,12 +18,13 @@ class StreamPreferences(BaseModel):
input_fade_transition: float
message_format: MessageFormatKind
message_offline: str
replay_gain_enabled: bool
replay_gain_offset: float
# input_auto_switch_off: bool
# input_auto_switch_on: bool
# input_main_user: str
# input_main_password: str
# replay_gain_enabled: bool
# replay_gain_offset: float
# track_fade_in: float
# track_fade_out: float
# track_fade_transition: float
@ -82,6 +83,8 @@ class Preference(models.Model):
int(entries.get("stream_label_format") or 0)
),
message_offline=entries.get("off_air_meta") or "Offline",
replay_gain_enabled=entries.get("enable_replay_gain") == "1",
replay_gain_offset=float(entries.get("replay_gain_modifier") or 0.0),
)
@classmethod

View File

@ -8,6 +8,7 @@ from .role import Role
class UserManager(BaseUserManager):
# pylint: disable=too-many-positional-arguments
def create_user(self, role, username, password, email, first_name, last_name):
user = self.model(
role=role,
@ -20,6 +21,7 @@ class UserManager(BaseUserManager):
user.save(using=self._db)
return user
# pylint: disable=too-many-positional-arguments
def create_superuser(self, username, password, email, first_name, last_name):
return self.create_user(
Role.ADMIN,

View File

@ -6,6 +6,8 @@ class StreamPreferencesSerializer(serializers.Serializer):
input_fade_transition = serializers.FloatField(read_only=True)
message_format = serializers.IntegerField(read_only=True)
message_offline = serializers.CharField(read_only=True)
replay_gain_enabled = serializers.BooleanField(read_only=True)
replay_gain_offset = serializers.FloatField(read_only=True)
# pylint: disable=abstract-method

View File

@ -16,6 +16,8 @@ def test_preference_get_stream_preferences(db):
"input_fade_transition": 0.0,
"message_format": 0,
"message_offline": "LibreTime - offline",
"replay_gain_enabled": True,
"replay_gain_offset": 0.0,
}

View File

@ -9,6 +9,8 @@ def test_stream_preferences_get(db, api_client: APIClient):
"input_fade_transition": 0.0,
"message_format": 0,
"message_offline": "LibreTime - offline",
"replay_gain_enabled": True,
"replay_gain_offset": 0.0,
}

View File

@ -19,6 +19,8 @@ class StreamPreferencesView(views.APIView):
"input_fade_transition",
"message_format",
"message_offline",
"replay_gain_enabled",
"replay_gain_offset",
}
)
)

View File

@ -8,8 +8,6 @@ UP = """
-- DELETE FROM cc_pref WHERE keystr = 'system_version';
-- INSERT INTO cc_pref (keystr, valstr) VALUES ('system_version', '2.5.5');
ALTER TABLE cc_show ADD COLUMN image_path varchar(255) DEFAULT '';
ALTER TABLE cc_show_instances ADD COLUMN description varchar(255) DEFAULT '';
"""
DOWN = None

View File

@ -5,7 +5,7 @@ from django.db import migrations
from ._migrations import legacy_migration_factory
UP = """
ALTER TABLE cc_files ADD COLUMN artwork TYPE character varying(255);
ALTER TABLE cc_files ADD COLUMN artwork VARCHAR(255);
"""
DOWN = None

View File

@ -4,12 +4,18 @@ from django.db import migrations
from ._migrations import legacy_migration_factory
# This migration is currently a placeholder for 3.0.0-alpha.9.1.
# Please do not remove it. There are currently no actions, but it
# needs to remain intact so it does not fail when called from the
# migrations script. Any future migrations that may apply to
# 3.0.0-alpha.9.1 will be added to this file.
UP = """
ALTER TABLE cc_files ADD COLUMN artwork VARCHAR(4096);
"""
DOWN = """
ALTER TABLE cc_files DROP COLUMN IF EXISTS artwork;
"""

View File

@ -0,0 +1,37 @@
# pylint: disable=invalid-name
from django.db import migrations
from ._migrations import legacy_migration_factory
UP = """
ALTER TABLE cc_show ADD COLUMN override_intro_playlist boolean default 'f' NOT NULL;
ALTER TABLE cc_show ADD COLUMN intro_playlist_id integer DEFAULT NULL;
ALTER TABLE cc_show ADD CONSTRAINT cc_playlist_intro_playlist_fkey FOREIGN KEY (intro_playlist_id) REFERENCES cc_playlist (id) ON DELETE SET NULL;
ALTER TABLE cc_show ADD COLUMN override_outro_playlist boolean default 'f' NOT NULL;
ALTER TABLE cc_show ADD COLUMN outro_playlist_id integer DEFAULT NULL;
ALTER TABLE cc_show ADD CONSTRAINT cc_playlist_outro_playlist_fkey FOREIGN KEY (outro_playlist_id) REFERENCES cc_playlist (id) ON DELETE SET NULL;
"""
DOWN = """
ALTER TABLE cc_show DROP COLUMN IF EXISTS override_intro_playlist;
ALTER TABLE cc_show DROP COLUMN IF EXISTS intro_playlist_id;
ALTER TABLE cc_show DROP CONSTRAINT IF EXISTS cc_playlist_intro_playlist_fkey;
ALTER TABLE cc_show DROP COLUMN IF EXISTS override_outro_playlist;
ALTER TABLE cc_show DROP COLUMN IF EXISTS outro_playlist_id;
ALTER TABLE cc_show DROP CONSTRAINT IF EXISTS cc_playlist_outro_playlist_fkey;
"""
class Migration(migrations.Migration):
dependencies = [
("legacy", "0045_add_sessions_table"),
]
operations = [
migrations.RunPython(
code=legacy_migration_factory(
target="46",
sql=UP,
)
)
]

View File

@ -1,2 +1,2 @@
# The schema version is defined using the migration file prefix number
LEGACY_SCHEMA_VERSION = "45"
LEGACY_SCHEMA_VERSION = "46"

View File

@ -11,15 +11,28 @@ def get_schema_version():
Don't use django models as they might break in the future. Our concern is to upgrade
the legacy database schema to the point where django is in charge of the migrations.
An airtime 2.5.1 migration will not have schema_version, in that case, we look for
system_version to have a value of 2.5.1 and return that as the schema version value
(really just needs to be anything besides None, so that the next migration doesn't overwrite
the database)
"""
if "cc_pref" not in connection.introspection.table_names():
return None
with connection.cursor() as cursor:
cursor.execute("SELECT valstr FROM cc_pref WHERE keystr = 'schema_version'")
cursor.execute(
"""
SELECT valstr AS version
FROM cc_pref
WHERE (keystr = 'schema_version') OR (keystr = 'system_version' AND valstr = '2.5.1')
"""
)
row = cursor.fetchone()
return row[0] if row else None
if row and row[0]:
return row[0]
return None
def set_schema_version(cursor, version: str):

View File

@ -126,6 +126,10 @@ CREATE TABLE "cc_show"
"has_autoplaylist" BOOLEAN DEFAULT 'f' NOT NULL,
"autoplaylist_id" INTEGER,
"autoplaylist_repeat" BOOLEAN DEFAULT 'f' NOT NULL,
"override_intro_playlist" BOOLEAN DEFAULT 'f' NOT NULL,
"intro_playlist_id" INTEGER,
"override_outro_playlist" BOOLEAN DEFAULT 'f' NOT NULL,
"outro_playlist_id" INTEGER,
PRIMARY KEY ("id")
);
@ -718,6 +722,16 @@ ALTER TABLE "cc_show" ADD CONSTRAINT "cc_playlist_autoplaylist_fkey"
REFERENCES "cc_playlist" ("id")
ON DELETE SET NULL;
ALTER TABLE "cc_show" ADD CONSTRAINT "cc_playlist_intro_playlist_fkey"
FOREIGN KEY ("intro_playlist_id")
REFERENCES "cc_playlist" ("id")
ON DELETE SET NULL;
ALTER TABLE "cc_show" ADD CONSTRAINT "cc_playlist_outro_playlist_fkey"
FOREIGN KEY ("outro_playlist_id")
REFERENCES "cc_playlist" ("id")
ON DELETE SET NULL;
ALTER TABLE "cc_show_instances" ADD CONSTRAINT "cc_show_fkey"
FOREIGN KEY ("show_id")
REFERENCES "cc_show" ("id")

View File

@ -0,0 +1 @@
from .readwriteserializer import ReadWriteSerializerMixin

View File

@ -0,0 +1,33 @@
from rest_framework.serializers import Serializer
class ReadWriteSerializerMixin:
"""
Overrides get_serializer_class to choose the read serializer
for GET requests and the write serializer for POST requests.
Set read_serializer_class and write_serializer_class attributes on a
viewset.
"""
read_serializer_class = Serializer
write_serializer_class = Serializer
def get_serializer_class(self):
if self.action in ["create"]:
return self.get_write_serializer_class()
return self.get_read_serializer_class()
def get_read_serializer_class(self):
assert self.read_serializer_class is not None, (
f"'{self.__class__.__name__}' should either include a `read_serializer_class`"
"attribute, or override the `get_read_serializer_class()` method."
)
return self.read_serializer_class
def get_write_serializer_class(self):
assert self.write_serializer_class is not None, (
f"'{self.__class__.__name__}' should either include a `write_serializer_class`"
"attribute, or override the `get_write_serializer_class()` method."
)
return self.write_serializer_class

View File

@ -1,4 +1,5 @@
from django.db import models
from django.utils.timezone import now
class Schedule(models.Model):
@ -115,6 +116,14 @@ class Schedule(models.Model):
return self.instance.ends_at
return self.ends_at
@staticmethod
def is_file_scheduled_in_the_future(file_id):
count = Schedule.objects.filter(
file_id=file_id,
ends_at__gt=now(),
).count()
return count > 0
class Meta:
managed = False
db_table = "cc_schedule"

View File

@ -69,6 +69,28 @@ class Show(models.Model):
auto_playlist_enabled = models.BooleanField(db_column="has_autoplaylist")
auto_playlist_repeat = models.BooleanField(db_column="autoplaylist_repeat")
intro_playlist = models.ForeignKey(
"schedule.Playlist",
on_delete=models.DO_NOTHING,
blank=True,
null=True,
db_column="intro_playlist_id",
related_name="intro_playlist",
)
override_intro_playlist = models.BooleanField(db_column="override_intro_playlist")
outro_playlist = models.ForeignKey(
"schedule.Playlist",
on_delete=models.DO_NOTHING,
blank=True,
null=True,
db_column="outro_playlist_id",
related_name="outro_playlist",
)
override_outro_playlist = models.BooleanField(db_column="override_outro_playlist")
hosts = models.ManyToManyField( # type: ignore[var-annotated]
"core.User",
through="ShowHost",

View File

@ -1,5 +1,5 @@
from .playlist import PlaylistContentSerializer, PlaylistSerializer
from .schedule import ScheduleSerializer
from .schedule import ReadScheduleSerializer, WriteScheduleSerializer
from .show import (
ShowDaysSerializer,
ShowHostSerializer,

View File

@ -3,10 +3,17 @@ from rest_framework import serializers
from ..models import Schedule
class ScheduleSerializer(serializers.ModelSerializer):
class ReadScheduleSerializer(serializers.ModelSerializer):
cue_out = serializers.DurationField(source="get_cue_out", read_only=True)
ends_at = serializers.DateTimeField(source="get_ends_at", read_only=True)
class Meta:
model = Schedule
fields = "__all__"
class WriteScheduleSerializer(serializers.ModelSerializer):
class Meta:
model = Schedule
fields = "__all__"

View File

@ -21,6 +21,10 @@ class ShowSerializer(serializers.ModelSerializer):
"auto_playlist",
"auto_playlist_enabled",
"auto_playlist_repeat",
"intro_playlist",
"override_intro_playlist",
"outro_playlist",
"override_outro_playlist",
]

View File

@ -2,8 +2,9 @@ from django.db import models
from django_filters import rest_framework as filters
from rest_framework import viewsets
from ...mixins import ReadWriteSerializerMixin
from ..models import Schedule
from ..serializers import ScheduleSerializer
from ..serializers import ReadScheduleSerializer, WriteScheduleSerializer
class ScheduleFilter(filters.FilterSet):
@ -26,8 +27,9 @@ class ScheduleFilter(filters.FilterSet):
fields = [] # type: ignore
class ScheduleViewSet(viewsets.ModelViewSet):
class ScheduleViewSet(ReadWriteSerializerMixin, viewsets.ModelViewSet):
queryset = Schedule.objects.all()
serializer_class = ScheduleSerializer
read_serializer_class = ReadScheduleSerializer
write_serializer_class = WriteScheduleSerializer
filterset_class = ScheduleFilter
model_permission_name = "schedule"

View File

@ -1,35 +1,96 @@
import os
from unittest.mock import patch
from django.conf import settings
from model_bakery import baker
from rest_framework.test import APITestCase
from ...._fixtures import AUDIO_FILENAME
from ...models import File
class TestFileViewSet(APITestCase):
@classmethod
def setUpTestData(cls):
cls.path = "/api/v2/files/{id}/download"
cls.token = settings.CONFIG.general.api_key
def test_invalid(self):
path = self.path.format(id="a")
def test_download_invalid(self):
self.client.credentials(HTTP_AUTHORIZATION=f"Api-Key {self.token}")
response = self.client.get(path)
self.assertEqual(response.status_code, 400)
def test_does_not_exist(self):
path = self.path.format(id="1")
self.client.credentials(HTTP_AUTHORIZATION=f"Api-Key {self.token}")
response = self.client.get(path)
file_id = "1"
response = self.client.get(f"/api/v2/files/{file_id}/download")
self.assertEqual(response.status_code, 404)
def test_exists(self):
file = baker.make(
def test_download(self):
self.client.credentials(HTTP_AUTHORIZATION=f"Api-Key {self.token}")
file: File = baker.make(
"storage.File",
mime="audio/mp3",
filepath=AUDIO_FILENAME,
)
path = self.path.format(id=str(file.pk))
self.client.credentials(HTTP_AUTHORIZATION=f"Api-Key {self.token}")
response = self.client.get(path)
response = self.client.get(f"/api/v2/files/{file.id}/download")
self.assertEqual(response.status_code, 200)
def test_destroy(self):
self.client.credentials(HTTP_AUTHORIZATION=f"Api-Key {self.token}")
file: File = baker.make(
"storage.File",
mime="audio/mp3",
filepath=AUDIO_FILENAME,
)
with patch("libretime_api.storage.views.file.remove") as remove_mock:
response = self.client.delete(f"/api/v2/files/{file.id}")
self.assertEqual(response.status_code, 204)
remove_mock.assert_called_with(
os.path.join(settings.CONFIG.storage.path, file.filepath)
)
def test_destroy_no_file(self):
self.client.credentials(HTTP_AUTHORIZATION=f"Api-Key {self.token}")
file = baker.make(
"storage.File",
mime="audio/mp3",
filepath="invalid.mp3",
)
response = self.client.delete(f"/api/v2/files/{file.id}")
self.assertEqual(response.status_code, 204)
def test_destroy_invalid(self):
self.client.credentials(HTTP_AUTHORIZATION=f"Api-Key {self.token}")
file_id = "1"
response = self.client.delete(f"/api/v2/files/{file_id}")
self.assertEqual(response.status_code, 404)
def test_filters(self):
file = baker.make(
"storage.File",
mime="audio/mp3",
filepath=AUDIO_FILENAME,
genre="Soul",
md5="5a11ffe0e6c6d70fcdbad1b734be6482",
)
baker.make(
"storage.File",
mime="audio/mp3",
filepath=AUDIO_FILENAME,
genre="R&B",
md5="5a11ffe0e6c6d70fcdbad1b734be6483",
)
self.client.credentials(HTTP_AUTHORIZATION=f"Api-Key {self.token}")
path = "/api/v2/files"
results = self.client.get(path).json()
self.assertEqual(len(results), 2)
path = f"/api/v2/files?md5={file.md5}"
results = self.client.get(path).json()
self.assertEqual(len(results), 1)
path = "/api/v2/files?genre=Soul"
results = self.client.get(path).json()
self.assertEqual(len(results), 1)
path = "/api/v2/files?genre=R%26B"
results = self.client.get(path).json()
self.assertEqual(len(results), 1)

View File

@ -1,31 +1,62 @@
import logging
import os
from os import remove
from django.conf import settings
from django.http import HttpResponse
from django.shortcuts import get_object_or_404
from django.utils.encoding import filepath_to_uri
from rest_framework import viewsets
from django_filters import rest_framework as filters
from rest_framework import status, viewsets
from rest_framework.decorators import action
from rest_framework.serializers import IntegerField
from rest_framework.exceptions import APIException
from ...schedule.models import Schedule
from ..models import File
from ..serializers import FileSerializer
logger = logging.getLogger(__name__)
class FileInUse(APIException):
status_code = status.HTTP_409_CONFLICT
default_detail = "The file is currently used"
default_code = "file_in_use"
class FileViewSet(viewsets.ModelViewSet):
queryset = File.objects.all()
serializer_class = FileSerializer
model_permission_name = "file"
filter_backends = (filters.DjangoFilterBackend,)
filterset_fields = ("md5", "genre")
# pylint: disable=invalid-name,unused-argument
@action(detail=True, methods=["GET"])
def download(self, request, pk=None): # pylint: disable=invalid-name
pk = IntegerField().to_internal_value(data=pk)
file = get_object_or_404(File, pk=pk)
def download(self, request, pk=None):
instance: File = self.get_object()
response = HttpResponse()
# HTTP headers must be USASCII encoded, or Nginx might not find the file and
# will return a 404.
redirect_uri = filepath_to_uri(os.path.join("/api/_media", file.filepath))
redirect_uri = filepath_to_uri(os.path.join("/api/_media", instance.filepath))
response["X-Accel-Redirect"] = redirect_uri
return response
def perform_destroy(self, instance: File):
if Schedule.is_file_scheduled_in_the_future(file_id=instance.id):
raise FileInUse("file is scheduled in the future")
try:
if instance.filepath is None:
logger.warning("file does not have a filepath: %d", instance.id)
return
path = os.path.join(settings.CONFIG.storage.path, instance.filepath)
if not os.path.isfile(path):
logger.warning("file does not exist in storage: %d", instance.id)
return
remove(path)
except OSError as exception:
raise APIException("could not delete file from storage") from exception

View File

@ -4,6 +4,7 @@ URL Configuration
For more information on this file, see
https://docs.djangoproject.com/en/3.2/topics/http/urls/
"""
from django.urls import include, path
from drf_spectacular.views import SpectacularAPIView, SpectacularSwaggerView

View File

@ -1,11 +1,11 @@
# Please do not edit this file, edit the setup.py file!
# This file is auto-generated by tools/extract_requirements.py.
django-cors-headers>=3.14.0,<4.4
django-filter>=2.4.0,<23.6
django-cors-headers>=3.14.0,<4.5
django-filter>=2.4.0,<24.4
django>=4.2.0,<4.3
djangorestframework>=3.14.0,<3.15
drf-spectacular>=0.22.1,<0.28
gunicorn>=20.1.0,<21.3
djangorestframework>=3.14.0,<3.16
drf-spectacular>=0.22.1,<0.29
gunicorn>=22.0.0,<23.1
psycopg[c]>=3.1.8,<3.2
requests>=2.31.0,<2.32
uvicorn[standard]>=0.17.6,<0.26.0
requests>=2.32.2,<2.33
uvicorn[standard]>=0.17.6,<0.33.0

View File

@ -154,6 +154,15 @@ paths:
/api/v2/files:
get:
operationId: files_list
parameters:
- in: query
name: genre
schema:
type: string
- in: query
name: md5
schema:
type: string
tags:
- files
security:
@ -2552,6 +2561,12 @@ paths:
/api/v2/schedule:
get:
operationId: schedule_list
description: |-
Overrides get_serializer_class to choose the read serializer
for GET requests and the write serializer for POST requests.
Set read_serializer_class and write_serializer_class attributes on a
viewset.
parameters:
- in: query
name: broadcasted
@ -2597,23 +2612,29 @@ paths:
schema:
type: array
items:
$ref: "#/components/schemas/Schedule"
$ref: "#/components/schemas/ReadSchedule"
description: ""
post:
operationId: schedule_create
description: |-
Overrides get_serializer_class to choose the read serializer
for GET requests and the write serializer for POST requests.
Set read_serializer_class and write_serializer_class attributes on a
viewset.
tags:
- schedule
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/Schedule"
$ref: "#/components/schemas/WriteSchedule"
application/x-www-form-urlencoded:
schema:
$ref: "#/components/schemas/Schedule"
$ref: "#/components/schemas/WriteSchedule"
multipart/form-data:
schema:
$ref: "#/components/schemas/Schedule"
$ref: "#/components/schemas/WriteSchedule"
required: true
security:
- cookieAuth: []
@ -2623,11 +2644,17 @@ paths:
content:
application/json:
schema:
$ref: "#/components/schemas/Schedule"
$ref: "#/components/schemas/WriteSchedule"
description: ""
/api/v2/schedule/{id}:
get:
operationId: schedule_retrieve
description: |-
Overrides get_serializer_class to choose the read serializer
for GET requests and the write serializer for POST requests.
Set read_serializer_class and write_serializer_class attributes on a
viewset.
parameters:
- in: path
name: id
@ -2645,10 +2672,16 @@ paths:
content:
application/json:
schema:
$ref: "#/components/schemas/Schedule"
$ref: "#/components/schemas/ReadSchedule"
description: ""
put:
operationId: schedule_update
description: |-
Overrides get_serializer_class to choose the read serializer
for GET requests and the write serializer for POST requests.
Set read_serializer_class and write_serializer_class attributes on a
viewset.
parameters:
- in: path
name: id
@ -2662,13 +2695,13 @@ paths:
content:
application/json:
schema:
$ref: "#/components/schemas/Schedule"
$ref: "#/components/schemas/ReadSchedule"
application/x-www-form-urlencoded:
schema:
$ref: "#/components/schemas/Schedule"
$ref: "#/components/schemas/ReadSchedule"
multipart/form-data:
schema:
$ref: "#/components/schemas/Schedule"
$ref: "#/components/schemas/ReadSchedule"
required: true
security:
- cookieAuth: []
@ -2678,10 +2711,16 @@ paths:
content:
application/json:
schema:
$ref: "#/components/schemas/Schedule"
$ref: "#/components/schemas/ReadSchedule"
description: ""
patch:
operationId: schedule_partial_update
description: |-
Overrides get_serializer_class to choose the read serializer
for GET requests and the write serializer for POST requests.
Set read_serializer_class and write_serializer_class attributes on a
viewset.
parameters:
- in: path
name: id
@ -2695,13 +2734,13 @@ paths:
content:
application/json:
schema:
$ref: "#/components/schemas/PatchedSchedule"
$ref: "#/components/schemas/PatchedReadSchedule"
application/x-www-form-urlencoded:
schema:
$ref: "#/components/schemas/PatchedSchedule"
$ref: "#/components/schemas/PatchedReadSchedule"
multipart/form-data:
schema:
$ref: "#/components/schemas/PatchedSchedule"
$ref: "#/components/schemas/PatchedReadSchedule"
security:
- cookieAuth: []
- basicAuth: []
@ -2710,10 +2749,16 @@ paths:
content:
application/json:
schema:
$ref: "#/components/schemas/Schedule"
$ref: "#/components/schemas/ReadSchedule"
description: ""
delete:
operationId: schedule_destroy
description: |-
Overrides get_serializer_class to choose the read serializer
for GET requests and the write serializer for POST requests.
Set read_serializer_class and write_serializer_class attributes on a
viewset.
parameters:
- in: path
name: id
@ -6300,7 +6345,7 @@ components:
user:
type: integer
nullable: true
PatchedSchedule:
PatchedReadSchedule:
type: object
properties:
id:
@ -6409,6 +6454,16 @@ components:
type: boolean
auto_playlist_repeat:
type: boolean
intro_playlist:
type: integer
nullable: true
override_intro_playlist:
type: boolean
outro_playlist:
type: integer
nullable: true
override_outro_playlist:
type: boolean
PatchedShowDays:
type: object
properties:
@ -7086,41 +7141,7 @@ components:
- id
- key
- user
RecordEnabledEnum:
enum:
- 0
- 1
type: integer
description: |-
* `0` - No
* `1` - Yes
RepeatKindEnum:
enum:
- 0
- 1
- 4
- 5
- 2
type: integer
description: |-
* `0` - Every week
* `1` - Every 2 weeks
* `4` - Every 3 weeks
* `5` - Every 4 weeks
* `2` - Every month
RoleEnum:
enum:
- G
- H
- P
- A
type: string
description: |-
* `G` - Guest
* `H` - Host
* `P` - Manager
* `A` - Admin
Schedule:
ReadSchedule:
type: object
properties:
id:
@ -7182,6 +7203,40 @@ components:
- instance
- position
- starts_at
RecordEnabledEnum:
enum:
- 0
- 1
type: integer
description: |-
* `0` - No
* `1` - Yes
RepeatKindEnum:
enum:
- 0
- 1
- 4
- 5
- 2
type: integer
description: |-
* `0` - Every week
* `1` - Every 2 weeks
* `4` - Every 3 weeks
* `5` - Every 4 weeks
* `2` - Every month
RoleEnum:
enum:
- G
- H
- P
- A
type: string
description: |-
* `G` - Guest
* `H` - Host
* `P` - Manager
* `A` - Admin
ServiceRegister:
type: object
properties:
@ -7241,6 +7296,16 @@ components:
type: boolean
auto_playlist_repeat:
type: boolean
intro_playlist:
type: integer
nullable: true
override_intro_playlist:
type: boolean
outro_playlist:
type: integer
nullable: true
override_outro_playlist:
type: boolean
required:
- auto_playlist_enabled
- auto_playlist_repeat
@ -7249,6 +7314,8 @@ components:
- linked
- live_enabled
- name
- override_intro_playlist
- override_outro_playlist
ShowDays:
type: object
properties:
@ -7535,10 +7602,19 @@ components:
message_offline:
type: string
readOnly: true
replay_gain_enabled:
type: boolean
readOnly: true
replay_gain_offset:
type: number
format: double
readOnly: true
required:
- input_fade_transition
- message_format
- message_offline
- replay_gain_enabled
- replay_gain_offset
StreamState:
type: object
properties:
@ -7764,6 +7840,66 @@ components:
* `4` - Friday
* `5` - Saturday
* `6` - Sunday
WriteSchedule:
type: object
properties:
id:
type: integer
readOnly: true
starts_at:
type: string
format: date-time
ends_at:
type: string
format: date-time
length:
type: string
nullable: true
fade_in:
type: string
format: time
nullable: true
fade_out:
type: string
format: time
nullable: true
cue_in:
type: string
cue_out:
type: string
position:
type: integer
maximum: 2147483647
minimum: -2147483648
position_status:
allOf:
- $ref: "#/components/schemas/PositionStatusEnum"
minimum: -32768
maximum: 32767
broadcasted:
type: integer
maximum: 32767
minimum: -32768
played:
type: boolean
nullable: true
instance:
type: integer
file:
type: integer
nullable: true
stream:
type: integer
nullable: true
required:
- broadcasted
- cue_in
- cue_out
- ends_at
- id
- instance
- position
- starts_at
securitySchemes:
basicAuth:
type: http

View File

@ -1,6 +1,6 @@
from setuptools import find_packages, setup
version = "4.0.0" # x-release-please-version
version = "4.2.0" # x-release-please-version
setup(
name="libretime-api",
@ -26,22 +26,22 @@ setup(
]
},
install_requires=[
"django-cors-headers>=3.14.0,<4.4",
"django-filter>=2.4.0,<23.6",
"django-cors-headers>=3.14.0,<4.5",
"django-filter>=2.4.0,<24.4",
"django>=4.2.0,<4.3",
"djangorestframework>=3.14.0,<3.15",
"drf-spectacular>=0.22.1,<0.28",
"requests>=2.31.0,<2.32",
"djangorestframework>=3.14.0,<3.16",
"drf-spectacular>=0.22.1,<0.29",
"requests>=2.32.2,<2.33",
],
extras_require={
"prod": [
"gunicorn>=20.1.0,<21.3",
"gunicorn>=22.0.0,<23.1",
"psycopg[c]>=3.1.8,<3.2",
"uvicorn[standard]>=0.17.6,<0.26.0",
"uvicorn[standard]>=0.17.6,<0.33.0",
],
"dev": [
"django-coverage-plugin>=3.0.0,<4",
"django-stubs>=1.14.0,<5",
"django-stubs>=5.1.0,<6",
"djangorestframework-stubs>=1.8.0,<4",
"model_bakery>=1.10.1,<2",
"psycopg[binary]>=3.1.8,<4",

View File

@ -2,8 +2,6 @@
# This file is used for development. It it not intended for production!
# See https://libretime.org/docs/developer-manual/development/environment/#docker-compose
#
version: "3.9"
services:
postgres:
ports:

View File

@ -1,5 +1,3 @@
version: "3.9"
services:
postgres:
image: postgres:15
@ -12,13 +10,13 @@ services:
test: pg_isready -U libretime
rabbitmq:
image: rabbitmq:3.12-alpine
image: rabbitmq:3.13-alpine
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: rabbitmq-diagnostics -q ping
test: nc -z 127.0.0.1 5672
playout:
image: ghcr.io/libretime/libretime-playout:${LIBRETIME_VERSION:-latest}

View File

@ -50,7 +50,7 @@ check them against pam.
The above configuration expects a PAM configuration for the `http-libretime` service.
To confiure this you need to create the file `/etc/pam.d/http-libretime` with the following contents.
To configure this you need to create the file `/etc/pam.d/http-libretime` with the following contents.
```
auth required pam_sss.so
@ -113,3 +113,68 @@ general:
```
You should now be able to use your FreeIPA credentials to log in to LibreTime.
## Setup Header Authentication
If you have an SSO system that supports trusted SSO header authentication such as [Authelia](https://www.authelia.com/),
you can configure LibreTime to login users based on those trusted headers.
This allows users to only need to log in once on the SSO system and not need to log in again. It also allows LibreTime
to indirectly support other authentication mechanisms such as OAuth2.
This ONLY affects Legacy/Legacy API auth and does NOT affect API V2 auth.
### Configure Headers
LibreTime needs to know what headers are sent, and what information is available to it. You can also
setup a predefined group mapping so users are automatically granted the desired permissions.
This configuration is in `/etc/libretime/config.yml`. The following is an example configuration for an SSO service
that does the following:
- Sends the username in the `Remote-User` HTTP header.
- Sends the email in the `Remote-Email` HTTP header.
- Sends the name in the `Remote-Name` HTTP header. Example `John Doe`
- Sends the comma delimited groups in the `Remote-Groups` HTTP header. Example `group 1,lt-admin,group2`
- Has an IP of `10.0.0.34` (not required). When not provided it is not checked.
- Users with the `lt-host` group should get host privileges.
- Users with the `lt-admin` group should get admin privileges.
- Users with the `lt-pm` group should get program manager privileges.
- Users with the `lt-superadmin` group should get super admin privileges.
- All other users should get guest privileges.
```yml
header_auth:
user_header: Remote-User # This is the default and could be omitted
groups_header: Remote-Groups # This is the default and could be omitted
email_header: Remote-Email # This is the default and could be omitted
name_header: Remote-Name # This is the default and could be omitted
proxy_ip: 10.0.0.34
group_map:
host: lt-host
program_manager: lt-pm
admin: lt-admin
superadmin: lt-superadmin
```
If the `user_header` is not found in the request, users will be kicked to the login page
with a message that their username/password is invalid and will not be able to log in. When `proxy_ip` is provided
it will check that the request is coming from the correct proxy before doing the login. This prevents users who have
internal network access from being able to login as whoever they want in LibreTime.
::: warning
If `proxy_ip` is not provided any user on the internal network can log in as any user in LibreTime.
:::
### Enable Header authentication
After everything is set up properly you can enable header auth in `config.yml`:
```yml
general:
auth: LibreTime_Auth_Adaptor_Header
```
You should now be automatically logged into LibreTime when you click the `Login` button.

View File

@ -22,7 +22,7 @@ First, set the version you want to install:
echo LIBRETIME_VERSION="{vars.version}" > .env
</CodeBlock>
Download the docker-compose files from the repository:
Download the docker compose files from the repository:
```bash
# Load LIBRETIME_VERSION variable
@ -106,16 +106,16 @@ You can find more details in the `docker-compose.yml` file or on the external se
Next, run the following commands to setup the database:
```bash
docker-compose run --rm api libretime-api migrate
docker compose run --rm api libretime-api migrate
```
Finally, start the services, and check that they're running using the following commands:
```bash
docker-compose up -d
docker compose up -d
docker-compose ps
docker-compose logs -f
docker compose ps
docker compose logs -f
```
## Securing LibreTime

View File

@ -230,6 +230,9 @@ server {
server_name libretime.example.org;
client_max_body_size 512M;
client_body_timeout 300s;
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;

View File

@ -76,6 +76,9 @@ server {
listen 80;
server_name libretime.example.org;
client_max_body_size 512M;
client_body_timeout 300s;
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
@ -124,6 +127,9 @@ server {
listen 80;
server_name libretime.example.org;
client_max_body_size 512M;
client_body_timeout 300s;
if ($host = libretime.example.org) {
return 301 https://$host$request_uri;
} # managed by Certbot
@ -135,6 +141,9 @@ server {
listen 443 ssl; # managed by Certbot
server_name libretime.example.org;
client_max_body_size 512M;
client_body_timeout 300s;
ssl_certificate /etc/letsencrypt/live/libretime.example.org/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/libretime.example.org/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot

View File

@ -17,6 +17,12 @@ Setting a higher bitrate for your output stream will only benefit your listeners
:::
:::caution
The liquidsoap playout handler version 1.4.3 shipped in Debian Bullseye and 1.4.1 shipped in Ubuntu Focal doesn't support AAC streaming output. If you want to stream AAC, you will need to replace the liquidsoap package with a version that supports AAC. See this [tutorial](./tutorials/setup-liquidsoap-aac-streaming.md) for more information.
:::
## Icecast
### UTF-8 metadata in Icecast MP3 streams

View File

@ -0,0 +1,63 @@
---
title: How to update liquidsoap to support AAC streaming
---
This tutorials walks you though the steps required to replace the liquidsoap package with a version that supports AAC streaming.
:::warning
Replacing the liquidsoap package has security implications, since this will remove the package from the system's package manager. This means that the package manager will not be able to update the liquidsoap package in the future. This includes backports of security fixes.
Libretime is NOT compatible with Liquidsoap 2.x at the time of this writing. Future versions of Libretime will support Liquidsoap 2.x which will render these instructions obsolete.
:::
:::info
Lets assume you already [installed LibreTime using the native OS installer](../install/install-using-the-installer.md). Execute the following commands as the libretime user.
:::
## 1. Obtain liquidsoap with AAC support
For Ubuntu 20.04 LTS ('focal'), use the following file:
```bash
wget https://github.com/savonet/liquidsoap/releases/download/v1.4.4/liquidsoap-v1.4.4_1.4.4-ubuntu-focal-amd64-1_amd64.deb
```
For Debian 11 ('Bullseye'), first enable non-free package source for libfdk-aac support:
```bash
sudo apt install software-properties-common
sudo apt-add-repository -c non-free
```
Then use the following file:
```bash
wget https://github.com/savonet/liquidsoap/releases/download/v1.4.4/liquidsoap-v1.4.4_1.4.4-debian-testing-amd64-1_amd64.deb
```
## 2. Install and replace the liquidsoap package
Install the package using `apt`, then remove the old liquidsoap dependencies:
```bash
sudo apt -y install ./liquidsoap-v1.4.4_1.4.4-*-amd64-1_amd64.deb
sudo apt -y autoremove
```
## 3. Configure LibreTime to use the new liquidsoap package
Nothing to do, this is a drop-in replacement. Just restart the libretime target once and then check the status page in the LibreTime web interface to see if the liquidsoap service is running.
```bash
sudo systemctl restart libretime.target
```
:::warning
If you want to update LibreTime in the future, you'll need to re-run the installer schript. This will replace the liquidsoap package with the version that doesn't support AAC streaming. Add `--packages-excludes liquidsoap` to the installer command to prevent this from happening.
:::

View File

@ -54,7 +54,7 @@ liable to legal action.
If you want to go down the commercial music route, check out the
https://www.prsformusic.com and https://www.ppluk.com websites for UK licence
details. In the USA, the https://www.soundexchange.com website currently quotes
a 500 dollar minimum annual fee for non-commercial webcasters, plus a usage fee
a 1000 (per Jan. 2024) dollar minimum annual fee for non-commercial webcasters, plus a usage fee
above a certain number of listener hours, for the right to stream music
recordings to listeners. See the websites of [ASCAP](https://www.ascap.com),
[BMI](https://www.bmi.com) and [SESAC](https://www.sesac.com) for details of music

View File

@ -13,8 +13,8 @@ LibreTime development workflows follow the standardized [C4 development process]
- [2.4. Development Process](https://rfc.zeromq.org/spec/42/#24-development-process)
- `16.` Maintainers MAY NOT merge incorrect patches.
- [2.5. Branches and Releases](https://rfc.zeromq.org/spec/42/#25-branches-and-releases)
- `1.` The project SHALL have a development branch (`main`) that always holds the latest in-progress version and SHOULD always build. The project MAY have a bug fixes only branch (`stable`) that always holds the current stable version and SHOULD always build.
- `3.` To make a stable release a Maintainer shall tag the repository. Stable releases SHALL always be released from the repository `main` or `stable` branches.
- `1.` The project SHALL have a development branch (`main`) that always holds the latest in-progress version and SHOULD always build. The project MAY have a bug fixes only branch (`stable-*`) that always holds the current stable version and SHOULD always build.
- `3.` To make a stable release a Maintainer shall tag the repository. Stable releases SHALL always be released from the repository `main` or `stable-*` branches.
## Contribute financially

View File

@ -14,16 +14,16 @@ To setup a docker-compose development environment, run the following commands:
# Clean and build
make clean
cp .env.dev .env
DOCKER_BUILDKIT=1 docker-compose build
DOCKER_BUILDKIT=1 docker compose build
# Setup
make dev-certs
docker-compose run --rm legacy make build
docker-compose run --rm api libretime-api migrate
docker compose run --rm legacy make build
docker compose run --rm api libretime-api migrate
# Run
docker-compose up -d
docker-compose logs -f
docker compose up -d
docker compose logs -f
```
:::info
@ -33,7 +33,7 @@ You may also use the following `make clean dev` shortcut:
```bash
make clean dev
docker-compose logs -f
docker compose logs -f
```
:::

View File

@ -7,7 +7,7 @@ title: Development workflows
LibreTime uses [Github pull requests to manage changes](https://docs.github.com/en/get-started/quickstart/contributing-to-projects). The workflow looks like this:
- [Create a fork of the project](https://docs.github.com/en/get-started/quickstart/fork-a-repo).
- Check out the `main` branch. If you're making a minor or small documentation change you can check out the `stable` branch.
- Check out the `main` branch.
- Create a new branch based on the checked out branch.
- Work on your changes locally. Try to keep each commit small to make reviews easier.
- Lint and test the codebase, for example using the `make lint` or `make test` commands inside the app folder you want to check.

View File

@ -15,8 +15,8 @@ Once a release is desired, checkout the release branch:
```bash
# For a release on the main branch
git checkout release-please--branches--main--components--libretime
# For a release on the stable branch
git checkout release-please--branches--stable--components--libretime
# For a release on the stable-4.x branch
git checkout release-please--branches--stable-4.x--components--libretime
```
### 2. Release note

31
docs/releases/4.1.0.md Normal file
View File

@ -0,0 +1,31 @@
---
title: LibreTime 4.1.0
---
import ReleaseHead from './\_release-head.md';
<ReleaseHead date='2024-05-05' version='4.1.0'/>
## :sparkling_heart: Contributors
The LibreTime project wants to thank the following contributors for authoring PRs to this release:
- @caveman99
- @jooola
- @kmahelona
- @mp3butcher
- @paddatrapper
## :rocket: Features
Please see the [changelog](https://github.com/libretime/libretime/blob/main/CHANGELOG.md#410-2024-05-05).
## :bug: Bug fixes
Please see the [changelog](https://github.com/libretime/libretime/blob/main/CHANGELOG.md#410-2024-05-05).
## :arrow_up: Upgrading
### Replay gain modifier preference
The `replay_gain_modifier` preference is now stored as system preference. Please check and save the replay gain modifier preference manually to make sure the preference is up to date and usable.

25
docs/releases/4.2.0.md Normal file
View File

@ -0,0 +1,25 @@
---
title: LibreTime 4.2.0
---
import ReleaseHead from './\_release-head.md';
<ReleaseHead date='2024-06-22' version='4.2.0'/>
## :sparkling_heart: Contributors
The LibreTime project wants to thank the following contributors for authoring PRs to this release:
- @conet
- @dakriy
- @jooola
- @paddatrapper
- @rjhelms
## :rocket: Features
Please see the [changelog](https://github.com/libretime/libretime/blob/main/CHANGELOG.md#420-2024-06-22).
## :bug: Bug fixes
Please see the [changelog](https://github.com/libretime/libretime/blob/main/CHANGELOG.md#420-2024-06-22).

View File

@ -30,3 +30,4 @@ New releases target the current stable distributions release, and development sh
| Versions | | | | |
| 3.0.x | deprecated | deprecated | recommended | recommended |
| 3.1.x | | | recommended | recommended |
| 4.0.x | | | recommended | recommended |

View File

@ -12,8 +12,12 @@ The LibreTime project wants to thank the following contributors for authoring PR
## :rocket: Features
Please see the [changelog](https://github.com/libretime/libretime/blob/main/CHANGELOG.md).
## :bug: Bug fixes
Please see the [changelog](https://github.com/libretime/libretime/blob/main/CHANGELOG.md).
## :fire: Deprecation and removal
## :arrow_up: Before upgrading

View File

@ -37,6 +37,7 @@ Smart blocks are automatically filled with media files from the LibreTime librar
To create a smart block, click the **Smartblocks** button on the left sidebar, and select **New** from the toolbar. Like a playlist, smart blocks can have a title and description, which you can edit. This helps you find relevant smart blocks in searches.
Fill out the smart block's **Name**, **Search Criteria**, and **Limit to** sections. The search criteria can be any one of LibreTime's metadata categories, such as **Title**, **Creator** or **Genre**. The modifier depends on whether the metadata in question contains letters or numbers. For example, **Title** has modifiers including _contains_ and _starts with_, whereas the modifiers for **BPM** include _is greater than_ and _is in the range_.
To filter tracks using today's date information, use the `now{}` macro. Format characters are listed in the [php documentation](https://www.php.net/manual/en/datetime.format.php). For example, to filter to tracks with a **Title** that ends in `Instrumental Jan 2024` where `Jan 2024` is the current month and year, add a criteria for **Title** with a modifier of **ends with** and a value of `Instrumental now{M Y}`.
If you have a large number of files which meet the criteria that you specify, you may wish to limit the duration of the smart block using the **Limit to** field, so that it fits within the show you have in mind. Select **hours**, **minutes** or **items** from the drop-down menu, and click the **Generate** button again, if it's a static smart block. Then click the **Save** button.

View File

@ -79,6 +79,8 @@ indicator.
| Add Autoloading Playlist? | If checked, allows for the following options |
| Select Playlist | Select the playlist the show will autofill from (shows autofill exactly one hour before air). If you wish to use a smartblock you must add it to a playlist and then select that playlist. This can be used to auto schedule new podcast episodes to air. |
| Repeat Playlist Until Show Is Full | If checked, the playlist will be added to the show multiple times until the slot is full. Useful for applying a one-hour music playlist made up of smartblocks to a two-hour show. |
| Select Intro Playlist | Select the playlist to replace the global intro playlist from settings. If you wish to use a smartblock you must add it to a playlist and then select that playlist. |
| Select Outro Playlist | Select the playlist to replace the global outro playlist from settings. If you wish to use a smartblock you must add it to a playlist and then select that playlist. |
| _Live Stream Input_ | |
| Use LibreTime/Custom Authentication | |
| Show Source | |

View File

@ -21,6 +21,12 @@ time for the convenience of your station staff. You can also set the day of the
week that you wish to start your station's weekly schedule on, which defaults
to Sunday.
:::note
The **Station Timezone** setting can not be modified on this page. It is set in the [configuration file](../admin-manual/configuration.md#general).
:::
The **Track Type Default** enables you to select a track type default for uploads.
Initially, the **Default Fade In** and **Default Fade Out** times for automated
@ -60,15 +66,20 @@ wish. (There is more about this feature in the
[_Exporting the schedule_](./playout-history.md) chapter, in the
_Advanced Configuration_ section of this book).
The **Allowed CORS URLs** is intended to deal with situations where you want a
remote site with a different domain to access the API. This is relevant when
there is a reverse proxy server in front of LibreTime. If you are using a
reverse proxy, the URLs that will be used to access it should be added here.
:::note
The **Allowed CORS URLs** you can still see in this screenshot was moved to the [configuration file](../admin-manual/configuration.md#general).
:::
The **Display login button on your Radio Page?** will determine whether visitors
to your site see a link to login. If this is disabled, DJs and admins will need
to goto http://example.org/login to be able to login.
The **Disable the public radio page and redirect to the login page?** will
switch off the public radio page and redirect all visitors to the login page.
This is useful if you want to use LibreTime as a backend for a custom website.
The **Tune-In Settings** section is intended for stations that have partnered
with TuneIn to automatically push their now playing metadata to TuneIn. This
hasn't been tested and also requires special credentials from TuneIn.

View File

@ -605,7 +605,7 @@ info "creating python3 venv"
python3 -m venv "$VENV_DIR"
info "upgrading python3 tools"
$VENV_DIR/bin/pip install --upgrade pip setuptools wheel
$VENV_DIR/bin/pip install --upgrade "pip<24.1" setuptools wheel
# Install Shared and API client
########################################################################################
@ -683,6 +683,7 @@ install_service "libretime-analyzer.service" "$SCRIPT_DIR/analyzer/install/syste
section "Worker"
install_python_app "$SCRIPT_DIR/worker"
link_python_app libretime-worker
info "creating libretime-worker working directory"
mkdir_and_chown "$LIBRETIME_USER" "$WORKING_DIR/worker"

View File

@ -26,7 +26,7 @@
"css/media_library.css": "e1982d1f673543f7730898fb49450f8b",
"css/player-form.css": "e08a4545715fc56b75c845b44a5b2a1c",
"css/player.css": "904bc7aede4d5f0372468528d88094f1",
"css/playlist_builder.css": "e92ef56ddffca440a7741934edbb7f7f",
"css/playlist_builder.css": "9e35f1b7a1e79a7a73e7e9666d5a711f",
"css/playouthistory.css": "983cc1bac566b18b745b6e0da9ef3c0c",
"css/plupload.queue.css": "0acfb6b54c18654452727d4abf297394",
"css/pro_dropdown_3.css": "9848a27dad960c2218751c1656e9206a",
@ -43,13 +43,13 @@
"css/show_analytics.css": "4393c521308277447afabe8791779bf1",
"css/showbuilder.css": "4421c01b5c2dfb03f8d06dd6023b4bd7",
"css/station_podcast.css": "88e9b38ead71eddc69ef50bfc8cb2d0d",
"css/styles.css": "6890a553402f44cefc7c6915f38aa657",
"css/styles.css": "f38f7f24c3895c146babbb56a6534730",
"css/tipsy/jquery.tipsy.css": "b13517583583f83ed7d5fc067a0c9372",
"css/tracktypes.css": "94c94817a8505ff4dfcd090987859a7e",
"css/users.css": "94c94817a8505ff4dfcd090987859a7e",
"css/waveform.css": "4ce429708933e6da1a2f3bdb2a01db52",
"js/airtime/airtime_bootstrap.js": "9575982385f6c74e2b4ec61e30214a7c",
"js/airtime/audiopreview/preview_jplayer.js": "133b4b9a3436716a8367d353f1658da3",
"js/airtime/audiopreview/preview_jplayer.js": "d3402345279a9f4b86b381bae87d6de8",
"js/airtime/buttons/buttons.js": "1a984b1e01262816c899c5fa3f12e3cd",
"js/airtime/common/audioplaytest.js": "93737dabc4cce4fcdcc6d54acf86d16d",
"js/airtime/common/common.js": "8c0675f5a1c8d95323b2f3983c658f62",
@ -59,11 +59,11 @@
"js/airtime/dashboard/versiontooltip.js": "53ed1c2f7dd9527cba80bbcdb239ac88",
"js/airtime/library/events/library_playlistbuilder.js": "7191ee58ad07b8f652be02bb131eb5e6",
"js/airtime/library/events/library_showbuilder.js": "f3d3f65fe1e7a80cd17c228889c6a1ae",
"js/airtime/library/library.js": "bf61a213cf38521d1892034628faf17c",
"js/airtime/library/library.js": "869b3117dc2c119fac61775d78f63fa9",
"js/airtime/library/plupload.js": "0f6be5b133650828b9ffc74e7852dc89",
"js/airtime/library/podcast.js": "4dedd84cb571cdba2401bfb8ba621e69",
"js/airtime/library/publish.js": "ab3a1452dd332cdb0773241a1c17b7e0",
"js/airtime/library/spl.js": "c4cbac0c237b548064685a2cb16d3fa2",
"js/airtime/library/spl.js": "5bddd886303ff15e8b78e79b30a9e56f",
"js/airtime/listenerstat/listenerstat.js": "a3733dae8f9549668125ec9852d356ed",
"js/airtime/listenerstat/showlistenerstat.js": "7cf0c375420f1c8471d304bc8758b2cd",
"js/airtime/login/login.js": "7278cf49618791d75bacce38dd1b1d46",
@ -73,7 +73,7 @@
"js/airtime/nowplaying/register.js": "7d1e5d38eee510c22e408077155ab672",
"js/airtime/player/player.js": "76a78bfc1bac0c5479916d9d4641a5b1",
"js/airtime/player/playerhtml5.js": "058b061891abf4b3ee827c8e83996611",
"js/airtime/playlist/smart_blockbuilder.js": "36337e7e025d89976d754e34fc914887",
"js/airtime/playlist/smart_blockbuilder.js": "9e6bbad77150a589a6efd3b7da80a03b",
"js/airtime/playouthistory/configuretemplate.js": "44386f366d2baca3039f8c4cb9cd4422",
"js/airtime/playouthistory/historytable.js": "7e84ee76011ecf8f21abdd483487a45e",
"js/airtime/playouthistory/template.js": "742af1a411aef1745fa2ad3082499452",
@ -87,7 +87,7 @@
"js/airtime/showbuilder/main_builder.js": "d1ea3c3d834e47cd35c27efd75516190",
"js/airtime/showbuilder/tabs.js": "a0b5284afde950a6f32c7e9e75550690",
"js/airtime/status/status.js": "41456c6ed40f820e1e99215e81eb4bc4",
"js/airtime/tracktype/tracktype.js": "cca00731e212727908bec54f21d4be58",
"js/airtime/tracktype/tracktype.js": "1d11ec7ba6a79bc7a3cde1f167f4dc6e",
"js/airtime/user/user.js": "28811eb65c17bc9954900daeaed6c1ad",
"js/airtime/utilities/utilities.js": "e5d83eea1b38d2ff19bb968d30af9c98",
"js/airtime/widgets/table-example.js": "77d448b6496adf5be0a360640cd3980c",
@ -122,7 +122,7 @@
"js/jplayer/skin/jplayer.airtime.audio.preview.css": "c721fe0587569391dcfa7d0f7b440d2b",
"js/jplayer/skin/jplayer.audio-preview.blue.monday.css": "8565bf8e077eeb5bbba3c88bed42a590",
"js/jplayer/skin/jplayer.blue.monday.css": "491c7a82ae4571ae4a73645bf9755eaf",
"js/libs/CSVexport.js": "07a91f824f41d2d0d1884b5dd10f63e4",
"js/libs/CSVexport.js": "42c1fcfff5c717482f21bff1a9002295",
"js/libs/angular.min.js": "26680517e1024ca2c4f9ed4e0aa1619e",
"js/libs/dayjs.min.js": "bea3f1180a3e2e45eccf9d76f990f3b4",
"js/libs/dropzone.min.js": "f59ac59a89d9c569a27ca7ead38d2396",
@ -150,6 +150,7 @@
"js/plupload/i18n/it_IT.js": "d54d63ce65b652322b9411d545223a20",
"js/plupload/i18n/ja_JP.js": "35ffcfa1681e2ffef02fe085ea041436",
"js/plupload/i18n/ko_KR.js": "16f238d8f3bc779345f5e9d16a3471a2",
"js/plupload/i18n/nb_NO.js": "c23d8392d1f570b24a2bfe713e52d8b0",
"js/plupload/i18n/pl_PL.js": "5a32f95c5a79b846d3fc0388469beb40",
"js/plupload/i18n/pt_BR.js": "049e0eade66ed92564e1468051e70167",
"js/plupload/i18n/ru_RU.js": "a4ede8ec9bd8f1d703d55bc135453042",
@ -180,5 +181,13 @@
"js/waveformplaylist/playout.js": "7dfc5fe760f3c6739e38499df7b61e47",
"js/waveformplaylist/time_scale.js": "74e0e17e1c8cd597449220c98de408ba",
"js/waveformplaylist/track.js": "5456e6081ffedf55a9e38571bc178781",
"js/waveformplaylist/track_render.js": "e371b582b23e4b618e039f096d2f0570"
"js/wavesurfer/cursor.js": "8ed17a7437f3ec84972d15d0073249b2",
"js/wavesurfer/cursor.min.js": "831165862b629e615cf59112fa00d963",
"js/wavesurfer/libretime.js": "dfaefa6d32657faa77af6145d9d191ae",
"js/wavesurfer/regions.js": "aafe4f696d3da50c976d11e472fd56d1",
"js/wavesurfer/regions.min.js": "2ed2f8b5880beee568942000a6139e85",
"js/wavesurfer/timeline.js": "0bd70779070513c2a4f34237a0f9f573",
"js/wavesurfer/timeline.min.js": "90ea16b23cacebfad10cad42f94403d0",
"js/wavesurfer/wavesurfer.js": "9e2ced8a136449f4fd78911b0f01f6ed",
"js/wavesurfer/wavesurfer.min.js": "42ebd7fdd574dfe8cae587145751a1f2"
}

View File

@ -0,0 +1,148 @@
<?php
/**
* Auth adaptor for basic header authentication.
*/
class LibreTime_Auth_Adaptor_Header implements Zend_Auth_Adapter_Interface
{
/**
* @throws Exception
*/
public function authenticate(): Zend_Auth_Result
{
$trustedIp = Config::get('header_auth.proxy_ip');
if ($trustedIp != null && $_SERVER['REMOTE_ADDR'] != trim($trustedIp)) {
return new Zend_Auth_Result(Zend_Auth_Result::FAILURE, null);
}
$userHeader = Config::get('header_auth.user_header');
$groupsHeader = Config::get('header_auth.groups_header');
$emailHeader = Config::get('header_auth.email_header');
$nameHeader = Config::get('header_auth.name_header');
$userLogin = $this->getHeaderValueOf($userHeader);
if ($userLogin == null) {
return new Zend_Auth_Result(Zend_Auth_Result::FAILURE, null);
}
$subj = CcSubjsQuery::create()->findOneByDbLogin($userLogin);
if ($subj == null) {
$user = new Application_Model_User('');
$user->setPassword('');
$user->setLogin($userLogin);
} else {
$user = new Application_Model_User($subj->getDbId());
}
$name = $this->getHeaderValueOf($nameHeader);
$user->setEmail($this->getHeaderValueOf($emailHeader));
$user->setFirstName($this->getFirstName($name) ?? '');
$user->setLastName($this->getLastName($name) ?? '');
$user->setType($this->getUserType($this->getHeaderValueOf($groupsHeader)));
$user->save();
$this->user = $user;
return new Zend_Auth_Result(Zend_Auth_Result::SUCCESS, $user);
}
private function getUserType(?string $groups): string
{
if ($groups == null) {
return UTYPE_GUEST;
}
$groups = array_map(fn ($group) => trim($group), explode(',', $groups));
$superAdminGroup = Config::get('header_auth.group_map.superadmin');
if (in_array($superAdminGroup, $groups)) {
return UTYPE_SUPERADMIN;
}
$adminGroup = Config::get('header_auth.group_map.admin');
if (in_array($adminGroup, $groups)) {
return UTYPE_ADMIN;
}
$programManagerGroup = Config::get('header_auth.group_map.program_manager');
if (in_array($programManagerGroup, $groups)) {
return UTYPE_PROGRAM_MANAGER;
}
$hostGroup = Config::get('header_auth.group_map.host');
if (in_array($hostGroup, $groups)) {
return UTYPE_HOST;
}
return UTYPE_GUEST;
}
private function getFirstName(?string $name): ?string
{
if ($name == null) {
return null;
}
$result = explode(' ', $name, 2);
return $result[0];
}
private function getLastName(?string $name): ?string
{
if ($name == null) {
return null;
}
$result = explode(' ', $name, 2);
return end($result);
}
private function getHeaderValueOf(string $httpHeader): ?string
{
// Normalize the header name to match server's format
$normalizedHeader = 'HTTP_' . strtoupper(str_replace('-', '_', $httpHeader));
return $_SERVER[$normalizedHeader] ?? null;
}
// Needed for zend auth adapter
private Application_Model_User $user;
public function setIdentity($username)
{
return $this;
}
public function setCredential($password)
{
return $this;
}
/**
* return dummy object for internal auth handling.
*
* we need to build a dummpy object since the auth layer knows nothing about the db
*
* @param null $returnColumns
* @param null $omitColumns
*
* @return stdClass
*/
public function getResultRowObject($returnColumns = null, $omitColumns = null)
{
$o = new stdClass();
$o->id = $this->user->getId();
$o->username = $this->user->getLogin();
$o->password = $this->user->getPassword();
$o->real_name = implode(' ', [$this->user->getFirstName(), $this->user->getLastName()]);
$o->type = $this->user->getType();
$o->login = $this->user->getLogin();
return $o;
}
}

View File

@ -33,8 +33,17 @@ class AutoPlaylistManager
// call the addPlaylist to show function and don't check for user permission to avoid call to non-existant user object
$sid = $si->getShowId();
$playlistrepeat = new Application_Model_Show($sid);
$introplaylistid = Application_Model_Preference::GetIntroPlaylist();
$outroplaylistid = Application_Model_Preference::GetOutroPlaylist();
if ($playlistrepeat->getHasOverrideIntroPlaylist()) {
$introplaylistid = $playlistrepeat->getIntroPlaylistId();
} else {
$introplaylistid = Application_Model_Preference::GetIntroPlaylist();
}
if ($playlistrepeat->getHasOverrideOutroPlaylist()) {
$outroplaylistid = $playlistrepeat->getOutroPlaylistId();
} else {
$outroplaylistid = Application_Model_Preference::GetOutroPlaylist();
}
// we want to check and see if we need to repeat this process until the show is 100% scheduled
// so we create a while loop and break it immediately if repeat until full isn't enabled
@ -81,6 +90,11 @@ class AutoPlaylistManager
$si->addPlaylistToShow($outroplaylistid, false);
}
$si->setAutoPlaylistBuilt(true);
// now trim excessively overbooked shows so the display isn't cluttered with myriads of red off-time blocks
if (Application_Model_Preference::getScheduleTrimOverbooked()) {
$si->trimOverbooked();
}
}
Application_Model_Preference::setAutoPlaylistPollLock(microtime(true));
}

View File

@ -63,7 +63,7 @@ class ZendActionHttpException extends Exception
$statusCode,
$message,
$code = 0,
Exception $previous = null
?Exception $previous = null
) {
Logging::error('Error in action ' . $action->getRequest()->getActionName()
. " with status code {$statusCode}: {$message}");

View File

@ -98,6 +98,7 @@ class Application_Common_LocaleHelper
'mt' => _('Maltese'),
'my' => _('Burmese'),
'na' => _('Nauru'),
'nb' => _('Norwegian Bokmål'),
'ne' => _('Nepali'),
'nl' => _('Dutch'),
'no' => _('Norwegian'),

View File

@ -99,6 +99,22 @@ class Schema implements ConfigurationInterface
/**/->scalarNode('filter_field')->end()
->end()->end()
// Header Auth Schema
->arrayNode('header_auth')->children()
/**/->scalarNode('user_header')->defaultValue('Remote-User')->end()
/**/->scalarNode('groups_header')->defaultValue('Remote-Groups')->end()
/**/->scalarNode('email_header')->defaultValue('Remote-Email')->end()
/**/->scalarNode('name_header')->defaultValue('Remote-Name')->end()
/**/->scalarNode('proxy_ip')->end()
/**/->scalarNode('locale')->defaultValue('en-US')->end()
/**/->arrayNode('group_map')->children()
/* */->scalarNode('host')->end()
/* */->scalarNode('program_manager')->end()
/* */->scalarNode('admin')->end()
/* */->scalarNode('superadmin')->end()
/**/->end()->end()
->end()->end()
// Playout schema
->arrayNode('playout')
/**/->ignoreExtraKeys()

View File

@ -8,6 +8,12 @@ class IndexController extends Zend_Controller_Action
{
$CC_CONFIG = Config::getConfig();
$baseUrl = Config::getBasePath();
if (Application_Model_Preference::getRadioPageDisabled()) {
$this->_helper->redirector->gotoUrl($baseUrl . 'login');
return;
}
$this->view->headTitle(Application_Model_Preference::GetHeadTitle());
$this->view->headScript()->appendFile(Assets::url('js/libs/jquery-1.8.3.min.js'), 'text/javascript');

View File

@ -398,8 +398,35 @@ class LibraryController extends Zend_Controller_Action
$this->view->id = $file_id;
$this->view->title = $file->getPropelOrm()->getDbTrackTitle();
$this->view->artist_name = $file->getPropelOrm()->getDbArtistName();
$this->view->filePath = $file->getPropelOrm()->getDbFilepath();
$this->view->artwork = $file->getPropelOrm()->getDbArtwork();
$this->view->replay_gain = $file->getPropelOrm()->getDbReplayGain();
$this->view->cuein = $file->getPropelOrm()->getDbCuein();
$this->view->cueout = $file->getPropelOrm()->getDbCueout();
$this->view->format = $file->getPropelOrm()->getDbFormat();
$this->view->bit_rate = $file->getPropelOrm()->getDbBitRate();
$this->view->sample_rate = $file->getPropelOrm()->getDbSampleRate();
$filePath = $file->getPropelOrm()->getDbFilepath();
if ($isAdmin) {
$this->view->file_name = $filePath;
} else {
$fileParts = explode(DIRECTORY_SEPARATOR, $filePath);
$filename = end($fileParts);
$this->view->file_name = $filename;
}
// 1000 B in KB and 1000 KB in MB and 1000 MB in GB
$size = $file->getPropelOrm()->getFileSize();
if ($size < 1000) {
// Use B up to 1 KB
$this->view->file_size = $size . ' B';
} elseif ($size < (500 * 1000)) {
// Use KB up to 500 KB
$this->view->file_size = round($size / 1000, 1) . ' KB';
} elseif ($size < (1 * 1000 * 1000 * 1000)) {
// Use MB up to 1 GB
$this->view->file_size = round($size / 1000 / 1000, 1) . ' MB';
} else {
$this->view->file_size = round($size / 1000 / 1000 / 1000, 1) . ' GB';
}
$this->view->html = $this->view->render('library/edit-file-md.phtml');
}

View File

@ -44,44 +44,37 @@ class LoginController extends Zend_Controller_Action
$form = new Application_Form_Login();
$message = _('Please enter your username and password.');
$authAdapter = Application_Model_Auth::getAuthAdapter();
if ($request->isPost()) {
// Open the session for writing, because we close it for writing by default in Bootstrap.php as an optimization.
// session_start();
if ($authAdapter instanceof LibreTime_Auth_Adaptor_Header || ($request->isPost() && $form->isValid($request->getPost()))) {
// get the username and password from the form
$username = $form->getValue('username');
$password = $form->getValue('password');
$locale = $form->getValue('locale');
if ($form->isValid($request->getPost())) {
// get the username and password from the form
$username = $form->getValue('username');
$password = $form->getValue('password');
$locale = $form->getValue('locale');
// pass to the adapter the submitted username and password
$authAdapter->setIdentity($username)
->setCredential($password);
$authAdapter = Application_Model_Auth::getAuthAdapter();
$result = $auth->authenticate($authAdapter);
if ($result->isValid()) {
Zend_Session::regenerateId();
// all info about this user from the login table omit only the password
$userInfo = $authAdapter->getResultRowObject(null, 'password');
// pass to the adapter the submitted username and password
$authAdapter->setIdentity($username)
->setCredential($password);
// the default storage is a session with namespace Zend_Auth
$authStorage = $auth->getStorage();
$authStorage->write($userInfo);
$result = $auth->authenticate($authAdapter);
if ($result->isValid()) {
Zend_Session::regenerateId();
// all info about this user from the login table omit only the password
$userInfo = $authAdapter->getResultRowObject(null, 'password');
Application_Model_LoginAttempts::resetAttempts($_SERVER['REMOTE_ADDR']);
Application_Model_Subjects::resetLoginAttempts($username);
// the default storage is a session with namespace Zend_Auth
$authStorage = $auth->getStorage();
$authStorage->write($userInfo);
// set the user locale in case user changed it in when logging in
Application_Model_Preference::SetUserLocale($locale);
Application_Model_LoginAttempts::resetAttempts($_SERVER['REMOTE_ADDR']);
Application_Model_Subjects::resetLoginAttempts($username);
// set the user locale in case user changed it in when logging in
Application_Model_Preference::SetUserLocale($locale);
$this->_redirect('showbuilder');
} else {
$form = $this->loginError($username);
}
$this->_redirect('showbuilder');
} else {
$form = $this->loginError($username);
}
}
@ -108,8 +101,6 @@ class LoginController extends Zend_Controller_Action
public function passwordRestoreAction()
{
$this->view->headScript()->appendFile(Assets::url('js/airtime/login/password-restore.js'), 'text/javascript');
$request = $this->getRequest();
$stationLocale = Application_Model_Preference::GetDefaultLocale();

View File

@ -49,7 +49,9 @@ class PreferenceController extends Zend_Controller_Action
Application_Model_Preference::SetAllow3rdPartyApi($values['thirdPartyApi']);
Application_Model_Preference::SetDefaultLocale($values['locale']);
Application_Model_Preference::SetWeekStartDay($values['weekStartDay']);
Application_Model_Preference::setScheduleTrimOverbooked($values['scheduleTrimOverbooked']);
Application_Model_Preference::setRadioPageDisplayLoginButton($values['radioPageLoginButton']);
Application_Model_Preference::setRadioPageDisabled($values['radioPageDisabled']);
Application_Model_Preference::SetFeaturePreviewMode($values['featurePreviewMode']);
$logoUploadElement = $form->getSubForm('preferences_general')->getElement('stationLogo');
@ -156,6 +158,11 @@ class PreferenceController extends Zend_Controller_Action
$setting = Application_Model_StreamSetting::getStreamSetting();
$form->setSetting($setting);
if ($num_of_stream > MAX_NUM_STREAMS) {
Logging::error('Your streams count (' . $num_of_stream . ') exceed the maximum, some of them will not be displayed');
$num_of_stream = MAX_NUM_STREAMS;
}
for ($i = 1; $i <= $num_of_stream; ++$i) {
$subform = new Application_Form_StreamSettingSubForm();
$subform->setPrefix($i);
@ -190,8 +197,10 @@ class PreferenceController extends Zend_Controller_Action
if ($changeRGenabled || $changeRGmodifier) {
Application_Model_Preference::SetEnableReplayGain($values['enableReplayGain']);
Application_Model_Preference::setReplayGainModifier($values['replayGainModifier']);
$md = ['schedule' => Application_Model_Schedule::getSchedule()];
Application_Model_RabbitMq::SendMessageToPypo('update_schedule', $md);
// The side effects of this function are still required to fill the schedule, we
// don't use the returned schedule.
Application_Model_Schedule::getSchedule();
Application_Model_RabbitMq::SendMessageToPypo('update_schedule', []);
// Application_Model_RabbitMq::PushSchedule();
}

View File

@ -44,11 +44,9 @@ class TracktypeController extends Zend_Controller_Action
$formData[$v[0]] = urldecode($v[1]);
}
if ($form->validateCode($formData)) {
if ($form->isValid($formData)) {
$tracktype = new Application_Model_Tracktype($formData['tracktype_id']);
if (empty($formData['tracktype_id'])) {
$tracktype->setCode($formData['code']);
}
$tracktype->setCode($formData['code']);
$tracktype->setTypeName($formData['type_name']);
$tracktype->setDescription($formData['description']);
$tracktype->setVisibility($formData['visibility']);

View File

@ -217,6 +217,13 @@ class PageLayoutInitPlugin extends Zend_Controller_Plugin_Abstract
->appendFile(Assets::url('js/airtime/common/common.js'), 'text/javascript')
->appendFile(Assets::url('js/airtime/common/audioplaytest.js'), 'text/javascript');
// include wavesurfer.js for waveform display
$view->headScript()->appendFile(Assets::url('js/wavesurfer/wavesurfer.min.js'), 'text/javascript')
->appendFile(Assets::url('js/wavesurfer/timeline.min.js'), 'text/javascript')
->appendFile(Assets::url('js/wavesurfer/regions.min.js'), 'text/javascript')
->appendFile(Assets::url('js/wavesurfer/cursor.min.js'), 'text/javascript')
->appendFile(Assets::url('js/wavesurfer/libretime.js'), 'text/javascript');
$user = Application_Model_User::getCurrentUser();
if (!is_null($user)) {
$userType = $user->getType();

View File

@ -5,8 +5,10 @@ class RabbitMqPlugin extends Zend_Controller_Plugin_Abstract
public function dispatchLoopShutdown()
{
if (Application_Model_RabbitMq::$doPush) {
$md = ['schedule' => Application_Model_Schedule::getSchedule()];
Application_Model_RabbitMq::SendMessageToPypo('update_schedule', $md);
// The side effects of this function are still required to fill the schedule, we
// don't use the returned schedule.
Application_Model_Schedule::getSchedule();
Application_Model_RabbitMq::SendMessageToPypo('update_schedule', []);
}
if (memory_get_peak_usage() > 30 * 2 ** 20) {

View File

@ -13,6 +13,8 @@ class Application_Form_AddShowAutoPlaylist extends Zend_Form_SubForm
// and store to assoc array
$maxLens = Application_Model_Show::getMaxLengths();
$playlistNames = Application_Model_Library::getPlaylistNames(true);
// Add autoplaylist checkbox element
$this->addElement('checkbox', 'add_show_has_autoplaylist', [
'label' => _('Add Autoloading Playlist ?'),
@ -23,10 +25,11 @@ class Application_Form_AddShowAutoPlaylist extends Zend_Form_SubForm
$autoPlaylistSelect = new Zend_Form_Element_Select('add_show_autoplaylist_id');
$autoPlaylistSelect->setLabel(_('Select Playlist'));
$autoPlaylistSelect->setMultiOptions(Application_Model_Library::getPlaylistNames(true));
$autoPlaylistSelect->setMultiOptions($playlistNames);
$autoPlaylistSelect->setValue(null);
$autoPlaylistSelect->setDecorators(['ViewHelper']);
$this->addElement($autoPlaylistSelect);
// Add autoplaylist checkbox element
$this->addElement('checkbox', 'add_show_autoplaylist_repeat', [
'label' => _('Repeat Playlist Until Show is Full ?'),
@ -34,6 +37,23 @@ class Application_Form_AddShowAutoPlaylist extends Zend_Form_SubForm
'class' => 'input_text',
'decorators' => ['ViewHelper'],
]);
// Append 'Default' to 'None' option
$playlistNames[null] = _('None') . '/' . _('Default');
$introPlaylistSelect = new Zend_Form_Element_Select('add_show_intro_playlist_id');
$introPlaylistSelect->setLabel(_('Select Intro Playlist'));
$introPlaylistSelect->setMultiOptions($playlistNames);
$introPlaylistSelect->setValue(null);
$introPlaylistSelect->setDecorators(['ViewHelper']);
$this->addElement($introPlaylistSelect);
$outroPlaylistSelect = new Zend_Form_Element_Select('add_show_outro_playlist_id');
$outroPlaylistSelect->setLabel(_('Select Outro Playlist'));
$outroPlaylistSelect->setMultiOptions($playlistNames);
$outroPlaylistSelect->setValue(null);
$outroPlaylistSelect->setDecorators(['ViewHelper']);
$this->addElement($outroPlaylistSelect);
}
public function disable()

View File

@ -28,6 +28,17 @@ class Application_Form_AddTracktype extends Zend_Form
$code->setAttrib('style', 'width: 40%');
$code->setRequired(true);
$code->addValidator($notEmptyValidator);
$uniqueTrackTypeCodeValidator = new Zend_Validate_Callback(function ($value, $context) {
if (strlen($context['tracktype_id']) === 0) { // Only check uniqueness on create
return CcTracktypesQuery::create()->filterByDbCode($value)->count() === 0;
}
return true;
});
$uniqueTrackTypeCodeValidator->setMessage(_('Code is not unique.'));
$code->addValidator($uniqueTrackTypeCodeValidator);
$code->addFilter('StringTrim');
$this->addElement($code);
@ -64,19 +75,4 @@ class Application_Form_AddTracktype extends Zend_Form
$saveBtn->setLabel(_('Save'));
$this->addElement($saveBtn);
}
public function validateCode($data)
{
if (strlen($data['tracktype_id']) == 0) {
$count = CcTracktypesQuery::create()->filterByDbCode($data['code'])->count();
if ($count != 0) {
$this->getElement('code')->setErrors([_('Code is not unique.')]);
return false;
}
}
return true;
}
}

View File

@ -8,9 +8,11 @@ class Application_Form_EditAudioMD extends Zend_Form
{
// Set the method for the display form to POST
$this->setMethod('post');
$this->setAttrib('id', 'track_edit_' . $p_id);
$file_id = new Zend_Form_Element_Hidden('file_id');
$file_id->setValue($p_id);
$file_id->setDecorators(['ViewHelper']);
$file_id->addDecorator('HtmlTag', ['tag' => 'div', 'style' => 'display:none']);
$file_id->removeDecorator('Label');
$file_id->setAttrib('class', 'obj_id');
@ -23,25 +25,25 @@ class Application_Form_EditAudioMD extends Zend_Form
->setValidators([
new Zend_Validate_StringLength(['max' => 2048]),
]);
$file_id->addDecorator('HtmlTag', ['tag' => 'div', 'style' => 'display:none']);
$file_id->removeDecorator('Label');
$file_id->setAttrib('class', 'artwork');
$artwork->addDecorator('HtmlTag', ['tag' => 'div', 'style' => 'display:none']);
$artwork->removeDecorator('Label');
$artwork->setAttrib('class', 'artwork');
$this->addElement($artwork);
// Set artwork hidden field
$set_artwork = new Zend_Form_Element_Hidden('set_artwork');
$set_artwork->class = 'input_text set_artwork_' . $p_id;
$file_id->addDecorator('HtmlTag', ['tag' => 'div', 'style' => 'display:none']);
$file_id->removeDecorator('Label');
$file_id->setAttrib('class', 'set_artwork');
$set_artwork->addDecorator('HtmlTag', ['tag' => 'div', 'style' => 'display:none']);
$set_artwork->removeDecorator('Label');
$set_artwork->setAttrib('class', 'set_artwork');
$this->addElement($set_artwork);
// Remove artwork hidden field
$remove_artwork = new Zend_Form_Element_Hidden('remove_artwork');
$remove_artwork->class = 'input_text remove_artwork_' . $p_id;
$file_id->addDecorator('HtmlTag', ['tag' => 'div', 'style' => 'display:none']);
$file_id->removeDecorator('Label');
$file_id->setAttrib('class', 'remove_artwork');
$remove_artwork->addDecorator('HtmlTag', ['tag' => 'div', 'style' => 'display:none']);
$remove_artwork->removeDecorator('Label');
$remove_artwork->setAttrib('class', 'remove_artwork');
$this->addElement($remove_artwork);
// Add title field
@ -242,7 +244,7 @@ class Application_Form_EditAudioMD extends Zend_Form
$validCuePattern = '/^(?:[0-9]{1,2}:)?(?:[0-9]{1,2}:)?[0-9]{1,6}(\.\d{1,6})?$/';
$cueIn = new Zend_Form_Element_Text('cuein');
$cueIn->class = 'input_text';
$cueIn->class = 'input_text cuein_' . $p_id;
$cueIn->setLabel('Cue In:');
$cueInValidator = Application_Form_Helper_ValidationTypes::overrideRegexValidator(
$validCuePattern,
@ -252,7 +254,7 @@ class Application_Form_EditAudioMD extends Zend_Form
$this->addElement($cueIn);
$cueOut = new Zend_Form_Element_Text('cueout');
$cueOut->class = 'input_text';
$cueOut->class = 'input_text cueout_' . $p_id;
$cueOut->setLabel('Cue Out:');
$cueOutValidator = Application_Form_Helper_ValidationTypes::overrideRegexValidator(
$validCuePattern,

View File

@ -105,16 +105,18 @@ class Application_Form_GeneralPreferences extends Zend_Form_SubForm
$tracktypeDefault->setValue(Application_Model_Preference::GetTrackTypeDefault());
$this->addElement($tracktypeDefault);
$playlistNames = Application_Model_Library::getPlaylistNames(true);
// add intro playlist select here
$introPlaylistSelect = new Zend_Form_Element_Select('introPlaylistSelect');
$introPlaylistSelect->setLabel(_('Intro Autoloading Playlist'));
$introPlaylistSelect->setMultiOptions(Application_Model_Library::getPlaylistNames(true));
$introPlaylistSelect->setMultiOptions($playlistNames);
$introPlaylistSelect->setValue(Application_Model_Preference::GetIntroPlaylist());
$this->addElement($introPlaylistSelect);
$outroPlaylistSelect = new Zend_Form_Element_Select('outroPlaylistSelect');
$outroPlaylistSelect->setLabel(_('Outro Autoloading Playlist'));
$outroPlaylistSelect->setMultiOptions(Application_Model_Library::getPlaylistNames(true));
$outroPlaylistSelect->setMultiOptions($playlistNames);
$outroPlaylistSelect->setValue(Application_Model_Preference::GetOutroPlaylist());
$this->addElement($outroPlaylistSelect);
@ -150,6 +152,18 @@ class Application_Form_GeneralPreferences extends Zend_Form_SubForm
]);
$this->addElement($podcast_auto_smartblock);
$scheduleTrimOverbooked = new Zend_Form_Element_Checkbox('scheduleTrimOverbooked');
$scheduleTrimOverbooked->setDecorators([
'ViewHelper',
'Errors',
'Label',
]);
$displayScheduleTrimOverbookedValue = Application_Model_Preference::getScheduleTrimOverbooked();
$scheduleTrimOverbooked->addDecorator('Label');
$scheduleTrimOverbooked->setLabel(_('Trim overbooked shows after autoloading?'));
$scheduleTrimOverbooked->setValue($displayScheduleTrimOverbookedValue);
$this->addElement($scheduleTrimOverbooked);
// TODO add and insert Podcast Smartblock and Playlist autogenerate options
$third_party_api = new Zend_Form_Element_Radio('thirdPartyApi');
@ -202,11 +216,24 @@ class Application_Form_GeneralPreferences extends Zend_Form_SubForm
if ($displayRadioPageLoginButtonValue == '') {
$displayRadioPageLoginButtonValue = true;
}
$radioPageLoginButton->addDecorator('Label', ['class' => 'enable-tunein']);
$radioPageLoginButton->addDecorator('Label');
$radioPageLoginButton->setLabel(_('Display login button on your Radio Page?'));
$radioPageLoginButton->setValue($displayRadioPageLoginButtonValue);
$this->addElement($radioPageLoginButton);
// add a checkbox for completely disabling the radio page
$radioPageDisabled = new Zend_Form_Element_Checkbox('radioPageDisabled');
$radioPageDisabled->setDecorators([
'ViewHelper',
'Errors',
'Label',
]);
$radioPageDisabledValue = Application_Model_Preference::getRadioPageDisabled();
$radioPageDisabled->addDecorator('Label');
$radioPageDisabled->setLabel(_('Disable the public radio page and redirect to the login page?'));
$radioPageDisabled->setValue($radioPageDisabledValue);
$this->addElement($radioPageDisabled);
$feature_preview_mode = new Zend_Form_Element_Radio('featurePreviewMode');
$feature_preview_mode->setLabel(_('Feature Previews'));
$feature_preview_mode->setMultiOptions([

View File

@ -2,149 +2,11 @@
class Application_Form_SmartBlockCriteria extends Zend_Form_SubForm
{
private $criteriaOptions;
private $stringCriteriaOptions;
private $numericCriteriaOptions;
private $dateTimeCriteriaOptions;
private $timePeriodCriteriaOptions;
private $sortOptions;
private $limitOptions;
private $isOrNotCriteriaOptions;
private $trackTypeOptions;
/* We need to know if the criteria value will be a string
* or numeric value in order to populate the modifier
* select list
*/
private $criteriaTypes = [
0 => '',
'album_title' => 's',
'bit_rate' => 'n',
'bpm' => 'n',
'composer' => 's',
'conductor' => 's',
'copyright' => 's',
'cuein' => 'n',
'cueout' => 'n',
'description' => 's',
'artist_name' => 's',
'encoded_by' => 's',
'utime' => 'd',
'mtime' => 'd',
'lptime' => 'd',
'genre' => 's',
'isrc_number' => 's',
'label' => 's',
'language' => 's',
'length' => 'n',
'mime' => 's',
'mood' => 's',
'owner_id' => 's',
'replay_gain' => 'n',
'sample_rate' => 'n',
'track_title' => 's',
'track_number' => 'n',
'info_url' => 's',
'year' => 'n',
'track_type_id' => 'tt',
];
private function getCriteriaOptions($option = null)
{
if (!isset($this->criteriaOptions)) {
$this->criteriaOptions = [
0 => _('Select criteria'),
'album_title' => _('Album'),
'bit_rate' => _('Bit Rate (Kbps)'),
'bpm' => _('BPM'),
'composer' => _('Composer'),
'conductor' => _('Conductor'),
'copyright' => _('Copyright'),
'cuein' => _('Cue In'),
'cueout' => _('Cue Out'),
'description' => _('Description'),
'artist_name' => _('Creator'),
'encoded_by' => _('Encoded By'),
'genre' => _('Genre'),
'isrc_number' => _('ISRC'),
'label' => _('Label'),
'language' => _('Language'),
'mtime' => _('Last Modified'),
'lptime' => _('Last Played'),
'length' => _('Length'),
'track_type_id' => _('Track Type'),
'mime' => _('Mime'),
'mood' => _('Mood'),
'owner_id' => _('Owner'),
'replay_gain' => _('Replay Gain'),
'sample_rate' => _('Sample Rate (kHz)'),
'track_title' => _('Title'),
'track_number' => _('Track Number'),
'utime' => _('Uploaded'),
'info_url' => _('Website'),
'year' => _('Year'),
];
}
if (is_null($option)) {
return $this->criteriaOptions;
}
return $this->criteriaOptions[$option];
}
private function getStringCriteriaOptions()
{
if (!isset($this->stringCriteriaOptions)) {
$this->stringCriteriaOptions = [
'0' => _('Select modifier'),
'contains' => _('contains'),
'does not contain' => _('does not contain'),
'is' => _('is'),
'is not' => _('is not'),
'starts with' => _('starts with'),
'ends with' => _('ends with'),
];
}
return $this->stringCriteriaOptions;
}
private function getNumericCriteriaOptions()
{
if (!isset($this->numericCriteriaOptions)) {
$this->numericCriteriaOptions = [
'0' => _('Select modifier'),
'is' => _('is'),
'is not' => _('is not'),
'is greater than' => _('is greater than'),
'is less than' => _('is less than'),
'is in the range' => _('is in the range'),
];
}
return $this->numericCriteriaOptions;
}
private function getDateTimeCriteriaOptions()
{
if (!isset($this->dateTimeCriteriaOptions)) {
$this->dateTimeCriteriaOptions = [
'0' => _('Select modifier'),
'before' => _('before'),
'after' => _('after'),
'between' => _('between'),
'is' => _('is'),
'is not' => _('is not'),
'is greater than' => _('is greater than'),
'is less than' => _('is less than'),
'is in the range' => _('is in the range'),
];
}
return $this->dateTimeCriteriaOptions;
}
private function getTimePeriodCriteriaOptions()
{
if (!isset($this->timePeriodCriteriaOptions)) {
@ -191,19 +53,6 @@ class Application_Form_SmartBlockCriteria extends Zend_Form_SubForm
return $this->sortOptions;
}
private function getIsNotOptions()
{
if (!isset($this->isOrNotCriteriaOptions)) {
$this->isOrNotCriteriaOptions = [
'0' => _('Select modifier'),
'is' => _('is'),
'is not' => _('is not'),
];
}
return $this->isOrNotCriteriaOptions;
}
private function getTracktypeOptions()
{
if (!isset($this->trackTypeOptions)) {
@ -297,7 +146,7 @@ class Application_Form_SmartBlockCriteria extends Zend_Form_SubForm
}
// the way the everything is currently built it setups 25 smartblock criteria forms and then disables them
// but this creates 29 elements
$numElements = count($this->getCriteriaOptions());
$numElements = count(BlockCriteria::displayCriteria());
// loop through once for each potential criteria option ie album, composer, track
// criteria from different groups are separated already by the getCriteriaGrouped call
@ -335,7 +184,7 @@ class Application_Form_SmartBlockCriteria extends Zend_Form_SubForm
$criteria->setAttrib('class', 'input_select sp_input_select' . $invisible)
->setValue('Select criteria')
->setDecorators(['viewHelper'])
->setMultiOptions($this->getCriteriaOptions());
->setMultiOptions(BlockCriteria::displayCriteria());
// if this isn't the first criteria and there isn't an entry for it already disable it
if ($i != 0 && !isset($criteriaKeys[$i])) {
$criteria->setAttrib('disabled', 'disabled');
@ -344,8 +193,9 @@ class Application_Form_SmartBlockCriteria extends Zend_Form_SubForm
// the j loop starts at 0 and grows for each item matching the same criteria
// look up the criteria type using the criteriaTypes function from above based upon the criteria value
if (isset($criteriaKeys[$i])) {
$criteriaType = $this->criteriaTypes[$storedCrit['crit'][$criteriaKeys[$i]][$j]['criteria']];
$criteria->setValue($storedCrit['crit'][$criteriaKeys[$i]][$j]['criteria']);
$bCriteria = BlockCriteria::get($storedCrit['crit'][$criteriaKeys[$i]][$j]['criteria']);
$criteriaType = $bCriteria->type;
$criteria->setValue($bCriteria->key);
}
$this->addElement($criteria);
@ -361,18 +211,10 @@ class Application_Form_SmartBlockCriteria extends Zend_Form_SubForm
}
// determine the modifier based upon criteria type which is looked up based upon an array
if (isset($criteriaKeys[$i])) {
if ($criteriaType == 's') {
$criteriaModifers->setMultiOptions($this->getStringCriteriaOptions());
} elseif ($criteriaType == 'd') {
$criteriaModifers->setMultiOptions($this->getDateTimeCriteriaOptions());
} elseif ($criteriaType == 'tt') {
$criteriaModifers->setMultiOptions($this->getIsNotOptions());
} else {
$criteriaModifers->setMultiOptions($this->getNumericCriteriaOptions());
}
$criteriaModifers->setMultiOptions($bCriteria->displayModifiers());
$criteriaModifers->setValue($storedCrit['crit'][$criteriaKeys[$i]][$j]['modifier']);
} else {
$criteriaModifers->setMultiOptions(['0' => _('Select modifier')]);
$criteriaModifers->setMultiOptions(CriteriaModifier::mapToDisplay([]));
}
$this->addElement($criteriaModifers);
@ -381,7 +223,7 @@ class Application_Form_SmartBlockCriteria extends Zend_Form_SubForm
if (isset($criteriaKeys[$i])) {
$modifierTest = (string) $storedCrit['crit'][$criteriaKeys[$i]][$j]['modifier'];
if (
isset($criteriaType) && $criteriaType == 'tt'
isset($criteriaType) && $criteriaType == ModifierType::TRACK_TYPE
&& preg_match('/is|is not/', $modifierTest) == 1
) {
$criteriaValue = new Zend_Form_Element_Select('sp_criteria_value_' . $i . '_' . $j);
@ -412,14 +254,14 @@ class Application_Form_SmartBlockCriteria extends Zend_Form_SubForm
$relativeDateTime = false;
$modifierTest = (string) $storedCrit['crit'][$criteriaKeys[$i]][$j]['modifier'];
if (
isset($criteriaType) && $criteriaType == 'd'
isset($criteriaType) && $criteriaType == ModifierType::DATE
&& preg_match('/before|after|between/', $modifierTest) == 1
) {
// set relativeDatetime boolean to true so that the datetime select is displayed below
$relativeDateTime = true;
$criteriaValue->setValue(filter_var($storedCrit['crit'][$criteriaKeys[$i]][$j]['value'], FILTER_SANITIZE_NUMBER_INT));
} elseif (
isset($criteriaType) && $criteriaType == 'tt'
isset($criteriaType) && $criteriaType == ModifierType::TRACK_TYPE
&& preg_match('/is|is not/', $modifierTest) == 1
) {
// set relativeDatetime boolean to true so that the datetime select is displayed below
@ -455,7 +297,7 @@ class Application_Form_SmartBlockCriteria extends Zend_Form_SubForm
// check if the value is stored and it is a relative datetime field
if (
isset($criteriaKeys[$i], $storedCrit['crit'][$criteriaKeys[$i]][$j]['value'], $criteriaType)
&& $criteriaType == 'd'
&& $criteriaType == ModifierType::DATE
&& preg_match('/before|after|between/', $modifierTest) == 1
) {
// need to remove any leading numbers stored in the database
@ -478,7 +320,7 @@ class Application_Form_SmartBlockCriteria extends Zend_Form_SubForm
->setDecorators(['viewHelper']);
if (isset($criteriaKeys[$i], $storedCrit['crit'][$criteriaKeys[$i]][$j]['extra'])) {
// need to check if this is a relative date time value
if (isset($criteriaType) && $criteriaType == 'd' && $modifierTest == 'between') {
if (isset($criteriaType) && $criteriaType == ModifierType::DATE && $modifierTest == 'between') {
// the criteria value will be a number followed by time unit and ago so set input to number part
$criteriaExtra->setValue(filter_var($storedCrit['crit'][$criteriaKeys[$i]][$j]['extra'], FILTER_SANITIZE_NUMBER_INT));
} else {
@ -610,28 +452,21 @@ class Application_Form_SmartBlockCriteria extends Zend_Form_SubForm
foreach ($data['criteria'] as $critKey => $d) {
$count = 1;
foreach ($d as $modKey => $modInfo) {
$critMod = $critKey . '_' . $modKey;
$blockCriteria = BlockCriteria::get($modInfo['sp_criteria_field']);
if ($modKey == 0) {
$eleCrit = $this->getElement('sp_criteria_field_' . $critKey . '_' . $modKey);
$eleCrit->setValue($this->getCriteriaOptions($modInfo['sp_criteria_field']));
$eleCrit = $this->getElement('sp_criteria_field_' . $critMod);
$eleCrit->setValue($blockCriteria->display);
$eleCrit->setAttrib('disabled', null);
$eleMod = $this->getElement('sp_criteria_modifier_' . $critKey . '_' . $modKey);
$criteriaType = $this->criteriaTypes[$modInfo['sp_criteria_field']];
if ($criteriaType == 's') {
$eleMod->setMultiOptions($this->getStringCriteriaOptions());
} elseif ($criteriaType == 'n') {
$eleMod->setMultiOptions($this->getNumericCriteriaOptions());
} elseif ($criteriaType == 'd') {
$eleMod->setMultiOptions($this->getDateTimeCriteriaOptions());
} elseif ($criteriaType == 'tt') {
$eleMod->setMultiOptions($this->getIsNotOptions());
} else {
$eleMod->setMultiOptions(['0' => _('Select modifier')]);
}
$eleMod = $this->getElement('sp_criteria_modifier_' . $critMod);
$eleMod->setMultiOptions($blockCriteria->displayModifiers());
$eleMod->setValue($modInfo['sp_criteria_modifier']);
$eleMod->setAttrib('disabled', null);
$eleDatetime = $this->getElement('sp_criteria_datetime_select_' . $critKey . '_' . $modKey);
$eleDatetime = $this->getElement('sp_criteria_datetime_select_' . $critMod);
if ($this->enableDateTimeUnit($eleMod->getValue())) {
$eleDatetime->setAttrib('enabled', 'enabled');
$eleDatetime->setValue($modInfo['sp_criteria_datetime_select']);
@ -639,17 +474,17 @@ class Application_Form_SmartBlockCriteria extends Zend_Form_SubForm
} else {
$eleDatetime->setAttrib('disabled', 'disabled');
}
$eleValue = $this->getElement('sp_criteria_value_' . $critKey . '_' . $modKey);
$eleValue = $this->getElement('sp_criteria_value_' . $critMod);
$eleValue->setValue($modInfo['sp_criteria_value']);
$eleValue->setAttrib('disabled', null);
if (isset($modInfo['sp_criteria_extra'])) {
$eleExtra = $this->getElement('sp_criteria_extra_' . $critKey . '_' . $modKey);
$eleExtra = $this->getElement('sp_criteria_extra_' . $critMod);
$eleExtra->setValue($modInfo['sp_criteria_extra']);
$eleValue->setAttrib('class', 'input_text sp_extra_input_text');
$eleExtra->setAttrib('disabled', null);
}
$eleExtraDatetime = $this->getElement('sp_criteria_extra_datetime_select_' . $critKey . '_' . $modKey);
$eleExtraDatetime = $this->getElement('sp_criteria_extra_datetime_select_' . $critMod);
if ($eleMod->getValue() == 'between') {
$eleExtraDatetime->setAttrib('enabled', 'enabled');
$eleExtraDatetime->setValue($modInfo['sp_criteria_extra_datetime_select']);
@ -658,45 +493,34 @@ class Application_Form_SmartBlockCriteria extends Zend_Form_SubForm
$eleExtraDatetime->setAttrib('disabled', 'disabled');
}
} else {
$criteria = new Zend_Form_Element_Select('sp_criteria_field_' . $critKey . '_' . $modKey);
$criteria = new Zend_Form_Element_Select('sp_criteria_field_' . $critMod);
$criteria->setAttrib('class', 'input_select sp_input_select sp-invisible')
->setValue('Select criteria')
->setDecorators(['viewHelper'])
->setMultiOptions($this->getCriteriaOptions());
->setMultiOptions(BlockCriteria::displayCriteria());
$criteriaType = $this->criteriaTypes[$modInfo['sp_criteria_field']];
$criteria->setValue($this->getCriteriaOptions($modInfo['sp_criteria_field']));
$criteria->setValue($blockCriteria->display);
$this->addElement($criteria);
// MODIFIER
$criteriaModifers = new Zend_Form_Element_Select('sp_criteria_modifier_' . $critKey . '_' . $modKey);
$criteriaModifers = new Zend_Form_Element_Select('sp_criteria_modifier_' . $critMod);
$criteriaModifers->setValue('Select modifier')
->setAttrib('class', 'input_select sp_input_select')
->setDecorators(['viewHelper']);
if ($criteriaType == 's') {
$criteriaModifers->setMultiOptions($this->getStringCriteriaOptions());
} elseif ($criteriaType == 'n') {
$criteriaModifers->setMultiOptions($this->getNumericCriteriaOptions());
} elseif ($criteriaType == 'd') {
$criteriaModifers->setMultiOptions($this->getDateTimeCriteriaOptions());
} elseif ($criteriaType == 'tt') {
$criteriaModifers->setMultiOptions($this->getIsNotOptions());
} else {
$criteriaModifers->setMultiOptions(['0' => _('Select modifier')]);
}
$criteriaModifers->setMultiOptions($blockCriteria->displayModifiers());
$criteriaModifers->setValue($modInfo['sp_criteria_modifier']);
$this->addElement($criteriaModifers);
// VALUE
$criteriaValue = new Zend_Form_Element_Text('sp_criteria_value_' . $critKey . '_' . $modKey);
$criteriaValue = new Zend_Form_Element_Text('sp_criteria_value_' . $critMod);
$criteriaValue->setAttrib('class', 'input_text sp_input_text')
->setDecorators(['viewHelper']);
$criteriaValue->setValue($modInfo['sp_criteria_value']);
$this->addElement($criteriaValue);
// DATETIME UNIT SELECT
$criteriaDatetimeSelect = new Zend_Form_Element_Select('sp_criteria_datetime_select_' . $critKey . '_' . $modKey);
$criteriaDatetimeSelect = new Zend_Form_Element_Select('sp_criteria_datetime_select_' . $critMod);
$criteriaDatetimeSelect->setAttrib('class', 'input_select sp_input_select')
->setDecorators(['viewHelper']);
if ($this->enableDateTimeUnit($criteriaValue->getValue())) {
@ -708,7 +532,7 @@ class Application_Form_SmartBlockCriteria extends Zend_Form_SubForm
$criteriaDatetimeSelect->setAttrib('disabled', 'disabled');
}
// EXTRA
$criteriaExtra = new Zend_Form_Element_Text('sp_criteria_extra_' . $critKey . '_' . $modKey);
$criteriaExtra = new Zend_Form_Element_Text('sp_criteria_extra_' . $critMod);
$criteriaExtra->setAttrib('class', 'input_text sp_extra_input_text')
->setDecorators(['viewHelper']);
if (isset($modInfo['sp_criteria_extra'])) {
@ -721,7 +545,7 @@ class Application_Form_SmartBlockCriteria extends Zend_Form_SubForm
// EXTRA DATETIME UNIT SELECT
$criteriaExtraDatetimeSelect = new Zend_Form_Element_Select('sp_criteria_extra_datetime_select_' . $critKey . '_' . $modKey);
$criteriaExtraDatetimeSelect = new Zend_Form_Element_Select('sp_criteria_extra_datetime_select_' . $critMod);
$criteriaExtraDatetimeSelect->setAttrib('class', 'input_select sp_input_select')
->setDecorators(['viewHelper']);
if ($criteriaValue->getValue() == 'between') {
@ -761,45 +585,13 @@ class Application_Form_SmartBlockCriteria extends Zend_Form_SubForm
{
$isValid = true;
$data = $this->preValidation($params);
$criteria2PeerMap = [
0 => 'Select criteria',
'album_title' => 'DbAlbumTitle',
'artist_name' => 'DbArtistName',
'bit_rate' => 'DbBitRate',
'bpm' => 'DbBpm',
'composer' => 'DbComposer',
'conductor' => 'DbConductor',
'copyright' => 'DbCopyright',
'cuein' => 'DbCuein',
'cueout' => 'DbCueout',
'description' => 'DbDescription',
'encoded_by' => 'DbEncodedBy',
'utime' => 'DbUtime',
'mtime' => 'DbMtime',
'lptime' => 'DbLPtime',
'genre' => 'DbGenre',
'info_url' => 'DbInfoUrl',
'isrc_number' => 'DbIsrcNumber',
'label' => 'DbLabel',
'language' => 'DbLanguage',
'length' => 'DbLength',
'mime' => 'DbMime',
'mood' => 'DbMood',
'owner_id' => 'DbOwnerId',
'replay_gain' => 'DbReplayGain',
'sample_rate' => 'DbSampleRate',
'track_title' => 'DbTrackTitle',
'track_number' => 'DbTrackNumber',
'year' => 'DbYear',
'track_type_id' => 'DbTrackTypeId',
];
$allCriteria = BlockCriteria::criteriaMap();
// things we need to check
// 1. limit value shouldn't be empty and has upperbound of 24 hrs
// 2. sp_criteria or sp_criteria_modifier shouldn't be 0
// 3. validate formate according to DB column type
$multiplier = 1;
$result = 0;
// validation start
if ($data['etc']['sp_limit_options'] == 'hours') {
@ -840,7 +632,7 @@ class Application_Form_SmartBlockCriteria extends Zend_Form_SubForm
$element->addError(_('You must select Criteria and Modifier'));
$isValid = false;
} else {
$column = CcFilesPeer::getTableMap()->getColumnByPhpName($criteria2PeerMap[$d['sp_criteria_field']]);
$column = CcFilesPeer::getTableMap()->getColumnByPhpName($allCriteria[$d['sp_criteria_field']]->peer);
// validation on type of column
if (in_array($d['sp_criteria_field'], ['length', 'cuein', 'cueout'])) {
if (!preg_match('/^(\d{2}):(\d{2}):(\d{2})/', $d['sp_criteria_value'])) {

View File

@ -17,7 +17,7 @@ class Airtime_Zend_Log extends Zend_Log
*/
protected $_origErrorHandler;
public function __construct(Zend_Log_Writer_Abstract $writer = null)
public function __construct(?Zend_Log_Writer_Abstract $writer = null)
{
parent::__construct($writer);
}

Some files were not shown because too many files have changed in this diff Show More