47 Commits

Author SHA1 Message Date
eddyizm
20cb7b8cad Merge branch 'all-songs' into bleeding-edge 2026-03-23 22:26:59 -07:00
eddyizm
f32359a369 Merge branch 'aa-genres' into bleeding-edge 2026-03-23 22:26:51 -07:00
Unknown0816
23a68011e2 Added all-songs feature 2026-03-22 20:19:37 +01:00
eddyizm
07ced3308f chore: bumped version for testing 2026-03-22 11:17:03 -07:00
eddyizm
ed9ebfc84b Merge branch 'logo-refresh' into bleeding-edge 2026-03-22 11:15:54 -07:00
eddyizm
cc21e05957 chore: updated readme with new logo credit 2026-03-21 08:46:28 -07:00
eddyizm
acb8e54893 feat: updated degoogled color, added the proper background launcher, added png icons and banner 2026-03-20 18:18:46 -07:00
eddyizm
6dca81b937 Merge branch 'development' into bleeding-edge 2026-03-19 21:38:42 -07:00
eddyizm
ecaf61d31d Merge branch 'nav-bottom-refactor' into bleeding-edge 2026-03-19 21:20:51 -07:00
eddyizm
a2a2fad444 Merge branch 'development' into logo-refresh 2026-03-19 21:19:55 -07:00
eddyizm
022e3bf61b Merge branch 'development' into refactor-navigation-and-bottom-sheet 2026-03-19 21:18:45 -07:00
Joril
2aa4ccde91 Updated USAGE.md 2026-03-17 20:29:58 +00:00
Joril
1ef7ef7377 Add preference to shuffle songs on the 'genre' page 2026-03-17 20:26:07 +00:00
eddyizm
7151fda9c2 fix: updated with a less crappy monochrome thanks to mr seattle guy! 2026-03-16 22:02:08 -07:00
Joril
0b61653dcc Updated USAGE.md 2026-03-16 21:11:16 +00:00
Joril
5fc15c7173 Add 'genres' string to multilingual files that use aa_tab_titles and aa_tab_values 2026-03-16 21:02:01 +00:00
Jorilx
7661d7aa4d Add 'genres' page/function to Android Auto 2026-03-15 15:40:05 +01:00
eddyizm
84b690b765 fixed red icon scaling 2026-03-10 07:58:09 -07:00
eddyizm
17bf90827b fix: added android tranparent 2026-03-10 07:22:55 -07:00
eddyizm
76f434604f fix: got both variants matching up size wise 2026-03-09 22:40:55 -07:00
eddyizm
89e1b49ea2 fix: adjusted launcher and splash scale size 2026-03-09 22:23:30 -07:00
eddyizm
b53d031701 feat: removing old webp and using new vector icon. testing adaptive monochrome 2026-03-08 22:26:44 -07:00
Tomás Villegas
3f16eca404 feat: add back button to settings view 2026-03-07 20:21:28 -03:00
Tomás Villegas
525608320e fix: onStop declaration on wrong class 2026-03-07 18:56:27 -03:00
Tomás Villegas
fe324b6f9b feat: set app settings inside a frame layout
In order to add a toolbar with a back button in settings I needed to extend from a fragment
so I converted SettingsFragment into a fragment and created SettingsContainerFragment,
the latter is injected as a child of SettingsFragment inside a FrameLayout.

Since SettingsContainerFragment extends from PreferenceFragmentCompat, this allows
to swap it for other and, in the bigger picture, allow an arbitrary organization.
2026-03-07 18:56:15 -03:00
Tomás Villegas
bca2b6ccab Merge branch 'refactor-set-controller-pattern-to-navigation' into refactor-navigation-and-bottom-sheet 2026-03-07 18:33:20 -03:00
eddyizm
7fb08dc470 Merge branch 'development' into logo-refresh 2026-03-06 21:19:19 -08:00
eddyizm
d856b325e9 merged main 2026-03-02 07:11:23 -08:00
eddyizm
5007d89b1c wip: working on new logo 2026-02-28 08:22:39 -08:00
Tomás Villegas
0a77afae14 refactor: set controller pattern to bottom sheet 2026-02-26 00:00:56 -03:00
Tomás Villegas
91506a308d feat: remove unnecessary global variables 2026-02-25 13:51:08 -03:00
Tomás Villegas
dba4e4b428 feat: migrate to new navigation controller 2026-02-25 13:33:17 -03:00
Tomás Villegas
0b23d4355e feat: stabilize public methods and their implementations 2026-02-25 13:32:09 -03:00
Tomás Villegas
4803ce676a fix: remove old navigation controller delegate 2026-02-25 13:30:53 -03:00
Tomás Villegas
ecec442e4b refactor: move controller to dedicated pakckage 2026-02-25 11:17:22 -03:00
Tomás Villegas
b38da77393 Merge branch 'feat-enhance-navigation' into refactor-set-controller-pattern-to-navigation 2026-02-25 11:09:11 -03:00
Tomás Villegas
0268bb42c3 chore: set experimental label to settings title
Hide bottom navigation bar on portrait and unlock drawer on portrait
2026-02-25 11:07:21 -03:00
Tomás Villegas
ae183122ac Revert "feat: set app settings inside a frame layout"
This reverts commit 52cfd36b09.
2026-02-25 09:59:59 -03:00
Tomás Villegas
6ce1063639 Revert "fix: onStop declaration on wrong class"
This reverts commit 34d354d803.
2026-02-25 09:59:52 -03:00
Tomás Villegas
d1851bcc5a refactor: delegate navigation to controller and helper 2026-02-25 01:56:03 -03:00
Tomás Villegas
2db9cb80d1 fix: navbar + bottom sheet behavior on equalizer fragment 2026-02-24 18:23:03 -03:00
Tomás Villegas
0b7d1e629b Revert "fix: equalizer not respecting navigation ui directives"
This reverts commit eeb125542d.
2026-02-24 18:09:30 -03:00
Tomás Villegas
eeb125542d fix: equalizer not respecting navigation ui directives 2026-02-23 00:19:20 -03:00
Tomás Villegas
34d354d803 fix: onStop declaration on wrong class 2026-02-23 00:18:50 -03:00
Tomás Villegas
52cfd36b09 feat: set app settings inside a frame layout
In order to add a toolbar with a back button in settings I needed to extend from a fragment
so I converted SettingsFragment into a fragment and created SettingsContainerFragment,
the latter is injected as a child of SettingsFragment inside a FrameLayout.

