Skip to main content
Version: Stable 3.x

LibreTime 3.1.0

This version was released the 2023-05-26.


Please report new issues and/or feature requests in the issue tracker.

For general discussion or if you need help, you can join the discourse forum or chat on

The full tarball for the 3.1.0 release of LibreTime is available here.

💖 Contributors

The LibreTime project wants to thank the following contributors for authoring PRs to this release:

  • @ihorhordiichuk
  • @jooola
  • @paddatrapper
  • @togir2

🚀 Features

  • drop Ubuntu Bionic support
  • drop Python 3.6 support
  • drop Debian Buster support
  • drop Liquidsoap 1.1 support
  • drop Liquidsoap 1.3 support
  • drop Python 3.7 support
  • drop cc_stream_setting table
  • delete cc_pref stream preferences rows
  • legacy: remove db allowed_cors_origins preference (#2095)
  • configure cue points analysis per track type
  • playout: use jinja2 env for template loading
  • playout: add jinja2 quote filter for liquidsoap
  • playout: use liquidsoap interactive variables
  • playout: remove unused liquidsoap outputs connection status
  • playout: remove unused liquidsoap restart function
  • playout: remove unused liquidsoap output namespace
  • replace loguru with logging
  • playout: use jinja to configure liquidsoap outputs
  • playout: enable vorbis metadata per icecast output
  • playout: use shared app for cli commands
  • installer: configure timezone using timedatectl (#2418)
  • playout: don't serialize message twice
  • add python packages version
  • add sentry sdk
  • use secret_key config field instead of api_key (#2444)
  • api-client: remove unused api v1 calls
  • api-client: rewrite api-client v1 using abstract client
  • playout: move liquidsoap auth to notify cli
  • playout: replace schedule event dicts with objects
  • api: add cors headers middleware (#2479)
  • playout: replace thread timeout with socket timeout
  • remove dev files from tarball
  • include tarball checksums in releases
  • set icecast mount default charset to UTF-8
  • playout: allow harbor ssl configuration
  • api: install gunicorn/uvicorn from pip
  • install inside a python3 venv

🐛 Bug fixes

  • deps: update dependency adbario/php-dot-notation to v3 (#2226)
  • deps: update dependency league/uri to v6.7.2
  • legacy: set platform requirements to php ^7.4
  • playout: remove outdated liquidsoap code
  • playout: add types
  • api: allow single digit version for legacy schema
  • deps: update dependency friendsofphp/php-cs-fixer to <3.12.1
  • remove systemd ProtectHome feature (#2243)
  • deps: update dependency friendsofphp/php-cs-fixer to <3.13.1 (#2249)
  • worker: replace deprecated cgi.parse_header
  • installer: install missing sudo
  • installer: set home and login when running as postgres
  • legacy: add log entry on task run (#2316)
  • legacy: log errors on connect check failure (#2317)
  • deps: update dependency friendsofphp/php-cs-fixer to <3.13.2
  • deps: update dependency friendsofphp/php-cs-fixer to <3.13.3
  • legacy: advanced search by track type id
  • legacy: move forked deps to the libretime namespace
  • deps: update dependency friendsofphp/php-cs-fixer to <3.14.4
  • deps: update dependency friendsofphp/php-cs-fixer to <3.14.5
  • legacy: ensure options is a dict during json encoding
  • legacy: don't use dict assignment on object (#2384)
  • playout: quote escape strings in liquidsoap entrypoint
  • legacy: don't delete audio file when removing artwork (#2395)
  • playout: use explicit ids for liquidsoap components
  • playout: skip the identified queue instead of the current
  • playout: use the same number of schedule queues
  • legacy: on air light fails when no shows are scheduled
  • playout: flush liquidsoap response before sending new
  • playout: use package loader for liquidsoap templates
  • playout: %else isn't defined
  • playout: when shows ends, next shows starts without fade-in/fade-out (#2412)
  • playout: legacy pushes non validated data
  • playout: explicit ogg vorbis icecast encoder
  • playout: prevent unbound variables
  • playout: use int for liquidsoap queues map
  • shared: return type confusion
  • deps: update dependency friendsofphp/php-cs-fixer to <3.15.2
  • api: explicit FileImportStatusEnum in schema
  • pin postgresql version in docker-compose
  • pin rabbitmq version in docker-compose
  • allow overriding docker-compose predefined environment
  • move docker specific setup to dockerfile
  • api: cast string value to int enum (#2461)
  • playout: quote incompatible <py3.9 type hints
  • installer: bump setuptools to ~=67.3 (#2387)
  • playout: use new api-client v1
  • playout: catch oserror in liquidsoap client
  • deps: update dependency friendsofphp/php-cs-fixer to <3.16.1 (main) (#2490)
  • api: require django >=4.2.0,<4.3
  • api: upgrade psycopg to v3.1
  • playout: remove unused ecasound package (#2496)
  • installer: ignore whitespace during diff
  • legacy: don't print track_type id in show builder table (#2510)
  • legacy: remove composer superuser warning (#2515)
  • legacy: keep datatable settings between views (#2519)
  • api: upgrade django code (pre-commit)
  • analyzer: remove unused python3 package
  • deps: update dependency friendsofphp/php-cs-fixer to <3.17.1 (main) (#2556)

⬆️ Upgrading

New general.secret_key configuration

This release adds the general.secret_key configuration field in the configuration file, to prevent reusing the general.api_key for cryptographic usage. If the field is missing, it will fallback to the previous behavior, use the general.api_key and print a warning.

To silence the warning about the missing field, make sure to add the general.secret_key field to your configuration file. The field will be required on the next major release.

Icecast mount default charset

During the first installation, the installer will configure Icecast to use UTF-8 as default charset for mounts. To upgrade an existing installation, you may want to manually apply the changes in the /etc/icecast2/icecast.xml:

    <mount type="default">

Or if only want to set the charset to UTF-8 for specific mounts (for example /main.mp3):

    <mount type="normal">

Please, see the documentation for more details.

Unused packages and dependencies

Starting with this release, LibreTime installs gunicorn, uvicorn and pika from PyPi. This renders some previously installed distribution packages useless. You can remove them from your system using the following command:

sudo apt remove gunicorn python3-gunicorn python3-httptools python3-uvicorn python3-uvloop python3-pika

In addition, LibreTime now install its dependencies in a python virtual environment. This renders the python packages that LibreTime installed globally useless. There is no clean way to remove those python packages, because there is no safe way to know if other tools depend on them. If you are experienced enough with CLI and system administration, you may prune the entire /usr/local/lib/python3.*/dist-packages/ directory, but do this at your own risk. Those globally installed python packages may stay on the system, they shouldn't break LibreTime.