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" /> - +