diff --git a/.github/workflows/build-freebsd-basic.yml b/.github/workflows/build-freebsd-basic.yml index f6d115dc..265f2578 100644 --- a/.github/workflows/build-freebsd-basic.yml +++ b/.github/workflows/build-freebsd-basic.yml @@ -10,7 +10,7 @@ jobs: with: usesh: true prepare: | - pkg install -y cmake pkgconf boost-libs ffmpeg stb libconfig taglib libarchive xxhash wt googletest pugixml + pkg install -y cmake pkgconf boost-libs ffmpeg stb libconfig taglib libarchive xxhash wt googletest pugixml pulseaudio run: | mkdir build diff --git a/.github/workflows/clang-format-check.yml b/.github/workflows/clang-format-check.yml index 233aedc8..83584862 100644 --- a/.github/workflows/clang-format-check.yml +++ b/.github/workflows/clang-format-check.yml @@ -5,9 +5,11 @@ jobs: name: Formatting Check runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - - name: Run clang-format style check - uses: jidicula/clang-format-action@v4.13.0 - with: - clang-format-version: '19' - check-path: 'src' \ No newline at end of file + - name: Checkout repo + uses: actions/checkout@v4 + + - name: Install clang-format + run: sudo apt-get update && sudo apt-get install -y clang-format-19 + + - name: Perform checks + run: find src \( -name "*.cpp" -o -name "*.hpp" \) -print0 | xargs -r -0 clang-format-19 --dry-run --Werror \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index eba3736f..d993e9cc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,6 +1,6 @@ cmake_minimum_required(VERSION 3.12) -project(lms VERSION 3.74.0) +project(lms VERSION 3.75.0) set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_SOURCE_DIR}/cmake/modules/) diff --git a/Dockerfile-build-alpine b/Dockerfile-build-alpine index 200b6d7d..c8737514 100644 --- a/Dockerfile-build-alpine +++ b/Dockerfile-build-alpine @@ -14,17 +14,19 @@ RUN apk add --no-cache ${BUILD_PACKAGES} ARG LMS_BUILD_PACKAGES=" \ gcc \ g++ \ - musl-dev \ + alsa-lib-dev \ benchmark-dev \ boost-dev \ ffmpeg-dev \ + gtest-dev \ libarchive-dev \ libconfig-dev \ + musl-dev \ pugixml-dev \ - taglib-dev \ + pulseaudio-dev \ stb \ + taglib-dev \ wt-dev \ - gtest-dev \ xxhash-dev" COPY --from=xx / / diff --git a/Dockerfile-build-arch b/Dockerfile-build-arch index b49c9477..c73eac24 100644 --- a/Dockerfile-build-arch +++ b/Dockerfile-build-arch @@ -2,14 +2,15 @@ FROM archlinux:latest ARG BUILD_PACKAGES="\ benchmark \ + boost \ clang \ cmake \ - boost \ ffmpeg \ gtest \ graphicsmagick \ libarchive \ libconfig \ + libpulse \ make \ pkgconfig \ pugixml \ diff --git a/Dockerfile-release b/Dockerfile-release index 585c76db..f4cbd190 100644 --- a/Dockerfile-release +++ b/Dockerfile-release @@ -1,45 +1,45 @@ -FROM alpine:3.22 AS build +FROM alpine:3.23 AS build WORKDIR /tmp/workdir ENV PREFIX="/tmp/install" ARG BUILD_PACKAGES=" \ - ca-certificates \ - curl \ - bzip2 \ - pkgconfig \ - coreutils \ autoconf \ automake \ - libtool \ - g++ \ - make \ - openjpeg-dev \ - libpng-dev \ - nasm \ - yasm \ - curl \ - libogg-dev \ - opus-dev \ - pugixml-dev \ - libvorbis-dev \ - lame-dev \ - cmake \ - zlib-dev \ - openssl-dev \ boost-dev \ + bzip2 \ + ca-certificates \ + cmake \ + coreutils \ + curl \ + g++ \ + gtest-dev \ + lame-dev \ libarchive-dev \ libconfig-dev \ - utfcpp \ + libogg-dev \ + libpng-dev \ + libtool \ + libvorbis-dev \ + make \ + openjpeg-dev \ + openssl-dev \ + opus-dev \ + pkgconfig \ + pugixml-dev \ + pulseaudio-dev \ + nasm \ sqlite-dev \ - gtest-dev \ - xxhash-dev" + utfcpp \ + xxhash-dev \ + yasm \ + zlib-dev" RUN apk add --no-cache --update ${BUILD_PACKAGES} -# ffmpeg -ARG FFMPEG_VERSION=6.1.3 +# FFmpeg +ARG FFMPEG_VERSION=6.1.4 RUN \ DIR=/tmp/ffmpeg && mkdir -p ${DIR} && cd ${DIR} && \ curl -sLO https://ffmpeg.org/releases/ffmpeg-${FFMPEG_VERSION}.tar.bz2 && \ @@ -80,7 +80,7 @@ RUN \ make -j$(nproc) install # WT -ARG WT_VERSION=4.12.1 +ARG WT_VERSION=4.12.3 ARG WT_DEBUG=OFF RUN \ DIR=/tmp/wt && mkdir -p ${DIR} && cd ${DIR} && \ @@ -89,11 +89,11 @@ RUN \ RUN \ DIR=/tmp/wt && mkdir -p ${DIR} && cd ${DIR} && \ - cmake -DCMAKE_INTERPROCEDURAL_OPTIMIZATION=TRUE -DCMAKE_CXX_STANDARD=17 -DSHARED_LIBS=ON -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=${PREFIX} -DBUILD_EXAMPLES=OFF -DENABLE_LIBWTTEST=OFF -DCONNECTOR_FCGI=OFF -DUSE_SYSTEM_SQLITE3=ON -DDEBUG=${WT_DEBUG} && \ + cmake -DCMAKE_INTERPROCEDURAL_OPTIMIZATION=TRUE -DCMAKE_CXX_STANDARD=20 -DSHARED_LIBS=ON -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=${PREFIX} -DWT_CPP20_DATE_TZ_IMPLEMENTATIO="std" -DWT_CPP17_FILESYSTEM_IMPLEMENTATION="std" -DWT_CPP17_ANY_IMPLEMENTATION="std" -DBUILD_EXAMPLES=OFF -DENABLE_LIBWTTEST=OFF -DCONNECTOR_FCGI=OFF -DUSE_SYSTEM_SQLITE3=ON -DDEBUG=${WT_DEBUG} && \ make -j$(nproc) install # STB -ARG STB_VERSION=5c205738c191bcb0abc65c4febfa9bd25ff35234 +ARG STB_VERSION=f1c79c02822848a9bed4315b12c8c8f3761e1296 RUN \ DIR=/tmp/stb && mkdir -p ${DIR} && cd ${DIR} && \ curl -sLO https://github.com/nothings/stb/archive/${STB_VERSION}.tar.gz && \ @@ -102,7 +102,7 @@ RUN \ cp ./*.h ${PREFIX}/include/stb # TAGLIB -ARG TAGLIB_VERSION=v2.1.1 +ARG TAGLIB_VERSION=v2.2 RUN \ DIR=/tmp/taglib && mkdir -p ${DIR} && cd ${DIR} && \ curl -sLO https://github.com/taglib/taglib/archive/${TAGLIB_VERSION}.tar.gz && \ @@ -128,12 +128,12 @@ RUN \ mkdir -p /tmp/fakeroot/bin && \ for bin in ${PREFIX}/bin/ffmpeg ${PREFIX}/bin/lms*; \ do \ - strip --strip-all $bin && \ - cp $bin /tmp/fakeroot/bin/; \ + strip --strip-all $bin && \ + cp $bin /tmp/fakeroot/bin/; \ done && \ for lib in ${PREFIX}/lib/*.so; \ do \ - strip --strip-all $lib; \ + strip --strip-all $lib; \ done && \ cp -r ${PREFIX}/lib /tmp/fakeroot/lib && \ cp -r ${PREFIX}/share /tmp/fakeroot/share && \ @@ -146,27 +146,27 @@ RUN \ rm -rf /tmp/fakeroot/share/Wt/resources/themes ## Release Stage -FROM alpine:3.22 AS release +FROM alpine:3.23 AS release LABEL maintainer="Emeric Poupon " ARG RUNTIME_PACKAGES=" \ - libssl3 \ - libcrypto3 \ - openjpeg \ - libpng \ - libogg \ - opus \ - libvorbis \ - lame-libs \ - zlib \ - boost-filesystem \ boost-iostreams \ boost-program_options \ boost-thread \ + lame-libs \ libarchive \ libconfig++ \ + libcrypto3 \ + libogg \ + libpng \ + libpulse \ + libvorbis \ + libssl3 \ + openjpeg \ + opus \ pugixml \ - sqlite-libs" + sqlite-libs \ + zlib" ARG LMS_USER=lms ARG LMS_GROUP=lms diff --git a/INSTALL.md b/INSTALL.md index 55a5455b..b5d795b9 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -37,11 +37,14 @@ __Notes__: * a C++20 compiler is needed * ffmpeg version 4 minimum is required ```sh -apt-get install build-essential cmake libboost-program-options-dev libboost-system-dev libavutil-dev libavformat-dev libstb-dev libconfig++-dev ffmpeg libtag-dev libpam0g-dev libpugixml-dev libgtest-dev libarchive-dev libxxhash-dev libssl-dev +apt-get install build-essential cmake libboost-program-options-dev libboost-system-dev libavutil-dev libavformat-dev libswresample-dev ffmpeg libconfig++-dev libstb-dev libtag-dev libpugixml-dev libgtest-dev libarchive-dev libxxhash-dev libssl-dev ``` +__Optional dependencies__: +* `libpam0g-dev`: used to handle PAM authentication +* `libpulse-dev`: used to output audio via PulseAudio in jukebox mode + __Notes__: -* libpam0g-dev is optional (only for using PAM authentication) -* libstb-dev can be replaced by libgraphicsmagick++1-dev (the latter will likely use more RAM) +* `libstb-dev` can be replaced by `libgraphicsmagick++1-dev` (the latter will likely use more RAM) You also need _Wt4_, which is not packaged on _Debian_. See [installation instructions](https://www.webtoolkit.eu/wt/doc/reference/html/InstallationUnix.html).
### Build Get the latest stable release and build it: @@ -164,7 +167,7 @@ __Note__: to mitigate brute force login attempts, _LMS_ uses an internal login t ```sh systemctl start lms ``` -Log traces can be accessed using journactl: +Log traces can be accessed using journalctl: ```sh journalctl -u lms.service ``` diff --git a/README.md b/README.md index 5a55ee41..e5304ed8 100644 --- a/README.md +++ b/README.md @@ -24,6 +24,7 @@ A [demo instance](http://lms-demo.poupon.dev) is available. Note the administrat * Podcasts support * Playlists support * Lyrics support +* [Jukebox](SUBSONIC.md#jukebox-support) support ## Music discovery _LMS_ provides several ways to help you find the music you like: @@ -63,8 +64,9 @@ _LMS_ works best when using the default [Picard](https://picard.musicbrainz.org/ ### Multiple album artists While _LMS_ can manage multiple album artists using the `albumartist` tag, it works better when using the custom `albumartists` and `albumartistssort` tags, similar to how it handles regular artist tags. -__Note__: if you use Picard, add the following script to include these tags: +__Note__: if you use Picard, add this script to set up both artist and album artist tags: ``` +$setmulti(artistssort,%_artists_sort%) $setmulti(albumartists,%_albumartists%) $setmulti(albumartistssort,%_albumartists_sort%) ``` diff --git a/SUBSONIC.md b/SUBSONIC.md index 3b8a2a0c..12c6b88d 100644 --- a/SUBSONIC.md +++ b/SUBSONIC.md @@ -6,6 +6,12 @@ Given the API limitations of folder navigation commands, it is recommended to pl The Subsonic API is enabled by default. +## Jukebox support +The jukebox‑control subset of the API is implemented through the `jukeboxControl` endpoint. Only the administrator may execute these actions and the service can be +enabled or disabled with the `jukebox-audio-backend` configuration option in `lms.conf`. When the PulseAudio backend is selected, _LMS_ uses the normal system‑wide environment variables (`PULSE_SERVER`, `PULSE_SINK`, `PULSE_SOURCE`, etc.) to determine where audio is sent. + +__Note__: the jukebox play queue is kept entirely in memory by the service and is not persisted. + # OpenSubsonic API OpenSubsonic is an initiative to patch and extend the legacy Subsonic API. You'll find more details in the [official documentation](https://opensubsonic.netlify.app/) @@ -61,6 +67,8 @@ The following extra fields are implemented: * `musicBrainzId` * `sortName` * `roles` +* `Playlist` response: + * `readonly` ## Supported extensions * [API Key Authentication](https://opensubsonic.netlify.app/docs/extensions/apikeyauth/) diff --git a/approot/messages.xml b/approot/messages.xml index ca602687..1bcfd5f8 100644 --- a/approot/messages.xml +++ b/approot/messages.xml @@ -199,6 +199,7 @@ Artists Bitrate Codec +Copyright Cover art Download Duration @@ -233,6 +234,7 @@ Unstar Value Various artists +Some rights reserved. Please refer to individual tracks for copyright info Appears on diff --git a/approot/messages_en-US.xml b/approot/messages_en-US.xml index 77611a53..2840228a 100644 --- a/approot/messages_en-US.xml +++ b/approot/messages_en-US.xml @@ -9,4 +9,4 @@ hh:mm:ss a MM/dd/yyyy hh:mm:ss a - \ No newline at end of file + diff --git a/approot/messages_es.xml b/approot/messages_es.xml index 988e6d78..75a7c8e1 100644 --- a/approot/messages_es.xml +++ b/approot/messages_es.xml @@ -199,6 +199,7 @@ Artistas Bitrate Codec +Derechos de autor Carátula Descargar Duración @@ -233,6 +234,7 @@ Eliminar de favoritos Valor Varios artistas +Algunos derechos reservados. Consulte las pistas para información sobre copyright Aparece en diff --git a/approot/messages_fr.xml b/approot/messages_fr.xml index b5229885..e77abe2b 100644 --- a/approot/messages_fr.xml +++ b/approot/messages_fr.xml @@ -199,6 +199,7 @@ Artistes Bitrate Codec +Droits d'auteur Pochette Télécharger Durée @@ -233,6 +234,7 @@ Retirer des favoris Valeur Artistes divers +Certains droits réservés. Consultez les pistes pour les informations sur les droits d'auteur Apparaît dans diff --git a/approot/messages_it.xml b/approot/messages_it.xml index 798dc86e..5eba39d8 100644 --- a/approot/messages_it.xml +++ b/approot/messages_it.xml @@ -199,6 +199,7 @@ Artisti Bitrate Codec +Diritti d'autore Copertina Download Durata @@ -233,6 +234,7 @@ Rimuovi dai preferiti Valore Vari artisti +Alcuni diritti riservati. Consultare le tracce per le informazioni sul copyright Appare su diff --git a/approot/messages_pl.xml b/approot/messages_pl.xml index 84cd5729..08181d06 100644 --- a/approot/messages_pl.xml +++ b/approot/messages_pl.xml @@ -216,6 +216,7 @@ Artyści Przepływność Kodek +Prawa autorskie Okładka Pobierz Długość @@ -250,6 +251,7 @@ Przestań wyróżniać Wartość Różni artyści +Niektóre prawa zastrzeżone. Sprawdź poszczególne utwory, aby uzyskać informacje o prawach autorskich Pojawia się na diff --git a/approot/messages_zh.xml b/approot/messages_zh.xml index 8293c6bf..ee81802d 100644 --- a/approot/messages_zh.xml +++ b/approot/messages_zh.xml @@ -197,6 +197,7 @@ 歌手 比特率 编码器 +版权所有 封面 下载 时长 @@ -231,6 +232,7 @@ 取消收藏 群星 +部分权利保留。请查看单曲以获取版权信息 出现于 diff --git a/approot/tracks.xml b/approot/tracks.xml index 22f8740b..d40598ab 100644 --- a/approot/tracks.xml +++ b/approot/tracks.xml @@ -129,6 +129,16 @@ ${playcount} + ${} +
+
+ ${tr:Lms.Explore.copyright} +
+
+ ${copyright} +
+
+ ${
} ${}
${comment}
@@ -143,7 +153,6 @@ -