Since SettingsContainerFragment extends from PreferenceFragmentCompat, this allows
to swap it for other and, in the bigger picture, allow an arbitrary organization.
2026-02-23 00:03:41 -03:00
Tomás Villegas
360929e772 fix: leaving settings always unlocks drawer 2026-02-21 14:31:22 -03:00
Tomás Villegas
82f9679da7 feat: enhance navigation 2026-02-21 01:14:08 -03:00
55 changed files with 91 additions and 622 deletions

View File

@@ -1,27 +1,5 @@
# Changelog
## What's Changed
## [4.13.0](https://github.com/eddyizm/tempo/releases/tag/v4.13.0) (2026-03-25)
* chore(i18n): Improve Russian translation by @NikkoFox in https://github.com/eddyizm/tempus/pull/503
* feat: tile size manager by @MaFo-28 in https://github.com/eddyizm/tempus/pull/440
* chore(i18n): Translated to zh_TW by @olivertzeng in https://github.com/eddyizm/tempus/pull/494
* fix: Show full album name when displaying details by @jaime-grj in https://github.com/eddyizm/tempus/pull/508
* chore(i18n): Update Spanish translation by @jaime-grj in https://github.com/eddyizm/tempus/pull/509
* fix: Relocate "Offline mode" text by @jaime-grj in https://github.com/eddyizm/tempus/pull/510
* chore(i18n): Update Polish translation by @skajmer in https://github.com/eddyizm/tempus/pull/516
* refactor: navigation and bottom sheet by @tvillega in https://github.com/eddyizm/tempus/pull/491
* feat: Logo refresh by @eddyizm in https://github.com/eddyizm/tempus/pull/498
* feat: Add 'genres' page/function to Android Auto by @Jorilx in https://github.com/eddyizm/tempus/pull/505
* feat: Added all-songs feature by @unknown0816 in https://github.com/eddyizm/tempus/pull/517
## New Contributors
* @NikkoFox made their first contribution in https://github.com/eddyizm/tempus/pull/503
* @olivertzeng made their first contribution in https://github.com/eddyizm/tempus/pull/494
* @Jorilx made their first contribution in https://github.com/eddyizm/tempus/pull/505
* @unknown0816 made their first contribution in https://github.com/eddyizm/tempus/pull/517
**Full Changelog**: https://github.com/eddyizm/tempus/compare/v4.12.6...v4.13.0
## What's Changed
## [4.12.6](https://github.com/eddyizm/tempo/releases/tag/v4.12.6) (2026-03-06)
* doc: update USAGE with android auto configuration by @MaFo-28 in https://github.com/eddyizm/tempus/pull/481

View File

@@ -1,5 +1,5 @@
<p align="center">
<img alt="Tempor" title="Tempor" src="mockup/svg/tempus-horizontal-banner.png" width="250">
<img alt="Tempus" title="Tempus" src="mockup/svg/tempus-horizontal-banner.png" width="250">
</p>
---
@@ -31,9 +31,9 @@
-->
**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** 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 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).
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).
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 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.**
**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.**
**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**: Tempor seamlessly integrates with your Subsonic server, providing you with easy access to your entire music collection on the go.
- **Subsonic Integration**: Tempus 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 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.
- **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.
- **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**: Tempor handles multi-library setups gracefully. They are displayed as Library folders.
- **Multiple Libraries**: Tempus 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
@@ -84,13 +84,13 @@ Please note the two variants in the release assets include release/debug and 32/
</p>
<p align="center">
<img src="mockup/1_light_tempus.png" width=200>
<img src="mockup/2_light_tempus.png" width=200>
<img src="mockup/3_light_tempus.png" width=200>
<img src="fastlane/metadata/android/en-US/images/phoneScreenshots/1_light.png" width=200>
<img src="fastlane/metadata/android/en-US/images/phoneScreenshots/2_light.png" width=200>
<img src="fastlane/metadata/android/en-US/images/phoneScreenshots/3_light.png" width=200>
<img src="fastlane/metadata/android/en-US/images/phoneScreenshots/4_light.png" width=200>
<img src="fastlane/metadata/android/en-US/images/phoneScreenshots/5_light.png" width=200>
<img src="fastlane/metadata/android/en-US/images/phoneScreenshots/6_light.png" width=200>
<!-- <img src="fastlane/metadata/android/en-US/images/phoneScreenshots/8_light.png" width=200> -->
<img src="fastlane/metadata/android/en-US/images/phoneScreenshots/8_light.png" width=200>
</p>
<br>
@@ -100,13 +100,13 @@ Please note the two variants in the release assets include release/debug and 32/
</p>
<p align="center">
<img src="mockup/1_dark_tempus.png" width=200>
<img src="mockup/2_dark_tempus.png" width=200>
<img src="mockup/3_dark_tempus.png" width=200>
<img src="fastlane/metadata/android/en-US/images/phoneScreenshots/1_dark.png" width=200>
<img src="fastlane/metadata/android/en-US/images/phoneScreenshots/2_dark.png" width=200>
<img src="fastlane/metadata/android/en-US/images/phoneScreenshots/3_dark.png" width=200>
<img src="fastlane/metadata/android/en-US/images/phoneScreenshots/4_dark.png" width=200>
<img src="fastlane/metadata/android/en-US/images/phoneScreenshots/5_dark.png" width=200>
<img src="fastlane/metadata/android/en-US/images/phoneScreenshots/6_dark.png" width=200>
<!-- <img src="fastlane/metadata/android/en-US/images/phoneScreenshots/8_dark.png" width=200> -->
<img src="fastlane/metadata/android/en-US/images/phoneScreenshots/8_dark.png" width=200>
</p>
@@ -130,7 +130,7 @@ bitcoin: `3QVHSSCJvn6yXEcJ3A3cxYLMmbvFsrnUs5`
## License
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.
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.
## Credits

View File

