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}]