From 1f5ba3f659c80b7d16a3fc63a2df1e7dcba98d1b Mon Sep 17 00:00:00 2001 From: TrackArcher Date: Tue, 13 Jan 2026 10:36:00 +0100 Subject: [PATCH] radio bob metadata works now. fix crashing issue --- .../tempo/util/DownloadUtil.java | 23 +++++++++++++++++++ .../tempo/util/DynamicMediaSourceFactory.kt | 5 +++- 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/cappielloantonio/tempo/util/DownloadUtil.java b/app/src/main/java/com/cappielloantonio/tempo/util/DownloadUtil.java index 6df73eb6..7892455f 100644 --- a/app/src/main/java/com/cappielloantonio/tempo/util/DownloadUtil.java +++ b/app/src/main/java/com/cappielloantonio/tempo/util/DownloadUtil.java @@ -29,6 +29,8 @@ import java.net.CookieHandler; import java.net.CookieManager; import java.net.CookiePolicy; import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; import java.util.concurrent.Executors; @UnstableApi @@ -78,12 +80,33 @@ public final class DownloadUtil { return httpDataSourceFactory; } + public static synchronized DataSource.Factory getHttpDataSourceFactoryForRadio() { + CookieManager cookieManager = new CookieManager(); + cookieManager.setCookiePolicy(CookiePolicy.ACCEPT_ORIGINAL_SERVER); + CookieHandler.setDefault(cookieManager); + + // Create a factory with ICY metadata support for radio streams + Map defaultRequestProperties = new HashMap<>(); + defaultRequestProperties.put("Icy-MetaData", "1"); + defaultRequestProperties.put("User-Agent", "Tempus/1.0"); + + return new DefaultHttpDataSource + .Factory() + .setAllowCrossProtocolRedirects(true) + .setDefaultRequestProperties(defaultRequestProperties); + } + public static synchronized DataSource.Factory getUpstreamDataSourceFactory(Context context) { DefaultDataSource.Factory upstreamFactory = new DefaultDataSource.Factory(context, getHttpDataSourceFactory()); dataSourceFactory = buildReadOnlyCacheDataSource(upstreamFactory, getDownloadCache(context)); return dataSourceFactory; } + public static synchronized DataSource.Factory getUpstreamDataSourceFactoryForRadio(Context context) { + DefaultDataSource.Factory upstreamFactory = new DefaultDataSource.Factory(context, getHttpDataSourceFactoryForRadio()); + return buildReadOnlyCacheDataSource(upstreamFactory, getDownloadCache(context)); + } + public static synchronized DataSource.Factory getCacheDataSourceFactory(Context context) { CacheDataSource.Factory streamCacheFactory = new CacheDataSource.Factory() .setCache(getStreamingCache(context)) diff --git a/app/src/main/java/com/cappielloantonio/tempo/util/DynamicMediaSourceFactory.kt b/app/src/main/java/com/cappielloantonio/tempo/util/DynamicMediaSourceFactory.kt index 31dc172a..032aa993 100644 --- a/app/src/main/java/com/cappielloantonio/tempo/util/DynamicMediaSourceFactory.kt +++ b/app/src/main/java/com/cappielloantonio/tempo/util/DynamicMediaSourceFactory.kt @@ -32,7 +32,10 @@ class DynamicMediaSourceFactory( else -> true } - val dataSourceFactory: DataSource.Factory = if (useUpstream) { + val dataSourceFactory: DataSource.Factory = if (bypassCache) { + // For radio streams, use a DataSourceFactory with ICY metadata support + DownloadUtil.getUpstreamDataSourceFactoryForRadio(context) + } else if (useUpstream) { DownloadUtil.getUpstreamDataSourceFactory(context) } else { DownloadUtil.getCacheDataSourceFactory(context)