diff --git a/src/components/smart_playlist/SmartPlaylistRulesForm.vue b/src/components/smart_playlist/SmartPlaylistRulesForm.vue new file mode 100644 index 000000000..fa87c2a05 --- /dev/null +++ b/src/components/smart_playlist/SmartPlaylistRulesForm.vue @@ -0,0 +1,793 @@ + + + + diff --git a/src/layouts/default/CreateSmartPlaylistDialog.vue b/src/layouts/default/CreateSmartPlaylistDialog.vue new file mode 100644 index 000000000..8cfbf542a --- /dev/null +++ b/src/layouts/default/CreateSmartPlaylistDialog.vue @@ -0,0 +1,209 @@ + + + + diff --git a/src/layouts/default/EditSmartPlaylistDialog.vue b/src/layouts/default/EditSmartPlaylistDialog.vue new file mode 100644 index 000000000..733a4a99b --- /dev/null +++ b/src/layouts/default/EditSmartPlaylistDialog.vue @@ -0,0 +1,145 @@ + + + + diff --git a/src/layouts/default/PlayerOSD/PlayerControlBtn/PlayerTrackMenu.vue b/src/layouts/default/PlayerOSD/PlayerControlBtn/PlayerTrackMenu.vue index fd56f8599..1913ff524 100644 --- a/src/layouts/default/PlayerOSD/PlayerControlBtn/PlayerTrackMenu.vue +++ b/src/layouts/default/PlayerOSD/PlayerControlBtn/PlayerTrackMenu.vue @@ -67,7 +67,9 @@ const radioModeSupported = computed(() => { const item = currentTrack.value; if (!item) return false; // hide radio mode for dynamic playlists - const queue = store.activePlayer ? api.queues[store.activePlayer.player_id] : undefined; + const queue = store.activePlayer + ? api.queues[store.activePlayer.player_id] + : undefined; if (isQueueDynamicPlaylist(queue)) return false; for (const provId of item.provider_mappings) { if ( diff --git a/src/layouts/default/PlayerOSD/PlayerControlBtn/RepeatBtn.vue b/src/layouts/default/PlayerOSD/PlayerControlBtn/RepeatBtn.vue index 602fd8aca..18f3e3092 100644 --- a/src/layouts/default/PlayerOSD/PlayerControlBtn/RepeatBtn.vue +++ b/src/layouts/default/PlayerOSD/PlayerControlBtn/RepeatBtn.vue @@ -45,10 +45,7 @@ defineOptions({ inheritAttrs: false }); import Icon, { IconProps } from "@/components/Icon.vue"; import { getValueFromSources } from "@/helpers/utils"; import api from "@/plugins/api"; -import { - PlayerQueue, - RepeatMode, -} from "@/plugins/api/interfaces"; +import { PlayerQueue, RepeatMode } from "@/plugins/api/interfaces"; import { isQueueDynamicPlaylist } from "@/plugins/api/helpers"; import { computed } from "vue"; import { IconRepeat, IconRepeatOff, IconRepeatOnce } from "@tabler/icons-vue"; @@ -72,5 +69,7 @@ const isLoading = computed(() => { ); }); -const isSingleDynamicPlaylist = computed(() => isQueueDynamicPlaylist(compProps.playerQueue)); +const isSingleDynamicPlaylist = computed(() => + isQueueDynamicPlaylist(compProps.playerQueue), +); diff --git a/src/layouts/default/PlayerOSD/PlayerControlBtn/ShuffleBtn.vue b/src/layouts/default/PlayerOSD/PlayerControlBtn/ShuffleBtn.vue index ee8734f6a..996eb9fd0 100644 --- a/src/layouts/default/PlayerOSD/PlayerControlBtn/ShuffleBtn.vue +++ b/src/layouts/default/PlayerOSD/PlayerControlBtn/ShuffleBtn.vue @@ -57,5 +57,7 @@ const isLoading = computed(() => { ); }); -const isSingleDynamicPlaylist = computed(() => isQueueDynamicPlaylist(compProps.playerQueue)); +const isSingleDynamicPlaylist = computed(() => + isQueueDynamicPlaylist(compProps.playerQueue), +); diff --git a/src/layouts/default/View.vue b/src/layouts/default/View.vue index f8ab01b76..ef307d1b9 100644 --- a/src/layouts/default/View.vue +++ b/src/layouts/default/View.vue @@ -18,6 +18,7 @@ + @@ -45,6 +46,7 @@ import LinkGenreDialog from "@/components/genre/LinkGenreDialog.vue"; import MergeGenreDialog from "@/components/genre/MergeGenreDialog.vue"; import AddToPlaylistDialog from "./AddToPlaylistDialog.vue"; import CreatePlaylistDialog from "./CreatePlaylistDialog.vue"; +import CreateSmartPlaylistDialog from "./CreateSmartPlaylistDialog.vue"; import ImportPlaylistDialog from "./ImportPlaylistDialog.vue"; import ItemContextMenu from "./ItemContextMenu.vue"; import AddManualLink from "@/components/AddManualLink.vue"; diff --git a/src/plugins/api/helpers.ts b/src/plugins/api/helpers.ts index 9ad8cee84..33bfcb444 100644 --- a/src/plugins/api/helpers.ts +++ b/src/plugins/api/helpers.ts @@ -1,13 +1,22 @@ // several helpers for dealing with the api and its (media) items import api from "."; -import { MediaItemType, ItemMapping, MediaType, Player, PlayerQueue, Playlist } from "./interfaces"; +import { + MediaItemType, + ItemMapping, + MediaType, + Player, + PlayerQueue, + Playlist, +} from "./interfaces"; /** * Returns true when the given queue is currently playing a single dynamic playlist. * In that case, shuffle, repeat, radio mode, and don't-stop-the-music should be hidden. */ -export const isQueueDynamicPlaylist = function (queue: PlayerQueue | undefined): boolean { +export const isQueueDynamicPlaylist = function ( + queue: PlayerQueue | undefined, +): boolean { const source = queue?.radio_source; return ( source?.length === 1 && diff --git a/src/plugins/api/index.ts b/src/plugins/api/index.ts index 3b3e50d7e..5020316d5 100644 --- a/src/plugins/api/index.ts +++ b/src/plugins/api/index.ts @@ -53,6 +53,8 @@ import { RemoteAccessInfo, RepeatMode, SearchResults, + SmartPlaylistEntry, + SmartPlaylistRules, UserRole, } from "./interfaces"; @@ -812,6 +814,63 @@ export class MusicAssistantApi { }); } + public createSmartPlaylist( + name: string, + rules: SmartPlaylistRules, + is_dynamic: boolean = true, + ): Promise { + return this.sendCommand("smart_playlists/create", { + name, + rules, + is_dynamic, + }); + } + + public generateSmartPlaylist( + name: string, + rules: SmartPlaylistRules, + count?: number, + ): Promise { + return this.sendCommand("smart_playlists/generate", { + name, + rules, + count, + }); + } + + public getSmartPlaylistRules( + db_playlist_id: string | number, + ): Promise { + return this.sendCommand("smart_playlists/get_rules", { + playlist_id: db_playlist_id, + }); + } + + public updateSmartPlaylistRules( + db_playlist_id: string | number, + rules: SmartPlaylistRules, + ): Promise { + return this.sendCommand("smart_playlists/update_rules", { + playlist_id: db_playlist_id, + rules, + }); + } + + public listSmartPlaylists(): Promise { + return this.sendCommand("smart_playlists/list", {}); + } + + public previewSmartPlaylistTracks( + rules: SmartPlaylistRules, + limit: number = 10, + ): Promise { + return this.sendCommand("smart_playlists/preview_tracks", { rules, limit }); + } + + public countSmartPlaylistTracks(rules: SmartPlaylistRules): Promise { + return this.sendCommand("smart_playlists/count_tracks", { rules }); + } + /** * Get Radio stations listing from the server. * @param favorite - Filter by favorite status diff --git a/src/plugins/api/interfaces.ts b/src/plugins/api/interfaces.ts index 571891858..b7d096bc9 100644 --- a/src/plugins/api/interfaces.ts +++ b/src/plugins/api/interfaces.ts @@ -1241,3 +1241,27 @@ export interface PartyConfig { hide_back_button: boolean; show_progress_bar: boolean; } + +export interface SmartPlaylistRules { + genre_ids: number[]; + artist_ids: number[]; + album_ids: number[]; + favorites_only: boolean; + seed_track_uri?: string; + seed_track_name?: string; + min_popularity?: number; + logic: "AND" | "OR"; + limit: number; + genre_names?: Record; + artist_names?: Record; + album_names?: Record; + year_from?: number; + year_to?: number; +} + +export interface SmartPlaylistEntry { + db_playlist_id: string; + name: string; + rules: SmartPlaylistRules; + is_dynamic: boolean; +} diff --git a/src/plugins/eventbus.ts b/src/plugins/eventbus.ts index 00be974d8..d0ac23246 100644 --- a/src/plugins/eventbus.ts +++ b/src/plugins/eventbus.ts @@ -46,6 +46,10 @@ export type ImportPlaylistEvent = { playlistName: string; }; +export type CreateSmartPlaylistEvent = { + providerId?: string; +}; + export type Events = { contextmenu: ContextMenuDialogEvent; playlistdialog: PlaylistDialogEvent; @@ -54,6 +58,7 @@ export type Events = { deleteGenreDialog: DeleteGenreDialogEvent; linkGenreDialog: LinkGenreDialogEvent; importPlaylistDialog: ImportPlaylistEvent; + createSmartPlaylist: CreateSmartPlaylistEvent; editItemDialog: Radio | Track | Playlist; clearSelection: void; genreExcluded: void; diff --git a/src/translations/de.json b/src/translations/de.json index 826effab6..fc32eb47e 100644 --- a/src/translations/de.json +++ b/src/translations/de.json @@ -43,7 +43,7 @@ "mass": "Music Assistant", "new_playlist_name": "Gib einen neuen Namen für die neue Wiedergabeliste ein", "no_content": "Keine Einträge gefunden.", - "no_content_filter": "Keine Einträge für die aktuellen Filter-\/Suchkriterien gefunden.", + "no_content_filter": "Keine Einträge für die aktuellen Filter-/Suchkriterien gefunden.", "no_player": "Kein Wiedergabegerät ausgewählt", "off": "Aus", "on": "An", @@ -158,7 +158,7 @@ }, "flow_mode": { "label": "Warteschlangen-„Flow“-Modus aktivieren", - "description": "Aktiviere den „Flow“-Modus, in dem alle Titel der Warteschlange als kontinuierlicher Audiostream gesendet werden. \nVerwende diese Funktion für Wiedergabegeräte, die lückenloses Abspielen und\/oder Überblenden nicht nativ unterstützen oder wenn das Wiedergabegerät Probleme beim Übergang zwischen Titeln hat." + "description": "Aktiviere den „Flow“-Modus, in dem alle Titel der Warteschlange als kontinuierlicher Audiostream gesendet werden. \nVerwende diese Funktion für Wiedergabegeräte, die lückenloses Abspielen und/oder Überblenden nicht nativ unterstützen oder wenn das Wiedergabegerät Probleme beim Übergang zwischen Titeln hat." }, "auto_play": { "label": "Automatische Wiedergabe (Fortsetzen beim Einschalten)", @@ -229,10 +229,10 @@ "description": "Definiere die Standard-Warteschlangenaktion für diesen Medientyp (falls keine bestimmte Aktion gewählt wurde).", "options": { "play": "Spiele jetzt die Titel des Künstlers und behalte die verbleibenden Elemente in der Warteschlange.", - "replace": "Lösche die Warteschlange und spiele den\/die Künstler-Titel ab.", - "next": "Spiele den\/die Titel direkt nach dem derzeit abgespielten\/gepufferten Titel ab.", - "replace_next": "Warteschlange leeren und den\/die Titel direkt nach dem aktuell gespielten\/gepufferten Element abspielen.", - "add": "Füge den\/die Titel des Künstlers am Ende der Warteschlange hinzu." + "replace": "Lösche die Warteschlange und spiele den/die Künstler-Titel ab.", + "next": "Spiele den/die Titel direkt nach dem derzeit abgespielten/gepufferten Titel ab.", + "replace_next": "Warteschlange leeren und den/die Titel direkt nach dem aktuell gespielten/gepufferten Element abspielen.", + "add": "Füge den/die Titel des Künstlers am Ende der Warteschlange hinzu." } }, "default_enqueue_action_album": { @@ -240,21 +240,21 @@ "description": "Definiere die Standard-Warteschlangenaktion für diesen Medientyp (falls keine bestimmte Aktion gewählt wurde).", "options": { "play": "Albumtitel jetzt abspielen und die verbleibenden Warteschlangenelemente beibehalten.", - "replace": "Lösche die Warteschlange und spiele den\/die Album-Titel ab.", - "next": "Spiele den\/die Titel direkt nach dem derzeit abgespielten\/gepufferten Titel ab.", - "replace_next": "Warteschlange leeren und Albumtitel direkt nach dem aktuell abgespielten\/gepufferten Titel abspielen.", - "add": "Füge den\/die Album-Titel am Ende der Warteschlange hinzu." + "replace": "Lösche die Warteschlange und spiele den/die Album-Titel ab.", + "next": "Spiele den/die Titel direkt nach dem derzeit abgespielten/gepufferten Titel ab.", + "replace_next": "Warteschlange leeren und Albumtitel direkt nach dem aktuell abgespielten/gepufferten Titel abspielen.", + "add": "Füge den/die Album-Titel am Ende der Warteschlange hinzu." } }, "default_enqueue_action_track": { "label": "Standardmäßige Warteschlangenoption für Titel.", "description": "Definiere die Standardaktion zum Einreihen in die Warteschlange für diesen Medientyp (falls keine Aktion definiert wurde).", "options": { - "play": "Spiele jetzt den\/die Titel ab und behalte die verbleibenden Warteschlangenelemente.", - "replace": "Lösche die Warteschlange und spiele den\/die Titel ab.", - "next": "Spiele den\/die Titel direkt nach dem aktuell gespielten\/gepufferten Element ab.", - "replace_next": "Lösche die Warteschlange und spiele den\/die Titel direkt nach dem aktuell gespielten\/gepufferten Element ab.", - "add": "Füge den\/die Titel am Ende der Warteschlange hinzu." + "play": "Spiele jetzt den/die Titel ab und behalte die verbleibenden Warteschlangenelemente.", + "replace": "Lösche die Warteschlange und spiele den/die Titel ab.", + "next": "Spiele den/die Titel direkt nach dem aktuell gespielten/gepufferten Element ab.", + "replace_next": "Lösche die Warteschlange und spiele den/die Titel direkt nach dem aktuell gespielten/gepufferten Element ab.", + "add": "Füge den/die Titel am Ende der Warteschlange hinzu." } }, "default_enqueue_action_playlist": { @@ -263,9 +263,9 @@ "options": { "play": "Wiedergabeliste jetzt abspielen und die verbleibenden Warteschlangenelemente beibehalten.", "replace": "Lösche die Warteschlange und spiele die Wiedergabeliste-Titel ab.", - "next": "Spiele den\/die Titel direkt nach dem derzeit abgespielten\/gepufferten Titel ab.", - "replace_next": "Lösche die Warteschlange und spiele den\/die Titel direkt nach dem aktuell gespielten\/gepufferten Element der Wiedergabeliste ab.", - "add": "Füge den\/die Wiedergabelisten-Titel am Ende der Warteschlange hinzu." + "next": "Spiele den/die Titel direkt nach dem derzeit abgespielten/gepufferten Titel ab.", + "replace_next": "Lösche die Warteschlange und spiele den/die Titel direkt nach dem aktuell gespielten/gepufferten Element der Wiedergabeliste ab.", + "add": "Füge den/die Wiedergabelisten-Titel am Ende der Warteschlange hinzu." } }, "default_enqueue_action_radio": { @@ -274,9 +274,9 @@ "options": { "play": "Spiele jetzt den Radiosender ab und behalte die verbleibenden Warteschlangenelemente.", "replace": "Lösche die Warteschlange und spiele den Radiosender ab", - "next": "Spiele das\/die Element(e) direkt nach dem aktuell gespielten\/gepufferten Element ab.", - "replace_next": "Lösche die Warteschlange und spiele den\/die Radiosender direkt nach dem aktuell wiedergegebenen\/gepufferten Element ab.", - "add": "Füge den\/die Radiosender am Ende der Warteschlange hinzu." + "next": "Spiele das/die Element(e) direkt nach dem aktuell gespielten/gepufferten Element ab.", + "replace_next": "Lösche die Warteschlange und spiele den/die Radiosender direkt nach dem aktuell wiedergegebenen/gepufferten Element ab.", + "add": "Füge den/die Radiosender am Ende der Warteschlange hinzu." } }, "default": "Standard", @@ -286,7 +286,7 @@ "generic": "Allgemein", "announcements": "Ankündigungen", "player_controls": "Wiedergabegeräte-Steuerung", - "sync_options": "Synchronisiere\/importiere Optionen", + "sync_options": "Synchronisiere/importiere Optionen", "builtin_playlists": "Integrierte Wiedergabelisten", "web_player": "Web-Player", "playback": "Wiedergabe von Warteschlangen", @@ -323,7 +323,7 @@ }, "icon": { "label": "Icon", - "description": "Material Design Icon für dieses Wiedergabegerät. \n\nSiehe https:\/\/pictogrammers.com\/library\/mdi\/." + "description": "Material Design Icon für dieses Wiedergabegerät. \n\nSiehe https://pictogrammers.com/library/mdi/." }, "theme": { "label": "Theme", @@ -375,7 +375,7 @@ "no_player_providers_detail": "Konfiguriere die Wiedergabegeräte-Anbieter, um Geräte auszuwählen, auf denen Music Assistant deine Musik ausgeben kann.", "volume_normalization_radio": { "label": "Methode zur Normalisierung der Lautstärke für Radiostreams", - "description": "Stelle die bevorzugte Lautstärkenormalisierungsstrategie für Radiostreams ein.\nStandardmäßig erfasst Music Assistant eine Messung der (durchschnittlich wahrgenommenen) Lautstärke des Radiosenders gemäß der EBU-R128-Spezifikation und passt dann den Gesamtpegel\/die Lautstärke des Streams entsprechend dieser Messung an, sodass der Dynamikumfang des Audios nicht beeinträchtigt wird. Falls keine Messung für einen Radiosender vorliegt, greift Music Assistant auf einen dynamischen (aber weniger genauen) Lautstärkeausgleichsfilter zurück.\n\nTipp: Radiostreams haben oft unterschiedliche Lautstärkepegel, besonders bei Durchsagen und Werbespots. Du kannst die dynamische Lautstärkenormalisierung für Radiostreams erzwingen, selbst wenn eine (durchschnittliche) Lautstärkemessung für den Radiosender vorliegt.\n\n**Optionen:**\n- Erzwungene Dynamik – erzwinge zu jeder Zeit dynamische Lautstärkenormalisierung.\n- Nur Messung (kein Fallback) – Wende die (gesamte) Lautstärken-\/Pegelkorrektur basierend auf gespeicherten Messungen an. Wenn keine Messung vorliegt, wird keine Normalisierung angewendet. - Fallback auf Pegelkorrektur – Wende die (gesamte) Lautstärken-\/Pegelkorrektur basierend auf gespeicherten Messungen an. Falls keine Messung vorliegt, greife auf eine vordefinierte Pegelkorrektur zurück. \n- Feste Pegelkorrektur – Wende immer die feste Lautstärken-\/Pegelkorrektur an.\n- Fallback auf Dynamik – wähle automatisch die beste Option: Wende die (gesamte) Lautstärken-\/Pegelkorrektur basierend auf gespeicherten Messungen an, falls vorhanden, und ermögliche einen Fallback auf den dynamischen Modus, wenn keine Messung verfügbar ist.", + "description": "Stelle die bevorzugte Lautstärkenormalisierungsstrategie für Radiostreams ein.\nStandardmäßig erfasst Music Assistant eine Messung der (durchschnittlich wahrgenommenen) Lautstärke des Radiosenders gemäß der EBU-R128-Spezifikation und passt dann den Gesamtpegel/die Lautstärke des Streams entsprechend dieser Messung an, sodass der Dynamikumfang des Audios nicht beeinträchtigt wird. Falls keine Messung für einen Radiosender vorliegt, greift Music Assistant auf einen dynamischen (aber weniger genauen) Lautstärkeausgleichsfilter zurück.\n\nTipp: Radiostreams haben oft unterschiedliche Lautstärkepegel, besonders bei Durchsagen und Werbespots. Du kannst die dynamische Lautstärkenormalisierung für Radiostreams erzwingen, selbst wenn eine (durchschnittliche) Lautstärkemessung für den Radiosender vorliegt.\n\n**Optionen:**\n- Erzwungene Dynamik – erzwinge zu jeder Zeit dynamische Lautstärkenormalisierung.\n- Nur Messung (kein Fallback) – Wende die (gesamte) Lautstärken-/Pegelkorrektur basierend auf gespeicherten Messungen an. Wenn keine Messung vorliegt, wird keine Normalisierung angewendet. - Fallback auf Pegelkorrektur – Wende die (gesamte) Lautstärken-/Pegelkorrektur basierend auf gespeicherten Messungen an. Falls keine Messung vorliegt, greife auf eine vordefinierte Pegelkorrektur zurück. \n- Feste Pegelkorrektur – Wende immer die feste Lautstärken-/Pegelkorrektur an.\n- Fallback auf Dynamik – wähle automatisch die beste Option: Wende die (gesamte) Lautstärken-/Pegelkorrektur basierend auf gespeicherten Messungen an, falls vorhanden, und ermögliche einen Fallback auf den dynamischen Modus, wenn keine Messung verfügbar ist.", "options": { "disabled": "Ausgeschaltet", "dynamic": "Erzwinge dynamisch", @@ -387,7 +387,7 @@ }, "volume_normalization_tracks": { "label": "Lautstärkenormalisierungsmethode für Titel", - "description": "Stelle die bevorzugte Lautstärkenormalisierungsstrategie für Tracks\/Songs ein.\nMusic Assistant verwendet eine Messung der (durchschnittlich wahrgenommenen) Lautstärke von Tracks gemäß der EBU-R128-Spezifikation, um den Gesamtpegel\/die Lautstärke des Streams anzupassen, ohne den Dynamikumfang der Audiodatei zu beeinträchtigen.\nDiese Messungen werden entweder vom Streaming-Anbieter bereitgestellt oder können im Fall von lokalen Dateien in den ID3-Tags enthalten sein (ReplayGain 2.0 \/ Opus R128).\nFalls keine Messung vorliegt, führt Music Assistant automatisch eine Messung durch, wenn der Track (erstmals) abgespielt wird. Wenn für einen Track noch keine Messung existiert, greift Music Assistant standardmäßig auf einen dynamischen (aber weniger genauen) Lautstärkeausgleichsfilter zurück. Dies stellt sicher, dass es keine großen Lautstärkeschwankungen zwischen den Tracks gibt, auch wenn noch keine genaue Messung vorliegt. Der dynamische Ausgleich kann manchmal den Dynamikumfang leicht komprimieren, was jedoch in den meisten Fällen nicht hörbar sein sollte.\n\n**Optionen:**\n- Deaktiviert – keine Lautstärkenormalisierung für Radiostreams anwenden.\n- Erzwungene Dynamik – erzwinge zu jeder Zeit dynamische Lautstärkenormalisierung. - Nur Messung (kein Fallback) – Wende die (gesamte) Lautstärken-\/Pegelkorrektur basierend auf gespeicherten Messungen an. Wenn keine Messung vorliegt, wird keine Normalisierung angewendet. - Fallback auf Pegelkorrektur – Wende die (gesamte) Lautstärken-\/Pegelkorrektur basierend auf gespeicherten Messungen an. Falls keine Messung vorliegt, greife auf eine vordefinierte Pegelkorrektur zurück.\n- Feste Pegelkorrektur – Wende immer die feste Lautstärken-\/Pegelkorrektur an.\n- Fallback auf Dynamik – wähle automatisch die beste Option: Wende die (gesamte) Lautstärken-\/Pegelkorrektur basierend auf gespeicherten Messungen an, falls vorhanden, und ermögliche einen Fallback auf den dynamischen Modus, wenn keine Messung verfügbar ist.", + "description": "Stelle die bevorzugte Lautstärkenormalisierungsstrategie für Tracks/Songs ein.\nMusic Assistant verwendet eine Messung der (durchschnittlich wahrgenommenen) Lautstärke von Tracks gemäß der EBU-R128-Spezifikation, um den Gesamtpegel/die Lautstärke des Streams anzupassen, ohne den Dynamikumfang der Audiodatei zu beeinträchtigen.\nDiese Messungen werden entweder vom Streaming-Anbieter bereitgestellt oder können im Fall von lokalen Dateien in den ID3-Tags enthalten sein (ReplayGain 2.0 / Opus R128).\nFalls keine Messung vorliegt, führt Music Assistant automatisch eine Messung durch, wenn der Track (erstmals) abgespielt wird. Wenn für einen Track noch keine Messung existiert, greift Music Assistant standardmäßig auf einen dynamischen (aber weniger genauen) Lautstärkeausgleichsfilter zurück. Dies stellt sicher, dass es keine großen Lautstärkeschwankungen zwischen den Tracks gibt, auch wenn noch keine genaue Messung vorliegt. Der dynamische Ausgleich kann manchmal den Dynamikumfang leicht komprimieren, was jedoch in den meisten Fällen nicht hörbar sein sollte.\n\n**Optionen:**\n- Deaktiviert – keine Lautstärkenormalisierung für Radiostreams anwenden.\n- Erzwungene Dynamik – erzwinge zu jeder Zeit dynamische Lautstärkenormalisierung. - Nur Messung (kein Fallback) – Wende die (gesamte) Lautstärken-/Pegelkorrektur basierend auf gespeicherten Messungen an. Wenn keine Messung vorliegt, wird keine Normalisierung angewendet. - Fallback auf Pegelkorrektur – Wende die (gesamte) Lautstärken-/Pegelkorrektur basierend auf gespeicherten Messungen an. Falls keine Messung vorliegt, greife auf eine vordefinierte Pegelkorrektur zurück.\n- Feste Pegelkorrektur – Wende immer die feste Lautstärken-/Pegelkorrektur an.\n- Fallback auf Dynamik – wähle automatisch die beste Option: Wende die (gesamte) Lautstärken-/Pegelkorrektur basierend auf gespeicherten Messungen an, falls vorhanden, und ermögliche einen Fallback auf den dynamischen Modus, wenn keine Messung verfügbar ist.", "options": { "disabled": "Deaktiviert", "dynamic": "Erzwinge dynamisch", @@ -398,16 +398,16 @@ } }, "volume_normalization_fixed_gain_tracks": { - "label": "Feste\/Fallback Gain-Anpassung für Songs", - "description": "Feste\/Fallback Gain-Korrektur, die auf einen Track-Audiostream angewendet wird (abhängig von der gewählten Einstellung „Lautstärkenormalisierungsmethode“).\nVerwende einen positiven Wert, um die Lautstärke zu erhöhen, einen negativen Wert, um die Lautstärke zu verringern.\n\nDiese Einstellung wird verwendet, wenn die Lautstärkenormalisierungsmethode auf „Feste Gain-Korrektur“ oder „Fallback auf Gain-Korrektur“ eingestellt ist" + "label": "Feste/Fallback Gain-Anpassung für Songs", + "description": "Feste/Fallback Gain-Korrektur, die auf einen Track-Audiostream angewendet wird (abhängig von der gewählten Einstellung „Lautstärkenormalisierungsmethode“).\nVerwende einen positiven Wert, um die Lautstärke zu erhöhen, einen negativen Wert, um die Lautstärke zu verringern.\n\nDiese Einstellung wird verwendet, wenn die Lautstärkenormalisierungsmethode auf „Feste Gain-Korrektur“ oder „Fallback auf Gain-Korrektur“ eingestellt ist" }, "volume_normalization_fixed_gain_radio": { - "label": "Feste\/Fallback Gain-Anpassung für Radio", - "description": "Feste\/Fallback Gain-Korrektur, die auf einen Radiostream angewendet werden soll (hängt von der gewählten Einstellung „Lautstärkenormalisierungsmethode“ ab).\nVerwende einen positiven Wert, um die Lautstärke zu erhöhen, einen negativen Wert, um die Lautstärke zu verringern.\n\nDiese Einstellung wird verwendet, wenn die Lautstärkenormalisierungsmethode auf „Feste Gain-Korrektur“ oder „Fallback auf Gain-Korrektur“ eingestellt ist." + "label": "Feste/Fallback Gain-Anpassung für Radio", + "description": "Feste/Fallback Gain-Korrektur, die auf einen Radiostream angewendet werden soll (hängt von der gewählten Einstellung „Lautstärkenormalisierungsmethode“ ab).\nVerwende einen positiven Wert, um die Lautstärke zu erhöhen, einen negativen Wert, um die Lautstärke zu verringern.\n\nDiese Einstellung wird verwendet, wenn die Lautstärkenormalisierungsmethode auf „Feste Gain-Korrektur“ oder „Fallback auf Gain-Korrektur“ eingestellt ist." }, "dynamic_members": { "label": "Dynamische Gruppenmitglieder", - "description": "Erlaube Mitgliedern (vorübergehend) der Gruppe beizutreten\/die Gruppe zu verlassen, sodass die Gruppe sich mehr oder weniger verhält wie beim manuellen Synchronisieren der Wiedergabegeräte mit dem Hauptunterschied, dass das Gruppenwiedergabegerät die Warteschlange hält." + "description": "Erlaube Mitgliedern (vorübergehend) der Gruppe beizutreten/die Gruppe zu verlassen, sodass die Gruppe sich mehr oder weniger verhält wie beim manuellen Synchronisieren der Wiedergabegeräte mit dem Hauptunterschied, dass das Gruppenwiedergabegerät die Warteschlange hält." }, "dsp": { "configure_on": "DSP konfigurieren auf: {name}", @@ -436,13 +436,13 @@ "high_pass": "Hochpass", "notch": "Engpass" }, - "import_apo": "APO\/REW-Voreinstellung importieren", + "import_apo": "APO/REW-Voreinstellung importieren", "export_apo": "APO-Voreinstellung exportieren", "preamp": "Vorverstärker", "add_band_channel": "Band hinzufügen (nur {channel})", "band_channel": "Band {index} (nur {channel})", "show_multichannel_controls": "Multi-Channel-Steuerung anzeigen", - "edited_channel": "EQ-Antwort für diesen Kanal\/diese Kanäle aufzeichnen", + "edited_channel": "EQ-Antwort für diesen Kanal/diese Kanäle aufzeichnen", "channel": "Das Band wird angewendet auf", "per_channel_preamp": "Zusätzlicher Pegel für Vorverstärker für {channel}" }, @@ -479,16 +479,16 @@ } }, "power_control": { - "label": "Steuerung Ein-\/Ausschaltverhalten", - "description": "Bestimme\/Übersteuere das Verhalten der Energiesteuerung für dieses Wiedergabegerät. Ermöglicht zum Beispiel die Weiterleitung der Befehle für die Energiesteuerung an ein anderes Gerät oder die Verwendung einer „Fake“ Energiesteuerung, falls das Wiedergabegerät die Befehle für das Ein-\/Ausschalten nicht unterstützt, man aber einen dedizierten Status für ein nicht verwendetes Wiedergabegerät haben möchte." + "label": "Steuerung Ein-/Ausschaltverhalten", + "description": "Bestimme/Übersteuere das Verhalten der Energiesteuerung für dieses Wiedergabegerät. Ermöglicht zum Beispiel die Weiterleitung der Befehle für die Energiesteuerung an ein anderes Gerät oder die Verwendung einer „Fake“ Energiesteuerung, falls das Wiedergabegerät die Befehle für das Ein-/Ausschalten nicht unterstützt, man aber einen dedizierten Status für ein nicht verwendetes Wiedergabegerät haben möchte." }, "volume_control": { "label": "Lautstärkeregelung", - "description": "Bestimme\/Übersteuere das Verhalten der Lautstärkeregelung für dieses Wiedergabegerät. Ermöglicht zum Beispiel die Weiterleitung der Befehle für die Lautstärkeregelung an ein anderes Gerät oder die vollständige Abschaltung." + "description": "Bestimme/Übersteuere das Verhalten der Lautstärkeregelung für dieses Wiedergabegerät. Ermöglicht zum Beispiel die Weiterleitung der Befehle für die Lautstärkeregelung an ein anderes Gerät oder die vollständige Abschaltung." }, "mute_control": { "label": "Stummschaltung", - "description": "Bestimme\/Übersteuere das Verhalten der Stummschaltung für dieses Wiedergabegerät. Ermöglicht zum Beispiel die Weiterleitung der Befehle für die Stummschaltung an ein anderes Gerät oder die vollständige Abschaltung.\n\nWir bieten eine „Fake“ Stummschaltung an, welche die Stummschaltung simuliert, indem die Lautstärke auf 0 gesetzt wird und die Lautstärke wiederherstellt, wenn die Stummschaltung aufgehoben wird." + "description": "Bestimme/Übersteuere das Verhalten der Stummschaltung für dieses Wiedergabegerät. Ermöglicht zum Beispiel die Weiterleitung der Befehle für die Stummschaltung an ein anderes Gerät oder die vollständige Abschaltung.\n\nWir bieten eine „Fake“ Stummschaltung an, welche die Stummschaltung simuliert, indem die Lautstärke auf 0 gesetzt wird und die Lautstärke wiederherstellt, wenn die Stummschaltung aufgehoben wird." }, "output_limiter": { "label": "Begrenzer aktivieren, um Clipping zu verhindern", @@ -502,7 +502,7 @@ "dsp_note_multi_device_group_unsupported": { "label": "Dieser Gruppentyp unterstützt keinen DSP, wenn die Wiedergabe auf mehrere Geräte erfolgt." }, - "add_group_player_desc_universal": "Durch das Erstellen einer universellen Wiedergabegeräte-Gruppe kannst du Wiedergabegeräte von verschiedenen Anbietern\/Ökosystemen zusammenfassen. \nDadurch werden dieselben Audiodaten an alle Wiedergabegeräte der Gruppe verteilt (jedoch nicht synchron).", + "add_group_player_desc_universal": "Durch das Erstellen einer universellen Wiedergabegeräte-Gruppe kannst du Wiedergabegeräte von verschiedenen Anbietern/Ökosystemen zusammenfassen. \nDadurch werden dieselben Audiodaten an alle Wiedergabegeräte der Gruppe verteilt (jedoch nicht synchron).", "edit_provider": "Anbieter bearbeiten: {0}", "metadata": "Metadaten", "metadataprovider": "Metadatenanbieter", @@ -599,7 +599,7 @@ "remote_access_feature_no_port_forwarding": "Keine Portweiterleitung oder VPN benötigt", "remote_access_mode_optimized": "Optimierter Modus (HA Cloud)", "remote_access_mode_basic": "Betrieb im Basismodus", - "remote_access_mode_optimized_description": "Für optimale Leistung werden STUN\/TURN-Server von Home Assistant Cloud verwendet. Funktioniert zuverlässig in allen Netzwerkkonfigurationen.", + "remote_access_mode_optimized_description": "Für optimale Leistung werden STUN/TURN-Server von Home Assistant Cloud verwendet. Funktioniert zuverlässig in allen Netzwerkkonfigurationen.", "remote_access_mode_basic_description": "Die Verwendung öffentlicher STUN-Server kann in komplexen Netzwerkumgebungen zu Problemen führen. Für ein optimales Nutzungserlebnis empfehlen wir ein Upgrade auf Home Assistant Cloud.", "remote_access_upgrade_to_optimized": "Upgrade auf Home Assistant Cloud", "remote_access_status": "Fernzugriffsstatus", @@ -627,7 +627,7 @@ "remote_access_disabled_success": "Fernzugriff wurde deaktiviert.", "remote_access_signaling_server_description": "Signalisierungsserver in der Cloud, gehostet von der Open Home Foundation.", "remote_access_protocol_basic": "WebRTC mit öffentlichen STUN-Servern (funktioniert möglicherweise nicht in komplexen Netzwerkkonfigurationen).", - "remote_access_protocol_optimized": "WebRTC mit optimierten STUN\/TURN-Servern von Home Assistant Cloud (funktioniert in allen Netzwerkkonfigurationen).", + "remote_access_protocol_optimized": "WebRTC mit optimierten STUN/TURN-Servern von Home Assistant Cloud (funktioniert in allen Netzwerkkonfigurationen).", "remote_access_encryption_description": "Die Ende-zu-Ende-Verschlüsselung mit DTLS-SRTP gewährleistet, dass deine Daten privat und sicher bleiben.", "frontend": "Benutzeroberfläche", "players_count": "{0} Wiedergabegerät{1}", @@ -644,7 +644,7 @@ "label": "Browser-Latenzzeit-Erkennung verwenden", "description": "Hardware-Audiolatenz (z. B. von Bluetooth-Kopfhörern) wird automatisch mithilfe der Ausgabelatenz-API des Browsers kompensiert. Diese API ist relativ neu und funktioniert möglicherweise nicht zuverlässig auf allen Browsern und Betriebssystemen." }, - "provider_codeowners": "Dieser Anbieter wird unterstützt\/gewartet von", + "provider_codeowners": "Dieser Anbieter wird unterstützt/gewartet von", "provider_credits": "Ermöglicht durch", "onboarding_subtitle": "Verbinde zunächst deine Musikquellen und Audiogeräte.", "onboarding_music_title": "Musik", @@ -668,7 +668,7 @@ "fix_now": "Jetzt reparieren", "web_player_enabled": { "label": "Integrierten (Sendspin) Web-Player aktivieren", - "description": "Die Wiedergabe auf diesem Gerät\/Browser soll über den integrierten Sendspin-Web-Player ermöglicht werden." + "description": "Die Wiedergabe auf diesem Gerät/Browser soll über den integrierten Sendspin-Web-Player ermöglicht werden." }, "enable_browser_controls": { "label": "Aktivieren der Browser-Mediensteuerung", @@ -783,21 +783,21 @@ "tooltip": { "album_artist_filter": "Nach Album-Künstlern filtern", "explicit": "Explizit", - "filter_library": "Nach Elementen in Bibliothek\/Favoriten filtern", - "library": "Bibliothek\/Favorit umschalten", + "filter_library": "Nach Elementen in Bibliothek/Favoriten filtern", + "library": "Bibliothek/Favorit umschalten", "linked": "Dieser Anbieter ist mit den aktuellen Details des Elements verknüpft", "refresh": "Liste aktualisieren", "refresh_new_content": "Neue Inhalte verfügbar. Zum Aktualisieren, hier klicken.", - "search": "Sucheingabe ein-\/ausblenden", + "search": "Sucheingabe ein-/ausblenden", "select_items": "Mehrere Elemente wählen", "sort_options": "Sortieroptionen", "toggle_view_mode": "Anzeigemodus zwischen Listen- und Raster-Ansicht umschalten", "filter_favorites": "Nur Favoriten anzeigen", - "favorite": "Als Favorit hinzufügen\/entfernen", + "favorite": "Als Favorit hinzufügen/entfernen", "open_provider_link": "Auf Website des Anbieters ansehen", - "collapse_expand": "Auflistung aus-\/einklappen", + "collapse_expand": "Auflistung aus-/einklappen", "back": "Zurück", - "show_menu": "Menü anzeigen\/verbergen", + "show_menu": "Menü anzeigen/verbergen", "search_filter_active": "Die Suche filtert aktuell die Ergebnisse", "play_sample": "Beispiel wiedergeben", "album_type": "Albumtyp", @@ -1101,7 +1101,7 @@ "local_server": "Lokaler Server", "remote_server": "Remote", "server_address": "Serveradresse", - "server_address_placeholder": "http:\/\/192.168.1.100:8095", + "server_address_placeholder": "http://192.168.1.100:8095", "remote_id": "Remote-ID", "remote_id_placeholder": "z. B. MA-X7K9-P2M4", "remote_id_hint": "Du findest diese Option in deinen Servereinstellungen unter „Fernzugriff“.", @@ -1221,7 +1221,7 @@ "genre": "Genre", "genres": "Genres", "genre_names": { - "afrobeats": "Afrobeats (westafrikanische Urban-\/Popmusik)", + "afrobeats": "Afrobeats (westafrikanische Urban-/Popmusik)", "ambient": "Ambient", "anime_and_video_game_music": "Anime- und Videospielmusik", "asian_music": "Asiatische Musik", @@ -1311,7 +1311,7 @@ }, "genre_descriptions": { "afrobeats": "Afrobeats, nicht zu verwechseln mit Afrobeat oder Afroswing, ist ein Oberbegriff für populäre Musik aus Westafrika und der Diaspora, die sich in den 2000er und 2010er Jahren zunächst in Nigeria, Ghana und dem Vereinigten Königreich entwickelte. Afrobeats ist weniger ein Stil an sich als vielmehr eine Beschreibung für die Verschmelzung von Klängen, die aus Nigeria und Ghana kommen. Genres wie Hiplife, Jùjú-Musik, Highlife, Azonto-Musik und Naija Beats wurden unter anderem unter dem Begriff „Afrobeats“ zusammengefasst.", - "ambient": "Ambient-Musik ist ein Musikgenre, bei dem Klang und Atmosphäre gegenüber traditionellen musikalischen Strukturen oder Rhythmen im Vordergrund stehen. Ambient-Musik, die oft „friedlich“ klingt und der es an Komposition, Takt und\/oder strukturierter Melodie fehlt, verwendet texturierte Klangschichten, die sowohl passives als auch aktives Zuhören belohnen und ein Gefühl der Ruhe oder Kontemplation fördern können. Das Genre hat eine „atmosphärische“, „visuelle“ oder „unaufdringliche“ Qualität. Es können Naturgeräusche enthalten sein, und in einigen Werken werden anhaltende oder wiederholte Töne verwendet, wie in der Drone-Musik. In Anlehnung an die New-Age-Musik können Instrumente wie Klavier, Streicher und Flöte durch einen Synthesizer emuliert werden.", + "ambient": "Ambient-Musik ist ein Musikgenre, bei dem Klang und Atmosphäre gegenüber traditionellen musikalischen Strukturen oder Rhythmen im Vordergrund stehen. Ambient-Musik, die oft „friedlich“ klingt und der es an Komposition, Takt und/oder strukturierter Melodie fehlt, verwendet texturierte Klangschichten, die sowohl passives als auch aktives Zuhören belohnen und ein Gefühl der Ruhe oder Kontemplation fördern können. Das Genre hat eine „atmosphärische“, „visuelle“ oder „unaufdringliche“ Qualität. Es können Naturgeräusche enthalten sein, und in einigen Werken werden anhaltende oder wiederholte Töne verwendet, wie in der Drone-Musik. In Anlehnung an die New-Age-Musik können Instrumente wie Klavier, Streicher und Flöte durch einen Synthesizer emuliert werden.", "anime_and_video_game_music": "Videospielmusik (VGM) ist der Soundtrack, der Videospiele untermalt. Die frühe Videospielmusik war einst auf die Klänge früher Soundchips wie programmierbare Soundgeneratoren (PSG) oder FM-Synthesechips beschränkt. Diese Einschränkungen haben zu dem als Chiptune bekannten Musikstil geführt, der zum Sound der frühen Videospiele wurde.", "asian_music": "Die asiatische Musik umfasst zahlreiche Musikstile, verschiedene kulturelle und religiöse Traditionen und Formen, die ihren Ursprung auf dem asiatischen Kontinent haben.", "bluegrass": "Die Bluegrass-Musik ist ein Genre der amerikanischen Roots-Musik, das in den 1940er Jahren in den Appalachen in den Vereinigten Staaten entstand. Der Name des Genres geht auf die Band Bill Monroe and the Blue Grass Boys zurück. Bluegrass hat seine Wurzeln in afroamerikanischen Genres wie Blues und Jazz und nordeuropäischen Genres wie irischen Balladen und Tanzliedern. Im Gegensatz zum Country wird Bluegrass traditionell ausschließlich mit akustischen Instrumenten wie Fidel, Mandoline, Banjo, Gitarre und Kontrabass gespielt. Er wurde von Musikern weiterentwickelt, die mit Monroe spielten, darunter der 5-saitige Banjospieler Earl Scruggs und der Gitarrist Lester Flatt. Bill Monroe beschrieb die Bluegrass-Musik einmal so: „Sie ist ein Teil der Traditionen der Methodisten, der Holiness und der Baptisten. Sie ist Blues und Jazz, und sie hat einen hohen, einsamen Klang.“", @@ -1330,7 +1330,7 @@ "disco": "Disco ist ein Genre der Tanzmusik und eine Subkultur, die in den späten 1960er Jahren in der städtischen Ausgehszene der Vereinigten Staaten entstand, insbesondere in afroamerikanischen, italienisch-amerikanischen, lateinamerikanischen und queeren Gemeinschaften. Typisch für den Sound sind Four-on-the-Floor-Beats, synkopierte Bässe, Streicher, Bläser und Hörner, E-Pianos, Synthesizer und elektrische Rhythmusgitarren.", "electronic": "Elektronische Musik im weitesten Sinne ist eine Gruppe von Musikgenres, die elektronische Musikinstrumente, schaltkreisbasierte Musiktechnologie und Software oder Allzweckelektronik für ihre Entstehung verwenden. Sie umfasst sowohl Musik, die mit elektronischen als auch mit elektromechanischen Mitteln erzeugt wird. Rein elektronische Instrumente beruhen vollständig auf schaltkreisbasierter Klangerzeugung, z. B. mit Geräten wie einem elektronischen Oszillator, Theremin oder Synthesizer: Es müssen keine akustischen Wellen zuvor auf mechanischem Wege erzeugt und dann in elektrische Signale umgewandelt werden. Elektromechanische Instrumente hingegen haben mechanische Teile wie Saiten oder Hämmer, die die Schallwellen erzeugen, sowie elektrische Elemente wie magnetische Tonabnehmer, Leistungsverstärker und Lautsprecher, die die Schallwellen in elektrische Signale umwandeln, diese verarbeiten und wieder in Schallwellen umwandeln. Zu diesen elektromechanischen Geräten gehören das Telharmonium, die Hammond-Orgel, das elektrische Klavier und die elektrische Gitarre.", "experimental": "Experimentelle Musik ist eine allgemeine Bezeichnung für jede Musik oder Musikrichtung, die bestehende Grenzen und Genredefinitionen überschreitet. Die experimentelle Kompositionspraxis definiert sich im weitesten Sinne durch eine forschende Sensibilität, die sich radikal gegen die institutionalisierten kompositorischen, aufführungspraktischen und ästhetischen Konventionen in der Musik richtet und diese infrage stellt. Zu den Elementen der experimentellen Musik gehört die Unbestimmtheit, bei der der Komponist Elemente des Zufalls oder der Unvorhersehbarkeit in Bezug auf die Komposition oder ihre Aufführung einführt. Die Künstler können eine Mischung aus verschiedenen Stilen verwenden oder unorthodoxe und einzigartige Elemente einbauen.", - "field_recording": "Field Recording ist die Produktion von Audioaufnahmen außerhalb von Aufnahmestudios, und der Begriff bezieht sich sowohl auf Aufnahmen von natürlichen als auch von menschlich erzeugten Geräuschen. Sie können auch die Aufnahme von elektromagnetischen Feldern oder Schwingungen mit verschiedenen Mikrofonen umfassen, z. B. mit einer passiven magnetischen Antenne für elektromagnetische Aufnahmen oder Kontaktmikrofonen, oder Unterwasseraufnahmen mit Hydrofonen, um die Geräusche und\/oder Bewegungen von Walen oder anderen Meeresbewohnern aufzunehmen. Diese Aufnahmen werden oft als sehr nützlich für Sounddesigner und Geräuschemacher angesehen.", + "field_recording": "Field Recording ist die Produktion von Audioaufnahmen außerhalb von Aufnahmestudios, und der Begriff bezieht sich sowohl auf Aufnahmen von natürlichen als auch von menschlich erzeugten Geräuschen. Sie können auch die Aufnahme von elektromagnetischen Feldern oder Schwingungen mit verschiedenen Mikrofonen umfassen, z. B. mit einer passiven magnetischen Antenne für elektromagnetische Aufnahmen oder Kontaktmikrofonen, oder Unterwasseraufnahmen mit Hydrofonen, um die Geräusche und/oder Bewegungen von Walen oder anderen Meeresbewohnern aufzunehmen. Diese Aufnahmen werden oft als sehr nützlich für Sounddesigner und Geräuschemacher angesehen.", "folk": "Volksmusik ist ein Musikgenre, das die traditionelle Volksmusik und das zeitgenössische Genre umfasst, das sich während des Folk-Revivals im 20. Jahrhundert aus der traditionellen Musik entwickelt hat. Einige Arten von Volksmusik können auch als Weltmusik bezeichnet werden. Traditionelle Volksmusik wurde auf verschiedene Weise definiert: als Musik, die mündlich weitergegeben wird, als Musik mit unbekannten Komponisten, als Musik, die auf traditionellen Instrumenten gespielt wird, als Musik, die von kultureller oder nationaler Identität handelt, als Musik, die sich von Generation zu Generation ändert, als Musik, die mit der Folklore eines Volkes verbunden ist, oder als Musik, die über einen langen Zeitraum hinweg aus Tradition gespielt wird. Sie steht im Gegensatz zu den kommerziellen und klassischen Stilen. Der Begriff hat seinen Ursprung im 19. Jahrhundert, aber Volksmusik geht darüber hinaus.", "funk": "Funk ist ein Musikgenre, das Mitte der 1960er Jahre in afroamerikanischen Gemeinschaften entstand, als Musiker eine rhythmische, tanzbare neue Musikform durch eine Mischung aus verschiedenen Musikgenres schufen, die Mitte des 20. Jahrhunderts bei Afroamerikanern sehr beliebt war. Der Funk stellt Melodie und Akkordfolgen in den Hintergrund und konzentriert sich auf einen starken rhythmischen Groove, der sich aus einer von einem E-Bassisten gespielten Basslinie und einem von einem Schlagzeuger gespielten Schlagzeugpart zusammensetzt und zwar häufig in einem langsameren Tempo als andere populäre Musik. Funk besteht in der Regel aus einem komplexen perkussiven Groove, bei dem die Rhythmusinstrumente ineinandergreifende Grooves spielen, die ein „hypnotisches“ und „tanzbares“ Gefühl erzeugen. Der frühe Funk, insbesondere James Brown, verschmolz Jazz und Blues und fügte einen synkopischen Schlagzeug-Groove hinzu.", "gangsta_rap": "Gangsta- oder Gangster-Rap, ursprünglich Reality-Rap genannt, ist ein Subgenre des Hip-Hop, das die Kultur, die Werte und die Erfahrungen von städtischen Gangs und Straßenhändlern vermittelt und häufig die unangenehmen Realitäten der Welt im Allgemeinen durch eine urbane Linse diskutiert. Zu den Pionieren des Gangsta-Rap, der in den späten 1980er Jahren entstand, gehören Schoolly D und Ice-T, die später durch Künstler wie N.W.A. erweitert wurden. 1992 wurde der Gangsta-Rap durch den Plattenproduzenten und Rapper Dr. Dre, den Rapper Snoop Dogg und ihren G-Funk-Sound zum Mainstream-Sound.", diff --git a/src/translations/en.json b/src/translations/en.json index 26d995010..fcdf194ef 100644 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -51,7 +51,7 @@ "mass": "Music Assistant", "new_playlist_name": "Enter a name for the new playlist", "no_content": "No items found.", - "no_content_filter": "No items found for the current filter\/search conditions.", + "no_content_filter": "No items found for the current filter/search conditions.", "no_player": "No player selected", "off": "Off", "on": "On", @@ -168,7 +168,7 @@ }, "flow_mode": { "label": "Enable queue flow mode", - "description": "Enable \"flow\" mode where all queue tracks are sent as a continuous audio stream.\nUse for players that do not natively support gapless and\/or crossfading or if the player has trouble transitioning between tracks." + "description": "Enable \"flow\" mode where all queue tracks are sent as a continuous audio stream.\nUse for players that do not natively support gapless and/or crossfading or if the player has trouble transitioning between tracks." }, "auto_play": { "label": "Automatically play (resume on power on)", @@ -240,8 +240,8 @@ "options": { "play": "Play artist track(s) now and keep the remaining queue item(s).", "replace": "Clear the queue and play the artist track(s)", - "next": "Play the item(s) right after the currently played\/buffered item.", - "replace_next": "Clear the queue and play the artist track(s) right after the currently played\/buffered item.", + "next": "Play the item(s) right after the currently played/buffered item.", + "replace_next": "Clear the queue and play the artist track(s) right after the currently played/buffered item.", "add": "Add the artist track(s) at the end of the queue." } }, @@ -251,8 +251,8 @@ "options": { "play": "Play album track(s) now and keep the remaining queue item(s).", "replace": "Clear the queue and play the album track(s)", - "next": "Play the item(s) right after the currently played\/buffered item.", - "replace_next": "Clear the queue and play the album track(s) right after the currently played\/buffered item.", + "next": "Play the item(s) right after the currently played/buffered item.", + "replace_next": "Clear the queue and play the album track(s) right after the currently played/buffered item.", "add": "Add the album track(s) at the end of the queue." } }, @@ -262,8 +262,8 @@ "options": { "play": "Play track(s) now and keep the remaining queue item(s).", "replace": "Clear the queue and play the track(s).", - "next": "Play the track(s) right after the currently played\/buffered item.", - "replace_next": "Clear the queue and play the track(s) right after the currently played\/buffered item.", + "next": "Play the track(s) right after the currently played/buffered item.", + "replace_next": "Clear the queue and play the track(s) right after the currently played/buffered item.", "add": "Add the track(s) at the end of the queue." } }, @@ -273,8 +273,8 @@ "options": { "play": "Play playlist track(s) now and keep the remaining queue item(s).", "replace": "Clear the queue and play the playlist track(s)", - "next": "Play the item(s) right after the currently played\/buffered item.", - "replace_next": "Clear the queue and play the playlist track(s) right after the currently played\/buffered item.", + "next": "Play the item(s) right after the currently played/buffered item.", + "replace_next": "Clear the queue and play the playlist track(s) right after the currently played/buffered item.", "add": "Add the playlist track(s) at the end of the queue." } }, @@ -284,8 +284,8 @@ "options": { "play": "Play radio station now and keep the remaining queue item(s).", "replace": "Clear the queue and play the radio station", - "next": "Play the item(s) right after the currently played\/buffered item.", - "replace_next": "Clear the queue and play the radio station(s) right after the currently played\/buffered item.", + "next": "Play the item(s) right after the currently played/buffered item.", + "replace_next": "Clear the queue and play the radio station(s) right after the currently played/buffered item.", "add": "Add the radio station(s) at the end of the queue." } }, @@ -296,7 +296,7 @@ "generic": "Generic", "announcements": "Announcements", "player_controls": "Player controls", - "sync_options": "Sync\/import options", + "sync_options": "Sync/import options", "builtin_playlists": "Builtin Playlists", "web_player": "Web Player", "playback": "Queue Playback", @@ -333,7 +333,7 @@ }, "icon": { "label": "Icon", - "description": "Material design icon for this player.\n\nSee https:\/\/pictogrammers.com\/library\/mdi\/." + "description": "Material design icon for this player.\n\nSee https://pictogrammers.com/library/mdi/." }, "theme": { "label": "Theme", @@ -385,7 +385,7 @@ "no_player_providers_detail": "Configure player providers to select devices where Music Assistant can output your music.", "volume_normalization_radio": { "label": "Volume normalization method to use for radio streams", - "description": "Set the preferred volume normalization strategy for radio streams. \nBy default Music Assistant collects a measurement of the radio station's (average perceived) loudness according to the EBU-R128 specification and then adjusts the overall gain\/volume of the stream according to that measurement so the dynamic range of the audio is not affected. When no measurement (yet) exists for a radio station, Music Assistant will fallback to a dynamic (but less accurate) loudness levelling filter.\n\nTIP: Radio streams often have varying loudness levels, especially during announcements and commercials.\nYou can choose to enforce dynamic volume normalization to radio streams, even if a (average) loudness measurement for the radio station exists. \n \n**Options:**\n\n - Disabled - do not apply volume normalization at all for radio streams. \n - Force dynamic - Enforce dynamic volume levelling at all times. \n - Measurement only (no fallback) - Apply (overall) volume\/gain correction based on stored measurement. If we do not have any measurement, do not apply normalization.\n - Fallback to gain correction - Apply (overall) volume\/gain correction based on stored measurement. If we do not have any measurement, fallback to a predefined gain correction.\n - Fixed gain correction - Always apply the fixed volume\/gain correction.\n - Fallback to dynamic - Automatically pick the best option: Apply (overall) volume\/gain correction based on stored measurement if we have any, allow fallback to dynamic mode if no measurement is available.\n", + "description": "Set the preferred volume normalization strategy for radio streams. \nBy default Music Assistant collects a measurement of the radio station's (average perceived) loudness according to the EBU-R128 specification and then adjusts the overall gain/volume of the stream according to that measurement so the dynamic range of the audio is not affected. When no measurement (yet) exists for a radio station, Music Assistant will fallback to a dynamic (but less accurate) loudness levelling filter.\n\nTIP: Radio streams often have varying loudness levels, especially during announcements and commercials.\nYou can choose to enforce dynamic volume normalization to radio streams, even if a (average) loudness measurement for the radio station exists. \n \n**Options:**\n\n - Disabled - do not apply volume normalization at all for radio streams. \n - Force dynamic - Enforce dynamic volume levelling at all times. \n - Measurement only (no fallback) - Apply (overall) volume/gain correction based on stored measurement. If we do not have any measurement, do not apply normalization.\n - Fallback to gain correction - Apply (overall) volume/gain correction based on stored measurement. If we do not have any measurement, fallback to a predefined gain correction.\n - Fixed gain correction - Always apply the fixed volume/gain correction.\n - Fallback to dynamic - Automatically pick the best option: Apply (overall) volume/gain correction based on stored measurement if we have any, allow fallback to dynamic mode if no measurement is available.\n", "options": { "disabled": "Disabled", "dynamic": "Force dynamic", @@ -397,7 +397,7 @@ }, "volume_normalization_tracks": { "label": "Volume normalization method to use for tracks", - "description": "Set the preferred volume normalization strategy for tracks\/songs.\nMusic Assistant uses a measurement of the tracks's (average perceived) loudness according to the EBU-R128 specification to adjust the overall gain\/volume of the stream without affecting the dynamic range of the audio.\nThese measurements are either provided by the streaming provider or in case of local files, can be contained in the ID3 tags (ReplayGain 2.0 \/ Opus R128).\nIf the measurement is not provided, Music Assistant will automatically perform a measurement when\/after the track is (first) played. When no measurement (yet) exists for a track, Music Assistant will by default fallback to a dynamic (but less accurate) loudness levelling filter. This ensures no big spikes\/falls in the volume level between tracks, even if there is no accurate measurement yet but the dynamic leveler can sometimes compress the dynamic range a bit, although that should not be audible in most cases.\n\n\n**Options:**\n\n - Disabled - do not apply volume normalization at all for radio streams.\n - Force dynamic - Enforce dynamic volume levelling at all times. \n - Measurement only (no fallback) - Apply (overall) volume\/gain correction based on stored measurement. If we do not have any measurement, do not apply normalization. \n - Fallback to gain correction - Apply (overall) volume\/gain correction based on stored measurement. If we do not have any measurement, fallback to a predefined gain correction. \n - Fixed gain correction - Always apply the fixed volume\/gain correction. \n - Fallback to dynamic - Automatically pick the best option: Apply (overall) volume\/gain correction based on stored measurement if we have any, allow fallback to dynamic mode if no measurement is available.\n", + "description": "Set the preferred volume normalization strategy for tracks/songs.\nMusic Assistant uses a measurement of the tracks's (average perceived) loudness according to the EBU-R128 specification to adjust the overall gain/volume of the stream without affecting the dynamic range of the audio.\nThese measurements are either provided by the streaming provider or in case of local files, can be contained in the ID3 tags (ReplayGain 2.0 / Opus R128).\nIf the measurement is not provided, Music Assistant will automatically perform a measurement when/after the track is (first) played. When no measurement (yet) exists for a track, Music Assistant will by default fallback to a dynamic (but less accurate) loudness levelling filter. This ensures no big spikes/falls in the volume level between tracks, even if there is no accurate measurement yet but the dynamic leveler can sometimes compress the dynamic range a bit, although that should not be audible in most cases.\n\n\n**Options:**\n\n - Disabled - do not apply volume normalization at all for radio streams.\n - Force dynamic - Enforce dynamic volume levelling at all times. \n - Measurement only (no fallback) - Apply (overall) volume/gain correction based on stored measurement. If we do not have any measurement, do not apply normalization. \n - Fallback to gain correction - Apply (overall) volume/gain correction based on stored measurement. If we do not have any measurement, fallback to a predefined gain correction. \n - Fixed gain correction - Always apply the fixed volume/gain correction. \n - Fallback to dynamic - Automatically pick the best option: Apply (overall) volume/gain correction based on stored measurement if we have any, allow fallback to dynamic mode if no measurement is available.\n", "options": { "disabled": "Disabled", "dynamic": "Force dynamic", @@ -408,16 +408,16 @@ } }, "volume_normalization_fixed_gain_tracks": { - "label": "Fixed\/fallback gain adjustment for tracks", - "description": "Fixed\/fallback gain correction to apply to a track audio stream (depends on the 'Volume normalization method' setting).\nUse a positive value to increase the volume, a negative value to decrease the volume.\n\nThis setting is used when the volume normalization method is set to 'Fixed gain correction' or 'Fallback to gain correction'." + "label": "Fixed/fallback gain adjustment for tracks", + "description": "Fixed/fallback gain correction to apply to a track audio stream (depends on the 'Volume normalization method' setting).\nUse a positive value to increase the volume, a negative value to decrease the volume.\n\nThis setting is used when the volume normalization method is set to 'Fixed gain correction' or 'Fallback to gain correction'." }, "volume_normalization_fixed_gain_radio": { - "label": "Fixed\/fallback gain adjustment for radio", - "description": "Fixed\/fallback gain correction to apply to a radio stream (depends on the 'Volume normalization method' setting).\nUse a positive value to increase the volume, a negative value to decrease the volume.\n\nThis setting is used when the volume normalization method is set to 'Fixed gain correction' or 'Fallback to gain correction'." + "label": "Fixed/fallback gain adjustment for radio", + "description": "Fixed/fallback gain correction to apply to a radio stream (depends on the 'Volume normalization method' setting).\nUse a positive value to increase the volume, a negative value to decrease the volume.\n\nThis setting is used when the volume normalization method is set to 'Fixed gain correction' or 'Fallback to gain correction'." }, "dynamic_members": { "label": "Dynamic group members", - "description": "Allow members to (temporarily) join\/leave the group dynamically, so the group more or less behaves the same as manually syncing players together, with the main difference being that the group player will hold the queue." + "description": "Allow members to (temporarily) join/leave the group dynamically, so the group more or less behaves the same as manually syncing players together, with the main difference being that the group player will hold the queue." }, "dsp": { "configure_on": "Configuring DSP on: {name}", @@ -446,7 +446,7 @@ "high_pass": "High Pass", "notch": "Notch" }, - "import_apo": "Import APO\/REW Preset", + "import_apo": "Import APO/REW Preset", "export_apo": "Export APO Preset", "preamp": "Preamp", "add_band_channel": "Add Band ({channel} only)", @@ -490,15 +490,15 @@ }, "power_control": { "label": "Power control", - "description": "Define\/override the power control behavior for this player.\nIt allows you for example to redirect the power on\/off commands to a different appliance, or use a fake power control if your player does not support power on\/off commands but you like to have a dedicated state for a player not in use." + "description": "Define/override the power control behavior for this player.\nIt allows you for example to redirect the power on/off commands to a different appliance, or use a fake power control if your player does not support power on/off commands but you like to have a dedicated state for a player not in use." }, "volume_control": { "label": "Volume control", - "description": "Define\/override the volume control behavior for this player.\nIt allows you for example to redirect the volume control commands to a different appliance, or disable it completely." + "description": "Define/override the volume control behavior for this player.\nIt allows you for example to redirect the volume control commands to a different appliance, or disable it completely." }, "mute_control": { "label": "Mute control", - "description": "Define\/override the mute control behavior for this player.\nIt allows you for example to redirect the muting control commands to a different appliance, or disable it completely.\n\nWe offer a 'fake' mute control option, which will simulate muting by setting the volume to 0 and restoring the volume when unmuting." + "description": "Define/override the mute control behavior for this player.\nIt allows you for example to redirect the muting control commands to a different appliance, or disable it completely.\n\nWe offer a 'fake' mute control option, which will simulate muting by setting the volume to 0 and restoring the volume when unmuting." }, "output_limiter": { "label": "Enable limiting to prevent clipping", @@ -512,7 +512,7 @@ "dsp_note_multi_device_group_unsupported": { "label": "This group type does not support DSP when playing to multiple devices." }, - "add_group_player_desc_universal": "By creating a Universal Player Group, you can group players from different providers\/ecosystems together. \nThis will distribute the same audio to all member players (but not in sync).", + "add_group_player_desc_universal": "By creating a Universal Player Group, you can group players from different providers/ecosystems together. \nThis will distribute the same audio to all member players (but not in sync).", "edit_provider": "Edit provider: {0}", "metadata": "Metadata", "metadataprovider": "Metadata provider", @@ -609,7 +609,7 @@ "remote_access_feature_no_port_forwarding": "No port forwarding or VPN required", "remote_access_mode_optimized": "Optimized Mode (HA Cloud)", "remote_access_mode_basic": "Running in Basic Mode", - "remote_access_mode_optimized_description": "Using STUN\/TURN servers from Home Assistant Cloud for optimal performance. Works reliably in all network configurations.", + "remote_access_mode_optimized_description": "Using STUN/TURN servers from Home Assistant Cloud for optimal performance. Works reliably in all network configurations.", "remote_access_mode_basic_description": "Using public STUN servers. This may not work in complex network setups. Upgrade to Home Assistant Cloud for the best experience.", "remote_access_upgrade_to_optimized": "Upgrade to Home Assistant Cloud", "remote_access_status": "Remote Access Status", @@ -637,7 +637,7 @@ "remote_access_disabled_success": "Remote Access has been disabled", "remote_access_signaling_server_description": "Signaling server in the cloud, hosted by the Open Home Foundation.", "remote_access_protocol_basic": "WebRTC with public STUN servers (may not work in complex network setups).", - "remote_access_protocol_optimized": "WebRTC with optimized STUN\/TURN servers from Home Assistant Cloud (works in all network setups).", + "remote_access_protocol_optimized": "WebRTC with optimized STUN/TURN servers from Home Assistant Cloud (works in all network setups).", "remote_access_encryption_description": "End-to-end encryption using DTLS-SRTP ensures your data remains private and secure.", "frontend": "User Interface", "players_count": "{0} player{1}", @@ -650,7 +650,7 @@ "label": "Static playback delay (ms)", "description": "Offset in milliseconds to keep this player in sync with other players. Increase if audio plays too late, for example to compensate for latency from an amp, active speakers, or the OS." }, - "provider_codeowners": "This provider is contributed\/maintained by", + "provider_codeowners": "This provider is contributed/maintained by", "provider_credits": "Made possible by", "onboarding_subtitle": "Let's get you started by connecting your music sources and audio devices.", "onboarding_music_title": "Music", @@ -674,7 +674,7 @@ "fix_now": "Fix now", "web_player_enabled": { "label": "Enable built-in (Sendspin) Web Player", - "description": "Allow playback to this device\/browser using the built-in Sendspin web player." + "description": "Allow playback to this device/browser using the built-in Sendspin web player." }, "enable_browser_controls": { "label": "Enable browser media controls", @@ -794,21 +794,21 @@ "tooltip": { "album_artist_filter": "Toggle album-artist filter", "explicit": "Explicit", - "filter_library": "Toggle in-library\/favorite filter", - "library": "Toggle in-library\/favorite", + "filter_library": "Toggle in-library/favorite filter", + "library": "Toggle in-library/favorite", "linked": "This provideritem is linked to the current itemdetails", "refresh": "Refresh the items listing", "refresh_new_content": "New content is available, click to refresh the listing", - "search": "Show\/hide search input", + "search": "Show/hide search input", "select_items": "Select multiple items", "sort_options": "Sort options", - "toggle_view_mode": "Toggle view mode list\/thumbs", + "toggle_view_mode": "Toggle view mode list/thumbs", "filter_favorites": "Only show favorites", - "favorite": "Mark\/unmark as a favorite", + "favorite": "Mark/unmark as a favorite", "open_provider_link": "Open this item on the provider's website", - "collapse_expand": "Collapse\/expand this listing", + "collapse_expand": "Collapse/expand this listing", "back": "Back", - "show_menu": "Show\/hide menu", + "show_menu": "Show/hide menu", "search_filter_active": "Search is currently filtering results", "play_sample": "Play sample", "album_type": "Album type", @@ -1112,7 +1112,7 @@ "local_server": "Local Server", "remote_server": "Remote", "server_address": "Server Address", - "server_address_placeholder": "http:\/\/192.168.1.100:8095", + "server_address_placeholder": "http://192.168.1.100:8095", "remote_id": "Remote ID", "remote_id_placeholder": "e.g., MA-X7K9-P2M4", "remote_id_hint": "Find this in your server settings under \"Remote Access\"", @@ -1232,7 +1232,7 @@ "genre": "Genre", "genres": "Genres", "genre_names": { - "afrobeats": "Afrobeats (west african urban\/pop music)", + "afrobeats": "Afrobeats (west african urban/pop music)", "ambient": "Ambient", "anime_and_video_game_music": "Anime & video game music", "asian_music": "Asian music", @@ -1322,7 +1322,7 @@ }, "genre_descriptions": { "afrobeats": "Afrobeats, not to be confused with Afrobeat or Afroswing, is an umbrella term to describe popular music from West Africa and the diaspora that initially developed in Nigeria, Ghana, and the UK in the 2000s and 2010s. Afrobeats is less of a style per se, and more of a descriptor for the fusion of sounds flowing out of Nigeria and Ghana. Genres such as hiplife, jùjú music, highlife, azonto music, and naija beats, among others, were amalgamated under the \"Afrobeats\" umbrella.", - "ambient": "Ambient music is a genre of music that emphasizes tone and atmosphere over traditional musical structure or rhythm. Often \"peaceful\" sounding and lacking composition, beat, and\/or structured melody, ambient music uses textural layers of sound that can reward both passive and active listening, and encourage a sense of calm or contemplation. The genre evokes an \"atmospheric\", \"visual\", or \"unobtrusive\" quality. Nature soundscapes may be included, and some works use sustained or repeated notes, as in drone music. Bearing elements associated with new-age music, instruments such as the piano, strings and flute may be emulated through a synthesizer.", + "ambient": "Ambient music is a genre of music that emphasizes tone and atmosphere over traditional musical structure or rhythm. Often \"peaceful\" sounding and lacking composition, beat, and/or structured melody, ambient music uses textural layers of sound that can reward both passive and active listening, and encourage a sense of calm or contemplation. The genre evokes an \"atmospheric\", \"visual\", or \"unobtrusive\" quality. Nature soundscapes may be included, and some works use sustained or repeated notes, as in drone music. Bearing elements associated with new-age music, instruments such as the piano, strings and flute may be emulated through a synthesizer.", "anime_and_video_game_music": "Video game music (VGM) is the soundtrack that accompanies video games. Early video game music was once limited to sounds of early sound chips, such as programmable sound generators (PSG) or FM synthesis chips. These limitations have led to the style of music known as chiptune, which became the sound of the early video games.", "asian_music": "Asian music encompasses numerous musical styles, diverse cultural and religious traditions, and forms originating on the Asian continent.", "bluegrass": "Bluegrass music is a genre of American roots music that developed in the 1940s in the Appalachian region of the United States. The genre derives its name from the band Bill Monroe and the Blue Grass Boys. Bluegrass has roots in African American genres like blues and jazz and North European genres, such as Irish ballads and dance tunes. Unlike country, it is traditionally played exclusively on acoustic instruments such as the fiddle, mandolin, banjo, guitar and upright bass. It was further developed by musicians who played with Monroe, including 5-string banjo player Earl Scruggs and guitarist Lester Flatt. Bill Monroe once described bluegrass music as, \"It's a part of Methodist, Holiness and Baptist traditions. It's blues and jazz, and it has a high lonesome sound.\"", @@ -1341,7 +1341,7 @@ "disco": "Disco is a genre of dance music and a subculture that emerged in the late 1960s from the United States' urban nightlife scene, particularly in African-American, Italian-American, Latino and queer communities. Its sound is typified by four-on-the-floor beats, syncopated basslines, string sections, brass and horns, electric pianos, synthesizers, and electric rhythm guitars.", "electronic": "Electronic music broadly is a group of music genres that employ electronic musical instruments, circuitry-based music technology and software, or general-purpose electronics in its creation. It includes both music made using electronic and electromechanical means. Pure electronic instruments depend entirely on circuitry-based sound generation, for instance using devices such as an electronic oscillator, theremin, or synthesizer: no acoustic waves need to be previously generated by mechanical means and then converted into electrical signals. On the other hand, electromechanical instruments have mechanical parts such as strings or hammers that generate the sound waves, together with electric elements including magnetic pickups, power amplifiers and loudspeakers that convert the acoustic waves into electrical signals, process them and convert them back into sound waves. Such electromechanical devices include the telharmonium, Hammond organ, electric piano and electric guitar.", "experimental": "Experimental music is a general label for any music or music genre that pushes existing boundaries and genre definitions. Experimental compositional practice is defined broadly by exploratory sensibilities radically opposed to, and questioning of, institutionalized compositional, performing, and aesthetic conventions in music. Elements of experimental music include indeterminacy, in which the composer introduces the elements of chance or unpredictability with regard to either the composition or its performance. Artists may approach a hybrid of disparate styles or incorporate unorthodox and unique elements.", - "field_recording": "Field recording is the production of audio recordings outside recording studios, and the term applies to recordings of both natural and human-produced sounds. It can also include the recording of electromagnetic fields or vibrations using different microphones like a passive magnetic antenna for electromagnetic recordings or contact microphones, or underwater field recordings made with hydrophones to capture the sounds and\/or movements of whales, or other sealife. These recordings are often regarded as being very useful for sound designers and foley artists.", + "field_recording": "Field recording is the production of audio recordings outside recording studios, and the term applies to recordings of both natural and human-produced sounds. It can also include the recording of electromagnetic fields or vibrations using different microphones like a passive magnetic antenna for electromagnetic recordings or contact microphones, or underwater field recordings made with hydrophones to capture the sounds and/or movements of whales, or other sealife. These recordings are often regarded as being very useful for sound designers and foley artists.", "folk": "Folk music is a music genre that includes traditional folk music and the contemporary genre that evolved from the former during the 20th-century folk revival. Some types of folk music may be called world music. Traditional folk music has been defined in several ways: as music transmitted orally, music with unknown composers, music that is played on traditional instruments, music about cultural or national identity, music that changes between generations, music associated with a people's folklore, or music performed by custom over a long period of time. It has been contrasted with commercial and classical styles. The term originated in the 19th century, but folk music extends beyond that.", "funk": "Funk is a music genre that originated in African-American communities in the mid-1960s when musicians created a rhythmic, danceable new form of music through a mixture of various music genres that were popular among African-Americans in the mid-20th century. It deemphasizes melody and chord progressions and focuses on a strong rhythmic groove of a bassline played by an electric bassist and a drum part played by a percussionist, often at slower tempos than other popular music. Funk typically consists of a complex percussive groove with rhythm instruments playing interlocking grooves that create a \"hypnotic\" and \"danceable\" feel. Early funk, specifically James Brown, fused jazz and blues, and added a syncopated drum groove.", "gangsta_rap": "Gangsta or gangster rap, initially called reality rap, is a subgenre of hip-hop that conveys the culture, values, and experiences of urban gangs and street hustlers, frequently discussing unpleasant realities of the world in general through an urban lens. Emerging in the late 1980s, gangsta rap's pioneers include Schoolly D and Ice-T, later expanding with artists such as N.W.A. In 1992, via record producer and rapper Dr. Dre, rapper Snoop Dogg, and their G-funk sound, gangster rap broadened to mainstream popularity.", @@ -1533,7 +1533,7 @@ "on_demand": "On demand", "automatic_schedule": "Automatic schedule", "system": "System", - "no_value": "n\/a", + "no_value": "n/a", "loading_log": "Loading log...", "no_log_output": "No log output available.", "open": "Open background tasks", @@ -1630,5 +1630,34 @@ "radiobrowser_by_popularity": "By popularity", "radiobrowser_by_category": "By category", "restore_genre": "Restore", - "genre_name": "Genre name" -} + "genre_name": "Genre name", + "smart_playlist": { + "create": "Create Smart Playlist", + "desc": "Generate a playlist from your library based on rules.", + "mode": "Mode", + "dynamic": "Dynamic", + "fixed": "Fixed (one-time)", + "track_count": "Number of tracks", + "favorites_only": "Favorites only", + "logic": "Rule combination", + "logic_and": "Match ALL rules (AND)", + "logic_or": "Match ANY rule (OR)", + "logic_tooltip": "AND: a track must match all active rules. OR: a track needs to match at least one rule.", + "min_popularity": "Minimum popularity", + "any": "Any", + "limit": "Max tracks", + "seed_track": "Similar to track", + "seed_track_pick": "Pick a track", + "seed_track_tooltip": "Pick a track to find similar tracks via your streaming provider (e.g. Apple Music, Spotify). Artist and album filters are ignored when a seed track is set.", + "seed_overrides_filter": "Not used when a seed track is set", + "min_popularity_tooltip": "Popularity is a score from 0–100 provided by your streaming service. Tracks without a popularity score are always included.", + "clear": "Clear", + "creating": "Creating…", + "created": "Smart playlist created!", + "edit_rules": "Edit rules", + "saving": "Saving…", + "year_range": "Year range", + "year_from": "From year", + "year_to": "To year" + } +} \ No newline at end of file diff --git a/src/views/LibraryPlaylists.vue b/src/views/LibraryPlaylists.vue index a1931e1ca..7707b058a 100644 --- a/src/views/LibraryPlaylists.vue +++ b/src/views/LibraryPlaylists.vue @@ -115,6 +115,21 @@ onMounted(() => { overflowAllowed: true, }); } + // Smart Playlist option inside the "Create Playlist" submenu + if ( + Object.values(api.providers).some( + (p) => p.available && p.domain === "smart_playlist", + ) + ) { + playListCreateItems.push({ + label: "smart_playlist.create", + action: () => { + eventbus.emit("createSmartPlaylist", {}); + }, + icon: "mdi-playlist-star", + overflowAllowed: true, + }); + } if (playListCreateItems.length) { extraMenuItems.value.push({ label: "create_playlist_on", diff --git a/src/views/PlaylistDetails.vue b/src/views/PlaylistDetails.vue index 9f1121615..9e786314c 100644 --- a/src/views/PlaylistDetails.vue +++ b/src/views/PlaylistDetails.vue @@ -1,5 +1,23 @@