2525import com .google .gson .JsonParser ;
2626import io .github .jwdeveloper .tiktok .annotations .TikTokEventObserver ;
2727import io .github .jwdeveloper .tiktok .data .events .*;
28- import io .github .jwdeveloper .tiktok .data .events .http . TikTokRoomDataResponseEvent ;
28+ import io .github .jwdeveloper .tiktok .data .events .control . TikTokPreConnectionEvent ;
2929import io .github .jwdeveloper .tiktok .data .settings .LiveClientSettings ;
3030import io .github .jwdeveloper .tiktok .extension .recorder .api .LiveRecorder ;
3131import io .github .jwdeveloper .tiktok .extension .recorder .impl .data .*;
3434import io .github .jwdeveloper .tiktok .live .LiveClient ;
3535import io .github .jwdeveloper .tiktok .models .ConnectionState ;
3636
37- import javax .net .ssl .HttpsURLConnection ;
3837import java .io .*;
39- import java .net .URL ;
40- import java .util .function .*;
38+ import java .net .URI ;
39+ import java .net .http .*;
40+ import java .time .Duration ;
41+ import java .util .function .BiConsumer ;
4142
4243public class RecorderListener implements LiveRecorder {
4344
4445 private final BiConsumer <RecorderSettings , LiveClient > consumer ;
45- private RecorderSettings settings ;
46+ private final RecorderSettings settings ;
4647 private DownloadData downloadData ;
4748 private Thread liveDownloadThread ;
4849
4950 public RecorderListener (BiConsumer <RecorderSettings , LiveClient > consumer ) {
5051 this .consumer = consumer ;
52+ this .settings = RecorderSettings .DEFAULT ();
5153 }
5254
5355 @ TikTokEventObserver
54- private void onResponse (LiveClient liveClient , TikTokRoomDataResponseEvent event ) {
55- settings = RecorderSettings .DEFAULT ();
56+ private void onResponse (LiveClient liveClient , TikTokPreConnectionEvent event ) {
5657 consumer .accept (settings , liveClient );
5758
58- var json = event .getLiveData ().getJson ();
59+ var json = event .getUserData ().getJson ();
5960
6061 liveClient .getLogger ().info ("Searching for live download url" );
6162 downloadData = settings .getPrepareDownloadData () != null ?
@@ -70,26 +71,26 @@ private void onResponse(LiveClient liveClient, TikTokRoomDataResponseEvent event
7071
7172 @ TikTokEventObserver
7273 private void onConnected (LiveClient liveClient , TikTokConnectedEvent event ) {
73- if (isConnected ())
74+ if (isConnected () || downloadData . getDownloadLiveUrl (). isEmpty () )
7475 return ;
7576
7677 liveDownloadThread = new Thread (() -> {
7778 try {
7879 liveClient .getLogger ().info ("Recording started " +liveClient .getRoomInfo ().getHostName ());
79- var url = new URL ( downloadData . getFullUrl ());
80- HttpsURLConnection connection = ( HttpsURLConnection ) url . openConnection ();
81- var headers = LiveClientSettings .DefaultRequestHeaders ();
82- for ( var entry : headers . entrySet ()) {
83- connection . setRequestProperty ( entry . getKey (), entry . getValue ());
84- }
80+
81+ HttpRequest . Builder requestBuilder = HttpRequest . newBuilder ( URI . create ( downloadData . getFullUrl ())). GET ();
82+ for ( var entry : LiveClientSettings .DefaultRequestHeaders (). entrySet ())
83+ requestBuilder . header ( entry . getKey (), entry . getValue ());
84+ HttpResponse < InputStream > serverResponse = HttpClient . newBuilder (). followRedirects ( HttpClient . Redirect . NORMAL )
85+ . connectTimeout ( Duration . ofSeconds ( 10 )). build (). send ( requestBuilder . build (), HttpResponse . BodyHandlers . ofInputStream ());
8586
8687 var file = settings .getOutputFile ();
8788 file .getParentFile ().mkdirs ();
8889 file .createNewFile ();
8990
9091 try (
91- var in = connection . getInputStream ();
92- var fos = new FileOutputStream (file )
92+ var in = serverResponse . body ();
93+ var fos = new FileOutputStream (file , true )
9394 ) {
9495 byte [] dataBuffer = new byte [1024 ];
9596 int bytesRead ;
@@ -128,35 +129,38 @@ private void onLiveEnded(LiveClient liveClient, TikTokLiveEndedEvent event) {
128129
129130
130131 private DownloadData mapToDownloadData (String json ) {
131-
132- var parsedJson = JsonParser .parseString (json );
133- var jsonObject = parsedJson .getAsJsonObject ();
134- var streamDataJson = jsonObject .getAsJsonObject ("data" )
135- .getAsJsonObject ("stream_url " )
136- .getAsJsonObject ("live_core_sdk_data " )
132+ try {
133+ var parsedJson = JsonParser .parseString (json );
134+ var jsonObject = parsedJson .getAsJsonObject ();
135+ var streamDataJson = jsonObject .getAsJsonObject ("data" )
136+ .getAsJsonObject ("liveRoom " )
137+ .getAsJsonObject ("streamData " )
137138 .getAsJsonObject ("pull_data" )
138139 .get ("stream_data" )
139140 .getAsString ();
140141
141- var streamDataJsonObject = JsonParser .parseString (streamDataJson ).getAsJsonObject ();
142+ var streamDataJsonObject = JsonParser .parseString (streamDataJson ).getAsJsonObject ();
142143
143- var urlLink = streamDataJsonObject .getAsJsonObject ("data" )
144+ var urlLink = streamDataJsonObject .getAsJsonObject ("data" )
144145 .getAsJsonObject (LiveQuality .origin .name ())
145146 .getAsJsonObject ("main" )
146147 .get ("flv" )
147148 .getAsString ();
148149
149- var sessionId = streamDataJsonObject .getAsJsonObject ("common" )
150+ var sessionId = streamDataJsonObject .getAsJsonObject ("common" )
150151 .get ("session_id" )
151152 .getAsString ();
152153
153- //main
154- //https://pull-f5-tt03.fcdn.eu.tiktokcdn.com/stage/stream-3284937501738533765.flv?session_id=136-20240109000954BF818F1B3A8E5E39E238&_webnoredir=1
155- //Working
156- //https://pull-f5-tt03.fcdn.eu.tiktokcdn.com/game/stream-3284937501738533765_sd5.flv?_session_id=136-20240109001052D91FDBC00143211020C8.1704759052997&_webnoredir=1
157- //https://pull-f5-tt02.fcdn.eu.tiktokcdn.com/stage/stream-3861399216374940610_uhd5.flv?_session_id=136-20240109000223D0BAA1A83974490EE630.1704758544391&_webnoredir=1
154+ //main
155+ //https://pull-f5-tt03.fcdn.eu.tiktokcdn.com/stage/stream-3284937501738533765.flv?session_id=136-20240109000954BF818F1B3A8E5E39E238&_webnoredir=1
156+ //Working
157+ //https://pull-f5-tt03.fcdn.eu.tiktokcdn.com/game/stream-3284937501738533765_sd5.flv?_session_id=136-20240109001052D91FDBC00143211020C8.1704759052997&_webnoredir=1
158+ //https://pull-f5-tt02.fcdn.eu.tiktokcdn.com/stage/stream-3861399216374940610_uhd5.flv?_session_id=136-20240109000223D0BAA1A83974490EE630.1704758544391&_webnoredir=1
158159
159- return new DownloadData (urlLink , sessionId );
160+ return new DownloadData (urlLink , sessionId );
161+ } catch (Exception e ) {
162+ return new DownloadData ("" , "" );
163+ }
160164 }
161165
162166 private boolean isConnected () {
0 commit comments