Compare commits
59 Commits
v3.10.0-al
...
v3.12.0
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
fea6366d84 | ||
|
|
92ac2e5684 | ||
|
|
06a52afa18 | ||
|
|
87f6db9e79 | ||
|
|
5fa46cc49b | ||
|
|
4da967910a | ||
|
|
3b18f39948 | ||
|
|
c9e0581815 | ||
|
|
b0fcc31f7b | ||
|
|
e98c9483c8 | ||
|
|
98a45b6059 | ||
|
|
6e070dfef0 | ||
|
|
910cce90f5 | ||
|
|
1a70ccd8f4 | ||
|
|
7830657fe1 | ||
|
|
0351ccfc95 | ||
|
|
10af6fb4ce | ||
|
|
61ec15e696 | ||
|
|
d21bd475a1 | ||
|
|
7e34f6ee64 | ||
|
|
7cfefe76cc | ||
|
|
4585533740 | ||
|
|
07c1760c39 | ||
|
|
24d4e67872 | ||
|
|
bec840620c | ||
|
|
2fa4ddf874 | ||
|
|
e16f88cb73 | ||
|
|
f79b05cb67 | ||
|
|
ed7c572578 | ||
|
|
e891214831 | ||
|
|
3d5ef1d900 | ||
|
|
ba09f1f9ac | ||
|
|
7ccc0a0cf8 | ||
|
|
4dfd346da5 | ||
|
|
f9cc5b39cd | ||
|
|
04580e380b | ||
|
|
77ac195f32 | ||
|
|
f53461382c | ||
|
|
8a57f8f389 | ||
|
|
0e76504cda | ||
|
|
7fdffa7f6f | ||
|
|
76293af038 | ||
|
|
e1aeccdd85 | ||
|
|
ab0e58b506 | ||
|
|
98db83f11a | ||
|
|
d49d37d1fd | ||
|
|
cc4d4701e1 | ||
|
|
1f347209b5 | ||
|
|
44f8160e21 | ||
|
|
d7d25fb542 | ||
|
|
181af686c2 | ||
|
|
177fc5670c | ||
|
|
bfd6f28d7a | ||
|
|
549220f8f3 | ||
|
|
8482ddb02f | ||
|
|
74cce9c867 | ||
|
|
9fbae1823d | ||
|
|
c5566c4fa8 | ||
|
|
633d9218e4 |
5
.gitignore
vendored
5
.gitignore
vendored
@@ -14,4 +14,7 @@
|
||||
.cxx
|
||||
/.idea/
|
||||
.env
|
||||
.vscode/settings.json
|
||||
.vscode/settings.json
|
||||
# release / debug files
|
||||
tempus-release-key.jks
|
||||
app/tempo/
|
||||
1
.idea/misc.xml
generated
1
.idea/misc.xml
generated
@@ -1,4 +1,3 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="DesignSurface">
|
||||
<option name="filePathToZoomLevelMap">
|
||||
|
||||
41
CHANGELOG.md
Normal file
41
CHANGELOG.md
Normal file
@@ -0,0 +1,41 @@
|
||||
# Changelog
|
||||
|
||||
***This log is for this fork to detail updates since 3.9.0 from the main repo.***
|
||||
|
||||
## [3.11.2](https://github.com/eddyizm/tempo/releases/tag/v3.11.2) (2025-08-09)
|
||||
|
||||
|
||||
([Full Changelog](https://github.com/eddyizm/tempo/compare/v3.10.0...eddyizm:tempo:v3.11.2?expand=1))
|
||||
|
||||
**Housekeeping:**
|
||||
|
||||
- [Chore] Added change log.
|
||||
|
||||
**Merged pull requests:**
|
||||
|
||||
- [Fix] make hardcoded strings in home fragment dynamic [\#27](https://github.com/eddyizm/tempo/pull/22) ([jaime-grj](https://github.com/jaime-grj))
|
||||
|
||||
- [Fix] show "System default" language option, sort languages alphabetically, include country when showing language in settings [\#26](https://github.com/eddyizm/tempo/pull/26) ([jaime-grj ](https://github.com/jaime-grj))
|
||||
|
||||
- [Fix] check for IP connectivity instead of Internet access [\#25](https://github.com/eddyizm/tempo/pull/25) ([jaime-grj](https://github.com/jaime-grj))
|
||||
|
||||
- [Fix] hide unnecessary TextViews in AlbumPageFragment when there is no data, fixed incorrect album release date [\#24](https://github.com/eddyizm/tempo/pull/24) ([jaime-grj](https://github.com/jaime-grj))
|
||||
|
||||
- [Feat] show sampling rate and bit depth if available [\#22](https://github.com/eddyizm/tempo/pull/22) ([jaime-grj](https://github.com/jaime-grj))
|
||||
|
||||
- [Feat] Fix lyric scrolling during playback, keep screen on while viewing [\#20](https://github.com/eddyizm/tempo/pull/20) ([le-firehawk](https://github.com/le-firehawk))
|
||||
|
||||
## [3.10.0](https://github.com/eddyizm/tempo/releases/tag/v3.10.0) (2025-08-04)
|
||||
|
||||
**Merged pull requests:**
|
||||
|
||||
- [Fix] redirection to artist fragment on artist label click [\#379](https://github.com/CappielloAntonio/tempo/pull/379)
|
||||
- [Fix] Player queue lag, limits [\#385](https://github.com/CappielloAntonio/tempo/pull/385)
|
||||
- [Fix] crash when sorting albums with a null artist [\#389](https://github.com/CappielloAntonio/tempo/pull/389)
|
||||
- [Feat] Display toast message after adding a song to a playlist [\#371](https://github.com/CappielloAntonio/tempo/pull/371)
|
||||
- [Feat] Album add to playlist context menu item [\#367](https://github.com/CappielloAntonio/tempo/pull/367)
|
||||
- [Feat] Store and retrieve replay and shuffle states in preferences [\#397](https://github.com/CappielloAntonio/tempo/pull/397)
|
||||
- [Feat] Enhance Android media player notification window #400
|
||||
[\#400](https://github.com/CappielloAntonio/tempo/pull/400)
|
||||
- [Chore] Spanish translation [\#374](https://github.com/CappielloAntonio/tempo/pull/374)
|
||||
- [Chore] Polish translation [\#378](https://github.com/CappielloAntonio/tempo/pull/378)
|
||||
28
README.md
28
README.md
@@ -7,12 +7,12 @@
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
<a href="https://github.com/CappielloAntonio/tempo/releases"><img src="https://i.ibb.co/q0mdc4Z/get-it-on-github.png" width="200"></a>
|
||||
<a href="https://github.com/eddyizm/tempo/releases"><img src="https://i.ibb.co/q0mdc4Z/get-it-on-github.png" width="200"></a>
|
||||
</p>
|
||||
<p align="center">
|
||||
<!-- <p align="center">
|
||||
<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>
|
||||
<a href="https://apt.izzysoft.de/fdroid/index/apk/com.cappielloantonio.tempo"><img src="https://gitlab.com/IzzyOnDroid/repo/-/raw/master/assets/IzzyOnDroid.png" width="200"></a>
|
||||
</p>
|
||||
</p> -->
|
||||
|
||||
**Tempo** 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.
|
||||
|
||||
@@ -22,6 +22,14 @@ Tempo does not rely on magic algorithms to decide what you should listen to. Ins
|
||||
|
||||
**Use the Github version of the app for full Android Auto and Chromecast support.**
|
||||
|
||||
## Fork
|
||||
|
||||
This fork is my attempt to keep development moving forward and merge in PR's that have been sitting for a while in the main repo. Thankful to @CappielloAntonio for the amazing app and hopefully we can continue to build on top of it. I will only be releasing on github and if I am not able to merge back to the main repo, I plan to rename the app to be able to publish it to fdroid and possibly google play? We will see.
|
||||
|
||||
Moved details to [CHANGELOG.md](https://github.com/eddyizm/tempo/blob/main/CHANGELOG.md)
|
||||
|
||||
Fork [**sponsorship here**](https://ko-fi.com/eddyizm).
|
||||
|
||||
## Features
|
||||
- **Subsonic Integration**: Tempo seamlessly integrates with your Subsonic server, providing you with easy access to your entire music collection on the go.
|
||||
- **Sleek and Intuitive UI**: Enjoy a clean and user-friendly interface designed to enhance your music listening experience, tailored to your preferences and listening history.
|
||||
@@ -35,21 +43,11 @@ Tempo does not rely on magic algorithms to decide what you should listen to. Ins
|
||||
- **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.
|
||||
|
||||
<p align="center">
|
||||
<img src="mockup/feat/1_screenshot.png" width=200>
|
||||
<img src="mockup/feat/2_screenshot.png" width=200>
|
||||
<img src="mockup/feat/3_screenshot.png" width=200>
|
||||
<img src="mockup/feat/4_screenshot.png" width=200>
|
||||
<img src="mockup/feat/5_screenshot.png" width=200>
|
||||
<img src="mockup/feat/6_screenshot.png" width=200>
|
||||
<img src="mockup/feat/7_screenshot.png" width=200>
|
||||
<img src="mockup/feat/8_screenshot.png" width=200>
|
||||
</p>
|
||||
|
||||
## Sponsors
|
||||
Thanks to the original repo/creator [CappielloAntonio](https://github.com/CappielloAntonio) (3.9.0)
|
||||
|
||||
Tempo is an open-source project developed and maintained solely by me. I would like to express my heartfelt thanks to all the users who have shown their love and support for Tempo. Your contributions and encouragement mean a lot to me, and they help drive the development and improvement of the app.
|
||||
|
||||
If you would like to sponsor the project and show your support, you can make a donation or contribution by visiting the [**sponsorship page**](https://www.buymeacoffee.com/a.cappiello). Your generosity will help cover the costs of development and further enhancements.
|
||||
|
||||
## Screenshot
|
||||
|
||||
|
||||
@@ -10,8 +10,8 @@ android {
|
||||
minSdkVersion 24
|
||||
targetSdk 35
|
||||
|
||||
versionCode 26
|
||||
versionName '3.9.8'
|
||||
versionCode 28
|
||||
versionName '3.12.0'
|
||||
|
||||
testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner'
|
||||
|
||||
|
||||
1101
app/schemas/com.cappielloantonio.tempo.database.AppDatabase/11.json
Normal file
1101
app/schemas/com.cappielloantonio.tempo.database.AppDatabase/11.json
Normal file
File diff suppressed because it is too large
Load Diff
@@ -28,9 +28,9 @@ import com.cappielloantonio.tempo.subsonic.models.Playlist;
|
||||
|
||||
@UnstableApi
|
||||
@Database(
|
||||
version = 10,
|
||||
version = 11,
|
||||
entities = {Queue.class, Server.class, RecentSearch.class, Download.class, Chronology.class, Favorite.class, SessionMediaItem.class, Playlist.class},
|
||||
autoMigrations = {@AutoMigration(from = 9, to = 10)}
|
||||
autoMigrations = {@AutoMigration(from = 10, to = 11)}
|
||||
)
|
||||
@TypeConverters({DateConverters.class})
|
||||
public abstract class AppDatabase extends RoomDatabase {
|
||||
|
||||
@@ -37,6 +37,8 @@ class Chronology(@PrimaryKey override val id: String) : Child(id) {
|
||||
transcodedSuffix = mediaItem.mediaMetadata.extras!!.getString("transcodedSuffix")
|
||||
duration = mediaItem.mediaMetadata.extras!!.getInt("duration")
|
||||
bitrate = mediaItem.mediaMetadata.extras!!.getInt("bitrate")
|
||||
samplingRate = mediaItem.mediaMetadata.extras!!.getInt("samplingRate")
|
||||
bitDepth = mediaItem.mediaMetadata.extras!!.getInt("bitDepth")
|
||||
path = mediaItem.mediaMetadata.extras!!.getString("path")
|
||||
isVideo = mediaItem.mediaMetadata.extras!!.getBoolean("isVideo")
|
||||
userRating = mediaItem.mediaMetadata.extras!!.getInt("userRating")
|
||||
|
||||
@@ -41,6 +41,8 @@ class Queue(override val id: String) : Child(id) {
|
||||
transcodedSuffix = child.transcodedSuffix
|
||||
duration = child.duration
|
||||
bitrate = child.bitrate
|
||||
samplingRate = child.samplingRate
|
||||
bitDepth = child.bitDepth
|
||||
path = child.path
|
||||
isVideo = child.isVideo
|
||||
userRating = child.userRating
|
||||
|
||||
@@ -50,6 +50,12 @@ open class Child(
|
||||
@ColumnInfo("bitrate")
|
||||
@SerializedName("bitRate")
|
||||
var bitrate: Int? = null,
|
||||
@ColumnInfo("sampling_rate")
|
||||
@SerializedName("samplingRate")
|
||||
var samplingRate: Int? = null,
|
||||
@ColumnInfo("bit_depth")
|
||||
@SerializedName("bitDepth")
|
||||
var bitDepth: Int? = null,
|
||||
@ColumnInfo
|
||||
var path: String? = null,
|
||||
@ColumnInfo(name = "is_video")
|
||||
|
||||
@@ -14,11 +14,20 @@ open class ItemDate : Parcelable {
|
||||
var month: Int? = null
|
||||
var day: Int? = null
|
||||
|
||||
fun getFormattedDate(): String {
|
||||
val calendar = Calendar.getInstance()
|
||||
val dateFormat = SimpleDateFormat("MMMM dd, yyyy", Locale.getDefault())
|
||||
fun getFormattedDate(): String? {
|
||||
if (year == null && month == null && day == null) return null
|
||||
|
||||
calendar.set(year ?: 0, month ?: 0, day ?: 0)
|
||||
val calendar = Calendar.getInstance()
|
||||
val dateFormat = if (month == null && day == null) {
|
||||
SimpleDateFormat("yyyy", Locale.getDefault())
|
||||
} else if (day == null) {
|
||||
SimpleDateFormat("MMMM yyyy", Locale.getDefault())
|
||||
}
|
||||
else{
|
||||
SimpleDateFormat("MMMM dd, yyyy", Locale.getDefault())
|
||||
}
|
||||
|
||||
calendar.set(year ?: 0, month ?: 1, day ?: 1)
|
||||
|
||||
return dateFormat.format(calendar.time)
|
||||
}
|
||||
|
||||
@@ -48,7 +48,7 @@ public class CacheUtil {
|
||||
NetworkCapabilities capabilities = connectivityManager.getNetworkCapabilities(network);
|
||||
|
||||
if (capabilities != null) {
|
||||
return capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) && capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED);
|
||||
return capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,6 +15,8 @@ import com.cappielloantonio.tempo.util.MusicUtil;
|
||||
import com.cappielloantonio.tempo.util.Preferences;
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
public class TrackInfoDialog extends DialogFragment {
|
||||
private DialogTrackInfoBinding bind;
|
||||
|
||||
@@ -51,7 +53,12 @@ public class TrackInfoDialog extends DialogFragment {
|
||||
|
||||
private void setTrackInfo() {
|
||||
bind.trakTitleInfoTextView.setText(mediaMetadata.title);
|
||||
bind.trakArtistInfoTextView.setText(mediaMetadata.artist);
|
||||
bind.trakArtistInfoTextView.setText(
|
||||
mediaMetadata.artist != null
|
||||
? mediaMetadata.artist
|
||||
: mediaMetadata.extras != null && Objects.equals(mediaMetadata.extras.getString("type"), Constants.MEDIA_TYPE_RADIO)
|
||||
? mediaMetadata.extras.getString("uri", getString(R.string.label_placeholder))
|
||||
: "");
|
||||
|
||||
if (mediaMetadata.extras != null) {
|
||||
CustomGlideRequest.Builder
|
||||
@@ -62,18 +69,20 @@ public class TrackInfoDialog extends DialogFragment {
|
||||
bind.titleValueSector.setText(mediaMetadata.extras.getString("title", getString(R.string.label_placeholder)));
|
||||
bind.albumValueSector.setText(mediaMetadata.extras.getString("album", getString(R.string.label_placeholder)));
|
||||
bind.artistValueSector.setText(mediaMetadata.extras.getString("artist", getString(R.string.label_placeholder)));
|
||||
bind.trackNumberValueSector.setText(String.valueOf(mediaMetadata.extras.getInt("track", 0)));
|
||||
bind.yearValueSector.setText(String.valueOf(mediaMetadata.extras.getInt("year", 0)));
|
||||
bind.trackNumberValueSector.setText(mediaMetadata.extras.getInt("track", 0) != 0 ? String.valueOf(mediaMetadata.extras.getInt("track", 0)) : getString(R.string.label_placeholder));
|
||||
bind.yearValueSector.setText(mediaMetadata.extras.getInt("year", 0) != 0 ? String.valueOf(mediaMetadata.extras.getInt("year", 0)) : getString(R.string.label_placeholder));
|
||||
bind.genreValueSector.setText(mediaMetadata.extras.getString("genre", getString(R.string.label_placeholder)));
|
||||
bind.sizeValueSector.setText(MusicUtil.getReadableByteCount(mediaMetadata.extras.getLong("size", 0)));
|
||||
bind.sizeValueSector.setText(mediaMetadata.extras.getLong("size", 0) != 0 ? MusicUtil.getReadableByteCount(mediaMetadata.extras.getLong("size", 0)) : getString(R.string.label_placeholder));
|
||||
bind.contentTypeValueSector.setText(mediaMetadata.extras.getString("contentType", getString(R.string.label_placeholder)));
|
||||
bind.suffixValueSector.setText(mediaMetadata.extras.getString("suffix", getString(R.string.label_placeholder)));
|
||||
bind.transcodedContentTypeValueSector.setText(mediaMetadata.extras.getString("transcodedContentType", getString(R.string.label_placeholder)));
|
||||
bind.transcodedSuffixValueSector.setText(mediaMetadata.extras.getString("transcodedSuffix", getString(R.string.label_placeholder)));
|
||||
bind.durationValueSector.setText(MusicUtil.getReadableDurationString(mediaMetadata.extras.getInt("duration", 0), false));
|
||||
bind.bitrateValueSector.setText(mediaMetadata.extras.getInt("bitrate", 0) + " kbps");
|
||||
bind.durationValueSector.setText(mediaMetadata.extras.getInt("duration", 0) != 0 ? MusicUtil.getReadableDurationString(mediaMetadata.extras.getInt("duration", 0), false) : getString(R.string.label_placeholder));
|
||||
bind.bitrateValueSector.setText(mediaMetadata.extras.getInt("bitrate", 0) != 0 ? mediaMetadata.extras.getInt("bitrate", 0) + " kbps" : getString(R.string.label_placeholder));
|
||||
bind.samplingRateValueSector.setText(mediaMetadata.extras.getInt("samplingRate", 0) != 0 ? mediaMetadata.extras.getInt("samplingRate", 0) + " Hz" : getString(R.string.label_placeholder));
|
||||
bind.bitDepthValueSector.setText(mediaMetadata.extras.getInt("bitDepth", 0) != 0 ? mediaMetadata.extras.getInt("bitDepth", 0) + " bits" : getString(R.string.label_placeholder));
|
||||
bind.pathValueSector.setText(mediaMetadata.extras.getString("path", getString(R.string.label_placeholder)));
|
||||
bind.discNumberValueSector.setText(String.valueOf(mediaMetadata.extras.getInt("discNumber", 0)));
|
||||
bind.discNumberValueSector.setText(mediaMetadata.extras.getInt("discNumber", 0) != 0 ? String.valueOf(mediaMetadata.extras.getInt("discNumber", 0)) : getString(R.string.label_placeholder));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -145,17 +145,27 @@ public class AlbumPageFragment extends Fragment implements ClickCallback {
|
||||
bind.albumNameLabel.setText(album.getName());
|
||||
bind.albumArtistLabel.setText(album.getArtist());
|
||||
bind.albumReleaseYearLabel.setText(album.getYear() != 0 ? String.valueOf(album.getYear()) : "");
|
||||
bind.albumReleaseYearLabel.setVisibility(album.getYear() != 0 ? View.VISIBLE : View.GONE);
|
||||
bind.albumSongCountDurationTextview.setText(getString(R.string.album_page_tracks_count_and_duration, album.getSongCount(), album.getDuration() != null ? album.getDuration() / 60 : 0));
|
||||
bind.albumGenresTextview.setText(album.getGenre());
|
||||
if (album.getGenre() != null && !album.getGenre().isEmpty()) {
|
||||
bind.albumGenresTextview.setText(album.getGenre());
|
||||
bind.albumGenresTextview.setVisibility(View.VISIBLE);
|
||||
}
|
||||
else{
|
||||
bind.albumGenresTextview.setVisibility(View.GONE);
|
||||
}
|
||||
|
||||
if (album.getReleaseDate() != null && album.getOriginalReleaseDate() != null) {
|
||||
bind.albumReleaseYearsTextview.setVisibility(View.VISIBLE);
|
||||
if (album.getReleaseDate().getFormattedDate() != null || album.getOriginalReleaseDate().getFormattedDate() != null)
|
||||
bind.albumReleaseYearsTextview.setVisibility(View.VISIBLE);
|
||||
else
|
||||
bind.albumReleaseYearsTextview.setVisibility(View.GONE);
|
||||
|
||||
if (album.getReleaseDate() == null || album.getOriginalReleaseDate() == null) {
|
||||
if (album.getReleaseDate().getFormattedDate() == null || album.getOriginalReleaseDate().getFormattedDate() == null) {
|
||||
bind.albumReleaseYearsTextview.setText(getString(R.string.album_page_release_date_label, album.getReleaseDate() != null ? album.getReleaseDate().getFormattedDate() : album.getOriginalReleaseDate().getFormattedDate()));
|
||||
}
|
||||
|
||||
if (album.getReleaseDate() != null && album.getOriginalReleaseDate() != null) {
|
||||
if (album.getReleaseDate().getFormattedDate() != null && album.getOriginalReleaseDate().getFormattedDate() != null) {
|
||||
if (Objects.equals(album.getReleaseDate().getYear(), album.getOriginalReleaseDate().getYear()) && Objects.equals(album.getReleaseDate().getMonth(), album.getOriginalReleaseDate().getMonth()) && Objects.equals(album.getReleaseDate().getDay(), album.getOriginalReleaseDate().getDay())) {
|
||||
bind.albumReleaseYearsTextview.setText(getString(R.string.album_page_release_date_label, album.getReleaseDate().getFormattedDate()));
|
||||
} else {
|
||||
|
||||
@@ -80,13 +80,13 @@ public class HomeFragment extends Fragment {
|
||||
private void initHomePager() {
|
||||
HomePager pager = new HomePager(this);
|
||||
|
||||
pager.addFragment(new HomeTabMusicFragment(), "Music", R.drawable.ic_home);
|
||||
pager.addFragment(new HomeTabMusicFragment(), getString(R.string.home_section_music), R.drawable.ic_home);
|
||||
|
||||
if (Preferences.isPodcastSectionVisible())
|
||||
pager.addFragment(new HomeTabPodcastFragment(), "Podcast", R.drawable.ic_graphic_eq);
|
||||
pager.addFragment(new HomeTabPodcastFragment(), getString(R.string.home_section_podcast), R.drawable.ic_graphic_eq);
|
||||
|
||||
if (Preferences.isRadioSectionVisible())
|
||||
pager.addFragment(new HomeTabRadioFragment(), "Radio", R.drawable.ic_play_for_work);
|
||||
pager.addFragment(new HomeTabRadioFragment(), getString(R.string.home_section_radio), R.drawable.ic_play_for_work);
|
||||
|
||||
bind.homeViewPager.setAdapter(pager);
|
||||
bind.homeViewPager.setOffscreenPageLimit(3);
|
||||
|
||||
@@ -174,7 +174,12 @@ public class PlayerBottomSheetFragment extends Fragment {
|
||||
playerBottomSheetViewModel.setLiveDescription(mediaMetadata.extras.getString("description", null));
|
||||
|
||||
bind.playerHeaderLayout.playerHeaderMediaTitleLabel.setText(mediaMetadata.extras.getString("title"));
|
||||
bind.playerHeaderLayout.playerHeaderMediaArtistLabel.setText(mediaMetadata.extras.getString("artist"));
|
||||
bind.playerHeaderLayout.playerHeaderMediaArtistLabel.setText(
|
||||
mediaMetadata.artist != null
|
||||
? mediaMetadata.artist
|
||||
: Objects.equals(mediaMetadata.extras.getString("type"), Constants.MEDIA_TYPE_RADIO)
|
||||
? mediaMetadata.extras.getString("uri", getString(R.string.label_placeholder))
|
||||
: "");
|
||||
|
||||
CustomGlideRequest.Builder
|
||||
.from(requireContext(), mediaMetadata.extras.getString("coverArtId"), CustomGlideRequest.ResourceType.Song)
|
||||
@@ -182,7 +187,11 @@ public class PlayerBottomSheetFragment extends Fragment {
|
||||
.into(bind.playerHeaderLayout.playerHeaderMediaCoverImage);
|
||||
|
||||
bind.playerHeaderLayout.playerHeaderMediaTitleLabel.setVisibility(mediaMetadata.extras.getString("title") != null && !Objects.equals(mediaMetadata.extras.getString("title"), "") ? View.VISIBLE : View.GONE);
|
||||
bind.playerHeaderLayout.playerHeaderMediaArtistLabel.setVisibility(mediaMetadata.extras.getString("artist") != null && !Objects.equals(mediaMetadata.extras.getString("artist"), "") ? View.VISIBLE : View.GONE);
|
||||
bind.playerHeaderLayout.playerHeaderMediaArtistLabel.setVisibility(
|
||||
(mediaMetadata.extras.getString("artist") != null && !Objects.equals(mediaMetadata.extras.getString("artist"), ""))
|
||||
|| (Objects.equals(mediaMetadata.extras.getString("type"), Constants.MEDIA_TYPE_RADIO) && mediaMetadata.extras.getString("uri") != null)
|
||||
? View.VISIBLE
|
||||
: View.GONE);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -2,6 +2,7 @@ package com.cappielloantonio.tempo.ui.fragment;
|
||||
|
||||
import android.content.ComponentName;
|
||||
import android.os.Bundle;
|
||||
import android.text.TextUtils;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
@@ -9,6 +10,7 @@ import android.widget.Button;
|
||||
import android.widget.ImageButton;
|
||||
import android.widget.TextView;
|
||||
import android.widget.ToggleButton;
|
||||
import android.widget.RatingBar;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.constraintlayout.widget.ConstraintLayout;
|
||||
@@ -35,11 +37,15 @@ import com.cappielloantonio.tempo.util.Constants;
|
||||
import com.cappielloantonio.tempo.util.MusicUtil;
|
||||
import com.cappielloantonio.tempo.util.Preferences;
|
||||
import com.cappielloantonio.tempo.viewmodel.PlayerBottomSheetViewModel;
|
||||
import com.cappielloantonio.tempo.viewmodel.RatingViewModel;
|
||||
import com.google.android.material.chip.Chip;
|
||||
import com.google.android.material.elevation.SurfaceColors;
|
||||
import com.google.common.util.concurrent.ListenableFuture;
|
||||
import com.google.common.util.concurrent.MoreExecutors;
|
||||
|
||||
import java.text.DecimalFormat;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
|
||||
@UnstableApi
|
||||
@@ -49,6 +55,8 @@ public class PlayerControllerFragment extends Fragment {
|
||||
private InnerFragmentPlayerControllerBinding bind;
|
||||
private ViewPager2 playerMediaCoverViewPager;
|
||||
private ToggleButton buttonFavorite;
|
||||
private RatingViewModel ratingViewModel;
|
||||
private RatingBar songRatingBar;
|
||||
private TextView playerMediaTitleLabel;
|
||||
private TextView playerArtistNameLabel;
|
||||
private Button playbackSpeedButton;
|
||||
@@ -71,6 +79,7 @@ public class PlayerControllerFragment extends Fragment {
|
||||
View view = bind.getRoot();
|
||||
|
||||
playerBottomSheetViewModel = new ViewModelProvider(requireActivity()).get(PlayerBottomSheetViewModel.class);
|
||||
ratingViewModel = new ViewModelProvider(requireActivity()).get(RatingViewModel.class);
|
||||
|
||||
init();
|
||||
initQuickActionView();
|
||||
@@ -113,6 +122,7 @@ public class PlayerControllerFragment extends Fragment {
|
||||
playerQuickActionView = bind.getRoot().findViewById(R.id.player_quick_action_view);
|
||||
playerOpenQueueButton = bind.getRoot().findViewById(R.id.player_open_queue_button);
|
||||
playerTrackInfo = bind.getRoot().findViewById(R.id.player_info_track);
|
||||
songRatingBar = bind.getRoot().findViewById(R.id.song_rating_bar);
|
||||
}
|
||||
|
||||
private void initQuickActionView() {
|
||||
@@ -142,7 +152,6 @@ public class PlayerControllerFragment extends Fragment {
|
||||
bind.nowPlayingMediaControllerView.setPlayer(mediaBrowser);
|
||||
mediaBrowser.setShuffleModeEnabled(Preferences.isShuffleModeEnabled());
|
||||
mediaBrowser.setRepeatMode(Preferences.getRepeatMode());
|
||||
|
||||
setMediaControllerListener(mediaBrowser);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
@@ -177,27 +186,45 @@ public class PlayerControllerFragment extends Fragment {
|
||||
|
||||
private void setMetadata(MediaMetadata mediaMetadata) {
|
||||
playerMediaTitleLabel.setText(String.valueOf(mediaMetadata.title));
|
||||
playerArtistNameLabel.setText(String.valueOf(mediaMetadata.artist));
|
||||
playerArtistNameLabel.setText(
|
||||
mediaMetadata.artist != null
|
||||
? String.valueOf(mediaMetadata.artist)
|
||||
: mediaMetadata.extras != null && Objects.equals(mediaMetadata.extras.getString("type"), Constants.MEDIA_TYPE_RADIO)
|
||||
? mediaMetadata.extras.getString("uri", getString(R.string.label_placeholder))
|
||||
: "");
|
||||
|
||||
playerMediaTitleLabel.setSelected(true);
|
||||
playerArtistNameLabel.setSelected(true);
|
||||
|
||||
playerMediaTitleLabel.setVisibility(mediaMetadata.title != null && !Objects.equals(mediaMetadata.title, "") ? View.VISIBLE : View.GONE);
|
||||
playerArtistNameLabel.setVisibility(mediaMetadata.artist != null && !Objects.equals(mediaMetadata.artist, "") ? View.VISIBLE : View.GONE);
|
||||
playerArtistNameLabel.setVisibility(
|
||||
(mediaMetadata.artist != null && !Objects.equals(mediaMetadata.artist, ""))
|
||||
|| mediaMetadata.extras != null && Objects.equals(mediaMetadata.extras.getString("type"), Constants.MEDIA_TYPE_RADIO) && mediaMetadata.extras.getString("uri") != null
|
||||
? View.VISIBLE
|
||||
: View.GONE);
|
||||
}
|
||||
|
||||
private void setMediaInfo(MediaMetadata mediaMetadata) {
|
||||
if (mediaMetadata.extras != null) {
|
||||
String extension = mediaMetadata.extras.getString("suffix", "Unknown format");
|
||||
String extension = mediaMetadata.extras.getString("suffix", getString(R.string.player_unknown_format));
|
||||
String bitrate = mediaMetadata.extras.getInt("bitrate", 0) != 0 ? mediaMetadata.extras.getInt("bitrate", 0) + "kbps" : "Original";
|
||||
String samplingRate = mediaMetadata.extras.getInt("samplingRate", 0) != 0 ? new DecimalFormat("0.#").format(mediaMetadata.extras.getInt("samplingRate", 0) / 1000.0) + "kHz" : "";
|
||||
String bitDepth = mediaMetadata.extras.getInt("bitDepth", 0) != 0 ? mediaMetadata.extras.getInt("bitDepth", 0) + "b" : "";
|
||||
|
||||
playerMediaExtension.setText(extension);
|
||||
|
||||
if (bitrate.equals("Original")) {
|
||||
playerMediaBitrate.setVisibility(View.GONE);
|
||||
} else {
|
||||
List<String> mediaQualityItems = new ArrayList<>();
|
||||
|
||||
if (!bitrate.trim().isEmpty()) mediaQualityItems.add(bitrate);
|
||||
if (!bitDepth.trim().isEmpty()) mediaQualityItems.add(bitDepth);
|
||||
if (!samplingRate.trim().isEmpty()) mediaQualityItems.add(samplingRate);
|
||||
|
||||
String mediaQuality = TextUtils.join(" • ", mediaQualityItems);
|
||||
playerMediaBitrate.setVisibility(View.VISIBLE);
|
||||
playerMediaBitrate.setText(bitrate);
|
||||
playerMediaBitrate.setText(mediaQuality);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -205,8 +232,8 @@ public class PlayerControllerFragment extends Fragment {
|
||||
boolean isTranscodingBitrate = !MusicUtil.getBitratePreference().equals("0");
|
||||
|
||||
if (isTranscodingExtension || isTranscodingBitrate) {
|
||||
playerMediaExtension.setText("Transcoding");
|
||||
playerMediaBitrate.setText("requested");
|
||||
playerMediaExtension.setText(MusicUtil.getTranscodingFormatPreference() + " (" + getString(R.string.player_transcoding) + ")");
|
||||
playerMediaBitrate.setText(!MusicUtil.getBitratePreference().equals("0") ? MusicUtil.getBitratePreference() + "kbps" : getString(R.string.player_transcoding_requested));
|
||||
}
|
||||
|
||||
playerTrackInfo.setOnClickListener(view -> {
|
||||
@@ -292,6 +319,7 @@ public class PlayerControllerFragment extends Fragment {
|
||||
private void initMediaListenable() {
|
||||
playerBottomSheetViewModel.getLiveMedia().observe(getViewLifecycleOwner(), media -> {
|
||||
if (media != null) {
|
||||
ratingViewModel.setSong(media);
|
||||
buttonFavorite.setChecked(media.getStarred() != null);
|
||||
buttonFavorite.setOnClickListener(v -> playerBottomSheetViewModel.setFavorite(requireContext(), media));
|
||||
buttonFavorite.setOnLongClickListener(v -> {
|
||||
@@ -302,9 +330,29 @@ public class PlayerControllerFragment extends Fragment {
|
||||
dialog.setArguments(bundle);
|
||||
dialog.show(requireActivity().getSupportFragmentManager(), null);
|
||||
|
||||
|
||||
return true;
|
||||
});
|
||||
|
||||
Integer currentRating = media.getUserRating();
|
||||
|
||||
if (currentRating != null) {
|
||||
songRatingBar.setRating(currentRating);
|
||||
} else {
|
||||
songRatingBar.setRating(0);
|
||||
}
|
||||
|
||||
songRatingBar.setOnRatingBarChangeListener(new RatingBar.OnRatingBarChangeListener() {
|
||||
@Override
|
||||
public void onRatingChanged(RatingBar ratingBar, float rating, boolean fromUser) {
|
||||
if (fromUser) {
|
||||
ratingViewModel.rate((int) rating);
|
||||
media.setUserRating((int) rating);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
if (getActivity() != null) {
|
||||
playerBottomSheetViewModel.refreshMediaInfo(requireActivity(), media);
|
||||
}
|
||||
|
||||
@@ -6,11 +6,13 @@ import android.os.Bundle;
|
||||
import android.os.Handler;
|
||||
import android.text.Spannable;
|
||||
import android.text.SpannableString;
|
||||
import android.text.Layout;
|
||||
import android.text.style.ForegroundColorSpan;
|
||||
import android.util.Log;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.view.WindowManager;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
@@ -28,6 +30,7 @@ import com.cappielloantonio.tempo.subsonic.models.Line;
|
||||
import com.cappielloantonio.tempo.subsonic.models.LyricsList;
|
||||
import com.cappielloantonio.tempo.util.MusicUtil;
|
||||
import com.cappielloantonio.tempo.util.OpenSubsonicExtensionsUtil;
|
||||
import com.cappielloantonio.tempo.util.Preferences;
|
||||
import com.cappielloantonio.tempo.viewmodel.PlayerBottomSheetViewModel;
|
||||
import com.google.common.util.concurrent.ListenableFuture;
|
||||
import com.google.common.util.concurrent.MoreExecutors;
|
||||
@@ -76,12 +79,16 @@ public class PlayerLyricsFragment extends Fragment {
|
||||
public void onResume() {
|
||||
super.onResume();
|
||||
bindMediaController();
|
||||
requireActivity().getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPause() {
|
||||
super.onPause();
|
||||
releaseHandler();
|
||||
if (!Preferences.isDisplayAlwaysOn()) {
|
||||
requireActivity().getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -281,10 +288,18 @@ public class PlayerLyricsFragment extends Fragment {
|
||||
}
|
||||
|
||||
private int getScroll(List<Line> lines, Line toHighlight) {
|
||||
int lineHeight = bind.nowPlayingSongLyricsTextView.getLineHeight();
|
||||
int lineCount = getLineCount(lines, toHighlight);
|
||||
int scrollViewHeight = bind.nowPlayingSongLyricsSrollView.getHeight();
|
||||
int startIndex = getStartPosition(lines, toHighlight);
|
||||
Layout layout = bind.nowPlayingSongLyricsTextView.getLayout();
|
||||
if (layout == null) return 0;
|
||||
|
||||
return lineHeight * lineCount < scrollViewHeight / 2 ? 0 : lineHeight * lineCount - scrollViewHeight / 2 + lineHeight;
|
||||
int line = layout.getLineForOffset(startIndex);
|
||||
int lineTop = layout.getLineTop(line);
|
||||
int lineBottom = layout.getLineBottom(line);
|
||||
int lineCenter = (lineTop + lineBottom) / 2;
|
||||
|
||||
int scrollViewHeight = bind.nowPlayingSongLyricsSrollView.getHeight();
|
||||
int scroll = lineCenter - scrollViewHeight / 2;
|
||||
|
||||
return Math.max(scroll, 0);
|
||||
}
|
||||
}
|
||||
@@ -201,12 +201,22 @@ public class SettingsFragment extends PreferenceFragmentCompat {
|
||||
localePref.setEntries(entries);
|
||||
localePref.setEntryValues(entryValues);
|
||||
|
||||
localePref.setDefaultValue(entryValues[0]);
|
||||
localePref.setSummary(Locale.forLanguageTag(localePref.getValue()).getDisplayLanguage());
|
||||
String value = localePref.getValue();
|
||||
if ("default".equals(value)) {
|
||||
localePref.setSummary(requireContext().getString(R.string.settings_system_language));
|
||||
} else {
|
||||
localePref.setSummary(Locale.forLanguageTag(value).getDisplayName());
|
||||
}
|
||||
|
||||
localePref.setOnPreferenceChangeListener((preference, newValue) -> {
|
||||
LocaleListCompat appLocale = LocaleListCompat.forLanguageTags((String) newValue);
|
||||
AppCompatDelegate.setApplicationLocales(appLocale);
|
||||
if ("default".equals(newValue)) {
|
||||
AppCompatDelegate.setApplicationLocales(LocaleListCompat.getEmptyLocaleList());
|
||||
preference.setSummary(requireContext().getString(R.string.settings_system_language));
|
||||
} else {
|
||||
LocaleListCompat appLocale = LocaleListCompat.forLanguageTags((String) newValue);
|
||||
AppCompatDelegate.setApplicationLocales(appLocale);
|
||||
preference.setSummary(Locale.forLanguageTag((String) newValue).getDisplayName());
|
||||
}
|
||||
return true;
|
||||
});
|
||||
}
|
||||
|
||||
@@ -54,6 +54,8 @@ public class MappingUtil {
|
||||
bundle.putString("transcodedSuffix", media.getTranscodedSuffix());
|
||||
bundle.putInt("duration", media.getDuration() != null ? media.getDuration() : 0);
|
||||
bundle.putInt("bitrate", media.getBitrate() != null ? media.getBitrate() : 0);
|
||||
bundle.putInt("samplingRate", media.getSamplingRate() != null ? media.getSamplingRate() : 0);
|
||||
bundle.putInt("bitDepth", media.getBitDepth() != null ? media.getBitDepth() : 0);
|
||||
bundle.putString("path", media.getPath());
|
||||
bundle.putBoolean("isVideo", media.isVideo());
|
||||
bundle.putInt("userRating", media.getUserRating() != null ? media.getUserRating() : 0);
|
||||
@@ -138,7 +140,6 @@ public class MappingUtil {
|
||||
Bundle bundle = new Bundle();
|
||||
bundle.putString("id", internetRadioStation.getId());
|
||||
bundle.putString("title", internetRadioStation.getName());
|
||||
bundle.putString("artist", uri.toString());
|
||||
bundle.putString("uri", uri.toString());
|
||||
bundle.putString("type", Constants.MEDIA_TYPE_RADIO);
|
||||
|
||||
@@ -147,7 +148,6 @@ public class MappingUtil {
|
||||
.setMediaMetadata(
|
||||
new MediaMetadata.Builder()
|
||||
.setTitle(internetRadioStation.getName())
|
||||
.setArtist(internetRadioStation.getStreamUrl())
|
||||
.setExtras(bundle)
|
||||
.setIsBrowsable(false)
|
||||
.setIsPlayable(true)
|
||||
|
||||
@@ -15,6 +15,7 @@ import com.cappielloantonio.tempo.repository.DownloadRepository;
|
||||
import com.cappielloantonio.tempo.subsonic.models.Child;
|
||||
|
||||
import java.text.CharacterIterator;
|
||||
import java.text.DecimalFormat;
|
||||
import java.text.StringCharacterIterator;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
@@ -163,6 +164,12 @@ public class MusicUtil {
|
||||
" " +
|
||||
child.getBitrate() +
|
||||
"kbps" +
|
||||
" • " +
|
||||
(child.getBitDepth() != null && child.getBitDepth() != 0
|
||||
? child.getBitDepth() + "/" + (child.getSamplingRate() != null ? child.getSamplingRate() / 1000 : "")
|
||||
: (child.getSamplingRate() != null
|
||||
? new DecimalFormat("0.#").format(child.getSamplingRate() / 1000.0) + "kHz"
|
||||
: "")) +
|
||||
" " +
|
||||
child.getSuffix();
|
||||
}
|
||||
|
||||
@@ -8,6 +8,7 @@ import android.graphics.drawable.InsetDrawable;
|
||||
import androidx.core.os.LocaleListCompat;
|
||||
import androidx.recyclerview.widget.DividerItemDecoration;
|
||||
|
||||
import com.cappielloantonio.tempo.App;
|
||||
import com.cappielloantonio.tempo.R;
|
||||
|
||||
import org.xmlpull.v1.XmlPullParser;
|
||||
@@ -15,9 +16,10 @@ import org.xmlpull.v1.XmlPullParserException;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.AbstractMap;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
import java.util.HashMap;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
@@ -74,17 +76,32 @@ public class UIUtil {
|
||||
public static Map<String, String> getLangPreferenceDropdownEntries(Context context) {
|
||||
LocaleListCompat localeList = getLocalesFromResources(context);
|
||||
|
||||
Map<String, String> map = new HashMap<>();
|
||||
List<Map.Entry<String, String>> localeArrayList = new ArrayList<>();
|
||||
|
||||
String systemDefaultLabel = App.getContext().getString(R.string.settings_system_language);
|
||||
String systemDefaultValue = "default";
|
||||
|
||||
for (int i = 0; i < localeList.size(); i++) {
|
||||
Locale locale = localeList.get(i);
|
||||
|
||||
if (locale != null) {
|
||||
map.put(Util.toPascalCase(locale.getDisplayName()), locale.toLanguageTag());
|
||||
localeArrayList.add(
|
||||
new AbstractMap.SimpleEntry<>(
|
||||
Util.toPascalCase(locale.getDisplayName()),
|
||||
locale.toLanguageTag()
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
return map;
|
||||
localeArrayList.sort(Map.Entry.comparingByKey(String.CASE_INSENSITIVE_ORDER));
|
||||
|
||||
LinkedHashMap<String, String> orderedMap = new LinkedHashMap<>();
|
||||
orderedMap.put(systemDefaultLabel, systemDefaultValue);
|
||||
for (Map.Entry<String, String> entry : localeArrayList) {
|
||||
orderedMap.put(entry.getKey(), entry.getValue());
|
||||
}
|
||||
|
||||
return orderedMap;
|
||||
}
|
||||
|
||||
public static String getReadableDate(Date date) {
|
||||
|
||||
@@ -103,7 +103,6 @@ public class PlayerBottomSheetViewModel extends AndroidViewModel {
|
||||
favoriteRepository.starLater(media.getId(), null, null, false);
|
||||
}
|
||||
});
|
||||
|
||||
media.setStarred(null);
|
||||
}
|
||||
|
||||
@@ -131,7 +130,7 @@ public class PlayerBottomSheetViewModel extends AndroidViewModel {
|
||||
}
|
||||
}
|
||||
|
||||
public LiveData<String> getLiveLyrics() {
|
||||
public LiveData<String> getLiveLyrics() {
|
||||
return lyricsLiveData;
|
||||
}
|
||||
|
||||
|
||||
@@ -47,6 +47,8 @@
|
||||
android:layout_height="wrap_content"
|
||||
android:gravity="center"
|
||||
android:text="@string/activity_info_offline_mode"
|
||||
android:textSize="6sp"
|
||||
android:textSize="12sp"
|
||||
android:textStyle="bold"
|
||||
android:visibility="gone" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
@@ -391,6 +391,58 @@
|
||||
android:text="@string/label_placeholder" />
|
||||
</LinearLayout>
|
||||
|
||||
<View
|
||||
style="@style/Divider"
|
||||
android:layout_gravity="center_vertical"
|
||||
android:layout_marginVertical="8dp" />
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/sampling_rate_info_sector"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/sampling_rate_key_sector"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="4"
|
||||
android:paddingEnd="8dp"
|
||||
android:text="@string/track_info_sampling_rate" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/sampling_rate_value_sector"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="7"
|
||||
android:text="@string/label_placeholder" />
|
||||
</LinearLayout>
|
||||
|
||||
<View
|
||||
style="@style/Divider"
|
||||
android:layout_gravity="center_vertical"
|
||||
android:layout_marginVertical="8dp" />
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/bit_depth_info_sector"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/bit_depth_key_sector"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="4"
|
||||
android:paddingEnd="8dp"
|
||||
android:text="@string/track_info_bit_depth" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/bit_depth_value_sector"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="7"
|
||||
android:text="@string/label_placeholder" />
|
||||
</LinearLayout>
|
||||
|
||||
<View
|
||||
style="@style/Divider"
|
||||
android:layout_gravity="center_vertical"
|
||||
|
||||
@@ -126,9 +126,11 @@
|
||||
android:layout_marginEnd="18dp"
|
||||
android:text="@string/label_placeholder"
|
||||
android:textAlignment="center"
|
||||
android:visibility="gone"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
tools:visibility="visible" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/album_song_count_duration_textview"
|
||||
|
||||
@@ -104,6 +104,37 @@
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@+id/player_media_title_label" />
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/rating_container"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="8dp"
|
||||
android:orientation="horizontal"
|
||||
android:gravity="center"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@+id/player_artist_name_label">
|
||||
|
||||
<RatingBar
|
||||
android:id="@+id/song_rating_bar"
|
||||
style="?android:attr/ratingBarStyleIndicator"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:numStars="5"
|
||||
android:stepSize="1"
|
||||
android:rating="0"
|
||||
android:isIndicator="false" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/rating_text"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="8dp"
|
||||
android:textSize="12sp"
|
||||
android:textColor="?attr/colorOnSurfaceVariant"
|
||||
android:text=""/>
|
||||
</LinearLayout>
|
||||
|
||||
<ToggleButton
|
||||
android:id="@+id/button_favorite"
|
||||
android:layout_width="26dp"
|
||||
@@ -136,13 +167,14 @@
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="16dp"
|
||||
android:layout_marginTop="20dp"
|
||||
android:layout_marginTop="8dp"
|
||||
android:layout_marginEnd="16dp"
|
||||
app:bar_height="2dp"
|
||||
app:buffered_color="?attr/colorOnSecondaryContainer"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@+id/player_artist_name_label"
|
||||
|
||||
app:layout_constraintTop_toBottomOf="@+id/rating_container"
|
||||
app:played_color="?attr/colorOnPrimaryContainer"
|
||||
app:scrubber_color="?attr/colorOnPrimaryContainer"
|
||||
app:unplayed_color="?attr/colorPrimaryContainer" />
|
||||
|
||||
@@ -103,6 +103,9 @@
|
||||
<string name="home_rearrangement_dialog_positive_button">Sichern</string>
|
||||
<string name="home_rearrangement_dialog_title">Startseite anpassen</string>
|
||||
<string name="home_rearrangement_dialog_subtitle">Die Anwendung muss neu gestartet werden, um die Änderungen auszuführen.</string>
|
||||
<string name="home_section_music">Musik</string>
|
||||
<string name="home_section_podcast">Podcast</string>
|
||||
<string name="home_section_radio">Radio</string>
|
||||
<string name="home_subtitle_best_of">Top Tracks Deiner Lieblingskünstler</string>
|
||||
<string name="home_subtitle_made_for_you">Ein Mix von einem deiner Lieblingslieder erstellen</string>
|
||||
<string name="home_subtitle_new_internet_radio_station">Radio hinzufügen</string>
|
||||
@@ -281,11 +284,12 @@
|
||||
<string name="settings_download_storage_title">Download storage</string>
|
||||
<string name="settings_equalizer_summary">Audio Einstellungen anpassen</string>
|
||||
<string name="settings_equalizer_title">Equalizer</string>
|
||||
<string name="settings_github_link">https://github.com/CappielloAntonio/tempo</string>
|
||||
<string name="settings_github_link">https://github.com/eddyizm/tempo</string>
|
||||
<string name="settings_github_summary">Verfolge die Entwicklung</string>
|
||||
<string name="settings_github_title">Github</string>
|
||||
<string name="settings_image_size">Bilder Auflösung anpassen</string>
|
||||
<string name="settings_language">Sprache</string>
|
||||
<string name="settings_system_language">Systemsprache</string>
|
||||
<string name="settings_logout_title">Abmelden</string>
|
||||
<string name="settings_max_bitrate_download">Bitrate für Downloads</string>
|
||||
<string name="settings_max_bitrate_mobile">Bitrate bei mobiler Nutzung</string>
|
||||
@@ -392,6 +396,7 @@
|
||||
<string name="track_info_title">Titel</string>
|
||||
<string name="track_info_album">Album</string>
|
||||
<string name="track_info_artist">Künstler</string>
|
||||
<string name="track_info_bit_depth">Bit-Tiefe</string>
|
||||
<string name="track_info_track_number">Track Nummer</string>
|
||||
<string name="track_info_year">Jahr</string>
|
||||
<string name="track_info_genre">Genre</string>
|
||||
@@ -402,6 +407,7 @@
|
||||
<string name="track_info_transcoded_suffix">Transkodiertes Suffix</string>
|
||||
<string name="track_info_duration">Länge</string>
|
||||
<string name="track_info_bitrate">Bitrate</string>
|
||||
<string name="track_info_sampling_rate">Abtastrate</string>
|
||||
<string name="track_info_path">Pfad</string>
|
||||
<string name="track_info_disc_number">Disk Nummer</string>
|
||||
<string name="track_info_summary_downloaded_file">Diese Datei wurde mit den Subsonic APIs heruntergeladen. Der Codec und die Bitrate sind unverändert zur original Datei.</string>
|
||||
|
||||
@@ -104,6 +104,9 @@
|
||||
<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_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_new_internet_radio_station">Añadir una nueva emisora de radio</string>
|
||||
@@ -164,8 +167,9 @@
|
||||
<string name="menu_group_by_artist">Artista</string>
|
||||
<string name="settings_image_size">Resolución de la imagen</string>
|
||||
<string name="settings_language">Idioma</string>
|
||||
<string name="settings_system_language">Idioma del sistema</string>
|
||||
<string name="settings_logout_title">Cerrar sesión</string>
|
||||
<string name="settings_github_link">https://github.com/CappielloAntonio/tempo</string>
|
||||
<string name="settings_github_link">https://github.com/eddyizm/tempo</string>
|
||||
<string name="settings_github_summary">Siga el desarrollo</string>
|
||||
<string name="settings_github_title">Github</string>
|
||||
<string name="menu_group_by_genre">Género</string>
|
||||
@@ -192,6 +196,9 @@
|
||||
<string name="player_playback_speed">%1$.2fx</string>
|
||||
<string name="player_queue_clean_all_button">Limpiar la cola de reproducción</string>
|
||||
<string name="player_server_priority">Prioridad del servidor</string>
|
||||
<string name="player_unknown_format">Formato desconocido</string>
|
||||
<string name="player_transcoding">Transcodificando</string>
|
||||
<string name="player_transcoding_requested">solicitado</string>
|
||||
<string name="playlist_catalogue_title">Catálogo de listas de reproducción</string>
|
||||
<string name="playlist_catalogue_title_expanded">Explorar listas de reproducción</string>
|
||||
<string name="playlist_chooser_dialog_empty">No hay listas de reproducción</string>
|
||||
@@ -312,7 +319,9 @@
|
||||
<string name="streaming_cache_storage_internal_dialog_negative_button">Interno</string>
|
||||
<string name="track_info_album">Álbum</string>
|
||||
<string name="track_info_artist">Artista</string>
|
||||
<string name="track_info_bit_depth">Profundidad de bits</string>
|
||||
<string name="track_info_bitrate">Tasa de bits</string>
|
||||
<string name="track_info_sampling_rate">Tasa de muestreo</string>
|
||||
<string name="track_info_content_type">Tipo de contenido</string>
|
||||
<string name="track_info_dialog_positive_button">Aceptar</string>
|
||||
<string name="track_info_transcoded_content_type">Tipo de contenido en la transcodificación</string>
|
||||
|
||||
@@ -32,6 +32,21 @@
|
||||
<item>300</item>
|
||||
</string-array>
|
||||
|
||||
<string-array name="streaming_cache_size_titles">
|
||||
<item>Désactivé</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>
|
||||
|
||||
@@ -24,7 +24,10 @@
|
||||
<string name="album_list_page_title">Albums</string>
|
||||
<string name="album_page_extra_info_button">Similaire</string>
|
||||
<string name="album_page_play_button">Lire</string>
|
||||
<string name="album_page_release_date_label">Sorti le %1$s</string>
|
||||
<string name="album_page_release_dates_label">Sorti le %1$s, initialement %2$s</string>
|
||||
<string name="album_page_shuffle_button">Mélanger</string>
|
||||
<string name="album_page_tracks_count_and_duration">%1$d titres • %2$d minutes</string>
|
||||
<string name="app_name">Tempo</string>
|
||||
<string name="artist_adapter_radio_station_starting">Recherche…</string>
|
||||
<string name="artist_bottom_sheet_instant_mix">Mix instantané</string>
|
||||
@@ -51,13 +54,16 @@
|
||||
<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>
|
||||
<string name="connection_alert_dialog_summary">L\'accès au serveur Subsonic sur des connexions autres que le Wi-Fi ont été bloquées. Pour empêcher cette alerte de réapparaître, désactiver la vérification de la connexion dans les paramètres de l\'app.</string>
|
||||
<string name="connection_alert_dialog_summary">L\'accès au serveur Subsonic sur des connexions autres que le Wi-Fi a été bloqué. Pour empêcher cette alerte de réapparaître, désactiver la vérification de la connexion dans les paramètres de l\'app.</string>
|
||||
<string name="connection_alert_dialog_title">Wi-Fi déconnecté</string>
|
||||
<string name="content_description_shuffle_button">Mélanger</string>
|
||||
<string name="delete_download_storage_dialog_negative_button">Annuler</string>
|
||||
<string name="delete_download_storage_dialog_positive_button">Continuer</string>
|
||||
<string name="delete_download_storage_dialog_summary">Sachez que la poursuite de cette action entraînera la suppression permanente de tous les éléments sauvegardés et téléchargés à partir de tous les serveurs</string>
|
||||
<string name="delete_download_storage_dialog_summary">Attention, la poursuite de cette action entraînera la suppression définitive de tous les éléments sauvegardés et téléchargés à partir de tous les serveurs</string>
|
||||
<string name="delete_download_storage_dialog_title">Supprimer les éléments téléchargés</string>
|
||||
<string name="description_empty_title">Aucune description disponible</string>
|
||||
<string name="disc_titlefull">Disque %1$s - %2$s</string>
|
||||
<string name="disc_titleless">Disque %1$s</string>
|
||||
<string name="download_directory_dialog_negative_button">Annuler</string>
|
||||
<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>
|
||||
@@ -66,8 +72,9 @@
|
||||
<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>
|
||||
<string name="download_item_single_subtitle_formatter">%1$s éléments</string>
|
||||
<string name="download_shuffle_all_subtitle">Tout mélanger</string>
|
||||
<string name="download_storage_dialog_sub_summary">Redémarrez l\'application pour appliquer les changements.</string>
|
||||
<string name="download_storage_dialog_summary">Changer la destination des téléchargements d\'un espace de stockage à un autre résultera en la suppression immédiate de tous les fichiers précédemment téléchargés dans l\'autre espace de stockage.</string>
|
||||
<string name="download_storage_dialog_summary">Modifier le chemin de stockage des téléchargements entraînera la suppression immédiate de tous les fichiers précédemment téléchargés dans le nouvel espace de stockage.</string>
|
||||
<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>
|
||||
@@ -84,8 +91,23 @@
|
||||
<string name="filter_info_selection">Sélectionnez deux filtres ou plus</string>
|
||||
<string name="filter_title">Filtrer</string>
|
||||
<string name="filter_title_expanded">Filtrer par genre</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">Catalogue des Genres</string>
|
||||
<string name="genre_catalogue_title_expanded">Parcourir les Genres</string>
|
||||
<string name="github_update_dialog_negative_button">Me rappeler plus tard</string>
|
||||
<string name="github_update_dialog_neutral_button">Me soutenir</string>
|
||||
<string name="github_update_dialog_positive_button">Télécharger maintenant</string>
|
||||
<string name="github_update_dialog_summary">Une version plus récente de l\'app est disponible sur Github.</string>
|
||||
<string name="github_update_dialog_title">Mise à jour disponible</string>
|
||||
<string name="home_rearrangement_dialog_negative_button">Annuler</string>
|
||||
<string name="home_rearrangement_dialog_neutral_button">Réinitialiser</string>
|
||||
<string name="home_rearrangement_dialog_positive_button">Sauvegarder</string>
|
||||
<string name="home_rearrangement_dialog_title">Réorganiser l\'écran d\'accueil</string>
|
||||
<string name="home_rearrangement_dialog_subtitle">Veuillez noter que ces changements ne s\'appliqueront qu\'après redémarrage de l\'application.</string>
|
||||
<string name="home_section_music">Musique</string>
|
||||
<string name="home_section_podcast">Podcast</string>
|
||||
<string name="home_section_radio">Radio</string>
|
||||
<string name="home_subtitle_best_of">Meilleurs morceaux de vos artistes préférés</string>
|
||||
<string name="home_subtitle_made_for_you">Commencez le mix à partir d\'une chanson que vous aimez</string>
|
||||
<string name="home_subtitle_new_internet_radio_station">Ajouter une radio</string>
|
||||
@@ -102,11 +124,14 @@
|
||||
<string name="home_title_last_played">Écouté dernièrement</string>
|
||||
<string name="home_title_last_played_see_all_button">Voir tout</string>
|
||||
<string name="home_title_last_week">Sur la dernière semaine</string>
|
||||
<string name="home_title_last_month">Sur le dernier mois</string>
|
||||
<string name="home_title_last_year">Sur la dernière année</string>
|
||||
<string name="home_title_made_for_you">Faits pour vous</string>
|
||||
<string name="home_title_most_played">Les plus écoutés</string>
|
||||
<string name="home_title_most_played_see_all_button">Voir tout</string>
|
||||
<string name="home_title_new_releases">Nouvelles sorties</string>
|
||||
<string name="home_title_newest_podcasts">Nouveau podcasts</string>
|
||||
<string name="home_title_pinned_playlists">Playlists</string>
|
||||
<string name="home_title_podcast_channels">Chaînes</string>
|
||||
<string name="home_title_podcast_channels_see_all_button">Voir tout</string>
|
||||
<string name="home_title_radio_station">Stations radio</string>
|
||||
@@ -120,6 +145,7 @@
|
||||
<string name="home_title_starred_tracks">★ Titres favoris</string>
|
||||
<string name="home_title_starred_tracks_see_all_button">Voir tout</string>
|
||||
<string name="home_title_top_songs">Vos morceaux préférés</string>
|
||||
<string name="home_option_reorganize">Réorganiser</string>
|
||||
<string name="library_title_album">Albums</string>
|
||||
<string name="library_title_album_see_all_button">Voir tout</string>
|
||||
<string name="library_title_artist">Artistes</string>
|
||||
@@ -144,13 +170,23 @@
|
||||
<string name="menu_group_by_genre">Genre</string>
|
||||
<string name="menu_group_by_track">Piste</string>
|
||||
<string name="menu_group_by_year">Année</string>
|
||||
<string name="menu_home_label">Home</string>
|
||||
<string name="menu_library_label">Librairie</string>
|
||||
<string name="menu_home_label">Accueil</string>
|
||||
<string name="menu_last_week_name">Sur la dernière semaine</string>
|
||||
<string name="menu_last_month_name">Sur le dernier mois</string>
|
||||
<string name="menu_last_year_name">Sur la dernière année</string>
|
||||
<string name="menu_library_label">Bibliothèque</string>
|
||||
<string name="menu_search_button">Rechercher</string>
|
||||
<string name="menu_settings_button">Paramètres</string>
|
||||
<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_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>
|
||||
<string name="menu_sort_most_recently_starred">Favoris les plus récents</string>
|
||||
<string name="menu_sort_least_recently_starred">Favoris les plus anciens</string>
|
||||
<string name="menu_pin_button">Ajouter à l\'écran d\'accueil</string>
|
||||
<string name="menu_unpin_button">Retirer de l\'écran d\'accueil</string>
|
||||
<string name="menu_sort_year">Année</string>
|
||||
<string name="player_playback_speed">%1$.2fx</string>
|
||||
<string name="player_queue_clean_all_button">Vider la file d\'attente</string>
|
||||
@@ -161,8 +197,11 @@
|
||||
<string name="playlist_chooser_dialog_negative_button">Annuler</string>
|
||||
<string name="playlist_chooser_dialog_neutral_button">Créer</string>
|
||||
<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_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>
|
||||
<string name="playlist_editor_dialog_hint_name">Nom de la playlist</string>
|
||||
<string name="playlist_editor_dialog_negative_button">Annuler</string>
|
||||
<string name="playlist_editor_dialog_neutral_button">Supprimer</string>
|
||||
@@ -208,6 +247,8 @@
|
||||
<string name="search_title_artist">Artistes</string>
|
||||
<string name="search_title_song">Pistes</string>
|
||||
<string name="server_signup_dialog_action_low_security">Sécurité basse</string>
|
||||
<string name="server_signup_dialog_action_delete_toast">Appui long pour supprimer</string>
|
||||
<string name="server_signup_dialog_hint_local_address">URL local</string>
|
||||
<string name="server_signup_dialog_hint_name">Nom du serveur</string>
|
||||
<string name="server_signup_dialog_hint_password">Mot de passe</string>
|
||||
<string name="server_signup_dialog_hint_url">URL du serveur</string>
|
||||
@@ -221,8 +262,9 @@
|
||||
<string name="server_unreachable_dialog_positive_button">Continuer quand même</string>
|
||||
<string name="server_unreachable_dialog_summary">Le serveur est injoignable. Si vous décidez de continuer, cette fenêtre n\'apparaîtra plus pendant une heure.</string>
|
||||
<string name="server_unreachable_dialog_title">Serveur injoignable</string>
|
||||
<string name="settings_about_summary">Tempo est un client open source et léger pour Subsonic, développé et build nativement pour Android.</string>
|
||||
<string name="settings_about_summary">Tempo 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_audio_transcode_download_format">Format de transcodage</string>
|
||||
<string name="settings_audio_transcode_download_priority_summary">Si activé, Tempo 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>
|
||||
@@ -238,6 +280,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_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>
|
||||
<string name="settings_data_saving_mode_summary">Pour réduire la consommation de données, éviter de télécharger les illustrations.</string>
|
||||
<string name="settings_data_saving_mode_title">Limiter l\'utilisation des données mobiles</string>
|
||||
@@ -246,20 +290,24 @@
|
||||
<string name="settings_download_storage_title">Stockage des téléchargements</string>
|
||||
<string name="settings_equalizer_summary">Ajuster les paramètres audios</string>
|
||||
<string name="settings_equalizer_title">Égaliseur</string>
|
||||
<string name="settings_github_link">https://github.com/CappielloAntonio/tempo</string>
|
||||
<string name="settings_github_link">https://github.com/eddyizm/tempo</string>
|
||||
<string name="settings_github_summary">Suivre le développement</string>
|
||||
<string name="settings_github_title">Github</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">Bitrate pour les téléchargements</string>
|
||||
<string name="settings_max_bitrate_mobile">Bitrate en données mobile</string>
|
||||
<string name="settings_max_bitrate_wifi">Bitrate en Wi-Fi</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_wifi">Débit binaire en Wi-Fi</string>
|
||||
<string name="settings_media_cache">Taille du cache des fichiers audios</string>
|
||||
<string name="settings_music_directory">Afficher les dossiers</string>
|
||||
<string name="settings_music_directory_summary">Si activé, rend possible la navigation dans les répertoires. À noter que pour que la navigation dans les dossiers fonctionne correctement, le serveur doit supporter cette fonctionnalité.</string>
|
||||
<string name="settings_podcast">Voir les podcasts</string>
|
||||
<string name="settings_podcast_summary">Si activé, rend visible la section Podcast</string>
|
||||
<string name="settings_audio_quality">Afficher la qualité audio</string>
|
||||
<string name="settings_audio_quality_summary">Le débit binaire et le format audio seront affichés pour chaque piste.</string>
|
||||
<string name="settings_item_rating">Afficher la note</string>
|
||||
<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>
|
||||
@@ -272,15 +320,19 @@
|
||||
<string name="settings_rounded_corner_summary">Si activé, arrondi 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>
|
||||
<string name="settings_share_title">Activer le partage de musique</string>
|
||||
<string name="settings_streaming_cache_size">Taille du cache de streaming</string>
|
||||
<string name="settings_streaming_cache_storage_title">Emplacement du cache de streaming</string>
|
||||
<string name="settings_sub_summary_scrobble">À noter que le scrobbling doit être activé sur le serveur pour qu\'il puisse recevoir ces données</string>
|
||||
<string name="settings_summary_skip_min_star_rating">Lors de l\'écoute de la radio d\'un artiste, d\'un mix instantané ou de tout la bibliothèque en aléatoire, les pistes en dessous d\'une certaine note seront ignorées.</string>
|
||||
<string name="settings_summary_replay_gain">Le Replay Gain est une fonctionnalité qui vous permet d\'ajuster le volume des pistes audio pour une expérience d\'écoute cohérente. Fonctionne uniquement si la piste contient les métadonnées nécessaires.</string>
|
||||
<string name="settings_summary_scrobble">Le scrobbling permet à votre appareil d\'envoyer des informations sur les musiques que vous écoutez au serveur afin de créer des recommendations personnalisées basées sur vos préférences musicales.</string>
|
||||
<string name="settings_summary_share">Permet à l\'utilisateur de partager de la musique via un lien. Cette fonctionnalité doit être supportée et activée sur le serveur et est limitée aux pistes, albums et playlists individuellement.</string>
|
||||
<string name="settings_summary_syncing">Renvoie l\'état de la file d\'attente de cet utilisateur. Cela inclut les pistes dans la file, la piste actuellement écoutée et la position dans la piste. Cette fonctionnalité doit être supportée par le serveur.</string>
|
||||
<string name="settings_summary_transcoding">Le mode de transcodage à prioriser. Si reglé sur \"Lecture directe\", le bitrate 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 bitrate du fichier ne sera pas modifé.</string>
|
||||
<string name="settings_summary_streaming_cache_size">%1$s \nUtilisé actuellement : %2$s MiB</string>
|
||||
<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é, 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_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>
|
||||
@@ -291,7 +343,7 @@
|
||||
<string name="settings_title_replay_gain">Replay Gain</string>
|
||||
<string name="settings_title_scrobble">Scrobble</string>
|
||||
<string name="settings_title_skip_min_star_rating">Ignorer des musiques selon leur note</string>
|
||||
<string name="settings_title_skip_min_star_rating_dialog">Musiques avec une note de:</string>
|
||||
<string name="settings_title_skip_min_star_rating_dialog">Musiques avec une note de :</string>
|
||||
<string name="settings_title_share">Partage</string>
|
||||
<string name="settings_title_syncing">Synchronisation</string>
|
||||
<string name="settings_title_transcoding">Transcodage</string>
|
||||
@@ -336,9 +388,16 @@
|
||||
<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 pourrer utiliser beaucoup de données.</string>
|
||||
<string name="starred_sync_dialog_title">Synchroniser les titres 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>
|
||||
<string name="streaming_cache_storage_dialog_title">Sélectionner une option de stockage</string>
|
||||
<string name="streaming_cache_storage_external_dialog_positive_button">Externe</string>
|
||||
<string name="streaming_cache_storage_internal_dialog_negative_button">Interne</string>
|
||||
<string name="support_url">https://buymeacoffee.com/a.cappiello</string>
|
||||
<string name="track_info_album">Album</string>
|
||||
<string name="track_info_artist">Artiste</string>
|
||||
<string name="track_info_bitrate">Bitrate</string>
|
||||
<string name="track_info_bit_depth">Résolution audio</string>
|
||||
<string name="track_info_bitrate">Débit binaire</string>
|
||||
<string name="track_info_content_type">Type de contenu</string>
|
||||
<string name="track_info_dialog_positive_button">OK</string>
|
||||
<string name="track_info_dialog_title">Infos piste</string>
|
||||
@@ -346,14 +405,15 @@
|
||||
<string name="track_info_duration">Durée</string>
|
||||
<string name="track_info_genre">Genre</string>
|
||||
<string name="track_info_path">Chemin</string>
|
||||
<string name="track_info_sampling_rate">Fréquence d\'échantillonnage</string>
|
||||
<string name="track_info_size">Taille</string>
|
||||
<string name="track_info_suffix">Suffixe</string>
|
||||
<string name="track_info_summary_downloaded_file">Le fichier a été téléchargé depuis les APIs Subsonic. Le codec et le bitrate du fichier demeure inchangé du fichier d\'origine.</string>
|
||||
<string name="track_info_summary_full_transcode">L\'application demandera au serveur de transcoder le fichier et de modifier son bitrate. Le codec demandé par l\'utilisateur est %1$s, avec un bitrate de %2$s. Toute modification éventuelle du codec et du bitrate du fichier dans le format choisi sera gérée par le serveur, qui peut ou non prendre en charge l\'opération.</string>
|
||||
<string name="track_info_summary_original_file">L\'application ne lira que le fichier original tel que fourni par le serveur. L\'application demandera explicitement au serveur le fichier non transcodé avec le bitrate de la source originale.</string>
|
||||
<string name="track_info_summary_server_prioritized">La qualité du fichier à lire est laissée à l\'appréciation du serveur. L\'application n\'impose pas le choix du codec et du bitrate pour un éventuel transcodage.</string>
|
||||
<string name="track_info_summary_transcoding_bitrate">L\'application demandera au serveur de modifier le bitrate du fichier. L\'utilisateur a choisi un bitrate de %1$s, tandis que le codec du fichier restera le même. Toute modification du bitrate du fichier dans le format choisi sera effectuée par le serveur, qui peut ou non prendre en charge l\'opération. </string>
|
||||
<string name="track_info_summary_transcoding_codec">L\'application demandera au serveur de transcoder le fichier. Le codec choisi par l\'utilisateur est le %1$s, tandis que le bitrate sera le même que celui du fichier source. Le transcodage éventuel du fichier dans le codec choisi dépend du serveur, qui peut ou non prendre en charge l\'opération.</string>
|
||||
<string name="track_info_summary_downloaded_file">Le fichier a été téléchargé depuis les APIs Subsonic. Le codec et le débit binaire du fichier demeurent identiques à ceux du fichier d\'origine.</string>
|
||||
<string name="track_info_summary_full_transcode">L\'application demandera au serveur de transcoder le fichier et de modifier son débit binaire. Le codec demandé par l\'utilisateur est %1$s, avec un débit binaire de %2$s. Toute modification éventuelle du codec et du débit binaire du fichier dans le format choisi sera gérée par le serveur, qui peut ou non prendre en charge l\'opération.</string>
|
||||
<string name="track_info_summary_original_file">L\'application ne lira que le fichier original tel que fourni par le serveur. L\'application demandera explicitement au serveur le fichier non transcodé avec le débit binaire de la source originale.</string>
|
||||
<string name="track_info_summary_server_prioritized">La qualité du fichier à lire est laissée à l\'appréciation du serveur. L\'application n\'impose pas le choix du codec et du débit binaire pour un éventuel transcodage.</string>
|
||||
<string name="track_info_summary_transcoding_bitrate">L\'application demandera au serveur de modifier le débit binaire du fichier. L\'utilisateur a choisi un débit binaire de %1$s, tandis que le codec du fichier restera le même. Toute modification du débit binaire du fichier dans le format choisi sera effectuée par le serveur, qui peut ou non prendre en charge l\'opération. </string>
|
||||
<string name="track_info_summary_transcoding_codec">L\'application demandera au serveur de transcoder le fichier. Le codec choisi par l\'utilisateur est le %1$s, tandis que le débit binaire sera le même que celui du fichier source. Le transcodage éventuel du fichier dans le codec choisi dépend du serveur, qui peut ou non prendre en charge l\'opération.</string>
|
||||
<string name="track_info_title">Titre</string>
|
||||
<string name="track_info_track_number">Numéro de piste</string>
|
||||
<string name="track_info_transcoded_content_type">Transcodé type de contenu</string>
|
||||
|
||||
@@ -283,7 +283,7 @@
|
||||
<string name="settings_download_storage_title">Archivio download</string>
|
||||
<string name="settings_equalizer_summary">Regola le impostazioni audio</string>
|
||||
<string name="settings_equalizer_title">Equalizzatore</string>
|
||||
<string name="settings_github_link">https://github.com/CappielloAntonio/tempo</string>
|
||||
<string name="settings_github_link">https://github.com/eddyizm/tempo</string>
|
||||
<string name="settings_github_summary">Segui lo sviluppo</string>
|
||||
<string name="settings_github_title">Github</string>
|
||||
<string name="settings_image_size">Imposta risoluzione delle immagini</string>
|
||||
|
||||
@@ -250,7 +250,7 @@
|
||||
<string name="settings_download_storage_title">스토리지 다운로드</string>
|
||||
<string name="settings_equalizer_summary">오디오 설정 적용</string>
|
||||
<string name="settings_equalizer_title">이퀄라이저</string>
|
||||
<string name="settings_github_link">https://github.com/CappielloAntonio/tempo</string>
|
||||
<string name="settings_github_link">https://github.com/eddyizm/tempo</string>
|
||||
<string name="settings_github_summary">Follow the development</string>
|
||||
<string name="settings_github_title">Github</string>
|
||||
<string name="settings_image_size">이미지 해상도 설정</string>
|
||||
|
||||
@@ -41,7 +41,7 @@
|
||||
</style>
|
||||
|
||||
<style name="NoConnectionTextView">
|
||||
<item name="background">?attr/colorError</item>
|
||||
<item name="android:textColor">?attr/colorOnError</item>
|
||||
<item name="background">?attr/colorErrorContainer</item>
|
||||
<item name="android:textColor">?attr/colorOnErrorContainer</item>
|
||||
</style>
|
||||
</resources>
|
||||
@@ -103,7 +103,13 @@
|
||||
<string name="home_rearrangement_dialog_neutral_button">Reset</string>
|
||||
<string name="home_rearrangement_dialog_positive_button">Zapisz</string>
|
||||
<string name="home_rearrangement_dialog_title">Zmień układ strony głównej</string>
|
||||
<string name="home_rearrangement_dialog_subtitle">Weź pod uwagę to że, żeby zmiany nastąpiły, musisz zrestartować aplikację.</string>
|
||||
<string name="home_rearrangement_dialog_subtitle">Weź pod uwagę to że, żeby zmiany nastąpiły, musisz zrestartować aplikację.</string>
|
||||
<string name="home_section_music">Muzyka</string>
|
||||
<string name="home_section_podcast">Podcasty</string>
|
||||
<string name="home_section_radio">Radio</string>
|
||||
<string name="track_info_bit_depth">Głębia bitowa</string>
|
||||
<string name="track_info_sampling_rate">Częstotliwość próbkowania</string>
|
||||
<string name="settings_system_language">Język systemu</string>
|
||||
<string name="home_subtitle_best_of">Top piosenki od twoich ulubionych wykonawców</string>
|
||||
<string name="home_subtitle_made_for_you">Stwórz miks z piosenki którą lubisz</string>
|
||||
<string name="home_subtitle_new_internet_radio_station">Dodaj nowe radio</string>
|
||||
@@ -285,7 +291,7 @@
|
||||
<string name="settings_download_storage_title">Pamięć do pobierania</string>
|
||||
<string name="settings_equalizer_summary">Zmień ustawienia audio</string>
|
||||
<string name="settings_equalizer_title">Equalizer</string>
|
||||
<string name="settings_github_link">https://github.com/CappielloAntonio/tempo</string>
|
||||
<string name="settings_github_link">https://github.com/eddyizm/tempo</string>
|
||||
<string name="settings_github_summary">Śledź tworzenie aplikacji</string>
|
||||
<string name="settings_github_title">GitHub</string>
|
||||
<string name="settings_image_size">Rozdzielczość obrazów</string>
|
||||
@@ -415,4 +421,4 @@
|
||||
<string name="undraw_page">unDraw</string>
|
||||
<string name="undraw_thanks">Specjalne podziękowania dla unDraw bez którego ilustracji nie mogliśmy uczynić tej aplikacji jeszcze piękniejszą.</string>
|
||||
<string name="undraw_url">https://undraw.co/</string>
|
||||
</resources>
|
||||
</resources>
|
||||
|
||||
@@ -250,7 +250,7 @@
|
||||
<string name="settings_download_storage_title">Armazenamento dos downloads</string>
|
||||
<string name="settings_equalizer_summary">Ajustar configurações de áudio</string>
|
||||
<string name="settings_equalizer_title">Equalizador</string>
|
||||
<string name="settings_github_link">https://github.com/CappielloAntonio/tempo</string>
|
||||
<string name="settings_github_link">https://github.com/eddyizm/tempo</string>
|
||||
<string name="settings_github_summary">Acompanhe o desenvolvimento</string>
|
||||
<string name="settings_github_title">Github</string>
|
||||
<string name="settings_image_size">Definir resolução da imagem</string>
|
||||
|
||||
@@ -279,7 +279,7 @@
|
||||
<string name="settings_download_storage_title">Загрузить хранилище</string>
|
||||
<string name="settings_equalizer_summary">Отрегулируйте настройки звука</string>
|
||||
<string name="settings_equalizer_title">Эквалайзер</string>
|
||||
<string name="settings_github_link">https://github.com/CappielloAntonio/tempo</string>
|
||||
<string name="settings_github_link">https://github.com/eddyizm/tempo</string>
|
||||
<string name="settings_github_summary">Следите за развитием</string>
|
||||
<string name="settings_github_title">Github</string>
|
||||
<string name="settings_image_size">Установить разрешение изображения</string>
|
||||
|
||||
@@ -257,7 +257,7 @@
|
||||
<string name="settings_download_storage_title">下载存储</string>
|
||||
<string name="settings_equalizer_summary">调整音频设置</string>
|
||||
<string name="settings_equalizer_title">均衡器</string>
|
||||
<string name="settings_github_link">https://github.com/CappielloAntonio/tempo</string>
|
||||
<string name="settings_github_link">https://github.com/eddyizm/tempo</string>
|
||||
<string name="settings_github_summary">关注开发进展</string>
|
||||
<string name="settings_github_title">Github</string>
|
||||
<string name="settings_image_size">设置图像分辨率</string>
|
||||
|
||||
@@ -105,6 +105,9 @@
|
||||
<string name="home_rearrangement_dialog_positive_button">Save</string>
|
||||
<string name="home_rearrangement_dialog_title">Rearrange home</string>
|
||||
<string name="home_rearrangement_dialog_subtitle">Please note that in order for the changes made to take effect, it is necessary to restart the application.</string>
|
||||
<string name="home_section_music">Music</string>
|
||||
<string name="home_section_podcast">Podcast</string>
|
||||
<string name="home_section_radio">Radio</string>
|
||||
<string name="home_subtitle_best_of">Top songs of your favorite artists</string>
|
||||
<string name="home_subtitle_made_for_you">Start mix from a song you liked</string>
|
||||
<string name="home_subtitle_new_internet_radio_station">Add a new radio</string>
|
||||
@@ -190,6 +193,9 @@
|
||||
<string name="player_playback_speed">%1$.2fx</string>
|
||||
<string name="player_queue_clean_all_button">Clean play queue</string>
|
||||
<string name="player_server_priority">Server Priority</string>
|
||||
<string name="player_unknown_format">Unknown format</string>
|
||||
<string name="player_transcoding">Transcoding</string>
|
||||
<string name="player_transcoding_requested">requested</string>
|
||||
<string name="playlist_catalogue_title">Playlist Catalogue</string>
|
||||
<string name="playlist_catalogue_title_expanded">Browse Playlists</string>
|
||||
<string name="playlist_chooser_dialog_empty">No playlists created</string>
|
||||
@@ -289,7 +295,7 @@
|
||||
<string name="settings_download_storage_title">Download storage</string>
|
||||
<string name="settings_equalizer_summary">Adjust audio settings</string>
|
||||
<string name="settings_equalizer_title">Equalizer</string>
|
||||
<string name="settings_github_link">https://github.com/CappielloAntonio/tempo</string>
|
||||
<string name="settings_github_link">https://github.com/eddyizm/tempo</string>
|
||||
<string name="settings_github_summary">Follow the development</string>
|
||||
<string name="settings_github_title">Github</string>
|
||||
<string name="settings_image_size">Set image resolution</string>
|
||||
@@ -319,6 +325,7 @@
|
||||
<string name="settings_rounded_corner_summary">If enabled, sets a curvature angle for all rendered covers. The changes will take effect on restart.</string>
|
||||
<string name="settings_scan_title">Scan library</string>
|
||||
<string name="settings_scrobble_title">Enable music scrobbling</string>
|
||||
<string name="settings_system_language">System language</string>
|
||||
<string name="settings_share_title">Enable music sharing</string>
|
||||
<string name="settings_streaming_cache_size">Size of streaming cache</string>
|
||||
<string name="settings_streaming_cache_storage_title">Streaming cache storage</string>
|
||||
@@ -395,6 +402,7 @@
|
||||
<string name="support_url">https://buymeacoffee.com/a.cappiello</string>
|
||||
<string name="track_info_album">Album</string>
|
||||
<string name="track_info_artist">Artist</string>
|
||||
<string name="track_info_bit_depth">Bit depth</string>
|
||||
<string name="track_info_bitrate">Bitrate</string>
|
||||
<string name="track_info_content_type">Content Type</string>
|
||||
<string name="track_info_dialog_positive_button">OK</string>
|
||||
@@ -403,6 +411,7 @@
|
||||
<string name="track_info_duration">Duration</string>
|
||||
<string name="track_info_genre">Genre</string>
|
||||
<string name="track_info_path">Path</string>
|
||||
<string name="track_info_sampling_rate">Sampling rate</string>
|
||||
<string name="track_info_size">Size</string>
|
||||
<string name="track_info_suffix">Suffix</string>
|
||||
<string name="track_info_summary_downloaded_file">The file has been downloaded using the Subsonic APIs. The codec and bitrate of the file remain unchanged from the source file.</string>
|
||||
|
||||
@@ -138,10 +138,19 @@ class MediaService : MediaLibraryService() {
|
||||
controller: ControllerInfo,
|
||||
mediaItems: List<MediaItem>
|
||||
): ListenableFuture<List<MediaItem>> {
|
||||
val updatedMediaItems = mediaItems.map {
|
||||
it.buildUpon()
|
||||
.setUri(it.requestMetadata.mediaUri)
|
||||
.setMediaMetadata(it.mediaMetadata)
|
||||
val updatedMediaItems = mediaItems.map { mediaItem ->
|
||||
val mediaMetadata = mediaItem.mediaMetadata
|
||||
|
||||
val newMetadata = mediaMetadata.buildUpon()
|
||||
.setArtist(
|
||||
if (mediaMetadata.artist != null) mediaMetadata.artist
|
||||
else mediaMetadata.extras?.getString("uri") ?: ""
|
||||
)
|
||||
.build()
|
||||
|
||||
mediaItem.buildUpon()
|
||||
.setUri(mediaItem.requestMetadata.mediaUri)
|
||||
.setMediaMetadata(newMetadata)
|
||||
.setMimeType(MimeTypes.BASE_TYPE_AUDIO)
|
||||
.build()
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user