From 7b911838a2a5bf947a9799b37d9071402b903fda Mon Sep 17 00:00:00 2001 From: kohlerpop1 Date: Wed, 20 Dec 2023 14:07:53 -0500 Subject: [PATCH] Added startTime to LiveRoomInfo to determine when the stream started! --- .../tiktok/data/dto/TikTokUserInfo.java | 4 ++- .../jwdeveloper/tiktok/live/LiveRoomInfo.java | 3 +- .../jwdeveloper/tiktok/TikTokLiveClient.java | 9 ++++-- .../tiktok/TikTokLiveClientBuilder.java | 13 ++------- .../jwdeveloper/tiktok/TikTokRoomInfo.java | 8 ++--- .../tiktok/http/TikTokApiService.java | 29 +++++++------------ .../tiktok/mappers/LiveRoomMetaMapper.java | 3 +- .../tiktok/http/TikTokApiServiceTest.java | 23 --------------- 8 files changed, 30 insertions(+), 62 deletions(-) diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/data/dto/TikTokUserInfo.java b/API/src/main/java/io/github/jwdeveloper/tiktok/data/dto/TikTokUserInfo.java index 9fc8762f..80bb4551 100644 --- a/API/src/main/java/io/github/jwdeveloper/tiktok/data/dto/TikTokUserInfo.java +++ b/API/src/main/java/io/github/jwdeveloper/tiktok/data/dto/TikTokUserInfo.java @@ -33,6 +33,8 @@ public class TikTokUserInfo String roomId; + long startTime; + public enum UserStatus { NotFound, @@ -40,4 +42,4 @@ public enum UserStatus LivePaused, Live } -} +} \ No newline at end of file diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/live/LiveRoomInfo.java b/API/src/main/java/io/github/jwdeveloper/tiktok/live/LiveRoomInfo.java index 86713244..0f624a55 100644 --- a/API/src/main/java/io/github/jwdeveloper/tiktok/live/LiveRoomInfo.java +++ b/API/src/main/java/io/github/jwdeveloper/tiktok/live/LiveRoomInfo.java @@ -42,6 +42,7 @@ public interface LiveRoomInfo */ int getTotalViewersCount(); int getLikesCount(); + long getStartTime(); boolean isAgeRestricted(); String getRoomId(); String getHostName(); @@ -49,4 +50,4 @@ public interface LiveRoomInfo User getHostUser(); List getUsersRanking(); ConnectionState getConnectionState(); -} +} \ No newline at end of file diff --git a/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveClient.java b/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveClient.java index af7e51db..5b3f8912 100644 --- a/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveClient.java +++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveClient.java @@ -22,6 +22,7 @@ */ package io.github.jwdeveloper.tiktok; +import io.github.jwdeveloper.tiktok.data.dto.TikTokUserInfo; import io.github.jwdeveloper.tiktok.data.events.TikTokDisconnectedEvent; import io.github.jwdeveloper.tiktok.data.events.TikTokErrorEvent; import io.github.jwdeveloper.tiktok.data.events.TikTokReconnectingEvent; @@ -135,13 +136,15 @@ public void tryConnect() { apiService.updateSessionId(); + TikTokUserInfo info = apiService.fetchUserInfoFromTikTokApi(liveRoomInfo.getHostName()); + liveRoomInfo.setStartTime(info.getStartTime()); if (clientSettings.getRoomId() != null) { liveRoomInfo.setRoomId(clientSettings.getRoomId()); logger.info("Using roomID from settings: " + clientSettings.getRoomId()); } else { - var roomId = apiService.fetchRoomId(liveRoomInfo.getHostName()); - liveRoomInfo.setRoomId(roomId); + liveRoomInfo.setRoomId(info.getRoomId()); } + apiService.updateRoomId(liveRoomInfo.getRoomId()); var liveRoomMeta = apiService.fetchRoomInfo(); @@ -194,4 +197,4 @@ public void publishEvent(TikTokEvent event) { tikTokEventHandler.publish(this, event); } -} +} \ No newline at end of file diff --git a/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveClientBuilder.java b/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveClientBuilder.java index 17c7191f..545806df 100644 --- a/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveClientBuilder.java +++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveClientBuilder.java @@ -113,12 +113,12 @@ protected void validate() { clientSettings.setTimeout(Duration.ofSeconds(Constants.DEFAULT_TIMEOUT)); } - if (clientSettings.getClientLanguage() == null || clientSettings.getClientLanguage().equals("")) { + if (clientSettings.getClientLanguage() == null || clientSettings.getClientLanguage().isEmpty()) { clientSettings.setClientLanguage(Constants.DefaultClientSettings().getClientLanguage()); } - if (clientSettings.getHostName() == null || clientSettings.getHostName().equals("")) { + if (clientSettings.getHostName() == null || clientSettings.getHostName().isEmpty()) { throw new TikTokLiveException("HostName can not be null"); } @@ -552,11 +552,4 @@ public TikTokLiveClientBuilder onReconnecting(EventConsumer rankingUsers) { usersRanking.clear(); usersRanking.addAll(rankingUsers); } - -} +} \ No newline at end of file diff --git a/Client/src/main/java/io/github/jwdeveloper/tiktok/http/TikTokApiService.java b/Client/src/main/java/io/github/jwdeveloper/tiktok/http/TikTokApiService.java index 96e0a2ef..4ec76329 100644 --- a/Client/src/main/java/io/github/jwdeveloper/tiktok/http/TikTokApiService.java +++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/http/TikTokApiService.java @@ -22,12 +22,9 @@ */ package io.github.jwdeveloper.tiktok.http; -import com.google.gson.GsonBuilder; -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; +import com.google.gson.*; import io.github.jwdeveloper.tiktok.ClientSettings; import io.github.jwdeveloper.tiktok.data.dto.TikTokUserInfo; -import io.github.jwdeveloper.tiktok.exceptions.TikTokLiveOfflineHostException; import io.github.jwdeveloper.tiktok.exceptions.TikTokLiveRequestException; import io.github.jwdeveloper.tiktok.live.LiveRoomMeta; import io.github.jwdeveloper.tiktok.mappers.LiveRoomMetaMapper; @@ -35,7 +32,6 @@ import java.util.HashMap; import java.util.logging.Logger; -import java.util.regex.Pattern; public class TikTokApiService { private final TikTokHttpClient tiktokHttpClient; @@ -48,7 +44,6 @@ public TikTokApiService(TikTokHttpClient apiClient, Logger logger, ClientSetting this.clientSettings = clientSettings; } - public void updateSessionId() { if (clientSettings.getSessionId() == null) { return; @@ -59,24 +54,19 @@ public void updateSessionId() { tiktokHttpClient.setSessionId(clientSettings.getSessionId()); } - public String fetchRoomId(String userName) { - var userInfo = fetchUserInfoFromTikTokApi(userName); - clientSettings.getClientParameters().put("room_id", userInfo.getRoomId()); - logger.info("RoomID -> " + userInfo.getRoomId()); - return userInfo.getRoomId(); + public void updateRoomId(String roomId) + { + clientSettings.getClientParameters().put("room_id", roomId); } public TikTokUserInfo fetchUserInfoFromTikTokApi(String userName) { - var params = new HashMap<>(clientSettings.getClientParameters()); params.put("uniqueId", userName); params.put("sourceType", 54); - JsonObject roomData = null; + JsonObject roomData; try { roomData = tiktokHttpClient.getJsonFromTikTokApi("api-live/user/room/", params); } catch (Exception e) { - - throw new TikTokLiveRequestException("Failed to fetch pre connection room information, it happens when TikTok temporary blocks you. Try to connect again in few minutes"); } @@ -86,7 +76,7 @@ public TikTokUserInfo fetchUserInfoFromTikTokApi(String userName) { throw new TikTokLiveRequestException("fetchRoomIdFromTiktokApi -> Unable to fetch roomID, contact with developer"); } if (message.equals("user_not_found")) { - return new TikTokUserInfo(TikTokUserInfo.UserStatus.NotFound, ""); + return new TikTokUserInfo(TikTokUserInfo.UserStatus.NotFound, "", -1); } //live -> status 2 //live paused -> 3 @@ -96,6 +86,9 @@ public TikTokUserInfo fetchUserInfoFromTikTokApi(String userName) { var roomId = user.get("roomId").getAsString(); var status = user.get("status").getAsInt(); + var liveRoom = data.getAsJsonObject("liveRoom"); + long startTime = liveRoom.get("startTime").getAsLong(); + var statusEnum = switch (status) { case 2 -> TikTokUserInfo.UserStatus.Live; case 3 -> TikTokUserInfo.UserStatus.LivePaused; @@ -103,7 +96,7 @@ public TikTokUserInfo fetchUserInfoFromTikTokApi(String userName) { default -> TikTokUserInfo.UserStatus.NotFound; }; - return new TikTokUserInfo(statusEnum, roomId); + return new TikTokUserInfo(statusEnum, roomId, startTime); } @@ -138,4 +131,4 @@ public WebcastResponse fetchClientData() { throw new TikTokLiveRequestException("Failed to fetch live websocket connection data", e); } } -} +} \ No newline at end of file diff --git a/Client/src/main/java/io/github/jwdeveloper/tiktok/mappers/LiveRoomMetaMapper.java b/Client/src/main/java/io/github/jwdeveloper/tiktok/mappers/LiveRoomMetaMapper.java index 85e1f5ad..e548fdab 100644 --- a/Client/src/main/java/io/github/jwdeveloper/tiktok/mappers/LiveRoomMetaMapper.java +++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/mappers/LiveRoomMetaMapper.java @@ -22,7 +22,6 @@ */ package io.github.jwdeveloper.tiktok.mappers; -import com.google.gson.JsonElement; import com.google.gson.JsonObject; import io.github.jwdeveloper.tiktok.data.models.Picture; import io.github.jwdeveloper.tiktok.data.models.users.User; @@ -123,4 +122,4 @@ public User getUser(JsonObject jsonElement) user.addAttribute(UserAttribute.LiveHost); return user; } -} +} \ No newline at end of file diff --git a/Client/src/test/java/io/github/jwdeveloper/tiktok/http/TikTokApiServiceTest.java b/Client/src/test/java/io/github/jwdeveloper/tiktok/http/TikTokApiServiceTest.java index 58002ed9..e1c88857 100644 --- a/Client/src/test/java/io/github/jwdeveloper/tiktok/http/TikTokApiServiceTest.java +++ b/Client/src/test/java/io/github/jwdeveloper/tiktok/http/TikTokApiServiceTest.java @@ -24,7 +24,6 @@ import com.google.gson.JsonObject; import io.github.jwdeveloper.tiktok.ClientSettings; -import io.github.jwdeveloper.tiktok.exceptions.TikTokLiveException; import io.github.jwdeveloper.tiktok.exceptions.TikTokLiveRequestException; import io.github.jwdeveloper.tiktok.live.LiveRoomMeta; import io.github.jwdeveloper.tiktok.mappers.LiveRoomMetaMapper; @@ -84,28 +83,6 @@ void updateSessionId_ValidSessionId_SetsSessionId() { verify(tiktokHttpClient, times(1)).setSessionId("validSessionId"); } - - // @Test - void fetchRoomId_ValidResponse_ReturnsRoomId() throws Exception { - String expectedRoomId = "123456"; - String htmlResponse = "room_id=" + expectedRoomId ; - when(tiktokHttpClient.getLivestreamPage(anyString())).thenReturn(htmlResponse); - - String roomId = tikTokApiService.fetchRoomId("username"); - - assertEquals(expectedRoomId, roomId); - verify(clientSettings.getClientParameters()).put("room_id", expectedRoomId); - } - - // @Test - void fetchRoomId_ExceptionThrown_ThrowsTikTokLiveRequestException() throws Exception { - when(tiktokHttpClient.getLivestreamPage(anyString())).thenThrow(new Exception("some exception")); - - assertThrows(TikTokLiveRequestException.class, () -> { - tikTokApiService.fetchRoomId("username"); - }); - } - //@Test void fetchRoomInfo_ValidResponse_ReturnsLiveRoomMeta() throws Exception { HashMap clientParameters = new HashMap<>();