@@ -1,4 +1,4 @@
# Tempor Usage Guide
# Tempus 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**
Tempor handles multi-library setups gracefully. They are displayed as Library folders.
Tempus 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 Tempor.
You can create multiple users , one for each library, and save each of them in Tempus app.
### 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), Tempor 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), Tempus lets you play an entire folder from anywhere in the library hierarchy:
<p align="left">
<img src="mockup/usage/music_folders_root.png" width=317 style="margin-right:16px;">
@@ -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—Tempor adjusts based on the connected backend.
No extra config is needed—Tempus 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 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".
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".
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.
<p align="left">
<img width="270" height="600" alt="1a" src="https://github.com/user-attachments/assets/f09f6999-9761-4b05-8ec7-bf221a15dda3" />

View File

@@ -1 +0,0 @@
markdown: GFM

View File

@@ -10,8 +10,8 @@ android {
minSdkVersion 24
targetSdk 35
versionCode 24
versionName '4.13.0'
versionCode 23
versionName '4.13.0-DEV'
testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner'
javaCompileOptions {
@@ -47,12 +47,12 @@ android {
productFlavors {
tempus {
dimension = "default"
applicationId 'ru.benya.tempor'
applicationId 'com.eddyizm.tempus'
}
degoogled {
dimension = "default"
applicationId "ru.benya.tempor.degoogled"
applicationId "com.eddyizm.degoogled.tempus"
}
}

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@drawable/ic_launcher_background_tempor_b"/>
<foreground android:drawable="@drawable/ic_launcher_foreground_tempor_b"/>
<monochrome android:drawable="@drawable/ic_launcher_monochrome_tempor_b"/>
</adaptive-icon>
<background android:drawable="@drawable/ic_launcher_background"/>
<foreground android:drawable="@drawable/ic_launcher_foreground"/>
<monochrome android:drawable="@drawable/ic_launcher_monochrome"/>
</adaptive-icon>

View File

@@ -8,23 +8,15 @@ 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;
@@ -68,20 +60,6 @@ public class SongRepository {
return starredSongs;
}
public MutableLiveData<List<Child>> getAllSongs() {
MutableLiveData<List<Child>> allSongs = new MutableLiveData<>(new ArrayList<>());
Executors.newSingleThreadExecutor().execute(() -> {
List<Child> songs = fetchAllSongsViaSearch();
if (songs.isEmpty()) {
songs = fetchAllSongsViaBrowsing();
}
allSongs.postValue(songs);
});
return allSongs;
}
/**
* Used by ViewModels. Updates the LiveData list incrementally as songs are found.
*/
@@ -408,148 +386,4 @@ public class SongRepository {
});
return lyrics;
}
private List<Child> fetchAllSongsViaSearch() {
LinkedHashMap<String, Child> songsById = new LinkedHashMap<>();
int offset = 0;
int limit = 500;
while (true) {
try {
Response<ApiResponse> 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<Child> 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<Child> fetchAllSongsViaBrowsing() {
LinkedHashMap<String, Child> songsById = new LinkedHashMap<>();
Set<String> visitedDirectories = new HashSet<>();
try {
Response<ApiResponse> 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<String, Child> songsById, Set<String> visitedDirectories) throws IOException {
Response<ApiResponse> 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<String, Child> songsById, Set<String> visitedDirectories) throws IOException {
if (directoryId == null || directoryId.isEmpty() || !visitedDirectories.add(directoryId)) {
return;
}
Response<ApiResponse> 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<String, Child> songsById, Child child) {
if (child == null || child.getId() == null || child.isDir() || child.isVideo()) {
return;
}
songsById.putIfAbsent(child.getId(), child);
}
}
}

View File

@@ -110,11 +110,6 @@ 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));

View File

@@ -109,8 +109,6 @@ 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);
@@ -148,10 +146,6 @@ 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);
@@ -308,7 +302,6 @@ 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;
}
@@ -323,7 +316,6 @@ 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;
}
@@ -375,4 +367,4 @@ public class SongListPageFragment extends Fragment implements ClickCallback {
private void setMediaBrowserListenableFuture() {
songHorizontalAdapter.setMediaBrowserListenableFuture(mediaBrowserListenableFuture);
}
}
}

View File

@@ -70,7 +70,6 @@ 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"
@@ -131,4 +130,4 @@ object Constants {
enum class SeedType {
ARTIST, ALBUM, TRACK
}
}
}

View File

@@ -47,10 +47,6 @@ public class SongListPageViewModel extends AndroidViewModel {
}
public LiveData<List<Child>> getSongList() {
if (songList != null) {
return songList;
}
songList = new MutableLiveData<>(new ArrayList<>());
switch (title) {
@@ -69,9 +65,6 @@ 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;
@@ -97,15 +90,10 @@ 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);
}

View File

@@ -1,10 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108">
<path
android:fillColor="#FF111827"
android:pathData="M0,0h108v108h-108z" />
</vector>

View File

@@ -1,10 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108">
<path
android:fillColor="#FF0F172A"
android:pathData="M0,0h108v108h-108z" />
</vector>

View File

@@ -1,10 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108">
<path
android:fillColor="#FF1F2937"
android:pathData="M0,0h108v108h-108z" />
</vector>

View File

@@ -1,22 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108">
<path
android:fillColor="#00FFFFFF"
android:pathData="M54,18A36,36 0 1,1 53.99,18"
android:strokeColor="#FFF97316"
android:strokeLineCap="round"
android:strokeWidth="8" />
<path
android:fillColor="#FFF9FAFB"
android:pathData="M34,28h40v10h-14v42h-12v-42h-14z" />
<path
android:fillColor="#FFF97316"
android:pathData="M70,64h12v12h-12z" />
</vector>

View File

@@ -1,28 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108">
<group
android:scaleX="0.82"
android:scaleY="0.82"
android:translateX="9.72"
android:translateY="9.72">
<path
android:fillColor="#FF38BDF8"
android:pathData="M24,68h12v-18h-12z" />
<path
android:fillColor="#FFF8FAFC"
android:pathData="M42,78h12v-48h-12z" />
<path
android:fillColor="#FF38BDF8"
android:pathData="M60,60h12v-22h-12z" />
<path
android:fillColor="#FFF8FAFC"
android:pathData="M78,48h6v24h-6z" />
<path
android:fillColor="#FF38BDF8"
android:pathData="M24,30h60v8h-60z" />
</group>
</vector>

