mirror of
https://github.com/jeffvli/feishin.git
synced 2026-05-10 04:30:25 +02:00
Compare commits
17 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| f783a6360e | |||
| 8eb6c6a213 | |||
| ea5f0268cb | |||
| 427272f8c8 | |||
| 40d09404b3 | |||
| f3ee198833 | |||
| 5416d6e596 | |||
| a0639cbd27 | |||
| 790961f29a | |||
| 18027d4292 | |||
| a8b3944c66 | |||
| a00385e78f | |||
| 5e628d96c7 | |||
| ad34d8553e | |||
| a89b6640a9 | |||
| b3b810c62c | |||
| ecef9bea5e |
Generated
+2
-2
@@ -1,12 +1,12 @@
|
|||||||
{
|
{
|
||||||
"name": "feishin",
|
"name": "feishin",
|
||||||
"version": "0.10.1",
|
"version": "0.11.0",
|
||||||
"lockfileVersion": 2,
|
"lockfileVersion": 2,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "feishin",
|
"name": "feishin",
|
||||||
"version": "0.10.1",
|
"version": "0.11.0",
|
||||||
"hasInstallScript": true,
|
"hasInstallScript": true,
|
||||||
"license": "GPL-3.0",
|
"license": "GPL-3.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
|||||||
+1
-1
@@ -2,7 +2,7 @@
|
|||||||
"name": "feishin",
|
"name": "feishin",
|
||||||
"productName": "Feishin",
|
"productName": "Feishin",
|
||||||
"description": "Feishin music server",
|
"description": "Feishin music server",
|
||||||
"version": "0.10.1",
|
"version": "0.11.0",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"build": "concurrently \"npm run build:main\" \"npm run build:renderer\" \"npm run build:remote\"",
|
"build": "concurrently \"npm run build:main\" \"npm run build:renderer\" \"npm run build:remote\"",
|
||||||
"build:main": "cross-env NODE_ENV=production TS_NODE_TRANSPILE_ONLY=true webpack --config ./.erb/configs/webpack.config.main.prod.ts",
|
"build:main": "cross-env NODE_ENV=production TS_NODE_TRANSPILE_ONLY=true webpack --config ./.erb/configs/webpack.config.main.prod.ts",
|
||||||
|
|||||||
Generated
+2
-2
@@ -1,12 +1,12 @@
|
|||||||
{
|
{
|
||||||
"name": "feishin",
|
"name": "feishin",
|
||||||
"version": "0.10.1",
|
"version": "0.11.0",
|
||||||
"lockfileVersion": 2,
|
"lockfileVersion": 2,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "feishin",
|
"name": "feishin",
|
||||||
"version": "0.10.1",
|
"version": "0.11.0",
|
||||||
"hasInstallScript": true,
|
"hasInstallScript": true,
|
||||||
"license": "GPL-3.0",
|
"license": "GPL-3.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "feishin",
|
"name": "feishin",
|
||||||
"version": "0.10.1",
|
"version": "0.11.0",
|
||||||
"description": "",
|
"description": "",
|
||||||
"main": "./dist/main/main.js",
|
"main": "./dist/main/main.js",
|
||||||
"author": {
|
"author": {
|
||||||
|
|||||||
@@ -222,7 +222,7 @@
|
|||||||
"volumeWidth": "šířka posuvníku hlasitosti",
|
"volumeWidth": "šířka posuvníku hlasitosti",
|
||||||
"volumeWidth_description": "horizontální velikost posuvníku hlasitosti",
|
"volumeWidth_description": "horizontální velikost posuvníku hlasitosti",
|
||||||
"discordListening": "zobrazit stav jako „Poslouchá“",
|
"discordListening": "zobrazit stav jako „Poslouchá“",
|
||||||
"discordListening_description": "zobrazit stav jako „Poslouchá“ namísto „Hraje“. tato funkce v současné době není kompatibilní s lištou s časem",
|
"discordListening_description": "zobrazit stav jako „Poslouchá“ namísto „Hraje“",
|
||||||
"contextMenu": "nastavení kontextové nabídky (kliknutí pravým)",
|
"contextMenu": "nastavení kontextové nabídky (kliknutí pravým)",
|
||||||
"contextMenu_description": "umožňuje skrýt položky, které se zobrazí v nabídce po kliknutí pravým tlačítkem myši na položku. položky, které nejsou zaškrtnuté, se skryjí",
|
"contextMenu_description": "umožňuje skrýt položky, které se zobrazí v nabídce po kliknutí pravým tlačítkem myši na položku. položky, které nejsou zaškrtnuté, se skryjí",
|
||||||
"customCssEnable": "povolit vlastní CSS",
|
"customCssEnable": "povolit vlastní CSS",
|
||||||
@@ -776,8 +776,8 @@
|
|||||||
"play_one": "{{count}} přehrání",
|
"play_one": "{{count}} přehrání",
|
||||||
"play_few": "{{count}} přehrání",
|
"play_few": "{{count}} přehrání",
|
||||||
"play_other": "{{count}} přehrání",
|
"play_other": "{{count}} přehrání",
|
||||||
"song_one": " ",
|
"song_one": "píseň",
|
||||||
"song_few": " ",
|
"song_few": "písničky",
|
||||||
"song_other": " "
|
"song_other": "písní"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+58
-18
@@ -107,7 +107,13 @@
|
|||||||
"reload": "Neu Laden",
|
"reload": "Neu Laden",
|
||||||
"mbid": "MusicBrainz ID",
|
"mbid": "MusicBrainz ID",
|
||||||
"close": "schliessen",
|
"close": "schliessen",
|
||||||
"share": "Teilen"
|
"share": "Teilen",
|
||||||
|
"translation": "Übersetzung",
|
||||||
|
"trackGain": "Track-Pegelverstärkung",
|
||||||
|
"trackPeak": "Track-Spitzenpegel",
|
||||||
|
"codec": "Codec",
|
||||||
|
"albumPeak": "Album-Spitzenpegel",
|
||||||
|
"albumGain": "Album-Pegelverstärkung"
|
||||||
},
|
},
|
||||||
"error": {
|
"error": {
|
||||||
"remotePortWarning": "Starten Sie den Server neu, um den neuen Port anzuwenden",
|
"remotePortWarning": "Starten Sie den Server neu, um den neuen Port anzuwenden",
|
||||||
@@ -179,13 +185,13 @@
|
|||||||
},
|
},
|
||||||
"form": {
|
"form": {
|
||||||
"deletePlaylist": {
|
"deletePlaylist": {
|
||||||
"title": "Lösche $t(entity.playlist_one)",
|
"title": "$t(entity.playlist_one) löschen",
|
||||||
"success": "$t(entity.playlist_one) erfolgreich gelöscht",
|
"success": "$t(entity.playlist_one) erfolgreich gelöscht",
|
||||||
"input_confirm": "Geben Sie zur Bestätigung den Namen von $t(entity.playlist_one) ein"
|
"input_confirm": "Geben Sie zur Bestätigung den Namen von $t(entity.playlist_one) ein"
|
||||||
},
|
},
|
||||||
"createPlaylist": {
|
"createPlaylist": {
|
||||||
"input_description": "$t(common.description)",
|
"input_description": "$t(common.description)",
|
||||||
"title": "Erstellen $t(entity.playlist_one)",
|
"title": "$t(entity.playlist_one) erstellen",
|
||||||
"input_public": "öffentlich",
|
"input_public": "öffentlich",
|
||||||
"success": "$t(entity.playlist_one) erfolgreich erstellt",
|
"success": "$t(entity.playlist_one) erfolgreich erstellt",
|
||||||
"input_name": "$t(common.name)",
|
"input_name": "$t(common.name)",
|
||||||
@@ -267,7 +273,9 @@
|
|||||||
"trackWithCount_other": "{{count}} Tracks",
|
"trackWithCount_other": "{{count}} Tracks",
|
||||||
"smartPlaylist": "Smart $t(entity.playlist_one)",
|
"smartPlaylist": "Smart $t(entity.playlist_one)",
|
||||||
"play_one": "{{count}} Wiedergabe",
|
"play_one": "{{count}} Wiedergabe",
|
||||||
"play_other": "{{count}} Wiedergaben"
|
"play_other": "{{count}} Wiedergaben",
|
||||||
|
"song_one": "Lied",
|
||||||
|
"song_other": "Lieder"
|
||||||
},
|
},
|
||||||
"table": {
|
"table": {
|
||||||
"config": {
|
"config": {
|
||||||
@@ -348,11 +356,13 @@
|
|||||||
"unsynchronized": "nicht synchronisiert",
|
"unsynchronized": "nicht synchronisiert",
|
||||||
"lyricAlignment": "Songtext-Ausrichtung",
|
"lyricAlignment": "Songtext-Ausrichtung",
|
||||||
"useImageAspectRatio": "Bildseitenverhältnis verwenden",
|
"useImageAspectRatio": "Bildseitenverhältnis verwenden",
|
||||||
"lyricGap": "Songtext-Lücke"
|
"lyricGap": "Songtext-Lücke",
|
||||||
|
"dynamicIsImage": "Hintergrundbild aktivieren"
|
||||||
},
|
},
|
||||||
"upNext": "als nächstes",
|
"upNext": "als nächstes",
|
||||||
"lyrics": "Songtexte",
|
"lyrics": "Songtexte",
|
||||||
"related": "Ähnliche"
|
"related": "Ähnliche",
|
||||||
|
"noLyrics": "Keine Liedtexte gefunden"
|
||||||
},
|
},
|
||||||
"appMenu": {
|
"appMenu": {
|
||||||
"selectServer": "Server auswählen",
|
"selectServer": "Server auswählen",
|
||||||
@@ -375,18 +385,19 @@
|
|||||||
},
|
},
|
||||||
"albumDetail": {
|
"albumDetail": {
|
||||||
"moreFromArtist": "Mehr von diesem $t(entity.artist_one)",
|
"moreFromArtist": "Mehr von diesem $t(entity.artist_one)",
|
||||||
"moreFromGeneric": "Mehr von {{item}}"
|
"moreFromGeneric": "Mehr von {{item}}",
|
||||||
|
"released": "erschienen"
|
||||||
},
|
},
|
||||||
"globalSearch": {
|
"globalSearch": {
|
||||||
"commands": {
|
"commands": {
|
||||||
"serverCommands": "Serverbefehle",
|
"serverCommands": "Serverbefehle",
|
||||||
"goToPage": "Gehe zur Seite",
|
"goToPage": "Gehe zur Seite",
|
||||||
"searchFor": "Suche nach {{query}}"
|
"searchFor": "Nach {{query}} suchen"
|
||||||
},
|
},
|
||||||
"title": "Befehle"
|
"title": "Befehle"
|
||||||
},
|
},
|
||||||
"contextMenu": {
|
"contextMenu": {
|
||||||
"numberSelected": "{{count}} Ausgewählte",
|
"numberSelected": "{{count}} ausgewählt",
|
||||||
"addToPlaylist": "$t(action.addToPlaylist)",
|
"addToPlaylist": "$t(action.addToPlaylist)",
|
||||||
"addToFavorites": "$t(action.addToFavorites)",
|
"addToFavorites": "$t(action.addToFavorites)",
|
||||||
"setRating": "$t(action.setRating)",
|
"setRating": "$t(action.setRating)",
|
||||||
@@ -401,7 +412,10 @@
|
|||||||
"addLast": "$t(player.addLast)",
|
"addLast": "$t(player.addLast)",
|
||||||
"addFavorite": "$t(action.addToFavorites)",
|
"addFavorite": "$t(action.addToFavorites)",
|
||||||
"play": "$t(player.play)",
|
"play": "$t(player.play)",
|
||||||
"removeFromQueue": "$t(action.removeFromQueue)"
|
"removeFromQueue": "$t(action.removeFromQueue)",
|
||||||
|
"playShuffled": "$t(player.shuffle)",
|
||||||
|
"download": "Download",
|
||||||
|
"playSimilarSongs": "$t(player.playSimilarSongs)"
|
||||||
},
|
},
|
||||||
"sidebar": {
|
"sidebar": {
|
||||||
"nowPlaying": "läuft gerade",
|
"nowPlaying": "läuft gerade",
|
||||||
@@ -414,34 +428,59 @@
|
|||||||
"settings": "$t(common.setting_other)",
|
"settings": "$t(common.setting_other)",
|
||||||
"home": "$t(common.home)",
|
"home": "$t(common.home)",
|
||||||
"artists": "$t(entity.artist_other)",
|
"artists": "$t(entity.artist_other)",
|
||||||
"albumArtists": "$t(entity.albumArtist_other)"
|
"albumArtists": "$t(entity.albumArtist_other)",
|
||||||
|
"shared": "$t(entity.playlist_other) geteilt"
|
||||||
},
|
},
|
||||||
"setting": {
|
"setting": {
|
||||||
"playbackTab": "Wiedergabe",
|
"playbackTab": "Wiedergabe",
|
||||||
"generalTab": "allgemein",
|
"generalTab": "Allgemein",
|
||||||
"hotkeysTab": "Kurzbefehle",
|
"hotkeysTab": "Kurzbefehle",
|
||||||
"windowTab": "Fenster"
|
"windowTab": "Fenster",
|
||||||
|
"advanced": "Erweitert"
|
||||||
},
|
},
|
||||||
"albumArtistList": {
|
"albumArtistList": {
|
||||||
"title": "$t(entity.albumArtist_other)"
|
"title": "$t(entity.albumArtist_other)"
|
||||||
},
|
},
|
||||||
"genreList": {
|
"genreList": {
|
||||||
"title": "$t(entity.genre_other)"
|
"title": "$t(entity.genre_other)",
|
||||||
|
"showTracks": "$t(entity.genre_one) $t(entity.track_other) anzeigen",
|
||||||
|
"showAlbums": "$t(entity.genre_one) $t(entity.album_other) anzeigen"
|
||||||
},
|
},
|
||||||
"trackList": {
|
"trackList": {
|
||||||
"title": "$t(entity.track_other)"
|
"title": "$t(entity.track_other)",
|
||||||
|
"artistTracks": "Tracks von {{artist}}",
|
||||||
|
"genreTracks": "\"{{genre}}\" $t(entity.track_other)"
|
||||||
},
|
},
|
||||||
"playlistList": {
|
"playlistList": {
|
||||||
"title": "$t(entity.playlist_other)"
|
"title": "$t(entity.playlist_other)"
|
||||||
},
|
},
|
||||||
"albumList": {
|
"albumList": {
|
||||||
"title": "$t(entity.album_other)"
|
"title": "$t(entity.album_other)",
|
||||||
|
"artistAlbums": "Alben von {{artist}}",
|
||||||
|
"genreAlbums": "\"{{genre}}\" $t(entity.album_other)"
|
||||||
},
|
},
|
||||||
"albumArtistDetail": {
|
"albumArtistDetail": {
|
||||||
"about": "Über {{artist}}",
|
"about": "Über {{artist}}",
|
||||||
"appearsOn": "erscheint auf",
|
"appearsOn": "erscheint auf",
|
||||||
"recentReleases": "Kürzliche Veröffentlichungen",
|
"recentReleases": "Kürzliche Veröffentlichungen",
|
||||||
"viewDiscography": "Diskographie ansehen"
|
"viewDiscography": "Diskographie ansehen",
|
||||||
|
"viewAllTracks": "Alle $t(entity.track_other) ansehen",
|
||||||
|
"topSongsFrom": "Toplieder von {{title}}",
|
||||||
|
"viewAll": "Alles ansehen",
|
||||||
|
"topSongs": "Toplieder"
|
||||||
|
},
|
||||||
|
"manageServers": {
|
||||||
|
"title": "Servers verwalten",
|
||||||
|
"editServerDetailsTooltip": "Serverdetails editieren",
|
||||||
|
"removeServer": "Server entfernen",
|
||||||
|
"url": "URL",
|
||||||
|
"serverDetails": "Serverdetails",
|
||||||
|
"username": "Benutzername"
|
||||||
|
},
|
||||||
|
"itemDetail": {
|
||||||
|
"copyPath": "Pfad in Zwischenablage kopieren",
|
||||||
|
"copiedPath": "Pfad erfolgreich kopiert",
|
||||||
|
"openFile": "Track im Dateiexplorer anzeigen"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"player": {
|
"player": {
|
||||||
@@ -473,7 +512,8 @@
|
|||||||
"pause": "Pause",
|
"pause": "Pause",
|
||||||
"unfavorite": "Aus Favoriten entfernen",
|
"unfavorite": "Aus Favoriten entfernen",
|
||||||
"skip_forward": "Vorspulen",
|
"skip_forward": "Vorspulen",
|
||||||
"skip": "Überspringen"
|
"skip": "Überspringen",
|
||||||
|
"playSimilarSongs": "Ähnliche Lieder abspielen"
|
||||||
},
|
},
|
||||||
"setting": {
|
"setting": {
|
||||||
"audioDevice_description": "Wählen Sie das Audiogerät aus, das für die Wiedergabe verwendet werden soll (nur Webplayer).",
|
"audioDevice_description": "Wählen Sie das Audiogerät aus, das für die Wiedergabe verwendet werden soll (nur Webplayer).",
|
||||||
|
|||||||
@@ -8,6 +8,7 @@
|
|||||||
"deselectAll": "deselect all",
|
"deselectAll": "deselect all",
|
||||||
"editPlaylist": "edit $t(entity.playlist_one)",
|
"editPlaylist": "edit $t(entity.playlist_one)",
|
||||||
"goToPage": "go to page",
|
"goToPage": "go to page",
|
||||||
|
"moveToNext": "move to next",
|
||||||
"moveToBottom": "move to bottom",
|
"moveToBottom": "move to bottom",
|
||||||
"moveToTop": "move to top",
|
"moveToTop": "move to top",
|
||||||
"refresh": "$t(common.refresh)",
|
"refresh": "$t(common.refresh)",
|
||||||
@@ -147,8 +148,8 @@
|
|||||||
"smartPlaylist": "smart $t(entity.playlist_one)",
|
"smartPlaylist": "smart $t(entity.playlist_one)",
|
||||||
"track_one": "track",
|
"track_one": "track",
|
||||||
"track_other": "tracks",
|
"track_other": "tracks",
|
||||||
"song_one": "",
|
"song_one": "song",
|
||||||
"song_other": "",
|
"song_other": "songs",
|
||||||
"trackWithCount_one": "{{count}} track",
|
"trackWithCount_one": "{{count}} track",
|
||||||
"trackWithCount_other": "{{count}} tracks"
|
"trackWithCount_other": "{{count}} tracks"
|
||||||
},
|
},
|
||||||
@@ -335,6 +336,7 @@
|
|||||||
"deletePlaylist": "$t(action.deletePlaylist)",
|
"deletePlaylist": "$t(action.deletePlaylist)",
|
||||||
"deselectAll": "$t(action.deselectAll)",
|
"deselectAll": "$t(action.deselectAll)",
|
||||||
"download": "download",
|
"download": "download",
|
||||||
|
"moveToNext": "$t(action.moveToNext)",
|
||||||
"moveToBottom": "$t(action.moveToBottom)",
|
"moveToBottom": "$t(action.moveToBottom)",
|
||||||
"moveToTop": "$t(action.moveToTop)",
|
"moveToTop": "$t(action.moveToTop)",
|
||||||
"numberSelected": "{{count}} selected",
|
"numberSelected": "{{count}} selected",
|
||||||
@@ -508,7 +510,7 @@
|
|||||||
"discordIdleStatus": "show rich presence idle status",
|
"discordIdleStatus": "show rich presence idle status",
|
||||||
"discordIdleStatus_description": "when enabled, update status while player is idle",
|
"discordIdleStatus_description": "when enabled, update status while player is idle",
|
||||||
"discordListening": "show status as listening",
|
"discordListening": "show status as listening",
|
||||||
"discordListening_description": "show status as listening instead of playing. note that this currently breaks timer bar",
|
"discordListening_description": "show status as listening instead of playing",
|
||||||
"discordRichPresence": "{{discord}} rich presence",
|
"discordRichPresence": "{{discord}} rich presence",
|
||||||
"discordRichPresence_description": "enable playback status in {{discord}} rich presence. Image keys are: {{icon}}, {{playing}}, and {{paused}} ",
|
"discordRichPresence_description": "enable playback status in {{discord}} rich presence. Image keys are: {{icon}}, {{playing}}, and {{paused}} ",
|
||||||
"discordUpdateInterval": "{{discord}} rich presence update interval",
|
"discordUpdateInterval": "{{discord}} rich presence update interval",
|
||||||
|
|||||||
@@ -221,7 +221,7 @@
|
|||||||
"doubleClickBehavior_description": "si es true, se pondrán en cola todas las pistas que coincidan en una búsqueda de pistas. De lo contrario, solo se pondrá en cola la pista seleccionada",
|
"doubleClickBehavior_description": "si es true, se pondrán en cola todas las pistas que coincidan en una búsqueda de pistas. De lo contrario, solo se pondrá en cola la pista seleccionada",
|
||||||
"volumeWidth": "Ancho del deslizador de volumen",
|
"volumeWidth": "Ancho del deslizador de volumen",
|
||||||
"volumeWidth_description": "La anchura del deslizador de volumen",
|
"volumeWidth_description": "La anchura del deslizador de volumen",
|
||||||
"discordListening_description": "Muestra el estado como escuchando en lugar de reproduciendo. Ten en cuenta que esto actualmente rompe la barra de tiempo",
|
"discordListening_description": "mostrar el estado como escuchando en lugar de jugando",
|
||||||
"discordListening": "Mostrar estado como escuchando",
|
"discordListening": "Mostrar estado como escuchando",
|
||||||
"contextMenu": "Configuración del menú de contexto (clic derecho)",
|
"contextMenu": "Configuración del menú de contexto (clic derecho)",
|
||||||
"contextMenu_description": "Te permite esconder elementos que son mostrados en el menú cuando haces clic derecho en un elemento. Los elementos que no estén seleccionados serán escondidos",
|
"contextMenu_description": "Te permite esconder elementos que son mostrados en el menú cuando haces clic derecho en un elemento. Los elementos que no estén seleccionados serán escondidos",
|
||||||
@@ -775,6 +775,9 @@
|
|||||||
"trackWithCount_other": "{{count}} pistas",
|
"trackWithCount_other": "{{count}} pistas",
|
||||||
"play_one": "Reproducir {{count}}",
|
"play_one": "Reproducir {{count}}",
|
||||||
"play_many": "Reproducir {{count}}",
|
"play_many": "Reproducir {{count}}",
|
||||||
"play_other": "Reproducir {{count}}"
|
"play_other": "Reproducir {{count}}",
|
||||||
|
"song_one": "canción",
|
||||||
|
"song_many": "canciones",
|
||||||
|
"song_other": "canciones"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+61
-23
@@ -11,7 +11,7 @@
|
|||||||
"skip_back": "reculer",
|
"skip_back": "reculer",
|
||||||
"favorite": "favori",
|
"favorite": "favori",
|
||||||
"next": "suivant",
|
"next": "suivant",
|
||||||
"shuffle": "aléatoire",
|
"shuffle": "lecture aléatoire",
|
||||||
"playbackFetchNoResults": "aucune chansons trouvées",
|
"playbackFetchNoResults": "aucune chansons trouvées",
|
||||||
"playbackFetchInProgress": "chargement des chansons…",
|
"playbackFetchInProgress": "chargement des chansons…",
|
||||||
"addNext": "ajouter ensuite",
|
"addNext": "ajouter ensuite",
|
||||||
@@ -29,13 +29,14 @@
|
|||||||
"skip_forward": "avancer",
|
"skip_forward": "avancer",
|
||||||
"pause": "pause",
|
"pause": "pause",
|
||||||
"unfavorite": "retirer des favoris",
|
"unfavorite": "retirer des favoris",
|
||||||
"playSimilarSongs": "jouer des chansons similaires"
|
"playSimilarSongs": "jouer des chansons similaires",
|
||||||
|
"viewQueue": "voir la file d'attente"
|
||||||
},
|
},
|
||||||
"action": {
|
"action": {
|
||||||
"editPlaylist": "éditer $t(entity.playlist_one)",
|
"editPlaylist": "éditer $t(entity.playlist_one)",
|
||||||
"goToPage": "aller à la page",
|
"goToPage": "aller à la page",
|
||||||
"moveToTop": "déplacer en haut",
|
"moveToTop": "déplacer en haut",
|
||||||
"clearQueue": "effacer la liste de lecture",
|
"clearQueue": "vider la file d'attente",
|
||||||
"addToFavorites": "ajouter aux $t(entity.favorite_other)",
|
"addToFavorites": "ajouter aux $t(entity.favorite_other)",
|
||||||
"addToPlaylist": "ajouter à $t(entity.playlist_one)",
|
"addToPlaylist": "ajouter à $t(entity.playlist_one)",
|
||||||
"createPlaylist": "créer $t(entity.playlist_one)",
|
"createPlaylist": "créer $t(entity.playlist_one)",
|
||||||
@@ -65,7 +66,7 @@
|
|||||||
"edit": "éditer",
|
"edit": "éditer",
|
||||||
"favorite": "favoris",
|
"favorite": "favoris",
|
||||||
"left": "gauche",
|
"left": "gauche",
|
||||||
"save": "sauvegarder",
|
"save": "enregistrer",
|
||||||
"right": "droite",
|
"right": "droite",
|
||||||
"currentSong": "$t(entity.track_one) actuelle",
|
"currentSong": "$t(entity.track_one) actuelle",
|
||||||
"collapse": "réduire",
|
"collapse": "réduire",
|
||||||
@@ -92,7 +93,7 @@
|
|||||||
"no": "non",
|
"no": "non",
|
||||||
"owner": "propriétaire",
|
"owner": "propriétaire",
|
||||||
"enable": "activer",
|
"enable": "activer",
|
||||||
"clear": "effacer",
|
"clear": "vider",
|
||||||
"forward": "avancer",
|
"forward": "avancer",
|
||||||
"delete": "supprimer",
|
"delete": "supprimer",
|
||||||
"cancel": "annuler",
|
"cancel": "annuler",
|
||||||
@@ -106,7 +107,7 @@
|
|||||||
"filters": "filtres",
|
"filters": "filtres",
|
||||||
"create": "créer",
|
"create": "créer",
|
||||||
"bitrate": "bitrate",
|
"bitrate": "bitrate",
|
||||||
"saveAndReplace": "sauvegarder et remplacer",
|
"saveAndReplace": "enregistrer et remplacer",
|
||||||
"action_one": "action",
|
"action_one": "action",
|
||||||
"action_many": "actions",
|
"action_many": "actions",
|
||||||
"action_other": "actions",
|
"action_other": "actions",
|
||||||
@@ -124,12 +125,12 @@
|
|||||||
"none": "aucun",
|
"none": "aucun",
|
||||||
"menu": "menu",
|
"menu": "menu",
|
||||||
"restartRequired": "redémarrage requis",
|
"restartRequired": "redémarrage requis",
|
||||||
"previousSong": "précédant $t(entity.track_one)",
|
"previousSong": "$t(entity.track_one) précédente",
|
||||||
"noResultsFromQuery": "la requête n'a retourné aucun résultat",
|
"noResultsFromQuery": "la requête n'a retourné aucun résultat",
|
||||||
"quit": "quitter",
|
"quit": "quitter",
|
||||||
"expand": "étendre",
|
"expand": "étendre",
|
||||||
"search": "recherche",
|
"search": "recherche",
|
||||||
"saveAs": "sauvegarder en tant que",
|
"saveAs": "enregistrer en tant que",
|
||||||
"disc": "disque",
|
"disc": "disque",
|
||||||
"yes": "oui",
|
"yes": "oui",
|
||||||
"random": "aléatoire",
|
"random": "aléatoire",
|
||||||
@@ -152,29 +153,29 @@
|
|||||||
"remotePortWarning": "redémarrer le serveur pour appliquer le nouveau port",
|
"remotePortWarning": "redémarrer le serveur pour appliquer le nouveau port",
|
||||||
"systemFontError": "une erreur s’est produite lors de la tentative d’obtenir les polices système",
|
"systemFontError": "une erreur s’est produite lors de la tentative d’obtenir les polices système",
|
||||||
"playbackError": "une erreur s'est produite lors de la tentative de lecture du média",
|
"playbackError": "une erreur s'est produite lors de la tentative de lecture du média",
|
||||||
"endpointNotImplementedError": "endpoint {{endpoint}} n'est pas implémenté pour {{serverType}}",
|
"endpointNotImplementedError": "l'endpoint {{endpoint}} n'est pas implémenté pour {{serverType}}",
|
||||||
"remotePortError": "une erreur s'est produite lors de la tentative de définir le port du serveur distant",
|
"remotePortError": "une erreur s'est produite lors de la tentative de définir le port du serveur distant",
|
||||||
"serverRequired": "serveur requis",
|
"serverRequired": "serveur requis",
|
||||||
"authenticationFailed": "l'authentification à échoué",
|
"authenticationFailed": "l'authentification a échoué",
|
||||||
"apiRouteError": "incapable d’acheminer la demande",
|
"apiRouteError": "incapable d’acheminer la demande",
|
||||||
"genericError": "une erreur s'est produite",
|
"genericError": "une erreur s'est produite",
|
||||||
"credentialsRequired": "identifiants requis",
|
"credentialsRequired": "identifiants requis",
|
||||||
"sessionExpiredError": "votre session a expiré",
|
"sessionExpiredError": "votre session a expiré",
|
||||||
"remoteEnableError": "une erreur s'est produite lors de la tentative de $t(common.enable) le serveur distant",
|
"remoteEnableError": "une erreur s'est produite lors de la tentative de $t(common.enable) le serveur distant",
|
||||||
"localFontAccessDenied": "accès refusé aux polices locales",
|
"localFontAccessDenied": "accès refusé aux polices locales",
|
||||||
"serverNotSelectedError": "aucun serveur sélectionner",
|
"serverNotSelectedError": "aucun serveur sélectionné",
|
||||||
"remoteDisableError": "une erreur s'est produite lors de la tentative de $t(common.disable) le serveur distant",
|
"remoteDisableError": "une erreur s'est produite lors de la tentative de $t(common.disable) le serveur distant",
|
||||||
"mpvRequired": "MPV requis",
|
"mpvRequired": "MPV requis",
|
||||||
"audioDeviceFetchError": "une erreur s’est produite lors de la tentative d’obtenir les périphériques audio",
|
"audioDeviceFetchError": "une erreur s’est produite lors de la tentative d’obtenir les périphériques audio",
|
||||||
"invalidServer": "serveur invalide",
|
"invalidServer": "serveur invalide",
|
||||||
"loginRateError": "trop de tentative de connexion, merci d'essayer dans quelque secondes",
|
"loginRateError": "trop de tentative de connexion, merci de réessayer dans quelques secondes",
|
||||||
"openError": "impossible d'ouvrir le fichier",
|
"openError": "impossible d'ouvrir le fichier",
|
||||||
"networkError": "une erreur de réseau est survenue",
|
"networkError": "une erreur de réseau est survenue",
|
||||||
"badAlbum": "vous voyez cette page parce que cette chanson ne fait pas parti d'un album. vous rencontrez probablement cette erreur si vous avez une chanson qui n'est pas dans votre répertoire de musique. jellyfin gère les chansons uniquement si elles sont dans un sous-dossier, qui est lui-même dans un dossier \"Musique(s)\"."
|
"badAlbum": "vous voyez cette page parce que cette chanson ne fait pas parti d'un album. vous rencontrez probablement cette erreur si vous avez une chanson qui n'est pas dans votre répertoire de musique. jellyfin gère les chansons uniquement si elles sont dans un sous-dossier, qui est lui-même dans un dossier \"Musique(s)\"."
|
||||||
},
|
},
|
||||||
"filter": {
|
"filter": {
|
||||||
"mostPlayed": "plus joués",
|
"mostPlayed": "plus joués",
|
||||||
"playCount": "nombre d'écoutes",
|
"playCount": "nombre d'écoute",
|
||||||
"isCompilation": "est une compilation",
|
"isCompilation": "est une compilation",
|
||||||
"recentlyPlayed": "récemment joué",
|
"recentlyPlayed": "récemment joué",
|
||||||
"isRated": "est noté",
|
"isRated": "est noté",
|
||||||
@@ -191,7 +192,7 @@
|
|||||||
"path": "chemin",
|
"path": "chemin",
|
||||||
"favorited": "favoris",
|
"favorited": "favoris",
|
||||||
"isRecentlyPlayed": "est récemment joué",
|
"isRecentlyPlayed": "est récemment joué",
|
||||||
"isFavorited": "est favoris",
|
"isFavorited": "est favori",
|
||||||
"bpm": "bpm",
|
"bpm": "bpm",
|
||||||
"releaseYear": "année de sortie",
|
"releaseYear": "année de sortie",
|
||||||
"disc": "disque",
|
"disc": "disque",
|
||||||
@@ -199,7 +200,7 @@
|
|||||||
"songCount": "nombre de chansons",
|
"songCount": "nombre de chansons",
|
||||||
"duration": "durée",
|
"duration": "durée",
|
||||||
"random": "aléatoire",
|
"random": "aléatoire",
|
||||||
"lastPlayed": "dernière joué",
|
"lastPlayed": "dernier joué",
|
||||||
"toYear": "à l'année",
|
"toYear": "à l'année",
|
||||||
"fromYear": "depuis l'année",
|
"fromYear": "depuis l'année",
|
||||||
"criticRating": "note des critiques",
|
"criticRating": "note des critiques",
|
||||||
@@ -245,12 +246,14 @@
|
|||||||
"lyricSize": "Taille des paroles",
|
"lyricSize": "Taille des paroles",
|
||||||
"lyricGap": "espacement des lettres",
|
"lyricGap": "espacement des lettres",
|
||||||
"dynamicIsImage": "activer l'image d'arrière-plan",
|
"dynamicIsImage": "activer l'image d'arrière-plan",
|
||||||
"dynamicImageBlur": "intensité de flou sur image d'arrière-plan"
|
"dynamicImageBlur": "intensité de flou sur image d'arrière-plan",
|
||||||
|
"lyricOffset": "paroles décalées (ms)"
|
||||||
},
|
},
|
||||||
"upNext": "à suivre",
|
"upNext": "à suivre",
|
||||||
"lyrics": "paroles",
|
"lyrics": "paroles",
|
||||||
"related": "similaire",
|
"related": "similaire",
|
||||||
"visualizer": "visualisateur"
|
"visualizer": "visualisateur",
|
||||||
|
"noLyrics": "aucune parole trouvée"
|
||||||
},
|
},
|
||||||
"appMenu": {
|
"appMenu": {
|
||||||
"selectServer": "sélectionner le serveur",
|
"selectServer": "sélectionner le serveur",
|
||||||
@@ -273,7 +276,8 @@
|
|||||||
},
|
},
|
||||||
"albumDetail": {
|
"albumDetail": {
|
||||||
"moreFromArtist": "plus de $t(entity.artist_one)",
|
"moreFromArtist": "plus de $t(entity.artist_one)",
|
||||||
"moreFromGeneric": "plus de {{item}}"
|
"moreFromGeneric": "plus de {{item}}",
|
||||||
|
"released": "publié"
|
||||||
},
|
},
|
||||||
"setting": {
|
"setting": {
|
||||||
"generalTab": "général",
|
"generalTab": "général",
|
||||||
@@ -310,7 +314,8 @@
|
|||||||
"shareItem": "partager un élément",
|
"shareItem": "partager un élément",
|
||||||
"playSimilarSongs": "$t(player.playSimilarSongs)",
|
"playSimilarSongs": "$t(player.playSimilarSongs)",
|
||||||
"showDetails": "obtenir des informations",
|
"showDetails": "obtenir des informations",
|
||||||
"download": "télécharger"
|
"download": "télécharger",
|
||||||
|
"playShuffled": "$t(player.shuffle)"
|
||||||
},
|
},
|
||||||
"albumArtistList": {
|
"albumArtistList": {
|
||||||
"title": "$t(entity.albumArtist_other)"
|
"title": "$t(entity.albumArtist_other)"
|
||||||
@@ -351,6 +356,14 @@
|
|||||||
},
|
},
|
||||||
"playlist": {
|
"playlist": {
|
||||||
"reorder": "le tri n'est possible que lorsque l'on trie par identifiant"
|
"reorder": "le tri n'est possible que lorsque l'on trie par identifiant"
|
||||||
|
},
|
||||||
|
"manageServers": {
|
||||||
|
"serverDetails": "détails du serveur",
|
||||||
|
"removeServer": "supprimer le serveur",
|
||||||
|
"url": "URL du serveur",
|
||||||
|
"title": "gérer les serveurs",
|
||||||
|
"username": "nom d'utilisateur",
|
||||||
|
"editServerDetailsTooltip": "modifier les détails du serveur"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"setting": {
|
"setting": {
|
||||||
@@ -559,7 +572,24 @@
|
|||||||
"contextMenu_description": "permet de masquer les éléments qui s'affichent dans le menu lorsque vous cliquez avec le bouton droit de la souris sur un élément. les éléments qui ne sont pas cochés seront masqués",
|
"contextMenu_description": "permet de masquer les éléments qui s'affichent dans le menu lorsque vous cliquez avec le bouton droit de la souris sur un élément. les éléments qui ne sont pas cochés seront masqués",
|
||||||
"albumBackground": "image d'arrière-plan de l'album",
|
"albumBackground": "image d'arrière-plan de l'album",
|
||||||
"albumBackground_description": "ajoute une image d'arrière-plan pour les pages de l'album contenant les illustrations de l'album",
|
"albumBackground_description": "ajoute une image d'arrière-plan pour les pages de l'album contenant les illustrations de l'album",
|
||||||
"albumBackgroundBlur_description": "ajuste le niveau de flou appliqué à l'image d'arrière-plan de l'album"
|
"albumBackgroundBlur_description": "ajuste le niveau de flou appliqué à l'image d'arrière-plan de l'album",
|
||||||
|
"playButtonBehavior_optionPlayShuffled": "$t(player.shuffle)",
|
||||||
|
"playerbarOpenDrawer": "basculement plein écran de la barre de lecteur",
|
||||||
|
"playerbarOpenDrawer_description": "permet de cliquer sur la barre du lecteur pour ouvrir le lecteur plein écran",
|
||||||
|
"translationApiProvider": "fournisseur d'api de traduction",
|
||||||
|
"discordListening": "afficher le statut d'écoute",
|
||||||
|
"discordListening_description": "afficher le statut comme étant en écoute au lieu de lecture",
|
||||||
|
"translationApiKey_description": "clé api à utiliser pour traduire les paroles (ne prend en charge que les points de terminaison de service globaux)",
|
||||||
|
"translationTargetLanguage": "traduction langue cible",
|
||||||
|
"trayEnabled": "montrer le plateau",
|
||||||
|
"translationApiProvider_description": "le fournisseur d'api à utiliser pour la traduction des paroles",
|
||||||
|
"customCss_description": "contenu css personnalisé. Remarque : le contenu et les URL distantes sont des propriétés non autorisées. Un aperçu de votre contenu est affiché ci-dessous. Des champs supplémentaires que vous n'avez pas définis sont présents en raison de la vérification.",
|
||||||
|
"translationApiKey": "clé api de traduction",
|
||||||
|
"translationTargetLanguage_description": "langue cible pour la traduction des paroles",
|
||||||
|
"transcodeNote": "prend effet après 1 (web) - 2 (mpv) chansons",
|
||||||
|
"trayEnabled_description": "afficher ou masquer l'icône et le menu de la barre d'état système. si désactivé, désactive également la réduction et la sortie vers la barre d'état système",
|
||||||
|
"doubleClickBehavior_description": "si vrai, toutes les pistes correspondantes dans une recherche de piste seront mises en file d'attente. sinon, seule celle sur laquelle vous avez cliqué sera mise en file d'attente",
|
||||||
|
"albumBackgroundBlur": "taille du flou de l'image d'arrière-plan de l'album"
|
||||||
},
|
},
|
||||||
"form": {
|
"form": {
|
||||||
"deletePlaylist": {
|
"deletePlaylist": {
|
||||||
@@ -604,7 +634,8 @@
|
|||||||
},
|
},
|
||||||
"editPlaylist": {
|
"editPlaylist": {
|
||||||
"title": "modifier $t(entity.playlist_one)",
|
"title": "modifier $t(entity.playlist_one)",
|
||||||
"publicJellyfinNote": "Jellyfin n'indique pas si une playlist est publique ou non. Si vous souhaitez que cette playlist reste publique, veuillez sélectionner l'entrée suivante"
|
"publicJellyfinNote": "Jellyfin n'indique pas si une playlist est publique ou non. Si vous souhaitez que cette playlist reste publique, veuillez sélectionner l'entrée suivante",
|
||||||
|
"success": "$t(entity.playlist_one) mis à jour avec succès"
|
||||||
},
|
},
|
||||||
"lyricSearch": {
|
"lyricSearch": {
|
||||||
"title": "rechercher parole",
|
"title": "rechercher parole",
|
||||||
@@ -666,7 +697,13 @@
|
|||||||
"genreWithCount_other": "{{count}} genres",
|
"genreWithCount_other": "{{count}} genres",
|
||||||
"trackWithCount_one": "{{count}} piste",
|
"trackWithCount_one": "{{count}} piste",
|
||||||
"trackWithCount_many": "{{count}} pistes",
|
"trackWithCount_many": "{{count}} pistes",
|
||||||
"trackWithCount_other": "{{count}} pistes"
|
"trackWithCount_other": "{{count}} pistes",
|
||||||
|
"play_one": "{{count}} écouter",
|
||||||
|
"play_many": "{{count}} écoute",
|
||||||
|
"play_other": "{{count}} écoute",
|
||||||
|
"song_one": "chanson",
|
||||||
|
"song_many": "chansons",
|
||||||
|
"song_other": "chansons"
|
||||||
},
|
},
|
||||||
"table": {
|
"table": {
|
||||||
"config": {
|
"config": {
|
||||||
@@ -677,7 +714,8 @@
|
|||||||
"gap": "$t(common.gap)",
|
"gap": "$t(common.gap)",
|
||||||
"size": "$t(common.size)",
|
"size": "$t(common.size)",
|
||||||
"itemGap": "écart entre les éléments (en pixel)",
|
"itemGap": "écart entre les éléments (en pixel)",
|
||||||
"itemSize": "taille des élements (en pixel)"
|
"itemSize": "taille des élements (en pixel)",
|
||||||
|
"followCurrentSong": "suivre la chanson actuelle"
|
||||||
},
|
},
|
||||||
"view": {
|
"view": {
|
||||||
"table": "liste",
|
"table": "liste",
|
||||||
|
|||||||
+14
-14
@@ -67,7 +67,8 @@
|
|||||||
"forceRestartRequired": "перезапустите приложение, чтобы применить изменения... закройте уведомление для перезапуска",
|
"forceRestartRequired": "перезапустите приложение, чтобы применить изменения... закройте уведомление для перезапуска",
|
||||||
"setting": "настройка",
|
"setting": "настройка",
|
||||||
"setting_one": "настройка",
|
"setting_one": "настройка",
|
||||||
"setting_other": "настройки",
|
"setting_few": "",
|
||||||
|
"setting_many": "",
|
||||||
"version": "версия",
|
"version": "версия",
|
||||||
"title": "название",
|
"title": "название",
|
||||||
"filter_one": "фильтр",
|
"filter_one": "фильтр",
|
||||||
@@ -111,16 +112,19 @@
|
|||||||
"preview": "просмотр",
|
"preview": "просмотр",
|
||||||
"codec": "кодек",
|
"codec": "кодек",
|
||||||
"share": "поделиться",
|
"share": "поделиться",
|
||||||
"close": "закрыть"
|
"close": "закрыть",
|
||||||
|
"albumGain": "альбом усиление",
|
||||||
|
"trackGain": "усиление трека",
|
||||||
|
"translation": "перевод",
|
||||||
|
"albumPeak": "пик альбома",
|
||||||
|
"trackPeak": "пик трека"
|
||||||
},
|
},
|
||||||
"entity": {
|
"entity": {
|
||||||
"album_one": "альбом",
|
"album_one": "альбом",
|
||||||
"album_few": "альбома",
|
"album_few": "альбома",
|
||||||
"album_other": "альбомы",
|
|
||||||
"album_many": "альбомов",
|
"album_many": "альбомов",
|
||||||
"genre_one": "жанр",
|
"genre_one": "жанр",
|
||||||
"genre_few": "жанра",
|
"genre_few": "жанра",
|
||||||
"genre_other": "жанры",
|
|
||||||
"genre_many": "жанров",
|
"genre_many": "жанров",
|
||||||
"playlistWithCount_one": "{{count}} плейлист",
|
"playlistWithCount_one": "{{count}} плейлист",
|
||||||
"playlistWithCount_few": "{{count}} плейлиста",
|
"playlistWithCount_few": "{{count}} плейлиста",
|
||||||
@@ -128,26 +132,25 @@
|
|||||||
"playlist_one": "плейлист",
|
"playlist_one": "плейлист",
|
||||||
"playlist_few": "плейлиста",
|
"playlist_few": "плейлиста",
|
||||||
"playlist_many": "плейлистов",
|
"playlist_many": "плейлистов",
|
||||||
"playlist_other": "плейлисты",
|
|
||||||
"play": "{{count}} прослушиваний",
|
"play": "{{count}} прослушиваний",
|
||||||
"play_one": "{{count}} прослушивание",
|
"play_one": "{{count}} прослушивание",
|
||||||
"play_other": "{{count}} прослушиваний",
|
"play_few": "",
|
||||||
|
"play_many": "",
|
||||||
"artist_one": "автор",
|
"artist_one": "автор",
|
||||||
"artist_few": "автора",
|
"artist_few": "автора",
|
||||||
"artist_other": "исполнители",
|
|
||||||
"artist_many": "исполнителей",
|
"artist_many": "исполнителей",
|
||||||
"folderWithCount_one": "{{count}} папка",
|
"folderWithCount_one": "{{count}} папка",
|
||||||
"folderWithCount_few": "{{count}} папки",
|
"folderWithCount_few": "{{count}} папки",
|
||||||
"folderWithCount_many": "{{count}} папок",
|
"folderWithCount_many": "{{count}} папок",
|
||||||
"albumArtist_one": "исполнитель альбома",
|
"albumArtist_one": "исполнитель альбома",
|
||||||
"albumArtist_few": "исполнители альбома",
|
"albumArtist_few": "исполнители альбома",
|
||||||
"albumArtist_other": "исполнители альбомов",
|
|
||||||
"albumArtist_many": "исполнителей альбома",
|
"albumArtist_many": "исполнителей альбома",
|
||||||
"track_one": "трек",
|
"track_one": "трек",
|
||||||
"track_few": "трека",
|
"track_few": "трека",
|
||||||
"track_many": "треков",
|
"track_many": "треков",
|
||||||
"track_other": "треки",
|
"song_one": "песня",
|
||||||
"song_many": "{{ count }} композиций",
|
"song_few": "{{count}} песни",
|
||||||
|
"song_many": "{{count}} песен",
|
||||||
"albumArtistCount_one": "{{count}} автор альбома",
|
"albumArtistCount_one": "{{count}} автор альбома",
|
||||||
"albumArtistCount_few": "{{count}} автора альбома",
|
"albumArtistCount_few": "{{count}} автора альбома",
|
||||||
"albumArtistCount_many": "{{count}} авторов альбома",
|
"albumArtistCount_many": "{{count}} авторов альбома",
|
||||||
@@ -157,22 +160,19 @@
|
|||||||
"favorite_one": "любимый",
|
"favorite_one": "любимый",
|
||||||
"favorite_few": "любимых",
|
"favorite_few": "любимых",
|
||||||
"favorite_many": "любимые",
|
"favorite_many": "любимые",
|
||||||
"favorite_other": "любимые",
|
|
||||||
"artistWithCount_one": "{{count}} автор",
|
"artistWithCount_one": "{{count}} автор",
|
||||||
"artistWithCount_few": "{{count}} автора",
|
"artistWithCount_few": "{{count}} автора",
|
||||||
"artistWithCount_many": "{{count}} авторов",
|
"artistWithCount_many": "{{count}} авторов",
|
||||||
"folder_one": "папка",
|
"folder_one": "папка",
|
||||||
"folder_few": "папки",
|
"folder_few": "папки",
|
||||||
"folder_many": "папок",
|
"folder_many": "папок",
|
||||||
"folder_other": "папки",
|
|
||||||
"smartPlaylist": "умный $t(entity.playlist_one)",
|
"smartPlaylist": "умный $t(entity.playlist_one)",
|
||||||
"genreWithCount_one": "{{count}} жанр",
|
"genreWithCount_one": "{{count}} жанр",
|
||||||
"genreWithCount_few": "{{count}} жанра",
|
"genreWithCount_few": "{{count}} жанра",
|
||||||
"genreWithCount_many": "{{count}} жанров",
|
"genreWithCount_many": "{{count}} жанров",
|
||||||
"trackWithCount_one": "{{count}} трек",
|
"trackWithCount_one": "{{count}} трек",
|
||||||
"trackWithCount_few": "{{count}} трека",
|
"trackWithCount_few": "{{count}} трека",
|
||||||
"trackWithCount_many": "{{count}} треков",
|
"trackWithCount_many": "{{count}} треков"
|
||||||
"trackWithCount_other": "{{count}} треков"
|
|
||||||
},
|
},
|
||||||
"table": {
|
"table": {
|
||||||
"config": {
|
"config": {
|
||||||
|
|||||||
@@ -209,7 +209,11 @@
|
|||||||
"moveToBottom": "idi na dno",
|
"moveToBottom": "idi na dno",
|
||||||
"setRating": "oceni",
|
"setRating": "oceni",
|
||||||
"toggleSmartPlaylistEditor": "pokreni $t(entity.smartPlaylist) editor",
|
"toggleSmartPlaylistEditor": "pokreni $t(entity.smartPlaylist) editor",
|
||||||
"removeFromFavorites": "ukloni iz $t(entity.favorite_other)"
|
"removeFromFavorites": "ukloni iz $t(entity.favorite_other)",
|
||||||
|
"openIn": {
|
||||||
|
"lastfm": "Otvori u Last.fm",
|
||||||
|
"musicbrainz": "Otvori u MusicBrainz"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"common": {
|
"common": {
|
||||||
"backward": "nazad",
|
"backward": "nazad",
|
||||||
|
|||||||
@@ -127,7 +127,8 @@
|
|||||||
"smartPlaylist": "智能$t(entity.playlist_one)",
|
"smartPlaylist": "智能$t(entity.playlist_one)",
|
||||||
"genreWithCount_other": "{{count}} 种流派",
|
"genreWithCount_other": "{{count}} 种流派",
|
||||||
"trackWithCount_other": "{{count}} 首乐曲",
|
"trackWithCount_other": "{{count}} 首乐曲",
|
||||||
"play_other": "{{count}} 次播放"
|
"play_other": "{{count}} 次播放",
|
||||||
|
"song_other": "歌曲"
|
||||||
},
|
},
|
||||||
"player": {
|
"player": {
|
||||||
"repeat_all": "循环全部",
|
"repeat_all": "循环全部",
|
||||||
@@ -352,7 +353,7 @@
|
|||||||
"volumeWidth": "音量滑块宽度",
|
"volumeWidth": "音量滑块宽度",
|
||||||
"volumeWidth_description": "音量滑块的宽度",
|
"volumeWidth_description": "音量滑块的宽度",
|
||||||
"discordListening": "显示状态为正在监听",
|
"discordListening": "显示状态为正在监听",
|
||||||
"discordListening_description": "将状态显示为 “正在监听”,而不是 “正在播放”。请注意,这当前会破坏计时器栏",
|
"discordListening_description": "将状态显示为正在监听,而不是正在播放",
|
||||||
"contextMenu_description": "允许您隐藏右键单击项目时显示在菜单中的项目。未选中的项目将被隐藏",
|
"contextMenu_description": "允许您隐藏右键单击项目时显示在菜单中的项目。未选中的项目将被隐藏",
|
||||||
"customCssEnable_description": "允许编写自定义 css。",
|
"customCssEnable_description": "允许编写自定义 css。",
|
||||||
"customCss": "自定义css",
|
"customCss": "自定义css",
|
||||||
|
|||||||
@@ -125,7 +125,7 @@ export const SubsonicController: ControllerEndpoint = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
id: res.body.playlist.id,
|
id: res.body.playlist.id.toString(),
|
||||||
name: res.body.playlist.name,
|
name: res.body.playlist.name,
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
@@ -570,7 +570,10 @@ export const SubsonicController: ControllerEndpoint = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
items: res.body.musicFolders.musicFolder,
|
items: res.body.musicFolders.musicFolder.map((folder) => ({
|
||||||
|
id: folder.id.toString(),
|
||||||
|
name: folder.name,
|
||||||
|
})),
|
||||||
startIndex: 0,
|
startIndex: 0,
|
||||||
totalRecordCount: res.body.musicFolders.musicFolder.length,
|
totalRecordCount: res.body.musicFolders.musicFolder.length,
|
||||||
};
|
};
|
||||||
@@ -902,7 +905,7 @@ export const SubsonicController: ControllerEndpoint = {
|
|||||||
fromAlbumPromises.push(
|
fromAlbumPromises.push(
|
||||||
ssApiClient(apiClientProps).getAlbum({
|
ssApiClient(apiClientProps).getAlbum({
|
||||||
query: {
|
query: {
|
||||||
id: albumId,
|
id: albumId.toString(),
|
||||||
},
|
},
|
||||||
}),
|
}),
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -54,16 +54,16 @@ const normalizeSong = (
|
|||||||
album: item.album || '',
|
album: item.album || '',
|
||||||
albumArtists: [
|
albumArtists: [
|
||||||
{
|
{
|
||||||
id: item.artistId || '',
|
id: item.artistId?.toString() || '',
|
||||||
imageUrl: null,
|
imageUrl: null,
|
||||||
name: item.artist || '',
|
name: item.artist || '',
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
albumId: item.albumId || '',
|
albumId: item.albumId?.toString() || '',
|
||||||
artistName: item.artist || '',
|
artistName: item.artist || '',
|
||||||
artists: [
|
artists: [
|
||||||
{
|
{
|
||||||
id: item.artistId || '',
|
id: item.artistId?.toString() || '',
|
||||||
imageUrl: null,
|
imageUrl: null,
|
||||||
name: item.artist || '',
|
name: item.artist || '',
|
||||||
},
|
},
|
||||||
@@ -95,7 +95,7 @@ const normalizeSong = (
|
|||||||
},
|
},
|
||||||
]
|
]
|
||||||
: [],
|
: [],
|
||||||
id: item.id,
|
id: item.id.toString(),
|
||||||
imagePlaceholderUrl: null,
|
imagePlaceholderUrl: null,
|
||||||
imageUrl,
|
imageUrl,
|
||||||
itemType: LibraryItem.SONG,
|
itemType: LibraryItem.SONG,
|
||||||
@@ -146,7 +146,7 @@ const normalizeAlbumArtist = (
|
|||||||
biography: null,
|
biography: null,
|
||||||
duration: null,
|
duration: null,
|
||||||
genres: [],
|
genres: [],
|
||||||
id: item.id,
|
id: item.id.toString(),
|
||||||
imageUrl,
|
imageUrl,
|
||||||
itemType: LibraryItem.ALBUM_ARTIST,
|
itemType: LibraryItem.ALBUM_ARTIST,
|
||||||
lastPlayedAt: null,
|
lastPlayedAt: null,
|
||||||
@@ -178,9 +178,11 @@ const normalizeAlbum = (
|
|||||||
return {
|
return {
|
||||||
albumArtist: item.artist,
|
albumArtist: item.artist,
|
||||||
albumArtists: item.artistId
|
albumArtists: item.artistId
|
||||||
? [{ id: item.artistId, imageUrl: null, name: item.artist }]
|
? [{ id: item.artistId.toString(), imageUrl: null, name: item.artist }]
|
||||||
|
: [],
|
||||||
|
artists: item.artistId
|
||||||
|
? [{ id: item.artistId.toString(), imageUrl: null, name: item.artist }]
|
||||||
: [],
|
: [],
|
||||||
artists: item.artistId ? [{ id: item.artistId, imageUrl: null, name: item.artist }] : [],
|
|
||||||
backdropImageUrl: null,
|
backdropImageUrl: null,
|
||||||
comment: null,
|
comment: null,
|
||||||
createdAt: item.created,
|
createdAt: item.created,
|
||||||
@@ -195,7 +197,7 @@ const normalizeAlbum = (
|
|||||||
},
|
},
|
||||||
]
|
]
|
||||||
: [],
|
: [],
|
||||||
id: item.id,
|
id: item.id.toString(),
|
||||||
imagePlaceholderUrl: null,
|
imagePlaceholderUrl: null,
|
||||||
imageUrl,
|
imageUrl,
|
||||||
isCompilation: null,
|
isCompilation: null,
|
||||||
@@ -232,7 +234,7 @@ const normalizePlaylist = (
|
|||||||
description: item.comment || null,
|
description: item.comment || null,
|
||||||
duration: item.duration,
|
duration: item.duration,
|
||||||
genres: [],
|
genres: [],
|
||||||
id: item.id,
|
id: item.id.toString(),
|
||||||
imagePlaceholderUrl: null,
|
imagePlaceholderUrl: null,
|
||||||
imageUrl: getCoverArtUrl({
|
imageUrl: getCoverArtUrl({
|
||||||
baseUrl: server?.url,
|
baseUrl: server?.url,
|
||||||
|
|||||||
@@ -19,6 +19,8 @@ const authenticateParameters = z.object({
|
|||||||
v: z.string(),
|
v: z.string(),
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const id = z.number().or(z.string());
|
||||||
|
|
||||||
const createFavoriteParameters = z.object({
|
const createFavoriteParameters = z.object({
|
||||||
albumId: z.array(z.string()).optional(),
|
albumId: z.array(z.string()).optional(),
|
||||||
artistId: z.array(z.string()).optional(),
|
artistId: z.array(z.string()).optional(),
|
||||||
@@ -43,7 +45,7 @@ const setRatingParameters = z.object({
|
|||||||
const setRating = z.null();
|
const setRating = z.null();
|
||||||
|
|
||||||
const musicFolder = z.object({
|
const musicFolder = z.object({
|
||||||
id: z.string(),
|
id,
|
||||||
name: z.string(),
|
name: z.string(),
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -66,9 +68,9 @@ const genreItem = z.object({
|
|||||||
|
|
||||||
const song = z.object({
|
const song = z.object({
|
||||||
album: z.string().optional(),
|
album: z.string().optional(),
|
||||||
albumId: z.string().optional(),
|
albumId: id.optional(),
|
||||||
artist: z.string().optional(),
|
artist: z.string().optional(),
|
||||||
artistId: z.string().optional(),
|
artistId: id.optional(),
|
||||||
averageRating: z.number().optional(),
|
averageRating: z.number().optional(),
|
||||||
bitRate: z.number().optional(),
|
bitRate: z.number().optional(),
|
||||||
bpm: z.number().optional(),
|
bpm: z.number().optional(),
|
||||||
@@ -79,7 +81,7 @@ const song = z.object({
|
|||||||
duration: z.number().optional(),
|
duration: z.number().optional(),
|
||||||
genre: z.string().optional(),
|
genre: z.string().optional(),
|
||||||
genres: z.array(genreItem).optional(),
|
genres: z.array(genreItem).optional(),
|
||||||
id: z.string(),
|
id,
|
||||||
isDir: z.boolean(),
|
isDir: z.boolean(),
|
||||||
isVideo: z.boolean(),
|
isVideo: z.boolean(),
|
||||||
musicBrainzId: z.string().optional(),
|
musicBrainzId: z.string().optional(),
|
||||||
@@ -100,12 +102,12 @@ const song = z.object({
|
|||||||
const album = z.object({
|
const album = z.object({
|
||||||
album: z.string(),
|
album: z.string(),
|
||||||
artist: z.string(),
|
artist: z.string(),
|
||||||
artistId: z.string(),
|
artistId: id,
|
||||||
coverArt: z.string(),
|
coverArt: z.string(),
|
||||||
created: z.string(),
|
created: z.string(),
|
||||||
duration: z.number(),
|
duration: z.number(),
|
||||||
genre: z.string().optional(),
|
genre: z.string().optional(),
|
||||||
id: z.string(),
|
id,
|
||||||
isCompilation: z.boolean().optional(),
|
isCompilation: z.boolean().optional(),
|
||||||
isDir: z.boolean(),
|
isDir: z.boolean(),
|
||||||
isVideo: z.boolean(),
|
isVideo: z.boolean(),
|
||||||
@@ -140,7 +142,7 @@ const albumArtist = z.object({
|
|||||||
albumCount: z.string(),
|
albumCount: z.string(),
|
||||||
artistImageUrl: z.string().optional(),
|
artistImageUrl: z.string().optional(),
|
||||||
coverArt: z.string().optional(),
|
coverArt: z.string().optional(),
|
||||||
id: z.string(),
|
id,
|
||||||
name: z.string(),
|
name: z.string(),
|
||||||
starred: z.string().optional(),
|
starred: z.string().optional(),
|
||||||
});
|
});
|
||||||
@@ -398,7 +400,7 @@ const playlist = z.object({
|
|||||||
created: z.string(),
|
created: z.string(),
|
||||||
duration: z.number(),
|
duration: z.number(),
|
||||||
entry: z.array(song).optional(),
|
entry: z.array(song).optional(),
|
||||||
id: z.string(),
|
id,
|
||||||
name: z.string(),
|
name: z.string(),
|
||||||
owner: z.string(),
|
owner: z.string(),
|
||||||
public: z.boolean(),
|
public: z.boolean(),
|
||||||
|
|||||||
@@ -143,7 +143,7 @@ export const App = () => {
|
|||||||
if (!isRunning) {
|
if (!isRunning) {
|
||||||
const extraParameters = useSettingsStore.getState().playback.mpvExtraParameters;
|
const extraParameters = useSettingsStore.getState().playback.mpvExtraParameters;
|
||||||
const properties: Record<string, any> = {
|
const properties: Record<string, any> = {
|
||||||
speed: usePlayerStore.getState().current.speed,
|
speed: usePlayerStore.getState().speed,
|
||||||
...getMpvProperties(useSettingsStore.getState().playback.mpvProperties),
|
...getMpvProperties(useSettingsStore.getState().playback.mpvProperties),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,97 @@
|
|||||||
|
import React, { MouseEvent } from 'react';
|
||||||
|
import type { UnstyledButtonProps } from '@mantine/core';
|
||||||
|
import { RiPlayFill } from 'react-icons/ri';
|
||||||
|
import styled from 'styled-components';
|
||||||
|
import { Play } from '/@/renderer/types';
|
||||||
|
import { usePlayButtonBehavior } from '/@/renderer/store/settings.store';
|
||||||
|
import { LibraryItem } from '/@/renderer/api/types';
|
||||||
|
import { usePlayQueueAdd } from '/@/renderer/features/player';
|
||||||
|
|
||||||
|
type PlayButtonType = UnstyledButtonProps & React.ComponentPropsWithoutRef<'button'>;
|
||||||
|
|
||||||
|
const PlayButton = styled.button<PlayButtonType>`
|
||||||
|
position: absolute;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
width: 30px;
|
||||||
|
height: 30px;
|
||||||
|
background-color: rgb(255 255 255);
|
||||||
|
border: none;
|
||||||
|
border-radius: 50%;
|
||||||
|
opacity: 0.8;
|
||||||
|
transition: scale 0.1s ease-in-out;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
opacity: 1;
|
||||||
|
scale: 1.1;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:active {
|
||||||
|
opacity: 1;
|
||||||
|
scale: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
svg {
|
||||||
|
fill: rgb(0 0 0);
|
||||||
|
stroke: rgb(0 0 0);
|
||||||
|
}
|
||||||
|
`;
|
||||||
|
|
||||||
|
const ListConverControlsContainer = styled.div`
|
||||||
|
position: absolute;
|
||||||
|
z-index: 100;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
`;
|
||||||
|
|
||||||
|
export const ListCoverControls = ({
|
||||||
|
itemData,
|
||||||
|
itemType,
|
||||||
|
context,
|
||||||
|
uniqueId,
|
||||||
|
}: {
|
||||||
|
context: Record<string, any>;
|
||||||
|
itemData: any;
|
||||||
|
itemType: LibraryItem;
|
||||||
|
uniqueId?: string;
|
||||||
|
}) => {
|
||||||
|
const playButtonBehavior = usePlayButtonBehavior();
|
||||||
|
const handlePlayQueueAdd = usePlayQueueAdd();
|
||||||
|
const isQueue = Boolean(context?.isQueue);
|
||||||
|
|
||||||
|
const handlePlay = async (e: MouseEvent<HTMLButtonElement>, playType?: Play) => {
|
||||||
|
e.preventDefault();
|
||||||
|
e.stopPropagation();
|
||||||
|
|
||||||
|
handlePlayQueueAdd?.({
|
||||||
|
byItemType: {
|
||||||
|
id: [itemData.id],
|
||||||
|
type: itemType,
|
||||||
|
},
|
||||||
|
playType: playType || playButtonBehavior,
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
const handlePlayFromQueue = () => {
|
||||||
|
context.handleDoubleClick({
|
||||||
|
data: {
|
||||||
|
uniqueId,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<ListConverControlsContainer className="card-controls">
|
||||||
|
<PlayButton onClick={isQueue ? handlePlayFromQueue : handlePlay}>
|
||||||
|
<RiPlayFill size={20} />
|
||||||
|
</PlayButton>
|
||||||
|
</ListConverControlsContainer>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
};
|
||||||
@@ -7,11 +7,12 @@ import { generatePath } from 'react-router';
|
|||||||
import { Link } from 'react-router-dom';
|
import { Link } from 'react-router-dom';
|
||||||
import { SimpleImg } from 'react-simple-img';
|
import { SimpleImg } from 'react-simple-img';
|
||||||
import styled from 'styled-components';
|
import styled from 'styled-components';
|
||||||
import type { AlbumArtist, Artist } from '/@/renderer/api/types';
|
import { AlbumArtist, Artist } from '/@/renderer/api/types';
|
||||||
import { Text } from '/@/renderer/components/text';
|
import { Text } from '/@/renderer/components/text';
|
||||||
import { AppRoute } from '/@/renderer/router/routes';
|
import { AppRoute } from '/@/renderer/router/routes';
|
||||||
import { Skeleton } from '/@/renderer/components/skeleton';
|
import { Skeleton } from '/@/renderer/components/skeleton';
|
||||||
import { SEPARATOR_STRING } from '/@/renderer/api/utils';
|
import { SEPARATOR_STRING } from '/@/renderer/api/utils';
|
||||||
|
import { ListCoverControls } from '/@/renderer/components/virtual-table/cells/combined-title-cell-controls';
|
||||||
|
|
||||||
const CellContainer = styled(motion.div)<{ height: number }>`
|
const CellContainer = styled(motion.div)<{ height: number }>`
|
||||||
display: grid;
|
display: grid;
|
||||||
@@ -24,6 +25,16 @@ const CellContainer = styled(motion.div)<{ height: number }>`
|
|||||||
max-width: 100%;
|
max-width: 100%;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
letter-spacing: 0.5px;
|
letter-spacing: 0.5px;
|
||||||
|
|
||||||
|
.card-controls {
|
||||||
|
opacity: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
.card-controls {
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
`;
|
`;
|
||||||
|
|
||||||
const ImageWrapper = styled.div`
|
const ImageWrapper = styled.div`
|
||||||
@@ -48,7 +59,13 @@ const StyledImage = styled(SimpleImg)`
|
|||||||
}
|
}
|
||||||
`;
|
`;
|
||||||
|
|
||||||
export const CombinedTitleCell = ({ value, rowIndex, node }: ICellRendererParams) => {
|
export const CombinedTitleCell = ({
|
||||||
|
value,
|
||||||
|
rowIndex,
|
||||||
|
node,
|
||||||
|
context,
|
||||||
|
data,
|
||||||
|
}: ICellRendererParams) => {
|
||||||
const artists = useMemo(() => {
|
const artists = useMemo(() => {
|
||||||
if (!value) return null;
|
if (!value) return null;
|
||||||
return value.artists?.length ? value.artists : value.albumArtists;
|
return value.artists?.length ? value.artists : value.albumArtists;
|
||||||
@@ -102,6 +119,12 @@ export const CombinedTitleCell = ({ value, rowIndex, node }: ICellRendererParams
|
|||||||
/>
|
/>
|
||||||
</Center>
|
</Center>
|
||||||
)}
|
)}
|
||||||
|
<ListCoverControls
|
||||||
|
context={context}
|
||||||
|
itemData={value}
|
||||||
|
itemType={context.itemType}
|
||||||
|
uniqueId={data?.uniqueId}
|
||||||
|
/>
|
||||||
</ImageWrapper>
|
</ImageWrapper>
|
||||||
<MetadataWrapper>
|
<MetadataWrapper>
|
||||||
<Text
|
<Text
|
||||||
|
|||||||
@@ -2,95 +2,95 @@ import type { ICellRendererParams } from '@ag-grid-community/core';
|
|||||||
import { Text } from '/@/renderer/components/text';
|
import { Text } from '/@/renderer/components/text';
|
||||||
import { CellContainer } from '/@/renderer/components/virtual-table/cells/generic-cell';
|
import { CellContainer } from '/@/renderer/components/virtual-table/cells/generic-cell';
|
||||||
|
|
||||||
const AnimatedSvg = () => {
|
// const AnimatedSvg = () => {
|
||||||
return (
|
// return (
|
||||||
<div style={{ height: '1rem', transform: 'rotate(180deg)', width: '1rem' }}>
|
// <div style={{ height: '1rem', transform: 'rotate(180deg)', width: '1rem' }}>
|
||||||
<svg
|
// <svg
|
||||||
viewBox="100 130 57 80"
|
// viewBox="100 130 57 80"
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
// xmlns="http://www.w3.org/2000/svg"
|
||||||
>
|
// >
|
||||||
<g>
|
// <g>
|
||||||
<rect
|
// <rect
|
||||||
fill="var(--primary-color)"
|
// fill="var(--primary-color)"
|
||||||
height="80"
|
// height="80"
|
||||||
id="bar-1"
|
// id="bar-1"
|
||||||
width="12"
|
// width="12"
|
||||||
x="100"
|
// x="100"
|
||||||
y="130"
|
// y="130"
|
||||||
>
|
// >
|
||||||
<animate
|
// <animate
|
||||||
attributeName="height"
|
// attributeName="height"
|
||||||
begin="0.1s"
|
// begin="0.1s"
|
||||||
calcMode="spline"
|
// calcMode="spline"
|
||||||
dur="0.95s"
|
// dur="0.95s"
|
||||||
keySplines="0.42 0 0.58 1; 0.42 0 0.58 1"
|
// keySplines="0.42 0 0.58 1; 0.42 0 0.58 1"
|
||||||
keyTimes="0; 0.47368; 1"
|
// keyTimes="0; 0.47368; 1"
|
||||||
repeatCount="indefinite"
|
// repeatCount="indefinite"
|
||||||
values="80;15;80"
|
// values="80;15;80"
|
||||||
/>
|
// />
|
||||||
</rect>
|
// </rect>
|
||||||
<rect
|
// <rect
|
||||||
fill="var(--primary-color)"
|
// fill="var(--primary-color)"
|
||||||
height="80"
|
// height="80"
|
||||||
id="bar-2"
|
// id="bar-2"
|
||||||
width="12"
|
// width="12"
|
||||||
x="115"
|
// x="115"
|
||||||
y="130"
|
// y="130"
|
||||||
>
|
// >
|
||||||
<animate
|
// <animate
|
||||||
attributeName="height"
|
// attributeName="height"
|
||||||
begin="0.1s"
|
// begin="0.1s"
|
||||||
calcMode="spline"
|
// calcMode="spline"
|
||||||
dur="0.95s"
|
// dur="0.95s"
|
||||||
keySplines="0.45 0 0.55 1; 0.45 0 0.55 1"
|
// keySplines="0.45 0 0.55 1; 0.45 0 0.55 1"
|
||||||
keyTimes="0; 0.44444; 1"
|
// keyTimes="0; 0.44444; 1"
|
||||||
repeatCount="indefinite"
|
// repeatCount="indefinite"
|
||||||
values="25;80;25"
|
// values="25;80;25"
|
||||||
/>
|
// />
|
||||||
</rect>
|
// </rect>
|
||||||
<rect
|
// <rect
|
||||||
fill="var(--primary-color)"
|
// fill="var(--primary-color)"
|
||||||
height="80"
|
// height="80"
|
||||||
id="bar-3"
|
// id="bar-3"
|
||||||
width="12"
|
// width="12"
|
||||||
x="130"
|
// x="130"
|
||||||
y="130"
|
// y="130"
|
||||||
>
|
// >
|
||||||
<animate
|
// <animate
|
||||||
attributeName="height"
|
// attributeName="height"
|
||||||
begin="0.1s"
|
// begin="0.1s"
|
||||||
calcMode="spline"
|
// calcMode="spline"
|
||||||
dur="0.85s"
|
// dur="0.85s"
|
||||||
keySplines="0.65 0 0.35 1; 0.65 0 0.35 1"
|
// keySplines="0.65 0 0.35 1; 0.65 0 0.35 1"
|
||||||
keyTimes="0; 0.42105; 1"
|
// keyTimes="0; 0.42105; 1"
|
||||||
repeatCount="indefinite"
|
// repeatCount="indefinite"
|
||||||
values="80;10;80"
|
// values="80;10;80"
|
||||||
/>
|
// />
|
||||||
</rect>
|
// </rect>
|
||||||
<rect
|
// <rect
|
||||||
fill="var(--primary-color)"
|
// fill="var(--primary-color)"
|
||||||
height="80"
|
// height="80"
|
||||||
id="bar-4"
|
// id="bar-4"
|
||||||
width="12"
|
// width="12"
|
||||||
x="145"
|
// x="145"
|
||||||
y="130"
|
// y="130"
|
||||||
>
|
// >
|
||||||
<animate
|
// <animate
|
||||||
attributeName="height"
|
// attributeName="height"
|
||||||
begin="0.1s"
|
// begin="0.1s"
|
||||||
calcMode="spline"
|
// calcMode="spline"
|
||||||
dur="1.05s"
|
// dur="1.05s"
|
||||||
keySplines="0.42 0 0.58 1; 0.42 0 0.58 1"
|
// keySplines="0.42 0 0.58 1; 0.42 0 0.58 1"
|
||||||
keyTimes="0; 0.31579; 1"
|
// keyTimes="0; 0.31579; 1"
|
||||||
repeatCount="indefinite"
|
// repeatCount="indefinite"
|
||||||
values="30;80;30"
|
// values="30;80;30"
|
||||||
/>
|
// />
|
||||||
</rect>
|
// </rect>
|
||||||
</g>
|
// </g>
|
||||||
</svg>
|
// </svg>
|
||||||
</div>
|
// </div>
|
||||||
);
|
// );
|
||||||
};
|
// };
|
||||||
|
|
||||||
const StaticSvg = () => {
|
const StaticSvg = () => {
|
||||||
return (
|
return (
|
||||||
@@ -134,19 +134,14 @@ const StaticSvg = () => {
|
|||||||
|
|
||||||
export const RowIndexCell = ({ value, eGridCell }: ICellRendererParams) => {
|
export const RowIndexCell = ({ value, eGridCell }: ICellRendererParams) => {
|
||||||
const classList = eGridCell.classList;
|
const classList = eGridCell.classList;
|
||||||
const isFocused = classList.contains('focused');
|
// const isFocused = classList.contains('focused');
|
||||||
const isPlaying = classList.contains('playing');
|
const isPlaying = classList.contains('playing');
|
||||||
const isCurrentSong =
|
const isCurrentSong =
|
||||||
classList.contains('current-song-cell') || classList.contains('current-playlist-song-cell');
|
classList.contains('current-song-cell') || classList.contains('current-playlist-song-cell');
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<CellContainer $position="right">
|
<CellContainer $position="right">
|
||||||
{isPlaying &&
|
{isPlaying && (isCurrentSong ? <StaticSvg /> : null)}
|
||||||
(isFocused && isCurrentSong ? (
|
|
||||||
<AnimatedSvg />
|
|
||||||
) : isCurrentSong ? (
|
|
||||||
<StaticSvg />
|
|
||||||
) : null)}
|
|
||||||
<Text
|
<Text
|
||||||
$secondary
|
$secondary
|
||||||
align="right"
|
align="right"
|
||||||
|
|||||||
@@ -334,6 +334,7 @@ export const useVirtualTable = <TFilter extends BaseQuery<any>>({
|
|||||||
const onCellContextMenu = useHandleTableContextMenu(itemType, contextMenu);
|
const onCellContextMenu = useHandleTableContextMenu(itemType, contextMenu);
|
||||||
|
|
||||||
const context = {
|
const context = {
|
||||||
|
itemType,
|
||||||
onCellContextMenu,
|
onCellContextMenu,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -361,6 +361,7 @@ const tableColumns: { [key: string]: ColDef } = {
|
|||||||
? {
|
? {
|
||||||
albumArtists: params.data?.albumArtists,
|
albumArtists: params.data?.albumArtists,
|
||||||
artists: params.data?.artists,
|
artists: params.data?.artists,
|
||||||
|
id: params.data?.id,
|
||||||
imagePlaceholderUrl: params.data?.imagePlaceholderUrl,
|
imagePlaceholderUrl: params.data?.imagePlaceholderUrl,
|
||||||
imageUrl: params.data?.imageUrl,
|
imageUrl: params.data?.imageUrl,
|
||||||
name: params.data?.name,
|
name: params.data?.name,
|
||||||
|
|||||||
@@ -464,6 +464,7 @@ export const AlbumDetailContent = ({ tableRef, background }: AlbumDetailContentP
|
|||||||
context={{
|
context={{
|
||||||
currentSong,
|
currentSong,
|
||||||
isFocused,
|
isFocused,
|
||||||
|
itemType: LibraryItem.SONG,
|
||||||
onCellContextMenu,
|
onCellContextMenu,
|
||||||
status,
|
status,
|
||||||
}}
|
}}
|
||||||
|
|||||||
@@ -550,6 +550,9 @@ export const AlbumArtistDetailContent = ({ background }: AlbumArtistDetailConten
|
|||||||
suppressLoadingOverlay
|
suppressLoadingOverlay
|
||||||
suppressRowDrag
|
suppressRowDrag
|
||||||
columnDefs={topSongsColumnDefs}
|
columnDefs={topSongsColumnDefs}
|
||||||
|
context={{
|
||||||
|
itemType: LibraryItem.SONG,
|
||||||
|
}}
|
||||||
enableCellChangeFlash={false}
|
enableCellChangeFlash={false}
|
||||||
getRowId={(data) => data.data.uniqueId}
|
getRowId={(data) => data.data.uniqueId}
|
||||||
rowData={topSongs}
|
rowData={topSongs}
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ import { SetContextMenuItems } from '/@/renderer/features/context-menu/events';
|
|||||||
|
|
||||||
export const QUEUE_CONTEXT_MENU_ITEMS: SetContextMenuItems = [
|
export const QUEUE_CONTEXT_MENU_ITEMS: SetContextMenuItems = [
|
||||||
{ divider: true, id: 'removeFromQueue' },
|
{ divider: true, id: 'removeFromQueue' },
|
||||||
|
{ id: 'moveToNextOfQueue' },
|
||||||
{ id: 'moveToBottomOfQueue' },
|
{ id: 'moveToBottomOfQueue' },
|
||||||
{ divider: true, id: 'moveToTopOfQueue' },
|
{ divider: true, id: 'moveToTopOfQueue' },
|
||||||
{ divider: true, id: 'addToPlaylist' },
|
{ divider: true, id: 'addToPlaylist' },
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ import {
|
|||||||
RiAddBoxFill,
|
RiAddBoxFill,
|
||||||
RiAddCircleFill,
|
RiAddCircleFill,
|
||||||
RiArrowDownLine,
|
RiArrowDownLine,
|
||||||
|
RiArrowGoForwardLine,
|
||||||
RiArrowRightSFill,
|
RiArrowRightSFill,
|
||||||
RiArrowUpLine,
|
RiArrowUpLine,
|
||||||
RiDeleteBinFill,
|
RiDeleteBinFill,
|
||||||
@@ -609,7 +610,19 @@ export const ContextMenuProvider = ({ children }: ContextMenuProviderProps) => {
|
|||||||
);
|
);
|
||||||
|
|
||||||
const playbackType = usePlaybackType();
|
const playbackType = usePlaybackType();
|
||||||
const { moveToBottomOfQueue, moveToTopOfQueue, removeFromQueue } = useQueueControls();
|
const { moveToNextOfQueue, moveToBottomOfQueue, moveToTopOfQueue, removeFromQueue } =
|
||||||
|
useQueueControls();
|
||||||
|
|
||||||
|
const handleMoveToNext = useCallback(() => {
|
||||||
|
const uniqueIds = ctx.dataNodes?.map((row) => row.data.uniqueId);
|
||||||
|
if (!uniqueIds?.length) return;
|
||||||
|
|
||||||
|
const playerData = moveToNextOfQueue(uniqueIds);
|
||||||
|
|
||||||
|
if (playbackType === PlaybackType.LOCAL) {
|
||||||
|
setQueueNext(playerData);
|
||||||
|
}
|
||||||
|
}, [ctx.dataNodes, moveToNextOfQueue, playbackType]);
|
||||||
|
|
||||||
const handleMoveToBottom = useCallback(() => {
|
const handleMoveToBottom = useCallback(() => {
|
||||||
const uniqueIds = ctx.dataNodes?.map((row) => row.data.uniqueId);
|
const uniqueIds = ctx.dataNodes?.map((row) => row.data.uniqueId);
|
||||||
@@ -758,6 +771,12 @@ export const ContextMenuProvider = ({ children }: ContextMenuProviderProps) => {
|
|||||||
leftIcon: <RiArrowDownLine size="1.1rem" />,
|
leftIcon: <RiArrowDownLine size="1.1rem" />,
|
||||||
onClick: handleMoveToBottom,
|
onClick: handleMoveToBottom,
|
||||||
},
|
},
|
||||||
|
moveToNextOfQueue: {
|
||||||
|
id: 'moveToNext',
|
||||||
|
label: t('page.contextMenu.moveToNext', { postProcess: 'sentenceCase' }),
|
||||||
|
leftIcon: <RiArrowGoForwardLine size="1.1rem" />,
|
||||||
|
onClick: handleMoveToNext,
|
||||||
|
},
|
||||||
moveToTopOfQueue: {
|
moveToTopOfQueue: {
|
||||||
id: 'moveToTopOfQueue',
|
id: 'moveToTopOfQueue',
|
||||||
label: t('page.contextMenu.moveToTop', { postProcess: 'sentenceCase' }),
|
label: t('page.contextMenu.moveToTop', { postProcess: 'sentenceCase' }),
|
||||||
@@ -904,6 +923,7 @@ export const ContextMenuProvider = ({ children }: ContextMenuProviderProps) => {
|
|||||||
handleDeselectAll,
|
handleDeselectAll,
|
||||||
ctx.data,
|
ctx.data,
|
||||||
handleDownload,
|
handleDownload,
|
||||||
|
handleMoveToNext,
|
||||||
handleMoveToBottom,
|
handleMoveToBottom,
|
||||||
handleMoveToTop,
|
handleMoveToTop,
|
||||||
handleSimilar,
|
handleSimilar,
|
||||||
|
|||||||
@@ -32,6 +32,7 @@ export type ContextMenuItemType =
|
|||||||
| 'shareItem'
|
| 'shareItem'
|
||||||
| 'deletePlaylist'
|
| 'deletePlaylist'
|
||||||
| 'createPlaylist'
|
| 'createPlaylist'
|
||||||
|
| 'moveToNextOfQueue'
|
||||||
| 'moveToBottomOfQueue'
|
| 'moveToBottomOfQueue'
|
||||||
| 'moveToTopOfQueue'
|
| 'moveToTopOfQueue'
|
||||||
| 'removeFromQueue'
|
| 'removeFromQueue'
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import isElectron from 'is-electron';
|
|||||||
import { useTranslation } from 'react-i18next';
|
import { useTranslation } from 'react-i18next';
|
||||||
import {
|
import {
|
||||||
RiArrowDownLine,
|
RiArrowDownLine,
|
||||||
|
RiArrowGoForwardLine,
|
||||||
RiArrowUpLine,
|
RiArrowUpLine,
|
||||||
RiShuffleLine,
|
RiShuffleLine,
|
||||||
RiDeleteBinLine,
|
RiDeleteBinLine,
|
||||||
@@ -30,14 +31,32 @@ interface PlayQueueListOptionsProps {
|
|||||||
|
|
||||||
export const PlayQueueListControls = ({ type, tableRef }: PlayQueueListOptionsProps) => {
|
export const PlayQueueListControls = ({ type, tableRef }: PlayQueueListOptionsProps) => {
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
const { clearQueue, moveToBottomOfQueue, moveToTopOfQueue, shuffleQueue, removeFromQueue } =
|
const {
|
||||||
useQueueControls();
|
clearQueue,
|
||||||
|
moveToBottomOfQueue,
|
||||||
|
moveToNextOfQueue,
|
||||||
|
moveToTopOfQueue,
|
||||||
|
shuffleQueue,
|
||||||
|
removeFromQueue,
|
||||||
|
} = useQueueControls();
|
||||||
|
|
||||||
const { pause } = usePlayerControls();
|
const { pause } = usePlayerControls();
|
||||||
|
|
||||||
const playbackType = usePlaybackType();
|
const playbackType = usePlaybackType();
|
||||||
const setCurrentTime = useSetCurrentTime();
|
const setCurrentTime = useSetCurrentTime();
|
||||||
|
|
||||||
|
const handleMoveToNext = () => {
|
||||||
|
const selectedRows = tableRef?.current?.grid.api.getSelectedRows();
|
||||||
|
const uniqueIds = selectedRows?.map((row) => row.uniqueId);
|
||||||
|
if (!uniqueIds?.length) return;
|
||||||
|
|
||||||
|
const playerData = moveToNextOfQueue(uniqueIds);
|
||||||
|
|
||||||
|
if (playbackType === PlaybackType.LOCAL) {
|
||||||
|
setQueueNext(playerData);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
const handleMoveToBottom = () => {
|
const handleMoveToBottom = () => {
|
||||||
const selectedRows = tableRef?.current?.grid.api.getSelectedRows();
|
const selectedRows = tableRef?.current?.grid.api.getSelectedRows();
|
||||||
const uniqueIds = selectedRows?.map((row) => row.uniqueId);
|
const uniqueIds = selectedRows?.map((row) => row.uniqueId);
|
||||||
@@ -124,6 +143,15 @@ export const PlayQueueListControls = ({ type, tableRef }: PlayQueueListOptionsPr
|
|||||||
>
|
>
|
||||||
<RiShuffleLine size="1.1rem" />
|
<RiShuffleLine size="1.1rem" />
|
||||||
</Button>
|
</Button>
|
||||||
|
<Button
|
||||||
|
compact
|
||||||
|
size="md"
|
||||||
|
tooltip={{ label: t('action.moveToNext', { postProcess: 'sentenceCase' }) }}
|
||||||
|
variant="default"
|
||||||
|
onClick={handleMoveToNext}
|
||||||
|
>
|
||||||
|
<RiArrowGoForwardLine size="1.1rem" />
|
||||||
|
</Button>
|
||||||
<Button
|
<Button
|
||||||
compact
|
compact
|
||||||
size="md"
|
size="md"
|
||||||
|
|||||||
@@ -256,7 +256,10 @@ export const PlayQueue = forwardRef(({ type }: QueueProps, ref: Ref<any>) => {
|
|||||||
columnDefs={columnDefs}
|
columnDefs={columnDefs}
|
||||||
context={{
|
context={{
|
||||||
currentSong,
|
currentSong,
|
||||||
|
handleDoubleClick,
|
||||||
isFocused,
|
isFocused,
|
||||||
|
isQueue: true,
|
||||||
|
itemType: LibraryItem.SONG,
|
||||||
onCellContextMenu,
|
onCellContextMenu,
|
||||||
status,
|
status,
|
||||||
}}
|
}}
|
||||||
|
|||||||
@@ -100,7 +100,7 @@ export const useRightControls = () => {
|
|||||||
const handleVolumeWheel = useCallback(
|
const handleVolumeWheel = useCallback(
|
||||||
(e: WheelEvent<HTMLDivElement | HTMLButtonElement>) => {
|
(e: WheelEvent<HTMLDivElement | HTMLButtonElement>) => {
|
||||||
let volumeToSet;
|
let volumeToSet;
|
||||||
if (e.deltaY > 0) {
|
if (e.deltaY > 0 || e.deltaX > 0) {
|
||||||
volumeToSet = calculateVolumeDown(volume, volumeWheelStep);
|
volumeToSet = calculateVolumeDown(volume, volumeWheelStep);
|
||||||
} else {
|
} else {
|
||||||
volumeToSet = calculateVolumeUp(volume, volumeWheelStep);
|
volumeToSet = calculateVolumeUp(volume, volumeWheelStep);
|
||||||
|
|||||||
@@ -301,6 +301,7 @@ export const PlaylistDetailSongListContent = ({ songs, tableRef }: PlaylistDetai
|
|||||||
context={{
|
context={{
|
||||||
currentSong,
|
currentSong,
|
||||||
isFocused,
|
isFocused,
|
||||||
|
itemType: LibraryItem.SONG,
|
||||||
onCellContextMenu: handleContextMenu,
|
onCellContextMenu: handleContextMenu,
|
||||||
status,
|
status,
|
||||||
}}
|
}}
|
||||||
|
|||||||
@@ -66,6 +66,7 @@ export const SimilarSongsList = ({ count, fullScreen, song }: SimilarSongsListPr
|
|||||||
columnDefs={columnDefs}
|
columnDefs={columnDefs}
|
||||||
context={{
|
context={{
|
||||||
count,
|
count,
|
||||||
|
itemType: LibraryItem.SONG,
|
||||||
onCellContextMenu,
|
onCellContextMenu,
|
||||||
song,
|
song,
|
||||||
}}
|
}}
|
||||||
|
|||||||
@@ -18,7 +18,6 @@ export interface PlayerState {
|
|||||||
seek: boolean;
|
seek: boolean;
|
||||||
shuffledIndex: number;
|
shuffledIndex: number;
|
||||||
song?: QueueSong;
|
song?: QueueSong;
|
||||||
speed: number;
|
|
||||||
status: PlayerStatus;
|
status: PlayerStatus;
|
||||||
time: number;
|
time: number;
|
||||||
};
|
};
|
||||||
@@ -32,6 +31,7 @@ export interface PlayerState {
|
|||||||
};
|
};
|
||||||
repeat: PlayerRepeat;
|
repeat: PlayerRepeat;
|
||||||
shuffle: PlayerShuffle;
|
shuffle: PlayerShuffle;
|
||||||
|
speed: number;
|
||||||
volume: number;
|
volume: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -72,6 +72,7 @@ export interface PlayerSlice extends PlayerState {
|
|||||||
getQueueData: () => QueueData;
|
getQueueData: () => QueueData;
|
||||||
incrementPlayCount: (ids: string[]) => string[];
|
incrementPlayCount: (ids: string[]) => string[];
|
||||||
moveToBottomOfQueue: (uniqueIds: string[]) => PlayerData;
|
moveToBottomOfQueue: (uniqueIds: string[]) => PlayerData;
|
||||||
|
moveToNextOfQueue: (uniqueIds: string[]) => PlayerData;
|
||||||
moveToTopOfQueue: (uniqueIds: string[]) => PlayerData;
|
moveToTopOfQueue: (uniqueIds: string[]) => PlayerData;
|
||||||
next: () => PlayerData;
|
next: () => PlayerData;
|
||||||
pause: () => void;
|
pause: () => void;
|
||||||
@@ -536,6 +537,34 @@ export const usePlayerStore = create<PlayerSlice>()(
|
|||||||
|
|
||||||
return get().actions.getPlayerData();
|
return get().actions.getPlayerData();
|
||||||
},
|
},
|
||||||
|
moveToNextOfQueue: (uniqueIds) => {
|
||||||
|
const queue = get().queue.default;
|
||||||
|
const songsToMove = queue.filter((song) =>
|
||||||
|
uniqueIds.includes(song.uniqueId),
|
||||||
|
);
|
||||||
|
const currentSong = get().current.song;
|
||||||
|
const currentPosition =
|
||||||
|
get().current.index -
|
||||||
|
queue
|
||||||
|
.slice(0, get().current.index)
|
||||||
|
.filter((song) => uniqueIds.includes(song.uniqueId)).length;
|
||||||
|
const songsToStay = queue.filter(
|
||||||
|
(song) => !uniqueIds.includes(song.uniqueId),
|
||||||
|
);
|
||||||
|
const newQueue = [
|
||||||
|
...songsToStay.slice(0, currentPosition + 1),
|
||||||
|
...songsToMove,
|
||||||
|
...songsToStay.slice(currentPosition + 1),
|
||||||
|
];
|
||||||
|
const newCurrentSongIndex = newQueue.findIndex(
|
||||||
|
(song) => song.uniqueId === currentSong?.uniqueId,
|
||||||
|
);
|
||||||
|
set((state) => {
|
||||||
|
state.queue.default = newQueue;
|
||||||
|
state.current.index = newCurrentSongIndex;
|
||||||
|
});
|
||||||
|
return get().actions.getPlayerData();
|
||||||
|
},
|
||||||
moveToTopOfQueue: (uniqueIds) => {
|
moveToTopOfQueue: (uniqueIds) => {
|
||||||
const queue = get().queue.default;
|
const queue = get().queue.default;
|
||||||
|
|
||||||
@@ -805,7 +834,7 @@ export const usePlayerStore = create<PlayerSlice>()(
|
|||||||
},
|
},
|
||||||
setCurrentSpeed: (speed) => {
|
setCurrentSpeed: (speed) => {
|
||||||
set((state) => {
|
set((state) => {
|
||||||
state.current.speed = speed;
|
state.speed = speed;
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
setCurrentTime: (time, seek = false) => {
|
setCurrentTime: (time, seek = false) => {
|
||||||
@@ -1011,7 +1040,6 @@ export const usePlayerStore = create<PlayerSlice>()(
|
|||||||
seek: false,
|
seek: false,
|
||||||
shuffledIndex: 0,
|
shuffledIndex: 0,
|
||||||
song: {} as QueueSong,
|
song: {} as QueueSong,
|
||||||
speed: 1.0,
|
|
||||||
status: PlayerStatus.PAUSED,
|
status: PlayerStatus.PAUSED,
|
||||||
time: 0,
|
time: 0,
|
||||||
},
|
},
|
||||||
@@ -1026,6 +1054,7 @@ export const usePlayerStore = create<PlayerSlice>()(
|
|||||||
},
|
},
|
||||||
repeat: PlayerRepeat.NONE,
|
repeat: PlayerRepeat.NONE,
|
||||||
shuffle: PlayerShuffle.NONE,
|
shuffle: PlayerShuffle.NONE,
|
||||||
|
speed: 1.0,
|
||||||
transcode: {
|
transcode: {
|
||||||
enabled: false,
|
enabled: false,
|
||||||
},
|
},
|
||||||
@@ -1076,6 +1105,7 @@ export const useQueueControls = () =>
|
|||||||
addToQueue: state.actions.addToQueue,
|
addToQueue: state.actions.addToQueue,
|
||||||
clearQueue: state.actions.clearQueue,
|
clearQueue: state.actions.clearQueue,
|
||||||
moveToBottomOfQueue: state.actions.moveToBottomOfQueue,
|
moveToBottomOfQueue: state.actions.moveToBottomOfQueue,
|
||||||
|
moveToNextOfQueue: state.actions.moveToNextOfQueue,
|
||||||
moveToTopOfQueue: state.actions.moveToTopOfQueue,
|
moveToTopOfQueue: state.actions.moveToTopOfQueue,
|
||||||
removeFromQueue: state.actions.removeFromQueue,
|
removeFromQueue: state.actions.removeFromQueue,
|
||||||
reorderQueue: state.actions.reorderQueue,
|
reorderQueue: state.actions.reorderQueue,
|
||||||
@@ -1130,7 +1160,7 @@ export const useVolume = () => usePlayerStore((state) => state.volume);
|
|||||||
|
|
||||||
export const useMuted = () => usePlayerStore((state) => state.muted);
|
export const useMuted = () => usePlayerStore((state) => state.muted);
|
||||||
|
|
||||||
export const useSpeed = () => usePlayerStore((state) => state.current.speed);
|
export const useSpeed = () => usePlayerStore((state) => state.speed);
|
||||||
|
|
||||||
export const usePlayerFallback = () => usePlayerStore((state) => state.fallback);
|
export const usePlayerFallback = () => usePlayerStore((state) => state.fallback);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user