From 4ee1822057368d121ab3bf8063408064c75b4e54 Mon Sep 17 00:00:00 2001 From: benya Date: Wed, 1 Apr 2026 23:07:12 +0300 Subject: [PATCH] feat: add all songs library view and rebrand fork to tempor --- README.md | 18 +- USAGE.md | 12 +- app/build.gradle | 4 +- .../tempo/repository/SongRepository.java | 168 +++++++++++++++++- .../tempo/ui/fragment/LibraryFragment.java | 5 + .../ui/fragment/SongListPageFragment.java | 10 +- .../cappielloantonio/tempo/util/Constants.kt | 3 +- .../viewmodel/SongListPageViewModel.java | 12 ++ app/src/main/res/layout/fragment_library.xml | 44 ++++- app/src/main/res/values-ca/strings.xml | 4 +- app/src/main/res/values-de/strings.xml | 4 +- app/src/main/res/values-es-rES/strings.xml | 4 +- app/src/main/res/values-fr/strings.xml | 2 +- app/src/main/res/values-it/strings.xml | 2 +- app/src/main/res/values-ko/strings.xml | 2 +- app/src/main/res/values-pl/strings.xml | 2 +- app/src/main/res/values-pt/strings.xml | 2 +- app/src/main/res/values-ro/strings.xml | 2 +- app/src/main/res/values-ru/strings.xml | 22 ++- app/src/main/res/values-tr/strings.xml | 2 +- app/src/main/res/values-zh-rTW/strings.xml | 2 +- app/src/main/res/values-zh/strings.xml | 2 +- app/src/main/res/values/strings.xml | 21 ++- 23 files changed, 296 insertions(+), 53 deletions(-) diff --git a/README.md b/README.md index 3045e68e..19ae256d 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@

- Tempus + Tempor

