diff --git a/README.md b/README.md
index 3045e68e..19ae256d 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,5 @@
-
+
---
@@ -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.
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