diff --git a/.github/workflows/build-macos-basic.yml b/.github/workflows/build-macos-basic.yml new file mode 100644 index 00000000..0a85d87a --- /dev/null +++ b/.github/workflows/build-macos-basic.yml @@ -0,0 +1,51 @@ +name: Basic Build (macOS) + +on: [pull_request] + +jobs: + build-macos: + runs-on: macos-14 + env: + PKG_CONFIG_PATH: /opt/homebrew/lib/pkgconfig:/opt/homebrew/share/pkgconfig + + steps: + - uses: actions/checkout@v4 + + - name: Install dependencies + run: | + brew update + brew install pkg-config cmake boost ffmpeg libconfig taglib libarchive xxhash pugixml googletest openssl git + + - name: Build and install Wt + run: | + WT_VERSION=4.12.1 + git clone https://github.com/emweb/wt.git /tmp/wt + cd /tmp/wt + git checkout ${WT_VERSION} + cmake -B build -S . \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/usr/local \ + -DBUILD_EXAMPLES=OFF \ + -DENABLE_LIBWTTEST=OFF \ + -DCONNECTOR_FCGI=OFF + cmake --build build --parallel 2 + sudo cmake --install build + + - name: Install Stb headers + run: | + git clone https://github.com/nothings/stb.git /opt/homebrew/include/stb + + - name: Configure LMS + run: | + export PKG_CONFIG_PATH="$(brew --prefix libarchive)/lib/pkgconfig:$PKG_CONFIG_PATH" + cmake -S . -B build \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_UNITY_BUILD=ON \ + -DBUILD_TESTING=ON \ + -DSTB_IMAGE_INCLUDE_DIR=/opt/homebrew/include/stb + + - name: Build LMS + run: cmake --build build --parallel 2 + + - name: Test LMS + run: ctest --test-dir build --output-on-failure diff --git a/CMakeLists.txt b/CMakeLists.txt index bc0ce574..eba3736f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,6 +1,6 @@ cmake_minimum_required(VERSION 3.12) -project(lms VERSION 3.73.0) +project(lms VERSION 3.74.0) set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_SOURCE_DIR}/cmake/modules/) diff --git a/INSTALL.md b/INSTALL.md index 76791b73..55a5455b 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -102,10 +102,10 @@ If a setting is not present in the configuration file, a hardcoded default value ## Authentication backends You can define which authentication backend to be used thanks to the `authentication-backend` option: * `internal` (default): _LMS_ uses an internal database to store users and their associated passwords (salted and hashed using [Bcrypt](https://en.wikipedia.org/wiki/Bcrypt)). Only the admin user can create, edit or remove other users. -* `PAM`: the user/password authentication request is forwarded to PAM (see the default [PAM configuration file](conf/pam/lms) provided). +* `PAM`: the user/password authentication request is forwarded to PAM. A default example PAM configuration file is provided at [`conf/pam/lms`](conf/pam/lms), which demonstrates how to authenticate using system passwords. **Note:** this file is just a base example; depending on your PAM setup, you may need to adjust the service file or PAM rules to ensure proper privileges. * `http-headers`: _LMS_ uses a configurable HTTP header field, typically set by a reverse proxy to handle [SSO](https://en.wikipedia.org/wiki/Single_sign-on), to extract the login name. You can customize the field to be used using the `http-headers-login-field` option. __Note__: the first created user is the admin user. -#### `internal` backend: reset admin password +### `internal` backend: reset admin password Open the the database file located in `/var/lms/lms.db` using `sqlite3`: ```sh sqlite3 /var/lms/lms.db diff --git a/README.md b/README.md index 8534b2f0..5a55ee41 100644 --- a/README.md +++ b/README.md @@ -49,7 +49,8 @@ _LMS_ supports an Artist information folder to manage metadata and images for ar The folder must follow a structure defined by Kodi, as detailed [here](https://kodi.wiki/view/Artist_information_folder). `artist.nfo` files are used to define additional artist information such as biography, sort name, and MusicBrainz ArtistID. See the format [here](https://kodi.wiki/view/NFO_files/Artists). -__Note__: If no name is provided in the `artist.nfo` file, the name of the containing folder is used. +The canonical artist name used by _LMS_ is the one specified in the `artist.nfo` file; If an `artist.nfo` exists but does not provide a name, the name of the containing folder is used. +If no artist info file is provided, _LMS_ will pick the artist name found on the latest release. ### Filtering It is possible to apply global filters on your collection using `genre`, `mood`, `grouping`, `language`, `codec`, and by music library. More tags, including custom ones, can be added in the database administration settings. diff --git a/SUBSONIC.md b/SUBSONIC.md index 025367b7..3b8a2a0c 100644 --- a/SUBSONIC.md +++ b/SUBSONIC.md @@ -34,7 +34,9 @@ The following extra fields are implemented: * `musicBrainzId` * `originalReleaseDate` * `recordLabels` + * `releaseDate` * `releaseTypes` + * `sortName` * `userRating` * `version` * `Child` response: @@ -64,5 +66,7 @@ The following extra fields are implemented: * [API Key Authentication](https://opensubsonic.netlify.app/docs/extensions/apikeyauth/) * [getPodcastEpisode](https://opensubsonic.netlify.app/docs/extensions/getpodcastepisode/) * [HTTP form POST](https://opensubsonic.netlify.app/docs/extensions/formpost/) +* [Index based Queue](https://opensubsonic.netlify.app/docs/extensions/indexbasedqueue/) * [Transcode offset](https://opensubsonic.netlify.app/docs/extensions/transcodeoffset/) * [Song Lyrics](https://opensubsonic.netlify.app/docs/extensions/songlyrics/) +* [Transcoding](https://opensubsonic.netlify.app/docs/extensions/transcoding/) diff --git a/approot/artist.xml b/approot/artist.xml index 78195b00..00c4f3a0 100644 --- a/approot/artist.xml +++ b/approot/artist.xml @@ -15,7 +15,7 @@ ${}
${play-btn class="btn btn-primary"} -
diff --git a/approot/explore.xml b/approot/explore.xml index eba82ec2..bd8a7728 100644 --- a/approot/explore.xml +++ b/approot/explore.xml @@ -58,13 +58,14 @@ ${selected-item} diff --git a/approot/main.xml b/approot/main.xml index bc1eb859..66143c74 100644 --- a/approot/main.xml +++ b/approot/main.xml @@ -3,11 +3,11 @@ ${navbar} -
+
${contents} ${notifications class="toast-container Lms-notification-container p-3"} ${modal} -
+ ${player class="fixed-bottom bg-dark Lms-player"}
diff --git a/approot/mediaplayer.xml b/approot/mediaplayer.xml index 8fb44ba3..21e1f759 100644 --- a/approot/mediaplayer.xml +++ b/approot/mediaplayer.xml @@ -5,9 +5,9 @@ -
+
- +
@@ -15,23 +15,25 @@
- - -
${title class="d-block text-truncate"} - ${artist class="d-inline text-decoration-none text-truncate link-success"} + + ${artist class="d-inline text-decoration-none text-truncate"} ${separator} ${release class="text-decoration-none text-truncate link-success"} +
@@ -39,7 +41,7 @@
- +
${playqueue-btn class="btn btn-outline-primary border-0"} diff --git a/approot/messages.xml b/approot/messages.xml index 00d92c46..ca602687 100644 --- a/approot/messages.xml +++ b/approot/messages.xml @@ -9,12 +9,14 @@ Tags Create Delete +Delete {1} Discard Edit This field must be in upper case Loading... Login Logout +More... Ok Password Bad login / password combination @@ -25,6 +27,7 @@ Old password Password too weak Passwords don't match +Play {1} Another session has been open. Reopen this one? Save Settings saved! @@ -145,8 +148,6 @@ Checking for removed files... {1}% Compacting database... Computing stats... {1}% -Discovering files: {1} files -Fetching track features from AcousticBrainz: {1}/{2} tracks ({3}%)... Optimizing database... {1}%... Reconciliating artists: {1} entries... Reloading similarity engine: {1}%... @@ -198,6 +199,7 @@ Artists Bitrate Codec +Cover art Download Duration Filter added @@ -221,6 +223,7 @@ Albums Search Star +Star {1} Starred Track information Lyrics @@ -237,43 +240,43 @@ Similar artists -All artists - - Track artist - Track artists - - +All artists + Composer Composers - + Conductor Conductors - + Lyricist Lyricists - + Mixer Mixers - + Performer Performers - + Producer Producers - + Album artist Album artists - + Remixer Remixers + + Track artist + Track artists + Copyright @@ -309,6 +312,12 @@ Transcoding active +Now playing +Previous +Play / pause +Next +Seek +Volume Clear diff --git a/approot/messages_es.xml b/approot/messages_es.xml index 5800e983..988e6d78 100644 --- a/approot/messages_es.xml +++ b/approot/messages_es.xml @@ -9,12 +9,14 @@ Etiquetas Crear Eliminar +Eliminar {1} Descartar Editar Este campo debe estar en mayúsculas Cargando... Usuario Salir +Más... Ok Contraseña Combinación incorrecta de usuario / contraseña @@ -25,6 +27,7 @@ Contraseña antigua La contraseña es demasiado débil Las contraseñas no coinciden +Reproducir {1} Se ha abierto otra sesión. ¿Reabrir la actúal? Guardar ¡Ajustes guardados! @@ -145,7 +148,6 @@ Comprobando ficheros eliminados... {1}% Compactando la base de datos... Calculando estadísticas... {1}% -Accediendo a las características de la pista desde AcousticBrainz : {1}/{2} ficheros ({3}%)... Optimizando la base de datos... {1}%... Reconciliando artistas: {1} entradas... Recargando el motor de similitud: {1}%... @@ -197,6 +199,7 @@ Artistas Bitrate Codec +Carátula Descargar Duración Filtro añadido @@ -220,6 +223,7 @@ Álbumes Buscar Añadir a favoritos +Agregar {1} a favoritos Favoritos Información sobre la pista Letras @@ -236,43 +240,43 @@ Artistas similares -Todos los artistas - - Artista de la pista - Artistas de la pista - - +Todos los artistas + Compositor Compositores - + Director de orquesta Directores de orquesta - + Letrista Letristas - + Mezclador Mezcladores - + Intérprete Intérpretes - + Productor Productores - + Artista del álbum Artistas del álbum - + Remezclador Remezcladores + + Artista de la pista + Artistas de la pista + Copyright @@ -308,6 +312,12 @@ Transcodificación activa +Reproduciendo ahora +Anterior +Reproducir / pausar +Siguiente +Búsqueda +Volumen Vaciar la lista diff --git a/approot/messages_fr.xml b/approot/messages_fr.xml index 4ca0b8a5..b5229885 100644 --- a/approot/messages_fr.xml +++ b/approot/messages_fr.xml @@ -9,12 +9,14 @@ Tags Créer Supprimer +Supprimer {1} Annuler Editer Ce champ doit être en majuscule Chargement... Login Quitter +Plus... Ok Mot de passe Mauvaise combinaison login / mot de passe @@ -25,6 +27,7 @@ Ancien mot de passe Mot de passe trop faible Les mots de passe ne correspondent pas +Lire {1} Une autre session a été ouverte. Reouvrir celle-ci ? Sauvegarder Paramètres sauvegardés! @@ -145,7 +148,6 @@ Vérification des fichiers supprimés... {1}% Compactage de la base de données... Calcul des statistiques... {1}% -Récupération des métadonnées AcousticBrainz : {1}/{2} fichiers ({3}%)... Optimisation de la base de données... {1}%... Reconciliation des artistes: {1} entrées... Rechargement du moteur de recommandation : {1}%... @@ -197,6 +199,7 @@ Artistes Bitrate Codec +Pochette Télécharger Durée Filtre ajouté @@ -220,6 +223,7 @@ Albums Rechercher Ajouter aux favoris +Ajouter {1} aux favoris Favoris Informations sur la piste Paroles @@ -236,43 +240,43 @@ Artistes similaires -Tous les artistes - - Artiste de piste - Artistes de piste - - +Tous les artistes + Compositeur Compositeurs - + Chef d'orchestre Chefs d'orchestre - + Parolier Paroliers - + Mixeur Mixeurs - + Interprète Interprètes - + Producteur Producteurs - + Artiste d'album Artistes d'album - + Remixeur Remixeurs + + Artiste de piste + Artistes de piste + Copyright @@ -308,6 +312,12 @@ Transcodage actif +En cours de lecture +Précédent +Lecture / pause +Suivant +Navigation +Volume Effacer diff --git a/approot/messages_it.xml b/approot/messages_it.xml index a1856a6b..798dc86e 100644 --- a/approot/messages_it.xml +++ b/approot/messages_it.xml @@ -9,12 +9,14 @@ Tags Crea Elimina +Elimina {1} Annulla Modifica Questo campo deve essere in maiuscolo Caricamento... Login Logout +Altro... Ok Password Errata combinazione di Login / Password @@ -25,12 +27,13 @@ Vecchia password La password è troppo debole Le password non corrispondono +Riproduci {1} Un'altra sessione è stata aperta. Vuoi riaprire questa? Salva Impostazioni salvate! - {1} traccia - {1} tracce + {1} traccia + {1} tracce Utente UUID non valido @@ -145,7 +148,6 @@ Controllo file... {1}% Compattazione del database... Calcolo statistiche... {1}% -Recupero metadati da AcousticBrainz: {1}/{2} tracce ({3}%)... Ottimizzazione del database... {1}%... Riconciliazione artisti: {1} voci... Ricarica motore di tracce simili: {1}%... @@ -197,6 +199,7 @@ Artisti Bitrate Codec +Copertina Download Durata Filtro aggiunto @@ -220,6 +223,7 @@ Album Ricerca Aggiungi ai preferiti +Aggiungi {1} ai preferiti Preferiti Informazioni sulla traccia Testo @@ -236,42 +240,42 @@ Artisti simili -Tutti gli artisti - - Artista della traccia - Artisti della traccia +Tutti gli artisti + + Compositore + Compositori - - Compositore - Compositori + + Direttore d'orchestra + Direttori d'orchestra - - Direttore d'orchestra - Direttori d'orchestra + + Paroliere + Parolieri - - Paroliere - Parolieri + + Tecnico del mixaggio + Tecnici del mixaggio - - Tecnico del mixaggio - Tecnici del mixaggio + + Interprete + Interpreti - - Interprete - Interpreti + + Produttore + Produttori - - Produttore - Produttori + + Artista dell'album + Artisti dell'album - - Artista dell'album - Artisti dell'album + + Remixer + Remixers - - Remixer - Remixers + + Artista della traccia + Artisti della traccia @@ -308,6 +312,12 @@ Transcodifica attiva +In riproduzione +Precedente +Riproduci / pausa +Successivo +Navigazione +Volume Cancella diff --git a/approot/messages_pl.xml b/approot/messages_pl.xml index 6e8ff867..84cd5729 100644 --- a/approot/messages_pl.xml +++ b/approot/messages_pl.xml @@ -9,12 +9,14 @@ Znaczniki Utwórz Usuń +Usuń {1} Odrzuć Zmień Wartość musi się zaczynać wielką literą Wczytywanie... Login Wyloguj +Więcej... Ok Hasło Błędny login lub hasło @@ -25,6 +27,7 @@ Stare hasło Hasło zbyt słabe Hasła się nie zgadzają +Odtwórz {1} Rozpoczęto inną sesję. Odtworzyć tę? Zapisz Ustawienia zapisane! @@ -158,7 +161,6 @@ Sprawdzanie plików... {1}% Prasowanie bazy danych... Obliczanie statystyk... {1}% -Pobieranie danych o ścieżce z AcousticBrainz: {1}/{2} ścieżek ({3}%)... Optymalizowanie bazy danych... {1}%... Uzgodnianie artystów: {1} wpisów... Przeładowywanie silnika podobieństw: {1}%... @@ -214,6 +216,7 @@ Artyści Przepływność Kodek +Okładka Pobierz Długość Filtr dodany @@ -237,6 +240,7 @@ Albumy Szukaj Wyróżnij +Dodaj {1} do ulubionych Wyróżnione Informacje o ścieżce Tekst @@ -253,52 +257,52 @@ Podobni artyści -Wszyscy artyści - - Artysta ze ścieżki - Artyści ze ścieżki - Artyści ze ścieżki - - +Wszyscy artyści + Kompozytor Kompozytorzy Kompozytorzy - + Dyrygent Dyrygenci Dyrygenci - + Tekściarz Tekściarze Tekściarze - + Realizator Realizatorzy Realizatorzy - + Wykonawca Wykonawcy Wykonawcy - + Producent Producenci Producenci - + Artysta z albumu Artyści z albumu Artyści z albumu - + Remixer Remikserzy Remikserzy + + Artysta ze ścieżki + Artyści ze ścieżki + Artyści ze ścieżki + Prawa autorskie @@ -334,6 +338,12 @@ Transkodowanie włączone +Teraz odtwarzane +Poprzedni +Odtwarzaj / pauza +Następny +Przewijanie +Głośność Wyczyść diff --git a/approot/messages_zh.xml b/approot/messages_zh.xml index 37f11a77..8293c6bf 100644 --- a/approot/messages_zh.xml +++ b/approot/messages_zh.xml @@ -9,13 +9,15 @@ 标签 新建 删除 +删除 {1} 撤销 编辑 - +此字段必须为大写 加载中... 登陆 注销 - +更多... +确定 密码 用户名或密码无效 登录已被限制,请稍后再试 @@ -25,14 +27,13 @@ 旧密码 密码太弱 密码不匹配 +播放 {1} 另一个会话已打开,重新打开这一个? 保存 - - - - - +设置已保存! +{1} 首曲目 用户 +无效的 UUID @@ -52,115 +53,117 @@ 用户未找到 - - - - - - + 关于 + 调试工具 + 媒体库 + 扫描设置 + 扫描器 + 用户 - - - +关于 +主页 +版本 - - - - - - - - - - - - +音乐库 +创建库 +确定删除该库? +编辑库 +库已创建! +库已删除! +库名称 +库名称已存在 +路径必须为绝对路径 +路径不得与其他库重叠 +路径必须为已存在的目录 +根目录 - - - +允许将没有 MBID 的艺术家合并到有 MBID 的艺术家 +如果没有艺术家图片,则使用专辑封面 +用于拆分艺术家标签的分隔符 +不使用分隔符拆分的艺术家(每行一个艺术家) 每日 - - +用于拆分其他标签的分隔符 +额外扫描的标签 每小时 立即扫描! - +其他 每月 从不 - +扫描已中止! 扫描完成:总文件 {1},添加文件 {2},更新文件 {3},删除文件 {4},重复文件 {5},错误文件 {6} 扫描已完成! 扫描选项 - - - - - - +相似度引擎 +基于标签 + +跳过仅包含同一专辑曲目的播放列表 +标签分隔符不能仅由空格组成 +标签解析 更新周期 更新开始时间 每周 无法获得音轨时间 - - +无法读取索引 {1} 处的图片:{2} +无法解析艺术家信息文件 无法解析文件 - +无法读取文件({1}) 无法读取文件 ({1}) - - - +无法解析歌词文件 +无法解析播放列表文件 +压缩数据库。注意:此过程可能需要一段时间,并且在压缩步骤期间会阻塞整个应用程序! {1} 个重复文件: {1} 个错误: - - +强制数据库优化 +强制扫描所有文件 生成报告 最后扫描 不可用 已扫描 {1} 个文件,用时 {2},在 {3} 的 {4} (UTC) - {5} 个错误,{6} 个重复项 - - - +缺少艺术家名称 +无法找到曲目路径 +无法找到路径 "{1}" 没有音轨 相同文件哈希值 相同 MBID 立即扫描 - +扫描选项 扫描器 状态 无计划 计划于 {2} 在 {1} (UTC) 扫描中: 阶段 {1}/{2} - - - - - +关联艺术家图片:{1}%... +关联外部歌词:{1}%... +关联播放列表曲目:{1}%... +关联专辑封面:{1}%... +关联曲目图片:{1}%... +检查重复文件... {1} 个文件 检查文件中... {1}% - - -从 AcousticBrainz 获取音轨特征: {1}/{2} 音轨 ({3}%)... - - +正在压缩数据库... +正在计算统计信息... {1}% +正在优化数据库... {1}%... +整理艺术家:{1} 条记录... 重载相似引擎中 {1}%... - - +移除孤立条目:{1} 条记录... +库分析:{1} 个文件... 当前步骤状态 +更新库字段:{1} 条记录 - +调试工具 - - +导出查询计划 +数据库 - - +导出跟踪 +跟踪 新建用户 @@ -192,34 +195,36 @@ 添加过滤器 全部 歌手 - - +比特率 +编码器 +封面 下载 - +时长 过滤器已添加 过滤器 - - +厂牌 +音乐库 播放最多 MusicBrainz 歌手 MusicBrainz 专辑 播放 最后播放 - +下一首播放 随机播放 - +播放次数 随机 最近添加 最近更改 最近播放 - - +专辑信息 +专辑类型 专辑 搜索 收藏 +将 {1} 加入收藏 已收藏 - - +曲目信息 +歌词 播放列表 音轨 类型 @@ -229,82 +234,61 @@ 出现于 - +简介 相似歌手 -所有歌手 -音轨歌手 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +所有艺术家 +作曲者 +指挥 +作词者 +混音师 +表演者 +制作人 +专辑艺术家 +混音师 +曲目艺术家 版权所有 唱片 {1} - +其他版本 相似专辑 - - - - - - - - - - - - - - - - - - +类型 +专辑 +广播 +EP +其他 +单曲 +有声书 +音频剧 +精选集 +样本 +DJ 混音 +实地录音 +访谈 +现场 +混音带 / 街头 +混音 +原声带 +朗诵 删除播放列表? - - +我的播放列表 +共享播放列表 搜索... 转码已启用 +正在播放 +上一首 +播放 / 暂停 +下一首 +进度调整 +音量 清除 @@ -319,29 +303,29 @@ 播放历史 - +艺术家专辑排序方法 音频 这些音频设置仅保存在您的本地浏览器 - - - +内部 +ListenBrainz +ListenBrainz API 令牌 更改密码 - - - - +发行日期(升序) +发行日期(降序) +默认转码输出比特率 +默认转码输出格式 使用演示账号时不能保存! - - - - +在专辑中内联显示艺术家关系 +默认启用转码 +反馈 +要显示的艺术家关系类型 设置 - - - +专辑名称 +原始发行日期(升序) +原始发行日期(降序) 无效密码 必须填写旧密码 - +生成 ReplayGain 模式 没有 ReplayGain 自动模式 @@ -349,17 +333,17 @@ 专辑 ReplayGain 放大器 ReplayGain 放大器 (如果没有信息) - - - +记录播放 +服务 +设置 新设置已保存! 歌手列表模式 所有歌手 专辑歌手 音轨歌手 Subsonic 应用程序接口 - - +OpenSubsonic API 密钥 +对于不支持 “API 密钥认证” 扩展的客户端,请将此 API 密钥用作密码 转码 启动转码 总是 @@ -370,9 +354,18 @@ MP3 Ogg/Opus Ogg/Vorbis - +用户界面 +不到一秒 +{1} 秒 +{1} 分钟 +{1} 小时 +{1} 天 +{1} 周 +{1} 个月 +{1} 年 + 此字段不能为空 diff --git a/approot/release.xml b/approot/release.xml index d19cd070..36afe78e 100644 --- a/approot/release.xml +++ b/approot/release.xml @@ -18,7 +18,7 @@ ${clusters class="mb-2"}
${play-btn class="btn btn-primary"} -