mirror of
https://github.com/jwdeveloper/TikTokLiveJava.git
synced 2026-02-27 16:59:39 -05:00
Merge pull request #39 from kohlerpop1/kohlerpop1-fixes-updates
Added startTime to LiveRoomInfo to determine when the stream started!
This commit is contained in:
@@ -33,6 +33,8 @@ public class TikTokUserInfo
|
|||||||
|
|
||||||
String roomId;
|
String roomId;
|
||||||
|
|
||||||
|
long startTime;
|
||||||
|
|
||||||
public enum UserStatus
|
public enum UserStatus
|
||||||
{
|
{
|
||||||
NotFound,
|
NotFound,
|
||||||
@@ -40,4 +42,4 @@ public class TikTokUserInfo
|
|||||||
LivePaused,
|
LivePaused,
|
||||||
Live
|
Live
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -42,6 +42,7 @@ public interface LiveRoomInfo
|
|||||||
*/
|
*/
|
||||||
int getTotalViewersCount();
|
int getTotalViewersCount();
|
||||||
int getLikesCount();
|
int getLikesCount();
|
||||||
|
long getStartTime();
|
||||||
boolean isAgeRestricted();
|
boolean isAgeRestricted();
|
||||||
String getRoomId();
|
String getRoomId();
|
||||||
String getHostName();
|
String getHostName();
|
||||||
@@ -49,4 +50,4 @@ public interface LiveRoomInfo
|
|||||||
User getHostUser();
|
User getHostUser();
|
||||||
List<RankingUser> getUsersRanking();
|
List<RankingUser> getUsersRanking();
|
||||||
ConnectionState getConnectionState();
|
ConnectionState getConnectionState();
|
||||||
}
|
}
|
||||||
@@ -22,6 +22,7 @@
|
|||||||
*/
|
*/
|
||||||
package io.github.jwdeveloper.tiktok;
|
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.TikTokDisconnectedEvent;
|
||||||
import io.github.jwdeveloper.tiktok.data.events.TikTokErrorEvent;
|
import io.github.jwdeveloper.tiktok.data.events.TikTokErrorEvent;
|
||||||
import io.github.jwdeveloper.tiktok.data.events.TikTokReconnectingEvent;
|
import io.github.jwdeveloper.tiktok.data.events.TikTokReconnectingEvent;
|
||||||
@@ -135,13 +136,15 @@ public class TikTokLiveClient implements LiveClient {
|
|||||||
|
|
||||||
apiService.updateSessionId();
|
apiService.updateSessionId();
|
||||||
|
|
||||||
|
TikTokUserInfo info = apiService.fetchUserInfoFromTikTokApi(liveRoomInfo.getHostName());
|
||||||
|
liveRoomInfo.setStartTime(info.getStartTime());
|
||||||
if (clientSettings.getRoomId() != null) {
|
if (clientSettings.getRoomId() != null) {
|
||||||
liveRoomInfo.setRoomId(clientSettings.getRoomId());
|
liveRoomInfo.setRoomId(clientSettings.getRoomId());
|
||||||
logger.info("Using roomID from settings: " + clientSettings.getRoomId());
|
logger.info("Using roomID from settings: " + clientSettings.getRoomId());
|
||||||
} else {
|
} else {
|
||||||
var roomId = apiService.fetchRoomId(liveRoomInfo.getHostName());
|
liveRoomInfo.setRoomId(info.getRoomId());
|
||||||
liveRoomInfo.setRoomId(roomId);
|
|
||||||
}
|
}
|
||||||
|
apiService.updateRoomId(liveRoomInfo.getRoomId());
|
||||||
|
|
||||||
|
|
||||||
var liveRoomMeta = apiService.fetchRoomInfo();
|
var liveRoomMeta = apiService.fetchRoomInfo();
|
||||||
@@ -194,4 +197,4 @@ public class TikTokLiveClient implements LiveClient {
|
|||||||
{
|
{
|
||||||
tikTokEventHandler.publish(this, event);
|
tikTokEventHandler.publish(this, event);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -113,12 +113,12 @@ public class TikTokLiveClientBuilder implements LiveClientBuilder {
|
|||||||
clientSettings.setTimeout(Duration.ofSeconds(Constants.DEFAULT_TIMEOUT));
|
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());
|
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");
|
throw new TikTokLiveException("HostName can not be null");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -552,11 +552,4 @@ public class TikTokLiveClientBuilder implements LiveClientBuilder {
|
|||||||
tikTokEventHandler.subscribe(TikTokReconnectingEvent.class, event);
|
tikTokEventHandler.subscribe(TikTokReconnectingEvent.class, event);
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -22,11 +22,10 @@
|
|||||||
*/
|
*/
|
||||||
package io.github.jwdeveloper.tiktok;
|
package io.github.jwdeveloper.tiktok;
|
||||||
|
|
||||||
import io.github.jwdeveloper.tiktok.data.models.Picture;
|
|
||||||
import io.github.jwdeveloper.tiktok.data.models.RankingUser;
|
import io.github.jwdeveloper.tiktok.data.models.RankingUser;
|
||||||
import io.github.jwdeveloper.tiktok.data.models.users.User;
|
import io.github.jwdeveloper.tiktok.data.models.users.User;
|
||||||
import io.github.jwdeveloper.tiktok.models.ConnectionState;
|
|
||||||
import io.github.jwdeveloper.tiktok.live.LiveRoomInfo;
|
import io.github.jwdeveloper.tiktok.live.LiveRoomInfo;
|
||||||
|
import io.github.jwdeveloper.tiktok.models.ConnectionState;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
|
||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
@@ -42,6 +41,8 @@ public class TikTokRoomInfo implements LiveRoomInfo {
|
|||||||
|
|
||||||
private int totalViewersCount;
|
private int totalViewersCount;
|
||||||
|
|
||||||
|
private long startTime;
|
||||||
|
|
||||||
private boolean ageRestricted;
|
private boolean ageRestricted;
|
||||||
|
|
||||||
private User host;
|
private User host;
|
||||||
@@ -69,5 +70,4 @@ public class TikTokRoomInfo implements LiveRoomInfo {
|
|||||||
usersRanking.clear();
|
usersRanking.clear();
|
||||||
usersRanking.addAll(rankingUsers);
|
usersRanking.addAll(rankingUsers);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
|
||||||
@@ -22,12 +22,9 @@
|
|||||||
*/
|
*/
|
||||||
package io.github.jwdeveloper.tiktok.http;
|
package io.github.jwdeveloper.tiktok.http;
|
||||||
|
|
||||||
import com.google.gson.GsonBuilder;
|
import com.google.gson.*;
|
||||||
import com.google.gson.JsonObject;
|
|
||||||
import com.google.gson.JsonParser;
|
|
||||||
import io.github.jwdeveloper.tiktok.ClientSettings;
|
import io.github.jwdeveloper.tiktok.ClientSettings;
|
||||||
import io.github.jwdeveloper.tiktok.data.dto.TikTokUserInfo;
|
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.exceptions.TikTokLiveRequestException;
|
||||||
import io.github.jwdeveloper.tiktok.live.LiveRoomMeta;
|
import io.github.jwdeveloper.tiktok.live.LiveRoomMeta;
|
||||||
import io.github.jwdeveloper.tiktok.mappers.LiveRoomMetaMapper;
|
import io.github.jwdeveloper.tiktok.mappers.LiveRoomMetaMapper;
|
||||||
@@ -35,7 +32,6 @@ import io.github.jwdeveloper.tiktok.messages.webcast.WebcastResponse;
|
|||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.logging.Logger;
|
import java.util.logging.Logger;
|
||||||
import java.util.regex.Pattern;
|
|
||||||
|
|
||||||
public class TikTokApiService {
|
public class TikTokApiService {
|
||||||
private final TikTokHttpClient tiktokHttpClient;
|
private final TikTokHttpClient tiktokHttpClient;
|
||||||
@@ -48,7 +44,6 @@ public class TikTokApiService {
|
|||||||
this.clientSettings = clientSettings;
|
this.clientSettings = clientSettings;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public void updateSessionId() {
|
public void updateSessionId() {
|
||||||
if (clientSettings.getSessionId() == null) {
|
if (clientSettings.getSessionId() == null) {
|
||||||
return;
|
return;
|
||||||
@@ -59,24 +54,19 @@ public class TikTokApiService {
|
|||||||
tiktokHttpClient.setSessionId(clientSettings.getSessionId());
|
tiktokHttpClient.setSessionId(clientSettings.getSessionId());
|
||||||
}
|
}
|
||||||
|
|
||||||
public String fetchRoomId(String userName) {
|
public void updateRoomId(String roomId)
|
||||||
var userInfo = fetchUserInfoFromTikTokApi(userName);
|
{
|
||||||
clientSettings.getClientParameters().put("room_id", userInfo.getRoomId());
|
clientSettings.getClientParameters().put("room_id", roomId);
|
||||||
logger.info("RoomID -> " + userInfo.getRoomId());
|
|
||||||
return userInfo.getRoomId();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public TikTokUserInfo fetchUserInfoFromTikTokApi(String userName) {
|
public TikTokUserInfo fetchUserInfoFromTikTokApi(String userName) {
|
||||||
|
|
||||||
var params = new HashMap<>(clientSettings.getClientParameters());
|
var params = new HashMap<>(clientSettings.getClientParameters());
|
||||||
params.put("uniqueId", userName);
|
params.put("uniqueId", userName);
|
||||||
params.put("sourceType", 54);
|
params.put("sourceType", 54);
|
||||||
JsonObject roomData = null;
|
JsonObject roomData;
|
||||||
try {
|
try {
|
||||||
roomData = tiktokHttpClient.getJsonFromTikTokApi("api-live/user/room/", params);
|
roomData = tiktokHttpClient.getJsonFromTikTokApi("api-live/user/room/", params);
|
||||||
} catch (Exception e) {
|
} 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");
|
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 class TikTokApiService {
|
|||||||
throw new TikTokLiveRequestException("fetchRoomIdFromTiktokApi -> Unable to fetch roomID, contact with developer");
|
throw new TikTokLiveRequestException("fetchRoomIdFromTiktokApi -> Unable to fetch roomID, contact with developer");
|
||||||
}
|
}
|
||||||
if (message.equals("user_not_found")) {
|
if (message.equals("user_not_found")) {
|
||||||
return new TikTokUserInfo(TikTokUserInfo.UserStatus.NotFound, "");
|
return new TikTokUserInfo(TikTokUserInfo.UserStatus.NotFound, "", -1);
|
||||||
}
|
}
|
||||||
//live -> status 2
|
//live -> status 2
|
||||||
//live paused -> 3
|
//live paused -> 3
|
||||||
@@ -96,6 +86,9 @@ public class TikTokApiService {
|
|||||||
var roomId = user.get("roomId").getAsString();
|
var roomId = user.get("roomId").getAsString();
|
||||||
var status = user.get("status").getAsInt();
|
var status = user.get("status").getAsInt();
|
||||||
|
|
||||||
|
var liveRoom = data.getAsJsonObject("liveRoom");
|
||||||
|
long startTime = liveRoom.get("startTime").getAsLong();
|
||||||
|
|
||||||
var statusEnum = switch (status) {
|
var statusEnum = switch (status) {
|
||||||
case 2 -> TikTokUserInfo.UserStatus.Live;
|
case 2 -> TikTokUserInfo.UserStatus.Live;
|
||||||
case 3 -> TikTokUserInfo.UserStatus.LivePaused;
|
case 3 -> TikTokUserInfo.UserStatus.LivePaused;
|
||||||
@@ -103,7 +96,7 @@ public class TikTokApiService {
|
|||||||
default -> TikTokUserInfo.UserStatus.NotFound;
|
default -> TikTokUserInfo.UserStatus.NotFound;
|
||||||
};
|
};
|
||||||
|
|
||||||
return new TikTokUserInfo(statusEnum, roomId);
|
return new TikTokUserInfo(statusEnum, roomId, startTime);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -138,4 +131,4 @@ public class TikTokApiService {
|
|||||||
throw new TikTokLiveRequestException("Failed to fetch live websocket connection data", e);
|
throw new TikTokLiveRequestException("Failed to fetch live websocket connection data", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -22,7 +22,6 @@
|
|||||||
*/
|
*/
|
||||||
package io.github.jwdeveloper.tiktok.mappers;
|
package io.github.jwdeveloper.tiktok.mappers;
|
||||||
|
|
||||||
import com.google.gson.JsonElement;
|
|
||||||
import com.google.gson.JsonObject;
|
import com.google.gson.JsonObject;
|
||||||
import io.github.jwdeveloper.tiktok.data.models.Picture;
|
import io.github.jwdeveloper.tiktok.data.models.Picture;
|
||||||
import io.github.jwdeveloper.tiktok.data.models.users.User;
|
import io.github.jwdeveloper.tiktok.data.models.users.User;
|
||||||
@@ -123,4 +122,4 @@ public class LiveRoomMetaMapper {
|
|||||||
user.addAttribute(UserAttribute.LiveHost);
|
user.addAttribute(UserAttribute.LiveHost);
|
||||||
return user;
|
return user;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -24,7 +24,6 @@ package io.github.jwdeveloper.tiktok.http;
|
|||||||
|
|
||||||
import com.google.gson.JsonObject;
|
import com.google.gson.JsonObject;
|
||||||
import io.github.jwdeveloper.tiktok.ClientSettings;
|
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.exceptions.TikTokLiveRequestException;
|
||||||
import io.github.jwdeveloper.tiktok.live.LiveRoomMeta;
|
import io.github.jwdeveloper.tiktok.live.LiveRoomMeta;
|
||||||
import io.github.jwdeveloper.tiktok.mappers.LiveRoomMetaMapper;
|
import io.github.jwdeveloper.tiktok.mappers.LiveRoomMetaMapper;
|
||||||
@@ -84,28 +83,6 @@ public class TikTokApiServiceTest
|
|||||||
verify(tiktokHttpClient, times(1)).setSessionId("validSessionId");
|
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
|
//@Test
|
||||||
void fetchRoomInfo_ValidResponse_ReturnsLiveRoomMeta() throws Exception {
|
void fetchRoomInfo_ValidResponse_ReturnsLiveRoomMeta() throws Exception {
|
||||||
HashMap<String, Object> clientParameters = new HashMap<>();
|
HashMap<String, Object> clientParameters = new HashMap<>();
|
||||||
|
|||||||
Reference in New Issue
Block a user