Android Question How to add referer in ExoPlayer

Solution
Change this line:
B4X:
ProgressiveMediaSourceFactory.InitializeNewInstance("androidx.media3.exoplayer.source.ProgressiveMediaSource.Factory", Array(DataSourceFactory))

To:
B4X:
ProgressiveMediaSourceFactory.InitializeNewInstance("androidx.media3.exoplayer.hls.HlsMediaSource.Factory", Array(DataSourceFactory))
Thanks.
Work perfect
Full code for other user to use:
code:
Private Sub CreateUriSource(Uri As String) As Object
    Dim ctxt As JavaObject
    ctxt.InitializeContext
    Dim HttpDataSourceFactory As JavaObject
    HttpDataSourceFactory.InitializeNewInstance("androidx.media3.datasource.DefaultHttpDataSource$Factory", Null)
    Dim DataSource As JavaObject = HttpDataSourceFactory.RunMethod("createDataSource", Null)...

david7374

Member
I tried, It gives this error:

Error:
java.lang.NoSuchFieldException: No field baseDataSourceFactory in class Landroidx/media3/exoplayer/hls/DefaultHlsDataSourceFactory; (declaration of 'androidx.media3.exoplayer.hls.DefaultHlsDataSourceFactory' appears in /data/app/b44664.exadsdsdfdfple-dJX1ozhzon9IWr9_W0QEBA==/base.apk)
    at java.lang.Class.getDeclaredField(Native Method)
    at anywheresoftware.b4a.agraham.reflection.Reflection.GetField(Reflection.java:316)
    at b44664.exadsdsdfdfple.b4xmainpage._b4xpage_created(b4xmainpage.java:60)
    at b44664.exadsdsdfdfple.b4xmainpage.callSub(b4xmainpage.java:134)
    at anywheresoftware.b4a.keywords.Common.CallSub4(Common.java:1098)
    at anywheresoftware.b4a.keywords.Common.CallSubNew2(Common.java:1069)
    at b44664.exadsdsdfdfple.b4xpagesmanager._vvvvvvvvvvvvv1(b4xpagesmanager.java:529)
    at b44664.exadsdsdfdfple.b4xpagesmanager._vvv3(b4xpagesmanager.java:866)
    at b44664.exadsdsdfdfple.b4xpagesmanager._v0(b4xpagesmanager.java:200)
    at b44664.exadsdsdfdfple.b4xpagesmanager._vv1(b4xpagesmanager.java:207)
    at b44664.exadsdsdfdfple.b4xpagesmanager._initialize(b4xpagesmanager.java:717)
    at b44664.exadsdsdfdfple.main._activity_create(main.java:366)
    at java.lang.reflect.Method.invoke(Native Method)
    at anywheresoftware.b4a.BA.raiseEvent2(BA.java:221)
    at b44664.exadsdsdfdfple.main.afterFirstLayout(main.java:105)
    at b44664.exadsdsdfdfple.main.access$000(main.java:17)
    at b44664.exadsdsdfdfple.main$WaitForLayout.run(main.java:83)
    at android.os.Handler.handleCallback(Handler.java:900)
    at android.os.Handler.dispatchMessage(Handler.java:103)
    at android.os.Looper.loop(Looper.java:219)
    at android.app.ActivityThread.main(ActivityThread.java:8668)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:513)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1109)

Error in this line:

Error:
Dim http As JavaObject = r.GetField("baseDataSourceFactory")
 
Upvote 0

Erel

B4X founder
Staff member
Licensed User
Longtime User
This code allows you to add headers to the request:
B4X:
Private Sub CreateUriSource(Uri As String) As Object
    Dim ctxt As JavaObject
    ctxt.InitializeContext
    Dim HttpDataSourceFactory As JavaObject
    HttpDataSourceFactory.InitializeNewInstance("androidx.media3.datasource.DefaultHttpDataSource$Factory", Null)
    'HttpDataSourceFactory.RunMethod("setAllowCrossProtocolRedirects", Array(True))
    Dim DataSource As JavaObject = HttpDataSourceFactory.RunMethod("createDataSource", Null)
    DataSource.RunMethod("setRequestProperty", Array("header", "value")) '<------  
    Dim DataSourceFactory As JavaObject = ctxt.CreateEvent("androidx.media3.datasource.DataSource.Factory", "", DataSource)
    Dim ProgressiveMediaSourceFactory As JavaObject
    ProgressiveMediaSourceFactory.InitializeNewInstance("androidx.media3.exoplayer.source.ProgressiveMediaSource.Factory", Array(DataSourceFactory))
    Dim MediaItem As JavaObject
    MediaItem.InitializeStatic("androidx.media3.common.MediaItem")
    Return ProgressiveMediaSourceFactory.RunMethod("createMediaSource", Array(MediaItem.RunMethod("fromUri", Array(Uri))))
End Sub
 
Upvote 0

david7374

