More more functions to InsertionMode pattern,

show a Toast when adding tracks to the playlist.
This commit is contained in:
tzugen 2023-07-31 12:31:26 +02:00
parent 691bfbe594
commit f89b2da30d
No known key found for this signature in database
GPG Key ID: 61E9C34BC10EC930
23 changed files with 177 additions and 183 deletions
ultrasonic/src/main

@ -488,8 +488,7 @@ class NavigationActivity : AppCompatActivity() {
val downloadHandler: DownloadHandler by inject()
downloadHandler.addTracksToMediaController(
songs = musicDirectory.getTracks(),
append = false,
playNext = false,
insertionMode = MediaPlayerManager.InsertionMode.CLEAR,
autoPlay = true,
shuffle = false,
fragment = currentFragment,

@ -98,7 +98,7 @@ class HeaderViewBinder(
holder.yearView.text = year
val songs = resources.getQuantityString(
R.plurals.select_album_n_songs, item.childCount,
R.plurals.n_songs, item.childCount,
item.childCount
)
holder.songCountView.text = songs

@ -56,7 +56,7 @@ class BookmarksFragment : TrackCollectionFragment() {
super.setupButtons(view)
playNowButton!!.setOnClickListener {
playNow(getSelectedSongs())
playNow(getSelectedTracks())
}
}

@ -20,6 +20,7 @@ import org.moire.ultrasonic.data.ActiveServerProvider
import org.moire.ultrasonic.domain.Artist
import org.moire.ultrasonic.domain.GenericEntry
import org.moire.ultrasonic.domain.Identifiable
import org.moire.ultrasonic.service.MediaPlayerManager
import org.moire.ultrasonic.service.RxBus
import org.moire.ultrasonic.service.plusAssign
import org.moire.ultrasonic.subsonic.DownloadAction
@ -133,27 +134,24 @@ abstract class EntryListFragment<T : GenericEntry> : MultiListFragment<T>() {
downloadHandler.fetchTracksAndAddToController(
fragment,
item.id,
append = false,
insertionMode = MediaPlayerManager.InsertionMode.CLEAR,
autoPlay = true,
playNext = false,
isArtist = isArtist
)
R.id.menu_play_next ->
downloadHandler.fetchTracksAndAddToController(
fragment,
item.id,
append = false,
insertionMode = MediaPlayerManager.InsertionMode.AFTER_CURRENT,
autoPlay = true,
playNext = true,
isArtist = isArtist
)
R.id.menu_play_last ->
downloadHandler.fetchTracksAndAddToController(
fragment,
item.id,
append = true,
insertionMode = MediaPlayerManager.InsertionMode.APPEND,
autoPlay = false,
playNext = false,
isArtist = isArtist
)
R.id.menu_pin ->

@ -253,7 +253,7 @@ class SearchFragment : MultiListFragment<Identifiable>(), KoinComponent {
insertionMode = MediaPlayerManager.InsertionMode.APPEND
)
mediaPlayerManager.play(mediaPlayerManager.mediaItemCount - 1)
toast(context, resources.getQuantityString(R.plurals.select_album_n_songs_added, 1, 1))
toast(context, resources.getQuantityString(R.plurals.n_songs_added_to_end, 1, 1))
}
private fun onVideoSelected(track: Track) {
@ -307,8 +307,7 @@ class SearchFragment : MultiListFragment<Identifiable>(), KoinComponent {
songs.add(item)
downloadHandler.addTracksToMediaController(
songs = songs,
append = false,
playNext = false,
insertionMode = MediaPlayerManager.InsertionMode.CLEAR,
autoPlay = true,
shuffle = false,
fragment = this,
@ -319,8 +318,7 @@ class SearchFragment : MultiListFragment<Identifiable>(), KoinComponent {
songs.add(item)
downloadHandler.addTracksToMediaController(
songs = songs,
append = true,
playNext = true,
insertionMode = MediaPlayerManager.InsertionMode.AFTER_CURRENT,
autoPlay = false,
shuffle = false,
fragment = this,
@ -331,8 +329,7 @@ class SearchFragment : MultiListFragment<Identifiable>(), KoinComponent {
songs.add(item)
downloadHandler.addTracksToMediaController(
songs = songs,
append = true,
playNext = false,
insertionMode = MediaPlayerManager.InsertionMode.APPEND,
autoPlay = false,
shuffle = false,
fragment = this,
@ -344,7 +341,7 @@ class SearchFragment : MultiListFragment<Identifiable>(), KoinComponent {
toast(
context,
resources.getQuantityString(
R.plurals.select_album_n_songs_pinned,
R.plurals.n_songs_pinned,
songs.size,
songs.size
)
@ -356,7 +353,7 @@ class SearchFragment : MultiListFragment<Identifiable>(), KoinComponent {
toast(
context,
resources.getQuantityString(
R.plurals.select_album_n_songs_downloaded,
R.plurals.n_songs_to_be_downloaded,
songs.size,
songs.size
)
@ -368,7 +365,7 @@ class SearchFragment : MultiListFragment<Identifiable>(), KoinComponent {
toast(
context,
resources.getQuantityString(
R.plurals.select_album_n_songs_unpinned,
R.plurals.n_songs_unpinned,
songs.size,
songs.size
)

@ -159,7 +159,7 @@ open class TrackCollectionFragment(
// Change the buttons if the status of any selected track changes
rxBusSubscription += RxBus.trackDownloadStateObservable.subscribe {
if (it.progress != null) return@subscribe
val selectedSongs = getSelectedSongs()
val selectedSongs = getSelectedTracks()
if (!selectedSongs.any { song -> song.id == it.id }) return@subscribe
triggerButtonUpdate(selectedSongs)
}
@ -211,23 +211,15 @@ open class TrackCollectionFragment(
}
playNowButton?.setOnClickListener {
playNow(false)
playNow(MediaPlayerManager.InsertionMode.CLEAR, toast = true)
}
playNextButton?.setOnClickListener {
downloadHandler.addTracksToMediaController(
songs = getSelectedSongs(),
append = true,
playNext = true,
autoPlay = false,
shuffle = false,
playlistName = navArgs.playlistName,
this@TrackCollectionFragment
)
playNow(MediaPlayerManager.InsertionMode.AFTER_CURRENT, toast = true)
}
playLastButton!!.setOnClickListener {
playNow(true)
playNow(MediaPlayerManager.InsertionMode.APPEND, toast = true)
}
pinButton?.setOnClickListener {
@ -291,7 +283,7 @@ open class TrackCollectionFragment(
return true
} else if (item.itemId == R.id.menu_item_share) {
shareHandler.createShare(
this@TrackCollectionFragment, getSelectedSongs(),
this@TrackCollectionFragment, getSelectedTracks(),
refreshListView, cancellationToken!!,
navArgs.id
)
@ -308,20 +300,37 @@ open class TrackCollectionFragment(
}
private fun playNow(
append: Boolean,
selectedSongs: List<Track> = getSelectedSongs()
insertionMode: MediaPlayerManager.InsertionMode,
selectedTracks: List<Track> = getSelectedTracks(),
toast: Boolean = false
) {
if (selectedSongs.isNotEmpty()) {
if (selectedTracks.isNotEmpty()) {
downloadHandler.addTracksToMediaController(
songs = selectedSongs,
append = append,
playNext = false,
autoPlay = !append,
songs = selectedTracks,
insertionMode = insertionMode,
autoPlay = (insertionMode == MediaPlayerManager.InsertionMode.CLEAR),
playlistName = null,
fragment = this
)
} else {
playAll(false, append)
playAll(false, insertionMode)
}
if (toast) {
val stringInt = when (insertionMode) {
MediaPlayerManager.InsertionMode.CLEAR ->
R.plurals.n_songs_added_play_now
MediaPlayerManager.InsertionMode.AFTER_CURRENT ->
R.plurals.n_songs_added_after_current
MediaPlayerManager.InsertionMode.APPEND ->
R.plurals.n_songs_added_to_end
}
val msg = resources.getQuantityString(
stringInt,
selectedTracks.size,
selectedTracks.size
)
Util.toast(requireContext(), msg)
}
}
@ -338,7 +347,10 @@ open class TrackCollectionFragment(
}
}
private fun playAll(shuffle: Boolean = false, append: Boolean = false) {
private fun playAll(
shuffle: Boolean = false,
insertionMode: MediaPlayerManager.InsertionMode = MediaPlayerManager.InsertionMode.CLEAR
) {
var hasSubFolders = false
for (item in viewAdapter.getCurrentList()) {
@ -355,18 +367,16 @@ open class TrackCollectionFragment(
downloadHandler.fetchTracksAndAddToController(
fragment = this,
id = navArgs.id!!,
append = append,
autoPlay = !append,
insertionMode = insertionMode,
autoPlay = (insertionMode != MediaPlayerManager.InsertionMode.APPEND),
shuffle = shuffle,
playNext = false,
isArtist = isArtist
)
} else {
downloadHandler.addTracksToMediaController(
songs = getAllSongs(),
append = append,
playNext = false,
autoPlay = !append,
insertionMode = insertionMode,
autoPlay = (insertionMode != MediaPlayerManager.InsertionMode.APPEND),
shuffle = shuffle,
playlistName = navArgs.playlistName,
fragment = this
@ -397,7 +407,7 @@ open class TrackCollectionFragment(
}
@Synchronized
fun triggerButtonUpdate(selection: List<Track> = getSelectedSongs()) {
fun triggerButtonUpdate(selection: List<Track> = getSelectedTracks()) {
listModel.calculateButtonState(selection, ::updateButtonState)
}
@ -421,7 +431,7 @@ open class TrackCollectionFragment(
}
}
private fun downloadBackground(save: Boolean, tracks: List<Track> = getSelectedSongs()) {
private fun downloadBackground(save: Boolean, tracks: List<Track> = getSelectedTracks()) {
var songs = tracks
if (songs.isEmpty()) {
@ -436,7 +446,7 @@ open class TrackCollectionFragment(
)
}
internal fun delete(songs: List<Track> = getSelectedSongs()) {
internal fun delete(songs: List<Track> = getSelectedTracks()) {
downloadHandler.justDownload(
action = DownloadAction.DELETE,
fragment = this,
@ -444,7 +454,7 @@ open class TrackCollectionFragment(
)
}
internal fun unpin(songs: List<Track> = getSelectedSongs()) {
internal fun unpin(songs: List<Track> = getSelectedTracks()) {
downloadHandler.justDownload(
action = DownloadAction.UNPIN,
fragment = this,
@ -502,10 +512,7 @@ open class TrackCollectionFragment(
val playAll = navArgs.autoPlay
if (playAll && songCount > 0) {
playAll(
navArgs.shuffle,
false
)
playAll(navArgs.shuffle, MediaPlayerManager.InsertionMode.CLEAR)
}
listModel.currentListIsSortable = true
@ -513,7 +520,7 @@ open class TrackCollectionFragment(
Timber.i("Processed list")
}
internal fun getSelectedSongs(): List<Track> {
internal fun getSelectedTracks(): List<Track> {
// Walk through selected set and get the Entries based on the saved ids.
return viewAdapter.getCurrentList().mapNotNull {
if (it is Track && viewAdapter.isSelected(it.longId))
@ -608,20 +615,13 @@ open class TrackCollectionFragment(
when (menuItem.itemId) {
R.id.song_menu_play_now -> {
playNow(false, songs)
playNow(MediaPlayerManager.InsertionMode.CLEAR, songs, true)
}
R.id.song_menu_play_next -> {
downloadHandler.addTracksToMediaController(
songs = songs,
append = true,
playNext = true,
autoPlay = false,
playlistName = navArgs.playlistName,
fragment = this@TrackCollectionFragment
)
playNow(MediaPlayerManager.InsertionMode.AFTER_CURRENT, songs, true)
}
R.id.song_menu_play_last -> {
playNow(true, songs)
playNow(MediaPlayerManager.InsertionMode.APPEND, songs, true)
}
R.id.song_menu_pin -> {
downloadBackground(true, songs)

@ -35,6 +35,7 @@ import org.moire.ultrasonic.R
import org.moire.ultrasonic.api.subsonic.ApiNotSupportedException
import org.moire.ultrasonic.domain.Share
import org.moire.ultrasonic.fragment.FragmentTitle
import org.moire.ultrasonic.service.MediaPlayerManager
import org.moire.ultrasonic.service.MusicServiceFactory
import org.moire.ultrasonic.service.OfflineException
import org.moire.ultrasonic.subsonic.DownloadAction
@ -165,10 +166,9 @@ class SharesFragment : Fragment(), KoinComponent {
this,
share.id,
share.name,
append = false,
insertionMode = MediaPlayerManager.InsertionMode.CLEAR,
autoPlay = true,
shuffle = false,
playNext = false,
shuffle = false
)
}
R.id.share_menu_play_shuffled -> {
@ -176,10 +176,9 @@ class SharesFragment : Fragment(), KoinComponent {
this,
share.id,
share.name,
append = false,
insertionMode = MediaPlayerManager.InsertionMode.CLEAR,
autoPlay = true,
shuffle = true,
playNext = false,
)
}
R.id.share_menu_delete -> {

@ -68,27 +68,27 @@ class DownloadHandler(
}
successString = when (action) {
DownloadAction.DOWNLOAD -> fragment.resources.getQuantityString(
R.plurals.select_album_n_songs_downloaded,
R.plurals.n_songs_to_be_downloaded,
tracksToDownload.size,
tracksToDownload.size
)
DownloadAction.UNPIN -> {
fragment.resources.getQuantityString(
R.plurals.select_album_n_songs_unpinned,
R.plurals.n_songs_unpinned,
tracksToDownload.size,
tracksToDownload.size
)
}
DownloadAction.PIN -> {
fragment.resources.getQuantityString(
R.plurals.select_album_n_songs_pinned,
R.plurals.n_songs_pinned,
tracksToDownload.size,
tracksToDownload.size
)
}
DownloadAction.DELETE -> {
fragment.resources.getQuantityString(
R.plurals.select_album_n_songs_deleted,
R.plurals.n_songs_deleted,
tracksToDownload.size,
tracksToDownload.size
)
@ -104,10 +104,9 @@ class DownloadHandler(
name: String? = "",
isShare: Boolean = false,
isDirectory: Boolean = true,
append: Boolean,
insertionMode: MediaPlayerManager.InsertionMode,
autoPlay: Boolean,
shuffle: Boolean = false,
playNext: Boolean,
isArtist: Boolean = false
) {
var successString: String? = null
@ -119,26 +118,28 @@ class DownloadHandler(
withContext(Dispatchers.Main) {
addTracksToMediaController(
songs = songs,
append = append,
playNext = playNext,
insertionMode = insertionMode,
autoPlay = autoPlay,
shuffle = shuffle,
playlistName = null,
fragment = fragment
)
// Play Now doesn't get a Toast :)
if (playNext) {
successString = fragment.resources.getQuantityString(
R.plurals.select_album_n_songs_play_next,
songs.size,
songs.size
)
} else if (append) {
successString = fragment.resources.getQuantityString(
R.plurals.select_album_n_songs_added,
songs.size,
songs.size
)
successString = when (insertionMode) {
MediaPlayerManager.InsertionMode.AFTER_CURRENT ->
fragment.resources.getQuantityString(
R.plurals.n_songs_added_after_current,
songs.size,
songs.size
)
MediaPlayerManager.InsertionMode.APPEND ->
fragment.resources.getQuantityString(
R.plurals.n_songs_added_to_end,
songs.size,
songs.size
)
else -> null
}
}
}) { successString }
@ -146,8 +147,7 @@ class DownloadHandler(
fun addTracksToMediaController(
songs: List<Track>,
append: Boolean,
playNext: Boolean,
insertionMode: MediaPlayerManager.InsertionMode,
autoPlay: Boolean,
shuffle: Boolean = false,
playlistName: String? = null,
@ -157,12 +157,6 @@ class DownloadHandler(
networkAndStorageChecker.warnIfNetworkOrStorageUnavailable()
val insertionMode = when {
append -> MediaPlayerManager.InsertionMode.APPEND
playNext -> MediaPlayerManager.InsertionMode.AFTER_CURRENT
else -> MediaPlayerManager.InsertionMode.CLEAR
}
if (playlistName != null) {
mediaPlayerManager.suggestedPlaylistName = playlistName
}
@ -173,7 +167,10 @@ class DownloadHandler(
shuffle,
insertionMode
)
if (Settings.shouldTransitionOnPlayback && (!append || autoPlay)) {
if (Settings.shouldTransitionOnPlayback &&
(insertionMode == MediaPlayerManager.InsertionMode.CLEAR || autoPlay)
) {
fragment.findNavController().popBackStack(R.id.playerFragment, true)
fragment.findNavController().navigate(R.id.playerFragment)
}

@ -318,7 +318,7 @@
<string name="server_menu.move_down">Posunout níž</string>
<string name="server_editor.authentication">Ověření</string>
<string name="server_editor.advanced">Rozšířené možnosti</string>
<plurals name="select_album_n_songs">
<plurals name="n_songs">
<item quantity="one">%d skladba</item>
<item quantity="few">%d skladby</item>
<item quantity="many">%d skladeb</item>

@ -383,31 +383,31 @@
<string name="server_menu.demo">Demo Server</string>
<string name="about.webpage">Website besuchen</string>
<string name="about.report">Einen Fehler melden</string>
<plurals name="select_album_n_songs">
<plurals name="n_songs">
<item quantity="one">%d Titel</item>
<item quantity="other">%d Titel</item>
</plurals>
<plurals name="select_album_n_songs_pinned">
<plurals name="n_songs_pinned">
<item quantity="one">%d Titel zum Anheften ausgewählt</item>
<item quantity="other">%d Titel zum Anheften ausgewählt</item>
</plurals>
<plurals name="select_album_n_songs_downloaded">
<plurals name="n_songs_to_be_downloaded">
<item quantity="one">%d Titel zum herunterladen ausgewählt</item>
<item quantity="other">%d Titel zum herunterladen ausgewählt</item>
</plurals>
<plurals name="select_album_n_songs_unpinned">
<plurals name="n_songs_unpinned">
<item quantity="one">%d Titel losgelöst</item>
<item quantity="other">%d Titel losgelöst</item>
</plurals>
<plurals name="select_album_n_songs_deleted">
<plurals name="n_songs_deleted">
<item quantity="one">%d Titel gelöscht</item>
<item quantity="other">%d Titel gelöscht</item>
</plurals>
<plurals name="select_album_n_songs_added">
<plurals name="n_songs_added_to_end">
<item quantity="one">%d Titel am Ende hinzugefügt</item>
<item quantity="other">%d Titel am Ende hinzugefügt</item>
</plurals>
<plurals name="select_album_n_songs_play_next">
<plurals name="n_songs_added_after_current">
<item quantity="one">%d Titel nach aktuellen Titel hinzugefügt</item>
<item quantity="other">%d Titel nach aktuellen Titel hinzugefügt</item>
</plurals>

@ -390,37 +390,37 @@
<string name="about.webpage">Visitar la página web</string>
<string name="about.report">Informar de un error</string>
<string name="about.text"><b>Ultrasonic</b> es un cliente Android de streaming de música gratuito y de código abierto para servidores compatibles con la API de Subsonic (versión 1.7.0 o superior).\n\nCon <b>Ultrasonic</b> puede transmitir o descargar fácilmente música desde su ordenador de casa a su teléfono Android utilizando su servidor multimedia compatible con Subsonic. El software del servidor Subsonic requiere una configuración adicional aparte de Ultrasonic.\n\nPor defecto, Ultrasonic no está configurado. Una vez que hayas configurado tu propio servidor, cambia la configuración del servidor para que se conecte a tu propio ordenador.</string>
<plurals name="select_album_n_songs">
<plurals name="n_songs">
<item quantity="one">%d canción</item>
<item quantity="many">%d canciones</item>
<item quantity="other">%d canciones</item>
</plurals>
<plurals name="select_album_n_songs_pinned">
<plurals name="n_songs_pinned">
<item quantity="one">%d canción seleccionada para ser anclada</item>
<item quantity="many">%d canciones seleccionadas para ser ancladas</item>
<item quantity="other">%d canciones seleccionadas para ser ancladas</item>
</plurals>
<plurals name="select_album_n_songs_downloaded">
<plurals name="n_songs_to_be_downloaded">
<item quantity="one">%d canción seleccionada para ser descargada</item>
<item quantity="many">%d canciones seleccionadas para ser descargadas</item>
<item quantity="other">%d canciones seleccionadas para ser descargadas</item>
</plurals>
<plurals name="select_album_n_songs_unpinned">
<plurals name="n_songs_unpinned">
<item quantity="one">%d canción desanclada</item>
<item quantity="many">%d canciones desancladas</item>
<item quantity="other">%d canciones desancladas</item>
</plurals>
<plurals name="select_album_n_songs_deleted">
<plurals name="n_songs_deleted">
<item quantity="one">%d canción eliminada</item>
<item quantity="many">%d canciones eliminadas</item>
<item quantity="other">%d canciones eliminadas</item>
</plurals>
<plurals name="select_album_n_songs_added">
<plurals name="n_songs_added_to_end">
<item quantity="one">%d canción añadida al final de la cola de reproducción</item>
<item quantity="many">%d canciones añadidas al final de la cola de reproducción</item>
<item quantity="other">%d canciones añadidas al final de la cola de reproducción</item>
</plurals>
<plurals name="select_album_n_songs_play_next">
<plurals name="n_songs_added_after_current">
<item quantity="one">%d canción insertada después de la canción actual</item>
<item quantity="many">%d canciones insertadas después de la canción actual</item>
<item quantity="other">%d canciones insertadas después de la canción actual</item>

@ -372,7 +372,7 @@
<string name="about.webpage">Visiter la page web</string>
<string name="about.report">Signaler un bug</string>
<string name="about.text"><b>Ultrasonic</b> est un client Android de streaming musical gratuit et open-source pour les serveurs compatibles avec l\'API Subsonic (version 1.7.0 ou supérieure). Avec <b>Ultrasonic</b>, vous pouvez facilement diffuser ou télécharger de la musique depuis votre ordinateur personnel vers votre téléphone Android en utilisant votre serveur multimédia compatible Subsonic. Le logiciel du serveur Subsonic nécessite une configuration supplémentaire distincte d\'Ultrasonic. Par défaut, Ultrasonic n\'est pas configuré. Une fois que vous avez mis en place votre propre serveur, veuillez modifier la configuration du serveur afin qu\'il se connecte à votre ordinateur.</string>
<plurals name="select_album_n_songs">
<plurals name="n_songs">
<item quantity="one">%d titre</item>
<item quantity="many">%d titres</item>
<item quantity="other">%d titres</item>
@ -400,12 +400,12 @@
<string name="settings.preload_50">50 morceaux</string>
<string name="chat.user_avatar">Image d\'avatar</string>
<string name="settings.theme_day_night">Jour et nuit</string>
<plurals name="select_album_n_songs_added">
<plurals name="n_songs_added_to_end">
<item quantity="one">%d morceau ajouté à la file d\'attente de fin de lecture</item>
<item quantity="many">"%d morceaux ajoutés à la file d\'attente de fin de lecture"</item>
<item quantity="other">%d morceaux ajoutés à la file d\'attente de fin de lecture</item>
</plurals>
<plurals name="select_album_n_songs_deleted">
<plurals name="n_songs_deleted">
<item quantity="one">%d morceau supprimé</item>
<item quantity="many">%d morceaux supprimés</item>
<item quantity="other">%d morceaux supprimés</item>
@ -429,22 +429,22 @@
<string name="settings.parallel_downloads">Combien de chansons peuvent être téléchargées en parallèle</string>
<string name="settings.show_now_playing_details_summary">Afficher plus de détails sur la chanson dans la lecture en cours (genre, année, débit)</string>
<string name="list_view">Liste</string>
<plurals name="select_album_n_songs_downloaded">
<plurals name="n_songs_to_be_downloaded">
<item quantity="one">%d chanson sélectionnée pour téléchargement</item>
<item quantity="many">%d chansons sélectionnées pour téléchargement</item>
<item quantity="other">%d chansons sélectionnées pour téléchargement</item>
</plurals>
<plurals name="select_album_n_songs_unpinned">
<plurals name="n_songs_unpinned">
<item quantity="one">%d chanson désépinglée</item>
<item quantity="many">%d chansons désépinglées</item>
<item quantity="other">%d chansons désépinglées</item>
</plurals>
<plurals name="select_album_n_songs_play_next">
<plurals name="n_songs_added_after_current">
<item quantity="one">%d chanson insérée après la chanson en cours</item>
<item quantity="many">%d chansons insérées après la chanson en cours</item>
<item quantity="other">%d chansons insérées après la chanson en cours</item>
</plurals>
<plurals name="select_album_n_songs_pinned">
<plurals name="n_songs_pinned">
<item quantity="one">%d chanson sélectionnée à épingler</item>
<item quantity="many">%d chansons sélectionnées à épingler</item>
<item quantity="other">%d chansons sélectionnées à épingler</item>

@ -51,12 +51,12 @@
<string name="common.play_last">Reproducir última</string>
<string name="common.pin">Ancorar</string>
<string name="settings.show_confirmation_dialog_summary">Mostra un cadro de diálogo de confirmación antes de eliminar ou desancorar as cancións</string>
<plurals name="select_album_n_songs_pinned">
<plurals name="n_songs_pinned">
<item quantity="one">%d canción seleccionada para ser ancorada</item>
<item quantity="other">%d cancións seleccionadas para ser ancoradas</item>
</plurals>
<string name="settings.max_bitrate_pinning">Tasa de bits máxima: ao fixar unha canción de forma permanente</string>
<plurals name="select_album_n_songs_unpinned">
<plurals name="n_songs_unpinned">
<item quantity="one">%d canción desancorada</item>
<item quantity="other">%d cancións desancoradas</item>
</plurals>

@ -326,7 +326,7 @@
<string name="server_menu.move_down">Lejjebb mozgat</string>
<string name="server_editor.authentication">Bejelentkezés</string>
<string name="server_editor.advanced">Haladó beállítások</string>
<plurals name="select_album_n_songs">
<plurals name="n_songs">
<item quantity="one">%d dal</item>
<item quantity="other">%d dal</item>
</plurals>

@ -302,25 +302,25 @@
<string name="server_menu.demo">デモサーバー</string>
<string name="about.webpage">Webページにアクセス</string>
<string name="about.report">バグを報告</string>
<plurals name="select_album_n_songs">
<plurals name="n_songs">
<item quantity="other">%d 曲</item>
</plurals>
<plurals name="select_album_n_songs_downloaded">
<plurals name="n_songs_to_be_downloaded">
<item quantity="other">%d 曲がダウンロード選択されました</item>
</plurals>
<plurals name="select_album_n_songs_unpinned">
<plurals name="n_songs_unpinned">
<item quantity="other">%d 曲が固定解除されました</item>
</plurals>
<plurals name="select_album_n_songs_pinned">
<plurals name="n_songs_pinned">
<item quantity="other">%d 曲が固定されるよう選択されました</item>
</plurals>
<plurals name="select_album_n_songs_deleted">
<plurals name="n_songs_deleted">
<item quantity="other">%d 曲が削除されました</item>
</plurals>
<plurals name="select_album_n_songs_added">
<plurals name="n_songs_added_to_end">
<item quantity="other">%d 曲が再生キューの末尾に追加されました</item>
</plurals>
<plurals name="select_album_n_songs_play_next">
<plurals name="n_songs_added_after_current">
<item quantity="other">%d 曲が現在再生中の曲の次に追加されました</item>
</plurals>
<string name="api.subsonic.generic">一般APIエラー: %1$s</string>

@ -123,11 +123,11 @@
<string name="share_set_share_options">Sett delingsinnstillinger</string>
<string name="button_bar.shares">Delinger</string>
<string name="download.toggle_playlist">Veksle spilleliste</string>
<plurals name="select_album_n_songs_play_next">
<plurals name="n_songs_added_after_current">
<item quantity="one">%d spor lagt til etter nåværende spor</item>
<item quantity="other">%d spor lagt til etter nåværende spor</item>
</plurals>
<plurals name="select_album_n_songs_added">
<plurals name="n_songs_added_to_end">
<item quantity="one">%d spor lagt til på slutten av spillekøen</item>
<item quantity="other">%d spor lagt til på slutten av spillekøen</item>
</plurals>
@ -290,19 +290,19 @@
<string name="settings.debug.log_to_file">Skriv avlusningslogg til fil</string>
<string name="about.report">Rapporter en feil</string>
<string name="api.subsonic.generic">Generisk API-feil: %1$s</string>
<plurals name="select_album_n_songs">
<plurals name="n_songs">
<item quantity="one">%d spor</item>
<item quantity="other">%d spor</item>
</plurals>
<plurals name="select_album_n_songs_pinned">
<plurals name="n_songs_pinned">
<item quantity="one">%d spor å feste</item>
<item quantity="other">%d spor å feste</item>
</plurals>
<plurals name="select_album_n_songs_unpinned">
<plurals name="n_songs_unpinned">
<item quantity="one">%d spor løsnet</item>
<item quantity="other">%d spor løsnet</item>
</plurals>
<plurals name="select_album_n_songs_deleted">
<plurals name="n_songs_deleted">
<item quantity="one">%d spor slettet</item>
<item quantity="other">%d spor løsnet</item>
</plurals>
@ -446,7 +446,7 @@
<string name="grid_view">Omslag</string>
<string name="supported_server_features">Støttede funksjoner</string>
<string name="jukebox">Jukebox</string>
<plurals name="select_album_n_songs_downloaded">
<plurals name="n_songs_to_be_downloaded">
<item quantity="one">%d spor valgt for nedlasting</item>
<item quantity="other">%d spor valgt for nedlasting</item>
</plurals>

@ -391,31 +391,31 @@
<string name="about.webpage">Website openen</string>
<string name="about.report">Bug melden</string>
<string name="about.text"><b>Ultrasonic</b> is een gratis, open source muziekstreamingclient voor Android, die gebruikmaakt van servers die compatibel zijn met de Subsonic-api (versie 1.7.0 of hoger).\n\nMet <b>Ultrasonic</b> kun je eenvoudig muziek streamen of downloaden van je computer naar je Android-telefoon met behulp van een met Subsonic compatibele mediaserver. Let op: de Subsonic-serversoftware vereist aanvullende configuratie.\n\nStandaard is Ultrasonic niet ingesteld. Zet je eigen server op en wijzig de serverconfiguratie in die van je eigen.</string>
<plurals name="select_album_n_songs">
<plurals name="n_songs">
<item quantity="one">%d nummer</item>
<item quantity="other">%d nummers</item>
</plurals>
<plurals name="select_album_n_songs_pinned">
<plurals name="n_songs_pinned">
<item quantity="one">%d vast te maken nummer geselecteerd</item>
<item quantity="other">%d vast te maken nummers geselecteerd</item>
</plurals>
<plurals name="select_album_n_songs_downloaded">
<plurals name="n_songs_to_be_downloaded">
<item quantity="one">%d te downloaden nummer geselecteerd</item>
<item quantity="other">%d te downloaden nummers geselecteerd</item>
</plurals>
<plurals name="select_album_n_songs_unpinned">
<plurals name="n_songs_unpinned">
<item quantity="one">%d nummer losgemaakt</item>
<item quantity="other">%d nummers losgemaakt</item>
</plurals>
<plurals name="select_album_n_songs_deleted">
<plurals name="n_songs_deleted">
<item quantity="one">%d nummer verwijderd</item>
<item quantity="other">%d nummers verwijderd</item>
</plurals>
<plurals name="select_album_n_songs_added">
<plurals name="n_songs_added_to_end">
<item quantity="one">%d nummer toegevoegd aan het einde van afspeelwachtrij</item>
<item quantity="other">%d nummers toegevoegd aan het einde van afspeelwachtrij</item>
</plurals>
<plurals name="select_album_n_songs_play_next">
<plurals name="n_songs_added_after_current">
<item quantity="one">%d nummer ingevoegd na het huidige nummer</item>
<item quantity="other">%d nummers ingevoegd na het huidige nummer</item>
</plurals>

@ -307,7 +307,7 @@
<string name="server_menu.move_down">Przesuń się w dół</string>
<string name="server_editor.authentication">Authentication</string>
<string name="server_editor.advanced">Ustawienia zaawansowane</string>
<plurals name="select_album_n_songs">
<plurals name="n_songs">
<item quantity="one">%d utwór</item>
<item quantity="few">%d utwory</item>
<item quantity="many">%d utworów</item>
@ -356,7 +356,7 @@
<string name="language.hu">Węgierski</string>
<string name="settings.debug.log_summary">Zapisanych jest %1$s plików z logami, które zajmują ~%2$s MB miejsca w katalogu %3$s. Czy chcesz je zachować\?</string>
<string name="buttons.previous">Poprzednie</string>
<plurals name="select_album_n_songs_deleted">
<plurals name="n_songs_deleted">
<item quantity="one">Usunięto %d utwór</item>
<item quantity="few">Usunięto %d utwory</item>
<item quantity="many">Usunięto %d utworów</item>
@ -403,20 +403,20 @@
<string name="settings.wifi_required_title">Pobieraj tylko przez Wi-Fi</string>
<string name="settings.sharing_always_ask_for_details_summary">Zawsze pytaj o opis i czas wygaśnięcia podczas tworzenia udostępnienia na serwerze</string>
<string name="settings.debug.log_delete">Usuń pliki</string>
<plurals name="select_album_n_songs_pinned">
<plurals name="n_songs_pinned">
<item quantity="one">%d utwór zaznaczony do przypięcia</item>
<item quantity="few">%d utwory zaznaczone do przypięcia</item>
<item quantity="many">%d utworów zaznaczonych do przypięcia</item>
<item quantity="other">%d utworów zaznaczonych do przypięcia</item>
</plurals>
<plurals name="select_album_n_songs_downloaded">
<plurals name="n_songs_to_be_downloaded">
<item quantity="one">%d utworów zaznaczonych do pobrania</item>
<item quantity="few">%d utwory zaznaczone do pobrania</item>
<item quantity="many">%d utworów zaznaczonych do pobrania</item>
<item quantity="other">%d utworów zaznaczonych do pobrania</item>
</plurals>
<string name="about.webpage">Odwiedź stronę internetową</string>
<plurals name="select_album_n_songs_unpinned">
<plurals name="n_songs_unpinned">
<item quantity="one">Odpięto %d utwór</item>
<item quantity="few">Odpięto %d utwory</item>
<item quantity="many">Odpięto %d utworów</item>
@ -446,13 +446,13 @@
<string name="list_view">Lista</string>
<string name="grid_view">Okładka</string>
<string name="settings.use_hw_offload_description">Spróbuj odtworzyć pliki multimedialne za pomocą układu dekodującego w telefonie. Może to zmniejszyć zużycie baterii!</string>
<plurals name="select_album_n_songs_added">
<plurals name="n_songs_added_to_end">
<item quantity="one">Dodano %d utwór na koniec kolejki odtwarzania</item>
<item quantity="few">Dodano %d utwory na koniec kolejki odtwarzania</item>
<item quantity="many">Dodano %d utworów na koniec kolejki odtwarzania</item>
<item quantity="other">Dodano %d utworów na koniec kolejki odtwarzania</item>
</plurals>
<plurals name="select_album_n_songs_play_next">
<plurals name="n_songs_added_after_current">
<item quantity="one">Wstawiono %d utwór po bieżącym utworze</item>
<item quantity="few">Wstawiono %d utwory po bieżącym utworze</item>
<item quantity="many">Wstawiono %d utworów po bieżącym utworze</item>

@ -388,37 +388,37 @@
<string name="about.webpage">Visitar a página web</string>
<string name="about.report">Reportar um erro</string>
<string name="about.text"><b>Ultrasonic</b> é um cliente gratuito e open-source para Android de streaming de música para API de servidores compatíveis com Subsonic (version 1.7.0 ou maior).\n\nCom <b>Ultrasonic</b> você pode facilmente reproduzir online ou baixar música de seu computador doméstico para seu telefone Android usando um servidor de mídia compatível com Subsonic. O software do servidor Subsonic necessita uma configuração independente do Ultrasonic.\n\nPor padrão, o servidor Ultrasonic não é configurado. Uma vez que você configurou seu próprio servidor, altere a configuração no Ultrasonic para poder conectá-lo.</string>
<plurals name="select_album_n_songs">
<plurals name="n_songs">
<item quantity="one">%d música</item>
<item quantity="many">%d músicas</item>
<item quantity="other">%d músicas</item>
</plurals>
<plurals name="select_album_n_songs_pinned">
<plurals name="n_songs_pinned">
<item quantity="one">%d música selecionada para ser fixada</item>
<item quantity="many">%d músicas selecionadas para serem fixadas</item>
<item quantity="other">%d músicas selecionadas para serem fixadas</item>
</plurals>
<plurals name="select_album_n_songs_downloaded">
<plurals name="n_songs_to_be_downloaded">
<item quantity="one">%d música selecionada para ser baixada</item>
<item quantity="many">%d músicas selecionadas para serem baixadas</item>
<item quantity="other">%d músicas selecionadas para serem baixadas</item>
</plurals>
<plurals name="select_album_n_songs_unpinned">
<plurals name="n_songs_unpinned">
<item quantity="one">%d música desfixada</item>
<item quantity="many">%d músicas desfixadas</item>
<item quantity="other">%d músicas desfixadas</item>
</plurals>
<plurals name="select_album_n_songs_deleted">
<plurals name="n_songs_deleted">
<item quantity="one">%d música excluída</item>
<item quantity="many">%d músicas excluídas</item>
<item quantity="other">%d músicas excluídas</item>
</plurals>
<plurals name="select_album_n_songs_added">
<plurals name="n_songs_added_to_end">
<item quantity="one">%d música adicionada ao final da playlist</item>
<item quantity="many">%d músicas adicionadas ao final da playlist</item>
<item quantity="other">%d músicas adicionadas ao final da playlist</item>
</plurals>
<plurals name="select_album_n_songs_play_next">
<plurals name="n_songs_added_after_current">
<item quantity="one">%d música adicionada após a atual</item>
<item quantity="many">%d músicas adicionadas após a atual</item>
<item quantity="other">%d músicas adicionadas após a atual</item>

@ -307,7 +307,7 @@
<string name="server_menu.move_down">Move down</string>
<string name="server_editor.authentication">Authentication</string>
<string name="server_editor.advanced">Configurações avançadas</string>
<plurals name="select_album_n_songs">
<plurals name="n_songs">
<item quantity="one">%d música</item>
<item quantity="many">%d músicas</item>
<item quantity="other">%d músicas</item>
@ -330,22 +330,22 @@
<string name="server_menu.demo">Servidor Demonstração</string>
<string name="about.webpage">Visitar a página web</string>
<string name="about.report">Reportar um erro</string>
<plurals name="select_album_n_songs_pinned">
<plurals name="n_songs_pinned">
<item quantity="one">%d música selecionada para ser fixada</item>
<item quantity="many">%d músicas selecionadas para serem fixadas</item>
<item quantity="other">%d músicas selecionadas para serem fixadas</item>
</plurals>
<plurals name="select_album_n_songs_unpinned">
<plurals name="n_songs_unpinned">
<item quantity="one">%d música desfixada</item>
<item quantity="many">%d músicas desfixadas</item>
<item quantity="other">%d músicas desfixadas</item>
</plurals>
<plurals name="select_album_n_songs_deleted">
<plurals name="n_songs_deleted">
<item quantity="one">%d música excluída</item>
<item quantity="many">%d músicas excluídas</item>
<item quantity="other">%d músicas excluídas</item>
</plurals>
<plurals name="select_album_n_songs_added">
<plurals name="n_songs_added_to_end">
<item quantity="one">%d música adicionada ao final da playlist</item>
<item quantity="many">%d músicas adicionadas ao final da playlist</item>
<item quantity="other">%d músicas adicionadas ao final da playlist</item>
@ -447,12 +447,12 @@
\nCom <b>Ultrasonic</b>, pode facilmente reproduzir online ou descarregar música do seu computador doméstico para o seu telefone Android usando um servidor de mídia compatível com Subsonic. O software do servidor Subsonic necessita uma configuração independente do Ultrasonic.
\n
\nPor padrão, o servidor Ultrasonic não é configurado. Uma vez que configurou o seu próprio servidor, altere a configuração no Ultrasonic para poder conectá-lo.</string>
<plurals name="select_album_n_songs_downloaded">
<plurals name="n_songs_to_be_downloaded">
<item quantity="one">%d música selecionada a ser descarregada</item>
<item quantity="many">%d músicas selecionadas para serem baixadas</item>
<item quantity="other">%d músicas selecionadas para serem baixadas</item>
</plurals>
<plurals name="select_album_n_songs_play_next">
<plurals name="n_songs_added_after_current">
<item quantity="one">%d música adicionada após a atual</item>
<item quantity="many">%d músicas adicionadas após a atual</item>
<item quantity="other">%d músicas adicionadas após a atual</item>

@ -347,7 +347,7 @@
<string name="server_editor.disabled_feature">Одна или несколько функций были отключены, потому что сервер их не поддерживает.\nВы можете запустить этот тест снова в любое время.</string>
<string name="server_menu.demo">Демо-сервер</string>
<plurals name="select_album_n_songs">
<plurals name="n_songs">
<item quantity="one">%d песня</item>
<item quantity="few">%d песни</item>
<item quantity="many">%d песен</item>

@ -368,25 +368,25 @@
\n通过使用 <b>Ultrasonic</b> 你可以轻松的从你的电脑上的 Subsonic 兼容服务端流式传输或者下载音乐。 Subsonic 服务端与 Ultrasonic 都需要额外的配置才可使用。
\n
\n默认情况下Ultrasonic 并未进行配置,当服务端配置完成后,请确保配置允许客户端连接到你的计算机。</string>
<plurals name="select_album_n_songs">
<plurals name="n_songs">
<item quantity="other">%d 首曲目</item>
</plurals>
<plurals name="select_album_n_songs_pinned">
<plurals name="n_songs_pinned">
<item quantity="other">已选择 %d 首歌曲进行固定</item>
</plurals>
<plurals name="select_album_n_songs_downloaded">
<plurals name="n_songs_to_be_downloaded">
<item quantity="other">已选择要下载 %d 首歌曲</item>
</plurals>
<plurals name="select_album_n_songs_unpinned">
<plurals name="n_songs_unpinned">
<item quantity="other">已选择 %d 首歌曲取消固定</item>
</plurals>
<plurals name="select_album_n_songs_deleted">
<plurals name="n_songs_deleted">
<item quantity="other">%d 首歌曲被删除</item>
</plurals>
<plurals name="select_album_n_songs_added">
<plurals name="n_songs_added_to_end">
<item quantity="other">已将 %d 首歌曲添加到播放队列的末尾</item>
</plurals>
<plurals name="select_album_n_songs_play_next">
<plurals name="n_songs_added_after_current">
<item quantity="other">在当前歌曲之后插入了 %d 首歌曲</item>
</plurals>
<!-- Subsonic api errors -->

@ -402,31 +402,35 @@
<string name="about.webpage.url" translatable="false">https://ultrasonic.gitlab.io/</string>
<string name="about.report.url" translatable="false">https://gitlab.com/ultrasonic/ultrasonic/issues</string>
<plurals name="select_album_n_songs">
<plurals name="n_songs">
<item quantity="one">%d song</item>
<item quantity="other">%d songs</item>
</plurals>
<plurals name="select_album_n_songs_pinned">
<plurals name="n_songs_pinned">
<item quantity="one">%d song selected to be pinned</item>
<item quantity="other">%d songs selected to be pinned</item>
</plurals>
<plurals name="select_album_n_songs_downloaded">
<plurals name="n_songs_to_be_downloaded">
<item quantity="one">%d song selected to be downloaded</item>
<item quantity="other">%d songs selected to be downloaded</item>
</plurals>
<plurals name="select_album_n_songs_unpinned">
<plurals name="n_songs_unpinned">
<item quantity="one">%d song unpinned</item>
<item quantity="other">%d songs unpinned</item>
</plurals>
<plurals name="select_album_n_songs_deleted">
<plurals name="n_songs_deleted">
<item quantity="one">%d song deleted</item>
<item quantity="other">%d songs deleted</item>
</plurals>
<plurals name="select_album_n_songs_added">
<plurals name="n_songs_added_play_now">
<item quantity="one">%d song added to the play queue</item>
<item quantity="other">%d songs added to the play queue</item>
</plurals>
<plurals name="n_songs_added_to_end">
<item quantity="one">%d song added to the end of play queue</item>
<item quantity="other">%d songs added to the end of play queue</item>
</plurals>
<plurals name="select_album_n_songs_play_next">
<plurals name="n_songs_added_after_current">
<item quantity="one">%d song inserted after current song</item>
<item quantity="other">%d songs inserted after current song</item>
</plurals>