View File

@@ -1,22 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108">
<path
android:fillColor="#00FFFFFF"
android:pathData="M54,20A34,34 0 1,1 53.99,20"
android:strokeColor="#FFF59E0B"
android:strokeLineCap="round"
android:strokeWidth="8" />
<path
android:fillColor="#FFF9FAFB"
android:pathData="M48,36h8v18l14,8l-4,7l-18,-11z" />
<path
android:fillColor="#FFF59E0B"
android:pathData="M30,28l20,12l-20,12z" />
</vector>

View File

@@ -1,22 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108">
<path
android:fillColor="#00FFFFFF"
android:pathData="M54,18A36,36 0 1,1 53.99,18"
android:strokeColor="#FF111827"
android:strokeLineCap="round"
android:strokeWidth="8" />
<path
android:fillColor="#FF111827"
android:pathData="M34,28h40v10h-14v42h-12v-42h-14z" />
<path
android:fillColor="#FF111827"
android:pathData="M70,64h12v12h-12z" />
</vector>

View File

@@ -1,23 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108">
<path
android:fillColor="#FF111827"
android:pathData="M24,68h12v-18h-12z" />
<path
android:fillColor="#FF111827"
android:pathData="M42,78h12v-48h-12z" />
<path
android:fillColor="#FF111827"
android:pathData="M60,60h12v-22h-12z" />
<path
android:fillColor="#FF111827"
android:pathData="M78,48h6v24h-6z" />
<path
android:fillColor="#FF111827"
android:pathData="M24,30h60v8h-60z" />
</vector>

View File

@@ -1,22 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108">
<path
android:fillColor="#00FFFFFF"
android:pathData="M54,20A34,34 0 1,1 53.99,20"
android:strokeColor="#FF111827"
android:strokeLineCap="round"
android:strokeWidth="8" />
<path
android:fillColor="#FF111827"
android:pathData="M48,36h8v18l14,8l-4,7l-18,-11z" />
<path
android:fillColor="#FF111827"
android:pathData="M30,28l20,12l-20,12z" />
</vector>

View File

@@ -47,19 +47,6 @@
app:behavior_hideable="true"
app:behavior_peekHeight="@dimen/bottom_sheet_peek_height"
app:layout_behavior="@string/bottom_sheet_behavior" />
<TextView
android:id="@+id/offline_mode_text_view"
style="@style/NoConnectionTextView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:layout_gravity="top"
android:padding="2dp"
android:text="@string/activity_info_offline_mode"
android:textSize="11sp"
android:visibility="gone" />
</androidx.coordinatorlayout.widget.CoordinatorLayout>
<com.google.android.material.navigation.NavigationView
@@ -70,4 +57,13 @@
app:menu="@menu/nav_drawer"
app:headerLayout="@layout/nav_drawer_header" />
<TextView
android:id="@+id/offline_mode_text_view"
style="@style/NoConnectionTextView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:text="@string/activity_info_offline_mode"
android:textSize="6sp"
android:visibility="gone" />
</androidx.drawerlayout.widget.DrawerLayout>

View File

@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.drawerlayout.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
<androidx.drawerlayout.widget.DrawerLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
@@ -36,17 +37,6 @@
android:paddingEnd="24dp"
app:menu="@menu/bottom_nav_menu" />
<TextView
android:id="@+id/offline_mode_text_view"
style="@style/NoConnectionTextView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:layout_gravity="top"
android:padding="2dp"
android:text="@string/activity_info_offline_mode"
android:textSize="11sp"
android:visibility="gone" />
</androidx.coordinatorlayout.widget.CoordinatorLayout>
@@ -70,4 +60,13 @@
app:menu="@menu/nav_drawer"
app:headerLayout="@layout/nav_drawer_header" />
<TextView
android:id="@+id/offline_mode_text_view"
style="@style/NoConnectionTextView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:text="@string/activity_info_offline_mode"
android:textSize="6sp"
android:visibility="gone" />
</androidx.drawerlayout.widget.DrawerLayout>

View File

@@ -30,48 +30,6 @@
android:orientation="vertical"
android:paddingBottom="@dimen/global_padding_bottom">
<LinearLayout
android:id="@+id/library_song_sector"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
tools:visibility="visible">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:paddingStart="8dp"
android:paddingTop="16dp"
android:paddingEnd="8dp"
android:paddingBottom="8dp">
<TextView
style="@style/TitleLarge"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingStart="8dp"
android:paddingEnd="8dp"
android:text="@string/library_title_song" />
<View
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_weight="1" />
<TextView
android:id="@+id/song_catalogue_text_view_clickable"
style="@style/TitleMedium"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end|center_vertical"
android:paddingStart="8dp"
android:paddingEnd="8dp"
android:text="@string/library_title_song_see_all_button" />
</LinearLayout>
</LinearLayout>
<!-- Music Folder -->
<LinearLayout
android:id="@+id/library_music_folder_sector"
@@ -397,4 +355,4 @@
</LinearLayout>
</androidx.core.widget.NestedScrollView>
</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
</androidx.coordinatorlayout.widget.CoordinatorLayout>
</androidx.coordinatorlayout.widget.CoordinatorLayout>

View File

@@ -1,5 +1,5 @@
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@drawable/ic_launcher_background_tempor_b"/>
<foreground android:drawable="@drawable/ic_launcher_foreground_tempor_b"/>
<monochrome android:drawable="@drawable/ic_launcher_monochrome_tempor_b"/>
</adaptive-icon>
<background android:drawable="@drawable/ic_launcher_background"/>
<foreground android:drawable="@drawable/ic_launcher_foreground"/>
<monochrome android:drawable="@drawable/ic_launcher_monochrome"/>
</adaptive-icon>

View File

