diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..99beffd
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,21 @@
+*.iml
+.gradle
+/local.properties
+/.idea/caches
+/.idea/libraries
+/.idea/modules.xml
+/.idea/workspace.xml
+/.idea/navEditor.xml
+/.idea/assetWizardSettings.xml
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+.cxx
+/.idea/
+.env
+.vscode/settings.json
+# release / debug files
+tempus-release-key.jks
+app/tempus/
+app/degoogled/
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 2694a36..5cfe862 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,6 +1,36 @@
# Changelog
## Pending release...
+
+## [4.3.0](https://github.com/eddyizm/tempo/releases/tag/v4.3.0) (2025-11-23)
+## What's Changed
+* chore: Add Obtainium badge to README by @mikaeldui in https://github.com/eddyizm/tempus/pull/280
+* fix: Revert "refactor MediaService" by @eddyizm in https://github.com/eddyizm/tempus/pull/282
+* feat: add play functionality to library folder/index items by @antebudimir in https://github.com/eddyizm/tempus/pull/276
+* fix: start queue blocking UI by @eddyizm in https://github.com/eddyizm/tempus/pull/283
+
+## New Contributors
+* @mikaeldui made their first contribution in https://github.com/eddyizm/tempus/pull/280
+* @antebudimir made their first contribution in https://github.com/eddyizm/tempus/pull/276
+
+**Full Changelog**: https://github.com/eddyizm/tempus/compare/v4.2.6...v4.3.0
+
+## [4.2.6](https://github.com/eddyizm/tempo/releases/tag/v4.2.6) (2025-11-22)
+## What's Changed
+* fix: Fix player queue soft-lock by @shrapnelnet in https://github.com/eddyizm/tempus/pull/266
+* chore: Add Catalan i18n by @marcriera in https://github.com/eddyizm/tempus/pull/268
+* chore: Refactor MediaService by @pca006132 in https://github.com/eddyizm/tempus/pull/267
+* chore(i18n): Update Spanish translation by @jaime-grj in https://github.com/eddyizm/tempus/pull/272
+* chore(i18n): Update Italian translation by @66Bunz in https://github.com/eddyizm/tempus/pull/278
+
+## New Contributors
+* @marcriera made their first contribution in https://github.com/eddyizm/tempus/pull/268
+* @66Bunz made their first contribution in https://github.com/eddyizm/tempus/pull/278
+
+**Full Changelog**: https://github.com/eddyizm/tempus/compare/v4.2.4...v4.2.6
+
+## [4.2.4](https://github.com/eddyizm/tempo/releases/tag/v4.2.4) (2025-11-15)
+## What's Changed
* chore: Update russian strings.xml by @Sevinfolds in https://github.com/eddyizm/tempus/pull/249
* fix: disallow duplicate songs in queue by @eddyizm in https://github.com/eddyizm/tempus/pull/252
* fix:github release check by @eddyizm in https://github.com/eddyizm/tempus/pull/253
@@ -12,6 +42,7 @@
* @Sevinfolds made their first contribution in https://github.com/eddyizm/tempus/pull/249
* @drakeerv made their first contribution in https://github.com/eddyizm/tempus/pull/255
+**Full Changelog**: https://github.com/eddyizm/tempus/compare/v4.2.0...v4.2.4
## [4.2.0](https://github.com/eddyizm/tempo/releases/tag/v4.2.0) (2025-11-09)
## What's Changed
* fix: Equalizer fix in main build variant by @jaime-grj in https://github.com/eddyizm/tempus/pull/239
diff --git a/README.md b/README.md
index 102b282..a84b03e 100644
--- a/README.md
+++ b/README.md
@@ -10,6 +10,21 @@
+
+[

](https://shields.rbtlog.dev/com.eddyizm.degoogled.tempus)
+
+
+
+
+
+
+
+
+
+
+
**Tempus** is an open-source and lightweight music client for Subsonic, designed and built natively for Android. It provides a seamless and intuitive music streaming experience, allowing you to access and play your Subsonic music library directly from your Android device.
Tempus does not rely on magic algorithms to decide what you should listen to. Instead, the interface is built around your listening history, randomness, and optionally integrates with services like Last.fm to personalize your music experience.
@@ -109,4 +124,4 @@ Tempus is released under the [GNU General Public License v3.0](LICENSE). Feel fr
## Credits
Thanks to the original repo/creator [CappielloAntonio](https://github.com/CappielloAntonio) (forked from v3.9.0)
-[Opensvg.org](https://opensvg.org) for the new turntable logo.
\ No newline at end of file
+[Opensvg.org](https://opensvg.org) for the new turntable logo.
diff --git a/USAGE.md b/USAGE.md
index 05abee9..d3a946d 100644
--- a/USAGE.md
+++ b/USAGE.md
@@ -69,6 +69,21 @@ However, if you want to limit or change libraries you could use a workaround, if
You can create multiple users , one for each library, and save each of them in Tempus app.
+### Folder or index playback
+
+If your Subsonic-compatible server exposes the folder tree **or** provides an artist index (for example Gonic, Navidrome, or any backend with folder browsing enabled), Tempus lets you play an entire folder from anywhere in the library hierarchy:
+
+
+
+
+
+
+- The **Library ▸ Music folders** screen shows each top-level folder with a play icon only after you drill into it. The root entry remains a simple navigator.
+- When viewing **inner folders** **or artist index entries**, tap the new play button to immediately enqueue every audio track inside that folder/index and all nested subfolders.
+- Video files are excluded automatically, so only playable audio ends up in the queue.
+
+No extra config is needed—Tempus adjusts based on the connected backend.
+
### Now Playing Screen
On the main player control screen, tapping on the artwork will reveal a small collection of 4 buttons/icons.
diff --git a/app/build.gradle b/app/build.gradle
index 3f3f577..f059ab6 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -10,8 +10,8 @@ android {
minSdkVersion 24
targetSdk 35
- versionCode 6
- versionName '4.2.4'
+ versionCode 8
+ versionName '4.3.0'
testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner'
javaCompileOptions {
diff --git a/app/src/degoogled/java/com/cappielloantonio/tempo/service/MediaService.kt b/app/src/degoogled/java/com/cappielloantonio/tempo/service/MediaService.kt
index 5c4e939..d595a8a 100644
--- a/app/src/degoogled/java/com/cappielloantonio/tempo/service/MediaService.kt
+++ b/app/src/degoogled/java/com/cappielloantonio/tempo/service/MediaService.kt
@@ -19,6 +19,7 @@ import androidx.media3.common.util.UnstableApi
import androidx.media3.exoplayer.DefaultLoadControl
import androidx.media3.exoplayer.ExoPlayer
import androidx.media3.exoplayer.source.MediaSource
+import androidx.media3.exoplayer.source.ShuffleOrder.DefaultShuffleOrder
import androidx.media3.session.*
import androidx.media3.session.MediaSession.ControllerInfo
import com.cappielloantonio.tempo.R
@@ -39,6 +40,7 @@ import com.google.common.util.concurrent.ListenableFuture
@UnstableApi
class MediaService : MediaLibraryService() {
+ private val TAG = "MediaService"
private val librarySessionCallback = CustomMediaLibrarySessionCallback()
private lateinit var player: ExoPlayer
@@ -86,7 +88,7 @@ class MediaService : MediaLibraryService() {
}
fun updateMediaItems() {
- Log.d("MediaService", "update items");
+ Log.d(TAG, "update items");
val n = player.mediaItemCount
val k = player.currentMediaItemIndex
val current = player.currentPosition
@@ -349,14 +351,30 @@ class MediaService : MediaLibraryService() {
}
override fun onTracksChanged(tracks: Tracks) {
+ Log.d(TAG, "onTracksChanged " + player.currentMediaItemIndex);
ReplayGainUtil.setReplayGain(player, tracks)
val currentMediaItem = player.currentMediaItem
- if (currentMediaItem != null && currentMediaItem.mediaMetadata.extras != null) {
- MediaManager.scrobble(currentMediaItem, false)
+ if (currentMediaItem != null) {
+ val item = MappingUtil.mapMediaItem(currentMediaItem)
+ if (item.mediaMetadata.extras != null)
+ MediaManager.scrobble(item, false)
+
+ if (player.nextMediaItemIndex == C.INDEX_UNSET)
+ MediaManager.continuousPlay(player.currentMediaItem)
}
- if (player.currentMediaItemIndex + 1 == player.mediaItemCount)
- MediaManager.continuousPlay(player.currentMediaItem)
+ // https://stackoverflow.com/questions/56937283/exoplayer-shuffle-doesnt-reproduce-all-the-songs
+ if (MediaManager.justStarted.get()) {
+ Log.d(TAG, "update shuffle order")
+ MediaManager.justStarted.set(false)
+ val shuffledList = IntArray(player.mediaItemCount) { i -> i }
+ shuffledList.shuffle()
+ val index = shuffledList.indexOf(player.currentMediaItemIndex)
+ // swap current media index to the first index
+ if (index > -1 && shuffledList.isNotEmpty())
+ run { val tmp = shuffledList[0]; shuffledList[0] = shuffledList[index]; shuffledList[index] = tmp}
+ player.shuffleOrder = DefaultShuffleOrder(shuffledList, kotlin.random.Random.nextLong())
+ }
}
override fun onIsPlayingChanged(isPlaying: Boolean) {
diff --git a/app/src/main/java/com/cappielloantonio/tempo/interfaces/ClickCallback.java b/app/src/main/java/com/cappielloantonio/tempo/interfaces/ClickCallback.java
index d65695c..47ca6db 100644
--- a/app/src/main/java/com/cappielloantonio/tempo/interfaces/ClickCallback.java
+++ b/app/src/main/java/com/cappielloantonio/tempo/interfaces/ClickCallback.java
@@ -27,8 +27,11 @@ public interface ClickCallback {
default void onInternetRadioStationClick(Bundle bundle) {}
default void onInternetRadioStationLongClick(Bundle bundle) {}
default void onMusicFolderClick(Bundle bundle) {}
+ default void onMusicFolderPlay(Bundle bundle) {}
default void onMusicDirectoryClick(Bundle bundle) {}
+ default void onMusicDirectoryPlay(Bundle bundle) {}
default void onMusicIndexClick(Bundle bundle) {}
+ default void onMusicIndexPlay(Bundle bundle) {}
default void onDownloadGroupLongClick(Bundle bundle) {}
default void onShareClick(Bundle bundle) {}
default void onShareLongClick(Bundle bundle) {}
diff --git a/app/src/main/java/com/cappielloantonio/tempo/service/MediaManager.java b/app/src/main/java/com/cappielloantonio/tempo/service/MediaManager.java
index f7cd8a3..2a55151 100644
--- a/app/src/main/java/com/cappielloantonio/tempo/service/MediaManager.java
+++ b/app/src/main/java/com/cappielloantonio/tempo/service/MediaManager.java
@@ -2,6 +2,8 @@ package com.cappielloantonio.tempo.service;
import android.content.ComponentName;
import android.util.Log;
+import android.os.Handler;
+import android.os.Looper;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
@@ -36,10 +38,16 @@ import com.google.common.util.concurrent.MoreExecutors;
import java.lang.ref.WeakReference;
import java.util.List;
import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.atomic.AtomicBoolean;
public class MediaManager {
private static final String TAG = "MediaManager";
private static WeakReference attachedBrowserRef = new WeakReference<>(null);
+ public static AtomicBoolean justStarted = new AtomicBoolean(false);
+
+ private static final ExecutorService backgroundExecutor = Executors.newSingleThreadExecutor();
public static void registerPlaybackObserver(
ListenableFuture browserFuture,
@@ -173,36 +181,43 @@ public class MediaManager {
}
}
+ @OptIn(markerClass = UnstableApi.class)
public static void startQueue(ListenableFuture mediaBrowserListenableFuture, List media, int startIndex) {
if (mediaBrowserListenableFuture != null) {
mediaBrowserListenableFuture.addListener(() -> {
try {
if (mediaBrowserListenableFuture.isDone()) {
- MediaBrowser browser = mediaBrowserListenableFuture.get();
- browser.clearMediaItems();
- browser.setMediaItems(MappingUtil.mapMediaItems(media));
- browser.prepare();
+ final MediaBrowser browser = mediaBrowserListenableFuture.get();
- Player.Listener timelineListener = new Player.Listener() {
- @Override
- public void onTimelineChanged(Timeline timeline, int reason) {
- int itemCount = browser.getMediaItemCount();
- if (itemCount > 0 && startIndex >= 0 && startIndex < itemCount) {
- browser.seekTo(startIndex, 0);
- browser.play();
- browser.removeListener(this);
- }
- }
- };
- browser.addListener(timelineListener);
-
- enqueueDatabase(media, true, 0);
+ backgroundExecutor.execute(() -> {
+ final List items = MappingUtil.mapMediaItems(media);
+ enqueueDatabase(media, true, 0);
+ new Handler(Looper.getMainLooper()).post(() -> {
+ justStarted.set(true);
+ browser.setMediaItems(items, startIndex, 0);
+ browser.prepare();
+ Player.Listener timelineListener = new Player.Listener() {
+ @Override
+ public void onTimelineChanged(Timeline timeline, int reason) {
+ int itemCount = browser.getMediaItemCount();
+ if (itemCount > 0 && startIndex >= 0 && startIndex < itemCount) {
+ browser.seekTo(startIndex, 0);
+ browser.play();
+ browser.removeListener(this);
+ }
+ }
+ };
+ browser.addListener(timelineListener);
+ });
+ });
}
} catch (ExecutionException | InterruptedException e) {
- e.printStackTrace();
+ Log.e(TAG, "Error executing startQueue logic: " + e.getMessage(), e);
}
}, MoreExecutors.directExecutor());
}
+
+
}
public static void startQueue(ListenableFuture mediaBrowserListenableFuture, Child media) {
@@ -210,10 +225,11 @@ public class MediaManager {
mediaBrowserListenableFuture.addListener(() -> {
try {
if (mediaBrowserListenableFuture.isDone()) {
- mediaBrowserListenableFuture.get().clearMediaItems();
- mediaBrowserListenableFuture.get().setMediaItem(MappingUtil.mapMediaItem(media));
- mediaBrowserListenableFuture.get().prepare();
- mediaBrowserListenableFuture.get().play();
+ MediaBrowser browser = mediaBrowserListenableFuture.get();
+ justStarted.set(true);
+ browser.setMediaItem(MappingUtil.mapMediaItem(media));
+ browser.prepare();
+ browser.play();
enqueueDatabase(media, true, 0);
}
} catch (ExecutionException | InterruptedException e) {
@@ -229,7 +245,7 @@ public class MediaManager {
try {
if (mediaBrowserListenableFuture.isDone()) {
MediaBrowser mediaBrowser = mediaBrowserListenableFuture.get();
- mediaBrowser.clearMediaItems();
+ justStarted.set(true);
mediaBrowser.setMediaItem(mediaItem);
mediaBrowser.prepare();
mediaBrowser.play();
@@ -247,10 +263,11 @@ public class MediaManager {
mediaBrowserListenableFuture.addListener(() -> {
try {
if (mediaBrowserListenableFuture.isDone()) {
- mediaBrowserListenableFuture.get().clearMediaItems();
- mediaBrowserListenableFuture.get().setMediaItem(MappingUtil.mapInternetRadioStation(internetRadioStation));
- mediaBrowserListenableFuture.get().prepare();
- mediaBrowserListenableFuture.get().play();
+ MediaBrowser browser = mediaBrowserListenableFuture.get();
+ justStarted.set(true);
+ browser.setMediaItem(MappingUtil.mapInternetRadioStation(internetRadioStation));
+ browser.prepare();
+ browser.play();
}
} catch (ExecutionException | InterruptedException e) {
e.printStackTrace();
@@ -264,10 +281,11 @@ public class MediaManager {
mediaBrowserListenableFuture.addListener(() -> {
try {
if (mediaBrowserListenableFuture.isDone()) {
- mediaBrowserListenableFuture.get().clearMediaItems();
- mediaBrowserListenableFuture.get().setMediaItem(MappingUtil.mapMediaItem(podcastEpisode));
- mediaBrowserListenableFuture.get().prepare();
- mediaBrowserListenableFuture.get().play();
+ MediaBrowser browser = mediaBrowserListenableFuture.get();
+ justStarted.set(true);
+ browser.setMediaItem(MappingUtil.mapMediaItem(podcastEpisode));
+ browser.prepare();
+ browser.play();
}
} catch (ExecutionException | InterruptedException e) {
e.printStackTrace();
@@ -281,9 +299,11 @@ public class MediaManager {
mediaBrowserListenableFuture.addListener(() -> {
try {
if (mediaBrowserListenableFuture.isDone()) {
- if (playImmediatelyAfter && mediaBrowserListenableFuture.get().getNextMediaItemIndex() != -1) {
- enqueueDatabase(media, false, mediaBrowserListenableFuture.get().getNextMediaItemIndex());
- mediaBrowserListenableFuture.get().addMediaItems(mediaBrowserListenableFuture.get().getNextMediaItemIndex(), MappingUtil.mapMediaItems(media));
+ Log.e(TAG, "enqueue");
+ MediaBrowser browser = mediaBrowserListenableFuture.get();
+ if (playImmediatelyAfter && browser.getNextMediaItemIndex() != -1) {
+ enqueueDatabase(media, false, browser.getNextMediaItemIndex());
+ browser.addMediaItems(browser.getNextMediaItemIndex(), MappingUtil.mapMediaItems(media));
} else {
enqueueDatabase(media, false, mediaBrowserListenableFuture.get().getMediaItemCount());
mediaBrowserListenableFuture.get().addMediaItems(MappingUtil.mapMediaItems(media));
@@ -301,9 +321,11 @@ public class MediaManager {
mediaBrowserListenableFuture.addListener(() -> {
try {
if (mediaBrowserListenableFuture.isDone()) {
- if (playImmediatelyAfter && mediaBrowserListenableFuture.get().getNextMediaItemIndex() != -1) {
- enqueueDatabase(media, false, mediaBrowserListenableFuture.get().getNextMediaItemIndex());
- mediaBrowserListenableFuture.get().addMediaItem(mediaBrowserListenableFuture.get().getNextMediaItemIndex(), MappingUtil.mapMediaItem(media));
+ Log.e(TAG, "enqueue");
+ MediaBrowser browser = mediaBrowserListenableFuture.get();
+ if (playImmediatelyAfter && browser.getNextMediaItemIndex() != -1) {
+ enqueueDatabase(media, false, browser.getNextMediaItemIndex());
+ browser.addMediaItem(browser.getNextMediaItemIndex(), MappingUtil.mapMediaItem(media));
} else {
enqueueDatabase(media, false, mediaBrowserListenableFuture.get().getMediaItemCount());
mediaBrowserListenableFuture.get().addMediaItem(MappingUtil.mapMediaItem(media));
@@ -321,8 +343,10 @@ public class MediaManager {
mediaBrowserListenableFuture.addListener(() -> {
try {
if (mediaBrowserListenableFuture.isDone()) {
- mediaBrowserListenableFuture.get().removeMediaItems(startIndex, endIndex + 1);
- mediaBrowserListenableFuture.get().addMediaItems(MappingUtil.mapMediaItems(media).subList(startIndex, endIndex + 1));
+ Log.e(TAG, "shuffle");
+ MediaBrowser browser = mediaBrowserListenableFuture.get();
+ browser.removeMediaItems(startIndex, endIndex + 1);
+ browser.addMediaItems(MappingUtil.mapMediaItems(media).subList(startIndex, endIndex + 1));
swapDatabase(media);
}
} catch (ExecutionException | InterruptedException e) {
@@ -337,6 +361,7 @@ public class MediaManager {
mediaBrowserListenableFuture.addListener(() -> {
try {
if (mediaBrowserListenableFuture.isDone()) {
+ Log.e(TAG, "swap");
mediaBrowserListenableFuture.get().moveMediaItem(from, to);
swapDatabase(media);
}
@@ -352,6 +377,7 @@ public class MediaManager {
mediaBrowserListenableFuture.addListener(() -> {
try {
if (mediaBrowserListenableFuture.isDone()) {
+ Log.e(TAG, "remove");
if (mediaBrowserListenableFuture.get().getMediaItemCount() > 1 && mediaBrowserListenableFuture.get().getCurrentMediaItemIndex() != toRemove) {
mediaBrowserListenableFuture.get().removeMediaItem(toRemove);
removeDatabase(media, toRemove);
@@ -371,6 +397,7 @@ public class MediaManager {
mediaBrowserListenableFuture.addListener(() -> {
try {
if (mediaBrowserListenableFuture.isDone()) {
+ Log.e(TAG, "remove range");
mediaBrowserListenableFuture.get().removeMediaItems(fromItem, toItem);
removeRangeDatabase(media, fromItem, toItem);
}
@@ -420,6 +447,7 @@ public class MediaManager {
@Override
public void onChanged(List media) {
if (media != null) {
+ Log.e(TAG, "continuous play");
ListenableFuture mediaBrowserListenableFuture = new MediaBrowser.Builder(
App.getContext(),
new SessionToken(App.getContext(), new ComponentName(App.getContext(), MediaService.class))
diff --git a/app/src/main/java/com/cappielloantonio/tempo/ui/adapter/MusicDirectoryAdapter.java b/app/src/main/java/com/cappielloantonio/tempo/ui/adapter/MusicDirectoryAdapter.java
index f186bee..679c262 100644
--- a/app/src/main/java/com/cappielloantonio/tempo/ui/adapter/MusicDirectoryAdapter.java
+++ b/app/src/main/java/com/cappielloantonio/tempo/ui/adapter/MusicDirectoryAdapter.java
@@ -53,7 +53,7 @@ public class MusicDirectoryAdapter extends RecyclerView.Adapter onLongClick());
item.musicDirectoryMoreButton.setOnClickListener(v -> onClick());
+ item.musicDirectoryPlayButton.setOnClickListener(v -> onPlayClick());
}
public void onClick() {
@@ -107,5 +108,13 @@ public class MusicDirectoryAdapter extends RecyclerView.Adapter onClick());
item.musicIndexMoreButton.setOnClickListener(v -> onClick());
+ item.musicIndexPlayButton.setOnClickListener(v -> onPlayClick());
}
public void onClick() {
@@ -83,5 +84,11 @@ public class MusicIndexAdapter extends RecyclerView.Adapter mediaBrowserListenableFuture;
+ private DirectoryRepository directoryRepository;
private MenuItem menuItem;
@@ -77,6 +84,7 @@ public class DirectoryFragment extends Fragment implements ClickCallback {
bind = FragmentDirectoryBinding.inflate(inflater, container, false);
View view = bind.getRoot();
directoryViewModel = new ViewModelProvider(requireActivity()).get(DirectoryViewModel.class);
+ directoryRepository = new DirectoryRepository();
initAppBar();
initDirectoryListView();
@@ -197,4 +205,57 @@ public class DirectoryFragment extends Fragment implements ClickCallback {
public void onMusicDirectoryClick(Bundle bundle) {
Navigation.findNavController(requireView()).navigate(R.id.directoryFragment, bundle);
}
+
+ @Override
+ public void onMusicDirectoryPlay(Bundle bundle) {
+ String directoryId = bundle.getString(Constants.MUSIC_DIRECTORY_ID);
+ if (directoryId != null) {
+ Toast.makeText(requireContext(), getString(R.string.folder_play_collecting), Toast.LENGTH_SHORT).show();
+ collectAndPlayDirectorySongs(directoryId);
+ }
+ }
+
+ private void collectAndPlayDirectorySongs(String directoryId) {
+ List allSongs = new ArrayList<>();
+ AtomicInteger pendingRequests = new AtomicInteger(0);
+
+ collectSongsFromDirectory(directoryId, allSongs, pendingRequests, () -> {
+ if (!allSongs.isEmpty()) {
+ activity.runOnUiThread(() -> {
+ MediaManager.startQueue(mediaBrowserListenableFuture, allSongs, 0);
+ activity.setBottomSheetInPeek(true);
+ Toast.makeText(requireContext(), getString(R.string.folder_play_playing, allSongs.size()), Toast.LENGTH_SHORT).show();
+ });
+ } else {
+ activity.runOnUiThread(() -> {
+ Toast.makeText(requireContext(), getString(R.string.folder_play_no_songs), Toast.LENGTH_SHORT).show();
+ });
+ }
+ });
+ }
+
+ private void collectSongsFromDirectory(String directoryId, List allSongs, AtomicInteger pendingRequests, Runnable onComplete) {
+ pendingRequests.incrementAndGet();
+
+ directoryRepository.getMusicDirectory(directoryId).observe(getViewLifecycleOwner(), directory -> {
+ if (directory != null && directory.getChildren() != null) {
+ for (Child child : directory.getChildren()) {
+ if (child.isDir()) {
+ // It's a subdirectory, recurse into it
+ collectSongsFromDirectory(child.getId(), allSongs, pendingRequests, onComplete);
+ } else if (!child.isVideo()) {
+ // It's a song, add it to the list
+ synchronized (allSongs) {
+ allSongs.add(child);
+ }
+ }
+ }
+ }
+
+ // Decrement pending requests and check if we're done
+ if (pendingRequests.decrementAndGet() == 0) {
+ onComplete.run();
+ }
+ });
+ }
}
\ No newline at end of file
diff --git a/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/IndexFragment.java b/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/IndexFragment.java
index 97fd580..42ffac3 100644
--- a/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/IndexFragment.java
+++ b/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/IndexFragment.java
@@ -1,27 +1,40 @@
package com.cappielloantonio.tempo.ui.fragment;
+import android.content.ComponentName;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
+import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.core.view.ViewCompat;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.ViewModelProvider;
import androidx.media3.common.util.UnstableApi;
+import androidx.media3.session.MediaBrowser;
+import androidx.media3.session.SessionToken;
import androidx.navigation.Navigation;
import androidx.recyclerview.widget.LinearLayoutManager;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.atomic.AtomicInteger;
+
import com.cappielloantonio.tempo.R;
import com.cappielloantonio.tempo.databinding.FragmentIndexBinding;
import com.cappielloantonio.tempo.interfaces.ClickCallback;
+import com.cappielloantonio.tempo.repository.DirectoryRepository;
+import com.cappielloantonio.tempo.service.MediaManager;
+import com.cappielloantonio.tempo.service.MediaService;
+import com.cappielloantonio.tempo.subsonic.models.Child;
import com.cappielloantonio.tempo.subsonic.models.MusicFolder;
import com.cappielloantonio.tempo.ui.activity.MainActivity;
import com.cappielloantonio.tempo.ui.adapter.MusicIndexAdapter;
import com.cappielloantonio.tempo.util.Constants;
import com.cappielloantonio.tempo.util.IndexUtil;
import com.cappielloantonio.tempo.viewmodel.IndexViewModel;
+import com.google.common.util.concurrent.ListenableFuture;
@UnstableApi
public class IndexFragment extends Fragment implements ClickCallback {
@@ -32,6 +45,8 @@ public class IndexFragment extends Fragment implements ClickCallback {
private IndexViewModel indexViewModel;
private MusicIndexAdapter musicIndexAdapter;
+ private ListenableFuture mediaBrowserListenableFuture;
+ private DirectoryRepository directoryRepository;
@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
@@ -40,6 +55,7 @@ public class IndexFragment extends Fragment implements ClickCallback {
bind = FragmentIndexBinding.inflate(inflater, container, false);
View view = bind.getRoot();
indexViewModel = new ViewModelProvider(requireActivity()).get(IndexViewModel.class);
+ directoryRepository = new DirectoryRepository();
initAppBar();
initDirectoryListView();
@@ -48,6 +64,18 @@ public class IndexFragment extends Fragment implements ClickCallback {
return view;
}
+ @Override
+ public void onStart() {
+ super.onStart();
+ initializeMediaBrowser();
+ }
+
+ @Override
+ public void onStop() {
+ releaseMediaBrowser();
+ super.onStop();
+ }
+
@Override
public void onDestroyView() {
super.onDestroyView();
@@ -107,4 +135,65 @@ public class IndexFragment extends Fragment implements ClickCallback {
public void onMusicIndexClick(Bundle bundle) {
Navigation.findNavController(requireView()).navigate(R.id.directoryFragment, bundle);
}
+
+ @Override
+ public void onMusicIndexPlay(Bundle bundle) {
+ String directoryId = bundle.getString(Constants.MUSIC_DIRECTORY_ID);
+ if (directoryId != null) {
+ Toast.makeText(requireContext(), getString(R.string.folder_play_collecting), Toast.LENGTH_SHORT).show();
+ collectAndPlayDirectorySongs(directoryId);
+ }
+ }
+
+ private void initializeMediaBrowser() {
+ mediaBrowserListenableFuture = new MediaBrowser.Builder(requireContext(), new SessionToken(requireContext(), new ComponentName(requireContext(), MediaService.class))).buildAsync();
+ }
+
+ private void releaseMediaBrowser() {
+ MediaBrowser.releaseFuture(mediaBrowserListenableFuture);
+ }
+
+ private void collectAndPlayDirectorySongs(String directoryId) {
+ List allSongs = new ArrayList<>();
+ AtomicInteger pendingRequests = new AtomicInteger(0);
+
+ collectSongsFromDirectory(directoryId, allSongs, pendingRequests, () -> {
+ if (!allSongs.isEmpty()) {
+ activity.runOnUiThread(() -> {
+ MediaManager.startQueue(mediaBrowserListenableFuture, allSongs, 0);
+ activity.setBottomSheetInPeek(true);
+ Toast.makeText(requireContext(), getString(R.string.folder_play_playing, allSongs.size()), Toast.LENGTH_SHORT).show();
+ });
+ } else {
+ activity.runOnUiThread(() -> {
+ Toast.makeText(requireContext(), getString(R.string.folder_play_no_songs), Toast.LENGTH_SHORT).show();
+ });
+ }
+ });
+ }
+
+ private void collectSongsFromDirectory(String directoryId, List allSongs, AtomicInteger pendingRequests, Runnable onComplete) {
+ pendingRequests.incrementAndGet();
+
+ directoryRepository.getMusicDirectory(directoryId).observe(getViewLifecycleOwner(), directory -> {
+ if (directory != null && directory.getChildren() != null) {
+ for (Child child : directory.getChildren()) {
+ if (child.isDir()) {
+ // It's a subdirectory, recurse into it
+ collectSongsFromDirectory(child.getId(), allSongs, pendingRequests, onComplete);
+ } else if (!child.isVideo()) {
+ // It's a song, add it to the list
+ synchronized (allSongs) {
+ allSongs.add(child);
+ }
+ }
+ }
+ }
+
+ // Decrement pending requests and check if we're done
+ if (pendingRequests.decrementAndGet() == 0) {
+ onComplete.run();
+ }
+ });
+ }
}
\ No newline at end of file
diff --git a/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/LibraryFragment.java b/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/LibraryFragment.java
index 711b1c6..b50ee60 100644
--- a/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/LibraryFragment.java
+++ b/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/LibraryFragment.java
@@ -11,7 +11,11 @@ import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.ViewModelProvider;
import androidx.media3.common.util.UnstableApi;
+import androidx.media3.session.MediaBrowser;
+import androidx.media3.session.SessionToken;
import androidx.navigation.Navigation;
+
+import android.content.ComponentName;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.LinearLayoutManager;
@@ -31,6 +35,8 @@ import com.cappielloantonio.tempo.util.Constants;
import com.cappielloantonio.tempo.util.Preferences;
import com.cappielloantonio.tempo.viewmodel.LibraryViewModel;
import com.google.android.material.appbar.MaterialToolbar;
+import com.cappielloantonio.tempo.service.MediaService;
+import com.google.common.util.concurrent.ListenableFuture;
import java.util.Objects;
@@ -49,6 +55,7 @@ public class LibraryFragment extends Fragment implements ClickCallback {
private PlaylistHorizontalAdapter playlistHorizontalAdapter;
private MaterialToolbar materialToolbar;
+ private ListenableFuture mediaBrowserListenableFuture;
@Nullable
@Override
@@ -79,6 +86,7 @@ public class LibraryFragment extends Fragment implements ClickCallback {
@Override
public void onStart() {
super.onStart();
+ initializeMediaBrowser();
activity.setBottomNavigationBarVisibility(true);
}
@@ -292,4 +300,8 @@ public class LibraryFragment extends Fragment implements ClickCallback {
public void onMusicFolderClick(Bundle bundle) {
Navigation.findNavController(requireView()).navigate(R.id.indexFragment, bundle);
}
+
+ private void initializeMediaBrowser() {
+ mediaBrowserListenableFuture = new MediaBrowser.Builder(requireContext(), new SessionToken(requireContext(), new ComponentName(requireContext(), MediaService.class))).buildAsync();
+ }
}
diff --git a/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/PlayerQueueFragment.java b/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/PlayerQueueFragment.java
index 8c6e052..b8b1326 100644
--- a/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/PlayerQueueFragment.java
+++ b/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/PlayerQueueFragment.java
@@ -73,12 +73,16 @@ public class PlayerQueueFragment extends Fragment implements ClickCallback {
super.onResume();
setMediaBrowserListenableFuture();
updateNowPlayingItem();
- try {
- long position = mediaBrowserListenableFuture.get().getCurrentMediaItemIndex();
- bind.playerQueueRecyclerView.scrollToPosition((int) position);
- } catch (Exception e) {
- Log.e("PlayerQueueFragment", "Failed to get mediaBrowserListenableFuture in onResume", e);
- }
+ mediaBrowserListenableFuture.addListener(() -> {
+ try {
+ long position = mediaBrowserListenableFuture.get().getCurrentMediaItemIndex();
+ requireActivity().runOnUiThread(() -> {
+ bind.playerQueueRecyclerView.scrollToPosition((int) position);
+ });
+ } catch (Exception e) {
+ Log.e("PlayerQueueFragment", "Failed to get mediaBrowserListenableFuture in onResume", e);
+ }
+ }, MoreExecutors.directExecutor());
}
@Override
diff --git a/app/src/main/res/layout/item_library_music_directory.xml b/app/src/main/res/layout/item_library_music_directory.xml
index c355800..71eee01 100644
--- a/app/src/main/res/layout/item_library_music_directory.xml
+++ b/app/src/main/res/layout/item_library_music_directory.xml
@@ -19,12 +19,15 @@
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
-
@@ -33,13 +36,14 @@
style="@style/LabelMedium"
android:layout_width="0dp"
android:layout_height="wrap_content"
+ android:layout_marginStart="12dp"
android:ellipsize="marquee"
android:paddingEnd="12dp"
android:singleLine="true"
android:text="@string/label_placeholder"
app:layout_constraintBottom_toBottomOf="@id/music_directory_cover_image_view"
app:layout_constraintEnd_toStartOf="@+id/music_directory_more_button"
- app:layout_constraintStart_toEndOf="@+id/cover_image_separator"
+ app:layout_constraintStart_toEndOf="@+id/music_directory_play_button"
app:layout_constraintTop_toTopOf="@+id/music_directory_cover_image_view" />
-
-
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_library_music_index.xml b/app/src/main/res/layout/item_library_music_index.xml
index 2a31972..8894782 100644
--- a/app/src/main/res/layout/item_library_music_index.xml
+++ b/app/src/main/res/layout/item_library_music_index.xml
@@ -20,12 +20,14 @@
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
-
@@ -34,13 +36,14 @@
style="@style/LabelMedium"
android:layout_width="0dp"
android:layout_height="wrap_content"
+ android:layout_marginStart="12dp"
android:ellipsize="marquee"
android:paddingEnd="12dp"
android:singleLine="true"
android:text="@string/label_placeholder"
app:layout_constraintBottom_toBottomOf="@id/music_index_cover_image_view"
app:layout_constraintEnd_toStartOf="@+id/music_index_more_button"
- app:layout_constraintStart_toEndOf="@+id/cover_image_separator"
+ app:layout_constraintStart_toEndOf="@+id/music_index_play_button"
app:layout_constraintTop_toTopOf="@+id/music_index_cover_image_view" />
+
+
+ - Clar
+ - Fosc
+ - Valor per defecte del sistema
+
+
+ - light
+ - dark
+ - default
+
+
+
+ - Alta
+ - Mitjana
+ - Baixa
+
+
+ - 500
+ - 250
+ - 125
+
+
+
+ - Alta
+ - Mitjana
+ - Baixa
+
+
+ - -1
+ - 500
+ - 300
+
+
+
+ - Inhabilitada
+ - 128 MiB
+ - 256 MiB
+ - 512 MiB
+ - 1024 MiB
+
+
+ - 0
+ - 128
+ - 256
+ - 512
+ - 1024
+
+
+
+ - Original
+ - 32 kbps
+ - 48 kbps
+ - 64 kbps
+ - 80 kbps
+ - 96 kbps
+ - 112 kbps
+ - 128 kbps
+ - 160 kbps
+ - 192 kbps
+ - 256 kbps
+ - 320 kbps
+
+
+ - 0
+ - 32
+ - 48
+ - 64
+ - 80
+ - 96
+ - 112
+ - 128
+ - 160
+ - 192
+ - 256
+ - 320
+
+
+
+ - Original
+ - 32 kbps
+ - 48 kbps
+ - 64 kbps
+ - 80 kbps
+ - 96 kbps
+ - 112 kbps
+ - 128 kbps
+ - 160 kbps
+ - 192 kbps
+ - 256 kbps
+ - 320 kbps
+
+
+ - 0
+ - 32
+ - 48
+ - 64
+ - 80
+ - 96
+ - 112
+ - 128
+ - 160
+ - 192
+ - 256
+ - 320
+
+
+
+ - Original
+ - 32 kbps
+ - 48 kbps
+ - 64 kbps
+ - 80 kbps
+ - 96 kbps
+ - 112 kbps
+ - 128 kbps
+ - 160 kbps
+ - 192 kbps
+ - 256 kbps
+ - 320 kbps
+
+
+ - 0
+ - 32
+ - 48
+ - 64
+ - 80
+ - 96
+ - 112
+ - 128
+ - 160
+ - 192
+ - 256
+ - 320
+
+
+
+ - Reproducció directa
+ - Opus
+ - AAC
+ - MP3
+ - FLAC
+
+
+ - raw
+ - opus
+ - aac
+ - mp3
+ - flac
+
+
+
+ - Reproducció directa
+ - Opus
+ - AAC
+ - MP3
+ - FLAC
+
+
+ - raw
+ - opus
+ - aac
+ - mp3
+ - flac
+
+
+
+ - Baixada directa
+ - Opus
+ - AAC
+ - MP3
+ - FLAC
+
+
+ - raw
+ - opus
+ - aac
+ - mp3
+ - flac
+
+
+
+ - 10 segons
+ - 5 segons
+ - 2 segons
+
+
+ - 10
+ - 5
+ - 2
+
+
+
+ - Alta
+ - Mitjana
+ - Baixa
+
+
+ - 18
+ - 12
+ - 6
+
+
+
+ - Inhabilitat
+ - Pista
+ - Àlbum
+ - Automàtic
+
+
+ - disabled
+ - track
+ - album
+ - auto
+
+
+
+ - Sense transcodificació
+ - Paràmetres del servidor
+ - Format de transcodificació amb wifi
+ - Format de transcodificació amb dades mòbils
+
+
+ - 0
+ - 1
+ - 2
+ - 3
+
+
+
+ - Mínima
+ - Moderada
+ - Agressiva
+ - Extrema
+
+
+ - .1
+ - 1
+ - 4
+ - 8
+
+
+
+ - Mínim 0 estrelles
+ - Mínim 1 estrella
+ - Mínim 2 estrelles
+ - Mínim 3 estrelles
+ - Mínim 4 estrelles
+
+
+ - 0
+ - 1
+ - 2
+ - 3
+ - 4
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml
new file mode 100644
index 0000000..2236a96
--- /dev/null
+++ b/app/src/main/res/values-ca/strings.xml
@@ -0,0 +1,537 @@
+
+
+ Si teniu problemes, visiteu https://dontkillmyapp.com. S\'hi proporcionen instruccions detallades sobre com inhabilitar qualsevol característica d\'estalvi de bateria que pugui afectar el rendiment de l\'aplicació.
+ Inhabiliteu les optimitzacions de la bateria per a la reproducció multimèdia mentre la pantalla està apagada.
+ Optimitzacions de la bateria
+ Mode fora de línia
+ Afegeix a la llista de reproducció
+ Afegeix a la cua
+ Baixa-ho tot
+ Ves a l\'artista
+ Mescla instantània
+ Reprodueix a continuació
+ Suprimeix-ho tot
+ Comparteix
+ Reprodueix aleatòriament
+ Àlbums
+ Exploració d\'àlbums
+ S\'ha produït un error en recuperar l\'artista
+ Àlbums baixats
+ Àlbums més reproduïts
+ Llançaments nous
+ Àlbums afegits recentment
+ Àlbums reproduïts recentment
+ Àlbums amb estrelles
+ Àlbums
+ Més com això
+ Reprodueix
+ Publicació: %1$s
+ Publicació: %1$s, originalment: %2$s
+ Reprodueix aleatòriament
+ %1$d cançons • %2$d minuts
+ Tempus
+ S\'està cercant...
+ Mescla instantània
+ Reprodueix aleatòriament
+ Artistes
+ Exploració d\'artistes
+ S\'ha produït un error en recuperar la ràdio de l\'artista
+ S\'ha produït un error en recuperar les pistes de l\'artista
+ Artistes baixats
+ Artistes amb estrelles
+ Artistes
+ Ràdio
+ Reprodueix aleatòriament
+ Canvia de disposició
+ Més com això
+ Àlbums
+ Més
+ Biografia
+ Cançons més transmeses
+ Visualitza-ho tot
+ Ignora
+ No ho tornis a preguntar
+ Inhabilita
+ Cancel·la
+ Habilita l\'estalvi de dades
+ D\'acord
+ S\'ha restringit l\'accés al servidor del Subsonic en connexions que no són wifi. Per a impedir que torni a aparèixer aquesta alerta, inhabiliteu la comprovació de la connexió als paràmetres de l\'aplicació.
+ Xarxa wifi no connectada
+ Reprodueix aleatòriament
+ Cancel·la
+ Continua
+ Tingueu en compte que, si continueu, se suprimiran permanentment tots els elements baixats de tots els servidors.
+ Suprimeix els elements desats
+ No hi ha cap descripció disponible
+ Disc %1$s - %2$s
+ Disc %1$s
+ Cancel·la
+ Baixa
+ Es baixaran totes les pistes d\'aquesta carpeta. Les pistes en subcarpetes no es baixaran.
+ Baixada de les pistes
+ Defineix on es baixa la música
+ Quan baixeu una cançó, la trobareu aquí.
+ Encara no hi ha cap baixada.
+ %1$s • %2$s elements
+ %1$s elements
+ Reprodueix-ho tot aleatòriament
+ Perquè els canvis tinguin efecte, reinicieu l\'aplicació.
+ Si canvieu la destinació dels fitxers baixats d\'un emmagatzematge a un altre, se suprimiran immediatament tots els fitxers baixats anteriorment de l\'altre emmagatzematge.
+ Selecció de l\'opció d\'emmagatzematge
+ Extern
+ Intern
+ Carpeta
+ Baixades
+ Definiu una carpeta de baixades per a actualitzar les baixades.
+ No s\'ha trobat cap baixada que falti.
+
+ - S\'ha suprimit %d baixada que faltava.
+ - S\'han suprimit %d baixades que faltaven.
+
+ Actualitza els elements baixats
+ Afegeix a la cua
+ Reprodueix a continuació
+ Suprimeix
+ Suprimeix-ho tot
+ Reprodueix aleatòriament
+
+ Obligatori
+ El prefix «http» o «https» és obligatori
+ Baixades
+ Treu el cor
+ Posa un cor
+ S\'està carregant...
+ Seleccioneu dos o més filtres
+ Filtre
+ Filtra per artistes
+ Filtra per gèneres
+ (%1$d)
+ (+%1$d)
+ Catàleg de gèneres
+ Exploració de gèneres
+ Recorda-m\'ho més tard
+ Fes una aportació
+ Baixa-ho ara
+ Hi ha una versió nova de l\'aplicació disponible a Github.
+ Actualització disponible
+ Cancel·la
+ Reinicialitza
+ Desa
+ Reorganització de l\'inici
+ Tingueu en compte que, perquè els canvis tinguin efecte, cal reiniciar l\'aplicació.
+ Música
+ Pòdcasts
+ Ràdio
+ Les millors cançons dels vostres artistes preferits
+ Comenceu una mescla a partir d\'una cançó que us ha agradat
+ Afegeix una ràdio nova
+ Afegeix un canal de pòdcasts nou
+ Cancel·la
+ Baixa
+ Baixar aquestes pistes pot suposar un ús de dades important
+ Sembla que hi ha pistes amb estrelles pendents de sincronitzar
+ Sincronitza els àlbums amb estrelles
+ Els àlbums marcats amb una estrella estaran disponibles fora de línia
+ Sincronització dels artistes amb estrelles
+ Teniu artistes amb estrella amb música sense baixar
+ El millor de
+ Descobriment
+ Reprodueix-ho tot aleatòriament
+ Viatge al passat
+ Emissores de ràdio per Internet
+ Darreres reproduccions
+ Visualitza-ho tot
+ La setmana passada
+ El mes passat
+ L\'any passat
+ Fet a mida
+ Més reproduccions
+ Visualitza-ho tot
+ Llançaments nous
+ Pòdcasts més recents
+ Llistes de reproducció
+ Canals
+ Visualitza-ho tot
+ Emissores de ràdio
+ Addicions recents
+ Visualitza-ho tot
+ Elements compartits
+ ★ Àlbums amb estrelles
+ Visualitza-ho tot
+ ★ Artistes amb estrelles
+ Visualitza-ho tot
+ ★ Pistes amb estrelles
+ Visualitza-ho tot
+ Les vostres cançons més escoltades
+ Reorganitza
+ •
+ --
+ Àlbums
+ Visualitza-ho tot
+ Artistes
+ Visualitza-ho tot
+ Gèneres
+ Visualitza-ho tot
+ Carpetes de música
+ Llistes de reproducció
+ Visualitza-ho tot
+ No s\'ha afegit cap servidor
+ Servidors del Subsonic
+ Servidors del Subsonic
+ Emissió
+ Afegeix
+ Afegeix a la llista de reproducció
+ Baixa-ho tot
+ Valora l\'àlbum
+ Baixa
+ Tot
+ Baixades
+ Àlbum
+ Artista
+ Gènere
+ Pista
+ Any
+ Inici
+ La setmana passada
+ El mes passat
+ L\'any passat
+ Biblioteca
+ Cerca
+ Paràmetres
+ Artista
+ Nom
+ Aleatori
+ Nombre d\'àlbums
+ Addicions recents
+ Reproduccions recents
+ Més reproduccions
+ Estrelles més recents
+ Estrelles menys recents
+ Afegeix a la pantalla d\'inici
+ Suprimeix de la pantalla d\'inici
+ Any
+ %1$.2fx
+ Esborra la cua de reproducció
+ S\'ha desat la cua de reproducció
+ Baixa les lletres per a la reproducció fora de línia
+ Lletres baixades per a la reproducció fora de línia
+ S\'han desat les lletres per a la reproducció fora de línia.
+ No hi ha lletres disponibles que es puguin baixar.
+ Prioritat dels servidors
+ Format desconegut
+ Transcodificació
+ sol·licitat
+ Catàleg de llistes de reproducció
+ Exploració de llistes de reproducció
+ No s\'ha creat cap llista de reproducció
+ Cancel·la
+ Crea
+ Addició a una llista de reproducció
+ S\'han afegit les cançons a la llista de reproducció
+ No s\'han pogut afegir les cançons a la llista de reproducció
+ S\'han omès totes les cançons com a duplicades
+ %1$d pistes • %2$s
+ Durada • %1$s
+ Manteniu-ho premut per a suprimir-ho
+ Nom de la llista de reproducció
+ Cancel·la
+ Suprimeix
+ Desa
+ Edició de la llista de reproducció
+ Reprodueix
+ Reprodueix aleatòriament
+ Llista de reproducció • %1$d cançons
+ Afegeix a la cua
+ Suprimeix
+ Baixa
+ Ves al canal
+ Reprodueix a continuació
+ Suprimeix
+ Canals
+ Exploració de canals
+ URL de l\'RSS
+ Canal de pòdcast
+ Descripció
+ Episodis
+ No hi ha cap episodi disponible
+ S\'ha enviat la sol·licitud al servidor
+ Feu clic per a ocultar la secció.\nEls efectes seran visibles quan reinicieu l\'aplicació.
+ Quan afegiu un canal, el trobareu aquí.
+ No s\'ha trobat cap pòdcast.
+ %1$s • %2$s
+ URL de la pàgina d\'inici de la ràdio
+ Nom de la ràdio
+ URL de la transmissió de la ràdio
+ Cancel·la
+ Suprimeix
+ Desa
+ Emissora de ràdio per Internet
+ Feu clic per a ocultar la secció.\nEls efectes seran visibles quan reinicieu l\'aplicació.
+ Quan afegiu una emissora de ràdio, la trobareu aquí.
+ No s\'ha trobat cap emissora.
+ Cancel·la
+ Desa
+ Valoració
+ Cerqueu títols, artistes o àlbums
+ Introduïu com a mínim tres caràcters
+ Àlbums
+ Artistes
+ Cançons
+ Seguretat baixa
+ Manteniu-ho premut per a suprimir-ho
+ URL local
+ Nom del servidor
+ Contrasenya
+ URL del servidor
+ Nom d\'usuari
+ Cancel·la
+ Suprimeix
+ Desa
+ Addició d\'un servidor
+ Cancel·la
+ Ves a l\'inici de sessió
+ Continua igualment
+ El servidor sol·licitat no està disponible. Si trieu continuar, aquest quadre de diàleg no apareixerà durant una hora.
+ Servidor no disponible
+ Tempus és un client de música lliure i lleuger per al Subsonic, dissenyat i creat nativament per a l\'Android.
+ Quant a
+ Pantalla sempre encesa
+ Permet afegir duplicats a una llista de reproducció
+ Si s\'habilita, no es comprovarà si hi ha elements duplicats en afegir-los a una llista de reproducció.
+ Format de transcodificació
+ Si s\'habilita, Tempus no forçarà la baixada de la pista amb els paràmetres de transcodificació següents.
+ Prioritza els paràmetres del servidor per a la transmissió a les baixades
+ Si s\'habilita, Tempus baixarà les pistes transcodificades.
+ Baixa les pistes transcodificades
+ Si s\'habilita, es demanarà al servidor la durada estimada de la pista.
+ Estima la durada del contingut
+ Format de transcodificació per a les baixades
+ Format de transcodificació amb dades mòbils
+ Format de transcodificació amb wifi
+ Si s\'habilita, Tempus no forçarà la transmissió de la pista amb els paràmetres de transcodificació següents.
+ Prioritza els paràmetres de transcodificació del servidor
+ Prioritat de transcodificació de la pista proporcionada al servidor
+ Estratègia de memòria intermèdia
+ Perquè el canvi tingui efecte, heu de reiniciar l\'aplicació manualment.
+ Trieu una carpeta per als fitxers de música baixats.
+ Esborra la carpeta de baixades
+ Permet que segueixi sonant música quan acabi una llista de reproducció; es reproduiran cançons similars.
+ Reproducció contínua
+ Mida de la memòria cau de les caràtules
+ Per a reduir el consum de dades, evita la baixada de les caràtules.
+ Limita l\'ús de les dades mòbils
+ Si continueu, se suprimiran permanentment tots els elements desats.
+ Suprimeix els elements desats
+ Emmagatzematge per a les baixades.
+ S\'ha esborrat la carpeta de baixades.
+ S\'ha definit la carpeta de baixades.
+ Defineix la carpeta de baixades
+ Ajusteu els paràmetres d\'àudio
+ Equalitzador del sistema
+ https://github.com/eddyizm/tempus
+ Seguiu el desenvolupament
+ Github
+ https://github.com/eddyizm/tempus/discussions
+ Actualitzacions
+ Comprova si hi ha actualitzacions a GitHub
+ Si feu servir la versió de GitHub, per defecte l\'aplicació comprovarà si hi ha noves versions en format APK. Canvieu-ho per a inhabilitar les comprovacions automàtiques de GitHub.
+ Uniu-vos a discussions de la comunitat i obteniu ajuda
+ Ajuda als usuaris
+ S\'està analitzant: s\'han comptat %1$d pistes
+ Resolució de les imatges
+ Llengua
+ Tanca la sessió
+ Taxa de bits de les baixades
+ Taxa de bits amb dades mòbils
+ Taxa de bits amb wifi
+ Mida de la memòria cau de fitxers multimèdia
+ Mostra les carpetes de música
+ Si s\'habilita, es mostra la secció de carpetes de música. Tingueu en compte que, perquè la navegació amb carpetes funcioni correctament, el servidor ha de ser compatible amb aquesta característica.
+ Mostra els pòdcasts
+ Si s\'habilita, es mostra la secció de pòdcasts. Reinicieu l\'aplicació perquè tingui efecte completament.
+ Mostra la qualitat de l\'àudio
+ Es mostraran la taxa de bits i el format d\'àudio per a cada pista d\'àudio.
+ Mostra la valoració amb estrelles de les cançons
+ Si s\'habilita, es mostra la valoració de 5 estrelles d\'una pista a la pàgina de la cançó.\n\n*Cal reiniciar l\'aplicació
+ Mostra la valoració dels elements
+ Si s\'habilita, es mostrarà la valoració dels elements i si s\'han marcat com a preferits.
+ Temporitzador de sincronització
+ Si s\'habilita, l\'usuari tindrà la possibilitat de desar la cua de reproducció i carregar l\'estat en obrir l\'aplicació.
+ Sincronitza la cua de reproducció d\'aquest usuari (implantat parcialment)
+ Mostra el botó de reproducció aleatòria
+ Si s\'habilita, es mostra el botó de reproducció aleatòria i se suprimeix el cor del minireproductor.
+ Mostra la ràdio
+ Si s\'habilita, es mostra la secció de ràdio. Reinicieu l\'aplicació perquè tingui efecte completament.
+ Baixa les lletres automàticament
+ Desa automàticament les lletres quan estiguin disponibles perquè es puguin mostrar fora de línia.
+ Mode de ReplayGain
+ Cantonades arrodonides
+ Mida de les cantonades
+ Defineix la magnitud de l\'angle de curvatura.
+ Si s\'habilita, defineix un angle de curvatura per a totes les caràtules representades. Els canvis tindran efecte quan reinicieu l\'aplicació.
+ Analitza la biblioteca
+ Habilita l\'anàlisi musical
+ Llengua del sistema
+ Habilita l\'ús compartit de música
+ Mida de la memòria cau de transmissió
+ Emmagatzematge de la memòria cau de transmissió
+ Tingueu en compte que l\'anàlisi musical també depèn que el servidor tingui habilitada la recepció d\'aquestes dades.
+ En escoltar la ràdio d\'un artista, una mescla instantània o totes les cançons aleatòriament, les pistes per sota d\'un llindar de l\'usuari s\'ignoraran.
+ ReplayGain és una característica que us permet ajustar el nivell de volum de les pistes d\'àudio perquè l\'escolta sigui coherent. Aquest paràmetre només és efectiu si la pista conté les metadades necessàries.
+ L\'anàlisi musical és una característica que permet al vostre dispositiu enviar informació sobre les cançons que escolteu al servidor de música. Aquesta informació ajuda a crear recomanacions personalitzades a partir de les vostres preferències musicals.
+ Permet que l\'usuari comparteixi música mitjançant un enllaç. El servidor ha de ser compatible i tenir habilitada aquesta característica i es limita a pistes individuals, àlbums i llistes de reproducció.
+ Retorna l\'estat de la cua de reproducció per a aquest usuari. Això inclou les pistes a la cua de reproducció, la pista en reproducció actualment i la posició de la pista. El servidor ha de ser compatible amb aquesta característica.\n*Aquest paràmetre no funciona al 100% en tots els servidors/dispositius.
+ %1$s \nEn ús actualment: %2$s MiB
+ Es dona prioritat al mode de transcodificació. Si s\'estableix en «Reproducció directa», la taxa de bits del fitxer no canviarà.
+ Baixa el contingut multimèdia transcodificat. Si s\'habilita, no es farà servir l\'extrem de baixada, sinó els paràmetres següents. \n\nSi s\'estableix «Format de transcodificació per a les baixades» en «Baixada directa», la taxa de bits del fitxer no canviarà.
+ Quan el fitxer es transcodifica en temps real, el client normalment no mostra la durada de la pista. És possible sol·licitar una estimació de la durada de la pista en reproducció als servidors compatibles, però els temps de resposta poden ser més llargs.
+ Si s\'habilita, els artistes amb estrelles es baixaran per a l\'ús fora de línia.
+ Sincronitza els artistes amb estrelles per a l\'ús fora de línia
+ Si s\'habilita, els àlbums amb estrelles es baixaran per a l\'ús fora de línia.
+ Sincronitza els àlbums amb estrelles per a l\'ús fora de línia
+ Si s\'habilita, les pistes amb estrelles es baixaran per a l\'ús fora de línia.
+ Sincronitza les pistes amb estrelles per a l\'ús fora de línia
+ Tema
+ Dades
+ General
+ Llista de reproducció
+ Valoració
+ ReplayGain
+ Anàlisi musical
+ Ignora les pistes segons la valoració
+ Cançons amb una valoració de:
+ Comparteix
+ Sincronització
+ Transcodificació
+ Baixada transcodificada
+ Interfície d\'usuari
+ Baixada transcodificada
+ 3.1.0
+ Versió
+ Demana la confirmació de l\'usuari abans d\'iniciar la transmissió per la xarxa mòbil.
+ Alerta de transmissió només per wifi
+ Copia l\'enllaç
+ Suprimeix l\'element compartit
+ Actualitza l\'element compartit
+ Data de venciment: %1$s
+ Mai
+ L\'ús compartit no s\'admet o no està habilitat
+ Enllaç a recurs de Tempus
+ UID de la cançó
+ UID de l\'àlbum
+ UID de l\'artista
+ UID de la llista de reproducció
+ UID del gènere
+ UID de l\'any
+ UID del recurs
+ Enllaç a recurs no admès
+ No s\'ha pogut obrir la cançó
+ No s\'ha pogut obrir l\'àlbum
+ No s\'ha pogut obrir l\'artista
+ No s\'ha pogut obrir la llista de reproducció
+ %1$s • %2$s
+ S\'ha copiat %1$s al porta-retalls
+ Enllaç al recurs: %1$s
+ Descripció
+ Data de venciment
+ Cancel·la
+ Desa
+ Comparteix
+ Afegeix a la llista de reproducció
+ Afegeix a la cua
+ Baixa
+ S\'ha produït un error en recuperar l\'àlbum
+ S\'ha produït un error en recuperar l\'artista
+ Ves a l\'àlbum
+ Ves a l\'artista
+ Mescla instantània
+ Reprodueix a continuació
+ Valoració
+ Suprimeix
+ Comparteix
+ Baixades
+ Pistes més reproduïdes
+ Pistes afegides recentment
+ Pistes reproduïdes recentment
+ Pistes amb estrelles
+ Les millors cançons de %1$s
+ Any %1$d
+ %1$s • %2$s %3$s
+ Cancel·la
+ Continua
+ Continua i baixa
+ La baixada de les pistes amb estrelles pot requerir un ús de dades important.
+ Sincronitza les pistes amb estrelles
+ La baixada dels artistes amb estrelles pot requerir un ús de dades important.
+ Sincronitza els artistes amb estrelles
+ La baixada dels àlbums amb estrelles pot requerir un ús de dades important.
+ Sincronitza els àlbums amb estrelles
+ Perquè els canvis tinguin efecte, reinicieu l\'aplicació.
+ Si canvieu la destinació dels fitxers emmagatzemats a la memòria cau d\'un emmagatzematge a un altre, se suprimiran immediatament tots els fitxers emmagatzemats anteriorment a la memòria cau de l\'altre emmagatzematge.
+ Selecció de l\'opció d\'emmagatzematge
+ Extern
+ Intern
+ https://ko-fi.com/eddyizm
+ Àlbum
+ Artista
+ Profunditat de bits
+ Taxa de bits
+ Tipus de contingut
+ D\'acord
+ Informació de la pista
+ Número de disc
+ Durada
+ Gènere
+ Camí
+ Freqüència de mostreig
+ Mida
+ Sufix
+ El fitxer s\'ha baixat amb les API del Subsonic. El còdec i la taxa de bits del fitxer són els mateixos que els del fitxer d\'origen.
+ L\'aplicació sol·licitarà al servidor la transcodificació del fitxer i la modificació de la taxa de bits. El còdec sol·licitat per l\'usuari és %1$s, amb una taxa de bits de %2$s. Qualsevol canvi potencial del còdec i la taxa de bits del fitxer en el format triat el gestionarà el servidor, que pot admetre l\'operació o no.
+ L\'aplicació només llegirà el fitxer original proporcionat pel servidor. L\'aplicació sol·licitarà explícitament al servidor el fitxer transcodificat amb la taxa de bits del fitxer original.
+ La qualitat del fitxer reproduït dependrà de la decisió del servidor. L\'aplicació no forçarà la tria de còdec i taxa de bits per a cap transcodificació potencial.
+ L\'aplicació sol·licitarà al servidor la modificació de la taxa de bits del fitxer. L\'usuari ha sol·licitat una taxa de bits de %1$s, mentre que el còdec del fitxer d\'origen seguirà sent el mateix. Qualsevol canvi de la taxa de bits del fitxer en el format triat el gestionarà el servidor, que pot admetre l\'operació o no.
+ L\'aplicació sol·licitarà al servidor la transcodificació del fitxer. El còdec sol·licitat per l\'usuari és %1$s, mentre que la taxa de bits serà la mateixa que la del fitxer d\'origen. La transcodificació potencial del fitxer en el format triat depèn del servidor, que pot admetre l\'operació o no.
+ Títol
+ Número de pista
+ Tipus de contingut transcodificat
+ Sufix de la transcodificació
+ Any
+ unDraw
+ Volem donar un agraïment especial a UnDraw; aquesta aplicació no seria tan bonica sense les seves il·lustracions.
+ https://undraw.co/
+ Giny de Tempus
+ No hi ha res en reproducció
+ Obre Tempus
+ 0:00
+ 0:00
+ Caràtula de l\'àlbum
+ Reprodueix o posa en pausa
+ Pista següent
+ Pista anterior
+ Reprodueix aleatòriament
+ Canvia el mode de repetició
+
+ - Se sincronitzarà %d àlbum
+ - Se sincronitzaran %d àlbums
+
+
+ - Se sincronitzarà %d artista
+ - Se sincronitzaran %d artistes
+
+
+ - S\'està baixant %d cançó
+ - S\'estan baixant %d cançons
+
+ Equalitzador
+ Reinicialitza
+ Habilita
+ No és compatible amb aquest dispositiu
+ Equalitzador
+ Obre l\'equalitzador integrat
+
+ Mostra els detalls de l\'àlbum
+ Si s\'habilita, es mostren els detalls de l\'àlbum, com el gènere i el nombre de cançons, a la pàgina de l\'àlbum.
+ Ordena els artistes per nombre d\'àlbums
+ Si s\'habilita, ordena els artistes per nombre d\'àlbums. Si no, s\'ordenen per nom.
+
\ No newline at end of file
diff --git a/app/src/main/res/values-es-rES/strings.xml b/app/src/main/res/values-es-rES/strings.xml
index cef6b66..cfc643e 100644
--- a/app/src/main/res/values-es-rES/strings.xml
+++ b/app/src/main/res/values-es-rES/strings.xml
@@ -177,6 +177,7 @@
Descargado
Álbum
Artista
+ Comprobar actualizaciones en GitHub
Escaneo: hay %1$d pistas
Soporte al usuario
Resolución de la imagen
@@ -185,7 +186,7 @@
Cerrar sesión
https://github.com/eddyizm/tempus
Siga el desarrollo
- Github
+ GitHub
Género
Pista
Año
@@ -199,6 +200,7 @@
Artista
Nombre
Aleatorio
+ Número de álbumes
Añadido recientemente
Reproducido recientemente
Lo más reproducido
@@ -481,6 +483,7 @@
Letras descargadas para uso sin conexión
Letra guardada para uso sin conexión
Permitir añadir pistas repetidas a la lista
+ Si se usa la versión de GitHub, la app comprobará nuevas actualizaciones del APK.
Participa en las discusiones y el soporte de la comunidad
Mostrar el botón «Aleatorio»
Descargar automáticamente las letras
@@ -505,4 +508,7 @@
No se ha podido abrir el álbum
No se ha podido abrir el artista
No se ha podido abrir la lista de reproducción
+ Actualizaciones
+ Ordenar artistas por número de álbumes
+ Ordena los artistas por número de álbumes si la opción está habilitada. Si no, los ordena por nombre.
\ No newline at end of file
diff --git a/app/src/main/res/values-it/arrays.xml b/app/src/main/res/values-it/arrays.xml
index e0520bf..2a63156 100644
--- a/app/src/main/res/values-it/arrays.xml
+++ b/app/src/main/res/values-it/arrays.xml
@@ -254,4 +254,4 @@
- 3
- 4
-
+
\ No newline at end of file
diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml
index 96a0c30..ac0a408 100644
--- a/app/src/main/res/values-it/strings.xml
+++ b/app/src/main/res/values-it/strings.xml
@@ -1,417 +1,536 @@
- Se hai problemi, visita https://dontkillmyapp.com. Qui trovi istruzioni dettagliate su come disabilitare le funzionalità di risparmio energetico che potrebbero influire sulle prestazioni dell\'app.
- Per favore, disabilita le ottimizzazioni della batteria per la riproduzione multimediale quando lo schermo è spento.
- Ottimizzazioni della Batteria
- Modalità offline
+ Se hai problemi, visita https://dontkillmyapp.com. Qui trovi istruzioni dettagliate su come disabilitare le funzionalità di risparmio energetico che potrebbero influire sulle prestazioni dell\'app.
+ Disattiva le ottimizzazioni della batteria per la riproduzione multimediale quando lo schermo è spento.
+ Ottimizzazioni della Batteria
+ Modalità offline
Aggiungi alla playlist
Aggiungi alla coda
- Scarica tutto
- Vai all\'artista
- Mix istantaneo
- Riproduci successivo
- Rimuovi tutto
- Condividi
- Riproduzione casuale
- Album
- Sfoglia Album
- Errore nel recupero dell\'artista
- Album scaricati
- Album più riprodotti
- Nuove uscite
- Album aggiunti di recente
- Album riprodotti di recente
- Album preferiti
- Album
- Simili a questo
- Riproduci
- Rilasciato il %1$s
- Rilasciato il %1$s, originariamente il %2$s
- Riproduzione casuale
- %1$d brani • %2$d minuti
- Tempus
- Ricerca in corso…
- Mix istantaneo
- Riproduzione casuale
- Artisti
- Sfoglia Artisti
- Errore nel recupero della radio dell\'artista
- Errore nel recupero dei brani dell\'artista
- Artisti scaricati
- Artisti preferiti
- Artisti
- Radio
- Riproduzione casuale
- Cambia layout
- Simili a questo
- Album
- Altro
- Biografia
- Brani più ascoltati
- Vedi tutto
- Ignora
- Non chiedere di nuovo
- Disabilita
- Annulla
- Attiva risparmio dati
- OK
- L\'accesso al server Subsonic è stato limitato alle connessioni Wi-Fi. Per evitare che questo avviso riappaia, disabilita il controllo connessione nelle impostazioni dell\'app.
- Wi-Fi non connesso
- Riproduzione casuale
- Annulla
- Continua
- Attenzione, procedendo questa azione eliminerà definitivamente tutti gli elementi scaricati da tutti i server.
- Elimina elementi salvati
- Descrizione non disponibile
- Disco %1$s - %2$s
- Disco %1$s
- Annulla
- Scarica
- Tutti i brani in questa cartella verranno scaricati. I brani nelle sottocartelle non verranno scaricati.
- Scarica i brani
- Una volta scaricato un brano, lo troverai qui
- Nessun download ancora!
- %1$s • %2$s elementi
- %1$s elementi
- Riproduzione casuale di tutto
- Per rendere effettive le modifiche, riavvia l\'app.
- Cambiare la destinazione dei file scaricati da una memoria all\'altra eliminerà immediatamente tutti i file scaricati precedentemente nella vecchia memoria.
- Seleziona opzione di memoria
- Esterna
- Interna
- Download
- Aggiungi alla coda
- Riproduci successivo
- Rimuovi
- Rimuovi tutto
- Riproduzione casuale
-
- Obbligatorio
- Prefisso http o https richiesto
- Download
- Seleziona due o più filtri
- Filtro
- Filtra Generi
- Catalogo dei Generi
- Sfoglia Generi
- Ricordamelo più tardi
- Supportami
- Scarica ora
- È disponibile una nuova versione dell\'app su Github.
- Aggiornamento disponibile
- Annulla
- Reimposta
- Salva
- Riorganizza home
- Si prega di notare che per rendere effettive le modifiche è necessario riavviare l\'applicazione.
- Le migliori canzoni dei tuoi artisti preferiti
- Inizia un mix da una canzone che ti è piaciuta
- Aggiungi una nuova radio
- Aggiungi un nuovo canale podcast
- Annulla
- Scarica
- Scaricare questi brani potrebbe comportare un uso significativo di dati
- Sembra che ci siano brani da sincronizzare con una stella
- Il meglio di
- Scoperta
- Mescola tutto
- Flashback
- Stazioni radio internet
- Ultimi ascolti
- Vedi tutto
- La scorsa settimana
- Il mese scorso
- L\'anno scorso
- Fatto per te
- Più ascoltati
- Vedi tutto
- Nuove uscite
- Podcast più recenti
- Playlist
- Canali
- Vedi tutto
- Stazioni radio
- Aggiunti di recente
- Vedi tutto
- Condivisioni
- ★ Album con stella
- Vedi tutto
- ★ Artisti con stella
- Vedi tutto
- ★ Brani con stella
- Vedi tutto
- I tuoi migliori brani
- Riorganizza
- •
- --
- Album
- Vedi tutto
- Artisti
- Vedi tutto
- Generi
- Vedi tutto
- Cartelle musicali
- Playlist
- Vedi tutto
- Nessun server aggiunto
- Server Subsonic
- Server Subsonic
- Trasmetti
- Aggiungi
+ Scarica tutto
+ Vai all\'artista
+ Mix istantaneo
+ Riproduci dopo
+ Rimuovi tutto
+ Condividi
+ Riproduzione casuale
+ Album
+ Sfoglia Album
+ Errore nel recupero dell\'artista
+ Album scaricati
+ Album più riprodotti
+ Nuove uscite
+ Album aggiunti di recente
+ Album riprodotti di recente
+ Album preferiti
+ Album
+ Altri simili
+ Riproduci
+ Rilasciato il %1$s
+ Rilasciato il %1$s, originariamente il %2$s
+ Riproduzione casuale
+ %1$d brani • %2$d minuti
+ Tempus
+ Cercando…
+ Mix istantaneo
+ Riproduzione casuale
+ Artisti
+ Sfoglia Artisti
+ Errore nel recupero della radio dell\'artista
+ Errore nel recupero dei brani dell\'artista
+ Artisti scaricati
+ Artisti preferiti
+ Artisti
+ Radio
+ Riproduzione casuale
+ Cambia layout
+ Altri simili
+ Album
+ Altro
+ Biografia
+ Brani più ascoltati
+ Vedi tutto
+ Ignora
+ Non chiedere di nuovo
+ Disabilita
+ Annulla
+ Attiva risparmio dati
+ OK
+ L\'accesso al server Subsonic è stato limitato alle connessioni Wi-Fi. Per evitare che questo avviso riappaia, disabilita il controllo connessione nelle impostazioni dell\'app.
+ Wi-Fi non connesso
+ Riproduzione casuale
+ Annulla
+ Continua
+ Attenzione, procedendo questa azione eliminerà definitivamente tutti gli elementi scaricati da tutti i server.
+ Elimina elementi salvati
+ Descrizione non disponibile
+ Disco %1$s - %2$s
+ Disco %1$s
+ Annulla
+ Scarica
+ Tutti i brani in questa cartella verranno scaricati. I brani nelle sottocartelle non verranno scaricati.
+ Scarica i brani
+ Imposta dove scaricare la musica
+ Una volta scaricato un brano, lo troverai qui
+ Ancora nessun download!
+ %1$s • %2$s elementi
+ %1$s elementi
+ Riproduzione casuale di tutto
+ Per rendere effettive le modifiche, riavvia l\'app.
+ Cambiare la destinazione dei file scaricati da una memoria all\'altra eliminerà immediatamente tutti i file scaricati precedentemente nella vecchia memoria.
+ Seleziona opzione di memoria
+ Esterna
+ Interna
+ Cartella
+ Scarica
+ Imposta una cartella di download per aggiornare i tuoi download.
+ Nessun download mancante trovato.
+
+ - Rimosso %d download mancante.
+ - Rimossi %d download mancanti.
+
+ Aggiorna gli elementi scaricati
+ Aggiungi alla coda
+ Riproduci dopo
+ Rimuovi
+ Rimuovi tutto
+ Riproduzione casuale
+
+ Obbligatorio
+ Prefisso http o https richiesto
+ Download
+ Aggiungi ai preferiti
+ Rimuovi dai preferiti
+ Caricamento…
+ Seleziona due o più filtri
+ Filtro
+ Filtra artisti
+ Filtra Generi
+ (%1$d)
+ (+%1$d)
+ Catalogo dei Generi
+ Sfoglia Generi
+ Ricordamelo più tardi
+ Supportami
+ Scarica ora
+ È disponibile una nuova versione dell\'app su Github.
+ Aggiornamento disponibile
+ Annulla
+ Ripristina
+ Salva
+ Riorganizza home
+ Per rendere effettive le modifiche è necessario riavviare l\'applicazione.
+ Musica
+ Podcast
+ Radio
+ Le migliori canzoni dei tuoi artisti preferiti
+ Inizia un mix da una canzone che ti è piaciuta
+ Aggiungi una nuova radio
+ Aggiungi un nuovo canale podcast
+ Annulla
+ Scarica
+ Scaricare questi brani potrebbe comportare un uso significativo di dati
+ Sembra che ci siano alcuni brani preferiti da sincronizzare
+ Sincronizza Album Preferiti
+ Gli album preferiti saranno disponibili offline
+ Sincronizza Artisti Preferiti
+ Hai artisti preferiti con musica non scaricata
+ Il meglio di
+ Scopri
+ Mescola tutto
+ Flashback
+ Stazioni internet-radio
+ Ultimi ascolti
+ Vedi tutto
+ La scorsa settimana
+ Il mese scorso
+ L\'anno scorso
+ Fatto per te
+ Più ascoltati
+ Vedi tutto
+ Nuove uscite
+ Podcast più recenti
+ Playlist
+ Canali
+ Vedi tutto
+ Stazioni radio
+ Aggiunti di recente
+ Vedi tutto
+ Condivisioni
+ ★ Album preferiti
+ Vedi tutto
+ ★ Artisti preferiti
+ Vedi tutto
+ ★ Brani preferiti
+ Vedi tutto
+ I tuoi migliori brani
+ Riorganizza
+ •
+ --
+ Album
+ Vedi tutto
+ Artisti
+ Vedi tutto
+ Generi
+ Vedi tutto
+ Cartelle della musica
+ Playlist
+ Vedi tutto
+ Nessun server aggiunto
+ Server Subsonic
+ Server Subsonic
+ Trasmetti
+ Aggiungi
Aggiungi alla playlist
Scarica tutto
- Scarica
- Tutti
- Scaricati
- Album
- Artista
- Genere
- Brano
- Anno
- Home
- La scorsa settimana
- Il mese scorso
- L\'anno scorso
- Libreria
- Cerca
- Impostazioni
- Artista
- Nome
- Casuale
- Aggiunti di recente
- Aggiungi alla schermata home
- Rimuovi dalla schermata home
- Anno
- %1$.2fx
- Svuota coda di riproduzione
+ Valuta l\'album
+ Scarica
+ Tutti
+ Scaricati
+ Album
+ Artista
+ Genere
+ Brano
+ Anno
+ Home
+ La scorsa settimana
+ Il mese scorso
+ L\'anno scorso
+ Libreria
+ Cerca
+ Impostazioni
+ Artista
+ Nome
+ Casuale
+ Numero di Album
+ Aggiunti di recente
+ Riprodotti di recente
+ Più riprodotti
+ Preferiti più recentemente
+ Preferiti meno recentemente
+ Aggiungi alla schermata home
+ Rimuovi dalla schermata home
+ Anno
+ %1$.2fx
+ Svuota coda di riproduzione
Salvato
- Priorità server
- Catalogo playlist
- Sfoglia le playlist
- Nessuna playlist creata
- Annulla
- Crea
- Aggiungi a una playlist
- Aggiunta di un brano alla playlist
- Impossibile aggiungere un brano alla playlist
- %1$d brani • %2$s
- Durata • %1$s
- Premi a lungo per eliminare
- Nome della playlist
- Annulla
- Elimina
- Salva
- Modifica playlist
- Riproduci
- Mescola
- Playlist • %1$d brani
- Aggiungi alla coda
- Elimina
- Scarica
- Vai al canale
- Riproduci dopo
- Rimuovi
- Canali
- Sfoglia Canali
- URL RSS
- Canale Podcast
- Descrizione
- Episodi
- Nessun episodio disponibile
- La tua richiesta è stata inviata al server
- Clicca per nascondere la sezione\nGli effetti saranno visibili al riavvio
- Una volta aggiunto un canale, lo troverai qui
- Nessun podcast trovato!
- %1$s • %2$s
- URL Homepage Radio
- Nome Radio
- URL Stream Radio
- Annulla
- Elimina
- Salva
- Stazione Radio Internet
- Clicca per nascondere la sezione\nGli effetti saranno visibili al riavvio
- Una volta aggiunta una stazione radio, la troverai qui
- Nessuna stazione trovata!
- Annulla
- Salva
- Valuta
- Cerca titolo, artisti o album
- Inserisci almeno tre caratteri
- Album
- Artisti
- Brani
- Bassa sicurezza
- Premi a lungo per eliminare
- URL locale
- Nome Server
- Password
- URL Server
- Nome utente
- Annulla
- Elimina
- Salva
- Aggiungi server
- Annulla
- Vai al login
- Continua comunque
- Il server richiesto non è disponibile. Se scegli di continuare, questo messaggio non apparirà per la prossima ora.
- Server irraggiungibile
- Tempus è un client musicale open source e leggero per Subsonic, progettato e costruito nativamente per Android.
- Informazioni
- Sempre attivo
- Formato transcodifica
- Se abilitato, Tempus non forzerà il download del brano con le impostazioni di transcodifica sottostanti.
- Dare priorità alle impostazioni del server per lo streaming nei download
- Se abilitato, Tempus scaricherà i brani transcodificati.
- Scarica brani transcodificati
- Se abilitato, verrà richiesto al server di fornire la durata stimata del brano.
- Stima della lunghezza del contenuto
- Formato transcodifica per download
- Formato transcodifica su mobile
- Formato transcodifica su Wi-Fi
- Se abilitato, Tempus non forzerà lo streaming del brano con le impostazioni di transcodifica sottostanti.
- Dare priorità alle impostazioni di transcodifica del server
- Priorità di transcodifica del brano assegnata al server
- Strategia di buffering
- Perché la modifica abbia effetto è necessario riavviare manualmente l\'app.
- Consente alla musica di continuare a suonare dopo la fine di una playlist, riproducendo brani simili
- Riproduzione continua
- Dimensione della cache delle copertine
- Per ridurre il consumo di dati, evita di scaricare le copertine.
- Limita utilizzo dei dati mobili
- Continuando, tutti gli elementi salvati verranno eliminati in modo irreversibile.
- Elimina elementi salvati
- Archivio download
- Regola le impostazioni audio
- Equalizzatore di sistema
- https://github.com/eddyizm/tempus
- Segui lo sviluppo
- Github
- Imposta risoluzione delle immagini
- Lingua
- Esci
- Bitrate per download
- Bitrate su mobile
- Bitrate su Wi-Fi
- Dimensione della cache dei file multimediali
- Mostra directory musicali
- Se abilitato, mostra la sezione delle directory musicali. Nota che per la navigazione nelle cartelle è necessario che il server supporti questa funzionalità.
- Mostra podcast
- Se abilitato, mostra la sezione podcast. Riavvia l\'app per rendere effettive le modifiche.
- Mostra qualità audio
- Il bitrate e il formato audio saranno mostrati per ogni traccia.
- Mostra valutazione
- Se abilitato, verrà mostrata la valutazione dell\'elemento e se è contrassegnato come preferito.
- Timer sincronizzazione
- Se abilitato, l\'utente avrà la possibilità di salvare la propria coda di riproduzione e potrà caricare lo stato all\'apertura dell\'applicazione.
- Sincronizza coda di riproduzione per questo utente
- Mostra radio
- Se abilitato, mostra la sezione radio. Riavvia l\'app per applicare completamente le modifiche.
- Imposta modalità di guadagno di riproduzione
- Angoli arrotondati
- Dimensione angoli
- Imposta la magnitudine dell\'angolo di curvatura.
- Se abilitato, imposta un angolo di curvatura per tutte le copertine visualizzate. Le modifiche avranno effetto al riavvio.
- Scansiona libreria
- Abilita scrobbling musicale
- Abilita condivisione musicale
- Dimensione cache streaming
- Archiviazione cache streaming
- È importante notare che lo scrobbling si basa anche sul fatto che il server sia abilitato a ricevere questi dati.
- Quando si ascolta la radio di un artista, un mix istantaneo o quando si mescolano tutti i brani, i brani sotto una certa valutazione dell\'utente verranno ignorati.
- Il guadagno di riproduzione è una funzionalità che consente di regolare il livello del volume delle tracce audio per un\'esperienza di ascolto coerente. Questa impostazione è efficace solo se la traccia contiene i metadati necessari.
- Lo scrobbling è una funzionalità che consente al tuo dispositivo di inviare informazioni sulle canzoni che ascolti al server musicale. Queste informazioni aiutano a creare raccomandazioni personalizzate in base alle tue preferenze musicali.
- Permette all\'utente di condividere musica tramite un link. La funzionalità deve essere supportata e abilitata sul server ed è limitata a brani, album e playlist singoli.
- Restituisce lo stato della coda di riproduzione per questo utente. Ciò include i brani nella coda di riproduzione, il brano attualmente in riproduzione e la posizione all\'interno di questo brano. Il server deve supportare questa funzionalità.
- %1$s \nAttualmente in uso: %2$s MiB
- Priorità data alla modalità di transcoding. Se impostato su "Riproduzione diretta", il bitrate del file non verrà modificato.
- Scarica media transcodificati. Se abilitato, l\'endpoint di download non verrà utilizzato, ma le impostazioni seguenti. \n\n Se "Formato di transcodifica per i download" è impostato su "Download diretto", il bitrate del file non verrà modificato.
- Quando il file viene transcodificato al volo, il client di solito non mostra la lunghezza della traccia. È possibile richiedere ai server che supportano la funzionalità di stimare la durata della traccia in riproduzione, ma i tempi di risposta possono essere più lunghi.
- Se abilitato, le tracce contrassegnate verranno scaricate per l\'uso offline.
- Sincronizza tracce contrassegnate per uso offline
- Tema
- Dati
- Generale
- Valutazione
- Guadagno di riproduzione
- Scrobble
- Ignora brani in base alla valutazione
- Brani con una valutazione di:
- Condividi
- Sincronizzazione
- Transcoding
- Download di Transcoding
- Interfaccia utente
- Download transcodificato
- 3.1.0
- Versione
- Chiedi conferma all\'utente prima di effettuare streaming su rete mobile.
- Streaming solo tramite Wi-Fi avviso
- Copia link
- Elimina condivisione
- Aggiorna condivisione
- Data di scadenza: %1$s
- La condivisione non è supportata o non è abilitata
- Descrizione
- Data di scadenza
- Annulla
- Salva
- Condividi
- Aggiungi alla playlist
- Aggiungi alla coda
- Scarica
- Errore nel recupero dell\'album
- Errore nel recupero dell\'artista
- Vai all\'album
- Vai all\'artista
- Mix istantaneo
- Riproduci dopo
- Valuta
- Rimuovi
- Condividi
- Scaricato
- Tracce più riprodotte
- Tracce aggiunte di recente
- Tracce riprodotte di recente
- Tracce contrassegnate
- Le migliori tracce di %1$s
- Anno %1$d
- %1$s • %2$s %3$s
- Annulla
- Continua
- Continua e scarica
- Il download delle tracce contrassegnate potrebbe richiedere una grande quantità di dati.
- Sincronizza tracce contrassegnate
- Per rendere effettive le modifiche, riavvia l\'app.
- Cambiare la destinazione dei file memorizzati nella cache da un\'unità di archiviazione a un\'altra può comportare la cancellazione di eventuali file memorizzati nella cache in precedenza nell\'altra unità di archiviazione.
- Seleziona opzione di archiviazione
- Esterno
- Interno
- https://buymeacoffee.com/a.cappiello
- Album
- Artista
- Bitrate
- Tipo di contenuto
- OK
- Info traccia
- Numero del disco
- Durata
- Genere
- Percorso
- Dimensione
- Suffisso
- Il file è stato scaricato utilizzando le API Subsonic. Il codec e il bitrate del file rimangono invariati rispetto al file sorgente.
- L\'applicazione richiederà al server di transcodedare il file e modificare il suo bitrate. Il codec richiesto dall\'utente è %1$s, con un bitrate di %2$s. Eventuali modifiche al codec e al bitrate del file nel formato scelto saranno gestite dal server, che potrebbe o meno supportare l\'operazione.
- L\'applicazione leggerà solo il file originale fornito dal server. L\'app richiederà esplicitamente al server il file non transcodedato con il bitrate della sorgente originale.
- La qualità del file da riprodurre è lasciata alla decisione del server. L\'app non imporrà la scelta di codec e bitrate per eventuali transcoding.
- L\'applicazione richiederà al server di modificare il bitrate del file. L\'utente ha richiesto un bitrate di %1$s, mentre il codec del file sorgente rimarrà lo stesso. Eventuali modifiche al bitrate del file nel formato scelto saranno effettuate dal server, che potrebbe o meno supportare l\'operazione.
- L\'applicazione richiederà al server di transcodedare il file. Il codec richiesto dall\'utente è %1$s, mentre il bitrate sarà lo stesso del file sorgente. L\'eventuale transcoding del file nel formato scelto dipende dal server, in quanto potrebbe o meno supportare l\'operazione.
- Titolo
- Numero traccia
- Tipo di contenuto transcodedato
- Suffisso transcodedato
- Anno
- unDraw
- Un ringraziamento speciale va a unDraw, senza le cui illustrazioni non avremmo potuto rendere questa applicazione più bella.
- https://undraw.co/
+ Scarica i testi delle canzoni per riprodurli offline
+ Testi scaricati per la riproduzione offline
+ Testi salvati per la riproduzione offline.
+ I testi non sono disponibili per il download.
+ Priorità server
+ Formato sconosciuto
+ Transcodifica
+ richiesto
+ Catalogo playlist
+ Sfoglia le playlist
+ Nessuna playlist creata
+ Annulla
+ Crea
+ Aggiungi a una playlist
+ Aggiunta di un brano alla playlist
+ Impossibile aggiungere un brano alla playlist
+ Tutte le canzoni sono state saltate perché duplicate
+ %1$d brani • %2$s
+ Durata • %1$s
+ Premi a lungo per eliminare
+ Nome della playlist
+ Annulla
+ Elimina
+ Salva
+ Modifica playlist
+ Riproduci
+ Mescola
+ Playlist • %1$d brani
+ Aggiungi alla coda
+ Elimina
+ Scarica
+ Vai al canale
+ Riproduci dopo
+ Rimuovi
+ Canali
+ Sfoglia Canali
+ URL RSS
+ Canale Podcast
+ Descrizione
+ Episodi
+ Nessun episodio disponibile
+ La tua richiesta è stata inviata al server
+ Clicca per nascondere la sezione\nGli effetti saranno visibili al riavvio
+ Una volta aggiunto un canale, lo troverai qui
+ Nessun podcast trovato!
+ %1$s • %2$s
+ URL Homepage Radio
+ Nome Radio
+ URL Stream Radio
+ Annulla
+ Elimina
+ Salva
+ Stazione Internet-Radio
+ Clicca per nascondere la sezione\nGli effetti saranno visibili al riavvio
+ Una volta aggiunta una stazione radio, la troverai qui
+ Nessuna stazione trovata!
+ Annulla
+ Salva
+ Valuta
+ Cerca titolo, artisti o album
+ Inserisci almeno tre caratteri
+ Album
+ Artisti
+ Brani
+ Bassa sicurezza
+ Premi a lungo per eliminare
+ URL locale
+ Nome Server
+ Password
+ URL Server
+ Nome utente
+ Annulla
+ Elimina
+ Salva
+ Aggiungi server
+ Annulla
+ Vai al login
+ Continua comunque
+ Il server richiesto non è disponibile. Se scegli di continuare, questo messaggio non apparirà per la prossima ora.
+ Server irraggiungibile
+ Tempus è un client musicale open source e leggero per Subsonic, progettato e costruito nativamente per Android.
+ Informazioni
+ Sempre attivo
+ Allow adding duplicates to playlist
+ If enabled, duplicates won\'t be checked while adding to a playlist.
+ Formato transcodifica
+ Se abilitato, Tempus non forzerà il download del brano con le impostazioni di transcodifica sottostanti.
+ Dare priorità alle impostazioni del server per lo streaming nei download
+ Se abilitato, Tempus scaricherà i brani transcodificati.
+ Scarica brani transcodificati
+ Se abilitato, verrà richiesto al server di fornire la durata stimata del brano.
+ Stima della lunghezza del contenuto
+ Formato transcodifica per download
+ Formato transcodifica su mobile
+ Formato transcodifica su Wi-Fi
+ Se abilitato, Tempus non forzerà lo streaming del brano con le impostazioni di transcodifica sottostanti.
+ Dare priorità alle impostazioni di transcodifica del server
+ Priorità di transcodifica del brano assegnata al server
+ Strategia di buffering
+ Perché la modifica abbia effetto è necessario riavviare manualmente l\'app.
+ Scegli una cartella dove scaricare la musica
+ Svuota la cartella di download
+ Consente alla musica di continuare a suonare dopo la fine di una playlist, riproducendo brani simili
+ Riproduzione continua
+ Dimensione della cache delle copertine
+ Per ridurre il consumo di dati, evita di scaricare le copertine.
+ Limita utilizzo dei dati mobili
+ Continuando, tutti gli elementi salvati verranno eliminati in modo irreversibile.
+ Elimina elementi salvati
+ Archivio download
+ Cartella di download svuotata.
+ Cartella di download impostata
+ Imposta cartella di download
+ Regola le impostazioni audio
+ Equalizzatore di sistema
+ https://github.com/eddyizm/tempus
+ Segui lo sviluppo
+ Github
+ https://github.com/eddyizm/tempus/discussions
+ Aggiornamenti
+ Controlla GitHub per aggiornamenti
+ Se si utilizza la versione GitHub, per impostazione predefinita l\'app controllerà la presenza di nuove versioni. Disattiva per disabilitare i controlli automatici su GitHub
+ Partecipa alle discussioni della community e al supporto
+ Supporto utenti
+ Scansione: conteggio di %1$d brani
+ Imposta risoluzione delle immagini
+ Lingua
+ Esci
+ Bitrate per download
+ Bitrate su mobile
+ Bitrate su Wi-Fi
+ Dimensione della cache dei file multimediali
+ Mostra directory musicali
+ Se abilitato, mostra la sezione delle directory musicali. Nota che per la navigazione nelle cartelle è necessario che il server supporti questa funzionalità.
+ Mostra podcast
+ Se abilitato, mostra la sezione podcast. Riavvia l\'app per rendere effettive le modifiche.
+ Mostra qualità audio
+ Il bitrate e il formato audio saranno mostrati per ogni traccia.
+ Mostra valutazione della canzone
+ Se abilitato, mostra la valutazione a 5 stelle per la traccia nella pagina della canzone\n\n*Richiede il riavvio dell\'app
+ Mostra valutazione
+ Se abilitato, verrà mostrata la valutazione dell\'elemento e se è contrassegnato come preferito.
+ Timer sincronizzazione
+ Se abilitato, l\'utente avrà la possibilità di salvare la propria coda di riproduzione e potrà caricare lo stato all\'apertura dell\'applicazione.
+ Sincronizza coda di riproduzione per questo utente [Not Fully Baked]
+ Mostra il pulsante di riproduzione casuale
+ Se abilitato, mostra il pulsante di riproduzione casuale, rimuove il cuore nel mini player
+ Mostra radio
+ Se abilitato, mostra la sezione radio. Riavvia l\'app per applicare completamente le modifiche.
+ Scarica automaticamente i testi
+ Salva automaticamente i testi quando sono disponibili in modo che possano essere mostrati offline.
+ Imposta modalità di guadagno di riproduzione
+ Angoli arrotondati
+ Dimensione angoli
+ Imposta la grandezza dell\'angolo di curvatura.
+ Se abilitato, imposta un angolo di curvatura per tutte le copertine visualizzate. Le modifiche avranno effetto al riavvio.
+ Scansiona libreria
+ Abilita scrobbling musicale
+ Lingua di sistema
+ Abilita condivisione musicale
+ Dimensione cache streaming
+ Archiviazione cache streaming
+ È importante notare che lo scrobbling si basa anche sul fatto che il server sia abilitato a ricevere questi dati.
+ Quando si ascolta la radio di un artista, un mix istantaneo o quando si mescolano tutti i brani, i brani sotto una certa valutazione dell\'utente verranno ignorati.
+ Il guadagno di riproduzione è una funzionalità che consente di regolare il livello del volume delle tracce audio per un\'esperienza di ascolto coerente. Questa impostazione è efficace solo se la traccia contiene i metadati necessari.
+ Lo scrobbling è una funzionalità che consente al tuo dispositivo di inviare informazioni sulle canzoni che ascolti al server musicale. Queste informazioni aiutano a creare raccomandazioni personalizzate in base alle tue preferenze musicali.
+ Permette all\'utente di condividere musica tramite un link. La funzionalità deve essere supportata e abilitata sul server ed è limitata a brani, album e playlist singoli.
+ Restituisce lo stato della coda di riproduzione per questo utente. Ciò include i brani nella coda di riproduzione, il brano attualmente in riproduzione e la posizione all\'interno di questo brano. Il server deve supportare questa funzionalità.\n*This setting is not 100% working on all servers/devices.
+ %1$s \nAttualmente in uso: %2$s MiB
+ Priorità data alla modalità di transcoding. Se impostato su "Riproduzione diretta", il bitrate del file non verrà modificato.
+ Scarica media transcodificati. Se abilitato, l\'endpoint di download non verrà utilizzato, ma le impostazioni seguenti. \n\n Se "Formato di transcodifica per i download" è impostato su "Download diretto", il bitrate del file non verrà modificato.
+ Quando il file viene transcodificato al volo, il client di solito non mostra la lunghezza della traccia. È possibile richiedere ai server che supportano la funzionalità di stimare la durata della traccia in riproduzione, ma i tempi di risposta possono essere più lunghi.
+ Se abilitato, gli artisti preferiti verranno scaricati per l\'uso offline.
+ Sincronizza artisti preferiti per uso offline
+ Se abilitato, gli album preferiti verranno scaricati per l\'uso offline.
+ Sincronizza album preferiti per uso offline
+ Se abilitato, le tracce preferite verranno scaricate per l\'uso offline.
+ Sincronizza tracce preferite per uso offline
+ Tema
+ Dati
+ Generale
+ Playlist
+ Valutazione
+ Guadagno di riproduzione
+ Scrobble
+ Ignora brani in base alla valutazione
+ Brani con una valutazione di:
+ Condividi
+ Sincronizzazione
+ Transcodifica
+ Transcodifica dei Download
+ Interfaccia utente
+ Download transcodificato
+ 3.1.0
+ Versione
+ Chiedi conferma all\'utente prima di effettuare streaming su rete mobile.
+ Streaming solo tramite Wi-Fi avviso
+ Copia link
+ Elimina condivisione
+ Aggiorna condivisione
+ Data di scadenza: %1$s
+ Mai
+ La condivisione non è supportata o non è abilitata
+ Link asset Tempus
+ UID Canzone
+ UID Album
+ UID Artista
+ UID Playlist
+ UID Genere
+ UID Anno
+ UID Asset
+ Link asset non supportato
+ Impossibile aprire la canzone
+ Impossibile aprire l\'album
+ Impossibile aprire l\'artista
+ Impossibile aprire la playlist
+ %1$s • %2$s
+ Copiato %1$s negli appunti
+ Link asset: %1$s
+ Descrizione
+ Data di scadenza
+ Annulla
+ Salva
+ Condividi
+ Aggiungi alla playlist
+ Aggiungi alla coda
+ Scarica
+ Errore nel recupero dell\'album
+ Errore nel recupero dell\'artista
+ Vai all\'album
+ Vai all\'artista
+ Mix istantaneo
+ Riproduci dopo
+ Valuta
+ Rimuovi
+ Condividi
+ Scaricato
+ Tracce più riprodotte
+ Tracce aggiunte di recente
+ Tracce riprodotte di recente
+ Tracce contrassegnate
+ Le migliori tracce di %1$s
+ Anno %1$d
+ %1$s • %2$s %3$s
+ Annulla
+ Continua
+ Continua e scarica
+ Il download delle tracce contrassegnate potrebbe richiedere una grande quantità di dati.
+ Sincronizza tracce contrassegnate
+ Scaricare gli artisti preferiti potrebbe richiedere una grande quantità di dati.
+ Sincronizza artisti preferiti
+ Scaricare gli album preferiti potrebbe richiedere una grande quantità di dati.
+ Sincronizza album preferiti
+ Per rendere effettive le modifiche, riavvia l\'app.
+ Cambiare la destinazione dei file memorizzati nella cache da un\'unità di archiviazione a un\'altra può comportare la cancellazione di eventuali file memorizzati nella cache in precedenza nell\'altra unità di archiviazione.
+ Seleziona opzione di archiviazione
+ Esterno
+ Interno
+ https://ko-fi.com/eddyizm
+ Album
+ Artista
+ Profondità bit
+ Bitrate
+ Tipo di contenuto
+ OK
+ Info traccia
+ Numero del disco
+ Durata
+ Genere
+ Percorso
+ Frequenza di campionamento
+ Dimensione
+ Suffisso
+ Il file è stato scaricato utilizzando le API Subsonic. Il codec e il bitrate del file rimangono invariati rispetto al file sorgente.
+ L\'applicazione richiederà al server di transcodedare il file e modificare il suo bitrate. Il codec richiesto dall\'utente è %1$s, con un bitrate di %2$s. Eventuali modifiche al codec e al bitrate del file nel formato scelto saranno gestite dal server, che potrebbe o meno supportare l\'operazione.
+ L\'applicazione leggerà solo il file originale fornito dal server. L\'app richiederà esplicitamente al server il file non transcodedato con il bitrate della sorgente originale.
+ La qualità del file da riprodurre è lasciata alla decisione del server. L\'app non imporrà la scelta di codec e bitrate per eventuali transcoding.
+ L\'applicazione richiederà al server di modificare il bitrate del file. L\'utente ha richiesto un bitrate di %1$s, mentre il codec del file sorgente rimarrà lo stesso. Eventuali modifiche al bitrate del file nel formato scelto saranno effettuate dal server, che potrebbe o meno supportare l\'operazione.
+ L\'applicazione richiederà al server di transcodedare il file. Il codec richiesto dall\'utente è %1$s, mentre il bitrate sarà lo stesso del file sorgente. L\'eventuale transcoding del file nel formato scelto dipende dal server, in quanto potrebbe o meno supportare l\'operazione.
+ Titolo
+ Numero traccia
+ Tipo di contenuto transcodificato
+ Suffisso transcodificato
+ Anno
+ unDraw
+ Un ringraziamento speciale va a unDraw, senza le cui illustrazioni non avremmo potuto rendere questa applicazione più bella.
+ https://undraw.co/
+ Widget Tempus
+ Non in riproduzione
+ Apri Tempus
+ 0:00
+ 0:00
+ Immagine dell\'album
+ Riproduci o metti in pausa
+ Traccia successiva
+ Traccia precedente
+ Attiva/disattiva riproduzione casuale
+ Cambia modalità di ripetizione
+
+ - %d album da sincronizzare
+ - %d album da sincronizzare
+
+
+ - %d artista da sincronizzare
+ - %d artisti da sincronizzare
+
+
+ - Scaricando %d canzone
+ - Scaricando %d canzoni
+
+ Equalizzatore
+ Reimposta
+ Abilita
+ Non supportato su questo dispositivo
+ Equalizzatore
+ Apri l\'equalizzatore integrato
+
+ Mostra dettagli album
+ Se abilitato, mostra i dettagli dell\'album come genere, numero di canzoni, ecc. nella pagina dell\'album
+ Ordina artisti per numero di album
+ Se abilitato, ordina gli artisti per numero di album. Ordina per nome se disabilitato.
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 25dcec9..e63df49 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -533,4 +533,8 @@
If enabled, show the album details like genre, song count etc. on the album page
Sort artists by album count
If enabled, sort the artists by album count. Sort by name if disabled.
+
+ Collecting songs from folder…
+ Playing %d songs
+ No songs found in folder
diff --git a/app/src/main/res/xml/locale_config.xml b/app/src/main/res/xml/locale_config.xml
index 2838b57..6e561cb 100644
--- a/app/src/main/res/xml/locale_config.xml
+++ b/app/src/main/res/xml/locale_config.xml
@@ -11,4 +11,5 @@
+
diff --git a/fastlane/metadata/android/en-US/changelogs/6.txt b/fastlane/metadata/android/en-US/changelogs/6.txt
index 40098be..90aaa56 100644
--- a/fastlane/metadata/android/en-US/changelogs/6.txt
+++ b/fastlane/metadata/android/en-US/changelogs/6.txt
@@ -1,5 +1,5 @@
-Update russian strings.xml by @Sevinfolds in https://github.com/eddyizm/tempus/pull/249
-Disallow duplicate songs in queue by @eddyizm in https://github.com/eddyizm/tempus/pull/252
-Fixed crash when viewing share by @drakeerv in https://github.com/eddyizm/tempus/pull/255
-Update Polish translation by @skajmer in https://github.com/eddyizm/tempus/pull/257
-Add podcast channel visible when empty podcasts by @eddyizm in https://github.com/eddyizm/tempus/pull/260
+Update russian strings.xml
+Disallow duplicate songs in queue
+Fixed crash when viewing share
+Update Polish translation
+Add podcast channel visible when empty podcasts
diff --git a/fastlane/metadata/android/en-US/changelogs/7.txt b/fastlane/metadata/android/en-US/changelogs/7.txt
new file mode 100644
index 0000000..9b19077
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/7.txt
@@ -0,0 +1,5 @@
+* fix: Fix player queue soft-lock
+* chore: Add Catalan i18n
+* chore: Refactor MediaService
+* chore(i18n): Update Spanish translation
+* chore(i18n): Update Italian translation
diff --git a/fastlane/metadata/android/en-US/changelogs/8.txt b/fastlane/metadata/android/en-US/changelogs/8.txt
new file mode 100644
index 0000000..69fa797
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/8.txt
@@ -0,0 +1,4 @@
+* chore: Add Obtainium badge to README
+* fix: Revert "refactor MediaService"
+* feat: add play functionality to library folder/index items
+* fix: start queue blocking UI
diff --git a/mockup/usage/music_folders_playback.png b/mockup/usage/music_folders_playback.png
new file mode 100755
index 0000000..aef2038
Binary files /dev/null and b/mockup/usage/music_folders_playback.png differ
diff --git a/mockup/usage/music_folders_root.png b/mockup/usage/music_folders_root.png
new file mode 100755
index 0000000..3d90312
Binary files /dev/null and b/mockup/usage/music_folders_root.png differ