From 4ea1fe684d45afd19546e8025fe1f3184ac96ac4 Mon Sep 17 00:00:00 2001 From: vdbhb59 <60728004+vdbhb59@users.noreply.github.com> Date: Sat, 30 Sep 2023 14:59:50 +0000 Subject: [PATCH 01/24] Refining the lRecyclerView in adapter for the null view --- .../net/programmierecke/radiodroid2/FragmentHistory.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/net/programmierecke/radiodroid2/FragmentHistory.java b/app/src/main/java/net/programmierecke/radiodroid2/FragmentHistory.java index 765d47235..2656b689a 100644 --- a/app/src/main/java/net/programmierecke/radiodroid2/FragmentHistory.java +++ b/app/src/main/java/net/programmierecke/radiodroid2/FragmentHistory.java @@ -55,7 +55,8 @@ public void RefreshListGui() { if (BuildConfig.DEBUG) Log.d(TAG, "stations count:" + historyManager.listStations.size()); - adapter.updateList(null, historyManager.listStations); + if( adapter != null ) + adapter.updateList(null, historyManager.listStations); } @Override @@ -214,4 +215,4 @@ public void onDestroyView() { super.onDestroyView(); rvStations.setAdapter(null); } -} \ No newline at end of file +} From d55aabd2cedfe5a67e6bcba36261c86af98e540e Mon Sep 17 00:00:00 2001 From: vdbhb59 <60728004+vdbhb59@users.noreply.github.com> Date: Sat, 30 Sep 2023 15:34:51 +0000 Subject: [PATCH 02/24] Commented out Preference.OnPreferenceClickListener as deprecated Deprecated in API Level 29 & onward: https://developer.android.com/reference/android/preference/Preference.OnPreferenceClickListener Line 157-166 --- .../radiodroid2/FragmentSettings.java | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/net/programmierecke/radiodroid2/FragmentSettings.java b/app/src/main/java/net/programmierecke/radiodroid2/FragmentSettings.java index 2402a9c52..4eac4260d 100644 --- a/app/src/main/java/net/programmierecke/radiodroid2/FragmentSettings.java +++ b/app/src/main/java/net/programmierecke/radiodroid2/FragmentSettings.java @@ -154,16 +154,16 @@ public boolean onPreferenceClick(Preference preference) { } }); - findPreference("show_about").setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { - @Override - public boolean onPreferenceClick(Preference preference) { - ((ActivityMain) getActivity()).getToolbar().setTitle(R.string.settings_about); - FragmentAbout f = new FragmentAbout(); - FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction(); - fragmentTransaction.replace(R.id.containerView, f).addToBackStack(String.valueOf(FRAGMENT_FROM_BACKSTACK)).commit(); - return false; - } - }); +// findPreference("show_about").setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { +// @Override +// public boolean onPreferenceClick(Preference preference) { +// ((ActivityMain) getActivity()).getToolbar().setTitle(R.string.settings_about); +// FragmentAbout f = new FragmentAbout(); +// FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction(); +// fragmentTransaction.replace(R.id.containerView, f).addToBackStack(String.valueOf(FRAGMENT_FROM_BACKSTACK)).commit(); +// return false; +// } +// }); } Preference batPref = getPreferenceScreen().findPreference(getString(R.string.key_ignore_battery_optimization)); From 5951369d3e326711d43a56c93d1851da57346240 Mon Sep 17 00:00:00 2001 From: vdbhb59 <60728004+vdbhb59@users.noreply.github.com> Date: Sat, 30 Sep 2023 15:36:21 +0000 Subject: [PATCH 03/24] Using Local Index as a fall back for stations Sort + fall back to local. --- .../main/java/net/programmierecke/radiodroid2/FragmentTabs.java | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/net/programmierecke/radiodroid2/FragmentTabs.java b/app/src/main/java/net/programmierecke/radiodroid2/FragmentTabs.java index 88e8b5f7c..e09d107e6 100644 --- a/app/src/main/java/net/programmierecke/radiodroid2/FragmentTabs.java +++ b/app/src/main/java/net/programmierecke/radiodroid2/FragmentTabs.java @@ -130,6 +130,7 @@ private String getCountryCode() { return countryCode; } countryCode = ctx.getResources().getConfiguration().locale.getCountry(); + addresses[IDX_LOCAL] = "json/stations/bycountrycodeexact/?order=clickcount&reverse=true"; Log.d("MAIN", "Locale: '" + countryCode + "'"); if (countryCode != null && countryCode.length() == 2) { return countryCode; From 9477dc0615f4643a53b20f30db975789a76865ed Mon Sep 17 00:00:00 2001 From: vdbhb59 <60728004+vdbhb59@users.noreply.github.com> Date: Sat, 30 Sep 2023 15:47:32 +0000 Subject: [PATCH 04/24] Recording status Invoke progress dialogue box for recording, and a alert dismissal state. --- .../radiodroid2/recording/RecordingsAdapter.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/net/programmierecke/radiodroid2/recording/RecordingsAdapter.java b/app/src/main/java/net/programmierecke/radiodroid2/recording/RecordingsAdapter.java index 2c7594741..afefacf4f 100644 --- a/app/src/main/java/net/programmierecke/radiodroid2/recording/RecordingsAdapter.java +++ b/app/src/main/java/net/programmierecke/radiodroid2/recording/RecordingsAdapter.java @@ -95,9 +95,10 @@ public int getItemCount() { } void openRecording(DataRecording theData) { + ProgressDialog dialog = ProgressDialog.show(context, "Loading...", "Please wait...", true, false); String path = RecordingsManager.getRecordDir() + "/" + theData.Name; if (BuildConfig.DEBUG) { - Log.d(TAG, "play: " + path); + Log.e(TAG, "play: " + path); } Intent i = new Intent(path); @@ -121,9 +122,11 @@ void openRecording(DataRecording theData) { String packageName = resolveInfo.activityInfo.packageName; context.grantUriPermission(packageName, fileUri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION); + dialog.dismiss(); } } context.startActivity(i); + dialog.dismiss(); } } From 0ab65dc1e13cc1271705750216f4cbd797d45c80 Mon Sep 17 00:00:00 2001 From: vdbhb59 <60728004+vdbhb59@users.noreply.github.com> Date: Sat, 30 Sep 2023 16:04:52 +0000 Subject: [PATCH 05/24] Corrected the log option changed in error Earlier had changed Log.d to Log.e in error. Corrected the same. --- .../radiodroid2/recording/RecordingsAdapter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/net/programmierecke/radiodroid2/recording/RecordingsAdapter.java b/app/src/main/java/net/programmierecke/radiodroid2/recording/RecordingsAdapter.java index afefacf4f..90b323009 100644 --- a/app/src/main/java/net/programmierecke/radiodroid2/recording/RecordingsAdapter.java +++ b/app/src/main/java/net/programmierecke/radiodroid2/recording/RecordingsAdapter.java @@ -98,7 +98,7 @@ void openRecording(DataRecording theData) { ProgressDialog dialog = ProgressDialog.show(context, "Loading...", "Please wait...", true, false); String path = RecordingsManager.getRecordDir() + "/" + theData.Name; if (BuildConfig.DEBUG) { - Log.e(TAG, "play: " + path); + Log.d(TAG, "play: " + path); } Intent i = new Intent(path); From 3d4b01314f181ad612c7c76def1c921e7e9b776c Mon Sep 17 00:00:00 2001 From: vdbhb59 <60728004+vdbhb59@users.noreply.github.com> Date: Sat, 30 Sep 2023 16:10:13 +0000 Subject: [PATCH 06/24] Lenient in query length --- .../net/programmierecke/radiodroid2/station/StationsFilter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/net/programmierecke/radiodroid2/station/StationsFilter.java b/app/src/main/java/net/programmierecke/radiodroid2/station/StationsFilter.java index 2efa72d24..f3a5b1977 100644 --- a/app/src/main/java/net/programmierecke/radiodroid2/station/StationsFilter.java +++ b/app/src/main/java/net/programmierecke/radiodroid2/station/StationsFilter.java @@ -156,7 +156,7 @@ protected FilterResults performFiltering(CharSequence constraint) { final String query = constraint.toString().toLowerCase(); Log.d("FILTER", "performFiltering() " + query); - if (searchStyle == SearchStyle.ByName && (query.isEmpty() || (query.length() < 3 && filterType == FilterType.GLOBAL))) { + if (searchStyle == SearchStyle.ByName && (query.isEmpty() || (query.length() < 2 && filterType == FilterType.GLOBAL))) { Log.d("FILTER", "performFiltering() 2 " + query); filteredStationsList = dataProvider.getOriginalStationList(); lastRemoteQuery = ""; From 653f9dd07b3bcf4c17285ff9941879f716f8fefc Mon Sep 17 00:00:00 2001 From: vdbhb59 <60728004+vdbhb59@users.noreply.github.com> Date: Sat, 30 Sep 2023 16:19:36 +0000 Subject: [PATCH 07/24] Create ic_expand_more_white_24dp.xml More White --- app/src/main/res/drawable/ic_expand_more_white_24dp.xml | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 app/src/main/res/drawable/ic_expand_more_white_24dp.xml diff --git a/app/src/main/res/drawable/ic_expand_more_white_24dp.xml b/app/src/main/res/drawable/ic_expand_more_white_24dp.xml new file mode 100644 index 000000000..91b3bb173 --- /dev/null +++ b/app/src/main/res/drawable/ic_expand_more_white_24dp.xml @@ -0,0 +1,9 @@ + + + From 98a27b3c84fa551e6a79ef6a6666eab3b7700b4e Mon Sep 17 00:00:00 2001 From: vdbhb59 <60728004+vdbhb59@users.noreply.github.com> Date: Sat, 30 Sep 2023 16:27:53 +0000 Subject: [PATCH 08/24] View changes Changes to the view. --- app/src/main/res/layout/list_item_station.xml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/layout/list_item_station.xml b/app/src/main/res/layout/list_item_station.xml index c4ca636e9..b53a24f82 100644 --- a/app/src/main/res/layout/list_item_station.xml +++ b/app/src/main/res/layout/list_item_station.xml @@ -18,6 +18,7 @@ android:layout_width="90dp" android:layout_height="wrap_content" android:layout_gravity="center_vertical" + android:background="@android:color/white" android:measureAllChildren="true"> + app:srcCompat="@drawable/ic_expand_more_white_24dp" /> - \ No newline at end of file + From a67362d14b3bbf7d97c8443106cb8b1d14d0cb1e Mon Sep 17 00:00:00 2001 From: vdbhb59 <60728004+vdbhb59@users.noreply.github.com> Date: Sat, 30 Sep 2023 16:29:16 +0000 Subject: [PATCH 09/24] Extra space removed --- app/src/main/res/layout/list_item_station.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/app/src/main/res/layout/list_item_station.xml b/app/src/main/res/layout/list_item_station.xml index b53a24f82..f4b013792 100644 --- a/app/src/main/res/layout/list_item_station.xml +++ b/app/src/main/res/layout/list_item_station.xml @@ -81,7 +81,6 @@ android:ellipsize="end" android:lines="1" android:scrollbars="none" - android:textAppearance="@style/TextAppearance.AppCompat.Body2" /> Date: Sat, 30 Sep 2023 16:33:30 +0000 Subject: [PATCH 10/24] Corrected layout code app:autoSizeMaxTextSize > android:autoSizeMaxTextSize app:autoSizeMinTextSize > android:autoSizeMinTextSize app:autoSizeTextType > android:autoSizeTextType --- app/src/main/res/layout/layout_player_full.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/res/layout/layout_player_full.xml b/app/src/main/res/layout/layout_player_full.xml index 55dca8155..229c67458 100644 --- a/app/src/main/res/layout/layout_player_full.xml +++ b/app/src/main/res/layout/layout_player_full.xml @@ -66,9 +66,9 @@ android:maxHeight="72sp" android:minHeight="36sp" android:textAlignment="center" - app:autoSizeMaxTextSize="30sp" - app:autoSizeMinTextSize="14sp" - app:autoSizeTextType="uniform" + android:autoSizeMaxTextSize="30sp" + android:autoSizeMinTextSize="14sp" + android:autoSizeTextType="uniform" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" @@ -298,4 +298,4 @@ - \ No newline at end of file + From 93772ca9d3d42133198632d1ace7f4760b7bfd0f Mon Sep 17 00:00:00 2001 From: vdbhb59 <60728004+vdbhb59@users.noreply.github.com> Date: Sat, 30 Sep 2023 16:41:29 +0000 Subject: [PATCH 11/24] Countries/Regions --- app/src/main/res/values/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index b80d1722e..0ef7df489 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -42,7 +42,7 @@ Changed Lately Playing Tags - Countries + Countries/Regions Languages Edit Lyrics From 023c8b0982c5e4e204f80a7afef467cb2d63c626 Mon Sep 17 00:00:00 2001 From: vdbhb59 <60728004+vdbhb59@users.noreply.github.com> Date: Fri, 6 Oct 2023 13:33:37 +0000 Subject: [PATCH 12/24] Fix media browser service and enable android auto support Fix media browser service and enable android auto support --- app/src/main/AndroidManifest.xml | 37 ++++++++++++++++---------------- 1 file changed, 18 insertions(+), 19 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 82759c9cb..ce05f59cf 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -61,11 +61,10 @@ - - - - - + + + + - - - - - - - - + - - + - - - + From 058397d23dec587c367532cef60d0d5e5c7879cc Mon Sep 17 00:00:00 2001 From: vdbhb59 <60728004+vdbhb59@users.noreply.github.com> Date: Fri, 6 Oct 2023 13:36:01 +0000 Subject: [PATCH 13/24] Fix media browser service and enable android auto support Fix media browser service and enable android auto support --- .../radiodroid2/FallbackStationsManager.kt | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 app/src/main/java/net/programmierecke/radiodroid2/FallbackStationsManager.kt diff --git a/app/src/main/java/net/programmierecke/radiodroid2/FallbackStationsManager.kt b/app/src/main/java/net/programmierecke/radiodroid2/FallbackStationsManager.kt new file mode 100644 index 000000000..1722892e0 --- /dev/null +++ b/app/src/main/java/net/programmierecke/radiodroid2/FallbackStationsManager.kt @@ -0,0 +1,16 @@ +package net.programmierecke.radiodroid2 + +import android.content.Context +import net.programmierecke.radiodroid2.station.DataRadioStation + +class FallbackStationsManager(ctx: Context?) : StationSaveManager(ctx) { + override fun Load() { + listStations.clear() + val str = context.resources + .openRawResource(R.raw.fallback_stations) + .bufferedReader() + .use { it.readText() } + val arr = DataRadioStation.DecodeJson(str) + listStations.addAll(arr) + } +} From ac3b92652e9de44e50cc4cd98b2d710a28d5745a Mon Sep 17 00:00:00 2001 From: vdbhb59 <60728004+vdbhb59@users.noreply.github.com> Date: Fri, 6 Oct 2023 13:38:40 +0000 Subject: [PATCH 14/24] Fix media browser service and enable android auto support Fix media browser service and enable android auto support --- .../java/net/programmierecke/radiodroid2/RadioDroidApp.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/app/src/main/java/net/programmierecke/radiodroid2/RadioDroidApp.java b/app/src/main/java/net/programmierecke/radiodroid2/RadioDroidApp.java index 9a1638c32..916bb20d0 100644 --- a/app/src/main/java/net/programmierecke/radiodroid2/RadioDroidApp.java +++ b/app/src/main/java/net/programmierecke/radiodroid2/RadioDroidApp.java @@ -37,6 +37,7 @@ public class RadioDroidApp extends MultiDexApplication { private HistoryManager historyManager; private FavouriteManager favouriteManager; private RecordingsManager recordingsManager; + private FallbackStationsManager fallbackStationsManager; private RadioAlarmManager alarmManager; private TvChannelManager tvChannelManager; @@ -95,6 +96,7 @@ public void onCreate() { historyManager = new HistoryManager(this); favouriteManager = new FavouriteManager(this); + fallbackStationsManager = new FallbackStationsManager(this); recordingsManager = new RecordingsManager(); alarmManager = new RadioAlarmManager(this); @@ -129,6 +131,10 @@ public void rebuildHttpClient() { httpClient = builder.build(); } + public FallbackStationsManager getFallbackStationsManager() { + return fallbackStationsManager; + } + public HistoryManager getHistoryManager() { return historyManager; } From 21ce679d1b3e19b8cea05524f8c7d2c60cb7cc64 Mon Sep 17 00:00:00 2001 From: vdbhb59 <60728004+vdbhb59@users.noreply.github.com> Date: Fri, 6 Oct 2023 13:47:38 +0000 Subject: [PATCH 15/24] Fix media browser service and enable android auto support Fix media browser service and enable android auto support --- .../radiodroid2/StationSaveManager.java | 25 ++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/net/programmierecke/radiodroid2/StationSaveManager.java b/app/src/main/java/net/programmierecke/radiodroid2/StationSaveManager.java index f96d7658a..28bede760 100644 --- a/app/src/main/java/net/programmierecke/radiodroid2/StationSaveManager.java +++ b/app/src/main/java/net/programmierecke/radiodroid2/StationSaveManager.java @@ -13,6 +13,7 @@ import android.widget.Toast; import androidx.annotation.Nullable; +import androidx.collection.ArraySet; import androidx.localbroadcastmanager.content.LocalBroadcastManager; import net.programmierecke.radiodroid2.station.DataRadioStation; @@ -59,6 +60,8 @@ protected void setStationStatusListener(StationStatusListener stationStatusListe } public void add(DataRadioStation station) { + if (station.queue == null) + station.queue = this; listStations.add(station); Save(); @@ -93,6 +96,8 @@ public void replaceList(List stations_new) { } public void addFront(DataRadioStation station) { + if (station.queue == null) + station.queue = this; listStations.add(0, station); Save(); @@ -103,6 +108,15 @@ public void addFront(DataRadioStation station) { } } + public void addAll(List stations) { + if (stations == null) + return; + for (DataRadioStation station : stations) { + station.queue = this; + } + listStations.addAll(stations); + } + public DataRadioStation getLast() { if (!listStations.isEmpty()) { return listStations.get(listStations.size() - 1); @@ -199,6 +213,7 @@ public int remove(String id) { } public void restore(DataRadioStation station, int pos) { + station.queue = this; listStations.add(pos, station); Save(); @@ -301,6 +316,9 @@ void Load() { String str = sharedPref.getString(getSaveId(), null); if (str != null) { List arr = DataRadioStation.DecodeJson(str); + for (DataRadioStation station : arr) { + station.queue = this; + } listStations.addAll(arr); if (hasInvalidUuids() && Utils.hasAnyConnection(context)) { refreshStationsFromServer(); @@ -496,6 +514,7 @@ public boolean SaveM3UWriter(Writer bw) { List LoadM3UInternal(String filePath, String fileName) { try { File f = new File(filePath, fileName); + ArraySet loadedItems = null; FileReader fr = new FileReader(f); return LoadM3UReader(fr); } catch (Exception e) { @@ -518,7 +537,11 @@ List LoadM3UReader(Reader reader) { if (line.startsWith(M3U_PREFIX)) { try { String uuid = line.substring(M3U_PREFIX.length()).trim(); - listUuids.add(uuid); + DataRadioStation station = Utils.getStationByUuid(httpClient, context, uuid); + if (station != null) { + station.queue = this; + loadedItems.add(station); + } } catch (Exception e) { Log.e("LOAD", e.toString()); } From 8eb1e00e0e42a1c052d4f3ef349f5b258fab7bf7 Mon Sep 17 00:00:00 2001 From: vdbhb59 <60728004+vdbhb59@users.noreply.github.com> Date: Fri, 6 Oct 2023 15:37:11 +0000 Subject: [PATCH 16/24] Fix media browser service and enable android auto support Fix media browser service and enable android auto support --- .../radiodroid2/service/MediaSessionCallback.java | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/net/programmierecke/radiodroid2/service/MediaSessionCallback.java b/app/src/main/java/net/programmierecke/radiodroid2/service/MediaSessionCallback.java index 95244ffdf..abe56853f 100644 --- a/app/src/main/java/net/programmierecke/radiodroid2/service/MediaSessionCallback.java +++ b/app/src/main/java/net/programmierecke/radiodroid2/service/MediaSessionCallback.java @@ -110,12 +110,15 @@ public void onPlayFromMediaId(String mediaId, Bundle extras) { @Override public void onPlayFromSearch(String query, Bundle extras) { + // remove voice search residues like " with radiodroid" + query = query.replaceAll("(?i) \\w+ radio\\s*droid.*", ""); + DataRadioStation station = ((RadioDroidApp) context.getApplicationContext()).getFavouriteManager().getBestNameMatch(query); if (station == null) station = ((RadioDroidApp) context.getApplicationContext()).getHistoryManager().getBestNameMatch(query); - if (station != null) { - GetRealLinkAndPlayTask playTask = new GetRealLinkAndPlayTask(context, station, playerService); - playTask.execute(); - } + if (station == null) + station = ((RadioDroidApp) context.getApplicationContext()).getFallbackStationsManager().getBestNameMatch(query); + GetRealLinkAndPlayTask playTask = new GetRealLinkAndPlayTask(context, station, playerService); + playTask.execute(); } -} \ No newline at end of file +} From c6a6269cc8560d932ab8500ac3f68c33bcd5b08c Mon Sep 17 00:00:00 2001 From: vdbhb59 <60728004+vdbhb59@users.noreply.github.com> Date: Fri, 6 Oct 2023 15:45:54 +0000 Subject: [PATCH 17/24] Fix media browser service and enable android auto support Fix media browser service and enable android auto support --- .../radiodroid2/service/PlayerService.java | 23 +++++++++++-------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/net/programmierecke/radiodroid2/service/PlayerService.java b/app/src/main/java/net/programmierecke/radiodroid2/service/PlayerService.java index 88dc1f918..e4f6bef43 100644 --- a/app/src/main/java/net/programmierecke/radiodroid2/service/PlayerService.java +++ b/app/src/main/java/net/programmierecke/radiodroid2/service/PlayerService.java @@ -465,7 +465,7 @@ public void onCreate() { Intent startActivityIntent = new Intent(itsContext.getApplicationContext(), ActivityMain.class); mediaSession.setSessionActivity(PendingIntent.getActivity(itsContext.getApplicationContext(), 0, startActivityIntent, PendingIntent.FLAG_UPDATE_CURRENT | pendingIntentFlag)); - mediaSession.setFlags(MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS | MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS); + setMediaPlaybackState(PlaybackStateCompat.STATE_NONE); RadioDroidApp radioDroidApp = (RadioDroidApp) getApplication(); trackHistoryRepository = radioDroidApp.getTrackHistoryRepository(); @@ -660,8 +660,8 @@ public void next() { return; } - RadioDroidApp radioDroidApp = (RadioDroidApp) getApplication(); - DataRadioStation station = radioDroidApp.getFavouriteManager().getNextById(currentStation.StationUuid); + setMediaPlaybackState(PlaybackStateCompat.STATE_SKIPPING_TO_NEXT); + DataRadioStation station = currentStation.queue.getNextById(currentStation.StationUuid); if (station != null) { if (radioPlayer.isPlaying()) { @@ -679,8 +679,7 @@ public void previous() { return; } - RadioDroidApp radioDroidApp = (RadioDroidApp) getApplication(); - DataRadioStation station = radioDroidApp.getFavouriteManager().getPreviousById(currentStation.StationUuid); + DataRadioStation station = currentStation.queue.getPreviousById(currentStation.StationUuid); if (station != null) { if (radioPlayer.isPlaying()) { playWithoutWarnings(station); @@ -794,19 +793,22 @@ private void setMediaPlaybackState(int state) { playbackStateBuilder.setErrorMessage(PlaybackStateCompat.ERROR_CODE_ACTION_ABORTED, error); } - playbackStateBuilder.setState(state, PlaybackStateCompat.PLAYBACK_POSITION_UNKNOWN, 0); + playbackStateBuilder.setState(state, PlaybackStateCompat.PLAYBACK_POSITION_UNKNOWN, 1.0f); mediaSession.setPlaybackState(playbackStateBuilder.build()); } private void enableMediaSession() { - if (BuildConfig.DEBUG) Log.d(TAG, "enabling media session."); + if (!mediaSession.isActive()) { + if (BuildConfig.DEBUG) Log.d(TAG, "enabling media session."); - IntentFilter becomingNoisyFilter = new IntentFilter(AudioManager.ACTION_AUDIO_BECOMING_NOISY); - registerReceiver(becomingNoisyReceiver, becomingNoisyFilter); + IntentFilter becomingNoisyFilter = new IntentFilter(AudioManager.ACTION_AUDIO_BECOMING_NOISY); + registerReceiver(becomingNoisyReceiver, becomingNoisyFilter); - mediaSession.setActive(true); + mediaSession.setActive(true); setMediaPlaybackState(PlaybackStateCompat.STATE_NONE); + setMediaPlaybackState(PlaybackStateCompat.STATE_NONE); + } } private void disableMediaSession() { @@ -1007,6 +1009,7 @@ private void updateNotification(PlayState playState) { if (mediaSession != null) { final MediaMetadataCompat.Builder builder = new MediaMetadataCompat.Builder(); + builder.putLong(MediaMetadataCompat.METADATA_KEY_DURATION, -1); builder.putString(MediaMetadataCompat.METADATA_KEY_ALBUM, currentStation.Name); builder.putString(MediaMetadataCompat.METADATA_KEY_ARTIST, liveInfo.getArtist()); builder.putString(MediaMetadataCompat.METADATA_KEY_TITLE, liveInfo.getTrack()); From 68687485e48dc57f7b3a99bfa59b5d73799c03b6 Mon Sep 17 00:00:00 2001 From: vdbhb59 <60728004+vdbhb59@users.noreply.github.com> Date: Fri, 6 Oct 2023 16:04:52 +0000 Subject: [PATCH 18/24] Fix media browser service and enable android auto support Fix media browser service and enable android auto support --- .../service/RadioDroidBrowser.java | 65 ++++++++++++++----- 1 file changed, 49 insertions(+), 16 deletions(-) diff --git a/app/src/main/java/net/programmierecke/radiodroid2/service/RadioDroidBrowser.java b/app/src/main/java/net/programmierecke/radiodroid2/service/RadioDroidBrowser.java index af66c96bb..68e7cc2b1 100644 --- a/app/src/main/java/net/programmierecke/radiodroid2/service/RadioDroidBrowser.java +++ b/app/src/main/java/net/programmierecke/radiodroid2/service/RadioDroidBrowser.java @@ -1,7 +1,12 @@ package net.programmierecke.radiodroid2.service; import android.content.ContentResolver; +import static androidx.media.utils.MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_BROWSABLE; +import static androidx.media.utils.MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_PLAYABLE; +import static androidx.media.utils.MediaConstants.DESCRIPTION_EXTRAS_VALUE_CONTENT_STYLE_GRID_ITEM; +import static androidx.media.utils.MediaConstants.DESCRIPTION_EXTRAS_VALUE_CONTENT_STYLE_LIST_ITEM; import android.content.Context; +import android.content.SharedPreferences; import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.BitmapFactory; @@ -12,15 +17,13 @@ import android.os.Bundle; import android.support.v4.media.MediaBrowserCompat; import android.support.v4.media.MediaDescriptionCompat; +import android.support.v4.media.MediaMetadataCompat; +import android.util.Log; import androidx.annotation.NonNull; import androidx.annotation.Nullable; - -import android.support.v4.media.MediaBrowserCompat; import androidx.media.MediaBrowserServiceCompat; -import android.support.v4.media.MediaDescriptionCompat; -import android.support.v4.media.MediaMetadataCompat; -import android.text.TextUtils; +import androidx.preference.PreferenceManager; import com.squareup.picasso.Picasso; import com.squareup.picasso.Target; @@ -46,6 +49,7 @@ public class RadioDroidBrowser { + private static final String TAG = "RadioDroidBrowser"; private static final String MEDIA_ID_ROOT = "__ROOT__"; private static final String MEDIA_ID_MUSICS_FAVORITE = "__FAVORITE__"; private static final String MEDIA_ID_MUSICS_HISTORY = "__HISTORY__"; @@ -142,20 +146,34 @@ protected void onPostExecute(Void aVoid) { } List mediaItems = new ArrayList<>(); - + SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(context.getApplicationContext()); + for (DataRadioStation station : stations) { + Bitmap stationIcon = stationIdToIcon.get(station.StationUuid); + if (stationIcon == null) stationIcon = BitmapFactory.decodeResource(Resources.getSystem(), R.drawable.ic_launcher); Bundle extras = new Bundle(); extras.putParcelable(MediaMetadataCompat.METADATA_KEY_ALBUM_ART, stationIcon); extras.putParcelable(MediaMetadataCompat.METADATA_KEY_DISPLAY_ICON, stationIcon); - mediaItems.add(new MediaBrowserCompat.MediaItem(new MediaDescriptionCompat.Builder() + MediaDescriptionCompat.Builder mediaItem = new MediaDescriptionCompat.Builder() .setMediaId(MEDIA_ID_MUSICS_HISTORY + LEAF_SEPARATOR + station.StationUuid) .setTitle(station.Name) - .setIconBitmap(stationIcon) - .setExtras(extras) - .build(), + .setDescription(station.Country + " " + station.Country + " " + station.TagsAll) + .setExtras(extras); + + if (station.IconUrl != null && !station.IconUrl.isEmpty()) { + String iconUrl = station.IconUrl; + if (iconUrl.startsWith("http:")) { + iconUrl = iconUrl.replace("http:", "https:"); + } + mediaItem.setIconUri(Uri.parse(iconUrl)); + } else { + mediaItem.setIconUri(resourceToUri(resources, R.drawable.ic_photo_24dp)); + } + + mediaItems.add(new MediaBrowserCompat.MediaItem(mediaItem.build(), MediaBrowserCompat.MediaItem.FLAG_PLAYABLE)); } @@ -169,9 +187,24 @@ public RadioDroidBrowser(RadioDroidApp radioDroidApp) { this.radioDroidApp = radioDroidApp; } - @Nullable + @Nullable public MediaBrowserServiceCompat.BrowserRoot onGetRoot(@NonNull String clientPackageName, int clientUid, @Nullable Bundle rootHints) { - return new MediaBrowserServiceCompat.BrowserRoot(MEDIA_ID_ROOT, null); + SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(radioDroidApp.getApplicationContext().getApplicationContext()); + Bundle extras = new Bundle(); + extras.putInt(DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_BROWSABLE, DESCRIPTION_EXTRAS_VALUE_CONTENT_STYLE_LIST_ITEM); + if (sharedPref.getBoolean("load_icons", false) && sharedPref.getBoolean("icons_only_favorites_style", false)) { + Log.d(TAG, "Setting grid style for playables"); + extras.putInt( + DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_PLAYABLE, + DESCRIPTION_EXTRAS_VALUE_CONTENT_STYLE_GRID_ITEM); + } else { + Log.d(TAG, "Setting list style for playables"); + extras.putInt( + DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_PLAYABLE, + DESCRIPTION_EXTRAS_VALUE_CONTENT_STYLE_LIST_ITEM); + } +// extras.putBoolean(CONTENT_STYLE_SUPPORTED, true); + return new MediaBrowserServiceCompat.BrowserRoot(MEDIA_ID_ROOT, extras); } public void onLoadChildren(@NonNull String parentId, @NonNull MediaBrowserServiceCompat.Result> result) { @@ -223,23 +256,23 @@ private List createBrowsableMediaItemsForRoot(Reso mediaItems.add(new MediaBrowserCompat.MediaItem(new MediaDescriptionCompat.Builder() .setMediaId(MEDIA_ID_MUSICS_FAVORITE) .setTitle(resources.getString(R.string.nav_item_starred)) - .setIconUri(resourceToUri(resources, R.drawable.ic_star_black_24dp)) + .setIconUri(resourceToUri(resources, R.drawable.ic_star_white_24)) .build(), MediaBrowserCompat.MediaItem.FLAG_BROWSABLE)); mediaItems.add(new MediaBrowserCompat.MediaItem(new MediaDescriptionCompat.Builder() .setMediaId(MEDIA_ID_MUSICS_HISTORY) .setTitle(resources.getString(R.string.nav_item_history)) - .setIconUri(resourceToUri(resources, R.drawable.ic_restore_black_24dp)) + .setIconUri(resourceToUri(resources, R.drawable.ic_star_white_24)) .build(), MediaBrowserCompat.MediaItem.FLAG_BROWSABLE)); - mediaItems.add(new MediaBrowserCompat.MediaItem(new MediaDescriptionCompat.Builder() +/* mediaItems.add(new MediaBrowserCompat.MediaItem(new MediaDescriptionCompat.Builder() .setMediaId(MEDIA_ID_MUSICS_TOP) .setTitle(resources.getString(R.string.action_top_click)) .setIconUri(resourceToUri(resources, R.drawable.ic_restore_black_24dp)) .build(), - MediaBrowserCompat.MediaItem.FLAG_BROWSABLE)); + MediaBrowserCompat.MediaItem.FLAG_BROWSABLE));*/ return mediaItems; } From d8f57bfe262bfe69729fcf137d384529ac511883 Mon Sep 17 00:00:00 2001 From: vdbhb59 <60728004+vdbhb59@users.noreply.github.com> Date: Fri, 6 Oct 2023 16:05:44 +0000 Subject: [PATCH 19/24] Fix media browser service and enable android auto support Fix media browser service and enable android auto support --- .../radiodroid2/service/RadioDroidBrowserService.java | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/net/programmierecke/radiodroid2/service/RadioDroidBrowserService.java b/app/src/main/java/net/programmierecke/radiodroid2/service/RadioDroidBrowserService.java index 5f841fd76..fec1ae9fc 100644 --- a/app/src/main/java/net/programmierecke/radiodroid2/service/RadioDroidBrowserService.java +++ b/app/src/main/java/net/programmierecke/radiodroid2/service/RadioDroidBrowserService.java @@ -58,6 +58,7 @@ public void onCreate() { radioDroidBrowser = new RadioDroidBrowser((RadioDroidApp) getApplication()); Intent anIntent = new Intent(this, PlayerService.class); + anIntent.putExtra(PlayerService.PLAYER_SERVICE_NO_NOTIFICATION_EXTRA, true); startService(anIntent); playerServiceConnection = new ServiceConnection() { From d8106d78aa87914495cbe4a724bacf59d529cda6 Mon Sep 17 00:00:00 2001 From: vdbhb59 <60728004+vdbhb59@users.noreply.github.com> Date: Fri, 6 Oct 2023 16:08:03 +0000 Subject: [PATCH 20/24] Fix media browser service and enable android auto support Fix media browser service and enable android auto support --- .../programmierecke/radiodroid2/station/DataRadioStation.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/src/main/java/net/programmierecke/radiodroid2/station/DataRadioStation.java b/app/src/main/java/net/programmierecke/radiodroid2/station/DataRadioStation.java index f0a7e95e0..dc49ac5d3 100644 --- a/app/src/main/java/net/programmierecke/radiodroid2/station/DataRadioStation.java +++ b/app/src/main/java/net/programmierecke/radiodroid2/station/DataRadioStation.java @@ -21,6 +21,7 @@ import net.programmierecke.radiodroid2.ActivityMain; import net.programmierecke.radiodroid2.R; +import net.programmierecke.radiodroid2.StationSaveManager; import net.programmierecke.radiodroid2.Utils; import net.programmierecke.radiodroid2.service.MediaSessionCallback; @@ -68,6 +69,8 @@ public DataRadioStation() { public String playableUrl; + public StationSaveManager queue; + @Deprecated public String StationId = ""; From 565b3fd14cec64c8db025c11e15ce03d5e102aac Mon Sep 17 00:00:00 2001 From: vdbhb59 <60728004+vdbhb59@users.noreply.github.com> Date: Fri, 6 Oct 2023 16:11:03 +0000 Subject: [PATCH 21/24] Fix media browser service and enable android auto support Fix media browser service and enable android auto support --- .../radiodroid2/station/FragmentStations.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/net/programmierecke/radiodroid2/station/FragmentStations.java b/app/src/main/java/net/programmierecke/radiodroid2/station/FragmentStations.java index 3d761b38e..531ef068d 100644 --- a/app/src/main/java/net/programmierecke/radiodroid2/station/FragmentStations.java +++ b/app/src/main/java/net/programmierecke/radiodroid2/station/FragmentStations.java @@ -24,6 +24,7 @@ import net.programmierecke.radiodroid2.FragmentBase; import net.programmierecke.radiodroid2.R; import net.programmierecke.radiodroid2.RadioDroidApp; +import net.programmierecke.radiodroid2.StationSaveManager; import net.programmierecke.radiodroid2.Utils; import net.programmierecke.radiodroid2.interfaces.IFragmentSearchable; import net.programmierecke.radiodroid2.utils.CustomFilter; @@ -48,6 +49,7 @@ public class FragmentStations extends FragmentBase implements IFragmentSearchabl private StationsFilter stationsFilter; private StationsFilter.SearchStyle lastSearchStyle = StationsFilter.SearchStyle.ByName; private String lastQuery = ""; + private StationSaveManager queue; void onStationClick(DataRadioStation theStation, int pos) { RadioDroidApp radioDroidApp = (RadioDroidApp) getActivity().getApplication(); @@ -71,6 +73,8 @@ protected void RefreshListGui() { ArrayList filteredStationsList = new ArrayList<>(); List radioStations = DataRadioStation.DecodeJson(getUrlResult()); + queue.clear(); + queue.addAll(radioStations); if (BuildConfig.DEBUG) Log.d(TAG, "station count:" + radioStations.size()); @@ -93,6 +97,7 @@ protected void RefreshListGui() { public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { Log.d("STATIONS","onCreateView()"); + queue = new StationSaveManager(getContext()); Bundle bundle = getArguments(); if (bundle != null) { searchEnabled = bundle.getBoolean(KEY_SEARCH_ENABLED, false); @@ -219,4 +224,4 @@ protected void DownloadFinished() { swipeRefreshLayout.setRefreshing(false); } } -} \ No newline at end of file +} From 59fa6c3247e154eeb01e0b3198d9f52390a67078 Mon Sep 17 00:00:00 2001 From: vdbhb59 <60728004+vdbhb59@users.noreply.github.com> Date: Fri, 6 Oct 2023 16:12:40 +0000 Subject: [PATCH 22/24] Fix media browser service and enable android auto support Fix media browser service and enable android auto support --- .../main/res/drawable/flags/drawable/ic_restore_white_24.xml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 app/src/main/res/drawable/flags/drawable/ic_restore_white_24.xml diff --git a/app/src/main/res/drawable/flags/drawable/ic_restore_white_24.xml b/app/src/main/res/drawable/flags/drawable/ic_restore_white_24.xml new file mode 100644 index 000000000..98a82168e --- /dev/null +++ b/app/src/main/res/drawable/flags/drawable/ic_restore_white_24.xml @@ -0,0 +1,5 @@ + + + From 53f72ea2bafb295872c387e32758cb2a7afce4fd Mon Sep 17 00:00:00 2001 From: vdbhb59 <60728004+vdbhb59@users.noreply.github.com> Date: Fri, 6 Oct 2023 16:13:28 +0000 Subject: [PATCH 23/24] Fix media browser service and enable android auto support Fix media browser service and enable android auto support --- .../main/res/drawable/flags/drawable/ic_star_white_24.xml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 app/src/main/res/drawable/flags/drawable/ic_star_white_24.xml diff --git a/app/src/main/res/drawable/flags/drawable/ic_star_white_24.xml b/app/src/main/res/drawable/flags/drawable/ic_star_white_24.xml new file mode 100644 index 000000000..954e7723b --- /dev/null +++ b/app/src/main/res/drawable/flags/drawable/ic_star_white_24.xml @@ -0,0 +1,5 @@ + + + From c43af44db5c5dd73ec627d0f367907bfd13b191f Mon Sep 17 00:00:00 2001 From: vdbhb59 <60728004+vdbhb59@users.noreply.github.com> Date: Fri, 6 Oct 2023 16:14:43 +0000 Subject: [PATCH 24/24] Fix media browser service and enable android auto support Fix media browser service and enable android auto support --- app/src/main/res/raw/fallback_stations.json | 1 + 1 file changed, 1 insertion(+) create mode 100644 app/src/main/res/raw/fallback_stations.json diff --git a/app/src/main/res/raw/fallback_stations.json b/app/src/main/res/raw/fallback_stations.json new file mode 100644 index 000000000..0c1720a65 --- /dev/null +++ b/app/src/main/res/raw/fallback_stations.json @@ -0,0 +1 @@ +[{"changeuuid":"dbe670d7-ca59-4377-bb23-4759726e35a2","stationuuid":"af7c7d49-dc2b-4e3c-9367-0683c56646a7","serveruuid":"55edc073-a42d-4755-80ef-c7e103696103","name":"Nasze Radio 92,1 FM... nostalgicznie","url":"https://online.nasze.fm:9443/stream","url_resolved":"https://online.nasze.fm:9443/stream","homepage":"https://nostalgicznie.nasze.fm,https//nostalgicznie.nasze.fm","favicon":"https://nasze.fm/loga/NRNlogokwadrat.png","tags":"oldies","country":"Poland","countrycode":"pl","iso_3166_2":null,"state":"","language":"polish","languagecodes":"pl","votes":149,"lastchangetime":"2022-10-06 20:35:31","lastchangetime_iso8601":"2022-10-06T20:35:31Z","codec":"MP3","bitrate":96,"hls":0,"lastcheckok":1,"lastchecktime":"2022-10-06 20:35:33","lastchecktime_iso8601":"2022-10-06T20:35:33Z","lastcheckoktime":"2022-10-06 20:35:33","lastcheckoktime_iso8601":"2022-10-06T20:35:33Z","lastlocalchecktime":"2022-10-06 02:11:14","lastlocalchecktime_iso8601":"2022-10-06T02:11:14Z","clicktimestamp":"2022-10-06 02:34:41","clicktimestamp_iso8601":"2022-10-06T02:34:41Z","clickcount":12,"clicktrend":1,"ssl_error":0,"geo_lat":null,"geo_long":null,"has_extended_info":true},{"changeuuid":"498e298b-4e40-40ef-ac93-f473a52ffec5","stationuuid":"d06a1fb8-ffb4-4b69-836d-df044ab66d95","serveruuid":"e6fa3ddf-b49d-4d01-8172-11c0566e3d38","name":"- 0 N - Radio on Radio","url":"https://0n-radio.radionetz.de/0n-radio.mp3","url_resolved":"https://0n-radio.radionetz.de/0n-radio.mp3","homepage":"http://www.0nradio.com/","favicon":"https://www.0nradio.com/logos/0n-radio_600x600.jpg","tags":"hits,oldies,pop,top 40","country":"Germany","countrycode":"DE","iso_3166_2":"DE-BY","state":"Bavaria","language":"german","languagecodes":"DE,de","votes":24,"lastchangetime":"2022-05-02 13:43:50","lastchangetime_iso8601":"2022-05-02T13:43:50Z","codec":"MP3","bitrate":128,"hls":0,"lastcheckok":1,"lastchecktime":"2022-10-06 20:35:33","lastchecktime_iso8601":"2022-10-06T20:35:33Z","lastcheckoktime":"2022-10-06 20:35:33","lastcheckoktime_iso8601":"2022-10-06T20:35:33Z","lastlocalchecktime":"2022-10-06 02:50:57","lastlocalchecktime_iso8601":"2022-10-06T02:50:57Z","clicktimestamp":"2022-10-05 20:05:07","clicktimestamp_iso8601":"2022-10-05T20:05:07Z","clickcount":6,"clicktrend":-1,"ssl_error":0,"geo_lat":50.3115,"geo_long":11.923,"has_extended_info":true},{"changeuuid":"78b8767d-f4d8-41c4-8fb4-0a2f535054ba","stationuuid":"6e4f8762-17f3-4b11-8719-5ad18f5159ad","serveruuid":"9666c50b-6102-49a5-9b88-9d0ac6cac1fe","name":"- 0 N - Rock on Radio","url":"https://0n-rock.radionetz.de/0n-rock.mp3","url_resolved":"https://0n-rock.radionetz.de/0n-rock.mp3","homepage":"http://www.0nradio.com/","favicon":"https://www.0nradio.com/logos/0n-rock_600x600.jpg","tags":"alternative,classic rock,hard rock,metal,rock,soft rock","country":"Germany","countrycode":"DE","iso_3166_2":"DE-BY","state":"","language":"german","languagecodes":"DE,de","votes":21,"lastchangetime":"2022-05-02 13:43:50","lastchangetime_iso8601":"2022-05-02T13:43:50Z","codec":"MP3","bitrate":128,"hls":0,"lastcheckok":1,"lastchecktime":"2022-10-06 20:35:33","lastchecktime_iso8601":"2022-10-06T20:35:33Z","lastcheckoktime":"2022-10-06 20:35:33","lastcheckoktime_iso8601":"2022-10-06T20:35:33Z","lastlocalchecktime":"2022-10-06 09:46:48","lastlocalchecktime_iso8601":"2022-10-06T09:46:48Z","clicktimestamp":"2022-10-06 18:05:50","clicktimestamp_iso8601":"2022-10-06T18:05:50Z","clickcount":12,"clicktrend":3,"ssl_error":0,"geo_lat":50.3115,"geo_long":11.923,"has_extended_info":true},{"changeuuid":"6cdc179c-1be0-4d97-8975-db374259969a","stationuuid":"60d35723-71c7-11ea-b1cf-52543be04c81","serveruuid":"247ec015-ea45-4aab-9a5f-464a45969338","name":"Spore","url":"https://stream.radiospore.oziosi.org:8003/spore.ogg","url_resolved":"https://stream.radiospore.oziosi.org:8003/spore.ogg","homepage":"http://upstream.radiospore.oziosi.org:8000/spore.ogg","favicon":"https://radiospore.oziosi.org/user/themes/quark/images/logo/logoprova2.png","tags":"casino","country":"Italy","countrycode":"it","iso_3166_2":null,"state":"","language":"italian","languagecodes":"it","votes":127,"lastchangetime":"2022-10-06 20:20:16","lastchangetime_iso8601":"2022-10-06T20:20:16Z","codec":"OGG","bitrate":0,"hls":0,"lastcheckok":1,"lastchecktime":"2022-10-06 20:20:18","lastchecktime_iso8601":"2022-10-06T20:20:18Z","lastcheckoktime":"2022-10-06 20:20:18","lastcheckoktime_iso8601":"2022-10-06T20:20:18Z","lastlocalchecktime":"2022-10-05 22:30:11","lastlocalchecktime_iso8601":"2022-10-05T22:30:11Z","clicktimestamp":"2022-10-06 07:29:44","clicktimestamp_iso8601":"2022-10-06T07:29:44Z","clickcount":21,"clicktrend":0,"ssl_error":0,"geo_lat":null,"geo_long":null,"has_extended_info":true},{"changeuuid":"7d183fe8-b280-4de0-b580-20e92afd31b6","stationuuid":"a187bb7f-14c0-4c04-86b9-3f283264dfec","serveruuid":"0a3479a7-15c7-422e-87cf-1ef39d549bdb","name":"Cafe 80's","url":"https://stream.loudspeaker.fm/radio/8030/channel_8","url_resolved":"https://stream.loudspeaker.fm/radio/8030/channel_8","homepage":"https://cafe80s.org/","favicon":"https://nocofm.s3.amazonaws.com/image/medium/8-Cafe_80s.png","tags":"pop","country":"The United States Of America","countrycode":"US","iso_3166_2":null,"state":"Fort Collins CO","language":"english","languagecodes":"en","votes":191,"lastchangetime":"2022-07-01 14:43:34","lastchangetime_iso8601":"2022-07-01T14:43:34Z","codec":"AAC","bitrate":96,"hls":0,"lastcheckok":1,"lastchecktime":"2022-10-06 20:20:18","lastchecktime_iso8601":"2022-10-06T20:20:18Z","lastcheckoktime":"2022-10-06 20:20:18","lastcheckoktime_iso8601":"2022-10-06T20:20:18Z","lastlocalchecktime":"2022-10-06 09:21:19","lastlocalchecktime_iso8601":"2022-10-06T09:21:19Z","clicktimestamp":"2022-10-06 19:16:47","clicktimestamp_iso8601":"2022-10-06T19:16:47Z","clickcount":28,"clicktrend":-1,"ssl_error":0,"geo_lat":40.549190734490864,"geo_long":-105.03498601698728,"has_extended_info":true},{"changeuuid":"4de76338-3db4-4309-a19a-f8ef7798ef06","stationuuid":"d263f2c4-f35e-11e8-a471-52543be04c81","serveruuid":"306540c8-ed4a-4092-a867-f2626ca00d86","name":"- 0 N - Schlager on Radio","url":"https://0n-schlager.radionetz.de/0n-schlager.aac","url_resolved":"https://0n-schlager.radionetz.de/0n-schlager.aac","homepage":"http://www.0nradio.com/","favicon":"https://www.0nradio.com/logos/0n-schlager_600x600.jpg","tags":"discofox,pop,schlager,various,world music","country":"Germany","countrycode":"DE","iso_3166_2":"DE-BY","state":"Bavaria","language":"german","languagecodes":"DE,de","votes":49,"lastchangetime":"2022-05-02 12:56:44","lastchangetime_iso8601":"2022-05-02T12:56:44Z","codec":"AAC+","bitrate":64,"hls":0,"lastcheckok":1,"lastchecktime":"2022-10-06 20:20:18","lastchecktime_iso8601":"2022-10-06T20:20:18Z","lastcheckoktime":"2022-10-06 20:20:18","lastcheckoktime_iso8601":"2022-10-06T20:20:18Z","lastlocalchecktime":"2022-10-05 21:04:58","lastlocalchecktime_iso8601":"2022-10-05T21:04:58Z","clicktimestamp":"2022-10-06 17:05:59","clicktimestamp_iso8601":"2022-10-06T17:05:59Z","clickcount":4,"clicktrend":1,"ssl_error":0,"geo_lat":50.3115,"geo_long":11.923,"has_extended_info":true},{"changeuuid":"4e3f5db0-25b0-4989-857f-014b12220703","stationuuid":"8b3e9c54-f365-11e8-a471-52543be04c81","serveruuid":"57cba1ec-2894-454b-bff7-1da38efb92b4","name":"- 0 N - Chillout on Radio","url":"https://0n-chillout.radionetz.de/0n-chillout.mp3","url_resolved":"https://0n-chillout.radionetz.de/0n-chillout.mp3","homepage":"http://www.0nradio.com/","favicon":"https://www.0nradio.com/logos/0n-chillout_600x600.jpg","tags":"ambient,chillout,easy listening,electro","country":"Germany","countrycode":"DE","iso_3166_2":"DE-BY","state":"Bavaria","language":"german","languagecodes":"DE,de","votes":1103,"lastchangetime":"2022-05-02 13:43:50","lastchangetime_iso8601":"2022-05-02T13:43:50Z","codec":"MP3","bitrate":128,"hls":0,"lastcheckok":1,"lastchecktime":"2022-10-06 20:20:18","lastchecktime_iso8601":"2022-10-06T20:20:18Z","lastcheckoktime":"2022-10-06 20:20:18","lastcheckoktime_iso8601":"2022-10-06T20:20:18Z","lastlocalchecktime":"2022-10-06 08:15:14","lastlocalchecktime_iso8601":"2022-10-06T08:15:14Z","clicktimestamp":"2022-10-06 19:27:59","clicktimestamp_iso8601":"2022-10-06T19:27:59Z","clickcount":153,"clicktrend":8,"ssl_error":0,"geo_lat":50.3115,"geo_long":11.923,"has_extended_info":true},{"changeuuid":"c9fe9a87-fba9-4e78-88ba-f14d90b44d79","stationuuid":"7332a48b-2f9c-4b51-b79b-ba7869b35426","serveruuid":"eb618965-aedf-4bb2-9672-3ef2377496ec","name":"- 0 N - Kids on Radio","url":"https://0n-kids.radionetz.de/0n-kids.aac","url_resolved":"https://0n-kids.radionetz.de/0n-kids.aac","homepage":"https://www.0nradio.com/","favicon":"https://www.0nradio.com/logos/0n-kids_600x600.jpg","tags":"children,hits,kids,kinder,pop,rock,top40","country":"Germany","countrycode":"DE","iso_3166_2":"DE-BY","state":"","language":"german","languagecodes":"DE,de","votes":9,"lastchangetime":"2022-05-02 13:49:14","lastchangetime_iso8601":"2022-05-02T13:49:14Z","codec":"AAC+","bitrate":64,"hls":0,"lastcheckok":1,"lastchecktime":"2022-10-06 20:15:17","lastchecktime_iso8601":"2022-10-06T20:15:17Z","lastcheckoktime":"2022-10-06 20:15:17","lastcheckoktime_iso8601":"2022-10-06T20:15:17Z","lastlocalchecktime":"2022-10-06 02:47:33","lastlocalchecktime_iso8601":"2022-10-06T02:47:33Z","clicktimestamp":"2022-10-06 16:53:59","clicktimestamp_iso8601":"2022-10-06T16:53:59Z","clickcount":11,"clicktrend":2,"ssl_error":0,"geo_lat":50.3115,"geo_long":11.923,"has_extended_info":true},{"changeuuid":"f52a3b21-33ff-4237-a963-055f3ff1998f","stationuuid":"1d959430-bf9d-11e9-8502-52543be04c81","serveruuid":"d9b438fc-5d70-4558-a097-525d5ca2b97b","name":"- 1 A - Relax von 1A Radio","url":"https://1a-relax.radionetz.de/1a-relax.aac","url_resolved":"https://1a-relax.radionetz.de/1a-relax.aac","homepage":"http://www.1aradio.com/","favicon":"https://www.1aradio.com/logos/1a-relax_600x600.jpg","tags":"ambient,chillout,easy listening,electro","country":"Germany","countrycode":"DE","iso_3166_2":"DE-BY","state":"Bavaria","language":"german","languagecodes":"DE,de","votes":76,"lastchangetime":"2022-05-02 13:22:02","lastchangetime_iso8601":"2022-05-02T13:22:02Z","codec":"AAC+","bitrate":64,"hls":0,"lastcheckok":1,"lastchecktime":"2022-10-06 20:15:17","lastchecktime_iso8601":"2022-10-06T20:15:17Z","lastcheckoktime":"2022-10-06 20:15:17","lastcheckoktime_iso8601":"2022-10-06T20:15:17Z","lastlocalchecktime":"2022-10-06 06:09:53","lastlocalchecktime_iso8601":"2022-10-06T06:09:53Z","clicktimestamp":"2022-10-06 17:21:59","clicktimestamp_iso8601":"2022-10-06T17:21:59Z","clickcount":28,"clicktrend":1,"ssl_error":0,"geo_lat":50.3115,"geo_long":11.923,"has_extended_info":true},{"changeuuid":"edb1bcd5-b1d2-4b82-8836-b1297c9529a5","stationuuid":"f3def834-4d96-11e9-a4d7-52543be04c81","serveruuid":"98a1d1de-b238-4f12-a492-7120a6d90bf7","name":"- 0 N - 2000s on Radio","url":"https://0n-2000s.radionetz.de/0n-2000s.aac","url_resolved":"https://0n-2000s.radionetz.de/0n-2000s.aac","homepage":"http://www.0nradio.com/","favicon":"https://www.0nradio.com/logos/0n-2000s_600x600.jpg","tags":"00er,00s,2000er,2000s,dance,hits,pop,rock","country":"Germany","countrycode":"DE","iso_3166_2":"DE-BY","state":"","language":"","languagecodes":"DE","votes":436,"lastchangetime":"2022-05-02 13:49:14","lastchangetime_iso8601":"2022-05-02T13:49:14Z","codec":"AAC+","bitrate":64,"hls":0,"lastcheckok":1,"lastchecktime":"2022-10-06 20:15:16","lastchecktime_iso8601":"2022-10-06T20:15:16Z","lastcheckoktime":"2022-10-06 20:15:16","lastcheckoktime_iso8601":"2022-10-06T20:15:16Z","lastlocalchecktime":"2022-10-06 05:51:20","lastlocalchecktime_iso8601":"2022-10-06T05:51:20Z","clicktimestamp":"2022-10-06 18:21:28","clicktimestamp_iso8601":"2022-10-06T18:21:28Z","clickcount":37,"clicktrend":5,"ssl_error":0,"geo_lat":50.3115,"geo_long":11.923,"has_extended_info":true}]