@@ -29,7 +29,7 @@
<string name="album_page_release_dates_label">Publicació: %1$s, originalment: %2$s</string>
<string name="album_page_shuffle_button">Reprodueix aleatòriament</string>
<string name="album_page_tracks_count_and_duration">%1$d cançons • %2$d minuts</string>
<string name="app_name">Tempor</string>
<string name="app_name">Tempus</string>
<string name="artist_adapter_radio_station_starting">S\'està cercant...</string>
<string name="artist_bottom_sheet_instant_mix">Mescla instantània</string>
<string name="artist_bottom_sheet_shuffle">Reprodueix aleatòriament</string>
@@ -534,4 +534,4 @@
<string name="settings_album_detail_summary">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.</string>
<string name="settings_artist_sort_by_album_count">Ordena els artistes per nombre d\'àlbums</string>
<string name="settings_artist_sort_by_album_count_summary">Si s\'habilita, ordena els artistes per nombre d\'àlbums. Si no, s\'ordenen per nom.</string>
</resources>
</resources>

View File

@@ -28,7 +28,7 @@
<string name="album_page_release_dates_label">Veröffentlicht am %1$s, ursprünglich %2$s</string>
<string name="album_page_shuffle_button">Zufällige Wiedergabe</string>
<string name="album_page_tracks_count_and_duration">%1$d Tracks • %2$d Minuten</string>
<string name="app_name">Tempor</string>
<string name="app_name">Tempus</string>
<string name="artist_adapter_radio_station_starting">Suche…</string>
<string name="artist_bottom_sheet_instant_mix">Instant mix</string>
<string name="artist_bottom_sheet_shuffle">Mischen</string>
@@ -416,4 +416,4 @@
<string name="track_info_summary_transcoding_codec">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.</string>
<string name="track_info_summary_transcoding_bitrate">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.</string>
<string name="track_info_summary_full_transcode">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.</string>
</resources>
</resources>

View File

@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="album_page_tracks_count_and_duration">%1$d pistas • %2$d minutos</string>
<string name="app_name">Tempor</string>
<string name="app_name">Tempus</string>
<string name="aa_starred_tracks">★ Pistas</string>
<string name="activity_battery_optimizations_conclusion">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.</string>
<string name="activity_battery_optimizations_summary">Por favor, desactiva las optimizaciones de batería para continuar la reproducción multimedia mientras la pantalla está apagada.</string>
@@ -575,4 +575,4 @@
<string name="settings_enable_drawer_on_landscape">Habilitar el menú lateral en modo vertical [Experimental]</string>
<string name="settings_enable_drawer_on_landscape_summary">Desbloquea el menú lateral horizontal en modo vertical. Los cambios se aplicarán al reiniciar la app.</string>
<string name="settings_hide_bottom_navbar_on_portrait">Ocultar la barra de navegación inferior en modo vertical [Experimental]</string>
</resources>
</resources>

View File

@@ -46,7 +46,7 @@
<string name="album_page_release_dates_label">Sorti le %1$s, initialement %2$s</string>
<string name="album_page_shuffle_button">Mélanger</string>
<string name="album_page_tracks_count_and_duration">%1$d titres • %2$d minutes</string>
<string name="app_name">Tempor</string>
<string name="app_name">Tempus</string>
<string name="artist_adapter_radio_station_starting">Recherche…</string>
<string name="artist_bottom_sheet_instant_mix">Mix instantané</string>
<string name="artist_bottom_sheet_shuffle">Mélanger</string>

View File

@@ -28,7 +28,7 @@
<string name="album_page_release_dates_label">Rilasciato il %1$s, originariamente il %2$s</string>
<string name="album_page_shuffle_button">Riproduzione casuale</string>
<string name="album_page_tracks_count_and_duration">%1$d brani • %2$d minuti</string>
<string name="app_name">Tempor</string>
<string name="app_name">Tempus</string>
<string name="artist_adapter_radio_station_starting">Cercando…</string>
<string name="artist_bottom_sheet_instant_mix">Mix istantaneo</string>
<string name="artist_bottom_sheet_shuffle">Riproduzione casuale</string>

View File

@@ -27,7 +27,7 @@
<string name="album_page_release_dates_label">%1$s에 발매, %2$s에 최초 발매됨</string>
<string name="album_page_shuffle_button">셔플</string>
<string name="album_page_tracks_count_and_duration">%1$d 곡 • %2$d 분</string>
<string name="app_name">Tempor</string>
<string name="app_name">Tempus</string>
<string name="artist_adapter_radio_station_starting">탐색 중…</string>
<string name="artist_bottom_sheet_instant_mix">인스턴트 믹스</string>
<string name="artist_bottom_sheet_shuffle">셔플</string>

View File

@@ -277,57 +277,4 @@
<item>6</item>
<item>7</item>
</string-array>
<string-array name="tile_size_titles">
<item>Bardzo mały</item>
<item>Mały</item>
<item>Średni</item>
<item>Duży</item>
<item>Domyślny</item>
</string-array>
<string-array name="tile_size_divisor">
<item>6</item>
<item>5</item>
<item>4</item>
<item>3</item>
<item>2</item>
</string-array>
<string-array name="aa_tab_titles">
<item>Nie wyświetlaj</item>
<item>Strona główna</item>
<item>Ostatnie</item>
<item>Albumy</item>
<item>Wykonawcy</item>
<item>Playlisty</item>
<item>Podcasty</item>
<item>Radio</item>
<item>Foldery</item>
<item>Najczęściej odtwarzane albumy</item>
<item>Dodane albumy</item>
<item>Utwory oznaczone gwiazdką</item>
<item>Albumy oznaczone gwiazdką</item>
<item>Wykonawcy oznaczeni gwiazdką</item>
<item>Losowe</item>
</string-array>
<string-array name="aa_tab_values">
<item>-1</item>
<item>0</item>
<item>1</item>
<item>2</item>
<item>3</item>
<item>4</item>
<item>5</item>
<item>6</item>
<item>7</item>
<item>8</item>
<item>9</item>
<item>10</item>
<item>11</item>
<item>12</item>
<item>13</item>
<item>14</item>
<item>15</item>
</string-array>
</resources>

View File