--- @@ -31,9 +31,9 @@ --> -**Tempus** is an open-source and lightweight music client for Subsonic, designed and built natively for Android. It provides a seamless and intuitive music streaming experience, allowing you to access and play your Subsonic music library directly from your Android device. +**Tempor** is an open-source and lightweight music client for Subsonic, designed and built natively for Android. It provides a seamless and intuitive music streaming experience, allowing you to access and play your Subsonic music library directly from your Android device. -Tempus does not rely on magic algorithms to decide what you should listen to. Instead, the interface is built around your listening history, randomness, and optionally integrates with services like Listenbrainz.org and Last.fm to personalize your music experience (These must be supported by your backend). +Tempor does not rely on magic algorithms to decide what you should listen to. Instead, the interface is built around your listening history, randomness, and optionally integrates with services like Listenbrainz.org and Last.fm to personalize your music experience (These must be supported by your backend). The project is a fork of [Tempo](#credits). @@ -41,7 +41,7 @@ The project is a fork of [Tempo](#credits). [Wiki](USAGE.md) [Donate](https://github.com/eddyizm/tempus#donate) -**If you find Tempus useful, please consider starring the project on GitHub. It would mean a lot to me and help promote the app to a wider audience.** +**If you find Tempor useful, please consider starring the project on GitHub. It would mean a lot to me and help promote the app to a wider audience.** **Use the Github version of the app for full Android Auto and Chromecast support.** @@ -58,19 +58,19 @@ Please note the two variants in the release assets include release/debug and 32/ ## Features -- **Subsonic Integration**: Tempus seamlessly integrates with your Subsonic server, providing you with easy access to your entire music collection on the go. +- **Subsonic Integration**: Tempor seamlessly integrates with your Subsonic server, providing you with easy access to your entire music collection on the go. - **Sleek and Intuitive UI**: Enjoy a clean and user-friendly interface designed to enhance your music listening experience, tailored to your preferences and listening history. - **Browse and Search**: Easily navigate through your music library using various browsing and searching options, including artists, albums, genres, playlists, decades and more. - **Streaming and Offline Mode**: Stream music directly from your Subsonic server. Offline mode is currently under active development and may have limitations when using multiple servers. - **Playlist Management**: Create, edit, and manage playlists to curate your perfect music collection. - **Gapless Playback**: Experience uninterrupted playback with gapless listening mode. - **Chromecast Support**: Stream your music to Chromecast devices. The support is currently in a rudimentary state.* -- **Scrobbling Integration**: Optionally integrate Tempus with Last.fm or Listenbrainz.org to scrobble your played tracks, gather music insights, and further personalize your music recommendations, if supported by your Subsonic server. -- **Podcasts and Radio**: If your Subsonic server supports it, listen to podcasts and radio shows directly within Tempus, expanding your audio entertainment options. +- **Scrobbling Integration**: Optionally integrate Tempor with Last.fm or Listenbrainz.org to scrobble your played tracks, gather music insights, and further personalize your music recommendations, if supported by your Subsonic server. +- **Podcasts and Radio**: If your Subsonic server supports it, listen to podcasts and radio shows directly within Tempor, expanding your audio entertainment options. - **Instant Mix**: Full refactor of instant mix function which leverages subsonics similarSongs2 by artist/album and similarSongs endpoints to server a larger play queue more reliably. - **Transcoding Support**: Activate transcoding of tracks on your Subsonic server, allowing you to set a transcoding profile for optimized streaming directly from the app. This feature requires support from your Subsonic server. - **Android Auto Support**: Enjoy your favorite music on the go with full Android Auto integration, allowing you to seamlessly control and listen to your tracks directly from your mobile device while driving.* -- **Multiple Libraries**: Tempus handles multi-library setups gracefully. They are displayed as Library folders. +- **Multiple Libraries**: Tempor handles multi-library setups gracefully. They are displayed as Library folders. - **Equalizer**: Option to use in app equalizer. - **Widget**: New widget to keeping the basic controls on your screen at all times. - **Available in 11 languages**: Currently in Chinese, French, German, Italian, Korean, Polish, Portuguese, Russion, Spanish and Turkish @@ -130,7 +130,7 @@ bitcoin: `3QVHSSCJvn6yXEcJ3A3cxYLMmbvFsrnUs5` ## License -Tempus is released under the [GNU General Public License v3.0](LICENSE). Feel free to modify, distribute, and use the app in accordance with the terms of the license. Contributions to the project are also welcome. +Tempor is released under the [GNU General Public License v3.0](LICENSE). Feel free to modify, distribute, and use the app in accordance with the terms of the license. Contributions to the project are also welcome. ## Credits diff --git a/USAGE.md b/USAGE.md index 2d9f7a22..5369df14 100644 --- a/USAGE.md +++ b/USAGE.md @@ -1,4 +1,4 @@ -# Tempus Usage Guide +# Tempor Usage Guide [<- back home](README.md) ## Table of Contents @@ -62,15 +62,15 @@ This app works with any service that implements the Subsonic API, including: **Multi-library** -Tempus handles multi-library setups gracefully. They are displayed as Library folders. +Tempor handles multi-library setups gracefully. They are displayed as Library folders. However, if you want to limit or change libraries you could use a workaround, if your server supports it. -You can create multiple users , one for each library, and save each of them in Tempus app. +You can create multiple users , one for each library, and save each of them in Tempor. ### Folder or index playback -If your Subsonic-compatible server exposes the folder tree **or** provides an artist index (for example Gonic, Navidrome, or any backend with folder browsing enabled), Tempus lets you play an entire folder from anywhere in the library hierarchy: +If your Subsonic-compatible server exposes the folder tree **or** provides an artist index (for example Gonic, Navidrome, or any backend with folder browsing enabled), Tempor lets you play an entire folder from anywhere in the library hierarchy:

@@ -81,7 +81,7 @@ If your Subsonic-compatible server exposes the folder tree **or** provides an ar - When viewing **inner folders** **or artist index entries**, tap the new play button to immediately enqueue every audio track inside that folder/index and all nested subfolders. - Video files are excluded automatically, so only playable audio ends up in the queue. -No extra config is needed—Tempus adjusts based on the connected backend. +No extra config is needed—Tempor adjusts based on the connected backend. ### Now Playing Screen @@ -160,7 +160,7 @@ If your server supports it - add a internet radio station feed **Enabling on your head unit** -To allow the Tempus app on your car's head unit, "Unknown sources" needs to be enabled in the Android Auto "Developer settings". This is because Tempus isn't installed through Play Store. Note that the Android Auto developer settings are different from the global Android "Developer options". +To allow the Tempor app on your car's head unit, "Unknown sources" needs to be enabled in the Android Auto "Developer settings". This is because Tempor isn't installed through Play Store. Note that the Android Auto developer settings are different from the global Android "Developer options". 1. Switch to developer mode in the Android Auto settings by tapping ten times on the "Version" item at the bottom, followed by giving your permission.

1a diff --git a/app/build.gradle b/app/build.gradle index 40a25af9..384ce4c1 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -47,12 +47,12 @@ android { productFlavors { tempus { dimension = "default" - applicationId 'com.eddyizm.tempus' + applicationId 'ru.benya.tempor' } degoogled { dimension = "default" - applicationId "com.eddyizm.degoogled.tempus" + applicationId "ru.benya.tempor.degoogled" } } diff --git a/app/src/main/java/com/cappielloantonio/tempo/repository/SongRepository.java b/app/src/main/java/com/cappielloantonio/tempo/repository/SongRepository.java index 6d5d17ee..387a7b0c 100644 --- a/app/src/main/java/com/cappielloantonio/tempo/repository/SongRepository.java +++ b/app/src/main/java/com/cappielloantonio/tempo/repository/SongRepository.java @@ -8,15 +8,23 @@ import androidx.lifecycle.MutableLiveData; import com.cappielloantonio.tempo.App; import com.cappielloantonio.tempo.subsonic.base.ApiResponse; import com.cappielloantonio.tempo.subsonic.models.Child; +import com.cappielloantonio.tempo.subsonic.models.Directory; +import com.cappielloantonio.tempo.subsonic.models.Index; +import com.cappielloantonio.tempo.subsonic.models.Indexes; +import com.cappielloantonio.tempo.subsonic.models.MusicFolder; +import com.cappielloantonio.tempo.subsonic.models.SearchResult3; import com.cappielloantonio.tempo.subsonic.models.SubsonicResponse; import com.cappielloantonio.tempo.util.Constants.SeedType; +import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; +import java.util.LinkedHashMap; import java.util.List; import java.util.Objects; import java.util.Set; +import java.util.concurrent.Executors; import retrofit2.Call; import retrofit2.Callback; @@ -60,6 +68,20 @@ public class SongRepository { return starredSongs; } + public MutableLiveData> getAllSongs() { + MutableLiveData> allSongs = new MutableLiveData<>(new ArrayList<>()); + + Executors.newSingleThreadExecutor().execute(() -> { + List songs = fetchAllSongsViaSearch(); + if (songs.isEmpty()) { + songs = fetchAllSongsViaBrowsing(); + } + allSongs.postValue(songs); + }); + + return allSongs; + } + /** * Used by ViewModels. Updates the LiveData list incrementally as songs are found. */ @@ -386,4 +408,148 @@ public class SongRepository { }); return lyrics; } -} \ No newline at end of file + + private List fetchAllSongsViaSearch() { + LinkedHashMap songsById = new LinkedHashMap<>(); + int offset = 0; + int limit = 500; + + while (true) { + try { + Response response = App.getSubsonicClientInstance(false) + .getSearchingClient() + .search3("", limit, offset, 0, 0, 0, 0) + .execute(); + + if (!response.isSuccessful() || response.body() == null) { + break; + } + + SearchResult3 searchResult3 = response.body().getSubsonicResponse().getSearchResult3(); + List batch = searchResult3 != null ? searchResult3.getSongs() : null; + if (batch == null || batch.isEmpty()) { + break; + } + + for (Child child : batch) { + addPlayableChild(songsById, child); + } + + offset += batch.size(); + } catch (IOException e) { + Log.e(TAG, "fetchAllSongsViaSearch()", e); + break; + } + } + + return new ArrayList<>(songsById.values()); + } + + private List fetchAllSongsViaBrowsing() { + LinkedHashMap songsById = new LinkedHashMap<>(); + Set visitedDirectories = new HashSet<>(); + + try { + Response musicFoldersResponse = App.getSubsonicClientInstance(false) + .getBrowsingClient() + .getMusicFolders() + .execute(); + + if (musicFoldersResponse.isSuccessful() + && musicFoldersResponse.body() != null + && musicFoldersResponse.body().getSubsonicResponse().getMusicFolders() != null + && musicFoldersResponse.body().getSubsonicResponse().getMusicFolders().getMusicFolders() != null + && !musicFoldersResponse.body().getSubsonicResponse().getMusicFolders().getMusicFolders().isEmpty()) { + for (MusicFolder musicFolder : musicFoldersResponse.body().getSubsonicResponse().getMusicFolders().getMusicFolders()) { + collectSongsFromIndexes(musicFolder.getId(), songsById, visitedDirectories); + } + } else { + collectSongsFromIndexes(null, songsById, visitedDirectories); + } + } catch (IOException e) { + Log.e(TAG, "fetchAllSongsViaBrowsing()", e); + } + + return new ArrayList<>(songsById.values()); + } + + private void collectSongsFromIndexes(String musicFolderId, LinkedHashMap songsById, Set visitedDirectories) throws IOException { + Response indexesResponse = App.getSubsonicClientInstance(false) + .getBrowsingClient() + .getIndexes(musicFolderId, null) + .execute(); + + if (!indexesResponse.isSuccessful() || indexesResponse.body() == null) { + return; + } + + Indexes indexes = indexesResponse.body().getSubsonicResponse().getIndexes(); + if (indexes == null) { + return; + } + + if (indexes.getChildren() != null) { + for (Child child : indexes.getChildren()) { + if (child == null) { + continue; + } + if (child.isDir()) { + collectSongsFromDirectory(child.getId(), songsById, visitedDirectories); + } else { + addPlayableChild(songsById, child); + } + } + } + + if (indexes.getIndices() != null) { + for (Index index : indexes.getIndices()) { + if (index == null || index.getArtists() == null) { + continue; + } + for (com.cappielloantonio.tempo.subsonic.models.Artist artist : index.getArtists()) { + if (artist != null && artist.getId() != null && !artist.getId().isEmpty()) { + collectSongsFromDirectory(artist.getId(), songsById, visitedDirectories); + } + } + } + } + } + + private void collectSongsFromDirectory(String directoryId, LinkedHashMap songsById, Set visitedDirectories) throws IOException { + if (directoryId == null || directoryId.isEmpty() || !visitedDirectories.add(directoryId)) { + return; + } + + Response directoryResponse = App.getSubsonicClientInstance(false) + .getBrowsingClient() + .getMusicDirectory(directoryId) + .execute(); + + if (!directoryResponse.isSuccessful() || directoryResponse.body() == null) { + return; + } + + Directory directory = directoryResponse.body().getSubsonicResponse().getDirectory(); + if (directory == null || directory.getChildren() == null) { + return; + } + + for (Child child : directory.getChildren()) { + if (child == null) { + continue; + } + if (child.isDir()) { + collectSongsFromDirectory(child.getId(), songsById, visitedDirectories); + } else { + addPlayableChild(songsById, child); + } + } + } + + private void addPlayableChild(LinkedHashMap songsById, Child child) { + if (child == null || child.getId() == null || child.isDir() || child.isVideo()) { + return; + } + songsById.putIfAbsent(child.getId(), child); + } +} diff --git a/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/LibraryFragment.java b/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/LibraryFragment.java index b10e6402..39e668b2 100644 --- a/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/LibraryFragment.java +++ b/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/LibraryFragment.java @@ -110,6 +110,11 @@ public class LibraryFragment extends Fragment implements ClickCallback { } private void init() { + bind.songCatalogueTextViewClickable.setOnClickListener(v -> { + Bundle bundle = new Bundle(); + bundle.putString(Constants.MEDIA_ALL, Constants.MEDIA_ALL); + activity.navController.navigate(R.id.action_libraryFragment_to_songListPageFragment, bundle); + }); bind.albumCatalogueTextViewClickable.setOnClickListener(v -> activity.navController.navigate(R.id.action_libraryFragment_to_albumCatalogueFragment)); bind.artistCatalogueTextViewClickable.setOnClickListener(v -> activity.navController.navigate(R.id.action_libraryFragment_to_artistCatalogueFragment)); bind.genreCatalogueTextViewClickable.setOnClickListener(v -> activity.navController.navigate(R.id.action_libraryFragment_to_genreCatalogueFragment)); diff --git a/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/SongListPageFragment.java b/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/SongListPageFragment.java index e0cad181..6765ab11 100644 --- a/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/SongListPageFragment.java +++ b/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/SongListPageFragment.java @@ -109,6 +109,8 @@ public class SongListPageFragment extends Fragment implements ClickCallback { } private void init() { + songListPageViewModel.invalidateSongList(); + if (requireArguments().getString(Constants.MEDIA_RECENTLY_PLAYED) != null) { songListPageViewModel.title = Constants.MEDIA_RECENTLY_PLAYED; songListPageViewModel.toolbarTitle = getString(R.string.song_list_page_recently_played); @@ -146,6 +148,10 @@ public class SongListPageFragment extends Fragment implements ClickCallback { songListPageViewModel.title = Constants.MEDIA_STARRED; songListPageViewModel.toolbarTitle = getString(R.string.song_list_page_starred); bind.pageTitleLabel.setText(R.string.song_list_page_starred); + } else if (requireArguments().getString(Constants.MEDIA_ALL) != null) { + songListPageViewModel.title = Constants.MEDIA_ALL; + songListPageViewModel.toolbarTitle = getString(R.string.song_list_page_all); + bind.pageTitleLabel.setText(R.string.song_list_page_all); } else if (requireArguments().getString(Constants.MEDIA_DOWNLOADED) != null) { songListPageViewModel.title = Constants.MEDIA_DOWNLOADED; songListPageViewModel.toolbarTitle = getString(R.string.song_list_page_downloaded); @@ -302,6 +308,7 @@ public class SongListPageFragment extends Fragment implements ClickCallback { case Constants.MEDIA_BY_ARTIST: case Constants.MEDIA_BY_GENRES: case Constants.MEDIA_STARRED: + case Constants.MEDIA_ALL: bind.pageSubtitleLabel.setText(getString(R.string.generic_list_page_count, children.size())); break; } @@ -316,6 +323,7 @@ public class SongListPageFragment extends Fragment implements ClickCallback { case Constants.MEDIA_BY_ARTIST: case Constants.MEDIA_BY_GENRES: case Constants.MEDIA_STARRED: + case Constants.MEDIA_ALL: bind.songListSortImageView.setVisibility(View.VISIBLE); break; } @@ -367,4 +375,4 @@ public class SongListPageFragment extends Fragment implements ClickCallback { private void setMediaBrowserListenableFuture() { songHorizontalAdapter.setMediaBrowserListenableFuture(mediaBrowserListenableFuture); } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/cappielloantonio/tempo/util/Constants.kt b/app/src/main/java/com/cappielloantonio/tempo/util/Constants.kt index f53c6220..6ca74ab7 100644 --- a/app/src/main/java/com/cappielloantonio/tempo/util/Constants.kt +++ b/app/src/main/java/com/cappielloantonio/tempo/util/Constants.kt @@ -70,6 +70,7 @@ object Constants { const val MEDIA_BY_ARTIST = "MEDIA_BY_ARTIST" const val MEDIA_BY_YEAR = "MEDIA_BY_YEAR" const val MEDIA_STARRED = "MEDIA_STARRED" + const val MEDIA_ALL = "MEDIA_ALL" const val MEDIA_DOWNLOADED = "MEDIA_DOWNLOADED" const val MEDIA_FROM_ALBUM = "MEDIA_FROM_ALBUM" const val MEDIA_MIX = "MEDIA_MIX" @@ -130,4 +131,4 @@ object Constants { enum class SeedType { ARTIST, ALBUM, TRACK } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/cappielloantonio/tempo/viewmodel/SongListPageViewModel.java b/app/src/main/java/com/cappielloantonio/tempo/viewmodel/SongListPageViewModel.java index acd95b1c..f4a73aaf 100644 --- a/app/src/main/java/com/cappielloantonio/tempo/viewmodel/SongListPageViewModel.java +++ b/app/src/main/java/com/cappielloantonio/tempo/viewmodel/SongListPageViewModel.java @@ -47,6 +47,10 @@ public class SongListPageViewModel extends AndroidViewModel { } public LiveData> getSongList() { + if (songList != null) { + return songList; + } + songList = new MutableLiveData<>(new ArrayList<>()); switch (title) { @@ -65,6 +69,9 @@ public class SongListPageViewModel extends AndroidViewModel { case Constants.MEDIA_STARRED: songList = songRepository.getStarredSongs(false, -1); break; + case Constants.MEDIA_ALL: + songList = songRepository.getAllSongs(); + break; } return songList; @@ -90,10 +97,15 @@ public class SongListPageViewModel extends AndroidViewModel { case Constants.MEDIA_BY_GENRES: case Constants.MEDIA_BY_YEAR: case Constants.MEDIA_STARRED: + case Constants.MEDIA_ALL: break; } } + public void invalidateSongList() { + songList = null; + } + public String getFiltersTitle() { return TextUtils.join(", ", filterNames); } diff --git a/app/src/main/res/layout/fragment_library.xml b/app/src/main/res/layout/fragment_library.xml index 0f4b7149..21324b97 100644 --- a/app/src/main/res/layout/fragment_library.xml +++ b/app/src/main/res/layout/fragment_library.xml @@ -30,6 +30,48 @@ android:orientation="vertical" android:paddingBottom="@dimen/global_padding_bottom"> + + + + + + + + + + + + + - \ No newline at end of file + diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index a0526e7d..8d787eb4 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -29,7 +29,7 @@ Publicació: %1$s, originalment: %2$s Reprodueix aleatòriament %1$d cançons • %2$d minuts - Tempus + Tempor S\'està cercant... Mescla instantània Reprodueix aleatòriament @@ -534,4 +534,4 @@ Si s\'habilita, es mostren els detalls de l\'àlbum, com el gènere i el nombre de cançons, a la pàgina de l\'àlbum. Ordena els artistes per nombre d\'àlbums Si s\'habilita, ordena els artistes per nombre d\'àlbums. Si no, s\'ordenen per nom. - \ No newline at end of file + diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index bc187b89..ffb40143 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -28,7 +28,7 @@ Veröffentlicht am %1$s, ursprünglich %2$s Zufällige Wiedergabe %1$d Tracks • %2$d Minuten - Tempus + Tempor Suche… Instant mix Mischen @@ -416,4 +416,4 @@ Tempus wird den Server bitten, die Datei zu transkodieren. Der vom Benutzer gewünschte Codec ist %1$s, die Bitrate wird dieselbe wie bei der original Datei sein. Die potentielle Transkodierung der Datei in das gewünschte Format ist vom Server abhängig. Dieser kann die Operation gegebenenfalls nicht unterstützen. Tempus wird den Server bitten, die Bitrate der Datei zu erändern. Die vom Benutzer gewünschte Bitrate ist %1$s, der Codec der Originaldatei wird nicht verändert. Änderungen an der Bitrate der Datei werden vom Server ausgeführt, dieser kann die Operation gegebenenfalls nicht unterstützen. Die Anwendung wird den Server bitten die Datei zu transkodieren und die Bitrate zu verändern. Der vom Benutzer gewünschte Codec ist %1$s, mit der Bitrate %2$s. Änderungen am Codec und an der Bitrate der Datei werden vom Server ausgeführt, dieser kann die Operation gegebenenfalls nicht unterstützen. - \ No newline at end of file + diff --git a/app/src/main/res/values-es-rES/strings.xml b/app/src/main/res/values-es-rES/strings.xml index b4ba2293..8a06b9f4 100644 --- a/app/src/main/res/values-es-rES/strings.xml +++ b/app/src/main/res/values-es-rES/strings.xml @@ -1,7 +1,7 @@ %1$d pistas • %2$d minutos - Tempus + Tempor ★ Pistas Si tienes problemas, visita https://dontkillmyapp.com. Ofrece instrucciones detalladas para desactivar características de ahorro de energía que podrían afectar al rendimiento de la app. Por favor, desactiva las optimizaciones de batería para continuar la reproducción multimedia mientras la pantalla está apagada. @@ -575,4 +575,4 @@ Habilitar el menú lateral en modo vertical [Experimental] Desbloquea el menú lateral horizontal en modo vertical. Los cambios se aplicarán al reiniciar la app. Ocultar la barra de navegación inferior en modo vertical [Experimental] - \ No newline at end of file + diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 07639ef9..6475597b 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -46,7 +46,7 @@ Sorti le %1$s, initialement %2$s Mélanger %1$d titres • %2$d minutes - Tempus + Tempor Recherche… Mix instantané Mélanger diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 7ef474b2..6594ce0a 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -28,7 +28,7 @@ Rilasciato il %1$s, originariamente il %2$s Riproduzione casuale %1$d brani • %2$d minuti - Tempus + Tempor Cercando… Mix istantaneo Riproduzione casuale diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 6d8212d3..3a6d817d 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -27,7 +27,7 @@ %1$s에 발매, %2$s에 최초 발매됨 셔플 %1$d 곡 • %2$d 분 - Tempus + Tempor 탐색 중… 인스턴트 믹스 셔플 diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index ad62edaa..c3bd78ae 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -45,7 +45,7 @@ Wydane %1$s, oryginalnie %2$s Odtwarzaj losowo %1$d utworów • %2$d minut - Tempus + Tempor Szukanie… Natychmiastowy mix mix Odtwórz losowo diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 5f893019..4c689f10 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -25,7 +25,7 @@ Sugestões semelhantes Reproduzir Aleatório - Tempus + Tempor Procurando… Mixagem instantânea Aleatório diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index 103f1305..37444eae 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -29,7 +29,7 @@ Lansat pe %1$s, inițial %2$s Amestecare %1$d cântece • %2$d minute - Tempus + Tempor Se caută… Mix instant Amestecare diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index ee27227c..cbcb990c 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -46,7 +46,7 @@ Дата релиза: %1$s, оригинал %2$s Перемешать %1$d треков • %2$d минут(ы) - Tempus + Tempor Поиск… Мгновенный микс Перемешать @@ -332,22 +332,22 @@ Продолжить в любом случае Запрошенный сервер недоступен. Если вы продолжите, это сообщение не появится в течение следующего часа. Сервер недоступен - Tempus — это легкий музыкальный клиент с открытым исходным кодом для Subsonic, разработанный специально под Android. + Tempor — это легкий музыкальный клиент с открытым исходным кодом для Subsonic, разработанный специально под Android. О приложении Always On Display Разрешить дубликаты в плейлистах Если включено, дубликаты не будут проверяться при добавлении в плейлист. Формат транскодирования - Если включено, Tempus не будет принудительно скачивать трек с настройками транскодирования, указанными ниже. + Если включено, Tempor не будет принудительно скачивать трек с настройками транскодирования, указанными ниже. Использовать серверные настройки транскодирования при скачивании - Если включено, Tempus будет скачивать треки в транскодированном виде. + Если включено, Tempor будет скачивать треки в транскодированном виде. Скачивать транскодированные треки Если включено, на сервере будет запрошена предполагаемая продолжительность трека. Оценить длительность трека Формат при скачивании Формат транскод. в моб. сети 4G/5G Формат транскод. в сети Wi-Fi - Если включено, Tempus не будет принудительно стримить трек с настройками транскодирования, указанными ниже. + Если включено, Tempor не будет принудительно стримить трек с настройками транскодирования, указанными ниже. Приоритет серверных настроек транскодирования Приоритет транскодирования передан серверу Стратегия буферизации @@ -478,7 +478,7 @@ Срок действия: %1$s Никогда Общий доступ не поддерживается или не включен - Ссылка Tempus + Ссылка Tempor UID трека UID альбома UID артиста @@ -517,6 +517,7 @@ Недавно добавленные треки Недавно воспроизведенные треки Избранные треки + Все треки %1$s лучших треков Год %1$d %1$s • %2$s %3$s @@ -564,9 +565,9 @@ Особая благодарность команде unDraw за иллюстрации, которые помогли сделать приложение красивее - Tempus Widget + Виджет Tempor Ничего не воспроизводится - Открыть Tempus + Открыть Tempor 0:00 0:00 Обложка альбома @@ -605,4 +606,9 @@ Сортировать недавние поиски по времени Если включено, поиски сортируются по времени. Если отключено - по имени. + Треки + Все треки + Загрузка всех треков… + все %1$s треков + Воспроизвести %1$s diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 50de893a..03059cff 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -28,7 +28,7 @@ %1$s tarihinde yayınlandı, orijinali %2$s Karıştır %1$d parça • %2$d dakika - Tempus + Tempor Aranıyor… Anında karışım Karıştır diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 977b0f99..96e03b7d 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -28,7 +28,7 @@ 發行日期:%1$s(原版發行於 %2$s) 隨機播放 %1$d 首歌曲 • %2$d 分鐘 - Tempus + Tempor 正在搜尋... 即時混聽 隨機播放 diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml index 1799ee7e..e92d720d 100644 --- a/app/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -28,7 +28,7 @@ 发行日期:%1$s(原版发行于 %2$s) 随机播放 %1$d 首歌曲 • %2$d 分钟 - Tempus + Tempor 正在搜索... 即时混听 随机播放 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index e62f0163..d7d455a7 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -47,7 +47,7 @@ Released on %1$s, originally %2$s Shuffle %1$d songs • %2$d minutes - Tempus + Tempor Searching… Instant mix Shuffle @@ -333,22 +333,22 @@ Continue anyway The requested server is unavailable. If you choose to continue this dialog will not appear for the next hour. Server unreachable - Tempus is an open source and lightweight music client for Subsonic, designed and built natively for Android. + Tempor is an open source and lightweight music client for Subsonic, designed and built natively for Android. About Always on display Allow adding duplicates to playlist If enabled, duplicates won\'t be checked while adding to a playlist. Transcode format - If enabled, Tempus will not force download the track with the transcode settings below. + If enabled, Tempor will not force download the track with the transcode settings below. Prioritize server settings used for streaming in downloads - If enabled, Tempus will download transcoded tracks. + If enabled, Tempor will download transcoded tracks. Download transcoded tracks If enabled, the server will be asked for the estimated duration of the track. Estimate content length Transcode format for downloads Transcode format in mobile Transcode format in Wi-Fi - If enabled, Tempus will not force stream the track with the transcode settings below. + If enabled, Tempor will not force stream the track with the transcode settings below. Prioritize server transcode settings Priority on transcoding of track given to server Buffering strategy @@ -480,7 +480,7 @@ Expiration date: %1$s Never Sharing is not supported or not enabled - Tempus asset link + Tempor asset link Song UID Album UID Artist UID @@ -519,6 +519,7 @@ Recently added tracks Recently played tracks Starred tracks + All songs %1$s\'s top tracks Year %1$d %1$s • %2$s %3$s @@ -566,9 +567,9 @@ unDraw A special thanks goes to unDraw without whose illustrations we could not have made this application more beautiful. https://undraw.co/ - Tempus Widget + Tempor Widget Not playing - Open Tempus + Open Tempor 0:00 0:00 Album artwork @@ -607,7 +608,9 @@ Sort recent searches chronologically If enabled, sort searches chronologically. Sort by name if disabled. - Getting all songs ... + Songs + All songs + Loading all songs… all %1$s songs Play %1$s