Member
This code allows you to add headers to the request:
B4X:
Private Sub CreateUriSource(Uri As String) As Object
    Dim ctxt As JavaObject
    ctxt.InitializeContext
    Dim HttpDataSourceFactory As JavaObject
    HttpDataSourceFactory.InitializeNewInstance("androidx.media3.datasource.DefaultHttpDataSource$Factory", Null)
    'HttpDataSourceFactory.RunMethod("setAllowCrossProtocolRedirects", Array(True))
    Dim DataSource As JavaObject = HttpDataSourceFactory.RunMethod("createDataSource", Null)
    DataSource.RunMethod("setRequestProperty", Array("header", "value")) '<------
    Dim DataSourceFactory As JavaObject = ctxt.CreateEvent("androidx.media3.datasource.DataSource.Factory", "", DataSource)
    Dim ProgressiveMediaSourceFactory As JavaObject
    ProgressiveMediaSourceFactory.InitializeNewInstance("androidx.media3.exoplayer.source.ProgressiveMediaSource.Factory", Array(DataSourceFactory))
    Dim MediaItem As JavaObject
    MediaItem.InitializeStatic("androidx.media3.common.MediaItem")
    Return ProgressiveMediaSourceFactory.RunMethod("createMediaSource", Array(MediaItem.RunMethod("fromUri", Array(Uri))))
End Sub

Not work for hls link.
And gives this error in exoplayer:

Error:
androidx.media3.exoplayer.source.UnrecognizedInputFormatException: None of the available extractors (FlvExtractor, FlacExtractor, WavExtractor, FragmentedMp4Extractor, Mp4Extractor, AmrExtractor, PsExtractor, OggExtractor, TsExtractor, MatroskaExtractor, AdtsExtractor, Ac3Extractor, Ac4Extractor, Mp3Extractor, AviExtractor, JpegExtractor, PngExtractor, WebpExtractor, BmpExtractor, HeifExtractor) could read the stream.{contentIsMalformed=false, dataType=1}
 
Upvote 0

david7374

Member
Hls link for test:

code:
https://gg.hls2.xyz/live/AP EBS Kids/playlist.m3u8

And referer:

code:
https://www.aparatchi.com/

Without set referer, gives this error in exoplayer:

Error:
androidx.media3.datasource.HttpDataSource$InvalidResponseCodeException: Response code: 403
 
Upvote 0

david7374

Member
The problem is not related to the referer. It returns a stream that ExoPlayer cannot read.
No,
When running a test project in Android Studio and add hls link with referer, working perfect.
This code work in android studio:
B4X:
    public MediaSource hlsMediaSource(Uri uri, Context context) {
        DefaultHttpDataSourceFactory defaultHttpDataSourceFactory = new DefaultHttpDataSourceFactory("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.128 Safari/537.36", new DefaultBandwidthMeter());
        defaultHttpDataSourceFactory.setDefaultRequestProperties("referer", "https://www.aparatchi.com/");  // getDefaultRequestProperties().set ---> old exoplayer
        return new HlsMediaSource.Factory((DataSource.Factory) defaultHttpDataSourceFactory).createMediaSource(uri);
    }
How use this code in b4a?
 
Upvote 0

david7374

Member
Change this line:
B4X:
ProgressiveMediaSourceFactory.InitializeNewInstance("androidx.media3.exoplayer.source.ProgressiveMediaSource.Factory", Array(DataSourceFactory))

To:
B4X:
ProgressiveMediaSourceFactory.InitializeNewInstance("androidx.media3.exoplayer.hls.HlsMediaSource.Factory", Array(DataSourceFactory))
Thanks.
Work perfect
Full code for other user to use:
code:
Private Sub CreateUriSource(Uri As String) As Object
    Dim ctxt As JavaObject
    ctxt.InitializeContext
    Dim HttpDataSourceFactory As JavaObject
    HttpDataSourceFactory.InitializeNewInstance("androidx.media3.datasource.DefaultHttpDataSource$Factory", Null)
    Dim DataSource As JavaObject = HttpDataSourceFactory.RunMethod("createDataSource", Null)
    DataSource.RunMethod("setRequestProperty", Array("referer", "https://www.aparatchi.com/")) '<------  add referer
    Dim DataSourceFactory As JavaObject = ctxt.CreateEvent("androidx.media3.datasource.DataSource.Factory", "", DataSource)
    Dim ProgressiveMediaSourceFactory As JavaObject
    ProgressiveMediaSourceFactory.InitializeNewInstance("androidx.media3.exoplayer.hls.HlsMediaSource.Factory", Array(DataSourceFactory))
    Dim MediaItem As JavaObject
    MediaItem.InitializeStatic("androidx.media3.common.MediaItem")
    Return ProgressiveMediaSourceFactory.RunMethod("createMediaSource", Array(MediaItem.RunMethod("fromUri", Array(Uri))))
End Sub
 
Upvote 0
Solution
Top