@@ -1,21 +1,4 @@
<resources>
<string name="aa_albums">Albumy</string>
<string name="aa_album_most_played">Najczęściej odtwarzane albumy</string>
<string name="aa_album_recently_added">Dodane albumy</string>
<string name="aa_artists">Wykonawcy</string>
<string name="aa_home">Strona główna</string>
<string name="aa_made_for_you">Dla ciebie</string>
<string name="aa_more">Więcej</string>
<string name="aa_music_folder">Foldery</string>
<string name="aa_playlists">Playlisty</string>
<string name="aa_podcast">Podcasty</string>
<string name="aa_radio">Radio</string>
<string name="aa_random">Losowe</string>
<string name="aa_recent_albums">Ostatnie</string>
<string name="aa_song_recently_played">Odtwarzane piosenki</string>
<string name="aa_starred_albums">★ Albumy</string>
<string name="aa_starred_artists">★ Wykonawcy</string>
<string name="aa_starred_tracks">★ Utwory</string>
<string name="activity_battery_optimizations_conclusion">Jeżeli masz problemy odwiedź stronę https://dontkillmyapp.com. Podaje ona dokładne instrukcje na temat tego jak wyłączyć funkcje oszczędzania energii które mogą wpływać na wydajność aplikacji.</string>
<string name="activity_battery_optimizations_summary">Wyłącz optymalizacje baterii aby odtwarzać media przy wyłączonym ekranie.</string>
<string name="activity_battery_optimizations_title">Optymalizcje Baterii</string>
@@ -45,7 +28,7 @@
<string name="album_page_release_dates_label">Wydane %1$s, oryginalnie %2$s</string>
<string name="album_page_shuffle_button">Odtwarzaj losowo</string>
<string name="album_page_tracks_count_and_duration">%1$d utworów • %2$d minut</string>
<string name="app_name">Tempor</string>
<string name="app_name">Tempus</string>
<string name="artist_adapter_radio_station_starting">Szukanie…</string>
<string name="artist_bottom_sheet_instant_mix">Natychmiastowy mix mix</string>
<string name="artist_bottom_sheet_shuffle">Odtwórz losowo</string>
@@ -379,16 +362,6 @@
<string name="settings_podcast">Pokazuj podcasty</string>
<string name="settings_podcast_summary">Jeżeli włączone, widoczna będzie sekcja z podcastami. Zrestartuj aplikację aby, zmiany przyniosły pełny efekt.</string>
<string name="settings_playlist_sort">Sortowanie playlist</string>
<string name="settings_androidauto">Android Auto</string>
<string name="settings_androidauto_album_view">Układ siatki dla albumów</string>
<string name="settings_androidauto_home_view">Układ siatki dla strony głównej</string>
<string name="settings_androidauto_playlist_view">Układ siatki dla playlist</string>
<string name="settings_androidauto_podcast_view">Układ siatki dla podcastów</string>
<string name="settings_androidauto_radio_view">Układ siatki dla radia</string>
<string name="settings_androidauto_first_tab">Pierwsza zakładka</string>
<string name="settings_androidauto_second_tab">Druga zakładka</string>
<string name="settings_androidauto_third_tab">Trzecia zakładka</string>
<string name="settings_androidauto_fourth_tab">Czwarta zakładka</string>
<string name="settings_audio_quality">Pokaż jakość audio</string>
<string name="settings_audio_quality_summary">Bitrate i format audio będzie pokazywany dla każdego utworu.</string>
<string name="settings_song_rating">Pokaż ocenę piosenek w gwiazdkach</string>
@@ -437,7 +410,6 @@
<string name="settings_sync_starred_tracks_for_offline_use_summary">Jeżeli włączone, utwory oznaczone gwiazdką będą pobrane do użycia offline.</string>
<string name="settings_sync_starred_tracks_for_offline_use_title">Zsynchronizuj utwory oznaczone gwiazdką do użycia offline</string>
<string name="settings_theme">Motyw</string>
<string name="settings_tile_size">Rozmiar kafelków</string>
<string name="settings_title_data">Dane</string>
<string name="settings_title_general">Ogólne</string>
<string name="settings_title_playlist">Playlisty</string>

View File

@@ -25,7 +25,7 @@
<string name="album_page_extra_info_button">Sugestões semelhantes</string>
<string name="album_page_play_button">Reproduzir</string>
<string name="album_page_shuffle_button">Aleatório</string>
<string name="app_name">Tempor</string>
<string name="app_name">Tempus</string>
<string name="artist_adapter_radio_station_starting">Procurando…</string>
<string name="artist_bottom_sheet_instant_mix">Mixagem instantânea</string>
<string name="artist_bottom_sheet_shuffle">Aleatório</string>

View File

@@ -29,7 +29,7 @@
<string name="album_page_release_dates_label">Lansat pe %1$s, inițial %2$s</string>
<string name="album_page_shuffle_button">Amestecare</string>
<string name="album_page_tracks_count_and_duration">%1$d cântece • %2$d minute</string>
<string name="app_name">Tempor</string>
<string name="app_name">Tempus</string>
<string name="artist_adapter_radio_station_starting">Se caută…</string>
<string name="artist_bottom_sheet_instant_mix">Mix instant</string>
<string name="artist_bottom_sheet_shuffle">Amestecare</string>

View File

