Added an optional role filter for 'appears on' section the artist views, fixes #824

This commit is contained in:
emeric
2026-03-14 16:15:07 +01:00
parent 14e18bf227
commit 535809f576
15 changed files with 436 additions and 262 deletions
+28
View File
@@ -50,4 +50,32 @@
</div>
</message>
<message id="Lms.Explore.Artist.template.appears-on-container">
<div class="mb-3">
<h3>${tr:Lms.Explore.Artist.appears-on}${artist-type class="ms-2 d-inline-block"}</h3>
${releases}
</div>
</message>
<message id="Lms.Explore.Artist.template.track-artist-type-selector">
<div class="dropdown">
<button class="btn btn-sm btn-outline-secondary dropdown-toggle" type="button" data-bs-toggle="dropdown" aria-expanded="false">
${selected-item}
</button>
<ul class="dropdown-menu">
<li>${artist-type-all class="dropdown-item"}</li>
<li class="dropdown-divider"></li>
${<if-has-track-artist>}<li>${artist-type-track-artist class="dropdown-item"}</li>${</if-has-track-artist>}
${<if-has-composer>}<li>${artist-type-composer class="dropdown-item"}</li>${</if-has-composer>}
${<if-has-conductor>}<li>${artist-type-conductor class="dropdown-item"}</li>${</if-has-conductor>}
${<if-has-lyricist>}<li>${artist-type-lyricist class="dropdown-item"}</li>${</if-has-lyricist>}
${<if-has-mixer>}<li>${artist-type-mixer class="dropdown-item"}</li>${</if-has-mixer>}
${<if-has-performer>}<li>${artist-type-performer class="dropdown-item"}</li>${</if-has-performer>}
${<if-has-producer>}<li>${artist-type-producer class="dropdown-item"}</li>${</if-has-producer>}
${<if-has-remixer>}<li>${artist-type-remixer class="dropdown-item"}</li>${</if-has-remixer>}
</ul>
</div>
</message>
</messages>
+38 -39
View File
@@ -196,9 +196,19 @@
<!--Explore-->
<message id="Lms.Explore.add-filter">Add filter</message>
<message id="Lms.Explore.all">All</message>
<message id="Lms.Explore.all-artists">All artists</message>
<message id="Lms.Explore.all-roles">All roles</message>
<message id="Lms.Explore.artists">Artists</message>
<message id="Lms.Explore.bitrate">Bitrate</message>
<message id="Lms.Explore.codec">Codec</message>
<message id="Lms.Explore.composer">
<plural case="0">Composer</plural>
<plural case="1">Composers</plural>
</message>
<message id="Lms.Explore.conductor">
<plural case="0">Conductor</plural>
<plural case="1">Conductors</plural>
</message>
<message id="Lms.Explore.copyright">Copyright</message>
<message id="Lms.Explore.cover-art">Cover art</message>
<message id="Lms.Explore.download">Download</message>
@@ -206,26 +216,54 @@
<message id="Lms.Explore.filter-added">Filter added</message>
<message id="Lms.Explore.filters">Filters</message>
<message id="Lms.Explore.label">Label</message>
<message id="Lms.Explore.lyricist">
<plural case="0">Lyricist</plural>
<plural case="1">Lyricists</plural>
</message>
<message id="Lms.Explore.media-library">Music Library</message>
<message id="Lms.Explore.mixer">
<plural case="0">Mixer</plural>
<plural case="1">Mixers</plural>
</message>
<message id="Lms.Explore.most-played">Most played</message>
<message id="Lms.Explore.musicbrainz-artist">MusicBrainz Artist</message>
<message id="Lms.Explore.musicbrainz-release">MusicBrainz Release</message>
<message id="Lms.Explore.performer">
<plural case="0">Performer</plural>
<plural case="1">Performers</plural>
</message>
<message id="Lms.Explore.play">Play</message>
<message id="Lms.Explore.play-last">Play last</message>
<message id="Lms.Explore.play-next">Play next</message>
<message id="Lms.Explore.play-shuffled">Play shuffled</message>
<message id="Lms.Explore.playcount">Play count</message>
<message id="Lms.Explore.producer">
<plural case="0">Producer</plural>
<plural case="1">Producers</plural>
</message>
<message id="Lms.Explore.random">Random</message>
<message id="Lms.Explore.recently-added">Recently added</message>
<message id="Lms.Explore.recently-modified">Recently modified</message>
<message id="Lms.Explore.recently-played">Recently played</message>
<message id="Lms.Explore.release-artist">
<plural case="0">Album artist</plural>
<plural case="1">Album artists</plural>
</message>
<message id="Lms.Explore.release-info">Release information</message>
<message id="Lms.Explore.release-type">Release type</message>
<message id="Lms.Explore.releases">Albums</message>
<message id="Lms.Explore.remixer">
<plural case="0">Remixer</plural>
<plural case="1">Remixers</plural>
</message>
<message id="Lms.Explore.search">Search</message>
<message id="Lms.Explore.star">Star</message>
<message id="Lms.Explore.star-item">Star {1}</message>
<message id="Lms.Explore.starred">Starred</message>
<message id="Lms.Explore.track-artist">
<plural case="0">Track artist</plural>
<plural case="1">Track artists</plural>
</message>
<message id="Lms.Explore.track-info">Track information</message>
<message id="Lms.Explore.track-lyrics">Lyrics</message>
<message id="Lms.Explore.tracklists">Playlists</message>
@@ -241,45 +279,6 @@
<message id="Lms.Explore.Artist.biography">Biography</message>
<message id="Lms.Explore.Artist.similar-artists">Similar artists</message>
<!--Explore:Artists-->
<message id="Lms.Explore.Artists.all">All artists</message>
<message id="Lms.Explore.Artists.composer">
<plural case="0">Composer</plural>
<plural case="1">Composers</plural>
</message>
<message id="Lms.Explore.Artists.conductor">
<plural case="0">Conductor</plural>
<plural case="1">Conductors</plural>
</message>
<message id="Lms.Explore.Artists.lyricist">
<plural case="0">Lyricist</plural>
<plural case="1">Lyricists</plural>
</message>
<message id="Lms.Explore.Artists.mixer">
<plural case="0">Mixer</plural>
<plural case="1">Mixers</plural>
</message>
<message id="Lms.Explore.Artists.performer">
<plural case="0">Performer</plural>
<plural case="1">Performers</plural>
</message>
<message id="Lms.Explore.Artists.producer">
<plural case="0">Producer</plural>
<plural case="1">Producers</plural>
</message>
<message id="Lms.Explore.Artists.release-artist">
<plural case="0">Album artist</plural>
<plural case="1">Album artists</plural>
</message>
<message id="Lms.Explore.Artists.remixer">
<plural case="0">Remixer</plural>
<plural case="1">Remixers</plural>
</message>
<message id="Lms.Explore.Artists.track-artist">
<plural case="0">Track artist</plural>
<plural case="1">Track artists</plural>
</message>
<!--Explore:Release-->
<message id="Lms.Explore.Release.copyright">Copyright</message>
<message id="Lms.Explore.Release.disc">Disc {1}</message>
+38 -39
View File
@@ -196,9 +196,19 @@
<!--Explore-->
<message id="Lms.Explore.add-filter">Añadir filtro</message>
<message id="Lms.Explore.all">Todos</message>
<message id="Lms.Explore.all-artists">Todos los artistas</message>
<message id="Lms.Explore.all-roles">Todos los roles</message>
<message id="Lms.Explore.artists">Artistas</message>
<message id="Lms.Explore.bitrate">Bitrate</message>
<message id="Lms.Explore.codec">Codec</message>
<message id="Lms.Explore.composer">
<plural case="0">Compositor</plural>
<plural case="1">Compositores</plural>
</message>
<message id="Lms.Explore.conductor">
<plural case="0">Director de orquesta</plural>
<plural case="1">Directores de orquesta</plural>
</message>
<message id="Lms.Explore.copyright">Derechos de autor</message>
<message id="Lms.Explore.cover-art">Carátula</message>
<message id="Lms.Explore.download">Descargar</message>
@@ -206,26 +216,54 @@
<message id="Lms.Explore.filter-added">Filtro añadido</message>
<message id="Lms.Explore.filters">Filtros</message>
<message id="Lms.Explore.label">Sello discográfico</message>
<message id="Lms.Explore.lyricist">
<plural case="0">Letrista</plural>
<plural case="1">Letristas</plural>
</message>
<message id="Lms.Explore.media-library">Biblioteca musical</message>
<message id="Lms.Explore.mixer">
<plural case="0">Mezclador</plural>
<plural case="1">Mezcladores</plural>
</message>
<message id="Lms.Explore.most-played">Reproducidos frecuentemente</message>
<message id="Lms.Explore.musicbrainz-artist">Artista de MusicBrainz</message>
<message id="Lms.Explore.musicbrainz-release">Álbum de MusicBrainz</message>
<message id="Lms.Explore.performer">
<plural case="0">Intérprete</plural>
<plural case="1">Intérpretes</plural>
</message>
<message id="Lms.Explore.play">Reproducir</message>
<message id="Lms.Explore.play-last">Reproducir al final</message>
<message id="Lms.Explore.play-next">Reproducir a continuación</message>
<message id="Lms.Explore.play-shuffled">Reproducción aleatoria</message>
<message id="Lms.Explore.playcount">Número de reproducciones</message>
<message id="Lms.Explore.producer">
<plural case="0">Productor</plural>
<plural case="1">Productores</plural>
</message>
<message id="Lms.Explore.random">Aleatorio</message>
<message id="Lms.Explore.recently-added">Añadidos recientemente</message>
<message id="Lms.Explore.recently-modified">Modificados recientemente</message>
<message id="Lms.Explore.recently-played">Reproducidos recientemente</message>
<message id="Lms.Explore.release-artist">
<plural case="0">Artista del álbum</plural>
<plural case="1">Artistas del álbum</plural>
</message>
<message id="Lms.Explore.release-info">Información sobre el álbum</message>
<message id="Lms.Explore.release-type">Tipo de publicación</message>
<message id="Lms.Explore.releases">Álbumes</message>
<message id="Lms.Explore.remixer">
<plural case="0">Remezclador</plural>
<plural case="1">Remezcladores</plural>
</message>
<message id="Lms.Explore.search">Buscar</message>
<message id="Lms.Explore.star">Añadir a favoritos</message>
<message id="Lms.Explore.star-item">Agregar {1} a favoritos</message>
<message id="Lms.Explore.starred">Favoritos</message>
<message id="Lms.Explore.track-artist">
<plural case="0">Artista de la pista</plural>
<plural case="1">Artistas de la pista</plural>
</message>
<message id="Lms.Explore.track-info">Información sobre la pista</message>
<message id="Lms.Explore.track-lyrics">Letras</message>
<message id="Lms.Explore.tracklists">Listas de reproducción</message>
@@ -241,45 +279,6 @@
<message id="Lms.Explore.Artist.biography">Biografía</message>
<message id="Lms.Explore.Artist.similar-artists">Artistas similares</message>
<!--Explore:Artists-->
<message id="Lms.Explore.Artists.all">Todos los artistas</message>
<message id="Lms.Explore.Artists.composer">
<plural case="0">Compositor</plural>
<plural case="1">Compositores</plural>
</message>
<message id="Lms.Explore.Artists.conductor">
<plural case="0">Director de orquesta</plural>
<plural case="1">Directores de orquesta</plural>
</message>
<message id="Lms.Explore.Artists.lyricist">
<plural case="0">Letrista</plural>
<plural case="1">Letristas</plural>
</message>
<message id="Lms.Explore.Artists.mixer">
<plural case="0">Mezclador</plural>
<plural case="1">Mezcladores</plural>
</message>
<message id="Lms.Explore.Artists.performer">
<plural case="0">Intérprete</plural>
<plural case="1">Intérpretes</plural>
</message>
<message id="Lms.Explore.Artists.producer">
<plural case="0">Productor</plural>
<plural case="1">Productores</plural>
</message>
<message id="Lms.Explore.Artists.release-artist">
<plural case="0">Artista del álbum</plural>
<plural case="1">Artistas del álbum</plural>
</message>
<message id="Lms.Explore.Artists.remixer">
<plural case="0">Remezclador</plural>
<plural case="1">Remezcladores</plural>
</message>
<message id="Lms.Explore.Artists.track-artist">
<plural case="0">Artista de la pista</plural>
<plural case="1">Artistas de la pista</plural>
</message>
<!--Explore:Release-->
<message id="Lms.Explore.Release.copyright">Copyright</message>
<message id="Lms.Explore.Release.disc">Disco {1}</message>
+38 -39
View File
@@ -196,9 +196,19 @@
<!--Explore-->
<message id="Lms.Explore.add-filter">Ajouter filtre</message>
<message id="Lms.Explore.all">Tous</message>
<message id="Lms.Explore.all-artists">Tous les artistes</message>
<message id="Lms.Explore.all-roles">Tous les rôles</message>
<message id="Lms.Explore.artists">Artistes</message>
<message id="Lms.Explore.bitrate">Bitrate</message>
<message id="Lms.Explore.codec">Codec</message>
<message id="Lms.Explore.composer">
<plural case="0">Compositeur</plural>
<plural case="1">Compositeurs</plural>
</message>
<message id="Lms.Explore.conductor">
<plural case="0">Chef d'orchestre</plural>
<plural case="1">Chefs d'orchestre</plural>
</message>
<message id="Lms.Explore.copyright">Droits d'auteur</message>
<message id="Lms.Explore.cover-art">Pochette</message>
<message id="Lms.Explore.download">Télécharger</message>
@@ -206,26 +216,54 @@
<message id="Lms.Explore.filter-added">Filtre ajouté</message>
<message id="Lms.Explore.filters">Filtres</message>
<message id="Lms.Explore.label">Label</message>
<message id="Lms.Explore.lyricist">
<plural case="0">Parolier</plural>
<plural case="1">Paroliers</plural>
</message>
<message id="Lms.Explore.media-library">Bibliothèque musicale</message>
<message id="Lms.Explore.mixer">
<plural case="0">Mixeur</plural>
<plural case="1">Mixeurs</plural>
</message>
<message id="Lms.Explore.most-played">Plus joués</message>
<message id="Lms.Explore.musicbrainz-artist">MusicBrainz Artist</message>
<message id="Lms.Explore.musicbrainz-release">MusicBrainz Release</message>
<message id="Lms.Explore.performer">
<plural case="0">Interprète</plural>
<plural case="1">Interprètes</plural>
</message>
<message id="Lms.Explore.play">Jouer</message>
<message id="Lms.Explore.play-last">Jouer en dernier</message>
<message id="Lms.Explore.play-next">Jouer ensuite</message>
<message id="Lms.Explore.play-shuffled">Jouer aléatoirement</message>
<message id="Lms.Explore.playcount">Nombre d'écoutes</message>
<message id="Lms.Explore.producer">
<plural case="0">Producteur</plural>
<plural case="1">Producteurs</plural>
</message>
<message id="Lms.Explore.random">Aléatoire</message>
<message id="Lms.Explore.recently-added">Ajoutés récemment</message>
<message id="Lms.Explore.recently-modified">Modifiés récemment</message>
<message id="Lms.Explore.recently-played">Joués récemment</message>
<message id="Lms.Explore.release-artist">
<plural case="0">Artiste d'album</plural>
<plural case="1">Artistes d'album</plural>
</message>
<message id="Lms.Explore.release-info">Informations sur l'album</message>
<message id="Lms.Explore.release-type">Type de publication</message>
<message id="Lms.Explore.releases">Albums</message>
<message id="Lms.Explore.remixer">
<plural case="0">Remixeur</plural>
<plural case="1">Remixeurs</plural>
</message>
<message id="Lms.Explore.search">Rechercher</message>
<message id="Lms.Explore.star">Ajouter aux favoris</message>
<message id="Lms.Explore.star-item">Ajouter {1} aux favoris</message>
<message id="Lms.Explore.starred">Favoris</message>
<message id="Lms.Explore.track-artist">
<plural case="0">Artiste de piste</plural>
<plural case="1">Artistes de piste</plural>
</message>
<message id="Lms.Explore.track-info">Informations sur la piste</message>
<message id="Lms.Explore.track-lyrics">Paroles</message>
<message id="Lms.Explore.tracklists">Playlists</message>
@@ -241,45 +279,6 @@
<message id="Lms.Explore.Artist.biography">Biographie</message>
<message id="Lms.Explore.Artist.similar-artists">Artistes similaires</message>
<!--Explore:Artists-->
<message id="Lms.Explore.Artists.all">Tous les artistes</message>
<message id="Lms.Explore.Artists.composer">
<plural case="0">Compositeur</plural>
<plural case="1">Compositeurs</plural>
</message>
<message id="Lms.Explore.Artists.conductor">
<plural case="0">Chef d'orchestre</plural>
<plural case="1">Chefs d'orchestre</plural>
</message>
<message id="Lms.Explore.Artists.lyricist">
<plural case="0">Parolier</plural>
<plural case="1">Paroliers</plural>
</message>
<message id="Lms.Explore.Artists.mixer">
<plural case="0">Mixeur</plural>
<plural case="1">Mixeurs</plural>
</message>
<message id="Lms.Explore.Artists.performer">
<plural case="0">Interprète</plural>
<plural case="1">Interprètes</plural>
</message>
<message id="Lms.Explore.Artists.producer">
<plural case="0">Producteur</plural>
<plural case="1">Producteurs</plural>
</message>
<message id="Lms.Explore.Artists.release-artist">
<plural case="0">Artiste d'album</plural>
<plural case="1">Artistes d'album</plural>
</message>
<message id="Lms.Explore.Artists.remixer">
<plural case="0">Remixeur</plural>
<plural case="1">Remixeurs</plural>
</message>
<message id="Lms.Explore.Artists.track-artist">
<plural case="0">Artiste de piste</plural>
<plural case="1">Artistes de piste</plural>
</message>
<!--Explore:Release-->
<message id="Lms.Explore.Release.copyright">Copyright</message>
<message id="Lms.Explore.Release.disc">Disque {1}</message>
+38 -39
View File
@@ -196,9 +196,19 @@
<!--Explore-->
<message id="Lms.Explore.add-filter">Aggiungi filtro</message>
<message id="Lms.Explore.all">Tutti</message>
<message id="Lms.Explore.all-artists">Tutti gli artisti</message>
<message id="Lms.Explore.all-roles">Tutti i ruoli</message>
<message id="Lms.Explore.artists">Artisti</message>
<message id="Lms.Explore.bitrate">Bitrate</message>
<message id="Lms.Explore.codec">Codec</message>
<message id="Lms.Explore.composer">
<plural case="0">Compositore</plural>
<plural case="1">Compositori</plural>
</message>
<message id="Lms.Explore.conductor">
<plural case="0">Direttore d'orchestra</plural>
<plural case="1">Direttori d'orchestra</plural>
</message>
<message id="Lms.Explore.copyright">Diritti d'autore</message>
<message id="Lms.Explore.cover-art">Copertina</message>
<message id="Lms.Explore.download">Download</message>
@@ -206,26 +216,54 @@
<message id="Lms.Explore.filter-added">Filtro aggiunto</message>
<message id="Lms.Explore.filters">Filtri</message>
<message id="Lms.Explore.label">Etichetta</message>
<message id="Lms.Explore.lyricist">
<plural case="0">Paroliere</plural>
<plural case="1">Parolieri</plural>
</message>
<message id="Lms.Explore.media-library">Libreria musicale</message>
<message id="Lms.Explore.mixer">
<plural case="0">Tecnico del mixaggio</plural>
<plural case="1">Tecnici del mixaggio</plural>
</message>
<message id="Lms.Explore.most-played">Più ascoltati</message>
<message id="Lms.Explore.musicbrainz-artist">Artista MusicBrainz</message>
<message id="Lms.Explore.musicbrainz-release">Album MusicBrainz</message>
<message id="Lms.Explore.performer">
<plural case="0">Interprete</plural>
<plural case="1">Interpreti</plural>
</message>
<message id="Lms.Explore.play">Riproduci</message>
<message id="Lms.Explore.play-last">Aggiungi alla coda di riproduzione</message>
<message id="Lms.Explore.play-next">Riproduci successiva</message>
<message id="Lms.Explore.play-shuffled">Riproduci mischiando</message>
<message id="Lms.Explore.playcount">Conteggio riproduzioni</message>
<message id="Lms.Explore.producer">
<plural case="0">Produttore</plural>
<plural case="1">Produttori</plural>
</message>
<message id="Lms.Explore.random">Casuali</message>
<message id="Lms.Explore.recently-added">Aggiunti di recente</message>
<message id="Lms.Explore.recently-modified">Modificati di recente</message>
<message id="Lms.Explore.recently-played">Riprodotti di recente</message>
<message id="Lms.Explore.release-artist">
<plural case="0">Artista dell'album</plural>
<plural case="1">Artisti dell'album</plural>
</message>
<message id="Lms.Explore.release-info">Informazioni sull'album</message>
<message id="Lms.Explore.release-type">Tipo di pubblicazione</message>
<message id="Lms.Explore.releases">Album</message>
<message id="Lms.Explore.remixer">
<plural case="0">Remixer</plural>
<plural case="1">Remixers</plural>
</message>
<message id="Lms.Explore.search">Ricerca</message>
<message id="Lms.Explore.star">Aggiungi ai preferiti</message>
<message id="Lms.Explore.star-item">Aggiungi {1} ai preferiti</message>
<message id="Lms.Explore.starred">Preferiti</message>
<message id="Lms.Explore.track-artist">
<plural case="0">Artista della traccia</plural>
<plural case="1">Artisti della traccia</plural>
</message>
<message id="Lms.Explore.track-info">Informazioni sulla traccia</message>
<message id="Lms.Explore.track-lyrics">Testo</message>
<message id="Lms.Explore.tracklists">Playlist</message>
@@ -241,45 +279,6 @@
<message id="Lms.Explore.Artist.biography">Biografia</message>
<message id="Lms.Explore.Artist.similar-artists">Artisti simili</message>
<!--Explore:Artists-->
<message id="Lms.Explore.Artists.all">Tutti gli artisti</message>
<message id="Lms.Explore.Artists.composer">
<plural case="0">Compositore</plural>
<plural case="1">Compositori</plural>
</message>
<message id="Lms.Explore.Artists.conductor">
<plural case="0">Direttore d'orchestra</plural>
<plural case="1">Direttori d'orchestra</plural>
</message>
<message id="Lms.Explore.Artists.lyricist">
<plural case="0">Paroliere</plural>
<plural case="1">Parolieri</plural>
</message>
<message id="Lms.Explore.Artists.mixer">
<plural case="0">Tecnico del mixaggio</plural>
<plural case="1">Tecnici del mixaggio</plural>
</message>
<message id="Lms.Explore.Artists.performer">
<plural case="0">Interprete</plural>
<plural case="1">Interpreti</plural>
</message>
<message id="Lms.Explore.Artists.producer">
<plural case="0">Produttore</plural>
<plural case="1">Produttori</plural>
</message>
<message id="Lms.Explore.Artists.release-artist">
<plural case="0">Artista dell'album</plural>
<plural case="1">Artisti dell'album</plural>
</message>
<message id="Lms.Explore.Artists.remixer">
<plural case="0">Remixer</plural>
<plural case="1">Remixers</plural>
</message>
<message id="Lms.Explore.Artists.track-artist">
<plural case="0">Artista della traccia</plural>
<plural case="1">Artisti della traccia</plural>
</message>
<!--Explore:Release-->
<message id="Lms.Explore.Release.copyright">Copyright</message>
<message id="Lms.Explore.Release.disc">Disco {1}</message>
+47 -48
View File
@@ -213,9 +213,21 @@
<!--Explore-->
<message id="Lms.Explore.add-filter">Dodaj filtr</message>
<message id="Lms.Explore.all">Wszystko</message>
<message id="Lms.Explore.all-artists">Wszyscy artyści</message>
<message id="Lms.Explore.all-roles">Wszystkie role</message>
<message id="Lms.Explore.artists">Artyści</message>
<message id="Lms.Explore.bitrate">Przepływność</message>
<message id="Lms.Explore.codec">Kodek</message>
<message id="Lms.Explore.composer">
<plural case="0">Kompozytor</plural>
<plural case="1">Kompozytorzy</plural>
<plural case="2">Kompozytorów</plural>
</message>
<message id="Lms.Explore.conductor">
<plural case="0">Dyrygent</plural>
<plural case="1">Dyrygenci</plural>
<plural case="2">Dyrygentów</plural>
</message>
<message id="Lms.Explore.copyright">Prawa autorskie</message>
<message id="Lms.Explore.cover-art">Okładka</message>
<message id="Lms.Explore.download">Pobierz</message>
@@ -223,26 +235,61 @@
<message id="Lms.Explore.filter-added">Filtr dodany</message>
<message id="Lms.Explore.filters">Filtry</message>
<message id="Lms.Explore.label">Wytwórnia</message>
<message id="Lms.Explore.lyricist">
<plural case="0">Tekściarz</plural>
<plural case="1">Tekściarze</plural>
<plural case="2">Tekściarzy</plural>
</message>
<message id="Lms.Explore.media-library">Biblioteka muzyczna</message>
<message id="Lms.Explore.mixer">
<plural case="0">Mikser</plural>
<plural case="1">Mikserzy</plural>
<plural case="2">Mikserów</plural>
</message>
<message id="Lms.Explore.most-played">Najczęściej odtwarzane</message>
<message id="Lms.Explore.musicbrainz-artist">Artysta w MusicBrainz</message>
<message id="Lms.Explore.musicbrainz-release">Wydanie w MusicBrainz</message>
<message id="Lms.Explore.performer">
<plural case="0">Wykonawca</plural>
<plural case="1">Wykonawcy</plural>
<plural case="2">Wykonawców</plural>
</message>
<message id="Lms.Explore.play">Odtwarzaj</message>
<message id="Lms.Explore.play-last">Odtwórz na końcu</message>
<message id="Lms.Explore.play-next">Odtwórz po obecnym</message>
<message id="Lms.Explore.play-shuffled">Odtwarzaj losowo</message>
<message id="Lms.Explore.playcount">Liczba odtworzeń</message>
<message id="Lms.Explore.producer">
<plural case="0">Producent</plural>
<plural case="1">Producenci</plural>
<plural case="2">Producentów</plural>
</message>
<message id="Lms.Explore.random">Losowo</message>
<message id="Lms.Explore.recently-added">Ostatnio dodane</message>
<message id="Lms.Explore.recently-modified">Ostatnio zmienione</message>
<message id="Lms.Explore.recently-played">Ostatnio odtwarzane</message>
<message id="Lms.Explore.release-artist">
<plural case="0">Artysta albumu</plural>
<plural case="1">Artyści albumu</plural>
<plural case="2">Artystów albumu</plural>
</message>
<message id="Lms.Explore.release-info">Informacje o wydaniu</message>
<message id="Lms.Explore.release-type">Typ wydania</message>
<message id="Lms.Explore.releases">Albumy</message>
<message id="Lms.Explore.remixer">
<plural case="0">Remikser</plural>
<plural case="1">Remikserzy</plural>
<plural case="2">Remikserów</plural>
</message>
<message id="Lms.Explore.search">Szukaj</message>
<message id="Lms.Explore.star">Wyróżnij</message>
<message id="Lms.Explore.star-item">Dodaj {1} do ulubionych</message>
<message id="Lms.Explore.starred">Wyróżnione</message>
<message id="Lms.Explore.track-artist">
<plural case="0">Artysta utworu</plural>
<plural case="1">Artyści utworu</plural>
<plural case="2">Artystów utworu</plural>
</message>
<message id="Lms.Explore.track-info">Informacje o ścieżce</message>
<message id="Lms.Explore.track-lyrics">Tekst</message>
<message id="Lms.Explore.tracklists">Listy odtwarzania</message>
@@ -258,54 +305,6 @@
<message id="Lms.Explore.Artist.biography">Biografia</message>
<message id="Lms.Explore.Artist.similar-artists">Podobni artyści</message>
<!--Explore:Artists-->
<message id="Lms.Explore.Artists.all">Wszyscy artyści</message>
<message id="Lms.Explore.Artists.composer">
<plural case="0">Kompozytor</plural>
<plural case="1">Kompozytorzy</plural>
<plural case="2">Kompozytorzy</plural>
</message>
<message id="Lms.Explore.Artists.conductor">
<plural case="0">Dyrygent</plural>
<plural case="1">Dyrygenci</plural>
<plural case="2">Dyrygenci</plural>
</message>
<message id="Lms.Explore.Artists.lyricist">
<plural case="0">Tekściarz</plural>
<plural case="1">Tekściarze</plural>
<plural case="2">Tekściarze</plural>
</message>
<message id="Lms.Explore.Artists.mixer">
<plural case="0">Realizator</plural>
<plural case="1">Realizatorzy</plural>
<plural case="2">Realizatorzy</plural>
</message>
<message id="Lms.Explore.Artists.performer">
<plural case="0">Wykonawca</plural>
<plural case="1">Wykonawcy</plural>
<plural case="2">Wykonawcy</plural>
</message>
<message id="Lms.Explore.Artists.producer">
<plural case="0">Producent</plural>
<plural case="1">Producenci</plural>
<plural case="2">Producenci</plural>
</message>
<message id="Lms.Explore.Artists.release-artist">
<plural case="0">Artysta z albumu</plural>
<plural case="1">Artyści z albumu</plural>
<plural case="2">Artyści z albumu</plural>
</message>
<message id="Lms.Explore.Artists.remixer">
<plural case="0">Remixer</plural>
<plural case="1">Remikserzy</plural>
<plural case="2">Remikserzy</plural>
</message>
<message id="Lms.Explore.Artists.track-artist">
<plural case="0">Artysta ze ścieżki</plural>
<plural case="1">Artyści ze ścieżki</plural>
<plural case="2">Artyści ze ścieżki</plural>
</message>
<!--Explore:Release-->
<message id="Lms.Explore.Release.copyright">Prawa autorskie</message>
<message id="Lms.Explore.Release.disc">Dysk {1}</message>
+11 -12
View File
@@ -194,9 +194,13 @@
<!--Explore-->
<message id="Lms.Explore.add-filter">添加过滤器</message>
<message id="Lms.Explore.all">全部</message>
<message id="Lms.Explore.all-artists">所有艺术家</message>
<message id="Lms.Explore.all-roles">所有角色</message>
<message id="Lms.Explore.artists">歌手</message>
<message id="Lms.Explore.bitrate">比特率</message>
<message id="Lms.Explore.codec">编码器</message>
<message id="Lms.Explore.composer">作曲者</message>
<message id="Lms.Explore.conductor">指挥</message>
<message id="Lms.Explore.copyright">版权所有</message>
<message id="Lms.Explore.cover-art">封面</message>
<message id="Lms.Explore.download">下载</message>
@@ -204,26 +208,33 @@
<message id="Lms.Explore.filter-added">过滤器已添加</message>
<message id="Lms.Explore.filters">过滤器</message>
<message id="Lms.Explore.label">厂牌</message>
<message id="Lms.Explore.lyricist">作词者</message>
<message id="Lms.Explore.media-library">音乐库</message>
<message id="Lms.Explore.mixer">混音师</message>
<message id="Lms.Explore.most-played">播放最多</message>
<message id="Lms.Explore.musicbrainz-artist">MusicBrainz 歌手</message>
<message id="Lms.Explore.musicbrainz-release">MusicBrainz 专辑</message>
<message id="Lms.Explore.performer">表演者</message>
<message id="Lms.Explore.play">播放</message>
<message id="Lms.Explore.play-last">最后播放</message>
<message id="Lms.Explore.play-next">下一首播放</message>
<message id="Lms.Explore.play-shuffled">随机播放</message>
<message id="Lms.Explore.playcount">播放次数</message>
<message id="Lms.Explore.producer">制作人</message>
<message id="Lms.Explore.random">随机</message>
<message id="Lms.Explore.recently-added">最近添加</message>
<message id="Lms.Explore.recently-modified">最近更改</message>
<message id="Lms.Explore.recently-played">最近播放</message>
<message id="Lms.Explore.release-artist">专辑艺术家</message>
<message id="Lms.Explore.release-info">专辑信息</message>
<message id="Lms.Explore.release-type">专辑类型</message>
<message id="Lms.Explore.releases">专辑</message>
<message id="Lms.Explore.remixer">混音师</message>
<message id="Lms.Explore.search">搜索</message>
<message id="Lms.Explore.star">收藏</message>
<message id="Lms.Explore.star-item">将 {1} 加入收藏</message>
<message id="Lms.Explore.starred">已收藏</message>
<message id="Lms.Explore.track-artist">曲目艺术家</message>
<message id="Lms.Explore.track-info">曲目信息</message>
<message id="Lms.Explore.track-lyrics">歌词</message>
<message id="Lms.Explore.tracklists">播放列表</message>
@@ -239,18 +250,6 @@
<message id="Lms.Explore.Artist.biography">简介</message>
<message id="Lms.Explore.Artist.similar-artists">相似歌手</message>
<!--Explore:Artists-->
<message id="Lms.Explore.Artists.all">所有艺术家</message>
<message id="Lms.Explore.Artists.composer">作曲者</message>
<message id="Lms.Explore.Artists.conductor">指挥</message>
<message id="Lms.Explore.Artists.lyricist">作词者</message>
<message id="Lms.Explore.Artists.mixer">混音师</message>
<message id="Lms.Explore.Artists.performer">表演者</message>
<message id="Lms.Explore.Artists.producer">制作人</message>
<message id="Lms.Explore.Artists.release-artist">专辑艺术家</message>
<message id="Lms.Explore.Artists.remixer">混音师</message>
<message id="Lms.Explore.Artists.track-artist">曲目艺术家</message>
<!--Explore:Release-->
<message id="Lms.Explore.Release.copyright">版权所有</message>
<message id="Lms.Explore.Release.disc">唱片 {1}</message>
+1
View File
@@ -49,6 +49,7 @@ add_executable(lms
ui/explore/ReleasesView.cpp
ui/explore/ReleaseView.cpp
ui/explore/ReleaseTypes.cpp
ui/explore/TrackArtistTypeSelector.cpp
ui/explore/TrackCollector.cpp
ui/explore/TrackListHelpers.cpp
ui/explore/TrackListView.cpp
+7 -7
View File
@@ -459,13 +459,13 @@ namespace lms::ui
_artistReleaseSortMethodModel->add(Wt::WString::tr("Lms.Settings.name"), db::ReleaseSortMethod::Name);
_artistRelationshipsModel = std::make_shared<ArtistRelationshipsModel>();
_artistRelationshipsModel->add(Wt::WString::trn("Lms.Explore.Artists.composer", 2), db::TrackArtistLinkType::Composer);
_artistRelationshipsModel->add(Wt::WString::trn("Lms.Explore.Artists.conductor", 2), db::TrackArtistLinkType::Conductor);
_artistRelationshipsModel->add(Wt::WString::trn("Lms.Explore.Artists.lyricist", 2), db::TrackArtistLinkType::Lyricist);
_artistRelationshipsModel->add(Wt::WString::trn("Lms.Explore.Artists.mixer", 2), db::TrackArtistLinkType::Mixer);
_artistRelationshipsModel->add(Wt::WString::trn("Lms.Explore.Artists.performer", 2), db::TrackArtistLinkType::Performer);
_artistRelationshipsModel->add(Wt::WString::trn("Lms.Explore.Artists.producer", 2), db::TrackArtistLinkType::Producer);
_artistRelationshipsModel->add(Wt::WString::trn("Lms.Explore.Artists.remixer", 2), db::TrackArtistLinkType::Remixer);
_artistRelationshipsModel->add(Wt::WString::trn("Lms.Explore.composer", 2), db::TrackArtistLinkType::Composer);
_artistRelationshipsModel->add(Wt::WString::trn("Lms.Explore.conductor", 2), db::TrackArtistLinkType::Conductor);
_artistRelationshipsModel->add(Wt::WString::trn("Lms.Explore.lyricist", 2), db::TrackArtistLinkType::Lyricist);
_artistRelationshipsModel->add(Wt::WString::trn("Lms.Explore.mixer", 2), db::TrackArtistLinkType::Mixer);
_artistRelationshipsModel->add(Wt::WString::trn("Lms.Explore.performer", 2), db::TrackArtistLinkType::Performer);
_artistRelationshipsModel->add(Wt::WString::trn("Lms.Explore.producer", 2), db::TrackArtistLinkType::Producer);
_artistRelationshipsModel->add(Wt::WString::trn("Lms.Explore.remixer", 2), db::TrackArtistLinkType::Remixer);
_transcodingModeModeModel = std::make_shared<TranscodingModeModel>();
_transcodingModeModeModel->add(Wt::WString::tr("Lms.Settings.transcoding-mode.always"), MediaPlayer::Settings::Transcoding::Mode::Always);
+14 -14
View File
@@ -407,17 +407,17 @@ namespace lms::ui::utils
});
};
addArtists(db::TrackArtistLinkType::Composer, "Lms.Explore.Artists.composer");
addArtists(db::TrackArtistLinkType::Conductor, "Lms.Explore.Artists.conductor");
addArtists(db::TrackArtistLinkType::Lyricist, "Lms.Explore.Artists.lyricist");
addArtists(db::TrackArtistLinkType::Mixer, "Lms.Explore.Artists.mixer");
addArtists(db::TrackArtistLinkType::Remixer, "Lms.Explore.Artists.remixer");
addArtists(db::TrackArtistLinkType::Producer, "Lms.Explore.Artists.producer");
addArtists(db::TrackArtistLinkType::Composer, "Lms.Explore.composer");
addArtists(db::TrackArtistLinkType::Conductor, "Lms.Explore.conductor");
addArtists(db::TrackArtistLinkType::Lyricist, "Lms.Explore.lyricist");
addArtists(db::TrackArtistLinkType::Mixer, "Lms.Explore.mixer");
addArtists(db::TrackArtistLinkType::Remixer, "Lms.Explore.remixer");
addArtists(db::TrackArtistLinkType::Producer, "Lms.Explore.producer");
addPerformerArtists();
if (!rolelessPerformers.empty())
{
Wt::WString performersStr{ Wt::WString::trn("Lms.Explore.Artists.performer", rolelessPerformers.size()) };
Wt::WString performersStr{ Wt::WString::trn("Lms.Explore.performer", rolelessPerformers.size()) };
artistMap[performersStr] = std::move(rolelessPerformers);
}
@@ -458,17 +458,17 @@ namespace lms::ui::utils
});
};
addArtists(db::TrackArtistLinkType::Composer, "Lms.Explore.Artists.composer");
addArtists(db::TrackArtistLinkType::Conductor, "Lms.Explore.Artists.conductor");
addArtists(db::TrackArtistLinkType::Lyricist, "Lms.Explore.Artists.lyricist");
addArtists(db::TrackArtistLinkType::Mixer, "Lms.Explore.Artists.mixer");
addArtists(db::TrackArtistLinkType::Remixer, "Lms.Explore.Artists.remixer");
addArtists(db::TrackArtistLinkType::Producer, "Lms.Explore.Artists.producer");
addArtists(db::TrackArtistLinkType::Composer, "Lms.Explore.composer");
addArtists(db::TrackArtistLinkType::Conductor, "Lms.Explore.conductor");
addArtists(db::TrackArtistLinkType::Lyricist, "Lms.Explore.lyricist");
addArtists(db::TrackArtistLinkType::Mixer, "Lms.Explore.mixer");
addArtists(db::TrackArtistLinkType::Remixer, "Lms.Explore.remixer");
addArtists(db::TrackArtistLinkType::Producer, "Lms.Explore.producer");
addPerformerArtists();
if (!rolelessPerformers.empty())
{
Wt::WString performersStr{ Wt::WString::trn("Lms.Explore.Artists.performer", rolelessPerformers.size()) };
Wt::WString performersStr{ Wt::WString::trn("Lms.Explore.performer", rolelessPerformers.size()) };
artistMap[performersStr] = std::move(rolelessPerformers);
}
+10 -10
View File
@@ -30,16 +30,16 @@ namespace lms::ui
ArtistTypeSelector(ArtistType defaultArtistType)
: DropDownMenuSelector{ Wt::WString::tr("Lms.Explore.Artists.template.artist-type-selector"), defaultArtistType }
{
bindItem("artist-type-all", Wt::WString::tr("Lms.Explore.Artists.all"), AllArtistsTag{});
bindItem("artist-type-release-artist", Wt::WString::trn("Lms.Explore.Artists.release-artist", 2), ReleaseArtistsTag{});
bindItem("artist-type-track-artist", Wt::WString::trn("Lms.Explore.Artists.track-artist", 2), db::TrackArtistLinkType::Artist);
bindItem("artist-type-composer", Wt::WString::trn("Lms.Explore.Artists.composer", 2), db::TrackArtistLinkType::Composer);
bindItem("artist-type-conductor", Wt::WString::trn("Lms.Explore.Artists.conductor", 2), db::TrackArtistLinkType::Conductor);
bindItem("artist-type-lyricist", Wt::WString::trn("Lms.Explore.Artists.lyricist", 2), db::TrackArtistLinkType::Lyricist);
bindItem("artist-type-mixer", Wt::WString::trn("Lms.Explore.Artists.mixer", 2), db::TrackArtistLinkType::Mixer);
bindItem("artist-type-performer", Wt::WString::trn("Lms.Explore.Artists.performer", 2), db::TrackArtistLinkType::Performer);
bindItem("artist-type-producer", Wt::WString::trn("Lms.Explore.Artists.producer", 2), db::TrackArtistLinkType::Producer);
bindItem("artist-type-remixer", Wt::WString::trn("Lms.Explore.Artists.remixer", 2), db::TrackArtistLinkType::Remixer);
bindItem("artist-type-all", Wt::WString::tr("Lms.Explore.all-artists"), AllArtistsTag{});
bindItem("artist-type-release-artist", Wt::WString::trn("Lms.Explore.release-artist", 2), ReleaseArtistsTag{});
bindItem("artist-type-track-artist", Wt::WString::trn("Lms.Explore.track-artist", 2), db::TrackArtistLinkType::Artist);
bindItem("artist-type-composer", Wt::WString::trn("Lms.Explore.composer", 2), db::TrackArtistLinkType::Composer);
bindItem("artist-type-conductor", Wt::WString::trn("Lms.Explore.conductor", 2), db::TrackArtistLinkType::Conductor);
bindItem("artist-type-lyricist", Wt::WString::trn("Lms.Explore.lyricist", 2), db::TrackArtistLinkType::Lyricist);
bindItem("artist-type-mixer", Wt::WString::trn("Lms.Explore.mixer", 2), db::TrackArtistLinkType::Mixer);
bindItem("artist-type-performer", Wt::WString::trn("Lms.Explore.performer", 2), db::TrackArtistLinkType::Performer);
bindItem("artist-type-producer", Wt::WString::trn("Lms.Explore.producer", 2), db::TrackArtistLinkType::Producer);
bindItem("artist-type-remixer", Wt::WString::trn("Lms.Explore.remixer", 2), db::TrackArtistLinkType::Remixer);
}
};
} // namespace lms::ui
+67 -14
View File
@@ -19,7 +19,10 @@
#include "ArtistView.hpp"
#include <array>
#include <Wt/WPushButton.h>
#include <Wt/WStackedWidget.h>
#include "core/String.hpp"
#include "database/Session.hpp"
@@ -30,6 +33,8 @@
#include "database/objects/Release.hpp"
#include "database/objects/ScanSettings.hpp"
#include "database/objects/Track.hpp"
#include "database/objects/TrackArtistLink.hpp"
#include "database/objects/Types.hpp"
#include "database/objects/User.hpp"
#include "services/feedback/IFeedbackService.hpp"
#include "services/recommendation/IRecommendationService.hpp"
@@ -40,6 +45,7 @@
#include "LmsApplicationException.hpp"
#include "PlayQueueController.hpp"
#include "ReleaseHelpers.hpp"
#include "TrackArtistTypeSelector.hpp"
#include "TrackListHelpers.hpp"
#include "Utils.hpp"
#include "common/InfiniteScrollingContainer.hpp"
@@ -272,30 +278,77 @@ namespace lms::ui
void Artist::refreshAppearsOnReleases()
{
_appearsOnReleases.clear();
_appearsOnReleaseContainer = {};
db::Release::FindParameters params;
params.setTrackArtist(_artistId);
params.setSortMethod(db::ReleaseSortMethod::OriginalDateDesc);
auto addToReleaseContainer = [&](std::optional<db::TrackArtistLinkType> linkType) -> bool {
db::Release::FindParameters params;
db::Release::find(LmsApp->getDbSession(), params, [this](const db::Release::pointer& release) {
if (!release->hasArtist(_artistId))
_appearsOnReleaseContainer.releases.push_back(release->getId());
});
core::EnumSet<db::TrackArtistLinkType> linkTypes;
if (linkType)
linkTypes.insert(*linkType);
if (!_appearsOnReleaseContainer.releases.empty())
params.setTrackArtist(_artistId, linkTypes);
params.setSortMethod(db::ReleaseSortMethod::OriginalDateDesc);
bool found{};
db::Release::find(LmsApp->getDbSession(), params, [&](const db::Release::pointer& release) {
if (release->hasArtist(_artistId))
return;
_appearsOnReleases[linkType].push_back(release->getId());
found = true;
});
return found;
};
constexpr std::array<std::optional<db::TrackArtistLinkType>, 9> types{
std::nullopt,
db::TrackArtistLinkType::Artist,
db::TrackArtistLinkType::Composer,
db::TrackArtistLinkType::Conductor,
db::TrackArtistLinkType::Lyricist,
db::TrackArtistLinkType::Mixer,
db::TrackArtistLinkType::Performer,
db::TrackArtistLinkType::Producer,
db::TrackArtistLinkType::Remixer,
};
core::EnumSet<db::TrackArtistLinkType> foundTypes;
for (const auto type : types)
{
Wt::WTemplate* releaseContainer{ bindNew<Wt::WTemplate>("appears-on-releases", Wt::WString::tr("Lms.Explore.Artist.template.release-container")) };
releaseContainer->bindString("release-type", Wt::WString::tr("Lms.Explore.Artist.appears-on"));
_appearsOnReleaseContainer.container = releaseContainer->bindNew<InfiniteScrollingContainer>("releases", Wt::WString::tr("Lms.Explore.Releases.template.container"));
_appearsOnReleaseContainer.container->onRequestElements.connect(this, [this] {
if (addToReleaseContainer(type) && type)
foundTypes.insert(*type);
}
if (!_appearsOnReleases.empty())
{
std::optional<db::TrackArtistLinkType> defaultType{ std::nullopt };
if (_appearsOnReleases.size() == 2)
{
auto it{ std::find_if(std::cbegin(_appearsOnReleases), std::cend(_appearsOnReleases), [=](const auto& entry) { return entry.first != defaultType; }) };
if (it != std::cend(_appearsOnReleases))
defaultType = it->first;
}
Wt::WTemplate* appearsOnContainer{ bindNew<Wt::WTemplate>("appears-on-releases", Wt::WString::tr("Lms.Explore.Artist.template.appears-on-container")) };
appearsOnContainer->addFunction("tr", &Wt::WTemplate::Functions::tr);
_appearsOnReleaseContainer.container = appearsOnContainer->bindNew<InfiniteScrollingContainer>("releases", Wt::WString::tr("Lms.Explore.Releases.template.container"));
_appearsOnReleaseContainer.releases = _appearsOnReleases[defaultType];
_appearsOnReleaseContainer.container->onRequestElements.connect(this, [&] {
addSomeReleases(_appearsOnReleaseContainer, { releaseListHelpers::DisplayOptions::ShowYearAndOriginalYear, releaseListHelpers::DisplayOptions::ShowArtist });
});
TrackArtistTypeSelector* trackArtistTypeSelector{ appearsOnContainer->bindNew<TrackArtistTypeSelector>("artist-type", defaultType, foundTypes) };
trackArtistTypeSelector->itemSelected.connect([this](std::optional<db::TrackArtistLinkType> newArtistLinkType) {
_appearsOnReleaseContainer.releases = _appearsOnReleases[newArtistLinkType];
_appearsOnReleaseContainer.container->reset();
});
}
else
{
bindEmpty("appears-on-releases");
}
}
void Artist::refreshNonReleaseTracks()
+4 -1
View File
@@ -20,6 +20,7 @@
#pragma once
#include <map>
#include <optional>
#include "core/EnumSet.hpp"
@@ -31,6 +32,7 @@
#include "ReleaseHelpers.hpp"
#include "ReleaseTypes.hpp"
#include "common/Template.hpp"
#include "database/objects/Types.hpp"
namespace lms::db
{
@@ -76,7 +78,8 @@ namespace lms::ui
std::vector<db::ReleaseId> releases;
};
std::map<ReleaseType, ReleaseContainer> _releaseContainers;
ReleaseContainer _appearsOnReleaseContainer{};
std::map<std::optional<db::TrackArtistLinkType>, std::vector<db::ReleaseId>> _appearsOnReleases;
ReleaseContainer _appearsOnReleaseContainer;
InfiniteScrollingContainer* _trackContainer{};
db::ArtistId _artistId{};
std::string _artistName;
@@ -0,0 +1,60 @@
/*
* Copyright (C) 2026 Emeric Poupon
*
* This file is part of LMS.
*
* LMS is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* LMS is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with LMS. If not, see <http://www.gnu.org/licenses/>.
*/
#include "TrackArtistTypeSelector.hpp"
#include <array>
namespace lms::ui
{
TrackArtistTypeSelector::TrackArtistTypeSelector(std::optional<db::TrackArtistLinkType> defaultRole, core::EnumSet<db::TrackArtistLinkType> types)
: DropDownMenuSelector{ Wt::WString::tr("Lms.Explore.Artist.template.track-artist-type-selector"), defaultRole }
{
struct Entry
{
std::string var;
Wt::WString title;
std::optional<db::TrackArtistLinkType> linkType;
core::LiteralString condition;
};
auto bindItemWithCondition = [&](const std::string& var, const Wt::WString& title, std::optional<db::TrackArtistLinkType> item, core::LiteralString condition) {
if (!condition.empty())
setCondition(condition.c_str(), true);
bindItem(var, title, item);
};
const std::array entries{
Entry{ "artist-type-all", Wt::WString::tr("Lms.Explore.all-roles"), std::nullopt, core::LiteralString{} },
Entry{ "artist-type-track-artist", Wt::WString::trn("Lms.Explore.track-artist", 1), db::TrackArtistLinkType::Artist, "if-has-track-artist" },
Entry{ "artist-type-composer", Wt::WString::trn("Lms.Explore.composer", 1), db::TrackArtistLinkType::Composer, "if-has-composer" },
Entry{ "artist-type-conductor", Wt::WString::trn("Lms.Explore.conductor", 1), db::TrackArtistLinkType::Conductor, "if-has-conductor" },
Entry{ "artist-type-lyricist", Wt::WString::trn("Lms.Explore.lyricist", 1), db::TrackArtistLinkType::Lyricist, "if-has-lyricist" },
Entry{ "artist-type-mixer", Wt::WString::trn("Lms.Explore.mixer", 1), db::TrackArtistLinkType::Mixer, "if-has-mixer" },
Entry{ "artist-type-performer", Wt::WString::trn("Lms.Explore.performer", 1), db::TrackArtistLinkType::Performer, "if-has-performer" },
Entry{ "artist-type-producer", Wt::WString::trn("Lms.Explore.producer", 1), db::TrackArtistLinkType::Producer, "if-has-producer" },
Entry{ "artist-type-remixer", Wt::WString::trn("Lms.Explore.remixer", 1), db::TrackArtistLinkType::Remixer, "if-has-remixer" },
};
for (const Entry& entry : entries)
{
if (!entry.linkType || types.contains(*entry.linkType))
bindItemWithCondition(entry.var, entry.title, entry.linkType, entry.condition);
}
}
} // namespace lms::ui
@@ -0,0 +1,35 @@
/*
* Copyright (C) 2026 Emeric Poupon
*
* This file is part of LMS.
*
* LMS is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* LMS is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with LMS. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
#include "core/EnumSet.hpp"
#include "database/objects/Types.hpp"
#include "DropDownMenuSelector.hpp"
namespace lms::ui
{
class TrackArtistTypeSelector : public DropDownMenuSelector<std::optional<db::TrackArtistLinkType>>
{
public:
TrackArtistTypeSelector(std::optional<db::TrackArtistLinkType> defaultRole, core::EnumSet<db::TrackArtistLinkType> types);
};
} // namespace lms::ui