diff options
13 files changed, 177 insertions, 139 deletions
diff --git a/app/src/main/java/github/daneren2005/dsub/activity/SubsonicActivity.java b/app/src/main/java/github/daneren2005/dsub/activity/SubsonicActivity.java index 00e80517..06559456 100644 --- a/app/src/main/java/github/daneren2005/dsub/activity/SubsonicActivity.java +++ b/app/src/main/java/github/daneren2005/dsub/activity/SubsonicActivity.java @@ -883,8 +883,7 @@ public class SubsonicActivity extends AppCompatActivity implements OnItemSelecte restart(true); } protected void restart(boolean resumePosition) { - Intent intent = new Intent(this, ((Object) this).getClass()); - intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); + Intent intent = new Intent(this, this.getClass()); intent.putExtras(getIntent()); if(resumePosition) { intent.putExtra(Constants.FRAGMENT_POSITION, lastSelectedPosition); @@ -893,6 +892,7 @@ public class SubsonicActivity extends AppCompatActivity implements OnItemSelecte intent.putExtra(Constants.INTENT_EXTRA_FRAGMENT_TYPE, fragmentType); intent.putExtra(Constants.FRAGMENT_POSITION, getDrawerItemId(fragmentType)); } + finish(); Util.startActivityWithoutTransition(this, intent); } diff --git a/app/src/main/java/github/daneren2005/dsub/activity/SubsonicFragmentActivity.java b/app/src/main/java/github/daneren2005/dsub/activity/SubsonicFragmentActivity.java index 630cdd50..51de1f6c 100644 --- a/app/src/main/java/github/daneren2005/dsub/activity/SubsonicFragmentActivity.java +++ b/app/src/main/java/github/daneren2005/dsub/activity/SubsonicFragmentActivity.java @@ -417,6 +417,9 @@ public class SubsonicFragmentActivity extends SubsonicActivity implements Downlo openNowPlaying(); } } else { + if(slideUpPanel.getPanelState() == SlidingUpPanelLayout.PanelState.EXPANDED) { + closeNowPlaying(); + } setIntent(intent); } if(drawer != null) { diff --git a/app/src/main/java/github/daneren2005/dsub/fragments/SelectPodcastsFragment.java b/app/src/main/java/github/daneren2005/dsub/fragments/SelectPodcastsFragment.java index 25be47b1..2e2a16b3 100644 --- a/app/src/main/java/github/daneren2005/dsub/fragments/SelectPodcastsFragment.java +++ b/app/src/main/java/github/daneren2005/dsub/fragments/SelectPodcastsFragment.java @@ -175,7 +175,7 @@ public class SelectPodcastsFragment extends SelectRecyclerFragment<Serializable> if(!Util.isOffline(context) && ServerInfo.hasNewestPodcastEpisodes(context)) { try { - newestEpisodes = musicService.getNewestPodcastEpisodes(10, context, listener); + newestEpisodes = musicService.getNewestPodcastEpisodes(refresh, context, listener, 10); for(MusicDirectory.Entry entry: newestEpisodes.getChildren()) { for(PodcastChannel channel: channels) { diff --git a/app/src/main/java/github/daneren2005/dsub/service/CachedMusicService.java b/app/src/main/java/github/daneren2005/dsub/service/CachedMusicService.java index 3be04cff..1a17dfb3 100644 --- a/app/src/main/java/github/daneren2005/dsub/service/CachedMusicService.java +++ b/app/src/main/java/github/daneren2005/dsub/service/CachedMusicService.java @@ -22,8 +22,6 @@ import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; -import java.util.Collections; -import java.util.Comparator; import java.util.Iterator; import java.util.List; import java.util.ListIterator; @@ -59,7 +57,6 @@ import github.daneren2005.dsub.util.SongDBHandler; import github.daneren2005.dsub.util.SyncUtil; import github.daneren2005.dsub.util.TimeLimitedCache; import github.daneren2005.dsub.util.FileUtil; -import github.daneren2005.dsub.util.UpdateHelper; import github.daneren2005.dsub.util.Util; import static github.daneren2005.dsub.domain.MusicDirectory.Entry; @@ -926,8 +923,18 @@ public class CachedMusicService implements MusicService { } @Override - public MusicDirectory getNewestPodcastEpisodes(int count, Context context, ProgressListener progressListener) throws Exception { - return musicService.getNewestPodcastEpisodes(count, context, progressListener); + public MusicDirectory getNewestPodcastEpisodes(boolean refresh, Context context, ProgressListener progressListener, int count) throws Exception { + MusicDirectory result = null; + + String cacheName = getCacheName(context, "newestPodcastEpisodes"); + try { + result = musicService.getNewestPodcastEpisodes(refresh, context, progressListener, count); + FileUtil.serialize(context, result, cacheName); + } catch(IOException e) { + result = FileUtil.deserialize(context, cacheName, MusicDirectory.class, 24); + } finally { + return result; + } } @Override diff --git a/app/src/main/java/github/daneren2005/dsub/service/DownloadServiceLifecycleSupport.java b/app/src/main/java/github/daneren2005/dsub/service/DownloadServiceLifecycleSupport.java index ce2c81f2..5e9e04fc 100644 --- a/app/src/main/java/github/daneren2005/dsub/service/DownloadServiceLifecycleSupport.java +++ b/app/src/main/java/github/daneren2005/dsub/service/DownloadServiceLifecycleSupport.java @@ -56,6 +56,7 @@ import static github.daneren2005.dsub.domain.PlayerState.PREPARING; public class DownloadServiceLifecycleSupport { private static final String TAG = DownloadServiceLifecycleSupport.class.getSimpleName(); public static final String FILENAME_DOWNLOADS_SER = "downloadstate2.ser"; + private static final int DEBOUNCE_TIME = 200; private final DownloadService downloadService; private Looper eventLooper; @@ -400,10 +401,10 @@ public class DownloadServiceLifecycleSupport { } else if(event.getAction() == KeyEvent.ACTION_UP) { switch (event.getKeyCode()) { case RemoteControlClient.FLAG_KEY_MEDIA_PLAY_PAUSE: - case KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE: downloadService.togglePlayPause(); break; case KeyEvent.KEYCODE_HEADSETHOOK: + case KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE: if(lastPressTime < (System.currentTimeMillis() - 500)) { lastPressTime = System.currentTimeMillis(); downloadService.togglePlayPause(); @@ -413,11 +414,17 @@ public class DownloadServiceLifecycleSupport { break; case RemoteControlClient.FLAG_KEY_MEDIA_PREVIOUS: case KeyEvent.KEYCODE_MEDIA_PREVIOUS: - downloadService.previous(); + if(lastPressTime < (System.currentTimeMillis() - DEBOUNCE_TIME)) { + lastPressTime = System.currentTimeMillis(); + downloadService.previous(); + } break; case RemoteControlClient.FLAG_KEY_MEDIA_NEXT: case KeyEvent.KEYCODE_MEDIA_NEXT: - downloadService.next(); + if(lastPressTime < (System.currentTimeMillis() - DEBOUNCE_TIME)) { + lastPressTime = System.currentTimeMillis(); + downloadService.next(); + } break; case KeyEvent.KEYCODE_MEDIA_REWIND: downloadService.rewind(); diff --git a/app/src/main/java/github/daneren2005/dsub/service/MusicService.java b/app/src/main/java/github/daneren2005/dsub/service/MusicService.java index 876b45fd..22f154c4 100644 --- a/app/src/main/java/github/daneren2005/dsub/service/MusicService.java +++ b/app/src/main/java/github/daneren2005/dsub/service/MusicService.java @@ -149,7 +149,7 @@ public interface MusicService { MusicDirectory getPodcastEpisodes(boolean refresh, String id, Context context, ProgressListener progressListener) throws Exception; - MusicDirectory getNewestPodcastEpisodes(int count, Context context, ProgressListener progressListener) throws Exception; + MusicDirectory getNewestPodcastEpisodes(boolean refresh, Context context, ProgressListener progressListener, int count) throws Exception; void refreshPodcasts(Context context, ProgressListener progressListener) throws Exception; diff --git a/app/src/main/java/github/daneren2005/dsub/service/OfflineMusicService.java b/app/src/main/java/github/daneren2005/dsub/service/OfflineMusicService.java index e1929bf8..e004101d 100644 --- a/app/src/main/java/github/daneren2005/dsub/service/OfflineMusicService.java +++ b/app/src/main/java/github/daneren2005/dsub/service/OfflineMusicService.java @@ -775,7 +775,7 @@ public class OfflineMusicService implements MusicService { } @Override - public MusicDirectory getNewestPodcastEpisodes(int count, Context context, ProgressListener progressListener) throws Exception { + public MusicDirectory getNewestPodcastEpisodes(boolean refresh, Context context, ProgressListener progressListener, int count) throws Exception { throw new OfflineException(ERRORMSG); } diff --git a/app/src/main/java/github/daneren2005/dsub/service/RESTMusicService.java b/app/src/main/java/github/daneren2005/dsub/service/RESTMusicService.java index 7a2edf79..4c3a121d 100644 --- a/app/src/main/java/github/daneren2005/dsub/service/RESTMusicService.java +++ b/app/src/main/java/github/daneren2005/dsub/service/RESTMusicService.java @@ -1336,8 +1336,8 @@ public class RESTMusicService implements MusicService { } @Override - public MusicDirectory getNewestPodcastEpisodes(int count, Context context, ProgressListener progressListener) throws Exception { - Reader reader = getReader(context, progressListener, "getNewestPodcasts", null, Arrays.asList("count"), Arrays.<Object>asList(count)); + public MusicDirectory getNewestPodcastEpisodes(boolean refresh, Context context, ProgressListener progressListener, int count) throws Exception { + Reader reader = getReader(context, progressListener, "getNewestPodcasts", null, Arrays.asList("count"), Arrays.<Object>asList(count), true); try { return new PodcastEntryParser(context, getInstance(context)).parse(null, reader, progressListener); @@ -1769,13 +1769,13 @@ public class RESTMusicService implements MusicService { int count = offline.getInt(Constants.OFFLINE_SCROBBLE_COUNT, 0); int retry = 0; for(int i = 1; i <= count; i++) { - String id = offline.getString(Constants.OFFLINE_SCROBBLE_ID + i, null); - long time = offline.getLong(Constants.OFFLINE_SCROBBLE_TIME + i, 0); - if(id != null) { - scrobble(id, true, time, context, progressListener); - } else { - String search = offline.getString(Constants.OFFLINE_SCROBBLE_SEARCH + i, ""); - try{ + try { + String id = offline.getString(Constants.OFFLINE_SCROBBLE_ID + i, null); + long time = offline.getLong(Constants.OFFLINE_SCROBBLE_TIME + i, 0); + if(id != null) { + scrobble(id, true, time, context, progressListener); + } else { + String search = offline.getString(Constants.OFFLINE_SCROBBLE_SEARCH + i, ""); SearchCritera critera = new SearchCritera(search, 0, 0, 1); SearchResult result = searchNew(critera, context, progressListener); if(result.getSongs().size() == 1){ @@ -1787,10 +1787,10 @@ public class RESTMusicService implements MusicService { throw new Exception("Song not found on server"); } } - catch(Exception e){ - Log.e(TAG, e.toString()); - retry++; - } + } + catch(Exception e){ + Log.e(TAG, e.toString()); + retry++; } } diff --git a/app/src/main/java/github/daneren2005/dsub/service/parser/AbstractParser.java b/app/src/main/java/github/daneren2005/dsub/service/parser/AbstractParser.java index 4ee37dad..d6e1a002 100644 --- a/app/src/main/java/github/daneren2005/dsub/service/parser/AbstractParser.java +++ b/app/src/main/java/github/daneren2005/dsub/service/parser/AbstractParser.java @@ -133,7 +133,16 @@ public abstract class AbstractParser { } protected int nextParseEvent() throws Exception { - return parser.next(); + try { + return parser.next(); + } catch(Exception e) { + if(ServerInfo.isMadsonic6(context, instance)) { + ServerInfo overrideInfo = new ServerInfo(); + overrideInfo.saveServerInfo(context, instance); + } + + throw e; + } } protected String getElementName() { @@ -162,6 +171,11 @@ public abstract class AbstractParser { protected void validate() throws Exception { if (!rootElementFound) { + if(ServerInfo.isMadsonic6(context, instance)) { + ServerInfo overrideInfo = new ServerInfo(); + overrideInfo.saveServerInfo(context, instance); + } + throw new Exception(context.getResources().getString(R.string.background_task_parse_error)); } } diff --git a/app/src/main/java/github/daneren2005/dsub/util/ArtistRadioBuffer.java b/app/src/main/java/github/daneren2005/dsub/util/ArtistRadioBuffer.java index b42fa066..bdd961b4 100644 --- a/app/src/main/java/github/daneren2005/dsub/util/ArtistRadioBuffer.java +++ b/app/src/main/java/github/daneren2005/dsub/util/ArtistRadioBuffer.java @@ -107,7 +107,7 @@ public class ArtistRadioBuffer { } private void refill() { - if (buffer != null && (buffer.size() > refillThreshold || (!Util.isNetworkConnected(context) && !Util.isOffline(context)) || lastCount == 0)) { + if (buffer != null && executorService != null && (buffer.size() > refillThreshold || (!Util.isNetworkConnected(context) && !Util.isOffline(context)) || lastCount == 0)) { executorService.shutdown(); return; } diff --git a/app/src/main/java/github/daneren2005/dsub/util/Util.java b/app/src/main/java/github/daneren2005/dsub/util/Util.java index 7efb020d..c3f1a086 100644 --- a/app/src/main/java/github/daneren2005/dsub/util/Util.java +++ b/app/src/main/java/github/daneren2005/dsub/util/Util.java @@ -1418,72 +1418,79 @@ public final class Util { * <p>Broadcasts the given song info as the new song being played.</p> */ public static void broadcastNewTrackInfo(Context context, MusicDirectory.Entry song) { - DownloadService downloadService = (DownloadService)context; - Intent intent = new Intent(EVENT_META_CHANGED); - Intent avrcpIntent = new Intent(AVRCP_METADATA_CHANGED); - - if (song != null) { - intent.putExtra("title", song.getTitle()); - intent.putExtra("artist", song.getArtist()); - intent.putExtra("album", song.getAlbum()); - - File albumArtFile = FileUtil.getAlbumArtFile(context, song); - intent.putExtra("coverart", albumArtFile.getAbsolutePath()); - avrcpIntent.putExtra("playing", true); - } else { - intent.putExtra("title", ""); - intent.putExtra("artist", ""); - intent.putExtra("album", ""); - intent.putExtra("coverart", ""); - avrcpIntent.putExtra("playing", false); - } - addTrackInfo(context, song, avrcpIntent); + try { + Intent intent = new Intent(EVENT_META_CHANGED); + Intent avrcpIntent = new Intent(AVRCP_METADATA_CHANGED); + + if (song != null) { + intent.putExtra("title", song.getTitle()); + intent.putExtra("artist", song.getArtist()); + intent.putExtra("album", song.getAlbum()); - context.sendBroadcast(intent); - context.sendBroadcast(avrcpIntent); + File albumArtFile = FileUtil.getAlbumArtFile(context, song); + intent.putExtra("coverart", albumArtFile.getAbsolutePath()); + avrcpIntent.putExtra("playing", true); + } else { + intent.putExtra("title", ""); + intent.putExtra("artist", ""); + intent.putExtra("album", ""); + intent.putExtra("coverart", ""); + avrcpIntent.putExtra("playing", false); + } + addTrackInfo(context, song, avrcpIntent); + + context.sendBroadcast(intent); + context.sendBroadcast(avrcpIntent); + } catch(Exception e) { + Log.e(TAG, "Failed to broadcastNewTrackInfo", e); + } } /** * <p>Broadcasts the given player state as the one being set.</p> */ public static void broadcastPlaybackStatusChange(Context context, MusicDirectory.Entry song, PlayerState state) { - Intent intent = new Intent(EVENT_PLAYSTATE_CHANGED); - Intent avrcpIntent = new Intent(AVRCP_PLAYSTATE_CHANGED); - - switch (state) { - case STARTED: - intent.putExtra("state", "play"); - avrcpIntent.putExtra("playing", true); - break; - case STOPPED: - intent.putExtra("state", "stop"); - avrcpIntent.putExtra("playing", false); - break; - case PAUSED: - intent.putExtra("state", "pause"); - avrcpIntent.putExtra("playing", false); - break; - case PREPARED: - // Only send quick pause event for samsung devices, causes issues for others - if(Build.MANUFACTURER.toLowerCase().indexOf("samsung") != -1) { + try { + Intent intent = new Intent(EVENT_PLAYSTATE_CHANGED); + Intent avrcpIntent = new Intent(AVRCP_PLAYSTATE_CHANGED); + + switch (state) { + case STARTED: + intent.putExtra("state", "play"); + avrcpIntent.putExtra("playing", true); + break; + case STOPPED: + intent.putExtra("state", "stop"); avrcpIntent.putExtra("playing", false); - } else { - return; // Don't broadcast anything - } - break; - case COMPLETED: - intent.putExtra("state", "complete"); - avrcpIntent.putExtra("playing", false); - break; - default: - return; // No need to broadcast. - } - addTrackInfo(context, song, avrcpIntent); + break; + case PAUSED: + intent.putExtra("state", "pause"); + avrcpIntent.putExtra("playing", false); + break; + case PREPARED: + // Only send quick pause event for samsung devices, causes issues for others + if (Build.MANUFACTURER.toLowerCase().indexOf("samsung") != -1) { + avrcpIntent.putExtra("playing", false); + } else { + return; // Don't broadcast anything + } + break; + case COMPLETED: + intent.putExtra("state", "complete"); + avrcpIntent.putExtra("playing", false); + break; + default: + return; // No need to broadcast. + } + addTrackInfo(context, song, avrcpIntent); - if(state != PlayerState.PREPARED) { - context.sendBroadcast(intent); + if (state != PlayerState.PREPARED) { + context.sendBroadcast(intent); + } + context.sendBroadcast(avrcpIntent); + } catch(Exception e) { + Log.e(TAG, "Failed to broadcastPlaybackStatusChange", e); } - context.sendBroadcast(avrcpIntent); } private static void addTrackInfo(Context context, MusicDirectory.Entry song, Intent intent) { diff --git a/app/src/main/res/menu/select_artist.xml b/app/src/main/res/menu/select_artist.xml index 66ba37ba..f94cda8b 100644 --- a/app/src/main/res/menu/select_artist.xml +++ b/app/src/main/res/menu/select_artist.xml @@ -1,17 +1,17 @@ <?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:compat="http://schemas.android.com/apk/res-auto"> + <item + android:id="@+id/menu_global_search" + android:icon="?attr/search" + android:title="@string/menu.search" + compat:showAsAction="always|withText"/> + <item android:id="@+id/menu_global_shuffle" android:icon="?attr/shuffle" android:title="@string/menu.shuffle" compat:showAsAction="always|withText"/> - - <item - android:id="@+id/menu_global_search" - android:icon="?attr/search" - android:title="@string/menu.search" - compat:showAsAction="ifRoom|withText"/> <group android:id="@+id/not_touchscreen"> <item diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index f435854b..41532874 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -10,7 +10,7 @@ <string name="common.play_next">Suivant</string> <string name="common.play_last">Précédent</string> <string name="common.download">Mettre en cache</string> - <string name="common.pin">Mettre en cache Permanent</string> + <string name="common.pin">Mettre en cache permanent</string> <string name="common.delete">Supprimer</string> <string name="common.star">Favori</string> <string name="common.unstar">Supp. favori</string> @@ -19,11 +19,11 @@ <string name="common.comment">Commentaire</string> <string name="common.public">Publique</string> <string name="common.play_external">Jouer Video</string> - <string name="common.stream_external">Stream Video</string> + <string name="common.stream_external">Stream Vidéo</string> <string name="common.confirm">Confirmer</string> <string name="common.confirm_message">Voulez-vous %1$s %2$s ?</string> <string name="common.confirm_message_cache">cache</string> - <string name="common.empty">Aucune donnée</string> + <string name="common.empty">Aucune données</string> <string name="common.warning">Avertissement</string> <string name="button_bar.home">Accueil</string> @@ -39,7 +39,7 @@ <string name="main.welcome_title">Bienvenue !</string> <string name="main.welcome_text">Bienvenue dans DSub ! L\'application est actuellement configurée pour se connecter au serveur de démo Subsonic (<b>demo.subsonic.org</b>). Vous pouvez configurer votre propre serveur dans les paramètres. Choisir <b>Paramètres</b> et mettre à jour la configuration pour vous y connecter.</string> - <string name="main.about_title">A propos de DSub</string> + <string name="main.about_title">À propos de DSub</string> <string name="main.faq_title">FAQ</string> <string name="main.faq_text"> <![CDATA[ @@ -55,7 +55,7 @@ <string name="main.settings">Paramètres</string> <string name="main.albums_title">Albums</string> <string name="main.albums_newest">Ajoutés récemments</string> - <string name="main.albums_recent">Joués récemment</string> + <string name="main.albums_recent">Joués récemments</string> <string name="main.albums_frequent">Les plus joués</string> <string name="main.albums_highest">Les mieux notés</string> <string name="main.albums_starred">Favoris</string> @@ -64,7 +64,7 @@ <string name="main.albums_year">Par décennies</string> <string name="main.songs_genres">@string/main.albums_genres</string> <string name="main.back_confirm">Presser retour à nouveau pour quitter</string> - <string name="main.scan_complete">Completed scan of Server</string> + <string name="main.scan_complete">Analyse du server terminée</string> <string name="menu.search">Recherche</string> <string name="menu.shuffle">Hasard</string> @@ -75,31 +75,31 @@ <string name="menu.settings">Paramètres</string> <string name="menu.help">Aide</string> - <string name="menu.about">A propos</string> + <string name="menu.about">À propos</string> <string name="menu.add_playlist">Ajouter à la playlist</string> <string name="menu.remove_playlist">Supprimer de la playlist</string> <string name="menu.deleted_playlist">Supprimer la playlist %s</string> - <string name="menu.deleted_playlist_error">Echec de la suppression de la playlist %s</string> + <string name="menu.deleted_playlist_error">Échec de la suppression de la playlist %s</string> <string name="menu.log">Envoyer le journal</string> <string name="menu.set_timer">Ajuster le minuteur</string> <string name="menu.check_podcasts">Vérifier les nouveaux podcasts</string> <string name="menu.add_podcast">Ajouter une chaîne</string> <string name="menu.keep_synced">Synchronisation automatique</string> <string name="menu.stop_sync">Arrêter la synchro.</string> - <string name="menu.show_all">Afficher tous les media</string> + <string name="menu.show_all">Afficher tous les médias</string> <string name="menu.show_artist">Afficher l\'artiste</string> <string name="menu.share">Partager</string> <string name="menu.delete_cache">Supprimer du cache</string> <string name="menu.cast">Diffuser vers appareil</string> <string name="menu.faq">FAQ</string> - <string name="menu.add_user">Ajouter utilisateur</string> - <string name="menu.rescan">Relire le server</string> + <string name="menu.add_user">Ajouter un utilisateur</string> + <string name="menu.rescan">Relire le serveur</string> <string name="menu.rate">Noter</string> <string name="playlist.label">Playlists</string> - <string name="playlist.update_info">Mise à jour informations</string> + <string name="playlist.update_info">Mise à jour des informations</string> <string name="playlist.updated_info">Informations de la playlist %s mises à jour</string> - <string name="playlist.updated_info_error">Echec de la mise à jour des informations de la playlist %s</string> + <string name="playlist.updated_info_error">Échec de la mise à jour des informations de la playlist %s</string> <string name="playlist.overwrite">Remplacer la playlist existante</string> <string name="playlist.add_to">Ajouter à la playlist</string> <string name="playlist.create_new">Créer une nouvelle</string> @@ -119,7 +119,7 @@ <string name="select_album.offline">Déconnecté</string> <string name="select_album.no_sdcard">Erreur : Aucune carte SD card disponible.</string> <string name="select_album.no_network">Problème : Aucun réseau disponible.</string> - <string name="select_album.not_licensed">Serveur sans licence valide. %d jours restant.</string> + <string name="select_album.not_licensed">Serveur sans licence valide. %d jours restants.</string> <string name="select_album.donate_dialog_message">Téléchargement illimité en supportant Subsonic.</string> <string name="select_album.donate_dialog_now">Maintenant</string> <string name="select_album.donate_dialog_later">Plus tard</string> @@ -138,19 +138,19 @@ <string name="select_genre.songs">%d chansons</string> <string name="select_genre.albums">%d albums</string> - <string name="select_podcasts.error">Une erreur est survenue avec ce podcast pendant le chargement. Le serveur doit d\'abord le télécharger.</string> - <string name="select_podcasts.skipped">Ce podcast n\'a pas été chargé sur le serveur. Le serveur doit d\'abord le télécharger.</string> - <string name="select_podcasts.initializing">Le chargement du podcast a commencer sur le serveur. Recharger SVP dans quelques instants.</string> + <string name="select_podcasts.error">Une erreur est survenue avec ce podcast pendant le chargement. Le serveur doit d\'abord le télécharger.</string> + <string name="select_podcasts.skipped">Ce podcast n\'a pas été chargé sur le serveur. Le serveur doit d\'abord le télécharger.</string> + <string name="select_podcasts.initializing">Le chargement du podcast a commencé sur le serveur. Recharger SVP dans quelques instants.</string> <string name="select_podcasts.server_download">Télécharger sur le serveur</string> <string name="select_podcasts.server_delete">Supprimer du serveur</string> <string name="select_podcasts.downloading">Téléchargement %s sur le serveur</string> - <string name="select_podcasts.refreshing">Le serveur recherche les mises à jour de podcasts</string> + <string name="select_podcasts.refreshing">Le serveur recherche les mises à jour des podcasts</string> <string name="select_podcasts.deleted">Podcast supprimé %s</string> <string name="select_podcasts.deleted_error">Erreur lors de la suppression du podcast %s</string> <string name="select_podcasts.add_url">URL :</string> <string name="select_podcasts.created_error">Erreur lors de l\'ajout du podcast</string> <string name="select_podcasts.invalid_podcast_channel">Podcast invalide : %s</string> - <string name="select_podcasts.delete">Supprimer podcast</string> + <string name="select_podcasts.delete">Supprimer le podcast</string> <string name="download.empty">La playlist est vide</string> <string name="download.shuffle_loading">Chargement en cours liste au hasard...</string> @@ -160,7 +160,7 @@ <string name="download.menu_show_album">Afficher l\'album</string> <string name="download.menu_lyrics">Paroles</string> <string name="download.menu_remove_all">Enlever tout</string> - <string name="download.menu_screen_on">Ecran actif</string> + <string name="download.menu_screen_on">Écran actif</string> <string name="download.menu_shuffle">Hasard</string> <string name="download.menu_toggle">Basculer</string> <string name="download.menu_save">Enregistrer la playlist</string> @@ -187,8 +187,8 @@ <string name="download.downloading_summary">En cours : %1$s</string> <string name="download.downloading_summary_expanded">En cours : %1$s \nTaille estimée : %2$s</string> - <string name="download.failed_to_load">Echec du chargement</string> - <string name="download.save_bookmark_failed">Echec de la création du favori</string> + <string name="download.failed_to_load">Échec du chargement</string> + <string name="download.save_bookmark_failed">Échec de la création du favori</string> <string name="sync.new_podcasts">Nouveaux podcasts disponibles</string> <string name="sync.new_playlists">Nouveaux titres dans les playlists</string> @@ -197,17 +197,17 @@ <string name="starring_content_starred">Noté \"%s\"</string> <string name="starring_content_unstarred">Dévalués \"%s\"</string> - <string name="starring_content_error">Echec de la mise à jour \"%s\", Réessayer plus tard.</string> + <string name="starring_content_error">Échec de la mise à jour \"%s\", réessayer plus tard.</string> - <string name="playlist_error">Echec de la récupération des playlists</string> + <string name="playlist_error">Échec de la récupération des playlists</string> <string name="updated_playlist">Titre %1$s ajouté à \"%2$s\"</string> - <string name="updated_playlist_error">Echec de la mise à jour \"%s\", réessayer plus tard.</string> + <string name="updated_playlist_error">Échec de la mise à jour \"%s\", réessayer plus tard.</string> <string name="removed_playlist">Titre %1$s retiré de \"%2$s\"</string> <string name="bookmark.delete">Supprimer le favori</string> - <string name="bookmark.delete_title">Dupprimer le favori pour</string> + <string name="bookmark.delete_title">Supprimer le favori pour</string> <string name="bookmark.deleted">Favori pour \"%s\" supprimé</string> - <string name="bookmark.deleted_error">Echec de la suppression du favori pour \"%s\"</string> + <string name="bookmark.deleted_error">Échec de la suppression du favori pour \"%s\"</string> <string name="bookmark.details_title">Détails du favori</string> <string name="bookmark.details">Titre : %1$s \nPosition : %2$s @@ -217,13 +217,13 @@ <string name="bookmark.resume_title">Reprendre la lecture ?</string> <string name="bookmark.resume">Reprendre la lecture de \'%1$s\' depuis %2$s</string> <string name="bookmark.action_resume">Reprendre</string> - <string name="bookmark.action_start_over">Start Over</string> + <string name="bookmark.action_start_over">Relire depuis le début</string> <string name="rating.title">Noter \"%s\"</string> <string name="rating.set_rating">Note attribuée à \"%s\"</string> <string name="rating.set_rating_failed">Echec de l\'attribution de la note à \"%s\"</string> <string name="rating.remove_rating">Note supprimée pour \"%s\"</string> - <string name="rating.remove_rating_failed">Echec de la suppression de la note pour \"%s\"</string> + <string name="rating.remove_rating_failed">Échec de la suppression de la note pour \"%s\"</string> <string name="song_details.error">Erreur</string> <string name="song_details.skipped">Ignoré</string> @@ -264,9 +264,9 @@ <string name="settings.invalid_username">Saisir un nom d\'utilisateur valide (espaces interdits).</string> <string name="settings.appearance_title">Apparence</string> <string name="settings.theme_title">Thème</string> - <string name="settings.theme_light">Light</string> - <string name="settings.theme_dark">Dark</string> - <string name="settings.theme_black">Black</string> + <string name="settings.theme_light">Clair</string> + <string name="settings.theme_dark">Sombre</string> + <string name="settings.theme_black">Noir</string> <string name="settings.theme_holo">Holo</string> <string name="settings.theme_fullscreen">Plein écran</string> <string name="settings.theme_fullscreen_summary">Cacher autant d\'élément graphique que possible</string> @@ -300,8 +300,8 @@ <string name="settings.max_video_bitrate_3000">3000 Kbps</string> <string name="settings.max_video_bitrate_5000">5000 Kbps</string> <string name="settings.max_bitrate_unlimited">Illimité</string> - <string name="settings.wifi_required_title">Streaming en Wifi uniquement</string> - <string name="settings.wifi_required_summary">Ne lire les média qu\'avec une connexion Wifi</string> + <string name="settings.wifi_required_title">Streaming en wifi uniquement</string> + <string name="settings.wifi_required_summary">Ne lire les média qu\'avec une connexion wifi</string> <string name="settings.network_timeout_title">Délai d\'attente réseau (timeout)</string> <string name="settings.network_timeout_10000">10 secondes</string> <string name="settings.network_timeout_15000">15 secondes</string> @@ -331,7 +331,7 @@ <string name="settings.playlist_random_size_title">Taille de la liste de lecture aléatoire</string> <string name="settings.sleep_timer_title">Temporisateur</string> <string name="settings.sleep_timer_duration_title">Durée temporisation</string> - <string name="settings.sleep_timer_off">Eteindre</string> + <string name="settings.sleep_timer_off">Éteindre</string> <string name="settings.sleep_timer_on">Allumer</string> <string name="settings.sleep_timer_always_on">Toujours en fonctionnement</string> <string name="settings.temp_loss_title">Perte temporaire de focus</string> @@ -405,7 +405,7 @@ <string name="settings.admin_enabled">Administration</string> <string name="settings.admin_enabled_summary">Afficher ou non l\'accès aux outils d\'administration</string> - <string name="shuffle.title">Shuffle By</string> + <string name="shuffle.title">Mélanger par</string> <string name="shuffle.startYear">Année début :</string> <string name="shuffle.endYear">Année fin :</string> <string name="shuffle.genre">Genre :</string> @@ -414,11 +414,11 @@ <string name="share.expires">Expiration : %s</string> <string name="share.expires_never">N\'expire jamais</string> <string name="share.deleted">Supprimer le partage %s</string> - <string name="share.deleted_error">Echec de la suppression du partage %s</string> + <string name="share.deleted_error">Échec de la suppression du partage %s</string> <string name="share.no_expiration">Pas d\'expiration</string> <string name="share.expiration">Expiration :</string> <string name="share.updated_info">Informations de partage mises à jour pour %s</string> - <string name="share.updated_info_error">Echec de la mise à jour des informations de partage pour %s</string> + <string name="share.updated_info_error">Échec de la mise à jour des informations de partage pour %s</string> <string name="share.via">Partager via</string> <string name="share.delete">Supprimer le partage</string> @@ -430,20 +430,20 @@ <string name="admin.change_username_invalid">Saisir un nom d\'utilisateur valide</string> <string name="admin.update_permissions">Mettre à jour les autorisations</string> <string name="admin.update_permissions_success">Autorisation mises à jour pour %1$s</string> - <string name="admin.update_permissions_error">Echec lors de lamise à jour des autorisations de %1$s</string> + <string name="admin.update_permissions_error">Échec lors de lamise à jour des autorisations de %1$s</string> <string name="admin.change_email">Modifier Email</string> <string name="admin.change_email_success">Email remplacé pour %1$s</string> - <string name="admin.change_email_error">Echec lors du remplacement de l\'Email de %1$s</string> + <string name="admin.change_email_error">Échec lors du remplacement de l\'Email de %1$s</string> <string name="admin.change_email_label">Nouvel Email :</string> <string name="admin.change_email_invalid">Saisir un Email valide</string> <string name="admin.change_password">Modifier le mot de passe</string> <string name="admin.change_password_success">Mot de passe modifié pour %1$s</string> - <string name="admin.change_password_error">Echec du remplacement du mot de passe pour %1$s</string> + <string name="admin.change_password_error">Échec du remplacement du mot de passe pour %1$s</string> <string name="admin.change_password_label">Nouveau mot de passe :</string> <string name="admin.change_password_invalid">Saisir un mot de passe valide</string> <string name="admin.delete_user">Supprimer l\'utilisateur</string> <string name="admin.delete_user_success">Suppression effectuée %1$s</string> - <string name="admin.delete_user_error">Echec de la suppression %1$s</string> + <string name="admin.delete_user_error">Échec de la suppression %1$s</string> <string name="admin.confirm_password">Confirmer le mot de passe</string> <string name="admin.confirm_password_bad">Mot de passe saisi erroné</string> @@ -455,7 +455,7 @@ <string name="admin.role.coverArt">Modifier les pochettes</string> <string name="admin.role.comment">Ajouter des commentaires</string> <string name="admin.role.podcast">Gérer les podcasts</string> - <string name="admin.role.stream">Ecouter de la musique</string> + <string name="admin.role.stream">Écouter de la musique</string> <string name="admin.role.jukebox">Télécommander la lecture (jukebox)</string> <string name="admin.role.share">Gérer les partages</string> <string name="admin.role.lastfm">Utiliser Last.FM</string> @@ -469,8 +469,8 @@ <string name="service.connecting">Interrogation du serveur, veuillez patienter.</string> - <string name="parser.upgrade_client"> Versions incompatible. Mettre à jour DSub.</string> - <string name="parser.upgrade_server">Versions incompatibles. Mettre à jour le serveur Subsonic.</string> + <string name="parser.upgrade_client">Version incompatible. Mettre à jour DSub.</string> + <string name="parser.upgrade_server">Version incompatible. Mettre à jour le serveur Subsonic.</string> <string name="parser.not_authenticated">Mauvais nom d\'utilisateur ou mot de passe.</string> <string name="parser.not_authorized">Non autorisé. Vérifier les droit de l\'utilisateur sur le serveur Subsonic.</string> <string name="parser.artist_count">%d artistes récupérés.</string> @@ -480,9 +480,9 @@ <string name="select_artist.folder">Sélectionner un dossier</string> <string name="select_artist.all_folders">Tous les dossier</string> - <string name="equalizer.label">Equaliseur</string> + <string name="equalizer.label">Équaliseur</string> <string name="equalizer.enabled">Activé</string> - <string name="equalizer.preset">Selectioner un préréglage</string> + <string name="equalizer.preset">Sélectionner un préréglage</string> <string name="equalizer.bass_booster">Bass Booster</string> <string name="equalizer.voice_booster">Voice Booster</string> <string name="equalizer.db_size">%d dB</string> @@ -501,8 +501,8 @@ <string name="util.bytes_format.kilobyte">0 KB</string> <string name="util.bytes_format.byte">0 B</string> - <string name="changelog_full_title">Change Log</string> - <string name="changelog_title">What\'s New</string> + <string name="changelog_full_title">Liste des changements</string> + <string name="changelog_title">Nouveautés</string> <string name="changelog_ok_button">OK</string> <string name="changelog_show_full">Plus…</string> |