@@ -46,7 +46,7 @@
<string name="album_page_release_dates_label">Дата релиза: %1$s, оригинал %2$s</string>
<string name="album_page_shuffle_button">Перемешать</string>
<string name="album_page_tracks_count_and_duration">%1$d треков • %2$d минут(ы)</string>
<string name="app_name">Tempor</string>
<string name="app_name">Tempus</string>
<string name="artist_adapter_radio_station_starting">Поиск…</string>
<string name="artist_bottom_sheet_instant_mix">Мгновенный микс</string>
<string name="artist_bottom_sheet_shuffle">Перемешать</string>
@@ -332,22 +332,22 @@
<string name="server_unreachable_dialog_positive_button">Продолжить в любом случае</string>
<string name="server_unreachable_dialog_summary">Запрошенный сервер недоступен. Если вы продолжите, это сообщение не появится в течение следующего часа.</string>
<string name="server_unreachable_dialog_title">Сервер недоступен</string>
<string name="settings_about_summary">Tempor — это легкий музыкальный клиент с открытым исходным кодом для Subsonic, разработанный специально под Android.</string>
<string name="settings_about_summary">Tempus — это легкий музыкальный клиент с открытым исходным кодом для Subsonic, разработанный специально под Android.</string>
<string name="settings_about_title">О приложении</string>
<string name="settings_always_on_display">Always On Display</string>
<string name="settings_allow_playlist_duplicates">Разрешить дубликаты в плейлистах</string>
<string name="settings_allow_playlist_duplicates_summary">Если включено, дубликаты не будут проверяться при добавлении в плейлист.</string>
<string name="settings_audio_transcode_download_format">Формат транскодирования</string>
<string name="settings_audio_transcode_download_priority_summary">Если включено, Tempor не будет принудительно скачивать трек с настройками транскодирования, указанными ниже.</string>
<string name="settings_audio_transcode_download_priority_summary">Если включено, Tempus не будет принудительно скачивать трек с настройками транскодирования, указанными ниже.</string>
<string name="settings_audio_transcode_download_priority_title">Использовать серверные настройки транскодирования при скачивании</string>
<string name="settings_audio_transcode_download_summary">Если включено, Tempor будет скачивать треки в транскодированном виде.</string>
<string name="settings_audio_transcode_download_summary">Если включено, Tempus будет скачивать треки в транскодированном виде.</string>
<string name="settings_audio_transcode_download_title">Скачивать транскодированные треки</string>
<string name="settings_audio_transcode_estimate_content_length_summary">Если включено, на сервере будет запрошена предполагаемая продолжительность трека.</string>
<string name="settings_audio_transcode_estimate_content_length_title">Оценить длительность трека</string>
<string name="settings_audio_transcode_format_download">Формат при скачивании</string>
<string name="settings_audio_transcode_format_mobile">Формат транскод. в моб. сети 4G/5G</string>
<string name="settings_audio_transcode_format_wifi">Формат транскод. в сети Wi-Fi</string>
<string name="settings_audio_transcode_priority_summary">Если включено, Tempor не будет принудительно стримить трек с настройками транскодирования, указанными ниже.</string>
<string name="settings_audio_transcode_priority_summary">Если включено, Tempus не будет принудительно стримить трек с настройками транскодирования, указанными ниже.</string>
<string name="settings_audio_transcode_priority_title">Приоритет серверных настроек транскодирования</string>
<string name="settings_audio_transcode_priority_toast">Приоритет транскодирования передан серверу</string>
<string name="settings_buffering_strategy">Стратегия буферизации</string>
@@ -478,7 +478,7 @@
<string name="share_subtitle_item">Срок действия: %1$s</string>
<string name="share_no_expiration">Никогда</string>
<string name="share_unsupported_error">Общий доступ не поддерживается или не включен</string>
<string name="asset_link_clipboard_label">Ссылка Tempor</string>
<string name="asset_link_clipboard_label">Ссылка Tempus</string>
<string name="asset_link_label_song">UID трека</string>
<string name="asset_link_label_album">UID альбома</string>
<string name="asset_link_label_artist">UID артиста</string>
@@ -517,7 +517,6 @@
<string name="song_list_page_recently_added">Недавно добавленные треки</string>
<string name="song_list_page_recently_played">Недавно воспроизведенные треки</string>
<string name="song_list_page_starred">Избранные треки</string>
<string name="song_list_page_all">Все треки</string>
<string name="song_list_page_top">%1$s лучших треков</string>
<string name="song_list_page_year">Год %1$d</string>
<string name="song_subtitle_formatter">%1$s • %2$s %3$s</string>
@@ -565,9 +564,9 @@
<string name="undraw_thanks">Особая благодарность команде unDraw за иллюстрации, которые помогли сделать приложение красивее</string>
<string name="widget_label">Виджет Tempor</string>
<string name="widget_label">Tempus Widget</string>
<string name="widget_not_playing">Ничего не воспроизводится</string>
<string name="widget_placeholder_subtitle">Открыть Tempor</string>
<string name="widget_placeholder_subtitle">Открыть Tempus</string>
<string name="widget_time_elapsed_placeholder">0:00</string>
<string name="widget_time_duration_placeholder">0:00</string>
<string name="widget_content_desc_album_art">Обложка альбома</string>
@@ -606,9 +605,4 @@
<string name="search_sort_title">Сортировать недавние поиски по времени</string>
<string name="search_sort_summary">Если включено, поиски сортируются по времени. Если отключено - по имени.</string>
<string name="library_title_song">Треки</string>
<string name="library_title_song_see_all_button">Все треки</string>
<string name="search_all_songs_loading">Загрузка всех треков…</string>
<string name="search_all_songs">все %1$s треков</string>
<string name="search_all_songs_play">Воспроизвести %1$s</string>
</resources>

View File

@@ -28,7 +28,7 @@
<string name="album_page_release_dates_label">%1$s tarihinde yayınlandı, orijinali %2$s</string>
<string name="album_page_shuffle_button">Karıştır</string>
<string name="album_page_tracks_count_and_duration">%1$d parça • %2$d dakika</string>
<string name="app_name">Tempor</string>
<string name="app_name">Tempus</string>
<string name="artist_adapter_radio_station_starting">Aranıyor…</string>
<string name="artist_bottom_sheet_instant_mix">Anında karışım</string>
<string name="artist_bottom_sheet_shuffle">Karıştır</string>

View File

@@ -28,7 +28,7 @@
<string name="album_page_release_dates_label">發行日期:%1$s原版發行於 %2$s</string>
<string name="album_page_shuffle_button">隨機播放</string>
<string name="album_page_tracks_count_and_duration">%1$d 首歌曲 • %2$d 分鐘</string>
<string name="app_name">Tempor</string>
<string name="app_name">Tempus</string>
<string name="artist_adapter_radio_station_starting">正在搜尋...</string>
<string name="artist_bottom_sheet_instant_mix">即時混聽</string>
<string name="artist_bottom_sheet_shuffle">隨機播放</string>

View File

@@ -28,7 +28,7 @@
<string name="album_page_release_dates_label">发行日期:%1$s原版发行于 %2$s</string>
<string name="album_page_shuffle_button">随机播放</string>
<string name="album_page_tracks_count_and_duration">%1$d 首歌曲 • %2$d 分钟</string>
<string name="app_name">Tempor</string>
<string name="app_name">Tempus</string>
<string name="artist_adapter_radio_station_starting">正在搜索...</string>
<string name="artist_bottom_sheet_instant_mix">即时混听</string>
<string name="artist_bottom_sheet_shuffle">随机播放</string>

View File

