Compare commits
43 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0fb6e55b12 | ||
|
|
dd7aa2291b | ||
|
|
ec33c32c89 | ||
|
|
e0ad4e3701 | ||
|
|
253f8033c5 | ||
|
|
c1aed1a4c1 | ||
|
|
23f58439ba | ||
|
|
4c99ced597 | ||
|
|
8d215a7f1c | ||
|
|
38fc4a0936 | ||
|
|
d9949349da | ||
|
|
877d29d285 | ||
|
|
9a17aa8b98 | ||
|
|
fd41395ab8 | ||
|
|
269066e036 | ||
|
|
488460ea9d | ||
|
|
d16a9c234f | ||
|
|
07b507691c | ||
|
|
bde34d3df0 | ||
|
|
e5b7756f96 | ||
|
|
04e692e5e9 | ||
|
|
a23a663d32 | ||
|
|
023bd8071a | ||
|
|
72b1517f61 | ||
|
|
e62ea72c2f | ||
|
|
a24ccf2556 | ||
|
|
49838e2e0f | ||
|
|
8ed1248ee1 | ||
|
|
e9d54957ae | ||
|
|
3cd5843c4b | ||
|
|
75513d3bd4 | ||
|
|
c0c84269ef | ||
|
|
fa2e029f9f | ||
|
|
f1bfb095b7 | ||
|
|
4328415efc | ||
|
|
092ae14ea2 | ||
|
|
26af8a692f | ||
|
|
b870f4c866 | ||
|
|
cf4e78eafc | ||
|
|
83e23c44d9 | ||
|
|
c0959c7ca4 | ||
|
|
e77f3bf9b3 | ||
|
|
55265615e6 |
48
CHANGELOG.md
48
CHANGELOG.md
@@ -1,5 +1,49 @@
|
||||
# Changelog
|
||||
|
||||
## Pending release
|
||||
|
||||
## What's Changed
|
||||
## [4.9.5](https://github.com/eddyizm/tempo/releases/tag/v4.9.5) (2026-01-26)
|
||||
* fix: Avoid crash when server has no songs by @jaime-grj in https://github.com/eddyizm/tempus/pull/389
|
||||
* fix: updated dialog import to address crashing on android 15 by @eddyizm in https://github.com/eddyizm/tempus/pull/392
|
||||
|
||||
**Full Changelog**: https://github.com/eddyizm/tempus/compare/v4.9.3...v4.9.5
|
||||
|
||||
## What's Changed
|
||||
## [4.9.3](https://github.com/eddyizm/tempo/releases/tag/v4.9.3) (2026-01-25)
|
||||
* fix: Proper raw stream detection by @jaime-grj in https://github.com/eddyizm/tempus/pull/382
|
||||
* chore(i18n): Update Spanish translation by @jaime-grj in https://github.com/eddyizm/tempus/pull/381
|
||||
* feat: add configurable timeout by @eddyizm in https://github.com/eddyizm/tempus/pull/386
|
||||
|
||||
**Full Changelog**: https://github.com/eddyizm/tempus/compare/v4.9.1...v4.9.3
|
||||
|
||||
## What's Changed
|
||||
## [4.9.1](https://github.com/eddyizm/tempo/releases/tag/v4.9.1) (2026-01-24)
|
||||
* chore: i18n: Add Romanian translation (including locale_config this time!) by @DevMatei in https://github.com/eddyizm/tempus/pull/357
|
||||
* French localization update by @benoit-smith in https://github.com/eddyizm/tempus/pull/356
|
||||
* chore(i18n): Update Spanish translation by @jaime-grj in https://github.com/eddyizm/tempus/pull/364
|
||||
* docs: updated readme and added known issues for airsonic work around by @eddyizm in https://github.com/eddyizm/tempus/pull/366
|
||||
* fix: toast for made for you click indication by @eddyizm in https://github.com/eddyizm/tempus/pull/365
|
||||
* fix: sort playlist view by @eddyizm in https://github.com/eddyizm/tempus/pull/368
|
||||
* feat: sort preference for playlists by @eddyizm in https://github.com/eddyizm/tempus/pull/370
|
||||
* fix: use existing future when adding tracks, dialed random album tracks off in instant mix by @eddyizm in https://github.com/eddyizm/tempus/pull/373
|
||||
* chore(i18n): Update Polish translation by @skajmer in https://github.com/eddyizm/tempus/pull/374
|
||||
* fix: Check for OpenSubsonic extensions also with password authentication by @pgrit in https://github.com/eddyizm/tempus/pull/375
|
||||
* feat: Implement duration and seeking for transcodes by @drakeerv in https://github.com/eddyizm/tempus/pull/358
|
||||
* feat: Playback speed controls for music by @pgrit in https://github.com/eddyizm/tempus/pull/376
|
||||
|
||||
## New Contributors
|
||||
* @pgrit made their first contribution in https://github.com/eddyizm/tempus/pull/375
|
||||
|
||||
**Full Changelog**: https://github.com/eddyizm/tempus/compare/v4.6.4...v4.9.1
|
||||
|
||||
## What's Changed
|
||||
## [4.6.4](https://github.com/eddyizm/tempo/releases/tag/v4.6.4) (2026-01-13)
|
||||
* fix: instant mix random songs and broken continuous play by @eddyizm in https://github.com/eddyizm/tempus/pull/354
|
||||
|
||||
**Full Changelog**: https://github.com/eddyizm/tempus/compare/v4.6.3...v4.6.4
|
||||
|
||||
## What's Changed
|
||||
## [4.6.3](https://github.com/eddyizm/tempo/releases/tag/v4.6.3) (2026-01-10)
|
||||
* fix: give user feedback when trying to add podcast/radio on unsupport… by @eddyizm in https://github.com/eddyizm/tempus/pull/328
|
||||
* docs: Clarify Android Auto enablement by @Forage in https://github.com/eddyizm/tempus/pull/336
|
||||
@@ -8,7 +52,10 @@
|
||||
* chore(i18n): Update Polish translation by @skajmer in https://github.com/eddyizm/tempus/pull/339
|
||||
* feat: Ability to toggle visibility of artist biography by @kmarius in https://github.com/eddyizm/tempus/pull/338
|
||||
|
||||
**Full Changelog**: https://github.com/eddyizm/tempus/compare/v4.6.0...v4.6.3
|
||||
|
||||
## [4.6.0](https://github.com/eddyizm/tempo/releases/tag/v4.6.0) (2025-12-22)
|
||||
## What's Changed
|
||||
* chore: Update description_empty_title in English and Polish by @tyren234 in https://github.com/eddyizm/tempus/pull/307
|
||||
* chore(i18n): Update Polish translation by @skajmer in https://github.com/eddyizm/tempus/pull/310
|
||||
* fix: checks preference and writes files externally, updates the ui by @eddyizm in https://github.com/eddyizm/tempus/pull/312
|
||||
@@ -20,6 +67,7 @@
|
||||
* @tyren234 made their first contribution in https://github.com/eddyizm/tempus/pull/307
|
||||
* @pochopsp made their first contribution in https://github.com/eddyizm/tempus/pull/314
|
||||
|
||||
**Full Changelog**: https://github.com/eddyizm/tempus/compare/v4.5.0...v4.6.0
|
||||
|
||||
## [4.5.0](https://github.com/eddyizm/tempo/releases/tag/v4.5.0) (2025-12-12)
|
||||
## What's Changed
|
||||
|
||||
25
README.md
25
README.md
@@ -10,15 +10,21 @@
|
||||
|
||||
<div align="center">
|
||||
|
||||
<a href="https://github.com/eddyizm/tempus/releases/">
|
||||
<img alt="Releases" src="https://img.shields.io/github/downloads/eddyizm/tempus/total.svg?color=4B95DE&style=flat">
|
||||
</a>
|
||||
<!-- Reproducible build -->
|
||||
<a href="https://shields.rbtlog.dev/com.eddyizm.degoogled.tempus"><img src="https://shields.rbtlog.dev/simple/com.eddyizm.degoogled.tempus" alt="RB Status"></a>
|
||||
|
||||
<a href="https://www.gnu.org/licenses/gpl-3.0">
|
||||
<img src="https://img.shields.io/badge/license-GPL%20v3-2B6DBE.svg?style=flat">
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<p align="center">
|
||||
<a href="https://github.com/eddyizm/tempus/releases"><img src="https://i.ibb.co/q0mdc4Z/get-it-on-github.png" width="200"></a>
|
||||
<a href="https://apt.izzysoft.de/fdroid/index/apk/com.eddyizm.degoogled.tempus"><img src="https://gitlab.com/IzzyOnDroid/repo/-/raw/master/assets/IzzyOnDroid.png" width="200"></a>
|
||||
<a href="https://apps.obtainium.imranr.dev/redirect?r=obtainium://app/%7B%22id%22%3A%22com.eddyizm.tempus%22%2C%22url%22%3A%22https%3A%2F%2Fgithub.com%2Feddyizm%2Ftempus%22%2C%22author%22%3A%22eddyizm%22%2C%22name%22%3A%22Tempus%22%2C%22preferredApkIndex%22%3A0%2C%22additionalSettings%22%3A%22%7B%5C%22includePrereleases%5C%22%3Afalse%2C%5C%22fallbackToOlderReleases%5C%22%3Atrue%2C%5C%22filterReleaseTitlesByRegEx%5C%22%3A%5C%22%5C%22%2C%5C%22filterReleaseNotesByRegEx%5C%22%3A%5C%22%5C%22%2C%5C%22verifyLatestTag%5C%22%3Afalse%2C%5C%22sortMethodChoice%5C%22%3A%5C%22date%5C%22%2C%5C%22useLatestAssetDateAsReleaseDate%5C%22%3Afalse%2C%5C%22releaseTitleAsVersion%5C%22%3Afalse%2C%5C%22trackOnly%5C%22%3Afalse%2C%5C%22versionExtractionRegEx%5C%22%3A%5C%22%5C%22%2C%5C%22matchGroupToUse%5C%22%3A%5C%22%5C%22%2C%5C%22versionDetection%5C%22%3Atrue%2C%5C%22releaseDateAsVersion%5C%22%3Afalse%2C%5C%22useVersionCodeAsOSVersion%5C%22%3Afalse%2C%5C%22apkFilterRegEx%5C%22%3A%5C%22tempus%5C%22%2C%5C%22invertAPKFilter%5C%22%3Afalse%2C%5C%22autoApkFilterByArch%5C%22%3Atrue%2C%5C%22appName%5C%22%3A%5C%22%5C%22%2C%5C%22appAuthor%5C%22%3A%5C%22%5C%22%2C%5C%22shizukuPretendToBeGooglePlay%5C%22%3Afalse%2C%5C%22allowInsecure%5C%22%3Afalse%2C%5C%22exemptFromBackgroundUpdates%5C%22%3Afalse%2C%5C%22skipUpdateNotifications%5C%22%3Afalse%2C%5C%22about%5C%22%3A%5C%22%5C%22%2C%5C%22refreshBeforeDownload%5C%22%3Afalse%2C%5C%22includeZips%5C%22%3Afalse%2C%5C%22zippedApkFilterRegEx%5C%22%3A%5C%22%5C%22%7D%22%2C%22overrideSource%22%3A%22GitHub%22%7D"><img width="200" src="https://github.com/user-attachments/assets/119e7ff4-2636-43cb-ab7f-1b6a58ac3570" /></a>
|
||||
<a href="https://www.openapk.net/tempus/com.eddyizm.degoogled.tempus/"><img src="https://camo.githubusercontent.com/cd56895b28a73ebd781a65b4f567add5419e45797a5cf1485ce408e851c2318e/68747470733a2f2f7777772e6f70656e61706b2e6e65742f696d616765732f6f70656e61706b2d62616467652e706e67" width="200"></a>
|
||||
</p>
|
||||
<!--
|
||||
<a href="https://f-droid.org/packages/com.cappielloantonio.notquitemy.tempo"><img src="https://fdroid.gitlab.io/artwork/badge/get-it-on.png" width="200"></a>
|
||||
@@ -31,6 +37,10 @@ Tempus does not rely on magic algorithms to decide what you should listen to. In
|
||||
|
||||
The project is a fork of [Tempo](#credits).
|
||||
|
||||
[Changelog](CHANGELOG.md)
|
||||
[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.**
|
||||
|
||||
**Use the Github version of the app for full Android Auto and Chromecast support.**
|
||||
@@ -46,11 +56,6 @@ Please note the two variants in the release assets include release/debug and 32/
|
||||
|
||||
`app-degoogled*` <- The izzyOnDroid release that goes without any of the google stuff. It is now available on izzyOnDroid (64bit) I am releasing the both 32/64bit apk's here on github for those who need a 32bit version.
|
||||
|
||||
[CHANGELOG.md](CHANGELOG.md)
|
||||
|
||||
## Usage
|
||||
|
||||
[Documentation](USAGE.md) (work in progress)
|
||||
|
||||
## Features
|
||||
- **Subsonic Integration**: Tempus seamlessly integrates with your Subsonic server, providing you with easy access to your entire music collection on the go.
|
||||
@@ -62,7 +67,7 @@ Please note the two variants in the release assets include release/debug and 32/
|
||||
- **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.
|
||||
- **Instant Mix**: Full refactor of instant mix function which leverages subsonics similar songs by artist/album and randomSongs endpoints to server a larger play queue more reliably.
|
||||
- **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.
|
||||
@@ -115,7 +120,10 @@ Currently there are no tests but I would love to start on some unit tests.
|
||||
|
||||
Not a hard requirement but any new feature/change should ideally include an update to the nacent documention.
|
||||
|
||||
## Support
|
||||
*Special Thanks*
|
||||
All the amazing [contributors](https://github.com/eddyizm/tempus/graphs/contributors)❤️
|
||||
|
||||
## Donate
|
||||
|
||||
[**Buy me a coffee**](https://ko-fi.com/eddyizm)
|
||||
bitcoin: `3QVHSSCJvn6yXEcJ3A3cxYLMmbvFsrnUs5`
|
||||
@@ -124,6 +132,7 @@ bitcoin: `3QVHSSCJvn6yXEcJ3A3cxYLMmbvFsrnUs5`
|
||||
|
||||
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
|
||||
Thanks to the original repo/creator [CappielloAntonio](https://github.com/CappielloAntonio) (forked from v3.9.0)
|
||||
|
||||
|
||||
14
USAGE.md
14
USAGE.md
@@ -6,14 +6,13 @@
|
||||
- [Getting Started](#getting-started)
|
||||
- [Server Configuration](#server-configuration)
|
||||
- [Main Features](#main-features)
|
||||
|
||||
- [Navigation](#navigation)
|
||||
- [Playback Controls](#playback-controls)
|
||||
- [Favorites](#favorites)
|
||||
- [Playlist Management](#playlist-management)
|
||||
- [Android Auto](#android-auto)
|
||||
- [Settings](#settings)
|
||||
- [Troubleshooting](#troubleshooting)
|
||||
- [Known Issues](#known-issues)
|
||||
|
||||
## Prerequisites
|
||||
|
||||
@@ -193,15 +192,12 @@ To allow the Tempus app on your car's head unit, "Unknown sources" needs to be e
|
||||
### Appearance
|
||||
**TODO**
|
||||
|
||||
## Troubleshooting
|
||||
## Known Issues
|
||||
|
||||
### Connection Issues
|
||||
### Airsonic Distorted Playback
|
||||
|
||||
**TODO**
|
||||
|
||||
### Common Issues
|
||||
|
||||
**TODO**
|
||||
First reported in issue [#226](https://github.com/eddyizm/tempus/issues/226)
|
||||
The work around is to disable the cache in the settings, (set to 0), and if needed, cleaning the (Android) cache fixes the problem.
|
||||
|
||||
### Support
|
||||
For additional help:
|
||||
|
||||
@@ -10,8 +10,8 @@ android {
|
||||
minSdkVersion 24
|
||||
targetSdk 35
|
||||
|
||||
versionCode 12
|
||||
versionName '4.6.3'
|
||||
versionCode 16
|
||||
versionName '4.9.5'
|
||||
testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner'
|
||||
|
||||
javaCompileOptions {
|
||||
|
||||
@@ -25,6 +25,7 @@ import retrofit2.Response;
|
||||
public class SongRepository {
|
||||
|
||||
private static final String TAG = "SongRepository";
|
||||
|
||||
public interface MediaCallbackInternal {
|
||||
void onSongsAvailable(List<Child> songs);
|
||||
}
|
||||
@@ -64,18 +65,25 @@ public class SongRepository {
|
||||
*/
|
||||
public MutableLiveData<List<Child>> getInstantMix(String id, SeedType type, int count) {
|
||||
MutableLiveData<List<Child>> instantMix = new MutableLiveData<>(new ArrayList<>());
|
||||
Set<String> trackIds = new HashSet<>();
|
||||
|
||||
performSmartMix(id, type, count, songs -> {
|
||||
List<Child> current = instantMix.getValue();
|
||||
if (current != null) {
|
||||
for (Child s : songs) {
|
||||
if (!current.contains(s)) current.add(s);
|
||||
if (!trackIds.contains(s.getId())) {
|
||||
current.add(s);
|
||||
trackIds.add(s.getId());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (current.size() < count / 2) {
|
||||
fillWithRandom(count - current.size(), remainder -> {
|
||||
fetchSimilarOnly(id, count, remainder -> {
|
||||
for (Child r : remainder) {
|
||||
if (!current.contains(r)) current.add(r);
|
||||
if (!trackIds.contains(r.getId())) {
|
||||
current.add(r);
|
||||
trackIds.add(r.getId());
|
||||
}
|
||||
}
|
||||
instantMix.postValue(current);
|
||||
});
|
||||
@@ -130,6 +138,7 @@ public class SongRepository {
|
||||
isComplete = true;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private void performSmartMix(final String id, final SeedType type, final int count, final MediaCallbackInternal callback) {
|
||||
@@ -138,7 +147,7 @@ public class SongRepository {
|
||||
fetchSimilarByArtist(id, count, callback);
|
||||
break;
|
||||
case ALBUM:
|
||||
fetchAlbumSongsThenSimilar(id, count, callback);
|
||||
fetchAlbumSongs(id, count, callback);
|
||||
break;
|
||||
case TRACK:
|
||||
fetchSingleTrackThenSimilar(id, count, callback);
|
||||
@@ -146,7 +155,7 @@ public class SongRepository {
|
||||
}
|
||||
}
|
||||
|
||||
private void fetchAlbumSongsThenSimilar(String albumId, int count, MediaCallbackInternal callback) {
|
||||
private void fetchAlbumSongs(String albumId, int count, MediaCallbackInternal callback) {
|
||||
App.getSubsonicClientInstance(false).getBrowsingClient().getAlbum(albumId).enqueue(new Callback<ApiResponse>() {
|
||||
@Override
|
||||
public void onResponse(@NonNull Call<ApiResponse> call, @NonNull Response<ApiResponse> response) {
|
||||
@@ -157,25 +166,14 @@ public class SongRepository {
|
||||
int fromAlbum = Math.min(count, albumSongs.size());
|
||||
List<Child> limitedAlbumSongs = albumSongs.subList(0, fromAlbum);
|
||||
callback.onSongsAvailable(new ArrayList<>(limitedAlbumSongs));
|
||||
|
||||
int remaining = count - fromAlbum;
|
||||
if (remaining > 0 && albumSongs.get(0).getArtistId() != null) {
|
||||
fetchSimilarByArtist(albumSongs.get(0).getArtistId(), remaining, callback);
|
||||
} else if (remaining > 0) {
|
||||
Log.d(TAG, "No artistId available, skipping similar artist fetch");
|
||||
}
|
||||
return;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
Log.d(TAG, "Album fetch failed or empty, calling fillWithRandom");
|
||||
fillWithRandom(count, callback);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@Override
|
||||
public void onFailure(@NonNull Call<ApiResponse> call, @NonNull Throwable t) {
|
||||
Log.d(TAG, "Album fetch failed: " + t.getMessage());
|
||||
fillWithRandom(count, callback);
|
||||
Log.e(TAG, "fetchAlbumSongsThenSimilar.onFailure()", t);
|
||||
}
|
||||
});
|
||||
}
|
||||
@@ -188,17 +186,17 @@ public class SongRepository {
|
||||
@Override
|
||||
public void onResponse(@NonNull Call<ApiResponse> call, @NonNull Response<ApiResponse> response) {
|
||||
List<Child> similar = extractSongs(response, "similarSongs2");
|
||||
Log.d(TAG, "fetchSimilarByArtist.onResponse() - similar songs: " + similar.size());
|
||||
|
||||
if (!similar.isEmpty()) {
|
||||
List<Child> limitedSimilar = similar.subList(0, Math.min(count, similar.size()));
|
||||
callback.onSongsAvailable(limitedSimilar);
|
||||
} else {
|
||||
fillWithRandom(count, callback);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@Override
|
||||
public void onFailure(@NonNull Call<ApiResponse> call, @NonNull Throwable t) {
|
||||
fillWithRandom(count, callback);
|
||||
Log.e(TAG, "fetchSimilarByArtist.onFailure()", t);
|
||||
}
|
||||
});
|
||||
}
|
||||
@@ -211,17 +209,13 @@ public class SongRepository {
|
||||
Child song = response.body().getSubsonicResponse().getSong();
|
||||
if (song != null) {
|
||||
callback.onSongsAvailable(Collections.singletonList(song));
|
||||
int remaining = count - 1;
|
||||
if (remaining > 0) {
|
||||
fetchSimilarOnly(trackId, remaining, callback);
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
fillWithRandom(count, callback);
|
||||
}
|
||||
@Override public void onFailure(@NonNull Call<ApiResponse> call, @NonNull Throwable t) {
|
||||
fillWithRandom(count, callback);
|
||||
|
||||
@Override
|
||||
public void onFailure(@NonNull Call<ApiResponse> call, @NonNull Throwable t) {
|
||||
Log.e(TAG, "fetchSingleTrackThenSimilar.onFailure()", t);
|
||||
}
|
||||
});
|
||||
}
|
||||
@@ -232,38 +226,40 @@ public class SongRepository {
|
||||
public void onResponse(@NonNull Call<ApiResponse> call, @NonNull Response<ApiResponse> response) {
|
||||
List<Child> songs = extractSongs(response, "similarSongs");
|
||||
if (!songs.isEmpty()) {
|
||||
List<Child> limitedSongs = songs.subList(0, Math.min(count, songs.size()));
|
||||
callback.onSongsAvailable(limitedSongs);
|
||||
} else {
|
||||
fillWithRandom(count, callback);
|
||||
int limit = Math.min(count, songs.size());
|
||||
callback.onSongsAvailable(songs.subList(0, limit));
|
||||
}
|
||||
}
|
||||
@Override public void onFailure(@NonNull Call<ApiResponse> call, @NonNull Throwable t) {
|
||||
fillWithRandom(count, callback);
|
||||
|
||||
@Override
|
||||
public void onFailure(@NonNull Call<ApiResponse> call, @NonNull Throwable t) {
|
||||
Log.e(TAG, "fetchSimilarOnly.onFailure()", t);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
private void fillWithRandom(int target, final MediaCallbackInternal callback) {
|
||||
public MutableLiveData<List<Child>> getContinuousMix(String id, int count) {
|
||||
MutableLiveData<List<Child>> instantMix = new MutableLiveData<>();
|
||||
|
||||
App.getSubsonicClientInstance(false)
|
||||
.getAlbumSongListClient()
|
||||
.getRandomSongs(target, null, null)
|
||||
.getBrowsingClient()
|
||||
.getSimilarSongs(id, count)
|
||||
.enqueue(new Callback<ApiResponse>() {
|
||||
@Override
|
||||
public void onResponse(@NonNull Call<ApiResponse> call, @NonNull Response<ApiResponse> response) {
|
||||
List<Child> random = extractSongs(response, "randomSongs");
|
||||
if (!random.isEmpty()) {
|
||||
List<Child> limitedRandom = random.subList(0, Math.min(target, random.size()));
|
||||
callback.onSongsAvailable(limitedRandom);
|
||||
} else {
|
||||
callback.onSongsAvailable(new ArrayList<>());
|
||||
if (response.isSuccessful() && response.body() != null && response.body().getSubsonicResponse().getSimilarSongs() != null) {
|
||||
instantMix.setValue(response.body().getSubsonicResponse().getSimilarSongs().getSongs());
|
||||
}
|
||||
}
|
||||
@Override public void onFailure(@NonNull Call<ApiResponse> call, @NonNull Throwable t) {
|
||||
callback.onSongsAvailable(new ArrayList<>());
|
||||
|
||||
@Override
|
||||
public void onFailure(@NonNull Call<ApiResponse> call, @NonNull Throwable t) {
|
||||
instantMix.setValue(null);
|
||||
}
|
||||
});
|
||||
|
||||
return instantMix;
|
||||
}
|
||||
|
||||
private List<Child> extractSongs(Response<ApiResponse> response, String type) {
|
||||
@@ -274,11 +270,10 @@ public class SongRepository {
|
||||
list = res.getSimilarSongs().getSongs();
|
||||
} else if (type.equals("similarSongs2") && res.getSimilarSongs2() != null) {
|
||||
list = res.getSimilarSongs2().getSongs();
|
||||
} else if (type.equals("randomSongs") && res.getRandomSongs() != null) {
|
||||
list = res.getRandomSongs().getSongs();
|
||||
}
|
||||
return (list != null) ? list : new ArrayList<>();
|
||||
}
|
||||
|
||||
return new ArrayList<>();
|
||||
}
|
||||
|
||||
@@ -288,7 +283,10 @@ public class SongRepository {
|
||||
@Override public void onResponse(@NonNull Call<ApiResponse> call, @NonNull Response<ApiResponse> response) {
|
||||
List<Child> songs = new ArrayList<>();
|
||||
if (response.isSuccessful() && response.body() != null && response.body().getSubsonicResponse().getRandomSongs() != null) {
|
||||
songs.addAll(Objects.requireNonNull(response.body().getSubsonicResponse().getRandomSongs().getSongs()));
|
||||
List<Child> returned = response.body().getSubsonicResponse().getRandomSongs().getSongs();
|
||||
if (returned != null) {
|
||||
songs.addAll(returned);
|
||||
}
|
||||
}
|
||||
randomSongsSample.setValue(songs);
|
||||
}
|
||||
@@ -299,11 +297,15 @@ public class SongRepository {
|
||||
|
||||
public MutableLiveData<List<Child>> getRandomSampleWithGenre(int number, Integer fromYear, Integer toYear, String genre) {
|
||||
MutableLiveData<List<Child>> randomSongsSample = new MutableLiveData<>();
|
||||
|
||||
App.getSubsonicClientInstance(false).getAlbumSongListClient().getRandomSongs(number, fromYear, toYear, genre).enqueue(new Callback<ApiResponse>() {
|
||||
@Override public void onResponse(@NonNull Call<ApiResponse> call, @NonNull Response<ApiResponse> response) {
|
||||
List<Child> songs = new ArrayList<>();
|
||||
if (response.isSuccessful() && response.body() != null && response.body().getSubsonicResponse().getRandomSongs() != null) {
|
||||
songs.addAll(Objects.requireNonNull(response.body().getSubsonicResponse().getRandomSongs().getSongs()));
|
||||
List<Child> returned = response.body().getSubsonicResponse().getRandomSongs().getSongs();
|
||||
if (returned != null) {
|
||||
songs.addAll(returned);
|
||||
}
|
||||
}
|
||||
randomSongsSample.setValue(songs);
|
||||
}
|
||||
@@ -346,7 +348,10 @@ public class SongRepository {
|
||||
@Override public void onResponse(@NonNull Call<ApiResponse> call, @NonNull Response<ApiResponse> response) {
|
||||
List<Child> songs = new ArrayList<>();
|
||||
if (response.isSuccessful() && response.body() != null && response.body().getSubsonicResponse().getSongsByGenre() != null) {
|
||||
songs.addAll(Objects.requireNonNull(response.body().getSubsonicResponse().getSongsByGenre().getSongs()));
|
||||
List<Child> returned = response.body().getSubsonicResponse().getSongsByGenre().getSongs();
|
||||
if (returned != null) {
|
||||
songs.addAll(returned);
|
||||
}
|
||||
}
|
||||
songsByGenre.setValue(songs);
|
||||
}
|
||||
|
||||
@@ -4,6 +4,7 @@ import android.annotation.SuppressLint
|
||||
import android.app.PendingIntent.FLAG_IMMUTABLE
|
||||
import android.app.PendingIntent.FLAG_UPDATE_CURRENT
|
||||
import android.app.TaskStackBuilder
|
||||
import android.content.ComponentName
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.net.ConnectivityManager
|
||||
@@ -138,8 +139,13 @@ open class BaseMediaService : MediaLibraryService() {
|
||||
if (item.mediaMetadata.extras != null)
|
||||
MediaManager.scrobble(item, false)
|
||||
|
||||
if (player.nextMediaItemIndex == C.INDEX_UNSET)
|
||||
MediaManager.continuousPlay(player.currentMediaItem)
|
||||
if (player.nextMediaItemIndex == C.INDEX_UNSET) {
|
||||
val browserFuture = MediaBrowser.Builder(
|
||||
this@BaseMediaService,
|
||||
SessionToken(this@BaseMediaService, ComponentName(this@BaseMediaService, this@BaseMediaService::class.java))
|
||||
).buildAsync()
|
||||
MediaManager.continuousPlay(player.currentMediaItem, browserFuture)
|
||||
}
|
||||
}
|
||||
|
||||
if (player is ExoPlayer) {
|
||||
|
||||
@@ -444,24 +444,20 @@ public class MediaManager {
|
||||
}
|
||||
|
||||
@OptIn(markerClass = UnstableApi.class)
|
||||
public static void continuousPlay(MediaItem mediaItem) {
|
||||
public static void continuousPlay(MediaItem mediaItem, ListenableFuture<MediaBrowser> existingBrowserFuture) {
|
||||
if (mediaItem != null && Preferences.isContinuousPlayEnabled() && Preferences.isInstantMixUsable()) {
|
||||
Preferences.setLastInstantMix();
|
||||
|
||||
LiveData<List<Child>> instantMix = getSongRepository().getInstantMix(mediaItem.mediaId, SeedType.TRACK, 10);
|
||||
LiveData<List<Child>> instantMix = getSongRepository().getContinuousMix(mediaItem.mediaId, 25);
|
||||
|
||||
instantMix.observeForever(new Observer<List<Child>>() {
|
||||
@Override
|
||||
public void onChanged(List<Child> media) {
|
||||
if (media != null) {
|
||||
Log.e(TAG, "continuous play");
|
||||
ListenableFuture<MediaBrowser> mediaBrowserListenableFuture = new MediaBrowser.Builder(
|
||||
App.getContext(),
|
||||
new SessionToken(App.getContext(), new ComponentName(App.getContext(), MediaService.class))
|
||||
).buildAsync();
|
||||
|
||||
enqueue(mediaBrowserListenableFuture, media, true);
|
||||
if (media != null && existingBrowserFuture != null) {
|
||||
Log.d(TAG, "Continuous play: adding " + media.size() + " tracks");
|
||||
enqueue(existingBrowserFuture, media, false);
|
||||
}
|
||||
|
||||
|
||||
instantMix.removeObserver(this);
|
||||
}
|
||||
});
|
||||
|
||||
@@ -24,13 +24,15 @@ public class SystemClient {
|
||||
|
||||
public Call<ApiResponse> ping() {
|
||||
Log.d(TAG, "ping()");
|
||||
int timeoutSeconds = Preferences.getNetworkPingTimeout();
|
||||
Call<ApiResponse> pingCall = systemService.ping(subsonic.getParams());
|
||||
if (Preferences.isInUseServerAddressLocal()) {
|
||||
pingCall.timeout()
|
||||
.timeout(1, TimeUnit.SECONDS);
|
||||
.timeout(timeoutSeconds, TimeUnit.SECONDS);
|
||||
} else {
|
||||
int finalTimeout = Math.min(timeoutSeconds * 2, 10);
|
||||
pingCall.timeout()
|
||||
.timeout(3, TimeUnit.SECONDS);
|
||||
.timeout(finalTimeout, TimeUnit.SECONDS);
|
||||
}
|
||||
return pingCall;
|
||||
}
|
||||
|
||||
@@ -354,7 +354,7 @@ public class MainActivity extends BaseActivity {
|
||||
|
||||
// TODO Enter all settings to be reset
|
||||
Preferences.setOpenSubsonic(false);
|
||||
Preferences.setPlaybackSpeed(Constants.MEDIA_PLAYBACK_SPEED_100);
|
||||
Preferences.setPlaybackSpeed(1.0f);
|
||||
Preferences.setSkipSilenceMode(false);
|
||||
Preferences.setDataSavingMode(false);
|
||||
Preferences.setStarredSyncEnabled(false);
|
||||
@@ -384,7 +384,7 @@ public class MainActivity extends BaseActivity {
|
||||
}
|
||||
|
||||
private void pingServer() {
|
||||
if (Preferences.getToken() == null) return;
|
||||
if (Preferences.getToken() == null && Preferences.getPassword() == null) return;
|
||||
|
||||
if (Preferences.isInUseServerAddressLocal()) {
|
||||
mainViewModel.ping().observe(this, subsonicResponse -> {
|
||||
@@ -428,7 +428,7 @@ public class MainActivity extends BaseActivity {
|
||||
}
|
||||
|
||||
private void getOpenSubsonicExtensions() {
|
||||
if (Preferences.getToken() != null) {
|
||||
if (Preferences.getToken() != null || Preferences.getPassword() != null) {
|
||||
mainViewModel.getOpenSubsonicExtensions().observe(this, openSubsonicExtensions -> {
|
||||
if (openSubsonicExtensions != null) {
|
||||
Preferences.setOpenSubsonicExtensions(openSubsonicExtensions);
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
package com.cappielloantonio.tempo.ui.dialog;
|
||||
|
||||
import android.app.AlertDialog;
|
||||
import androidx.appcompat.app.AlertDialog;
|
||||
import android.app.Dialog;
|
||||
import android.os.Bundle;
|
||||
import android.text.TextUtils;
|
||||
|
||||
@@ -1262,7 +1262,7 @@ public class HomeTabMusicFragment extends Fragment implements ClickCallback {
|
||||
|
||||
if (mediaBrowserListenableFuture != null) {
|
||||
final boolean[] playbackStarted = {false};
|
||||
|
||||
Toast.makeText(requireContext(), R.string.bottom_sheet_generating_instant_mix, Toast.LENGTH_SHORT).show();
|
||||
homeViewModel.getMediaInstantMix(getViewLifecycleOwner(), track)
|
||||
.observe(getViewLifecycleOwner(), songs -> {
|
||||
if (playbackStarted[0] || songs == null || songs.isEmpty()) return;
|
||||
|
||||
@@ -413,10 +413,10 @@ public class PlayerControllerFragment extends Fragment {
|
||||
bind.getRoot().setShowNextButton(true);
|
||||
bind.getRoot().setShowFastForwardButton(false);
|
||||
bind.getRoot().setRepeatToggleModes(RepeatModeUtil.REPEAT_TOGGLE_MODE_ALL | RepeatModeUtil.REPEAT_TOGGLE_MODE_ONE);
|
||||
bind.getRoot().findViewById(R.id.player_playback_speed_button).setVisibility(View.GONE);
|
||||
bind.getRoot().findViewById(R.id.player_playback_speed_button).setVisibility(View.VISIBLE);
|
||||
bind.getRoot().findViewById(R.id.player_skip_silence_toggle_button).setVisibility(View.GONE);
|
||||
bind.getRoot().findViewById(R.id.button_favorite).setVisibility(View.VISIBLE);
|
||||
resetPlaybackParameters(mediaBrowser);
|
||||
setPlaybackParameters(mediaBrowser);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -524,31 +524,11 @@ public class PlayerControllerFragment extends Fragment {
|
||||
playbackSpeedButton.setOnClickListener(view -> {
|
||||
float currentSpeed = Preferences.getPlaybackSpeed();
|
||||
|
||||
if (currentSpeed == Constants.MEDIA_PLAYBACK_SPEED_080) {
|
||||
mediaBrowser.setPlaybackParameters(new PlaybackParameters(Constants.MEDIA_PLAYBACK_SPEED_100));
|
||||
playbackSpeedButton.setText(getString(R.string.player_playback_speed, Constants.MEDIA_PLAYBACK_SPEED_100));
|
||||
Preferences.setPlaybackSpeed(Constants.MEDIA_PLAYBACK_SPEED_100);
|
||||
} else if (currentSpeed == Constants.MEDIA_PLAYBACK_SPEED_100) {
|
||||
mediaBrowser.setPlaybackParameters(new PlaybackParameters(Constants.MEDIA_PLAYBACK_SPEED_125));
|
||||
playbackSpeedButton.setText(getString(R.string.player_playback_speed, Constants.MEDIA_PLAYBACK_SPEED_125));
|
||||
Preferences.setPlaybackSpeed(Constants.MEDIA_PLAYBACK_SPEED_125);
|
||||
} else if (currentSpeed == Constants.MEDIA_PLAYBACK_SPEED_125) {
|
||||
mediaBrowser.setPlaybackParameters(new PlaybackParameters(Constants.MEDIA_PLAYBACK_SPEED_150));
|
||||
playbackSpeedButton.setText(getString(R.string.player_playback_speed, Constants.MEDIA_PLAYBACK_SPEED_150));
|
||||
Preferences.setPlaybackSpeed(Constants.MEDIA_PLAYBACK_SPEED_150);
|
||||
} else if (currentSpeed == Constants.MEDIA_PLAYBACK_SPEED_150) {
|
||||
mediaBrowser.setPlaybackParameters(new PlaybackParameters(Constants.MEDIA_PLAYBACK_SPEED_175));
|
||||
playbackSpeedButton.setText(getString(R.string.player_playback_speed, Constants.MEDIA_PLAYBACK_SPEED_175));
|
||||
Preferences.setPlaybackSpeed(Constants.MEDIA_PLAYBACK_SPEED_175);
|
||||
} else if (currentSpeed == Constants.MEDIA_PLAYBACK_SPEED_175) {
|
||||
mediaBrowser.setPlaybackParameters(new PlaybackParameters(Constants.MEDIA_PLAYBACK_SPEED_200));
|
||||
playbackSpeedButton.setText(getString(R.string.player_playback_speed, Constants.MEDIA_PLAYBACK_SPEED_200));
|
||||
Preferences.setPlaybackSpeed(Constants.MEDIA_PLAYBACK_SPEED_200);
|
||||
} else if (currentSpeed == Constants.MEDIA_PLAYBACK_SPEED_200) {
|
||||
mediaBrowser.setPlaybackParameters(new PlaybackParameters(Constants.MEDIA_PLAYBACK_SPEED_080));
|
||||
playbackSpeedButton.setText(getString(R.string.player_playback_speed, Constants.MEDIA_PLAYBACK_SPEED_080));
|
||||
Preferences.setPlaybackSpeed(Constants.MEDIA_PLAYBACK_SPEED_080);
|
||||
}
|
||||
currentSpeed += 0.25f;
|
||||
if (currentSpeed > 2.0f) currentSpeed = 0.5f;
|
||||
mediaBrowser.setPlaybackParameters(new PlaybackParameters(currentSpeed));
|
||||
playbackSpeedButton.setText(getString(R.string.player_playback_speed, currentSpeed));
|
||||
Preferences.setPlaybackSpeed(currentSpeed);
|
||||
});
|
||||
|
||||
skipSilenceToggleButton.setOnClickListener(view -> {
|
||||
@@ -600,7 +580,7 @@ public class PlayerControllerFragment extends Fragment {
|
||||
}
|
||||
|
||||
private void resetPlaybackParameters(MediaBrowser mediaBrowser) {
|
||||
mediaBrowser.setPlaybackParameters(new PlaybackParameters(Constants.MEDIA_PLAYBACK_SPEED_100));
|
||||
mediaBrowser.setPlaybackParameters(new PlaybackParameters(1.0f));
|
||||
// TODO Resettare lo skip del silenzio
|
||||
}
|
||||
|
||||
|
||||
@@ -156,10 +156,10 @@ public class PlaylistCatalogueFragment extends Fragment implements ClickCallback
|
||||
|
||||
popup.setOnMenuItemClickListener(menuItem -> {
|
||||
if (menuItem.getItemId() == R.id.menu_playlist_sort_name) {
|
||||
playlistHorizontalAdapter.sort(Constants.GENRE_ORDER_BY_NAME);
|
||||
playlistHorizontalAdapter.sort(Constants.PLAYLIST_ORDER_BY_NAME);
|
||||
return true;
|
||||
} else if (menuItem.getItemId() == R.id.menu_playlist_sort_random) {
|
||||
playlistHorizontalAdapter.sort(Constants.GENRE_ORDER_BY_RANDOM);
|
||||
playlistHorizontalAdapter.sort(Constants.PLAYLIST_ORDER_BY_RANDOM);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -9,6 +9,8 @@ import android.media.audiofx.AudioEffect;
|
||||
import android.net.Uri;
|
||||
import android.os.Bundle;
|
||||
import android.os.IBinder;
|
||||
import android.text.InputFilter;
|
||||
import android.text.InputType;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
@@ -27,6 +29,7 @@ import androidx.media3.common.util.UnstableApi;
|
||||
import androidx.navigation.NavController;
|
||||
import androidx.navigation.NavOptions;
|
||||
import androidx.navigation.fragment.NavHostFragment;
|
||||
import androidx.preference.EditTextPreference;
|
||||
import androidx.preference.ListPreference;
|
||||
import androidx.preference.Preference;
|
||||
import androidx.preference.PreferenceCategory;
|
||||
@@ -141,6 +144,7 @@ public class SettingsFragment extends PreferenceFragmentCompat {
|
||||
setStreamingCacheSize();
|
||||
setAppLanguage();
|
||||
setVersion();
|
||||
setNetorkPingTimeoutBase();
|
||||
|
||||
actionLogout();
|
||||
actionScan();
|
||||
@@ -261,6 +265,30 @@ public class SettingsFragment extends PreferenceFragmentCompat {
|
||||
}
|
||||
}
|
||||
|
||||
private void setNetorkPingTimeoutBase() {
|
||||
EditTextPreference networkPingTimeoutBase = findPreference("network_ping_timeout_base");
|
||||
|
||||
if (networkPingTimeoutBase != null) {
|
||||
networkPingTimeoutBase.setSummaryProvider(EditTextPreference.SimpleSummaryProvider.getInstance());
|
||||
networkPingTimeoutBase.setOnBindEditTextListener(editText -> {
|
||||
editText.setInputType(InputType.TYPE_CLASS_NUMBER);
|
||||
editText.setFilters(new InputFilter[]{ (source, start, end, dest, dstart, dend) -> {
|
||||
for (int i = start; i < end; i++) {
|
||||
if (!Character.isDigit(source.charAt(i))) {
|
||||
return "";
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}});
|
||||
});
|
||||
|
||||
networkPingTimeoutBase.setOnPreferenceChangeListener((preference, newValue) -> {
|
||||
String input = (String) newValue;
|
||||
return input != null && !input.isEmpty();
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
private void setStreamingCacheSize() {
|
||||
ListPreference streamingCachePreference = findPreference("streaming_cache_size");
|
||||
|
||||
|
||||
@@ -61,13 +61,6 @@ object Constants {
|
||||
const val MEDIA_TYPE_VIDEO = "video"
|
||||
const val MEDIA_TYPE_RADIO = "radio"
|
||||
|
||||
const val MEDIA_PLAYBACK_SPEED_080 = 0.8f
|
||||
const val MEDIA_PLAYBACK_SPEED_100 = 1.0f
|
||||
const val MEDIA_PLAYBACK_SPEED_125 = 1.25f
|
||||
const val MEDIA_PLAYBACK_SPEED_150 = 1.50f
|
||||
const val MEDIA_PLAYBACK_SPEED_175 = 1.75f
|
||||
const val MEDIA_PLAYBACK_SPEED_200 = 2.0f
|
||||
|
||||
const val MEDIA_RECENTLY_PLAYED = "MEDIA_RECENTLY_PLAYED"
|
||||
const val MEDIA_MOST_PLAYED = "MEDIA_MOST_PLAYED"
|
||||
const val MEDIA_RECENTLY_ADDED = "MEDIA_RECENTLY_ADDED"
|
||||
|
||||
@@ -46,8 +46,16 @@ class DynamicMediaSourceFactory(
|
||||
|
||||
else -> {
|
||||
val extractorsFactory: ExtractorsFactory = DefaultExtractorsFactory()
|
||||
ProgressiveMediaSource.Factory(dataSourceFactory, extractorsFactory)
|
||||
.createMediaSource(mediaItem)
|
||||
val progressiveFactory = ProgressiveMediaSource.Factory(dataSourceFactory, extractorsFactory)
|
||||
|
||||
val uri = mediaItem.localConfiguration?.uri
|
||||
val isTranscoding = uri?.getQueryParameter("format") != null && uri.getQueryParameter("format") != "raw"
|
||||
|
||||
if (isTranscoding && OpenSubsonicExtensionsUtil.isTranscodeOffsetExtensionAvailable()) {
|
||||
TranscodingMediaSource(mediaItem, dataSourceFactory, progressiveFactory)
|
||||
} else {
|
||||
progressiveFactory.createMediaSource(mediaItem)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -31,7 +31,7 @@ public class MusicUtil {
|
||||
private static final Pattern BITRATE_PATTERN = Pattern.compile("&maxBitRate=\\d+");
|
||||
private static final Pattern FORMAT_PATTERN = Pattern.compile("&format=\\w+");
|
||||
|
||||
public static Uri getStreamUri(String id) {
|
||||
public static Uri getStreamUri(String id, int timeOffset) {
|
||||
Map<String, String> params = App.getSubsonicClientInstance(false).getParams();
|
||||
|
||||
StringBuilder uri = new StringBuilder();
|
||||
@@ -58,6 +58,8 @@ public class MusicUtil {
|
||||
uri.append("&format=").append(getTranscodingFormatPreference());
|
||||
if (Preferences.askForEstimateContentLength())
|
||||
uri.append("&estimateContentLength=true");
|
||||
if (timeOffset > 0)
|
||||
uri.append("&timeOffset=").append(timeOffset);
|
||||
|
||||
uri.append("&id=").append(id);
|
||||
|
||||
@@ -66,6 +68,10 @@ public class MusicUtil {
|
||||
return Uri.parse(uri.toString());
|
||||
}
|
||||
|
||||
public static Uri getStreamUri(String id) {
|
||||
return getStreamUri(id, 0);
|
||||
}
|
||||
|
||||
public static Uri updateStreamUri(Uri uri) {
|
||||
String s = uri.toString();
|
||||
Matcher m1 = BITRATE_PATTERN.matcher(s);
|
||||
|
||||
@@ -74,6 +74,8 @@ object Preferences {
|
||||
private const val CONTINUOUS_PLAY = "continuous_play"
|
||||
private const val LAST_INSTANT_MIX = "last_instant_mix"
|
||||
private const val ALLOW_PLAYLIST_DUPLICATES = "allow_playlist_duplicates"
|
||||
private const val HOME_SORT_PLAYLISTS = "home_sort_playlists"
|
||||
private const val DEFAULT_HOME_SORT_PLAYLISTS_SORT_ORDER = Constants.PLAYLIST_ORDER_BY_RANDOM
|
||||
private const val EQUALIZER_ENABLED = "equalizer_enabled"
|
||||
private const val EQUALIZER_BAND_LEVELS = "equalizer_band_levels"
|
||||
private const val MINI_SHUFFLE_BUTTON_VISIBILITY = "mini_shuffle_button_visibility"
|
||||
@@ -83,6 +85,8 @@ object Preferences {
|
||||
private const val ARTIST_SORT_BY_ALBUM_COUNT= "artist_sort_by_album_count"
|
||||
private const val SORT_SEARCH_CHRONOLOGICALLY= "sort_search_chronologically"
|
||||
private const val ARTIST_DISPLAY_BIOGRAPHY= "artist_display_biography"
|
||||
private const val NETWORK_PING_TIMEOUT = "network_ping_timeout_base"
|
||||
|
||||
|
||||
@JvmStatic
|
||||
fun getServer(): String? {
|
||||
@@ -94,6 +98,19 @@ object Preferences {
|
||||
App.getInstance().preferences.edit().putString(SERVER, server).apply()
|
||||
}
|
||||
|
||||
@JvmStatic
|
||||
fun getNetworkPingTimeout(): Int {
|
||||
val timeoutString = App.getInstance().preferences.getString(NETWORK_PING_TIMEOUT, "2") ?: "2"
|
||||
return (timeoutString.toIntOrNull() ?: 2).coerceAtLeast(1)
|
||||
}
|
||||
|
||||
@JvmStatic
|
||||
fun setNetworkPingTimeout(pingTimeout: String?) {
|
||||
App.getInstance().preferences.edit().putString(NETWORK_PING_TIMEOUT, pingTimeout).apply()
|
||||
}
|
||||
|
||||
|
||||
|
||||
@JvmStatic
|
||||
fun getUser(): String? {
|
||||
return App.getInstance().preferences.getString(USER, null)
|
||||
@@ -625,6 +642,16 @@ object Preferences {
|
||||
return App.getInstance().preferences.getBoolean(ALLOW_PLAYLIST_DUPLICATES, false)
|
||||
}
|
||||
|
||||
@JvmStatic
|
||||
fun getHomeSortPlaylists(): String {
|
||||
return App.getInstance().preferences.getString(HOME_SORT_PLAYLISTS, DEFAULT_HOME_SORT_PLAYLISTS_SORT_ORDER) ?: DEFAULT_HOME_SORT_PLAYLISTS_SORT_ORDER
|
||||
}
|
||||
|
||||
@JvmStatic
|
||||
fun getHomeSortPlaylists(sortOrder: String) {
|
||||
App.getInstance().preferences.edit().putString(HOME_SORT_PLAYLISTS, sortOrder).apply()
|
||||
}
|
||||
|
||||
@JvmStatic
|
||||
fun setEqualizerEnabled(enabled: Boolean) {
|
||||
App.getInstance().preferences.edit().putBoolean(EQUALIZER_ENABLED, enabled).apply()
|
||||
|
||||
@@ -0,0 +1,322 @@
|
||||
package com.cappielloantonio.tempo.util
|
||||
|
||||
import androidx.annotation.OptIn
|
||||
import androidx.media3.common.C
|
||||
import androidx.media3.common.MediaItem
|
||||
import androidx.media3.common.Timeline
|
||||
import androidx.media3.common.util.UnstableApi
|
||||
import androidx.media3.common.util.Util
|
||||
import androidx.media3.datasource.DataSource
|
||||
import androidx.media3.datasource.TransferListener
|
||||
import androidx.media3.decoder.DecoderInputBuffer
|
||||
import androidx.media3.exoplayer.FormatHolder
|
||||
import androidx.media3.exoplayer.LoadingInfo
|
||||
import androidx.media3.exoplayer.SeekParameters
|
||||
import androidx.media3.exoplayer.source.CompositeMediaSource
|
||||
import androidx.media3.exoplayer.source.ForwardingTimeline
|
||||
import androidx.media3.exoplayer.source.MediaPeriod
|
||||
import androidx.media3.exoplayer.source.MediaSource
|
||||
import androidx.media3.exoplayer.source.ProgressiveMediaSource
|
||||
import androidx.media3.exoplayer.source.SampleStream
|
||||
import androidx.media3.exoplayer.trackselection.ExoTrackSelection
|
||||
import androidx.media3.exoplayer.upstream.Allocator
|
||||
|
||||
@OptIn(UnstableApi::class)
|
||||
class TranscodingMediaSource(
|
||||
private val mediaItem: MediaItem,
|
||||
private val dataSourceFactory: DataSource.Factory,
|
||||
private val progressiveMediaSourceFactory: ProgressiveMediaSource.Factory
|
||||
) : CompositeMediaSource<Void>() {
|
||||
|
||||
private var durationUs: Long = C.TIME_UNSET
|
||||
private var currentSource: MediaSource? = null
|
||||
|
||||
init {
|
||||
val extras = mediaItem.mediaMetadata.extras
|
||||
if (extras != null && extras.containsKey("duration")) {
|
||||
val seconds = extras.getInt("duration")
|
||||
if (seconds > 0) {
|
||||
durationUs = Util.msToUs(seconds * 1000L)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override fun getMediaItem() = mediaItem
|
||||
|
||||
override fun prepareSourceInternal(mediaTransferListener: TransferListener?) {
|
||||
super.prepareSourceInternal(mediaTransferListener)
|
||||
val initialSource = progressiveMediaSourceFactory.createMediaSource(mediaItem)
|
||||
currentSource = initialSource
|
||||
prepareChildSource(null, initialSource)
|
||||
}
|
||||
|
||||
override fun onChildSourceInfoRefreshed(
|
||||
childSourceId: Void?,
|
||||
mediaSource: MediaSource,
|
||||
newTimeline: Timeline
|
||||
) {
|
||||
val timeline =
|
||||
if (durationUs != C.TIME_UNSET) {
|
||||
DurationOverridingTimeline(newTimeline, durationUs)
|
||||
} else {
|
||||
newTimeline
|
||||
}
|
||||
refreshSourceInfo(timeline)
|
||||
}
|
||||
|
||||
override fun createPeriod(
|
||||
id: MediaSource.MediaPeriodId,
|
||||
allocator: Allocator,
|
||||
startPositionUs: Long
|
||||
): MediaPeriod {
|
||||
val source = currentSource ?: throw IllegalStateException("Source not ready")
|
||||
val childPeriod = source.createPeriod(id, allocator, startPositionUs)
|
||||
return TranscodingMediaPeriod(childPeriod, source, id, allocator)
|
||||
}
|
||||
|
||||
override fun releasePeriod(mediaPeriod: MediaPeriod) {
|
||||
val transcodingPeriod = mediaPeriod as TranscodingMediaPeriod
|
||||
transcodingPeriod.release()
|
||||
|
||||
if (transcodingPeriod.currentOffsetUs > 0) {
|
||||
releaseChildSource(null)
|
||||
val initialSource = progressiveMediaSourceFactory.createMediaSource(mediaItem)
|
||||
currentSource = initialSource
|
||||
prepareChildSource(null, initialSource)
|
||||
}
|
||||
}
|
||||
|
||||
override fun getMediaPeriodIdForChildMediaPeriodId(
|
||||
childSourceId: Void?,
|
||||
mediaPeriodId: MediaSource.MediaPeriodId
|
||||
) = mediaPeriodId
|
||||
|
||||
private inner class TranscodingMediaPeriod(
|
||||
private var currentPeriod: MediaPeriod,
|
||||
private var source: MediaSource,
|
||||
private val id: MediaSource.MediaPeriodId,
|
||||
private val allocator: Allocator
|
||||
) : MediaPeriod, MediaPeriod.Callback {
|
||||
|
||||
private var localCallback: MediaPeriod.Callback? = null
|
||||
internal var currentOffsetUs: Long = 0
|
||||
private var isReloading = false
|
||||
|
||||
private var lastSelections: Array<out ExoTrackSelection?>? = null
|
||||
private var lastMayRetainStreamFlags: BooleanArray? = null
|
||||
private var activeWrappers: Array<OffsetSampleStream?> = emptyArray()
|
||||
|
||||
fun release() {
|
||||
source.releasePeriod(currentPeriod)
|
||||
}
|
||||
|
||||
override fun prepare(callback: MediaPeriod.Callback, positionUs: Long) {
|
||||
localCallback = callback
|
||||
currentPeriod.prepare(this, positionUs)
|
||||
}
|
||||
|
||||
override fun maybeThrowPrepareError() {
|
||||
if (!isReloading) currentPeriod.maybeThrowPrepareError()
|
||||
}
|
||||
|
||||
override fun getTrackGroups() = currentPeriod.trackGroups
|
||||
|
||||
override fun getStreamKeys(trackSelections: MutableList<ExoTrackSelection>) =
|
||||
currentPeriod.getStreamKeys(trackSelections)
|
||||
|
||||
override fun selectTracks(
|
||||
selections: Array<out ExoTrackSelection?>,
|
||||
mayRetainStreamFlags: BooleanArray,
|
||||
streams: Array<SampleStream?>,
|
||||
streamResetFlags: BooleanArray,
|
||||
positionUs: Long
|
||||
): Long {
|
||||
lastSelections = selections
|
||||
lastMayRetainStreamFlags = mayRetainStreamFlags
|
||||
|
||||
val childStreams = arrayOfNulls<SampleStream>(streams.size)
|
||||
streams.forEachIndexed { i, stream ->
|
||||
childStreams[i] = (stream as? OffsetSampleStream)?.childStream
|
||||
}
|
||||
|
||||
val startPos =
|
||||
currentPeriod.selectTracks(
|
||||
selections,
|
||||
mayRetainStreamFlags,
|
||||
childStreams,
|
||||
streamResetFlags,
|
||||
positionUs - currentOffsetUs
|
||||
)
|
||||
|
||||
val newWrappers = arrayOfNulls<OffsetSampleStream>(streams.size)
|
||||
for (i in streams.indices) {
|
||||
val child = childStreams[i]
|
||||
if (child == null) {
|
||||
streams[i] = null
|
||||
} else {
|
||||
val existingWrapper = streams[i] as? OffsetSampleStream
|
||||
if (existingWrapper != null && existingWrapper.childStream === child) {
|
||||
newWrappers[i] = existingWrapper
|
||||
} else {
|
||||
val wrapper = OffsetSampleStream(child)
|
||||
newWrappers[i] = wrapper
|
||||
streams[i] = wrapper
|
||||
}
|
||||
}
|
||||
}
|
||||
activeWrappers = newWrappers
|
||||
|
||||
return startPos + currentOffsetUs
|
||||
}
|
||||
|
||||
override fun discardBuffer(positionUs: Long, toKeyframe: Boolean) {
|
||||
if (!isReloading) {
|
||||
currentPeriod.discardBuffer(positionUs - currentOffsetUs, toKeyframe)
|
||||
}
|
||||
}
|
||||
|
||||
override fun readDiscontinuity(): Long {
|
||||
if (isReloading) return C.TIME_UNSET
|
||||
val discontinuity = currentPeriod.readDiscontinuity()
|
||||
return if (discontinuity == C.TIME_UNSET) C.TIME_UNSET
|
||||
else discontinuity + currentOffsetUs
|
||||
}
|
||||
|
||||
override fun seekToUs(positionUs: Long): Long {
|
||||
if (positionUs == 0L && currentOffsetUs == 0L) {
|
||||
return currentPeriod.seekToUs(positionUs)
|
||||
}
|
||||
|
||||
reloadSource(positionUs)
|
||||
return positionUs
|
||||
}
|
||||
|
||||
override fun getAdjustedSeekPositionUs(positionUs: Long, seekParameters: SeekParameters) =
|
||||
positionUs
|
||||
|
||||
override fun getBufferedPositionUs(): Long {
|
||||
if (isReloading) return currentOffsetUs
|
||||
val buffered = currentPeriod.bufferedPositionUs
|
||||
if (buffered == C.TIME_END_OF_SOURCE) return C.TIME_END_OF_SOURCE
|
||||
return if (buffered == C.TIME_UNSET) C.TIME_UNSET else buffered + currentOffsetUs
|
||||
}
|
||||
|
||||
override fun getNextLoadPositionUs(): Long {
|
||||
if (isReloading) return C.TIME_UNSET
|
||||
val next = currentPeriod.nextLoadPositionUs
|
||||
if (next == C.TIME_END_OF_SOURCE) return C.TIME_END_OF_SOURCE
|
||||
return if (next == C.TIME_UNSET) C.TIME_UNSET else next + currentOffsetUs
|
||||
}
|
||||
|
||||
override fun reevaluateBuffer(positionUs: Long) {
|
||||
if (!isReloading) currentPeriod.reevaluateBuffer(positionUs - currentOffsetUs)
|
||||
}
|
||||
|
||||
override fun continueLoading(isLoading: LoadingInfo): Boolean {
|
||||
if (isReloading) return false
|
||||
val builder = isLoading.buildUpon()
|
||||
builder.setPlaybackPositionUs(isLoading.playbackPositionUs - currentOffsetUs)
|
||||
return currentPeriod.continueLoading(builder.build())
|
||||
}
|
||||
|
||||
override fun isLoading() = isReloading || currentPeriod.isLoading
|
||||
|
||||
override fun onPrepared(mediaPeriod: MediaPeriod) {
|
||||
if (isReloading && mediaPeriod == currentPeriod) {
|
||||
isReloading = false
|
||||
restoreTracks()
|
||||
localCallback?.onContinueLoadingRequested(this)
|
||||
} else {
|
||||
localCallback?.onPrepared(this)
|
||||
}
|
||||
}
|
||||
|
||||
override fun onContinueLoadingRequested(source: MediaPeriod) {
|
||||
if (!isReloading) localCallback?.onContinueLoadingRequested(this)
|
||||
}
|
||||
|
||||
private fun reloadSource(positionUs: Long) {
|
||||
isReloading = true
|
||||
currentOffsetUs = positionUs
|
||||
|
||||
activeWrappers.forEach { it?.childStream = null }
|
||||
|
||||
source.releasePeriod(currentPeriod)
|
||||
releaseChildSource(null)
|
||||
|
||||
val seconds = Util.usToMs(positionUs) / 1000
|
||||
val newUri = MusicUtil.getStreamUri(mediaItem.mediaId, seconds.toInt())
|
||||
val newMediaItem = mediaItem.buildUpon().setUri(newUri).build()
|
||||
|
||||
val newSource = progressiveMediaSourceFactory.createMediaSource(newMediaItem)
|
||||
|
||||
source = newSource
|
||||
currentSource = newSource
|
||||
prepareChildSource(null, newSource)
|
||||
|
||||
val newPeriod = newSource.createPeriod(id, allocator, 0)
|
||||
currentPeriod = newPeriod
|
||||
newPeriod.prepare(this, 0)
|
||||
}
|
||||
|
||||
private fun restoreTracks() {
|
||||
val selections = lastSelections ?: return
|
||||
val flags = lastMayRetainStreamFlags ?: return
|
||||
|
||||
val childStreams = arrayOfNulls<SampleStream>(activeWrappers.size)
|
||||
val streamResetFlags = BooleanArray(activeWrappers.size)
|
||||
|
||||
currentPeriod.selectTracks(selections, flags, childStreams, streamResetFlags, 0)
|
||||
|
||||
for (i in activeWrappers.indices) {
|
||||
activeWrappers[i]?.childStream = childStreams[i]
|
||||
}
|
||||
}
|
||||
|
||||
private inner class OffsetSampleStream(var childStream: SampleStream?) : SampleStream {
|
||||
override fun isReady() = childStream?.isReady ?: false
|
||||
override fun maybeThrowError() {
|
||||
childStream?.maybeThrowError()
|
||||
}
|
||||
|
||||
override fun readData(
|
||||
formatHolder: FormatHolder,
|
||||
buffer: DecoderInputBuffer,
|
||||
readFlags: Int
|
||||
): Int {
|
||||
val stream = childStream ?: return C.RESULT_NOTHING_READ
|
||||
val result = stream.readData(formatHolder, buffer, readFlags)
|
||||
if (result == C.RESULT_BUFFER_READ && !buffer.isEndOfStream) {
|
||||
buffer.timeUs += currentOffsetUs
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
override fun skipData(positionUs: Long) =
|
||||
childStream?.skipData(positionUs - currentOffsetUs) ?: 0
|
||||
}
|
||||
}
|
||||
|
||||
private class DurationOverridingTimeline(timeline: Timeline, private val durationUs: Long) :
|
||||
ForwardingTimeline(timeline) {
|
||||
|
||||
override fun getWindow(
|
||||
windowIndex: Int,
|
||||
window: Window,
|
||||
defaultPositionProjectionUs: Long
|
||||
): Window {
|
||||
super.getWindow(windowIndex, window, defaultPositionProjectionUs)
|
||||
window.durationUs = durationUs
|
||||
window.isSeekable = true
|
||||
window.isDynamic = false
|
||||
window.liveConfiguration = null
|
||||
return window
|
||||
}
|
||||
|
||||
override fun getPeriod(periodIndex: Int, period: Period, setIds: Boolean): Period {
|
||||
super.getPeriod(periodIndex, period, setIds)
|
||||
period.durationUs = durationUs
|
||||
return period
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -138,7 +138,7 @@ public class AlbumBottomSheetViewModel extends AndroidViewModel {
|
||||
public LiveData<List<Child>> getAlbumInstantMix(LifecycleOwner owner, AlbumID3 album) {
|
||||
instantMix.setValue(Collections.emptyList());
|
||||
|
||||
albumRepository.getInstantMix(album, 20).observe(owner, instantMix::postValue);
|
||||
albumRepository.getInstantMix(album, 30).observe(owner, instantMix::postValue);
|
||||
|
||||
return instantMix;
|
||||
}
|
||||
|
||||
@@ -126,7 +126,7 @@ public class ArtistBottomSheetViewModel extends AndroidViewModel {
|
||||
public LiveData<List<Child>> getArtistInstantMix(LifecycleOwner owner, ArtistID3 artist) {
|
||||
instantMix.setValue(Collections.emptyList());
|
||||
|
||||
artistRepository.getInstantMix(artist, 20).observe(owner, instantMix::postValue);
|
||||
artistRepository.getInstantMix(artist, 30).observe(owner, instantMix::postValue);
|
||||
|
||||
return instantMix;
|
||||
}
|
||||
|
||||
@@ -60,7 +60,7 @@ public class ArtistPageViewModel extends AndroidViewModel {
|
||||
}
|
||||
|
||||
public LiveData<List<Child>> getArtistInstantMix() {
|
||||
return artistRepository.getInstantMix(artist, 20);
|
||||
return artistRepository.getInstantMix(artist, 30);
|
||||
}
|
||||
|
||||
public ArtistID3 getArtist() {
|
||||
|
||||
@@ -24,6 +24,7 @@ import com.cappielloantonio.tempo.subsonic.models.ArtistID3;
|
||||
import com.cappielloantonio.tempo.subsonic.models.Child;
|
||||
import com.cappielloantonio.tempo.subsonic.models.Playlist;
|
||||
import com.cappielloantonio.tempo.subsonic.models.Share;
|
||||
import com.cappielloantonio.tempo.util.Constants;
|
||||
import com.cappielloantonio.tempo.util.Constants.SeedType;
|
||||
import com.cappielloantonio.tempo.util.Preferences;
|
||||
import com.google.common.reflect.TypeToken;
|
||||
@@ -100,7 +101,7 @@ public class HomeViewModel extends AndroidViewModel {
|
||||
}
|
||||
|
||||
public LiveData<List<Child>> getRandomShuffleSample() {
|
||||
return songRepository.getRandomSample(1000, null, null);
|
||||
return songRepository.getRandomSample(100, null, null);
|
||||
}
|
||||
|
||||
public LiveData<List<Chronology>> getChronologySample(LifecycleOwner owner) {
|
||||
@@ -250,12 +251,19 @@ public class HomeViewModel extends AndroidViewModel {
|
||||
playlistRepository.getPlaylists(false, -1).observe(owner, remotes -> {
|
||||
if (remotes != null && !remotes.isEmpty()) {
|
||||
List<Playlist> playlists = new ArrayList<>(remotes);
|
||||
Collections.shuffle(playlists);
|
||||
List<Playlist> randomPlaylists = playlists.size() > 5
|
||||
String result = Preferences.getHomeSortPlaylists();
|
||||
if (Preferences.getHomeSortPlaylists().equals(Constants.PLAYLIST_ORDER_BY_RANDOM))
|
||||
{
|
||||
Collections.shuffle(playlists);
|
||||
}
|
||||
else {
|
||||
playlists.sort(Comparator.comparing(Playlist::getName));
|
||||
}
|
||||
List<Playlist> subsetPlaylists = playlists.size() > 5
|
||||
? playlists.subList(0, 5)
|
||||
: playlists;
|
||||
|
||||
pinnedPlaylists.setValue(randomPlaylists);
|
||||
pinnedPlaylists.setValue(subsetPlaylists);
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
@@ -130,7 +130,7 @@ public class SongBottomSheetViewModel extends AndroidViewModel {
|
||||
public LiveData<List<Child>> getInstantMix(LifecycleOwner owner, Child media) {
|
||||
instantMix.setValue(Collections.emptyList());
|
||||
|
||||
songRepository.getInstantMix(media.getId(), SeedType.TRACK, 20).observe(owner, instantMix::postValue);
|
||||
songRepository.getInstantMix(media.getId(), SeedType.TRACK, 30).observe(owner, instantMix::postValue);
|
||||
|
||||
return instantMix;
|
||||
}
|
||||
|
||||
@@ -16,6 +16,23 @@
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent">
|
||||
|
||||
<Button
|
||||
android:id="@+id/player_playback_speed_button"
|
||||
style="@style/Widget.Material3.Button.TextButton"
|
||||
android:layout_width="80dp"
|
||||
android:layout_height="48dp"
|
||||
android:layout_marginLeft="0dp"
|
||||
android:layout_marginTop="0dp"
|
||||
android:insetLeft="0dp"
|
||||
android:insetTop="0dp"
|
||||
android:insetRight="0dp"
|
||||
android:insetBottom="0dp"
|
||||
app:cornerRadius="30dp"
|
||||
app:layout_constraintLeft_toLeftOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:tint="?attr/colorOnPrimaryContainer" />
|
||||
|
||||
<com.google.android.material.chip.Chip
|
||||
android:id="@+id/player_media_extension"
|
||||
style="@style/Widget.Material3.Chip.Suggestion"
|
||||
@@ -253,23 +270,6 @@
|
||||
app:layout_constraintStart_toEndOf="@+id/placeholder_view_middle_right"
|
||||
app:layout_constraintTop_toTopOf="@+id/placeholder_view_middle_right" />
|
||||
|
||||
<Button
|
||||
android:id="@+id/player_playback_speed_button"
|
||||
style="@style/Widget.Material3.Button.TextButton"
|
||||
android:layout_width="64dp"
|
||||
android:layout_height="64dp"
|
||||
android:layout_marginStart="24dp"
|
||||
android:insetLeft="0dp"
|
||||
android:insetTop="0dp"
|
||||
android:insetRight="0dp"
|
||||
android:insetBottom="0dp"
|
||||
app:cornerRadius="30dp"
|
||||
app:layout_constraintBottom_toBottomOf="@+id/placeholder_view_middle_left"
|
||||
app:layout_constraintEnd_toStartOf="@+id/placeholder_view_middle_left"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="@+id/placeholder_view_middle_left"
|
||||
app:tint="?attr/colorOnPrimaryContainer" />
|
||||
|
||||
<ImageButton
|
||||
android:id="@+id/exo_shuffle"
|
||||
android:layout_width="32dp"
|
||||
|
||||
@@ -240,6 +240,15 @@
|
||||
<item>8</item>
|
||||
</string-array>
|
||||
|
||||
<string-array name="playlist_sort_option_titles">
|
||||
<item>Por nombre</item>
|
||||
<item>Aleatoriamente</item>
|
||||
</string-array>
|
||||
<string-array name="playlist_sort_option_values">
|
||||
<item>ORDER_BY_NAME</item>
|
||||
<item>ORDER_BY_RANDOM</item>
|
||||
</string-array>
|
||||
|
||||
<string-array name="skip_min_star_rating_titles">
|
||||
<item>0 estrellas como mínimo</item>
|
||||
<item>1 estrella como mínimo</item>
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
<string name="album_page_tracks_count_and_duration">%1$d pistas • %2$d minutos</string>
|
||||
<string name="app_name">Tempus</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, desactive las optimizaciones de batería para continuar la reproducción multimedia mientras la pantalla está apagada.</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>
|
||||
<string name="activity_battery_optimizations_title">Optimizaciones de batería</string>
|
||||
<string name="activity_info_offline_mode">Modo sin conexión</string>
|
||||
<string name="album_bottom_sheet_add_to_playlist">Añadir a la lista de reproducción</string>
|
||||
@@ -40,6 +40,7 @@
|
||||
<string name="artist_list_page_downloaded">Artistas descargados</string>
|
||||
<string name="artist_list_page_starred">Artistas destacados</string>
|
||||
<string name="artist_list_page_title">Artistas</string>
|
||||
<string name="artist_no_artist_info_toast">No hay más información del artista</string>
|
||||
<string name="artist_page_radio_button">Radio</string>
|
||||
<string name="artist_page_shuffle_button">Aleatorio</string>
|
||||
<string name="artist_page_switch_layout_button">Cambiar disposición</string>
|
||||
@@ -52,6 +53,7 @@
|
||||
<string name="battery_optimization_negative_button">Ignorar</string>
|
||||
<string name="battery_optimization_neutral_button">No volver a preguntar</string>
|
||||
<string name="battery_optimization_positive_button">Desactivar</string>
|
||||
<string name="bottom_sheet_problem_generating_instant_mix">No se pudieron obtener las pistas del servidor.</string>
|
||||
<string name="connection_alert_dialog_negative_button">Cancelar</string>
|
||||
<string name="connection_alert_dialog_neutral_button">Habilitar el ahorro de datos</string>
|
||||
<string name="connection_alert_dialog_positive_button">Aceptar</string>
|
||||
@@ -60,7 +62,7 @@
|
||||
<string name="content_description_shuffle_button">Aleatorio</string>
|
||||
<string name="delete_download_storage_dialog_negative_button">Cancelar</string>
|
||||
<string name="delete_download_storage_dialog_positive_button">Continuar</string>
|
||||
<string name="delete_download_storage_dialog_summary">Por favor, sea consciente de que si continúa, todos los elementos descargados de todos los servidores se eliminarán.</string>
|
||||
<string name="delete_download_storage_dialog_summary">Por favor, ten en cuenta que si continúas, todos los elementos descargados de todos los servidores se eliminarán.</string>
|
||||
<string name="delete_download_storage_dialog_title">Eliminar elementos guardados</string>
|
||||
<string name="description_empty_title">Letra no disponible</string>
|
||||
<string name="disc_titlefull">Disco %1$s - %2$s</string>
|
||||
@@ -111,12 +113,12 @@
|
||||
<string name="home_rearrangement_dialog_neutral_button">Restablecer</string>
|
||||
<string name="home_rearrangement_dialog_positive_button">Guardar</string>
|
||||
<string name="home_rearrangement_dialog_title">Reorganizar la página de inicio</string>
|
||||
<string name="home_rearrangement_dialog_subtitle">Tenga en cuenta que para que los cambios surtan efecto, hay que reiniciar la aplicación.</string>
|
||||
<string name="home_rearrangement_dialog_subtitle">Ten en cuenta que para que los cambios surtan efecto, hay que reiniciar la aplicación.</string>
|
||||
<string name="home_section_music">Música</string>
|
||||
<string name="home_section_podcast">Pódcasts</string>
|
||||
<string name="home_section_radio">Radio</string>
|
||||
<string name="home_subtitle_best_of">Mejores pistas de tus artistas favoritos</string>
|
||||
<string name="home_subtitle_made_for_you">Iniciar mix desde una cación que te gustó</string>
|
||||
<string name="home_subtitle_made_for_you">Iniciar mix desde una canción que te gustó</string>
|
||||
<string name="home_subtitle_new_internet_radio_station">Añadir una nueva emisora de radio</string>
|
||||
<string name="home_subtitle_new_podcast_channel">Añadir un nuevo canal de pódcasts</string>
|
||||
<string name="home_sync_starred_cancel">Cancelar</string>
|
||||
@@ -246,6 +248,7 @@
|
||||
<string name="podcast_channel_catalogue_title_expanded">Explorar canales</string>
|
||||
<string name="podcast_channel_editor_dialog_hint_rss_url">URL del feed RSS</string>
|
||||
<string name="podcast_channel_editor_dialog_title">Canal del pódcast</string>
|
||||
<string name="podcast_channel_not_supported_snackbar">Este servidor no soporta pódcasts.</string>
|
||||
<string name="podcast_channel_page_title_description_section">Descripción</string>
|
||||
<string name="podcast_channel_page_title_episode_section">Episodios</string>
|
||||
<string name="podcast_channel_page_title_no_episode_available">No hay episodios disponibles</string>
|
||||
@@ -260,10 +263,12 @@
|
||||
<string name="radio_editor_dialog_negative_button">Cancelar</string>
|
||||
<string name="radio_editor_dialog_neutral_button">Eliminar</string>
|
||||
<string name="radio_editor_dialog_positive_button">Guardar</string>
|
||||
<string name="radio_editor_dialog_title">"Emisora "</string>
|
||||
<string name="radio_editor_dialog_updated">Emisora de radio actualizada</string>
|
||||
<string name="radio_editor_dialog_title">Emisora</string>
|
||||
<string name="radio_station_info_empty_button">Pulsa para ocultar la sección\nLos cambios serán visibles al reiniciar la app</string>
|
||||
<string name="radio_station_info_empty_subtitle">Una vez que añadas una emisora de radio, la encontrarás aquí</string>
|
||||
<string name="radio_station_info_empty_title">No hay emisoras de radio</string>
|
||||
<string name="radio_dialog_not_supported_snackbar">Este servidor no soporta emisoras de radio en Internet.</string>
|
||||
<string name="rating_dialog_negative_button">Cancelar</string>
|
||||
<string name="rating_dialog_positive_button">Guardar</string>
|
||||
<string name="rating_dialog_title">Valorar</string>
|
||||
@@ -289,34 +294,34 @@
|
||||
<string name="server_unreachable_dialog_negative_button">Cancelar</string>
|
||||
<string name="server_unreachable_dialog_neutral_button">Ir al inicio de sesión</string>
|
||||
<string name="server_unreachable_dialog_positive_button">Continuar de todas formas</string>
|
||||
<string name="server_unreachable_dialog_summary">El servidor no está disponible. Si decide continuar, este diálogo no aparecerá de nuevo durante una hora.</string>
|
||||
<string name="server_unreachable_dialog_summary">El servidor no está disponible. Si decides continuar, este diálogo no aparecerá de nuevo durante una hora.</string>
|
||||
<string name="server_unreachable_dialog_title">No se puede conectar con el servidor</string>
|
||||
<string name="settings_about_summary">Tempus es un cliente de música Subsonic ligero y de código abierto, diseñado nativamente para Android.</string>
|
||||
<string name="settings_about_title">Acerca de</string>
|
||||
<string name="settings_always_on_display">Pantalla siempre activa</string>
|
||||
<string name="settings_allow_playlist_duplicates_summary">Si está habilitada, no se comprobará si hay pistas repetidas cuando se añadan a la lista.</string>
|
||||
<string name="settings_allow_playlist_duplicates_summary">Si se habilita, no se comprobará si hay pistas repetidas cuando se añadan a la lista.</string>
|
||||
<string name="settings_audio_transcode_download_format">Formato de transcodificación</string>
|
||||
<string name="settings_audio_transcode_download_priority_summary">Si está habilitada, Tempus no descargará la pista con las opciones de transcodificación que aparecen a continuación.</string>
|
||||
<string name="settings_audio_transcode_download_priority_summary">Si se habilita, Tempus no descargará la pista con las opciones de transcodificación que aparecen a continuación.</string>
|
||||
<string name="settings_audio_transcode_download_priority_title">Dar prioridad a las opciones del servidor usadas para el streaming en las descargas</string>
|
||||
<string name="settings_audio_transcode_download_summary">Si está habilitada, Tempus descargará las pistas transcodificadas.</string>
|
||||
<string name="settings_audio_transcode_download_summary">Si se habilita, Tempus descargará las pistas transcodificadas.</string>
|
||||
<string name="settings_audio_transcode_download_title">Descargas pistas transcodificadas</string>
|
||||
<string name="settings_audio_transcode_estimate_content_length_summary">Si está habilitada, se pedirá al servidor la duración estimada de la pista.</string>
|
||||
<string name="settings_audio_transcode_estimate_content_length_summary">Si se habilita, se pedirá al servidor la duración estimada de la pista.</string>
|
||||
<string name="settings_audio_transcode_estimate_content_length_title">Calcular la duración del contenido</string>
|
||||
<string name="settings_audio_transcode_format_download">Formato de transcodificación para las descargas</string>
|
||||
<string name="settings_audio_transcode_format_mobile">Formato de transcodificación en red de datos móviles</string>
|
||||
<string name="settings_audio_transcode_format_wifi">Formato de transcodificación en red Wi-Fi</string>
|
||||
<string name="settings_audio_transcode_priority_summary">Si está habilitada, Tempus no reproducirá la pista con las opciones de transcodificación que aparecen a continuación.</string>
|
||||
<string name="settings_audio_transcode_priority_summary">Si se habilita, Tempus no reproducirá la pista con las opciones de transcodificación que aparecen a continuación.</string>
|
||||
<string name="settings_audio_transcode_priority_title">Dar prioridad a las opciones de transcodificación del servidor</string>
|
||||
<string name="settings_audio_transcode_priority_toast">Prioridad a la hora de transcodificar una pista</string>
|
||||
<string name="settings_buffering_strategy">Estrategia de buffer</string>
|
||||
<string name="settings_buffering_strategy_summary">Para que los cambios surtan efecto, debes reinciar la app.</string>
|
||||
<string name="settings_buffering_strategy_summary">Para que los cambios surtan efecto, debes reiniciar la app.</string>
|
||||
<string name="settings_choose_download_folder">Elige una carpeta para descargar los archivos de música</string>
|
||||
<string name="settings_clear_download_folder">Limpiar la carpeta de descargas</string>
|
||||
<string name="settings_continuous_play_summary">Permite que la música siga reproduciéndose una vez que la lista de reproducción ha terminado, reproduciendo pistas similares</string>
|
||||
<string name="settings_continuous_play_title">Reproducción continua</string>
|
||||
<string name="settings_covers_cache">Tamaño de la caché de portadas de álbumes</string>
|
||||
<string name="settings_data_saving_mode_summary">Evitar descargar las portadas de álbumes para reducir el uso de datos</string>
|
||||
<string name="settings_data_saving_mode_title">Limitr el uso de datos móviles</string>
|
||||
<string name="settings_data_saving_mode_title">Limitar el uso de datos móviles</string>
|
||||
<string name="settings_delete_download_storage_summary">Al continuar se eliminarán de forma irreversible todos los elementos guardados.</string>
|
||||
<string name="settings_delete_download_storage_title">Eliminar elementos guardados</string>
|
||||
<string name="settings_download_storage_title">Almacenamiento de descargas</string>
|
||||
@@ -325,21 +330,22 @@
|
||||
<string name="settings_max_bitrate_wifi">Tasa de bits en Wi-Fi</string>
|
||||
<string name="settings_media_cache">Tamaño de la caché multimedia</string>
|
||||
<string name="settings_music_directory">Mostrar carpetas de música</string>
|
||||
<string name="settings_music_directory_summary">Si está habilitada, se mostrará la sección de carpetas de música. Tenga en cuenta que para que la navegación funcione correctamente, el servidor debe soportar esta característica.</string>
|
||||
<string name="settings_music_directory_summary">Si se habilita, se mostrará la sección de carpetas de música. Tenga en cuenta que para que la navegación funcione correctamente, el servidor debe soportar esta característica.</string>
|
||||
<string name="settings_podcast">Mostrar pódcasts</string>
|
||||
<string name="settings_podcast_summary">Si está habilitada, se mostrará la sección de pódcasts. Reinicia la aplicación para que los cambios surtan efecto.</string>
|
||||
<string name="settings_podcast_summary">Si se habilita, se mostrará la sección de pódcasts. Reinicia la aplicación para que los cambios surtan efecto.</string>
|
||||
<string name="settings_playlist_sort">Ordenar listas de reproducción</string>
|
||||
<string name="settings_audio_quality">Mostrar calidad de audio</string>
|
||||
<string name="settings_audio_quality_summary">La tasa de bits y el formato de audio se mostrarán para cada pista de audio.</string>
|
||||
<string name="settings_song_rating_summary">Si está habilitada, muestra la valoración de la pista como barra de 5 estrellas en la página del control de reproducción.\n\n*Requiere reiniciar la aplicación</string>
|
||||
<string name="settings_song_rating_summary">Si se habilita, muestra la valoración de la pista como barra de 5 estrellas en la página del control de reproducción.\n\n*Requiere reiniciar la aplicación</string>
|
||||
<string name="settings_item_rating">Mostrar valoración de los elementos</string>
|
||||
<string name="settings_queue_syncing_title">Sincronizar cola de reproducción para este usuario</string>
|
||||
<string name="settings_show_mini_shuffle_button_summary">Si está habilitada, muestra el botón de reproducción aleatoria y oculta el botón de «Favoritos» en el minirreproductor</string>
|
||||
<string name="settings_show_mini_shuffle_button_summary">Si se habilita, muestra el botón de reproducción aleatoria y oculta el botón de «Favoritos» en el minirreproductor.</string>
|
||||
<string name="settings_radio">Mostrar emisoras de radio</string>
|
||||
<string name="settings_auto_download_lyrics_summary">Descargar las letras automáticamente cuando estén disponibles para que se puedan mostrar cuando no hay conexión.</string>
|
||||
<string name="settings_replay_gain">Configurar el modo de ganancia de reproducción</string>
|
||||
<string name="settings_rounded_corner">Esquinas redondeadas</string>
|
||||
<string name="settings_rounded_corner_size">Tamaño de las esquinas</string>
|
||||
<string name="settings_rounded_corner_summary">Si está habilitada, establece un ángulo de curvatura para todas las portadas de álbumes. Los cambios se aplicarán después de reiniciar la app.</string>
|
||||
<string name="settings_rounded_corner_summary">Si se habilita, establece un ángulo de curvatura para todas las portadas de álbumes. Los cambios se aplicarán después de reiniciar la app.</string>
|
||||
<string name="settings_scan_title">Escanear biblioteca</string>
|
||||
<string name="streaming_cache_storage_dialog_summary">Cambiar la ubicación de los archivos en caché a otro almacenamiento puede causar el borrado de todos los archivos en caché en el anterior almacenamiento.</string>
|
||||
<string name="streaming_cache_storage_dialog_title">Seleccióna un tipo de almacenamiento</string>
|
||||
@@ -368,10 +374,10 @@
|
||||
<string name="settings_summary_streaming_cache_size">%1$s\nEn uso: %2$s MiB</string>
|
||||
<string name="undraw_url">https://undraw.co/</string>
|
||||
<string name="track_info_track_number">Número de pista</string>
|
||||
<string name="settings_item_rating_summary">Si está habilitada, se mostrará la valoración del elemento y si está marcado como favorito.</string>
|
||||
<string name="settings_item_rating_summary">Si se habilita, se mostrará la valoración del elemento y si está marcado como favorito.</string>
|
||||
<string name="settings_queue_syncing_countdown">Temporizador de sincronización</string>
|
||||
<string name="settings_queue_syncing_summary">Si está habilitada, el usuario podrá guardar la cola de reproducción y restaurarla cuando abra la aplicación.</string>
|
||||
<string name="settings_radio_summary">Si está habilitada, se mostrará la sección de emisoras de radio. Reinicia la app para que los cambios surtan efecto.</string>
|
||||
<string name="settings_queue_syncing_summary">Si se habilita, el usuario podrá guardar la cola de reproducción y restaurarla cuando abra la aplicación.</string>
|
||||
<string name="settings_radio_summary">Si se habilita, se mostrará la sección de emisoras de radio. Reinicia la app para que los cambios surtan efecto.</string>
|
||||
<string name="settings_rounded_corner_size_summary">Establece la proporción del ángulo de curvatura.</string>
|
||||
<string name="track_info_dialog_title">Información de la pista</string>
|
||||
<string name="track_info_disc_number">Número de disco</string>
|
||||
@@ -443,10 +449,10 @@
|
||||
<string name="starred_sync_dialog_title">Sincronizar las pistas destacadas</string>
|
||||
<string name="starred_album_sync_dialog_title">Sincronizar álbumes favoritos</string>
|
||||
<string name="streaming_cache_storage_dialog_sub_summary">Para que los cambios tengan efecto, reinicia la app.</string>
|
||||
<string name="settings_summary_transcoding_download">Descarga los archivos multimedia transcodificados. Si esta opción está habilitada, no se usará el endpoint de descarga, sino las siguientes opciones.\n\nSi el formato de transcodificación para las descargas se establece en \"Descarga directa\", no se modificará la tasa de bits del archivo.</string>
|
||||
<string name="settings_summary_transcoding_download">Descarga los archivos multimedia transcodificados. Si se habilita, no se usará el endpoint de descarga, sino las siguientes opciones.\n\nSi el formato de transcodificación para las descargas se establece en \"Descarga directa\", no se modificará la tasa de bits del archivo.</string>
|
||||
<string name="settings_summary_transcoding_estimate_content_length">Cuando el archivo se transcodifica en tiempo real, el cliente normalmente no muestra la duración de la pista. Es posible solicitar a los servidores que soporten esta característica, que calculen la duración de la pista que se está reproduciendo, pero los tiempos de respuesta podrían aumentar.</string>
|
||||
<string name="settings_sync_starred_albums_for_offline_use_title">Sincronizar álbumes favoritos para uso sin conexión</string>
|
||||
<string name="settings_sync_starred_tracks_for_offline_use_summary">Si está habilitada, las pistas destacadas se descargarán para uso sin conexión.</string>
|
||||
<string name="settings_sync_starred_tracks_for_offline_use_summary">Si se habilita, las pistas destacadas se descargarán para uso sin conexión.</string>
|
||||
<string name="track_info_summary_downloaded_file">El archivo se ha descargado usando las APIs de Subsonic. El códec y la tasa de bits del archivo se mantienen sin cambios respecto al archivo de origen.</string>
|
||||
<string name="track_info_summary_full_transcode">La aplicación pedirá al servidor transcodificar el archivo y modificar su tasa de bits. El códec pedido por el usuario es %1$s, con una tasa de bits de %2$s. Cualquier cambio en el códec y tasa de bits del archivo en el formato elegido será manejado por el servidor, que puede, o no, soportar esta operación.</string>
|
||||
<string name="track_info_summary_original_file">La aplicación solo leerá el archivo original ofrecido por el servidor. La app pedirá al servidor, de forma explícita, el archivo sin transcodificar con la tasa de bits de origen.</string>
|
||||
@@ -456,7 +462,7 @@
|
||||
<string name="settings_song_rating">Mostrar valoración de las pistas</string>
|
||||
<string name="home_sync_starred_albums_title">Sincronizar álbumes favoritos</string>
|
||||
<string name="settings_sync_starred_artists_for_offline_use_title">Sincronizar artistas destacados para uso sin conexión</string>
|
||||
<string name="settings_sync_starred_albums_for_offline_use_summary">Si está habilitada, los álbumes favoritos se descargarán para uso sin conexión.</string>
|
||||
<string name="settings_sync_starred_albums_for_offline_use_summary">Si se habilita, los álbumes favoritos se descargarán para uso sin conexión.</string>
|
||||
<string name="starred_artist_sync_dialog_title">Sincronizar artistas destacados</string>
|
||||
<string name="starred_album_sync_dialog_summary">Descargar los álbumes favoritos puede consumir una gran cantidad de datos.</string>
|
||||
<string name="equalizer_fragment_title">Ecualizador</string>
|
||||
@@ -479,6 +485,7 @@
|
||||
<string name="widget_content_desc_prev">Pista anterior</string>
|
||||
<string name="download_refresh_no_directory">Establece una carpeta de descarga para actualizar tus descargas</string>
|
||||
<string name="home_sync_starred_artists_title">Sincronizar artistas destacados</string>
|
||||
<string name="player_queue_load_queue">Cargar cola de reproducción</string>
|
||||
<string name="player_lyrics_download_content_description">Descargar letras para uso sin conexión</string>
|
||||
<string name="player_lyrics_downloaded_content_description">Letras descargadas para uso sin conexión</string>
|
||||
<string name="player_lyrics_download_success">Letra guardada para uso sin conexión</string>
|
||||
@@ -488,13 +495,13 @@
|
||||
<string name="settings_show_mini_shuffle_button">Mostrar el botón «Aleatorio»</string>
|
||||
<string name="settings_auto_download_lyrics">Descargar automáticamente las letras</string>
|
||||
<string name="starred_artist_sync_dialog_summary">Descargar los artistas destacados podría consumir una gran cantidad de datos.</string>
|
||||
<string name="settings_sync_starred_artists_for_offline_use_summary">Si está habilitada, los artistas destacados se descargarán para uso sin conexión.</string>
|
||||
<string name="settings_sync_starred_artists_for_offline_use_summary">Si se habilita, los artistas destacados se descargarán para uso sin conexión.</string>
|
||||
<string name="widget_time_elapsed_placeholder">0:00</string>
|
||||
<string name="exo_controls_heart_off_description">Eliminar de favoritos</string>
|
||||
<string name="asset_link_chip_text">%1$s • %2$s</string>
|
||||
<string name="asset_link_copied_toast">Copiado %1$s al portapapeles</string>
|
||||
<string name="settings_album_detail">Mostrar los detalles del álbum</string>
|
||||
<string name="settings_album_detail_summary">Si está habilitada, muestra los detalles del álbum, como el género, el número de pistas, etc. en la página de álbum</string>
|
||||
<string name="settings_album_detail_summary">Si se habilita, muestra los detalles del álbum, como el género, el número de pistas, etc. en la página de álbum</string>
|
||||
<string name="asset_link_clipboard_label">Enlace de recurso de Tempus</string>
|
||||
<string name="asset_link_label_song">UID de la pista</string>
|
||||
<string name="asset_link_label_album">UID del álbum</string>
|
||||
@@ -509,6 +516,14 @@
|
||||
<string name="asset_link_error_artist">No se ha podido abrir el artista</string>
|
||||
<string name="asset_link_error_playlist">No se ha podido abrir la lista de reproducción</string>
|
||||
<string name="settings_github_update">Actualizaciones</string>
|
||||
<string name="bottom_sheet_generating_instant_mix">Generando mix instantáneo…</string>
|
||||
<string name="player_queue_save_to_playlist">Guardar cola en una lista de reproducción</string>
|
||||
<string name="radio_editor_dialog_added">Emisora de radio añadida</string>
|
||||
<string name="settings_artist_sort_by_album_count">Ordenar artistas por número de álbumes</string>
|
||||
<string name="settings_artist_sort_by_album_count_summary">Ordena los artistas por número de álbumes si la opción está habilitada. Si no, los ordena por nombre.</string>
|
||||
<string name="settings_artist_sort_by_album_count_summary">Si se habilita, ordena los artistas por número de álbumes. En caso contrario, se ordenan por nombre.</string>
|
||||
<string name="folder_play_collecting">Obteniendo pistas de la carpeta…</string>
|
||||
<string name="folder_play_playing">Reproduciendo %d pistas</string>
|
||||
<string name="folder_play_no_songs">No se encontraron pistas en la carpeta</string>
|
||||
<string name="search_sort_title">Ordenar las búsquedas recientes cronológicamente</string>
|
||||
<string name="search_sort_summary">Si se habilita, se ordenan las búsquedas en orden cronológico. En caso contrario, se ordenan por nombre.</string>
|
||||
</resources>
|
||||
@@ -39,6 +39,7 @@
|
||||
<string name="artist_list_page_downloaded">Artistes téléchargés</string>
|
||||
<string name="artist_list_page_starred">Artistes favoris</string>
|
||||
<string name="artist_list_page_title">Artistes</string>
|
||||
<string name="artist_no_artist_info_toast">Pas d\'autre information sur l\'artiste</string>
|
||||
<string name="artist_page_radio_button">Radio</string>
|
||||
<string name="artist_page_shuffle_button">Mélanger</string>
|
||||
<string name="artist_page_switch_layout_button">Changer la disposition</string>
|
||||
@@ -51,6 +52,8 @@
|
||||
<string name="battery_optimization_negative_button">Ignorer</string>
|
||||
<string name="battery_optimization_neutral_button">Ne pas me redemander</string>
|
||||
<string name="battery_optimization_positive_button">Désactiver</string>
|
||||
<string name="bottom_sheet_generating_instant_mix">Génération du mix instantané…</string>
|
||||
<string name="bottom_sheet_problem_generating_instant_mix">Echec de récupération de pistes du serveur Subsonic.</string>
|
||||
<string name="connection_alert_dialog_negative_button">Annuler</string>
|
||||
<string name="connection_alert_dialog_neutral_button">Activer l\'économie de données</string>
|
||||
<string name="connection_alert_dialog_positive_button">OK</string>
|
||||
@@ -68,6 +71,7 @@
|
||||
<string name="download_directory_dialog_positive_button">Télécharger</string>
|
||||
<string name="download_directory_dialog_summary">Toutes les pistes dans ce dossier seront téléchargées. Les pistes dans les sous-dossiers ne seront pas téléchargées.</string>
|
||||
<string name="download_directory_dialog_title">Télécharger toutes les pistes.</string>
|
||||
<string name="download_directory_set">Répertoire de téléchargement de la musique</string>
|
||||
<string name="download_info_empty_subtitle">Dès que vous téléchargerez une musique, vous la trouverez ici</string>
|
||||
<string name="download_info_empty_title">Aucun téléchargement pour l\'instant</string>
|
||||
<string name="download_item_multiple_subtitle_formatter">%1$s • %2$s éléments</string>
|
||||
@@ -78,7 +82,15 @@
|
||||
<string name="download_storage_dialog_title">Sélectionnez l\'option de stockage</string>
|
||||
<string name="download_storage_external_dialog_positive_button">Externe</string>
|
||||
<string name="download_storage_internal_dialog_negative_button">Interne</string>
|
||||
<string name="download_storage_directory_dialog_neutral_button">Répertoire</string>
|
||||
<string name="download_title_section">Téléchargements</string>
|
||||
<string name="download_refresh_no_directory">Sélectionner un répertoire pour rafraîchir vos téléchargements.</string>
|
||||
<string name="download_refresh_no_changes">Aucun téléchargement manquant détecté.</string>
|
||||
<plurals name="download_refresh_removed">
|
||||
<item quantity="one">%d téléchargement manquant retiré.</item>
|
||||
<item quantity="other">%d téléchargements manquants retirés.</item>
|
||||
</plurals>
|
||||
<string name="download_refresh_button_content_description">Rafraîchir les téléchargements</string>
|
||||
<string name="downloaded_bottom_sheet_add_to_queue">Ajouter à la liste d\'attente</string>
|
||||
<string name="downloaded_bottom_sheet_play_next">Lire juste après</string>
|
||||
<string name="downloaded_bottom_sheet_remove">Retirer</string>
|
||||
@@ -88,6 +100,9 @@
|
||||
<string name="error_required">Requis</string>
|
||||
<string name="error_server_prefix">préfixe http ou https requis</string>
|
||||
<string name="exo_download_notification_channel_name">Téléchargements</string>
|
||||
<string name="exo_controls_heart_off_description">Désactiver les boutons Cœur</string>
|
||||
<string name="exo_controls_heart_on_description">Activer les boutons Cœur</string>
|
||||
<string name="cast_expanded_controller_loading">Chargement…</string>
|
||||
<string name="filter_info_selection">Sélectionnez deux filtres ou plus</string>
|
||||
<string name="filter_title">Filtrer</string>
|
||||
<string name="filter_artist">Filtrer par artiste</string>
|
||||
@@ -118,7 +133,13 @@
|
||||
<string name="home_sync_starred_subtitle">Télécharger ces titres peut entraîner une utilisation importante de données</string>
|
||||
<string name="home_sync_starred_title">On dirait qu\'il y a des titres favoris à synchroniser</string>
|
||||
<string name="home_sync_starred_albums_title">Synchroniser les albums favoris</string>
|
||||
<string name="home_sync_starred_albums_subtitle">Les albums marqués d\'une étoile seront disponibles hors-ligne</string>
|
||||
<string name="home_sync_starred_albums_subtitle">Les albums favoris seront disponibles hors-ligne</string>
|
||||
<string name="home_sync_starred_artists_title">Synchroniser les artistes favoris</string>
|
||||
<string name="home_sync_starred_artists_subtitle">Pour certains de vos artistes favoris, il reste des titres à télécharger</string>
|
||||
<plurals name="home_sync_starred_songs_count">
|
||||
<item quantity="one">%d titre doit être synchronisé</item>
|
||||
<item quantity="other">%d titres doivent être synchronisés</item>
|
||||
</plurals>
|
||||
<string name="home_title_best_of">Best of</string>
|
||||
<string name="home_title_discovery">Découverte</string>
|
||||
<string name="home_title_discovery_shuffle_all_button">Tout mélanger</string>
|
||||
@@ -184,6 +205,7 @@
|
||||
<string name="menu_sort_artist">Artiste</string>
|
||||
<string name="menu_sort_name">Nom</string>
|
||||
<string name="menu_sort_random">Aléatoire</string>
|
||||
<string name="menu_sort_album_count">Nombre d\'albums</string>
|
||||
<string name="menu_sort_recently_added">Récemment ajoutés</string>
|
||||
<string name="menu_sort_recently_played">Récemment lus</string>
|
||||
<string name="menu_sort_most_played">Plus lus</string>
|
||||
@@ -195,6 +217,12 @@
|
||||
<string name="player_playback_speed">%1$.2fx</string>
|
||||
<string name="player_queue_clean_all_button">Vider la file d\'attente</string>
|
||||
<string name="player_queue_save_queue_success">File d\'attente sauvegardée</string>
|
||||
<string name="player_queue_save_to_playlist">Sauvegarder la file d\'attente dans une playlist</string>
|
||||
<string name="player_queue_load_queue">Charger la file d\'attente</string>
|
||||
<string name="player_lyrics_download_content_description">Télécharger les paroles pour lecture hors-ligne</string>
|
||||
<string name="player_lyrics_downloaded_content_description">Paroles téléchargées pour lecture hors-ligne</string>
|
||||
<string name="player_lyrics_download_success">Paroles sauvegardées pour lecture hors-ligne.</string>
|
||||
<string name="player_lyrics_download_failure">Impossible de télécharger les paroles.</string>
|
||||
<string name="player_server_priority">Priorité serveur</string>
|
||||
<string name="player_unknown_format">Format inconnu</string>
|
||||
<string name="player_transcoding">Transcodage</string>
|
||||
@@ -207,6 +235,7 @@
|
||||
<string name="playlist_chooser_dialog_title">Ajouter à une playlist</string>
|
||||
<string name="playlist_chooser_dialog_toast_add_success">Titre ajouté à la playlist</string>
|
||||
<string name="playlist_chooser_dialog_toast_add_failure">Échec d\'ajout du titre à la playlist</string>
|
||||
<string name="playlist_chooser_dialog_toast_all_skipped">Tous les titres ont été traités comme des doublons et ignorés</string>
|
||||
<string name="playlist_counted_tracks">%1$d titres • %2$s</string>
|
||||
<string name="playlist_duration">Durée • %1$s</string>
|
||||
<string name="playlist_editor_dialog_action_delete_toast">Appui long pour supprimer</string>
|
||||
@@ -228,13 +257,14 @@
|
||||
<string name="podcast_channel_catalogue_title_expanded">Parcourir les chaînes</string>
|
||||
<string name="podcast_channel_editor_dialog_hint_rss_url">Url RSS</string>
|
||||
<string name="podcast_channel_editor_dialog_title">Chaîne</string>
|
||||
<string name="podcast_channel_not_supported_snackbar">Ce serveur ne supporte pas les podcasts.</string>
|
||||
<string name="podcast_channel_page_title_description_section">Description</string>
|
||||
<string name="podcast_channel_page_title_episode_section">Épisodes</string>
|
||||
<string name="podcast_channel_page_title_no_episode_available">Aucun épisode disponible</string>
|
||||
<string name="podcast_episode_download_request_snackbar">Votre requête a été envoyée au serveur</string>
|
||||
<string name="podcast_info_empty_button">Cliquez pour cacher la section\nLes changements seront visibles au redémarrage de l\'app</string>
|
||||
<string name="podcast_info_empty_subtitle">Dès que vous ajouterez une chaîne, vous la retrouverez ici</string>
|
||||
<string name="podcast_info_empty_title">Aucun podcast trouvé!</string>
|
||||
<string name="podcast_info_empty_title">Aucun podcast trouvé !</string>
|
||||
<string name="podcast_release_date_duration_formatter">%1$s • %2$s</string>
|
||||
<string name="radio_editor_dialog_hint_homepage_url">URL de la page d\'accueil de la radio</string>
|
||||
<string name="radio_editor_dialog_hint_name">Nom de la radio</string>
|
||||
@@ -242,10 +272,13 @@
|
||||
<string name="radio_editor_dialog_negative_button">Annuler</string>
|
||||
<string name="radio_editor_dialog_neutral_button">Supprimer</string>
|
||||
<string name="radio_editor_dialog_positive_button">Enregistrer</string>
|
||||
<string name="radio_editor_dialog_title">Station Radio Internet</string>
|
||||
<string name="radio_editor_dialog_added">Station de radio ajoutée</string>
|
||||
<string name="radio_editor_dialog_updated">Station de radio modifiée</string>
|
||||
<string name="radio_editor_dialog_title">Station de radio Internet</string>
|
||||
<string name="radio_station_info_empty_button">Cliquez pour cacher la section\nLes changements seront visibles au redémarrage de l\'app</string>
|
||||
<string name="radio_station_info_empty_subtitle">Dès que vous ajouterez une station radio, vous la retrouverez ici</string>
|
||||
<string name="radio_station_info_empty_title">Aucune station trouvée!</string>
|
||||
<string name="radio_station_info_empty_title">Aucune station trouvée !</string>
|
||||
<string name="radio_dialog_not_supported_snackbar">Ce serveur ne supporte pas la gestion de radios Internet.</string>
|
||||
<string name="rating_dialog_negative_button">Annuler</string>
|
||||
<string name="rating_dialog_positive_button">Enregistrer</string>
|
||||
<string name="rating_dialog_title">Noter</string>
|
||||
@@ -273,6 +306,8 @@
|
||||
<string name="settings_about_summary">Tempus est un client open source et léger pour Subsonic, développé et compilé nativement pour Android.</string>
|
||||
<string name="settings_about_title">À propos</string>
|
||||
<string name="settings_always_on_display">Toujours visible</string>
|
||||
<string name="settings_allow_playlist_duplicates">Autoriser l\'ajout de doublons à une playlist</string>
|
||||
<string name="settings_allow_playlist_duplicates_summary">Si activé, les doublons ne seront pas détectés à l\'ajout d\'un titre à une playlist.</string>
|
||||
<string name="settings_audio_transcode_download_format">Format de transcodage</string>
|
||||
<string name="settings_audio_transcode_download_priority_summary">Si activé, Tempus ne forcera pas le téléchargement de la piste avec les paramètres de transcodage ci-dessous.</string>
|
||||
<string name="settings_audio_transcode_download_priority_title">Prioriser les paramètres du serveurs, utilisés pour le streaming, dans les téléchargements</string>
|
||||
@@ -288,6 +323,8 @@
|
||||
<string name="settings_audio_transcode_priority_toast">La priorité au transcodage de la piste est donnée au serveur</string>
|
||||
<string name="settings_buffering_strategy">Stratégie de mise en mémoire tampon</string>
|
||||
<string name="settings_buffering_strategy_summary">Redémarrez l\'application pour appliquer les changements.</string>
|
||||
<string name="settings_choose_download_folder">Sélectionner un répertoire pour le téléchargement des fichiers de musique</string>
|
||||
<string name="settings_clear_download_folder">Vider le répertoire de téléchargement</string>
|
||||
<string name="settings_continuous_play_summary">Permet de prolonger la lecture après la fin d\'une playlist avec des titres similaires</string>
|
||||
<string name="settings_continuous_play_title">Lecture continue</string>
|
||||
<string name="settings_covers_cache">Taille du cache des illustrations</string>
|
||||
@@ -296,16 +333,26 @@
|
||||
<string name="settings_delete_download_storage_summary">Continuer entraînera la suppression irréversible de tous les éléments sauvegardés.</string>
|
||||
<string name="settings_delete_download_storage_title">Supprimer les éléments sauvegardés</string>
|
||||
<string name="settings_download_storage_title">Stockage des téléchargements</string>
|
||||
<string name="settings_system_equalizer_summary">Ajuster les paramètres audios</string>
|
||||
<string name="settings_download_folder_cleared">Répertoire de téléchargement vidé.</string>
|
||||
<string name="settings_download_folder_set">Répertoire de téléchargement réglé</string>
|
||||
<string name="settings_set_download_folder">Régler le répertoire de téléchargement</string>
|
||||
<string name="settings_system_equalizer_summary">Ajuster les paramètres audio</string>
|
||||
<string name="settings_system_equalizer_title">Égaliseur du système</string>
|
||||
<string name="settings_github_link">https://github.com/eddyizm/tempus</string>
|
||||
<string name="settings_github_summary">Suivre le développement</string>
|
||||
<string name="settings_github_title">Github</string>
|
||||
<string name="settings_support_discussion_link">https://github.com/eddyizm/tempus/discussions</string>
|
||||
<string name="settings_github_update">Mises à jour</string>
|
||||
<string name="settings_github_update_title">Vérifier les mises à jour sur Github</string>
|
||||
<string name="settings_github_update_summary">Si vous utilisez l\'app publiée sur Github, elle vérifiera par défaut les sorties de nouvelles versions. Cliquer ici pour désactiver les vérifications automatiques</string>
|
||||
<string name="settings_support_summary">Rejoindre les discussions et le support de la communauté</string>
|
||||
<string name="settings_support_title">Support utilisateur</string>
|
||||
<string name="settings_scan_result">Analyse : comptage de %1$d pistes</string>
|
||||
<string name="settings_image_size">Définir la résolution des images</string>
|
||||
<string name="settings_language">Langue</string>
|
||||
<string name="settings_logout_title">Se déconnecter</string>
|
||||
<string name="settings_max_bitrate_download">Débit binaire pour les téléchargements</string>
|
||||
<string name="settings_max_bitrate_mobile">Débit binaire en données mobile</string>
|
||||
<string name="settings_max_bitrate_mobile">Débit binaire en données mobiles</string>
|
||||
<string name="settings_max_bitrate_wifi">Débit binaire en Wi-Fi</string>
|
||||
<string name="settings_media_cache">Taille du cache des fichiers audio</string>
|
||||
<string name="settings_music_directory">Afficher les dossiers</string>
|
||||
@@ -320,14 +367,18 @@
|
||||
<string name="settings_item_rating_summary">Si activé, la note et le statut de mise en favori de l\'élément seront affichés.</string>
|
||||
<string name="settings_queue_syncing_countdown">Minuteur de synchronisation</string>
|
||||
<string name="settings_queue_syncing_summary">Si activé, l\'utilisateur pourra sauvegarder sa file d\'attente et la recharger au démarrage de l\'application.</string>
|
||||
<string name="settings_queue_syncing_title">Synchroniser la file d\'attente pour cet utilisateur</string>
|
||||
<string name="settings_queue_syncing_title">Synchroniser la file d\'attente pour cet utilisateur [fonctionnalité en évolution]</string>
|
||||
<string name="settings_show_mini_shuffle_button">Afficher le bouton Mélanger</string>
|
||||
<string name="settings_show_mini_shuffle_button_summary">Si activé, le bouton Mélanger sera visible et le bouton Cœur caché sur le mini-lecteur</string>
|
||||
<string name="settings_radio">Voir les radios</string>
|
||||
<string name="settings_radio_summary">Si activé, rend visible la section Radio</string>
|
||||
<string name="settings_radio_summary">Si activé, rend visible la section Radio. Redémarrez l\'application pour appliquer ce paramètre.</string>
|
||||
<string name="settings_auto_download_lyrics">Téléchargement automatique des paroles</string>
|
||||
<string name="settings_auto_download_lyrics_summary">Ce paramètre active la sauvegarde automatique des paroles pour affichage hors-ligne, si elles sont disponibles.</string>
|
||||
<string name="settings_replay_gain">Ajuster le Replay Gain</string>
|
||||
<string name="settings_rounded_corner">Coins arrondis</string>
|
||||
<string name="settings_rounded_corner_size">Taille des arrondis</string>
|
||||
<string name="settings_rounded_corner_size_summary">Définit l\'ampleur de l\'angle de courbure.</string>
|
||||
<string name="settings_rounded_corner_summary">Si activé, arrondi les angles des illustrations. Les modifications prendront effet au redémarrage.</string>
|
||||
<string name="settings_rounded_corner_summary">Si activé, arrondit les angles des illustrations. Les modifications prendront effet au redémarrage.</string>
|
||||
<string name="settings_scan_title">Scanner la bibliothèque</string>
|
||||
<string name="settings_scrobble_title">Activer le scrobbling</string>
|
||||
<string name="settings_system_language">Langue du système</string>
|
||||
@@ -344,13 +395,16 @@
|
||||
<string name="settings_summary_transcoding">Le mode de transcodage à prioriser. Si réglé sur \"Lecture directe\", le débit binaire du fichier ne sera pas modifié.</string>
|
||||
<string name="settings_summary_transcoding_download">Télécharge les médias transcodés. Si activé, les paramètres de transcodage suivants seront utilisés pour les téléchargements.\n\n Si le format de transcodage est reglé à \"Téléchargement direct\", le débit binaire du fichier ne sera pas modifé.</string>
|
||||
<string name="settings_summary_transcoding_estimate_content_length">Quand le fichier est transcodé à la volée, en général, le client n\'affiche pas la durée de la piste. Il est possible de demander aux serveurs qui le supportent d\'estimer la durée de la piste écoutée, mais les temps de réponses peuvent être plus longs.</string>
|
||||
<string name="settings_sync_starred_albums_for_offline_use_summary">Si activé, les albums favoris seront téléchargés pour l\'écoute hors-ligne</string>
|
||||
<string name="settings_sync_starred_artists_for_offline_use_summary">Si activé, les titres des artistes favoris seront téléchargés pour l\'écoute hors-ligne.</string>
|
||||
<string name="settings_sync_starred_artists_for_offline_use_title">Synchronisation des artistes favoris pour écoute hors-ligne</string>
|
||||
<string name="settings_sync_starred_albums_for_offline_use_summary">Si activé, les albums favoris seront téléchargés pour l\'écoute hors-ligne.</string>
|
||||
<string name="settings_sync_starred_albums_for_offline_use_title">Synchronisation des albums favoris pour écoute hors-ligne</string>
|
||||
<string name="settings_sync_starred_tracks_for_offline_use_summary">Si activé, les pistes favorites seront téléchargées pour l\'écoute hors-ligne</string>
|
||||
<string name="settings_sync_starred_tracks_for_offline_use_summary">Si activé, les pistes favorites seront téléchargées pour l\'écoute hors-ligne.</string>
|
||||
<string name="settings_sync_starred_tracks_for_offline_use_title">Synchronisation des pistes favorites pour écoute hors-ligne</string>
|
||||
<string name="settings_theme">Thème</string>
|
||||
<string name="settings_title_data">Données</string>
|
||||
<string name="settings_title_general">Géneral</string>
|
||||
<string name="settings_title_playlist">Playlist</string>
|
||||
<string name="settings_title_rating">Note</string>
|
||||
<string name="settings_title_replay_gain">Replay Gain</string>
|
||||
<string name="settings_title_scrobble">Scrobble</string>
|
||||
@@ -369,7 +423,24 @@
|
||||
<string name="share_bottom_sheet_delete">Supprimer le partage</string>
|
||||
<string name="share_bottom_sheet_update">Mettre à jour le partage</string>
|
||||
<string name="share_subtitle_item">Date d\'expiration : %1$s</string>
|
||||
<string name="share_no_expiration">Jamais</string>
|
||||
<string name="share_unsupported_error">Le partage n\'est pas supporté ou pas activé</string>
|
||||
<string name="asset_link_clipboard_label">Lien ressource Tempus</string>
|
||||
<string name="asset_link_label_song">UID titre</string>
|
||||
<string name="asset_link_label_album">UID album</string>
|
||||
<string name="asset_link_label_artist">UID artiste</string>
|
||||
<string name="asset_link_label_playlist">UID playlist</string>
|
||||
<string name="asset_link_label_genre">UID genre</string>
|
||||
<string name="asset_link_label_year">UID année</string>
|
||||
<string name="asset_link_label_unknown">UID ressource</string>
|
||||
<string name="asset_link_error_unsupported">Lien ressource non supportée</string>
|
||||
<string name="asset_link_error_song">Echec d\'accès au titre</string>
|
||||
<string name="asset_link_error_album">Echec d\'accès à l\'album</string>
|
||||
<string name="asset_link_error_artist">Echec d\'accès à l\'artiste</string>
|
||||
<string name="asset_link_error_playlist">Echec d\'accès à la playlist</string>
|
||||
<string name="asset_link_chip_text">%1$s • %2$s</string>
|
||||
<string name="asset_link_copied_toast">%1$s ressource(s) copiée(s) dans le presse-papier</string>
|
||||
<string name="asset_link_debug_toast">Lien ressource : %1$s</string>
|
||||
<string name="share_update_dialog_hint_description">Description</string>
|
||||
<string name="share_update_dialog_hint_expiration_date">Date d\'expiration</string>
|
||||
<string name="share_update_dialog_negative_button">Annuler</string>
|
||||
@@ -400,7 +471,9 @@
|
||||
<string name="starred_sync_dialog_positive_button">Continuer et télécharger</string>
|
||||
<string name="starred_sync_dialog_summary">Le téléchargement des titres favoris pourrait consommer beaucoup de données.</string>
|
||||
<string name="starred_sync_dialog_title">Synchroniser les titres favoris</string>
|
||||
<string name="starred_album_sync_dialog_summary">Le téléchargement des titres favoris pourrait consommer beaucoup de données.</string>
|
||||
<string name="starred_artist_sync_dialog_summary">Le téléchargement des titres d\'artistes favoris pourrait consommer beaucoup de données.</string>
|
||||
<string name="starred_artist_sync_dialog_title">Synchroniser les artistes favoris</string>
|
||||
<string name="starred_album_sync_dialog_summary">Le téléchargement des albums favoris pourrait consommer beaucoup de données.</string>
|
||||
<string name="starred_album_sync_dialog_title">Synchroniser les albums favoris</string>
|
||||
<string name="streaming_cache_storage_dialog_sub_summary">Veuillez redémarrer l\'app pour appliquer les changements.</string>
|
||||
<string name="streaming_cache_storage_dialog_summary">Modifier le chemin de stockage des fichiers mis en cache risque de provoquer la suppression de tous les fichiers précédemment mis en cache dans le nouvel espace de stockage.</string>
|
||||
@@ -436,14 +509,45 @@
|
||||
<string name="undraw_page">unDraw</string>
|
||||
<string name="undraw_thanks">Un grand merci à unDraw, nous n\'aurions pas pu rendre cette application aussi belle sans leurs illustrations.</string>
|
||||
<string name="undraw_url">https://undraw.co/</string>
|
||||
<string name="widget_label">Widget Tempus</string>
|
||||
<string name="widget_not_playing">Pas de lecture</string>
|
||||
<string name="widget_placeholder_subtitle">Ouvrir 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">Couverture de l\'album</string>
|
||||
<string name="widget_content_desc_play_pause">Lecture ou pause</string>
|
||||
<string name="widget_content_desc_next">Piste suivante</string>
|
||||
<string name="widget_content_desc_prev">Piste précédente</string>
|
||||
<string name="widget_content_desc_shuffle">Activer/désactiver le mélange</string>
|
||||
<string name="widget_content_desc_repeat">Changer le mode de répétition</string>
|
||||
<plurals name="home_sync_starred_albums_count">
|
||||
<item quantity="one">%d album à synchroniser</item>
|
||||
<item quantity="other">%d albums à synchroniser</item>
|
||||
</plurals>
|
||||
<plurals name="home_sync_starred_artists_count">
|
||||
<item quantity="one">%d artiste à synchroniser</item>
|
||||
<item quantity="other">%d artistes à synchroniser</item>
|
||||
</plurals>
|
||||
<plurals name="songs_download_started">
|
||||
<item quantity="one">Téléchargement de %d titre</item>
|
||||
<item quantity="other">Téléchargement de %d titres</item>
|
||||
</plurals>
|
||||
<string name="equalizer_fragment_title">Égaliseur</string>
|
||||
<string name="equalizer_reset">Réinitialiser</string>
|
||||
<string name="equalizer_enable">Activer</string>
|
||||
<string name="equalizer_not_supported">Non supporté sur cet appareil</string>
|
||||
<string name="settings_app_equalizer">Égaliseur</string>
|
||||
<string name="settings_app_equalizer_summary">Ouvrir l\'égaliseur intégré</string>
|
||||
|
||||
<string name="settings_album_detail">Afficher les détails de l\'album</string>
|
||||
<string name="settings_album_detail_summary">Si activé, affiche les détails de l\'album tels que le genre, le nombre de titres etc. sur l\'écran de l\'album</string>
|
||||
<string name="settings_artist_sort_by_album_count">Trier les artistes par nombre d\'albums</string>
|
||||
<string name="settings_artist_sort_by_album_count_summary">Si activé, les artistes seront triés par ordre des nombres d\'albums. Si désactivé, ils le seront par ordre alphabétique.</string>
|
||||
|
||||
<string name="folder_play_collecting">Collecte des titres du répertoire…</string>
|
||||
<string name="folder_play_playing">Lecture de %d titres</string>
|
||||
<string name="folder_play_no_songs">Aucun titre trouvé dans le répertoire</string>
|
||||
|
||||
<string name="search_sort_title">Trier les recherches récentes par ordre chronologique</string>
|
||||
<string name="search_sort_summary">Si activé, les recherches récentes seront triées par ordre chronologique. Si désactivé, elles le seront par ordre alphabétique.</string>
|
||||
</resources>
|
||||
|
||||
@@ -239,7 +239,16 @@
|
||||
<item>4</item>
|
||||
<item>8</item>
|
||||
</string-array>
|
||||
|
||||
|
||||
<string-array name="playlist_sort_option_titles">
|
||||
<item>Po nazwie</item>
|
||||
<item>Losowo</item>
|
||||
</string-array>
|
||||
<string-array name="playlist_sort_option_values">
|
||||
<item>ORDER_BY_NAME</item>
|
||||
<item>ORDER_BY_RANDOM</item>
|
||||
</string-array>
|
||||
|
||||
<string-array name="skip_min_star_rating_titles">
|
||||
<item>Minimum 0 gwiazdek</item>
|
||||
<item>Minimum 1 gwiazdka</item>
|
||||
@@ -254,4 +263,4 @@
|
||||
<item>3</item>
|
||||
<item>4</item>
|
||||
</string-array>
|
||||
</resources>
|
||||
</resources>
|
||||
|
||||
@@ -39,6 +39,7 @@
|
||||
<string name="artist_list_page_downloaded">Pobrani wykonawcy</string>
|
||||
<string name="artist_list_page_starred">Wykonawcy oznaczeni gwiazdką</string>
|
||||
<string name="artist_list_page_title">Wykonawcy</string>
|
||||
<string name="artist_no_artist_info_toast">Brak dodatkowych informacji o wykonawcy</string>
|
||||
<string name="artist_page_radio_button">Radio</string>
|
||||
<string name="artist_page_shuffle_button">Odtwarzanie losowe</string>
|
||||
<string name="artist_page_switch_layout_button">Zmień układ</string>
|
||||
@@ -350,6 +351,7 @@
|
||||
<string name="settings_music_directory_summary">Jeżeli włączone, widoczna będzie sekcja z folderami z muzyką. Weź pod uwagę że żeby funkcja nawigacji po folderach działała poprawnie, serwer musi wspierać tę funkcję.</string>
|
||||
<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_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>
|
||||
|
||||
258
app/src/main/res/values-ro/arrays.xml
Normal file
258
app/src/main/res/values-ro/arrays.xml
Normal file
@@ -0,0 +1,258 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string-array name="theme_list_titles">
|
||||
<item>Luminos</item>
|
||||
<item>Întunecat</item>
|
||||
<item>Setare implicită sistem</item>
|
||||
</string-array>
|
||||
<string-array name="theme_list_values">
|
||||
<item>light</item>
|
||||
<item>dark</item>
|
||||
<item>default</item>
|
||||
</string-array>
|
||||
|
||||
<string-array name="pref_cache_size_titles">
|
||||
<item>Înalt</item>
|
||||
<item>Mediu</item>
|
||||
<item>Scăzut</item>
|
||||
</string-array>
|
||||
<string-array name="pref_cache_size_values">
|
||||
<item>500</item>
|
||||
<item>250</item>
|
||||
<item>125</item>
|
||||
</string-array>
|
||||
|
||||
<string-array name="pref_image_size_titles">
|
||||
<item>Înalt</item>
|
||||
<item>Mediu</item>
|
||||
<item>Scăzut</item>
|
||||
</string-array>
|
||||
<string-array name="pref_image_size_values">
|
||||
<item>-1</item>
|
||||
<item>500</item>
|
||||
<item>300</item>
|
||||
</string-array>
|
||||
|
||||
<string-array name="streaming_cache_size_titles">
|
||||
<item>Dezactivat</item>
|
||||
<item>128 MiB</item>
|
||||
<item>256 MiB</item>
|
||||
<item>512 MiB</item>
|
||||
<item>1024 MiB</item>
|
||||
</string-array>
|
||||
<string-array name="streaming_cache_size_values">
|
||||
<item>0</item>
|
||||
<item>128</item>
|
||||
<item>256</item>
|
||||
<item>512</item>
|
||||
<item>1024</item>
|
||||
</string-array>
|
||||
|
||||
<string-array name="max_bitrate_wifi_list_titles">
|
||||
<item>Original</item>
|
||||
<item>32 kbps</item>
|
||||
<item>48 kbps</item>
|
||||
<item>64 kbps</item>
|
||||
<item>80 kbps</item>
|
||||
<item>96 kbps</item>
|
||||
<item>112 kbps</item>
|
||||
<item>128 kbps</item>
|
||||
<item>160 kbps</item>
|
||||
<item>192 kbps</item>
|
||||
<item>256 kbps</item>
|
||||
<item>320 kbps</item>
|
||||
</string-array>
|
||||
<string-array name="max_bitrate_wifi_list_values">
|
||||
<item>0</item>
|
||||
<item>32</item>
|
||||
<item>48</item>
|
||||
<item>64</item>
|
||||
<item>80</item>
|
||||
<item>96</item>
|
||||
<item>112</item>
|
||||
<item>128</item>
|
||||
<item>160</item>
|
||||
<item>192</item>
|
||||
<item>256</item>
|
||||
<item>320</item>
|
||||
</string-array>
|
||||
|
||||
<string-array name="max_bitrate_mobile_list_titles">
|
||||
<item>Original</item>
|
||||
<item>32 kbps</item>
|
||||
<item>48 kbps</item>
|
||||
<item>64 kbps</item>
|
||||
<item>80 kbps</item>
|
||||
<item>96 kbps</item>
|
||||
<item>112 kbps</item>
|
||||
<item>128 kbps</item>
|
||||
<item>160 kbps</item>
|
||||
<item>192 kbps</item>
|
||||
<item>256 kbps</item>
|
||||
<item>320 kbps</item>
|
||||
</string-array>
|
||||
<string-array name="max_bitrate_mobile_list_values">
|
||||
<item>0</item>
|
||||
<item>32</item>
|
||||
<item>48</item>
|
||||
<item>64</item>
|
||||
<item>80</item>
|
||||
<item>96</item>
|
||||
<item>112</item>
|
||||
<item>128</item>
|
||||
<item>160</item>
|
||||
<item>192</item>
|
||||
<item>256</item>
|
||||
<item>320</item>
|
||||
</string-array>
|
||||
|
||||
<string-array name="max_bitrate_download_list_titles">
|
||||
<item>Original</item>
|
||||
<item>32 kbps</item>
|
||||
<item>48 kbps</item>
|
||||
<item>64 kbps</item>
|
||||
<item>80 kbps</item>
|
||||
<item>96 kbps</item>
|
||||
<item>112 kbps</item>
|
||||
<item>128 kbps</item>
|
||||
<item>160 kbps</item>
|
||||
<item>192 kbps</item>
|
||||
<item>256 kbps</item>
|
||||
<item>320 kbps</item>
|
||||
</string-array>
|
||||
<string-array name="max_bitrate_download_list_values">
|
||||
<item>0</item>
|
||||
<item>32</item>
|
||||
<item>48</item>
|
||||
<item>64</item>
|
||||
<item>80</item>
|
||||
<item>96</item>
|
||||
<item>112</item>
|
||||
<item>128</item>
|
||||
<item>160</item>
|
||||
<item>192</item>
|
||||
<item>256</item>
|
||||
<item>320</item>
|
||||
</string-array>
|
||||
|
||||
<string-array name="audio_transcode_format_wifi_list_titles">
|
||||
<item>Redare directă</item>
|
||||
<item>Opus</item>
|
||||
<item>AAC</item>
|
||||
<item>Mp3</item>
|
||||
<item>Flac</item>
|
||||
</string-array>
|
||||
<string-array name="audio_transcode_format_wifi_list_values">
|
||||
<item>raw</item>
|
||||
<item>opus</item>
|
||||
<item>aac</item>
|
||||
<item>mp3</item>
|
||||
<item>flac</item>
|
||||
</string-array>
|
||||
|
||||
<string-array name="audio_transcode_format_mobile_list_titles">
|
||||
<item>Redare directă</item>
|
||||
<item>Opus</item>
|
||||
<item>AAC</item>
|
||||
<item>Mp3</item>
|
||||
<item>Flac</item>
|
||||
</string-array>
|
||||
<string-array name="audio_transcode_format_mobile_list_values">
|
||||
<item>raw</item>
|
||||
<item>opus</item>
|
||||
<item>aac</item>
|
||||
<item>mp3</item>
|
||||
<item>flac</item>
|
||||
</string-array>
|
||||
|
||||
<string-array name="audio_transcode_format_download_list_titles">
|
||||
<item>Descărcare directă</item>
|
||||
<item>Opus</item>
|
||||
<item>AAC</item>
|
||||
<item>Mp3</item>
|
||||
<item>Flac</item>
|
||||
</string-array>
|
||||
<string-array name="audio_transcode_format_download_list_values">
|
||||
<item>raw</item>
|
||||
<item>opus</item>
|
||||
<item>aac</item>
|
||||
<item>mp3</item>
|
||||
<item>flac</item>
|
||||
</string-array>
|
||||
|
||||
<string-array name="queue_syncing_countdown_titles">
|
||||
<item>Zece secunde</item>
|
||||
<item>Cinci secunde</item>
|
||||
<item>Două secunde</item>
|
||||
</string-array>
|
||||
<string-array name="queue_syncing_countdown_values">
|
||||
<item>10</item>
|
||||
<item>5</item>
|
||||
<item>2</item>
|
||||
</string-array>
|
||||
|
||||
<string-array name="rounded_corner_size_titles">
|
||||
<item>Înalt</item>
|
||||
<item>Mediu</item>
|
||||
<item>Scăzut</item>
|
||||
</string-array>
|
||||
<string-array name="rounded_corner_size_values">
|
||||
<item>18</item>
|
||||
<item>12</item>
|
||||
<item>6</item>
|
||||
</string-array>
|
||||
|
||||
<string-array name="replay_gain_titles">
|
||||
<item>Dezactivat</item>
|
||||
<item>Piesă</item>
|
||||
<item>Album</item>
|
||||
<item>Automat</item>
|
||||
</string-array>
|
||||
<string-array name="replay_gain_values">
|
||||
<item>disabled</item>
|
||||
<item>track</item>
|
||||
<item>album</item>
|
||||
<item>auto</item>
|
||||
</string-array>
|
||||
|
||||
<string-array name="transcoded_download_option_list_titles">
|
||||
<item>Nu transcodaţi</item>
|
||||
<item>Setări server</item>
|
||||
<item>Format transcodare Wi-Fi</item>
|
||||
<item>Format transcodare mobil</item>
|
||||
</string-array>
|
||||
<string-array name="transcoded_download_option_list_values">
|
||||
<item>0</item>
|
||||
<item>1</item>
|
||||
<item>2</item>
|
||||
<item>3</item>
|
||||
</string-array>
|
||||
|
||||
<string-array name="buffering_strategy_titles">
|
||||
<item>Minim</item>
|
||||
<item>Moderat</item>
|
||||
<item>Agresiv</item>
|
||||
<item>Extrem</item>
|
||||
</string-array>
|
||||
<string-array name="buffering_strategy_values">
|
||||
<item>.1</item>
|
||||
<item>1</item>
|
||||
<item>4</item>
|
||||
<item>8</item>
|
||||
</string-array>
|
||||
|
||||
<string-array name="skip_min_star_rating_titles">
|
||||
<item>0 stele minim</item>
|
||||
<item>1 stea minim</item>
|
||||
<item>2 stele minim</item>
|
||||
<item>3 stele minim</item>
|
||||
<item>4 stele minim</item>
|
||||
</string-array>
|
||||
<string-array name="skip_min_star_rating_values">
|
||||
<item>0</item>
|
||||
<item>1</item>
|
||||
<item>2</item>
|
||||
<item>3</item>
|
||||
<item>4</item>
|
||||
</string-array>
|
||||
</resources>
|
||||
557
app/src/main/res/values-ro/strings.xml
Normal file
557
app/src/main/res/values-ro/strings.xml
Normal file
@@ -0,0 +1,557 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="activity_battery_optimizations_conclusion">Dacă întâmpinați probleme acesați https://dontkillmyapp.com, unde veți găsi instrucțiuni detaliate despre cum să dezactivați funcțiile de economisire baterie care pot afecta performanța aplicației.</string>
|
||||
<string name="activity_battery_optimizations_summary">Dezactivați optimizările bateriei pentru redarea media în timp ce ecranul este oprit.</string>
|
||||
<string name="activity_battery_optimizations_title">Optimizări Baterie</string>
|
||||
<string name="activity_info_offline_mode">Modul offline</string>
|
||||
<string name="album_bottom_sheet_add_to_playlist">Adăugați la playlist</string>
|
||||
<string name="album_bottom_sheet_add_to_queue">Adăugați la coadă</string>
|
||||
<string name="album_bottom_sheet_download_all">Descărcați tot</string>
|
||||
<string name="album_bottom_sheet_go_to_artist">Mergeți la artist</string>
|
||||
<string name="album_bottom_sheet_instant_mix">Mix instant</string>
|
||||
<string name="album_bottom_sheet_play_next">Redați următoarea</string>
|
||||
<string name="album_bottom_sheet_remove_all">Eliminați tot</string>
|
||||
<string name="album_bottom_sheet_share">Partajați</string>
|
||||
<string name="album_bottom_sheet_shuffle">Amestecare</string>
|
||||
<string name="album_catalogue_title">Albume</string>
|
||||
<string name="album_catalogue_title_expanded">Răsfoiți Albume</string>
|
||||
<string name="album_error_retrieving_artist">Eroare la preluarea artistului</string>
|
||||
<string name="album_list_page_downloaded">Albume descărcate</string>
|
||||
<string name="album_list_page_most_played">Albume cele mai ascultate</string>
|
||||
<string name="album_list_page_new_releases">Lansări noi</string>
|
||||
<string name="album_list_page_recently_added">Albume adăugate recent</string>
|
||||
<string name="album_list_page_recently_played">Albume redate recent</string>
|
||||
<string name="album_list_page_starred">Albume marcate</string>
|
||||
<string name="album_list_page_title">Albume</string>
|
||||
<string name="album_page_extra_info_button">Mai mult ca aceasta</string>
|
||||
<string name="album_page_play_button">Redare</string>
|
||||
<string name="album_page_release_date_label">Lansat pe %1$s</string>
|
||||
<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">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>
|
||||
<string name="artist_catalogue_title">Artiști</string>
|
||||
<string name="artist_catalogue_title_expanded">Răsfoiți Artiști</string>
|
||||
<string name="artist_error_retrieving_radio">Eroare la preluarea radioului artistului</string>
|
||||
<string name="artist_error_retrieving_tracks">Eroare la preluarea cântecelor artistului</string>
|
||||
<string name="artist_list_page_downloaded">Artiști descărcați</string>
|
||||
<string name="artist_list_page_starred">Artiști marcați</string>
|
||||
<string name="artist_list_page_title">Artiști</string>
|
||||
<string name="artist_no_artist_info_toast">Nu sunt informații suplimentare despre artist</string>
|
||||
<string name="artist_page_radio_button">Radio</string>
|
||||
<string name="artist_page_shuffle_button">Amestecare</string>
|
||||
<string name="artist_page_switch_layout_button">Schimbați aspectul</string>
|
||||
<string name="artist_page_title_album_more_like_this_button">Mai mult ca aceasta</string>
|
||||
<string name="artist_page_title_album_section">Albume</string>
|
||||
<string name="artist_page_title_biography_more_button">Mai mult</string>
|
||||
<string name="artist_page_title_biography_section">Biografie</string>
|
||||
<string name="artist_page_title_most_streamed_song_section">Cele mai ascultate cântece</string>
|
||||
<string name="artist_page_title_most_streamed_song_see_all_button">Vezi tot</string>
|
||||
<string name="battery_optimization_negative_button">Ignoraţi</string>
|
||||
<string name="battery_optimization_neutral_button">Nu mai întreba</string>
|
||||
<string name="battery_optimization_positive_button">Dezactivaţi</string>
|
||||
<string name="bottom_sheet_generating_instant_mix">Se generează mix instant...</string>
|
||||
<string name="bottom_sheet_problem_generating_instant_mix">Nu s-au putut prelua cântecele din serverul subsonic.</string>
|
||||
<string name="connection_alert_dialog_negative_button">Anulati</string>
|
||||
<string name="connection_alert_dialog_neutral_button">Activaţi economisitor de date</string>
|
||||
<string name="connection_alert_dialog_positive_button">OK</string>
|
||||
<string name="connection_alert_dialog_summary">Accesul la serverul Subsonic pe conexiuni alte decât Wi-Fi a fost restricționat. Pentru a preveni reapariția acestui dialog, dezactivați verificarea conexiunii în setările aplicației.</string>
|
||||
<string name="connection_alert_dialog_title">Wi-Fi nu este conectat</string>
|
||||
<string name="content_description_shuffle_button">Amestecare</string>
|
||||
<string name="delete_download_storage_dialog_negative_button">Anulati</string>
|
||||
<string name="delete_download_storage_dialog_positive_button">Continuaţi</string>
|
||||
<string name="delete_download_storage_dialog_summary">Vă rugăm să fiți conștienți că continuarea cu această acțiune va duce la ștergerea permanentă a tuturor articolelor salvate descărcate de pe toți serverele.</string>
|
||||
<string name="delete_download_storage_dialog_title">Ștergeți articolele salvate</string>
|
||||
<string name="description_empty_title">Nu sunt versuri disponibile</string>
|
||||
<string name="disc_titlefull">Disc %1$s - %2$s</string>
|
||||
<string name="disc_titleless">Disc %1$s</string>
|
||||
<string name="download_directory_dialog_negative_button">Anulati</string>
|
||||
<string name="download_directory_dialog_positive_button">Descarcaţi</string>
|
||||
<string name="download_directory_dialog_summary">Toate piesele din acest folder vor fi descărcate. Piesele prezente în subfoldere nu vor fi descărcate.</string>
|
||||
<string name="download_directory_dialog_title">Descărcați piesele</string>
|
||||
<string name="download_directory_set">Setați unde sunt descărcate muzica</string>
|
||||
<string name="download_info_empty_subtitle">Odată ce descărcați o cântec, o veți găsi aici</string>
|
||||
<string name="download_info_empty_title">Nicio descărcare încă!</string>
|
||||
<string name="download_item_multiple_subtitle_formatter">%1$s • %2$s articole</string>
|
||||
<string name="download_item_single_subtitle_formatter">%1$s articole</string>
|
||||
<string name="download_shuffle_all_subtitle">Amestecare toate</string>
|
||||
<string name="download_storage_dialog_sub_summary">Pentru ca schimbările să aibă efect, reporniți aplicația.</string>
|
||||
<string name="download_storage_dialog_summary">Schimbarea destinației fișierelor descărcate de la un spațiu de stocare la altul va duce la ștergerea imediată a oricăror fișiere descărcate anterior în celălalt spațiu de stocare.</string>
|
||||
<string name="download_storage_dialog_title">Selectați opțiunea de stocare</string>
|
||||
<string name="download_storage_external_dialog_positive_button">Extern</string>
|
||||
<string name="download_storage_internal_dialog_negative_button">Intern</string>
|
||||
<string name="download_storage_directory_dialog_neutral_button">Director</string>
|
||||
<string name="download_title_section">Descărcări</string>
|
||||
<string name="download_refresh_no_directory">Setați un folder de descărcare pentru a vă reîmprospăta descărcările.</string>
|
||||
<string name="download_refresh_no_changes">Nu au fost găsite descărcări lipsă.</string>
|
||||
<plurals name="download_refresh_removed">
|
||||
<item quantity="one">Eliminată %d descărcare lipsă.</item>
|
||||
<item quantity="other">Eliminate %d descărcări lipsă.</item>
|
||||
</plurals>
|
||||
<string name="download_refresh_button_content_description">Reîmprospătați articolele descărcate</string>
|
||||
<string name="downloaded_bottom_sheet_add_to_queue">Adăugați la coadă</string>
|
||||
<string name="downloaded_bottom_sheet_play_next">Redați următoarea</string>
|
||||
<string name="downloaded_bottom_sheet_remove">Eliminaţi</string>
|
||||
<string name="downloaded_bottom_sheet_remove_all">Eliminați tot</string>
|
||||
<string name="downloaded_bottom_sheet_shuffle">Amestecare</string>
|
||||
<string name="empty_string" />
|
||||
<string name="error_required">Necesar</string>
|
||||
<string name="error_server_prefix">Prefixul http sau https este necesar</string>
|
||||
<string name="exo_download_notification_channel_name">Descărcări</string>
|
||||
<string name="exo_controls_heart_off_description">Comutați inima în stare inactivă</string>
|
||||
<string name="exo_controls_heart_on_description">Comutați inima în stare activă</string>
|
||||
<string name="cast_expanded_controller_loading">Se încarcă…</string>
|
||||
<string name="filter_info_selection">Selectați doi sau mai mulți filtre</string>
|
||||
<string name="filter_title">Filtru</string>
|
||||
<string name="filter_artist">Filtrați artiști</string>
|
||||
<string name="filter_title_expanded">Filtrați Genuri</string>
|
||||
<string name="generic_list_page_count">(%1$d)</string>
|
||||
<string name="generic_list_page_count_unknown">(+%1$d)</string>
|
||||
<string name="genre_catalogue_title">Catalogul Genuri</string>
|
||||
<string name="genre_catalogue_title_expanded">Răsfoiți Genuri</string>
|
||||
<string name="github_update_dialog_negative_button">Reamintitor mai târziu</string>
|
||||
<string name="github_update_dialog_neutral_button">Susțineți-mă</string>
|
||||
<string name="github_update_dialog_positive_button">Descărcați acum</string>
|
||||
<string name="github_update_dialog_summary">Există o nouă versiune a aplicației disponibilă pe Github.</string>
|
||||
<string name="github_update_dialog_title">Actualizare disponibilă</string>
|
||||
<string name="home_rearrangement_dialog_negative_button">Anulati</string>
|
||||
<string name="home_rearrangement_dialog_neutral_button">Resetaţi</string>
|
||||
<string name="home_rearrangement_dialog_positive_button">Salvaţi</string>
|
||||
<string name="home_rearrangement_dialog_title">Rearanjați pagina de start</string>
|
||||
<string name="home_rearrangement_dialog_subtitle">Rețineți că pentru ca modificările să aibă efect, este necesar să reporniți aplicația.</string>
|
||||
<string name="home_section_music">Muzică</string>
|
||||
<string name="home_section_podcast">Podcast</string>
|
||||
<string name="home_section_radio">Radio</string>
|
||||
<string name="home_subtitle_best_of">Top piese din artiștii dvs. preferați</string>
|
||||
<string name="home_subtitle_made_for_you">Porniți mix-ul dintr-o cântec pe care ți-a plăcut</string>
|
||||
<string name="home_subtitle_new_internet_radio_station">Adăugați o nouă radio</string>
|
||||
<string name="home_subtitle_new_podcast_channel">Adăugați un nou canal podcast</string>
|
||||
<string name="home_sync_starred_cancel">Anulati</string>
|
||||
<string name="home_sync_starred_download">Descarcaţi</string>
|
||||
<string name="home_sync_starred_subtitle">Descărcarea acestor piese poate implica o utilizare semnificativă a datelor</string>
|
||||
<string name="home_sync_starred_title">Se pare că sunt niște piese marcate de sincronizat</string>
|
||||
<string name="home_sync_starred_albums_title">Sincronizați Albume Marcate</string>
|
||||
<string name="home_sync_starred_albums_subtitle">Albumele marcate cu o stea vor fi disponibile offline</string>
|
||||
<string name="home_sync_starred_artists_title">Sincronizare Artiști Marcați</string>
|
||||
<string name="home_sync_starred_artists_subtitle">Aveți artiști marcați cu muzică care nu a fost descărcată</string>
|
||||
<plurals name="home_sync_starred_songs_count">
|
||||
<item quantity="one">%d cântec trebuie sincronizată</item>
|
||||
<item quantity="other">%d cântece trebuie sincronizate</item>
|
||||
</plurals>
|
||||
<string name="home_title_best_of">Cel mai bun</string>
|
||||
<string name="home_title_discovery">Descoperire</string>
|
||||
<string name="home_title_discovery_shuffle_all_button">Amestecare toate</string>
|
||||
<string name="home_title_flashback">Retrospectivă</string>
|
||||
<string name="home_title_internet_radio_station">Stații radio internet</string>
|
||||
<string name="home_title_last_played">Redată ultima dată</string>
|
||||
<string name="home_title_last_played_see_all_button">Vezi tot</string>
|
||||
<string name="home_title_last_week">Săptămâna trecută</string>
|
||||
<string name="home_title_last_month">Luna trecută</string>
|
||||
<string name="home_title_last_year">Anul trecut</string>
|
||||
<string name="home_title_made_for_you">Făcut pentru tine</string>
|
||||
<string name="home_title_most_played">Cele mai ascultate</string>
|
||||
<string name="home_title_most_played_see_all_button">Vezi tot</string>
|
||||
<string name="home_title_new_releases">Lansări noi</string>
|
||||
<string name="home_title_newest_podcasts">Podcasturi cele mai noi</string>
|
||||
<string name="home_title_pinned_playlists">Playlisturi</string>
|
||||
<string name="home_title_podcast_channels">Canale</string>
|
||||
<string name="home_title_podcast_channels_see_all_button">Vezi tot</string>
|
||||
<string name="home_title_radio_station">Stații radio</string>
|
||||
<string name="home_title_recently_added">Adăugate recent</string>
|
||||
<string name="home_title_recently_added_see_all_button">Vezi tot</string>
|
||||
<string name="home_title_shares">Partajări</string>
|
||||
<string name="home_title_starred_albums">★ Albume marcate</string>
|
||||
<string name="home_title_starred_albums_see_all_button">Vezi tot</string>
|
||||
<string name="home_title_starred_artists">★ Artiști marcați</string>
|
||||
<string name="home_title_starred_artists_see_all_button">Vezi tot</string>
|
||||
<string name="home_title_starred_tracks">★ Piese marcate</string>
|
||||
<string name="home_title_starred_tracks_see_all_button">Vezi tot</string>
|
||||
<string name="home_title_top_songs">Piesa dvs. top</string>
|
||||
<string name="home_option_reorganize">Reorganizați</string>
|
||||
<string name="label_dot_separator" translatable="false">•</string>
|
||||
<string name="label_placeholder" translatable="false">--</string>
|
||||
<string name="library_title_album">Albume</string>
|
||||
<string name="library_title_album_see_all_button">Vezi tot</string>
|
||||
<string name="library_title_artist">Artiști</string>
|
||||
<string name="library_title_artist_see_all_button">Vezi tot</string>
|
||||
<string name="library_title_genre">Genuri</string>
|
||||
<string name="library_title_genre_see_all_button">Vezi tot</string>
|
||||
<string name="library_title_music_folder">Foldere de muzică</string>
|
||||
<string name="library_title_playlist">Playlisturi</string>
|
||||
<string name="library_title_playlist_see_all_button">Vezi tot</string>
|
||||
<string name="login_empty">Niciun server adăugat</string>
|
||||
<string name="login_title">Servere Subsonic</string>
|
||||
<string name="login_title_expanded">Servere Subsonic</string>
|
||||
<string name="media_route_menu_title">Cast</string>
|
||||
<string name="menu_add_button">Adăugaţi</string>
|
||||
<string name="menu_add_to_playlist_button">Adăugați la playlist</string>
|
||||
<string name="menu_download_all_button">Descărcați tot</string>
|
||||
<string name="menu_rate_album">Evaluați albumul</string>
|
||||
<string name="menu_download_label">Descarcaţi</string>
|
||||
<string name="menu_filter_all">Toate</string>
|
||||
<string name="menu_filter_download">Descarcate</string>
|
||||
<string name="menu_group_by_album">Album</string>
|
||||
<string name="menu_group_by_artist">Artist</string>
|
||||
<string name="menu_group_by_genre">Gen</string>
|
||||
<string name="menu_group_by_track">Piesă</string>
|
||||
<string name="menu_group_by_year">Anul</string>
|
||||
<string name="menu_home_label">Acasă</string>
|
||||
<string name="menu_last_week_name">Săptămâna trecută</string>
|
||||
<string name="menu_last_month_name">Luna trecută</string>
|
||||
<string name="menu_last_year_name">Anul trecut</string>
|
||||
<string name="menu_library_label">Bibliotecă</string>
|
||||
<string name="menu_search_button">Cautaţi</string>
|
||||
<string name="menu_settings_button">Setări</string>
|
||||
<string name="menu_sort_artist">Artist</string>
|
||||
<string name="menu_sort_name">Nume</string>
|
||||
<string name="menu_sort_random">Aleatoriu</string>
|
||||
<string name="menu_sort_album_count">Număr Album</string>
|
||||
<string name="menu_sort_recently_added">Adăugate recent</string>
|
||||
<string name="menu_sort_recently_played">Redate recent</string>
|
||||
<string name="menu_sort_most_played">Cele mai ascultate</string>
|
||||
<string name="menu_sort_most_recently_starred">Cel mai recent marcat</string>
|
||||
<string name="menu_sort_least_recently_starred">Cel mai puțin recent marcat</string>
|
||||
<string name="menu_pin_button">Adăugați pe ecranul de start</string>
|
||||
<string name="menu_unpin_button">Eliminați din ecranul de start</string>
|
||||
<string name="menu_sort_year">Anul</string>
|
||||
<string name="player_playback_speed">%1$.2fx</string>
|
||||
<string name="player_queue_clean_all_button">Curățați coada de redare</string>
|
||||
<string name="player_queue_save_queue_success">Coadă de redare salvată</string>
|
||||
<string name="player_queue_save_to_playlist">Salvați Coada în Playlist</string>
|
||||
<string name="player_queue_load_queue">Încărcați Coada</string>
|
||||
<string name="player_lyrics_download_content_description">Descărcați versuri pentru redare offline</string>
|
||||
<string name="player_lyrics_downloaded_content_description">Versuri descărcate pentru redare offline</string>
|
||||
<string name="player_lyrics_download_success">Versuri salvate pentru redare offline.</string>
|
||||
<string name="player_lyrics_download_failure">Versurile nu sunt disponibile pentru descărcare.</string>
|
||||
<string name="player_server_priority">Prioritate Server</string>
|
||||
<string name="player_unknown_format">Format necunoscut</string>
|
||||
<string name="player_transcoding">Transcodare</string>
|
||||
<string name="player_transcoding_requested">cerut</string>
|
||||
<string name="playlist_catalogue_title">Catalogul Playlisturi</string>
|
||||
<string name="playlist_catalogue_title_expanded">Răsfoiți Playlisturi</string>
|
||||
<string name="playlist_chooser_dialog_empty">Niciun playlist creat</string>
|
||||
<string name="playlist_chooser_dialog_negative_button">Anulati</string>
|
||||
<string name="playlist_chooser_dialog_neutral_button">Creaţi</string>
|
||||
<string name="playlist_chooser_dialog_title">Adăugați la un playlist</string>
|
||||
<string name="playlist_chooser_dialog_toast_add_success">Piesa(e) adăugată(e) la playlist</string>
|
||||
<string name="playlist_chooser_dialog_toast_add_failure">Eșec la adăugarea piese(lor) la playlist</string>
|
||||
<string name="playlist_chooser_dialog_toast_all_skipped">Toate piesele au fost omise ca duplicate</string>
|
||||
<string name="playlist_counted_tracks">%1$d piese • %2$s</string>
|
||||
<string name="playlist_duration">Durată • %1$s</string>
|
||||
<string name="playlist_editor_dialog_action_delete_toast">Apasă lung pentru a șterge</string>
|
||||
<string name="playlist_editor_dialog_hint_name">Nume Playlist</string>
|
||||
<string name="playlist_editor_dialog_negative_button">Anulati</string>
|
||||
<string name="playlist_editor_dialog_neutral_button">Ștergeţi</string>
|
||||
<string name="playlist_editor_dialog_positive_button">Salvaţi</string>
|
||||
<string name="playlist_editor_dialog_title">Editați playlist</string>
|
||||
<string name="playlist_page_play_button">Redare</string>
|
||||
<string name="playlist_page_shuffle_button">Amestecare</string>
|
||||
<string name="playlist_song_count">Playlist • %1$d cântece</string>
|
||||
<string name="podcast_bottom_sheet_add_to_queue">Adăugați la coadă</string>
|
||||
<string name="podcast_bottom_sheet_delete">Ștergeţi</string>
|
||||
<string name="podcast_bottom_sheet_download">Descarcaţi</string>
|
||||
<string name="podcast_bottom_sheet_go_to_channel">Mergeți la canal</string>
|
||||
<string name="podcast_bottom_sheet_play_next">Redați următoarea</string>
|
||||
<string name="podcast_bottom_sheet_remove">Eliminaţi</string>
|
||||
<string name="podcast_channel_catalogue_title">Canale</string>
|
||||
<string name="podcast_channel_catalogue_title_expanded">Răsfoiți Canale</string>
|
||||
<string name="podcast_channel_editor_dialog_hint_rss_url">URL RSS</string>
|
||||
<string name="podcast_channel_editor_dialog_title">Canal Podcast</string>
|
||||
<string name="podcast_channel_not_supported_snackbar">Podcasturile nu sunt acceptate de acest server.</string>
|
||||
<string name="podcast_channel_page_title_description_section">Descriere</string>
|
||||
<string name="podcast_channel_page_title_episode_section">Episoade</string>
|
||||
<string name="podcast_channel_page_title_no_episode_available">Nu sunt episoade disponibile</string>
|
||||
<string name="podcast_episode_download_request_snackbar">Solicitarea dvs. a fost trimisă la server</string>
|
||||
<string name="podcast_info_empty_button">Faceți clic pentru a ascunde secțiunea\nEfectele vor fi vizibile la restart</string>
|
||||
<string name="podcast_info_empty_subtitle">Odată ce adăugați un canal, îl veți găsi aici</string>
|
||||
<string name="podcast_info_empty_title">Nu au fost găsite podcasturi!</string>
|
||||
<string name="podcast_release_date_duration_formatter">%1$s • %2$s</string>
|
||||
<string name="radio_editor_dialog_hint_homepage_url">URL Pagină de Start Radio</string>
|
||||
<string name="radio_editor_dialog_hint_name">Nume Radio</string>
|
||||
<string name="radio_editor_dialog_hint_stream_url">URL Flux Radio</string>
|
||||
<string name="radio_editor_dialog_negative_button">Anulati</string>
|
||||
<string name="radio_editor_dialog_neutral_button">Ștergeţi</string>
|
||||
<string name="radio_editor_dialog_positive_button">Salvaţi</string>
|
||||
<string name="radio_editor_dialog_added">Stație radio adăugată</string>
|
||||
<string name="radio_editor_dialog_updated">Stație radio actualizată</string>
|
||||
<string name="radio_editor_dialog_title">Stație Radio Internet</string>
|
||||
<string name="radio_station_info_empty_button">Faceți clic pentru a ascunde secțiunea\nEfectele vor fi vizibile la restart</string>
|
||||
<string name="radio_station_info_empty_subtitle">Odată ce adăugați o stație radio, o veți găsi aici</string>
|
||||
<string name="radio_station_info_empty_title">Nu au fost găsite stații!</string>
|
||||
<string name="radio_dialog_not_supported_snackbar">Gestionarea radioului internet nu este acceptată de acest server.</string>
|
||||
<string name="rating_dialog_negative_button">Anulati</string>
|
||||
<string name="rating_dialog_positive_button">Salvaţi</string>
|
||||
<string name="rating_dialog_title">Evaluaţi</string>
|
||||
<string name="search_hint">Căutare titlu, artiști sau albume</string>
|
||||
<string name="search_info_minimum_characters">Introduceți cel puțin trei caractere</string>
|
||||
<string name="search_title_album">Albume</string>
|
||||
<string name="search_title_artist">Artiști</string>
|
||||
<string name="search_title_song">Cântece</string>
|
||||
<string name="server_signup_dialog_action_low_security">Securitate redusă</string>
|
||||
<string name="server_signup_dialog_action_delete_toast">Apasă lung pentru a șterge</string>
|
||||
<string name="server_signup_dialog_hint_local_address">URL Local</string>
|
||||
<string name="server_signup_dialog_hint_name">Nume Server</string>
|
||||
<string name="server_signup_dialog_hint_password">Parolă</string>
|
||||
<string name="server_signup_dialog_hint_url">URL Server</string>
|
||||
<string name="server_signup_dialog_hint_username">Nume Utilizator</string>
|
||||
<string name="server_signup_dialog_negative_button">Anulati</string>
|
||||
<string name="server_signup_dialog_neutral_button">Ștergeţi</string>
|
||||
<string name="server_signup_dialog_positive_button">Salvaţi</string>
|
||||
<string name="server_signup_dialog_title">Adăugați server</string>
|
||||
<string name="server_unreachable_dialog_negative_button">Anulati</string>
|
||||
<string name="server_unreachable_dialog_neutral_button">Mergeți la conectare</string>
|
||||
<string name="server_unreachable_dialog_positive_button">Continuaţi oricum</string>
|
||||
<string name="server_unreachable_dialog_summary">Serverul solicitat este indisponibil. Dacă alegeți să continuați, acest dialog nu va apărea pentru următoarea oră.</string>
|
||||
<string name="server_unreachable_dialog_title">Server inaccesibil</string>
|
||||
<string name="settings_about_summary">Tempus este un client de muzică open source și ușor pentru Subsonic, proiectat și construit nativ pentru Android.</string>
|
||||
<string name="settings_about_title">Despre</string>
|
||||
<string name="settings_always_on_display">Afișaj mereu activ</string>
|
||||
<string name="settings_allow_playlist_duplicates">Permiteți adăugarea duplicatelor la playlist</string>
|
||||
<string name="settings_allow_playlist_duplicates_summary">Dacă este activat, duplicatele nu vor fi verificate la adăugarea la un playlist.</string>
|
||||
<string name="settings_audio_transcode_download_format">Format transcodare</string>
|
||||
<string name="settings_audio_transcode_download_priority_summary">Dacă este activat, Tempus nu va forța descărcarea pistei cu setările de transcodare de mai jos.</string>
|
||||
<string name="settings_audio_transcode_download_priority_title">Prioritizați setările serverului utilizate pentru streaming în descărcări</string>
|
||||
<string name="settings_audio_transcode_download_summary">Dacă este activat, Tempus va descărca piste transcodate.</string>
|
||||
<string name="settings_audio_transcode_download_title">Descărcați piste transcodate</string>
|
||||
<string name="settings_audio_transcode_estimate_content_length_summary">Dacă este activat, serverul va fi întrebat cu privire la durata estimată a piesei.</string>
|
||||
<string name="settings_audio_transcode_estimate_content_length_title">Estimare lungime conținut</string>
|
||||
<string name="settings_audio_transcode_format_download">Format transcodare pentru descărcări</string>
|
||||
<string name="settings_audio_transcode_format_mobile">Format transcodare pe mobil</string>
|
||||
<string name="settings_audio_transcode_format_wifi">Format transcodare pe Wi-Fi</string>
|
||||
<string name="settings_audio_transcode_priority_summary">Dacă este activat, Tempus nu va forța streamarea piesei cu setările de transcodare de mai jos.</string>
|
||||
<string name="settings_audio_transcode_priority_title">Prioritizați setările de transcodare ale serverului</string>
|
||||
<string name="settings_audio_transcode_priority_toast">Prioritate pentru transcodarea piesei acordată serverului</string>
|
||||
<string name="settings_buffering_strategy">Strategie de bufering</string>
|
||||
<string name="settings_buffering_strategy_summary">Pentru ca modificarea să aibă efect, trebuie să reporniți manual aplicația.</string>
|
||||
<string name="settings_choose_download_folder">Alegeți un folder pentru fișierele de muzică descărcate</string>
|
||||
<string name="settings_clear_download_folder">Curățați folderul de descărcare</string>
|
||||
<string name="settings_continuous_play_summary">Permite muzicii să continue redarea după ce o playlist s-a încheiat, redând piese similare</string>
|
||||
<string name="settings_continuous_play_title">Redare continuă</string>
|
||||
<string name="settings_covers_cache">Dimensiune cache-ul picturilor</string>
|
||||
<string name="settings_data_saving_mode_summary">Pentru a reduce consumul de date, evitați descărcarea coperii.</string>
|
||||
<string name="settings_data_saving_mode_title">Limitați utilizarea datelor mobile</string>
|
||||
<string name="settings_delete_download_storage_summary">Continuarea va duce la ștergerea ireversibilă a tuturor articolelor salvate.</string>
|
||||
<string name="settings_delete_download_storage_title">Ștergeți articolele salvate</string>
|
||||
<string name="settings_download_storage_title">Stocare descărcare</string>
|
||||
<string name="settings_download_folder_cleared">Folderul de descărcare a fost golit.</string>
|
||||
<string name="settings_download_folder_set">Folderul de descărcare a fost setat</string>
|
||||
<string name="settings_set_download_folder">Setați folderul de descărcare</string>
|
||||
<string name="settings_system_equalizer_summary">Ajustați setările audio</string>
|
||||
<string name="settings_system_equalizer_title">Egalizator sistem</string>
|
||||
<string name="settings_github_link">https://github.com/eddyizm/tempus</string>
|
||||
<string name="settings_github_summary">Urmăriți dezvoltarea</string>
|
||||
<string name="settings_github_title">Github</string>
|
||||
<string name="settings_support_discussion_link">https://github.com/eddyizm/tempus/discussions</string>
|
||||
<string name="settings_github_update">Actualizări</string>
|
||||
<string name="settings_github_update_title">Verificați pe github lansări noi</string>
|
||||
<string name="settings_github_update_summary">Dacă utilizați versiunea github, prin implicare, aplicația va verifica noile versiuni de apk. Comutați pentru a dezactiva verificările automate pe github</string>
|
||||
<string name="settings_support_summary">Alăturați-vă discuțiilor comunității și asistență</string>
|
||||
<string name="settings_support_title">Asistență utilizator</string>
|
||||
<string name="settings_scan_result">Scanare: numărare %1$d piese</string>
|
||||
<string name="settings_image_size">Setați rezoluția imaginii</string>
|
||||
<string name="settings_language">Limbă</string>
|
||||
<string name="settings_logout_title">Deconectaţi</string>
|
||||
<string name="settings_max_bitrate_download">Bitrate pentru descărcări</string>
|
||||
<string name="settings_max_bitrate_mobile">Bitrate pe mobil</string>
|
||||
<string name="settings_max_bitrate_wifi">Bitrate pe Wi-Fi</string>
|
||||
<string name="settings_media_cache">Dimensiune cache-ul fișierelor media</string>
|
||||
<string name="settings_music_directory">Arătați directoare de muzică</string>
|
||||
<string name="settings_music_directory_summary">Dacă este activat, afișează secțiunea directorului de muzică. Vă rugăm să rețineți că pentru ca navigarea folderului să funcționeze corect, serverul trebuie să suporte această funcție.</string>
|
||||
<string name="settings_podcast">Arătați podcast</string>
|
||||
<string name="settings_podcast_summary">Dacă este activat, afișează secțiunea podcast. Reporniți aplicația pentru ca aceasta să aibă efect complet.</string>
|
||||
<string name="settings_audio_quality">Arătați calitate audio</string>
|
||||
<string name="settings_audio_quality_summary">Bitrate-ul și formatul audio vor fi afișate pentru fiecare pistă audio.</string>
|
||||
<string name="settings_song_rating">Arătați evaluarea cu stele a cântecului</string>
|
||||
<string name="settings_song_rating_summary">Dacă este activat, afișează evaluarea cu 5 stele pentru piesă pe pagina cântecului\n\n*Necesită restartarea aplicației</string>
|
||||
<string name="settings_item_rating">Arătați evaluarea articolului</string>
|
||||
<string name="settings_item_rating_summary">Dacă este activat, va fi afișată evaluarea articolului și dacă este marcat ca favorit.</string>
|
||||
<string name="settings_queue_syncing_countdown">Cronometru sincronizare</string>
|
||||
<string name="settings_queue_syncing_summary">Dacă este activat, utilizatorul va avea capacitatea de a-și salva coada de redare și va putea să încărce starea la deschiderea aplicației.</string>
|
||||
<string name="settings_queue_syncing_title">Sincronizare coadă de redare pentru acest utilizator [Nu este complet finalizat]</string>
|
||||
<string name="settings_show_mini_shuffle_button">Arătați butonul Amestecare</string>
|
||||
<string name="settings_show_mini_shuffle_button_summary">Dacă este activat, afișează butonul amestecare, elimină inima din mini player</string>
|
||||
<string name="settings_radio">Arătați radio</string>
|
||||
<string name="settings_radio_summary">Dacă este activat, afișează secțiunea radio. Reporniți aplicația pentru ca aceasta să aibă efect complet.</string>
|
||||
<string name="settings_auto_download_lyrics">Descarcă versuri automat</string>
|
||||
<string name="settings_auto_download_lyrics_summary">Salvați automat versurile când sunt disponibile, astfel încât să poată fi afișate offline.</string>
|
||||
<string name="settings_replay_gain">Setați modul replay gain</string>
|
||||
<string name="settings_rounded_corner">Colțuri rotunjite</string>
|
||||
<string name="settings_rounded_corner_size">Dimensiunea colțuri</string>
|
||||
<string name="settings_rounded_corner_size_summary">Setează magnitudinea unghiului de curbură.</string>
|
||||
<string name="settings_rounded_corner_summary">Dacă este activat, stabilește un unghi de curbură pentru toate coperii redate. Modificările vor avea efect la restart.</string>
|
||||
<string name="settings_scan_title">Biblioteca de scanare</string>
|
||||
<string name="settings_scrobble_title">Activați scrobbling muzică</string>
|
||||
<string name="settings_system_language">Limba sistemului</string>
|
||||
<string name="settings_share_title">Activați partajarea muzicii</string>
|
||||
<string name="settings_streaming_cache_size">Dimensiune cache-ul de streaming</string>
|
||||
<string name="settings_streaming_cache_storage_title">Stocare cache-ul de streaming</string>
|
||||
<string name="settings_sub_summary_scrobble">Este important de remarcat că scrobbling se bazează și pe faptul că serverul este activat pentru a primi aceste date.</string>
|
||||
<string name="settings_summary_skip_min_star_rating">La ascultarea radioului unui artist, a unui mix instant sau la amestecare toate, piesele sub o anumită evaluare a utilizatorului vor fi ignorate.</string>
|
||||
<string name="settings_summary_replay_gain">Replay gain este o funcție care vă permite să ajustați nivelul de volum al pistelor audio pentru o experiență de ascultare consistentă. Această setare este eficace doar dacă piesa conține metadatele necesare.</string>
|
||||
<string name="settings_summary_scrobble">Scrobbling este o funcție care permite dispozitivului dvs. să trimită informații despre cântecele pe care le ascultați la serverul de muzică. Aceste informații ajută la crearea de recomandări personalizate pe baza preferințelor dvs. de muzică.</string>
|
||||
<string name="settings_summary_share">Permite utilizatorului să partajeze muzică printr-un link. Funcționalitatea trebuie să fie acceptată și activată pe server și este limitată la piese individuale, albume și playlisturi.</string>
|
||||
<string name="settings_summary_syncing">Returnează starea cozii de redare pentru acest utilizator. Aceasta include pistele din coada de redare, piesa în curs de redare și poziția din aceasta. Serverul trebuie să suporte această funcție.\n*Această setare nu funcționează 100% pe toate serverele/dispozitivele.</string>
|
||||
<string name="settings_summary_streaming_cache_size">%1$s \nActual în uz: %2$s MiB</string>
|
||||
<string name="settings_summary_transcoding">Prioritate acordată modului de transcodare. Dacă este setat la \"Redare directă\", bitrate-ul fișierului nu va fi modificat.</string>
|
||||
<string name="settings_summary_transcoding_download">Descărcați media transcodat. Dacă este activat, punctul final de descărcare nu va fi utilizat, ci următoarele setări. \n\n Dacă \"Format transcodare pentru descărcări\" este setat la \"Descărcare directă\", bitrate-ul fișierului nu va fi modificat.</string>
|
||||
<string name="settings_summary_transcoding_estimate_content_length">Când fișierul este transcodat în mișcare, clientul nu arată de obicei lungimea pistei. Este posibil să se ceară serverelor care acceptă funcționalitatea să estimeze durata piesei în curs de redare, dar timpii de răspuns pot fi mai lungi.</string>
|
||||
<string name="settings_sync_starred_artists_for_offline_use_summary">Dacă este activat, artiștii marcați vor fi descărcați pentru utilizare offline.</string>
|
||||
<string name="settings_sync_starred_artists_for_offline_use_title">Sincronizați artiștii marcați pentru utilizare offline</string>
|
||||
<string name="settings_sync_starred_albums_for_offline_use_summary">Dacă este activat, albumele marcate vor fi descărcate pentru utilizare offline.</string>
|
||||
<string name="settings_sync_starred_albums_for_offline_use_title">Sincronizați albumele marcate pentru utilizare offline</string>
|
||||
<string name="settings_sync_starred_tracks_for_offline_use_summary">Dacă este activat, piesele marcate vor fi descărcate pentru utilizare offline.</string>
|
||||
<string name="settings_sync_starred_tracks_for_offline_use_title">Sincronizați piesele marcate pentru utilizare offline</string>
|
||||
<string name="settings_theme">Temă</string>
|
||||
<string name="settings_title_data">Date</string>
|
||||
<string name="settings_title_general">General</string>
|
||||
<string name="settings_title_playlist">Playlist</string>
|
||||
<string name="settings_title_rating">Evaluare</string>
|
||||
<string name="settings_title_replay_gain">Replay Gain</string>
|
||||
<string name="settings_title_scrobble">Scrobble</string>
|
||||
<string name="settings_title_skip_min_star_rating">Ignoraţi piesele pe baza evaluării</string>
|
||||
<string name="settings_title_skip_min_star_rating_dialog">Cântece cu o evaluare de:</string>
|
||||
<string name="settings_title_share">Partajare</string>
|
||||
<string name="settings_title_syncing">Sincronizare</string>
|
||||
<string name="settings_title_transcoding">Transcodare</string>
|
||||
<string name="settings_title_transcoding_download">Descărcare Transcodare</string>
|
||||
<string name="settings_title_ui">UI</string>
|
||||
<string name="settings_transcoded_download">Descărcare transcodată</string>
|
||||
<string name="settings_version_summary" translatable="false">3.1.0</string>
|
||||
<string name="settings_version_title">Versiune</string>
|
||||
<string name="settings_wifi_only_summary">Cere confirmarea utilizatorului înainte de streaming pe rețeaua mobilă.</string>
|
||||
<string name="settings_wifi_only_title">Alerta stream numai Wi-Fi</string>
|
||||
<string name="share_bottom_sheet_copy_link">Copiaţi link</string>
|
||||
<string name="share_bottom_sheet_delete">Ștergeţi partajare</string>
|
||||
<string name="share_bottom_sheet_update">Actualizaţi partajare</string>
|
||||
<string name="share_subtitle_item">Data expirării: %1$s</string>
|
||||
<string name="share_no_expiration">Niciodată</string>
|
||||
<string name="share_unsupported_error">Partajarea nu este acceptată sau nu este activată</string>
|
||||
<string name="asset_link_clipboard_label">Link activ Tempus</string>
|
||||
<string name="asset_link_label_song">UID Cântec</string>
|
||||
<string name="asset_link_label_album">UID Album</string>
|
||||
<string name="asset_link_label_artist">UID Artist</string>
|
||||
<string name="asset_link_label_playlist">UID Playlist</string>
|
||||
<string name="asset_link_label_genre">UID Gen</string>
|
||||
<string name="asset_link_label_year">UID Anul</string>
|
||||
<string name="asset_link_label_unknown">UID Activ</string>
|
||||
<string name="asset_link_error_unsupported">Link activ neacceptat</string>
|
||||
<string name="asset_link_error_song">Cântecul nu a putut fi deschis</string>
|
||||
<string name="asset_link_error_album">Albumul nu a putut fi deschis</string>
|
||||
<string name="asset_link_error_artist">Artistul nu a putut fi deschis</string>
|
||||
<string name="asset_link_error_playlist">Playlistul nu a putut fi deschis</string>
|
||||
<string name="asset_link_chip_text">%1$s • %2$s</string>
|
||||
<string name="asset_link_copied_toast">Copiat %1$s în clipboard</string>
|
||||
<string name="asset_link_debug_toast">Link activ: %1$s</string>
|
||||
<string name="share_update_dialog_hint_description">Descriere</string>
|
||||
<string name="share_update_dialog_hint_expiration_date">Data expirării</string>
|
||||
<string name="share_update_dialog_negative_button">Anulati</string>
|
||||
<string name="share_update_dialog_positive_button">Salvaţi</string>
|
||||
<string name="share_update_dialog_title">Partajare</string>
|
||||
<string name="song_bottom_sheet_add_to_playlist">Adăugați la playlist</string>
|
||||
<string name="song_bottom_sheet_add_to_queue">Adăugați la coadă</string>
|
||||
<string name="song_bottom_sheet_download">Descarcaţi</string>
|
||||
<string name="song_bottom_sheet_error_retrieving_album">Eroare la preluarea albumului</string>
|
||||
<string name="song_bottom_sheet_error_retrieving_artist">Eroare la preluarea artistului</string>
|
||||
<string name="song_bottom_sheet_go_to_album">Mergeți la album</string>
|
||||
<string name="song_bottom_sheet_go_to_artist">Mergeți la artist</string>
|
||||
<string name="song_bottom_sheet_instant_mix">Mix instant</string>
|
||||
<string name="song_bottom_sheet_play_next">Redați următoarea</string>
|
||||
<string name="song_bottom_sheet_rate">Evaluaţi</string>
|
||||
<string name="song_bottom_sheet_remove">Eliminaţi</string>
|
||||
<string name="song_bottom_sheet_share">Partajați</string>
|
||||
<string name="song_list_page_downloaded">Descarcate</string>
|
||||
<string name="song_list_page_most_played">Piese cele mai ascultate</string>
|
||||
<string name="song_list_page_recently_added">Piese adăugate recent</string>
|
||||
<string name="song_list_page_recently_played">Piese redate recent</string>
|
||||
<string name="song_list_page_starred">Piese marcate</string>
|
||||
<string name="song_list_page_top">Piesele top ale lui %1$s</string>
|
||||
<string name="song_list_page_year">Anul %1$d</string>
|
||||
<string name="song_subtitle_formatter">%1$s • %2$s %3$s</string>
|
||||
<string name="starred_sync_dialog_negative_button">Anulati</string>
|
||||
<string name="starred_sync_dialog_neutral_button">Continuaţi</string>
|
||||
<string name="starred_sync_dialog_positive_button">Continuaţi și descarcaţi</string>
|
||||
<string name="starred_sync_dialog_summary">Descărcarea pieselor marcate poate necesita o cantitate mare de date.</string>
|
||||
<string name="starred_sync_dialog_title">Sincronizează piesele marcate</string>
|
||||
<string name="starred_artist_sync_dialog_summary">Descărcarea artiștilor marcați poate necesita o cantitate mare de date.</string>
|
||||
<string name="starred_artist_sync_dialog_title">Sincronizează artiștii marcați</string>
|
||||
<string name="starred_album_sync_dialog_summary">Descărcarea albumelor marcate poate necesita o cantitate mare de date.</string>
|
||||
<string name="starred_album_sync_dialog_title">Sincronizează albumele marcate</string>
|
||||
<string name="streaming_cache_storage_dialog_sub_summary">Pentru ca modificările să aibă efect, reporniți aplicația.</string>
|
||||
<string name="streaming_cache_storage_dialog_summary">Schimbarea destinației fișierelor cache-ului dintr-un spațiu de stocare la altul poate duce la ștergerea oricăror fișiere cache-ului anterior în celălalt spațiu de stocare.</string>
|
||||
<string name="streaming_cache_storage_dialog_title">Selectați opțiunea de stocare</string>
|
||||
<string name="streaming_cache_storage_external_dialog_positive_button">Extern</string>
|
||||
<string name="streaming_cache_storage_internal_dialog_negative_button">Intern</string>
|
||||
<string name="support_url">https://ko-fi.com/eddyizm</string>
|
||||
<string name="track_info_album">Album</string>
|
||||
<string name="track_info_artist">Artist</string>
|
||||
<string name="track_info_bit_depth">Adâncime bit</string>
|
||||
<string name="track_info_bitrate">Bitrate</string>
|
||||
<string name="track_info_content_type">Tip conținut</string>
|
||||
<string name="track_info_dialog_positive_button">OK</string>
|
||||
<string name="track_info_dialog_title">Informații piesă</string>
|
||||
<string name="track_info_disc_number">Număr disc</string>
|
||||
<string name="track_info_duration">Durată</string>
|
||||
<string name="track_info_genre">Gen</string>
|
||||
<string name="track_info_path">Cale</string>
|
||||
<string name="track_info_sampling_rate">Rată de eșantionare</string>
|
||||
<string name="track_info_size">Dimensiune</string>
|
||||
<string name="track_info_suffix">Sufix</string>
|
||||
<string name="track_info_summary_downloaded_file">Fișierul a fost descărcat folosind API-urile Subsonic. Codecul și bitrate-ul fișierului rămân neschimbate din fișierul sursă.</string>
|
||||
<string name="track_info_summary_full_transcode">Aplicația va cere serverului să transcodeze fișierul și să-i modifice bitrate-ul. Codecul solicitat de utilizator este %1$s, cu un bitrate de %2$s. Orice posibile modificări ale codecului și bitrate-ul fișierului în formatul ales vor fi gestionate de server, care poate sau nu să suporte operația.</string>
|
||||
<string name="track_info_summary_original_file">Aplicația va citi doar fișierul original furnizat de server. Aplicația va cere în mod explicit serverului fișierul netranscodat cu bitrate-ul sursei originale.</string>
|
||||
<string name="track_info_summary_server_prioritized">Calitatea fișierului care urmează a fi redat este lăsată la alegerea serverului. Aplicația nu va forța alegerea codecului și bitrate-ului pentru nicio posibilă transcodare.</string>
|
||||
<string name="track_info_summary_transcoding_bitrate">Aplicația va cere serverului să modifice bitrate-ul fișierului. Utilizatorul a solicitat un bitrate de %1$s, în timp ce codecul fișierului sursă va rămâne același. Orice modificări ale bitrate-ului fișierului în formatul ales vor fi făcute de server, care poate sau nu să suporte operația.</string>
|
||||
<string name="track_info_summary_transcoding_codec">Aplicația va cere serverului să transcodeze fișierul. Codecul solicitat de utilizator este %1$s, în timp ce bitrate-ul va fi același cu fișierul sursă. Potențiala transcodare a fișierului în formatul ales depinde de server, deoarece poate sau nu să suporte operația.</string>
|
||||
<string name="track_info_title">Titlu</string>
|
||||
<string name="track_info_track_number">Număr piesă</string>
|
||||
<string name="track_info_transcoded_content_type">Tip conținut transcodat</string>
|
||||
<string name="track_info_transcoded_suffix">Sufix transcodat</string>
|
||||
<string name="track_info_year">Anul</string>
|
||||
<string name="undraw_page">unDraw</string>
|
||||
<string name="undraw_thanks">Mulțumiri speciale merită unDraw fără ale cărui ilustrații nu am putut face această aplicație mai frumoasă.</string>
|
||||
<string name="undraw_url">https://undraw.co/</string>
|
||||
<string name="widget_label">Widget Tempus</string>
|
||||
<string name="widget_not_playing">Nu se redă</string>
|
||||
<string name="widget_placeholder_subtitle">Deschideți 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">Ilustrație album</string>
|
||||
<string name="widget_content_desc_play_pause">Redare sau pauză</string>
|
||||
<string name="widget_content_desc_next">Piesa următoare</string>
|
||||
<string name="widget_content_desc_prev">Piesa anterioară</string>
|
||||
<string name="widget_content_desc_shuffle">Activaţi amestecare</string>
|
||||
<string name="widget_content_desc_repeat">Schimbați modul repetare</string>
|
||||
<plurals name="home_sync_starred_albums_count">
|
||||
<item quantity="one">%d album de sincronizat</item>
|
||||
<item quantity="other">%d albume de sincronizat</item>
|
||||
</plurals>
|
||||
<plurals name="home_sync_starred_artists_count">
|
||||
<item quantity="one">%d artist de sincronizat</item>
|
||||
<item quantity="other">%d artiști de sincronizat</item>
|
||||
</plurals>
|
||||
<plurals name="songs_download_started">
|
||||
<item quantity="one">Se descarcă %d cântec</item>
|
||||
<item quantity="other">Se descarcă %d cântece</item>
|
||||
</plurals>
|
||||
<string name="equalizer_fragment_title">Egalizator</string>
|
||||
<string name="equalizer_reset">Resetaţi</string>
|
||||
<string name="equalizer_enable">Activaţi</string>
|
||||
<string name="equalizer_not_supported">Nu este acceptat pe acest dispozitiv</string>
|
||||
<string name="settings_app_equalizer">Egalizator</string>
|
||||
<string name="settings_app_equalizer_summary">Deschideți egalizatorul încorporat</string>
|
||||
|
||||
<string name="settings_album_detail">Arătați detalii album</string>
|
||||
<string name="settings_album_detail_summary">Dacă este activat, afișează detalii album cum ar fi gen, număr de cântece etc. pe pagina albumului</string>
|
||||
<string name="settings_artist_sort_by_album_count">Sortaţi artiști după numărul de albume</string>
|
||||
<string name="settings_artist_sort_by_album_count_summary">Dacă este activat, sortează artiștii după numărul de albume. Sortează după nume dacă este dezactivat.</string>
|
||||
|
||||
<string name="folder_play_collecting">Se colectează cântece din folder…</string>
|
||||
<string name="folder_play_playing">Se redau %d cântece</string>
|
||||
<string name="folder_play_no_songs">Nu au fost găsite cântece în folder</string>
|
||||
|
||||
<string name="search_sort_title">Sortaţi căutările recente cronologic</string>
|
||||
<string name="search_sort_summary">Dacă este activat, sortează căutările cronologic. Sortează după nume dacă este dezactivat.</string>
|
||||
</resources>
|
||||
@@ -240,6 +240,16 @@
|
||||
<item>8</item>
|
||||
</string-array>
|
||||
|
||||
<string-array name="playlist_sort_option_titles">
|
||||
<item>Name</item>
|
||||
<item>Random</item>
|
||||
</string-array>
|
||||
<string-array name="playlist_sort_option_values">
|
||||
<item>ORDER_BY_NAME</item>
|
||||
<item>ORDER_BY_RANDOM</item>
|
||||
</string-array>
|
||||
|
||||
|
||||
<string-array name="skip_min_star_rating_titles">
|
||||
<item>0 star minimum</item>
|
||||
<item>1 star minimum</item>
|
||||
|
||||
@@ -353,6 +353,9 @@
|
||||
<string name="settings_image_size">Set image resolution</string>
|
||||
<string name="settings_language">Language</string>
|
||||
<string name="settings_logout_title">Log out</string>
|
||||
<string name="settings_ping_timeout_title">Server Ping Timeout</string>
|
||||
<string name="settings_ping_timeout_summary">Set Local URL timeout. Default 2 seconds. (Remote server will use this value x3 up to 10 seconds max.)</string>
|
||||
<string name="settings_ping_timeout_dialog">Set base timeout in seconds.</string>
|
||||
<string name="settings_max_bitrate_download">Bitrate for downloads</string>
|
||||
<string name="settings_max_bitrate_mobile">Bitrate in mobile</string>
|
||||
<string name="settings_max_bitrate_wifi">Bitrate in Wi-Fi</string>
|
||||
@@ -361,6 +364,7 @@
|
||||
<string name="settings_music_directory_summary">If enabled, show the music directory section. Please note that for folder navigation to work properly, the server must support this feature.</string>
|
||||
<string name="settings_podcast">Show podcast</string>
|
||||
<string name="settings_podcast_summary">If enabled, show the podcast section. Restart the app for it to take full effect.</string>
|
||||
<string name="settings_playlist_sort">Playlist sorting</string>
|
||||
<string name="settings_audio_quality">Show audio quality</string>
|
||||
<string name="settings_audio_quality_summary">The bitrate and audio format will be shown for each audio track.</string>
|
||||
<string name="settings_song_rating">Show song star rating</string>
|
||||
|
||||
@@ -17,6 +17,15 @@
|
||||
android:key="scan_library"
|
||||
android:title="@string/settings_scan_title" />
|
||||
|
||||
<EditTextPreference
|
||||
android:key="network_ping_timeout_base"
|
||||
android:title="@string/settings_ping_timeout_title"
|
||||
app:summary="@string/settings_ping_timeout_summary"
|
||||
android:dialogTitle="@string/settings_ping_timeout_dialog"
|
||||
android:inputType="number"
|
||||
android:singleLine="true"
|
||||
android:defaultValue="2" />
|
||||
|
||||
<Preference
|
||||
android:key="logout"
|
||||
android:title="@string/settings_logout_title"/>
|
||||
@@ -136,6 +145,14 @@
|
||||
android:defaultValue="false"
|
||||
android:summary="@string/settings_allow_playlist_duplicates_summary"
|
||||
android:key="allow_playlist_duplicates" />
|
||||
<ListPreference
|
||||
app:defaultValue="ORDER_BY_NAME"
|
||||
app:dialogTitle="@string/settings_playlist_sort"
|
||||
app:entries="@array/playlist_sort_option_titles"
|
||||
app:entryValues="@array/playlist_sort_option_values"
|
||||
app:key="home_sort_playlists"
|
||||
app:title="@string/settings_playlist_sort"
|
||||
app:useSimpleSummaryProvider="true" />
|
||||
</PreferenceCategory>
|
||||
|
||||
|
||||
|
||||
@@ -12,4 +12,5 @@
|
||||
<locale android:name="pl-PL"/> <!-- Polish -->
|
||||
<locale android:name="tr-TR"/> <!-- Turkish -->
|
||||
<locale android:name="ca"/> <!-- Catalan -->
|
||||
<locale android:name="ro"/> <!-- Romanian -->
|
||||
</locale-config>
|
||||
|
||||
1
fastlane/metadata/android/en-US/changelogs/13.txt
Normal file
1
fastlane/metadata/android/en-US/changelogs/13.txt
Normal file
@@ -0,0 +1 @@
|
||||
fix: instant mix random songs and broken continuous play
|
||||
12
fastlane/metadata/android/en-US/changelogs/14.txt
Normal file
12
fastlane/metadata/android/en-US/changelogs/14.txt
Normal file
@@ -0,0 +1,12 @@
|
||||
chore: i18n: Add Romanian translation (including locale_config this time!)
|
||||
chore: French localization update
|
||||
chore(i18n): Update Spanish translation
|
||||
docs: updated readme and added known issues for airsonic work around
|
||||
fix: toast for made for you click indication
|
||||
fix: sort playlist view
|
||||
feat: sort preference for playlists
|
||||
fix: use existing future when adding tracks, dialed random album tracks off in instant mix
|
||||
chore(i18n): Update Polish translation
|
||||
fix: Check for OpenSubsonic extensions also with password authentication, addressing lyric sync
|
||||
feat: Implement duration and seeking for transcodes
|
||||
feat: Playback speed controls for music
|
||||
3
fastlane/metadata/android/en-US/changelogs/15.txt
Normal file
3
fastlane/metadata/android/en-US/changelogs/15.txt
Normal file
@@ -0,0 +1,3 @@
|
||||
fix: Proper raw stream detection
|
||||
chore(i18n): Update Spanish translation
|
||||
feat: add configurable timeout
|
||||
2
fastlane/metadata/android/en-US/changelogs/16.txt
Normal file
2
fastlane/metadata/android/en-US/changelogs/16.txt
Normal file
@@ -0,0 +1,2 @@
|
||||
fix: Avoid crash when server has no songs
|
||||
fix: updated dialog import to address crashing on android 15
|
||||
Reference in New Issue
Block a user