diff --git a/app/build.gradle b/app/build.gradle
index 4bff9ca..8121d6c 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -13,10 +13,11 @@ android {
}
buildTypes {
- release {
- minifyEnabled false
- proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
- }
+ release {
+ minifyEnabled false
+ signingConfig signingConfigs.debug
+ proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
+ }
}
compileOptions {
@@ -44,6 +45,9 @@ dependencies {
// ExoPlayer para reproducción de video
implementation 'com.google.android.exoplayer:exoplayer:2.18.7'
+ implementation 'com.google.android.exoplayer:extension-okhttp:2.18.7'
+ implementation 'com.squareup.okhttp3:okhttp:4.12.0'
+ implementation 'com.squareup.okhttp3:okhttp-dnsoverhttps:4.12.0'
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.5'
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 28163fc..415d9ca 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -6,6 +6,10 @@
+
+
+
+
+
+
+
diff --git a/app/src/main/java/com/streamplayer/PlayerActivity.java b/app/src/main/java/com/streamplayer/PlayerActivity.java
index f439fea..50d822d 100644
--- a/app/src/main/java/com/streamplayer/PlayerActivity.java
+++ b/app/src/main/java/com/streamplayer/PlayerActivity.java
@@ -14,7 +14,22 @@ import com.google.android.exoplayer2.ExoPlayer;
import com.google.android.exoplayer2.MediaItem;
import com.google.android.exoplayer2.PlaybackException;
import com.google.android.exoplayer2.Player;
+import com.google.android.exoplayer2.DefaultRenderersFactory;
+import com.google.android.exoplayer2.ext.okhttp.OkHttpDataSource;
+import com.google.android.exoplayer2.source.MediaSource;
+import com.google.android.exoplayer2.source.hls.HlsMediaSource;
import com.google.android.exoplayer2.ui.PlayerView;
+import com.google.android.exoplayer2.util.Util;
+
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
+import okhttp3.HttpUrl;
+import okhttp3.OkHttpClient;
+import okhttp3.dnsoverhttps.DnsOverHttps;
public class PlayerActivity extends AppCompatActivity {
@@ -32,6 +47,7 @@ public class PlayerActivity extends AppCompatActivity {
private String channelName;
private String channelUrl;
private boolean overlayVisible = true;
+ private OkHttpClient okHttpClient;
@Override
protected void onCreate(Bundle savedInstanceState) {
@@ -91,7 +107,13 @@ public class PlayerActivity extends AppCompatActivity {
private void startPlayback(String streamUrl) {
try {
releasePlayer();
- player = new ExoPlayer.Builder(this).build();
+ DefaultRenderersFactory renderersFactory = new DefaultRenderersFactory(this)
+ .setEnableDecoderFallback(true)
+ .setExtensionRendererMode(DefaultRenderersFactory.EXTENSION_RENDERER_MODE_ON);
+ player = new ExoPlayer.Builder(this, renderersFactory)
+ .setSeekForwardIncrementMs(10_000)
+ .setSeekBackIncrementMs(10_000)
+ .build();
playerView.setPlayer(player);
player.addListener(new Player.Listener() {
@@ -106,12 +128,14 @@ public class PlayerActivity extends AppCompatActivity {
@Override
public void onPlayerError(PlaybackException error) {
- showError("Error al reproducir: " + error.getMessage());
+ String detail = error.getCause() != null ?
+ error.getCause().getMessage() : "";
+ showError("Error al reproducir: " + error.getMessage() + " " + detail);
}
});
MediaItem mediaItem = MediaItem.fromUri(streamUrl);
- player.setMediaItem(mediaItem);
+ player.setMediaSource(buildMediaSource(mediaItem));
player.prepare();
player.setPlayWhenReady(true);
setOverlayVisible(false);
@@ -145,6 +169,55 @@ public class PlayerActivity extends AppCompatActivity {
}
}
+ private MediaSource buildMediaSource(MediaItem mediaItem) {
+ Map headers = new HashMap<>();
+ headers.put("Referer", channelUrl);
+ headers.put("Origin", "https://streamtpmedia.com");
+ headers.put("Accept", "*/*");
+ headers.put("Connection", "keep-alive");
+
+ String userAgent = Util.getUserAgent(this, "StreamPlayer");
+
+ OkHttpDataSource.Factory factory = new OkHttpDataSource.Factory(provideOkHttpClient())
+ .setUserAgent(userAgent)
+ .setDefaultRequestProperties(headers);
+ return new HlsMediaSource.Factory(factory).createMediaSource(mediaItem);
+ }
+
+ private OkHttpClient provideOkHttpClient() {
+ if (okHttpClient != null) {
+ return okHttpClient;
+ }
+
+ try {
+ OkHttpClient bootstrap = new OkHttpClient.Builder()
+ .connectTimeout(15, TimeUnit.SECONDS)
+ .readTimeout(15, TimeUnit.SECONDS)
+ .retryOnConnectionFailure(true)
+ .build();
+
+ DnsOverHttps dohDns = new DnsOverHttps.Builder()
+ .client(bootstrap)
+ .url(HttpUrl.get("https://dns.adguard-dns.com/dns-query"))
+ .bootstrapDnsHosts(
+ InetAddress.getByName("94.140.14.14"),
+ InetAddress.getByName("94.140.15.15"))
+ .build();
+
+ okHttpClient = bootstrap.newBuilder()
+ .dns(dohDns)
+ .build();
+ } catch (UnknownHostException e) {
+ okHttpClient = new OkHttpClient.Builder()
+ .connectTimeout(15, TimeUnit.SECONDS)
+ .readTimeout(15, TimeUnit.SECONDS)
+ .retryOnConnectionFailure(true)
+ .build();
+ }
+
+ return okHttpClient;
+ }
+
@Override
protected void onStart() {
super.onStart();
diff --git a/app/src/main/res/drawable/banner_streamplayer.xml b/app/src/main/res/drawable/banner_streamplayer.xml
index 4fe3dc1..ae786fd 100644
--- a/app/src/main/res/drawable/banner_streamplayer.xml
+++ b/app/src/main/res/drawable/banner_streamplayer.xml
@@ -6,7 +6,7 @@
android:angle="0"
android:endColor="#FF002766"
android:startColor="#FF0F4C81" />
-
+
-