@@ -47,7 +47,7 @@
<string name="album_page_release_dates_label">Released on %1$s, originally %2$s</string>
<string name="album_page_shuffle_button">Shuffle</string>
<string name="album_page_tracks_count_and_duration">%1$d songs • %2$d minutes</string>
<string name="app_name">Tempor</string>
<string name="app_name">Tempus</string>
<string name="artist_adapter_radio_station_starting">Searching…</string>
<string name="artist_bottom_sheet_instant_mix">Instant mix</string>
<string name="artist_bottom_sheet_shuffle">Shuffle</string>
@@ -333,22 +333,22 @@
<string name="server_unreachable_dialog_positive_button">Continue anyway</string>
<string name="server_unreachable_dialog_summary">The requested server is unavailable. If you choose to continue this dialog will not appear for the next hour.</string>
<string name="server_unreachable_dialog_title">Server unreachable</string>
<string name="settings_about_summary">Tempor is an open source and lightweight music client for Subsonic, designed and built natively for Android.</string>
<string name="settings_about_summary">Tempus is an open source and lightweight music client for Subsonic, designed and built natively for Android.</string>
<string name="settings_about_title">About</string>
<string name="settings_always_on_display">Always on display</string>
<string name="settings_allow_playlist_duplicates">Allow adding duplicates to playlist</string>
<string name="settings_allow_playlist_duplicates_summary">If enabled, duplicates won\'t be checked while adding to a playlist.</string>
<string name="settings_audio_transcode_download_format">Transcode format</string>
<string name="settings_audio_transcode_download_priority_summary">If enabled, Tempor will not force download the track with the transcode settings below.</string>
<string name="settings_audio_transcode_download_priority_summary">If enabled, Tempus will not force download the track with the transcode settings below.</string>
<string name="settings_audio_transcode_download_priority_title">Prioritize server settings used for streaming in downloads</string>
<string name="settings_audio_transcode_download_summary">If enabled, Tempor will download transcoded tracks.</string>
<string name="settings_audio_transcode_download_summary">If enabled, Tempus will download transcoded tracks.</string>
<string name="settings_audio_transcode_download_title">Download transcoded tracks</string>
<string name="settings_audio_transcode_estimate_content_length_summary">If enabled, the server will be asked for the estimated duration of the track.</string>
<string name="settings_audio_transcode_estimate_content_length_title">Estimate content length</string>
<string name="settings_audio_transcode_format_download">Transcode format for downloads</string>
<string name="settings_audio_transcode_format_mobile">Transcode format in mobile</string>
<string name="settings_audio_transcode_format_wifi">Transcode format in Wi-Fi</string>
<string name="settings_audio_transcode_priority_summary">If enabled, Tempor will not force stream the track with the transcode settings below.</string>
<string name="settings_audio_transcode_priority_summary">If enabled, Tempus will not force stream the track with the transcode settings below.</string>
<string name="settings_audio_transcode_priority_title">Prioritize server transcode settings</string>
<string name="settings_audio_transcode_priority_toast">Priority on transcoding of track given to server</string>
<string name="settings_buffering_strategy">Buffering strategy</string>
@@ -480,7 +480,7 @@
<string name="share_subtitle_item">Expiration date: %1$s</string>
<string name="share_no_expiration">Never</string>
<string name="share_unsupported_error">Sharing is not supported or not enabled</string>
<string name="asset_link_clipboard_label">Tempor asset link</string>
<string name="asset_link_clipboard_label">Tempus asset link</string>
<string name="asset_link_label_song">Song UID</string>
<string name="asset_link_label_album">Album UID</string>
<string name="asset_link_label_artist">Artist UID</string>
@@ -519,7 +519,6 @@
<string name="song_list_page_recently_added">Recently added tracks</string>
<string name="song_list_page_recently_played">Recently played tracks</string>
<string name="song_list_page_starred">Starred tracks</string>
<string name="song_list_page_all">All songs</string>
<string name="song_list_page_top">%1$s\'s top tracks</string>
<string name="song_list_page_year">Year %1$d</string>
<string name="song_subtitle_formatter">%1$s • %2$s %3$s</string>
@@ -567,9 +566,9 @@
<string name="undraw_page">unDraw</string>
<string name="undraw_thanks">A special thanks goes to unDraw without whose illustrations we could not have made this application more beautiful.</string>
<string name="undraw_url" translatable="false">https://undraw.co/</string>
<string name="widget_label">Tempor Widget</string>
<string name="widget_label">Tempus Widget</string>
<string name="widget_not_playing">Not playing</string>
<string name="widget_placeholder_subtitle">Open Tempor</string>
<string name="widget_placeholder_subtitle">Open Tempus</string>
<string name="widget_time_elapsed_placeholder">0:00</string>
<string name="widget_time_duration_placeholder">0:00</string>
<string name="widget_content_desc_album_art">Album artwork</string>
@@ -608,9 +607,7 @@
<string name="search_sort_title">Sort recent searches chronologically</string>
<string name="search_sort_summary">If enabled, sort searches chronologically. Sort by name if disabled.</string>
<string name="library_title_song">Songs</string>
<string name="library_title_song_see_all_button">All songs</string>
<string name="search_all_songs_loading">Loading all songs…</string>
<string name="search_all_songs_loading">Getting all songs ...</string>
<string name="search_all_songs">all %1$s songs</string>
<string name="search_all_songs_play">Play %1$s</string>
</resources>

View File

@@ -1,10 +0,0 @@
* chore(i18n): Improve Russian translation
* feat: tile size manager
* chore(i18n): Translated to zh_TW
* fix: Show full album name when displaying details
* chore(i18n): Update Spanish translation
* fix: Relocate "Offline mode" text
* chore(i18n): Update Polish translation
* refactor: navigation and bottom sheet
* feat: new Logo icon/adaptive icon update/refresh
* feat: Added all-songs feature

Binary file not shown.

Before

Width:  |  Height:  |  Size: 157 KiB

After

Width:  |  Height:  |  Size: 137 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 160 KiB

After

Width:  |  Height:  |  Size: 142 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 111 KiB

After

Width:  |  Height:  |  Size: 138 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 98 KiB

After

Width:  |  Height:  |  Size: 138 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 49 KiB

After

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 49 KiB

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 327 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 195 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 196 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 156 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 157 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 67 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 69 KiB