mirror of
https://github.com/jwdeveloper/TikTokLiveJava.git
synced 2026-02-28 09:19:40 -05:00
Compare commits
15 Commits
develop-1.
...
1.1.1-Rele
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ffabf098c0 | ||
|
|
7468fc2385 | ||
|
|
abbb557881 | ||
|
|
19c513afe6 | ||
|
|
283024a1d4 | ||
|
|
a0ac9e6d79 | ||
|
|
2385d1e75e | ||
|
|
c9c7f62d4a | ||
|
|
35ef95096d | ||
|
|
46bcfd6eb8 | ||
|
|
38b66395cb | ||
|
|
46e75dec1a | ||
|
|
749cfcf4a6 | ||
|
|
039f2b6a0b | ||
|
|
1a1860e35d |
@@ -5,7 +5,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>TikTokLiveJava</artifactId>
|
<artifactId>TikTokLiveJava</artifactId>
|
||||||
<groupId>io.github.jwdeveloper.tiktok</groupId>
|
<groupId>io.github.jwdeveloper.tiktok</groupId>
|
||||||
<version>1.0.17-Release</version>
|
<version>1.1.0-Release</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<artifactId>API</artifactId>
|
<artifactId>API</artifactId>
|
||||||
|
|||||||
@@ -36,7 +36,6 @@ public class LiveClientSettings {
|
|||||||
/**
|
/**
|
||||||
* ISO-Language for Client
|
* ISO-Language for Client
|
||||||
*/
|
*/
|
||||||
|
|
||||||
private String clientLanguage;
|
private String clientLanguage;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -44,7 +43,6 @@ public class LiveClientSettings {
|
|||||||
*/
|
*/
|
||||||
private boolean retryOnConnectionFailure;
|
private boolean retryOnConnectionFailure;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Before retrying connect, wait for select amount of time
|
* Before retrying connect, wait for select amount of time
|
||||||
*/
|
*/
|
||||||
@@ -53,42 +51,35 @@ public class LiveClientSettings {
|
|||||||
/**
|
/**
|
||||||
* Whether to print Logs to Console
|
* Whether to print Logs to Console
|
||||||
*/
|
*/
|
||||||
|
|
||||||
private boolean printToConsole = true;
|
private boolean printToConsole = true;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* LoggingLevel for Logs
|
* LoggingLevel for Logs
|
||||||
*/
|
*/
|
||||||
private Level logLevel;
|
private Level logLevel;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Optional: Use it if you need to change TikTok live hostname in builder
|
* Optional: Use it if you need to change TikTok live hostname in builder
|
||||||
*/
|
*/
|
||||||
private String hostName;
|
private String hostName;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Parameters used in requests to TikTok api
|
* Parameters used in requests to TikTok api
|
||||||
*/
|
*/
|
||||||
private HttpClientSettings httpSettings;
|
private HttpClientSettings httpSettings;
|
||||||
|
|
||||||
|
/**
|
||||||
/*
|
|
||||||
* Optional: Sometimes not every messages from chat are send to TikTokLiveJava to fix this issue you can set sessionId
|
* Optional: Sometimes not every messages from chat are send to TikTokLiveJava to fix this issue you can set sessionId
|
||||||
* documentation how to obtain sessionId https://github.com/isaackogan/TikTok-Live-Connector#send-chat-messages
|
* documentation how to obtain sessionId https://github.com/isaackogan/TikTok-Live-Connector#send-chat-messages
|
||||||
*/
|
*/
|
||||||
private String sessionId;
|
private String sessionId;
|
||||||
|
|
||||||
/*
|
/**
|
||||||
* Optional: By default roomID is fetched before connect to live, but you can set it manually
|
* Optional: By default roomID is fetched before connect to live, but you can set it manually
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
private String roomId;
|
private String roomId;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public static LiveClientSettings createDefault()
|
public static LiveClientSettings createDefault()
|
||||||
{
|
{
|
||||||
var httpSettings = new HttpClientSettings();
|
var httpSettings = new HttpClientSettings();
|
||||||
@@ -103,12 +94,10 @@ public class LiveClientSettings {
|
|||||||
clientSettings.setPrintToConsole(false);
|
clientSettings.setPrintToConsole(false);
|
||||||
clientSettings.setLogLevel(Level.ALL);
|
clientSettings.setLogLevel(Level.ALL);
|
||||||
|
|
||||||
|
|
||||||
clientSettings.setHttpSettings(httpSettings);
|
clientSettings.setHttpSettings(httpSettings);
|
||||||
return clientSettings;
|
return clientSettings;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Default Parameters for HTTP-Request
|
* Default Parameters for HTTP-Request
|
||||||
*/
|
*/
|
||||||
@@ -147,11 +136,9 @@ public class LiveClientSettings {
|
|||||||
clientParams.put("webcast_sdk_version", "1.3.0");
|
clientParams.put("webcast_sdk_version", "1.3.0");
|
||||||
clientParams.put("update_version_code", "1.3.0");
|
clientParams.put("update_version_code", "1.3.0");
|
||||||
|
|
||||||
|
|
||||||
return clientParams;
|
return clientParams;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Default Headers for HTTP-Request
|
* Default Headers for HTTP-Request
|
||||||
*/
|
*/
|
||||||
@@ -167,6 +154,4 @@ public class LiveClientSettings {
|
|||||||
headers.put("Accept-Language", "en-US,en; q=0.9");
|
headers.put("Accept-Language", "en-US,en; q=0.9");
|
||||||
return headers;
|
return headers;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -87,6 +87,7 @@ public class ProxyClientSettings implements Iterator<ProxyData>
|
|||||||
@Override
|
@Override
|
||||||
public void remove() {
|
public void remove() {
|
||||||
proxyList.remove(index);
|
proxyList.remove(index);
|
||||||
|
lastSuccess = false; // index is no longer valid and lastSuccess needs falsified
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setIndex(int index) {
|
public void setIndex(int index) {
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>TikTokLiveJava</artifactId>
|
<artifactId>TikTokLiveJava</artifactId>
|
||||||
<groupId>io.github.jwdeveloper.tiktok</groupId>
|
<groupId>io.github.jwdeveloper.tiktok</groupId>
|
||||||
<version>1.0.17-Release</version>
|
<version>1.1.0-Release</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ import io.github.jwdeveloper.tiktok.*;
|
|||||||
import io.github.jwdeveloper.tiktok.data.dto.ProxyData;
|
import io.github.jwdeveloper.tiktok.data.dto.ProxyData;
|
||||||
import io.github.jwdeveloper.tiktok.data.requests.LiveConnectionData;
|
import io.github.jwdeveloper.tiktok.data.requests.LiveConnectionData;
|
||||||
import io.github.jwdeveloper.tiktok.data.settings.*;
|
import io.github.jwdeveloper.tiktok.data.settings.*;
|
||||||
import io.github.jwdeveloper.tiktok.exceptions.TikTokLiveException;
|
import io.github.jwdeveloper.tiktok.exceptions.*;
|
||||||
import io.github.jwdeveloper.tiktok.live.LiveClient;
|
import io.github.jwdeveloper.tiktok.live.LiveClient;
|
||||||
import org.java_websocket.client.WebSocketClient;
|
import org.java_websocket.client.WebSocketClient;
|
||||||
|
|
||||||
@@ -41,7 +41,7 @@ public class TikTokWebSocketClient implements SocketClient {
|
|||||||
private final TikTokLiveEventHandler tikTokEventHandler;
|
private final TikTokLiveEventHandler tikTokEventHandler;
|
||||||
private WebSocketClient webSocketClient;
|
private WebSocketClient webSocketClient;
|
||||||
|
|
||||||
private TikTokWebSocketPingingTask pingingTask;
|
private final TikTokWebSocketPingingTask pingingTask;
|
||||||
private boolean isConnected;
|
private boolean isConnected;
|
||||||
|
|
||||||
public TikTokWebSocketClient(
|
public TikTokWebSocketClient(
|
||||||
@@ -91,6 +91,20 @@ public class TikTokWebSocketClient implements SocketClient {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void connectProxy(ProxyClientSettings proxySettings) {
|
public void connectProxy(ProxyClientSettings proxySettings) {
|
||||||
|
try {
|
||||||
|
if (proxySettings.getType() == Proxy.Type.SOCKS) {
|
||||||
|
SSLContext sc = SSLContext.getInstance("SSL");
|
||||||
|
sc.init(null, new TrustManager[]{new X509TrustManager() {
|
||||||
|
public void checkClientTrusted(X509Certificate[] x509Certificates, String s) {}
|
||||||
|
public void checkServerTrusted(X509Certificate[] x509Certificates, String s) {}
|
||||||
|
public X509Certificate[] getAcceptedIssuers() { return null; }
|
||||||
|
}}, null);
|
||||||
|
webSocketClient.setSocketFactory(sc.getSocketFactory());
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
// This will never be thrown.
|
||||||
|
throw new TikTokProxyRequestException("Unable to set Socks proxy SSL instance");
|
||||||
|
}
|
||||||
while (proxySettings.hasNext()) {
|
while (proxySettings.hasNext()) {
|
||||||
ProxyData proxyData = proxySettings.next();
|
ProxyData proxyData = proxySettings.next();
|
||||||
if (!tryProxyConnection(proxySettings, proxyData)) {
|
if (!tryProxyConnection(proxySettings, proxyData)) {
|
||||||
@@ -98,6 +112,7 @@ public class TikTokWebSocketClient implements SocketClient {
|
|||||||
proxySettings.remove();
|
proxySettings.remove();
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
pingingTask.run(webSocketClient);
|
||||||
isConnected = true;
|
isConnected = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -107,21 +122,6 @@ public class TikTokWebSocketClient implements SocketClient {
|
|||||||
|
|
||||||
public boolean tryProxyConnection(ProxyClientSettings proxySettings, ProxyData proxyData) {
|
public boolean tryProxyConnection(ProxyClientSettings proxySettings, ProxyData proxyData) {
|
||||||
try {
|
try {
|
||||||
if (proxySettings.getType() == Proxy.Type.SOCKS) {
|
|
||||||
SSLContext sc = SSLContext.getInstance("SSL");
|
|
||||||
sc.init(null, new TrustManager[]{new X509TrustManager() {
|
|
||||||
public void checkClientTrusted(X509Certificate[] x509Certificates, String s) {
|
|
||||||
}
|
|
||||||
|
|
||||||
public void checkServerTrusted(X509Certificate[] x509Certificates, String s) {
|
|
||||||
}
|
|
||||||
|
|
||||||
public X509Certificate[] getAcceptedIssuers() {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}}, null);
|
|
||||||
webSocketClient.setSocketFactory(sc.getSocketFactory());
|
|
||||||
}
|
|
||||||
webSocketClient.setProxy(new Proxy(proxySettings.getType(), proxyData.toSocketAddress()));
|
webSocketClient.setProxy(new Proxy(proxySettings.getType(), proxyData.toSocketAddress()));
|
||||||
webSocketClient.connect();
|
webSocketClient.connect();
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -11,14 +11,10 @@ public class TikTokWebSocketPingingTask
|
|||||||
private final int MIN_TIMEOUT = 250;
|
private final int MIN_TIMEOUT = 250;
|
||||||
private final int MAX_TIMEOUT = 500;
|
private final int MAX_TIMEOUT = 500;
|
||||||
|
|
||||||
|
|
||||||
public void run(WebSocket webSocket)
|
public void run(WebSocket webSocket)
|
||||||
{
|
{
|
||||||
stop();
|
stop();
|
||||||
thread = new Thread(() ->
|
thread = new Thread(() -> pingTask(webSocket));
|
||||||
{
|
|
||||||
pingTask(webSocket);
|
|
||||||
});
|
|
||||||
isRunning = true;
|
isRunning = true;
|
||||||
thread.start();
|
thread.start();
|
||||||
}
|
}
|
||||||
@@ -26,9 +22,7 @@ public class TikTokWebSocketPingingTask
|
|||||||
public void stop()
|
public void stop()
|
||||||
{
|
{
|
||||||
if (thread != null)
|
if (thread != null)
|
||||||
{
|
|
||||||
thread.interrupt();
|
thread.interrupt();
|
||||||
}
|
|
||||||
isRunning = false;
|
isRunning = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -36,12 +30,9 @@ public class TikTokWebSocketPingingTask
|
|||||||
private void pingTask(WebSocket webSocket)
|
private void pingTask(WebSocket webSocket)
|
||||||
{
|
{
|
||||||
var random = new Random();
|
var random = new Random();
|
||||||
while (isRunning)
|
while (isRunning) {
|
||||||
{
|
try {
|
||||||
try
|
if (!webSocket.isOpen()) {
|
||||||
{
|
|
||||||
if(!webSocket.isOpen())
|
|
||||||
{
|
|
||||||
Thread.sleep(100);
|
Thread.sleep(100);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@@ -50,8 +41,7 @@ public class TikTokWebSocketPingingTask
|
|||||||
var timeout = random.nextInt(MAX_TIMEOUT)+MIN_TIMEOUT;
|
var timeout = random.nextInt(MAX_TIMEOUT)+MIN_TIMEOUT;
|
||||||
Thread.sleep(timeout);
|
Thread.sleep(timeout);
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e) {
|
||||||
{
|
|
||||||
isRunning = false;
|
isRunning = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -41,7 +41,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>TikTokLiveJava</artifactId>
|
<artifactId>TikTokLiveJava</artifactId>
|
||||||
<groupId>io.github.jwdeveloper.tiktok</groupId>
|
<groupId>io.github.jwdeveloper.tiktok</groupId>
|
||||||
<version>1.0.17-Release</version>
|
<version>1.1.0-Release</version>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
@@ -63,13 +63,19 @@
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>io.github.jwdeveloper.tiktok</groupId>
|
<groupId>io.github.jwdeveloper.tiktok</groupId>
|
||||||
<artifactId>extension-collector</artifactId>
|
<artifactId>extension-collector</artifactId>
|
||||||
<version>1.0.14-Release</version>
|
<version>${project.version}</version>
|
||||||
<scope>compile</scope>
|
<scope>compile</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>io.github.jwdeveloper.tiktok</groupId>
|
<groupId>io.github.jwdeveloper.tiktok</groupId>
|
||||||
<artifactId>extension-recorder</artifactId>
|
<artifactId>extension-recorder</artifactId>
|
||||||
<version>1.0.14-Release</version>
|
<version>${project.version}</version>
|
||||||
|
<scope>compile</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>io.github.jwdeveloper.tiktok</groupId>
|
||||||
|
<artifactId>extension-collector</artifactId>
|
||||||
|
<version>1.1.0-Release</version>
|
||||||
<scope>compile</scope>
|
<scope>compile</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|||||||
@@ -22,9 +22,10 @@
|
|||||||
*/
|
*/
|
||||||
package io.github.jwdeveloper.tiktok;
|
package io.github.jwdeveloper.tiktok;
|
||||||
|
|
||||||
import io.github.jwdeveloper.tiktok.extension.collector.TikTokLiveCollector;
|
|
||||||
|
|
||||||
|
|
||||||
|
import io.github.jwdeveloper.tiktok.extension.collector.TikTokLiveCollector;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
@@ -48,7 +49,7 @@ public class CollectorExample {
|
|||||||
collector.connectDatabase();
|
collector.connectDatabase();
|
||||||
|
|
||||||
var users = List.of("tehila_723", "dino123597", "domaxyzx", "dash4214", "obserwacje_live");
|
var users = List.of("tehila_723", "dino123597", "domaxyzx", "dash4214", "obserwacje_live");
|
||||||
var sessionTag = "Dupa";
|
var sessionTag = "Tag1";
|
||||||
for (var user : users) {
|
for (var user : users) {
|
||||||
TikTokLive.newClient(user)
|
TikTokLive.newClient(user)
|
||||||
.configure(liveClientSettings ->
|
.configure(liveClientSettings ->
|
||||||
|
|||||||
444
README.md
444
README.md
@@ -29,8 +29,7 @@ A Java library inspired by [TikTokLive](https://github.com/isaackogan/TikTokLive
|
|||||||
The library includes a wrapper that connects to the WebCast service using just the username (`uniqueId`). This allows you to connect to your own live chat as well as the live chat of other streamers.
|
The library includes a wrapper that connects to the WebCast service using just the username (`uniqueId`). This allows you to connect to your own live chat as well as the live chat of other streamers.
|
||||||
No credentials are required. Events such as [Members Joining](#member), [Gifts](#gift), [Subscriptions](#subscribe), [Viewers](#roomuser), [Follows](#social), [Shares](#social), [Questions](#questionnew), [Likes](#like) and [Battles](#linkmicbattle) can be tracked.
|
No credentials are required. Events such as [Members Joining](#member), [Gifts](#gift), [Subscriptions](#subscribe), [Viewers](#roomuser), [Follows](#social), [Shares](#social), [Questions](#questionnew), [Likes](#like) and [Battles](#linkmicbattle) can be tracked.
|
||||||
|
|
||||||
# Contributors
|
|
||||||
[Library documentation for contributors](https://github.com/jwdeveloper/TikTokLiveJava/wiki)
|
|
||||||
|
|
||||||
<div align="center">
|
<div align="center">
|
||||||
<a href="https://www.youtube.com/watch?v=eerWGgUKc6c" align="right" target="blank"><img src="https://img.youtube.com/vi/eerWGgUKc6c/hqdefault.jpg" alt="IMAGE ALT TEXT" width="38%" align="right"></a>
|
<a href="https://www.youtube.com/watch?v=eerWGgUKc6c" align="right" target="blank"><img src="https://img.youtube.com/vi/eerWGgUKc6c/hqdefault.jpg" alt="IMAGE ALT TEXT" width="38%" align="right"></a>
|
||||||
@@ -50,6 +49,7 @@ Do you prefer other programming languages?
|
|||||||
#### Overview
|
#### Overview
|
||||||
- [Getting started](#getting-started)
|
- [Getting started](#getting-started)
|
||||||
- [Events](#events)
|
- [Events](#events)
|
||||||
|
- [Extensions](#extensions)
|
||||||
- [Listeners](#listeners)
|
- [Listeners](#listeners)
|
||||||
- [Contributing](#contributing)
|
- [Contributing](#contributing)
|
||||||
|
|
||||||
@@ -70,7 +70,7 @@ Maven
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.github.jwdeveloper.TikTok-Live-Java</groupId>
|
<groupId>com.github.jwdeveloper.TikTok-Live-Java</groupId>
|
||||||
<artifactId>Client</artifactId>
|
<artifactId>Client</artifactId>
|
||||||
<version>1.0.16-Release</version>
|
<version>1.1.0-Release</version>
|
||||||
<scope>compile</scope>
|
<scope>compile</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
@@ -87,7 +87,7 @@ dependencyResolutionManagement {
|
|||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
implementation 'com.github.jwdeveloper.TikTok-Live-Java:Client:1.0.16-Release'
|
implementation 'com.github.jwdeveloper.TikTok-Live-Java:Client:1.1.0-Release'
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -166,37 +166,79 @@ TikTokLive.newClient("bangbetmenygy")
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## Events
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
**Control**:
|
**Control**:
|
||||||
|
|
||||||
- [onConnected](#onconnected-tiktokconnectedevent)
|
|
||||||
- [onDisconnected](#ondisconnected-tiktokdisconnectedevent)
|
|
||||||
- [onReconnecting](#onreconnecting-tiktokreconnectingevent)
|
- [onReconnecting](#onreconnecting-tiktokreconnectingevent)
|
||||||
- [onError](#onerror-tiktokerrorevent)
|
- [onError](#onerror-tiktokerrorevent)
|
||||||
|
- [onConnected](#onconnected-tiktokconnectedevent)
|
||||||
|
- [onDisconnected](#ondisconnected-tiktokdisconnectedevent)
|
||||||
|
|
||||||
**Message**:
|
**Message**:
|
||||||
|
|
||||||
- [onEvent](#onevent-tiktokevent)
|
- [onEvent](#onevent-tiktokevent)
|
||||||
- [onSubscribe](#onsubscribe-tiktoksubscribeevent)
|
- [onEvent](#onevent-tiktokevent)
|
||||||
- [onQuestion](#onquestion-tiktokquestionevent)
|
|
||||||
- [onFollow](#onfollow-tiktokfollowevent)
|
|
||||||
- [onLike](#onlike-tiktoklikeevent)
|
|
||||||
- [onLiveEnded](#onliveended-tiktokliveendedevent)
|
|
||||||
- [onRoomInfo](#onroominfo-tiktokroominfoevent)
|
|
||||||
- [onShare](#onshare-tiktokshareevent)
|
|
||||||
- [onGiftCombo](#ongiftcombo-tiktokgiftcomboevent)
|
|
||||||
- [onEmote](#onemote-tiktokemoteevent)
|
|
||||||
- [onGift](#ongift-tiktokgiftevent)
|
|
||||||
- [onComment](#oncomment-tiktokcommentevent)
|
- [onComment](#oncomment-tiktokcommentevent)
|
||||||
- [onLivePaused](#onlivepaused-tiktoklivepausedevent)
|
- [onRoomInfo](#onroominfo-tiktokroominfoevent)
|
||||||
|
- [onGift](#ongift-tiktokgiftevent)
|
||||||
|
- [onSubscribe](#onsubscribe-tiktoksubscribeevent)
|
||||||
|
- [onFollow](#onfollow-tiktokfollowevent)
|
||||||
|
- [onGiftCombo](#ongiftcombo-tiktokgiftcomboevent)
|
||||||
|
- [onLiveEnded](#onliveended-tiktokliveendedevent)
|
||||||
|
- [onQuestion](#onquestion-tiktokquestionevent)
|
||||||
|
- [onShare](#onshare-tiktokshareevent)
|
||||||
- [onLiveUnpaused](#onliveunpaused-tiktokliveunpausedevent)
|
- [onLiveUnpaused](#onliveunpaused-tiktokliveunpausedevent)
|
||||||
|
- [onEmote](#onemote-tiktokemoteevent)
|
||||||
- [onJoin](#onjoin-tiktokjoinevent)
|
- [onJoin](#onjoin-tiktokjoinevent)
|
||||||
|
- [onLike](#onlike-tiktoklikeevent)
|
||||||
|
- [onLivePaused](#onlivepaused-tiktoklivepausedevent)
|
||||||
|
|
||||||
**Debug**:
|
**Debug**:
|
||||||
|
|
||||||
- [onWebsocketUnhandledMessage](#onwebsocketunhandledmessage-tiktokwebsocketunhandledmessageevent)
|
|
||||||
- [onWebsocketResponse](#onwebsocketresponse-tiktokwebsocketresponseevent)
|
- [onWebsocketResponse](#onwebsocketresponse-tiktokwebsocketresponseevent)
|
||||||
|
- [onWebsocketUnhandledMessage](#onwebsocketunhandledmessage-tiktokwebsocketunhandledmessageevent)
|
||||||
|
- [onHttpResponse](#onhttpresponse-tiktokhttpresponseevent)
|
||||||
- [onWebsocketMessage](#onwebsocketmessage-tiktokwebsocketmessageevent)
|
- [onWebsocketMessage](#onwebsocketmessage-tiktokwebsocketmessageevent)
|
||||||
# Examples
|
# Examples
|
||||||
|
<br>
|
||||||
|
|
||||||
|
## onReconnecting [TikTokReconnectingEvent](https://github.com/jwdeveloper/TikTokLiveJava/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/TikTokReconnectingEvent.java)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
```java
|
||||||
|
TikTokLive.newClient("host-name")
|
||||||
|
.onReconnecting((liveClient, event) ->
|
||||||
|
{
|
||||||
|
|
||||||
|
})
|
||||||
|
.buildAndConnect();
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<br>
|
||||||
|
|
||||||
|
## onError [TikTokErrorEvent](https://github.com/jwdeveloper/TikTokLiveJava/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/TikTokErrorEvent.java)
|
||||||
|
|
||||||
|
|
||||||
|
General error event. You should handle this.
|
||||||
|
|
||||||
|
|
||||||
|
```java
|
||||||
|
TikTokLive.newClient("host-name")
|
||||||
|
.onError((liveClient, event) ->
|
||||||
|
{
|
||||||
|
|
||||||
|
})
|
||||||
|
.buildAndConnect();
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<br>
|
<br>
|
||||||
|
|
||||||
## onConnected [TikTokConnectedEvent](https://github.com/jwdeveloper/TikTokLiveJava/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/TikTokConnectedEvent.java)
|
## onConnected [TikTokConnectedEvent](https://github.com/jwdeveloper/TikTokLiveJava/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/TikTokConnectedEvent.java)
|
||||||
@@ -238,32 +280,15 @@ TikTokLive.newClient("host-name")
|
|||||||
|
|
||||||
<br>
|
<br>
|
||||||
|
|
||||||
## onReconnecting [TikTokReconnectingEvent](https://github.com/jwdeveloper/TikTokLiveJava/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/TikTokReconnectingEvent.java)
|
## onEvent [TikTokEvent](https://github.com/jwdeveloper/TikTokLiveJava/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/common/TikTokEvent.java)
|
||||||
|
|
||||||
|
|
||||||
|
Base class for all events
|
||||||
```java
|
|
||||||
TikTokLive.newClient("host-name")
|
|
||||||
.onReconnecting((liveClient, event) ->
|
|
||||||
{
|
|
||||||
|
|
||||||
})
|
|
||||||
.buildAndConnect();
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<br>
|
|
||||||
|
|
||||||
## onError [TikTokErrorEvent](https://github.com/jwdeveloper/TikTokLiveJava/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/TikTokErrorEvent.java)
|
|
||||||
|
|
||||||
|
|
||||||
General error event. You should handle this.
|
|
||||||
|
|
||||||
|
|
||||||
```java
|
```java
|
||||||
TikTokLive.newClient("host-name")
|
TikTokLive.newClient("host-name")
|
||||||
.onError((liveClient, event) ->
|
.onEvent((liveClient, event) ->
|
||||||
{
|
{
|
||||||
|
|
||||||
})
|
})
|
||||||
@@ -293,91 +318,15 @@ TikTokLive.newClient("host-name")
|
|||||||
|
|
||||||
<br>
|
<br>
|
||||||
|
|
||||||
## onSubscribe [TikTokSubscribeEvent](https://github.com/jwdeveloper/TikTokLiveJava/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/TikTokSubscribeEvent.java)
|
## onComment [TikTokCommentEvent](https://github.com/jwdeveloper/TikTokLiveJava/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/TikTokCommentEvent.java)
|
||||||
|
|
||||||
|
|
||||||
Triggers when a user creates a subscription.
|
Triggered every time a new chat comment arrives.
|
||||||
|
|
||||||
|
|
||||||
```java
|
```java
|
||||||
TikTokLive.newClient("host-name")
|
TikTokLive.newClient("host-name")
|
||||||
.onSubscribe((liveClient, event) ->
|
.onComment((liveClient, event) ->
|
||||||
{
|
|
||||||
|
|
||||||
})
|
|
||||||
.buildAndConnect();
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<br>
|
|
||||||
|
|
||||||
## onQuestion [TikTokQuestionEvent](https://github.com/jwdeveloper/TikTokLiveJava/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/TikTokQuestionEvent.java)
|
|
||||||
|
|
||||||
|
|
||||||
Triggered every time someone asks a new question via the question feature.
|
|
||||||
|
|
||||||
|
|
||||||
```java
|
|
||||||
TikTokLive.newClient("host-name")
|
|
||||||
.onQuestion((liveClient, event) ->
|
|
||||||
{
|
|
||||||
|
|
||||||
})
|
|
||||||
.buildAndConnect();
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<br>
|
|
||||||
|
|
||||||
## onFollow [TikTokFollowEvent](https://github.com/jwdeveloper/TikTokLiveJava/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/social/TikTokFollowEvent.java)
|
|
||||||
|
|
||||||
|
|
||||||
Triggers when a user follows the streamer. Based on social event.
|
|
||||||
|
|
||||||
|
|
||||||
```java
|
|
||||||
TikTokLive.newClient("host-name")
|
|
||||||
.onFollow((liveClient, event) ->
|
|
||||||
{
|
|
||||||
|
|
||||||
})
|
|
||||||
.buildAndConnect();
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<br>
|
|
||||||
|
|
||||||
## onLike [TikTokLikeEvent](https://github.com/jwdeveloper/TikTokLiveJava/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/social/TikTokLikeEvent.java)
|
|
||||||
|
|
||||||
|
|
||||||
Triggered when a viewer sends likes to the streamer. For streams with many viewers, this event is not always triggered by TikTok.
|
|
||||||
|
|
||||||
|
|
||||||
```java
|
|
||||||
TikTokLive.newClient("host-name")
|
|
||||||
.onLike((liveClient, event) ->
|
|
||||||
{
|
|
||||||
|
|
||||||
})
|
|
||||||
.buildAndConnect();
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<br>
|
|
||||||
|
|
||||||
## onLiveEnded [TikTokLiveEndedEvent](https://github.com/jwdeveloper/TikTokLiveJava/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/TikTokLiveEndedEvent.java)
|
|
||||||
|
|
||||||
|
|
||||||
Triggered when the live stream gets terminated by the host. Will also trigger the TikTokDisconnectedEvent event.
|
|
||||||
|
|
||||||
|
|
||||||
```java
|
|
||||||
TikTokLive.newClient("host-name")
|
|
||||||
.onLiveEnded((liveClient, event) ->
|
|
||||||
{
|
{
|
||||||
|
|
||||||
})
|
})
|
||||||
@@ -391,6 +340,8 @@ TikTokLive.newClient("host-name")
|
|||||||
## onRoomInfo [TikTokRoomInfoEvent](https://github.com/jwdeveloper/TikTokLiveJava/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/room/TikTokRoomInfoEvent.java)
|
## onRoomInfo [TikTokRoomInfoEvent](https://github.com/jwdeveloper/TikTokLiveJava/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/room/TikTokRoomInfoEvent.java)
|
||||||
|
|
||||||
|
|
||||||
|
Triggered when LiveRoomInfo got updated such as likes, viewers, ranking ....
|
||||||
|
|
||||||
|
|
||||||
```java
|
```java
|
||||||
TikTokLive.newClient("host-name")
|
TikTokLive.newClient("host-name")
|
||||||
@@ -403,73 +354,6 @@ TikTokLive.newClient("host-name")
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
<br>
|
|
||||||
|
|
||||||
## onShare [TikTokShareEvent](https://github.com/jwdeveloper/TikTokLiveJava/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/social/TikTokShareEvent.java)
|
|
||||||
|
|
||||||
|
|
||||||
Triggers when a user shares the stream. Based on social event.
|
|
||||||
|
|
||||||
|
|
||||||
```java
|
|
||||||
TikTokLive.newClient("host-name")
|
|
||||||
.onShare((liveClient, event) ->
|
|
||||||
{
|
|
||||||
|
|
||||||
})
|
|
||||||
.buildAndConnect();
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<br>
|
|
||||||
|
|
||||||
## onGiftCombo [TikTokGiftComboEvent](https://github.com/jwdeveloper/TikTokLiveJava/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/gift/TikTokGiftComboEvent.java)
|
|
||||||
|
|
||||||
|
|
||||||
Triggered every time gift is sent
|
|
||||||
|
|
||||||
@see GiftSendType it has 3 states
|
|
||||||
|
|
||||||
<p>Example when user sends gift with combo</p>
|
|
||||||
<p>>Combo: 1 -> comboState = GiftSendType.Begin</p>
|
|
||||||
<p>Combo: 4 -> comboState = GiftSendType.Active</p>
|
|
||||||
<p>Combo: 8 -> comboState = GiftSendType.Active</p>
|
|
||||||
<p>Combo: 12 -> comboState = GiftSendType.Finished</p>
|
|
||||||
|
|
||||||
Remember if comboState is Finished both TikTokGiftComboEvent and TikTokGiftEvent event gets triggered
|
|
||||||
|
|
||||||
|
|
||||||
```java
|
|
||||||
TikTokLive.newClient("host-name")
|
|
||||||
.onGiftCombo((liveClient, event) ->
|
|
||||||
{
|
|
||||||
|
|
||||||
})
|
|
||||||
.buildAndConnect();
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<br>
|
|
||||||
|
|
||||||
## onEmote [TikTokEmoteEvent](https://github.com/jwdeveloper/TikTokLiveJava/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/TikTokEmoteEvent.java)
|
|
||||||
|
|
||||||
|
|
||||||
Triggered every time a subscriber sends an emote (sticker).
|
|
||||||
|
|
||||||
|
|
||||||
```java
|
|
||||||
TikTokLive.newClient("host-name")
|
|
||||||
.onEmote((liveClient, event) ->
|
|
||||||
{
|
|
||||||
|
|
||||||
})
|
|
||||||
.buildAndConnect();
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<br>
|
<br>
|
||||||
|
|
||||||
## onGift [TikTokGiftEvent](https://github.com/jwdeveloper/TikTokLiveJava/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/gift/TikTokGiftEvent.java)
|
## onGift [TikTokGiftEvent](https://github.com/jwdeveloper/TikTokLiveJava/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/gift/TikTokGiftEvent.java)
|
||||||
@@ -493,15 +377,15 @@ TikTokLive.newClient("host-name")
|
|||||||
|
|
||||||
<br>
|
<br>
|
||||||
|
|
||||||
## onComment [TikTokCommentEvent](https://github.com/jwdeveloper/TikTokLiveJava/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/TikTokCommentEvent.java)
|
## onSubscribe [TikTokSubscribeEvent](https://github.com/jwdeveloper/TikTokLiveJava/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/TikTokSubscribeEvent.java)
|
||||||
|
|
||||||
|
|
||||||
Triggered every time a new chat comment arrives.
|
Triggers when a user creates a subscription.
|
||||||
|
|
||||||
|
|
||||||
```java
|
```java
|
||||||
TikTokLive.newClient("host-name")
|
TikTokLive.newClient("host-name")
|
||||||
.onComment((liveClient, event) ->
|
.onSubscribe((liveClient, event) ->
|
||||||
{
|
{
|
||||||
|
|
||||||
})
|
})
|
||||||
@@ -512,13 +396,101 @@ TikTokLive.newClient("host-name")
|
|||||||
|
|
||||||
<br>
|
<br>
|
||||||
|
|
||||||
## onLivePaused [TikTokLivePausedEvent](https://github.com/jwdeveloper/TikTokLiveJava/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/TikTokLivePausedEvent.java)
|
## onFollow [TikTokFollowEvent](https://github.com/jwdeveloper/TikTokLiveJava/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/social/TikTokFollowEvent.java)
|
||||||
|
|
||||||
|
|
||||||
|
Triggers when a user follows the streamer. Based on social event.
|
||||||
|
|
||||||
|
|
||||||
```java
|
```java
|
||||||
TikTokLive.newClient("host-name")
|
TikTokLive.newClient("host-name")
|
||||||
.onLivePaused((liveClient, event) ->
|
.onFollow((liveClient, event) ->
|
||||||
|
{
|
||||||
|
|
||||||
|
})
|
||||||
|
.buildAndConnect();
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<br>
|
||||||
|
|
||||||
|
## onGiftCombo [TikTokGiftComboEvent](https://github.com/jwdeveloper/TikTokLiveJava/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/gift/TikTokGiftComboEvent.java)
|
||||||
|
|
||||||
|
|
||||||
|
Triggered every time gift is sent
|
||||||
|
|
||||||
|
@see GiftSendType it has 3 states
|
||||||
|
|
||||||
|
<p>Example when user sends gift with combo</p>
|
||||||
|
<p>>Combo: 1 -> comboState = GiftSendType.Begin</p>
|
||||||
|
<p>Combo: 4 -> comboState = GiftSendType.Active</p>
|
||||||
|
<p>Combo: 8 -> comboState = GiftSendType.Active</p>
|
||||||
|
<p>Combo: 12 -> comboState = GiftSendType.Finsihed</p>
|
||||||
|
<p>
|
||||||
|
Remember if comboState is Finsihed both TikTokGiftComboEvent and TikTokGiftEvent event gets triggered
|
||||||
|
|
||||||
|
|
||||||
|
```java
|
||||||
|
TikTokLive.newClient("host-name")
|
||||||
|
.onGiftCombo((liveClient, event) ->
|
||||||
|
{
|
||||||
|
|
||||||
|
})
|
||||||
|
.buildAndConnect();
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<br>
|
||||||
|
|
||||||
|
## onLiveEnded [TikTokLiveEndedEvent](https://github.com/jwdeveloper/TikTokLiveJava/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/TikTokLiveEndedEvent.java)
|
||||||
|
|
||||||
|
|
||||||
|
Triggered when the live stream gets terminated by the host. Will also trigger the TikTokDisconnectedEvent event.
|
||||||
|
|
||||||
|
|
||||||
|
```java
|
||||||
|
TikTokLive.newClient("host-name")
|
||||||
|
.onLiveEnded((liveClient, event) ->
|
||||||
|
{
|
||||||
|
|
||||||
|
})
|
||||||
|
.buildAndConnect();
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<br>
|
||||||
|
|
||||||
|
## onQuestion [TikTokQuestionEvent](https://github.com/jwdeveloper/TikTokLiveJava/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/TikTokQuestionEvent.java)
|
||||||
|
|
||||||
|
|
||||||
|
Triggered every time someone asks a new question via the question feature.
|
||||||
|
|
||||||
|
|
||||||
|
```java
|
||||||
|
TikTokLive.newClient("host-name")
|
||||||
|
.onQuestion((liveClient, event) ->
|
||||||
|
{
|
||||||
|
|
||||||
|
})
|
||||||
|
.buildAndConnect();
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<br>
|
||||||
|
|
||||||
|
## onShare [TikTokShareEvent](https://github.com/jwdeveloper/TikTokLiveJava/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/social/TikTokShareEvent.java)
|
||||||
|
|
||||||
|
|
||||||
|
Triggers when a user shares the stream. Based on social event.
|
||||||
|
|
||||||
|
|
||||||
|
```java
|
||||||
|
TikTokLive.newClient("host-name")
|
||||||
|
.onShare((liveClient, event) ->
|
||||||
{
|
{
|
||||||
|
|
||||||
})
|
})
|
||||||
@@ -544,6 +516,25 @@ TikTokLive.newClient("host-name")
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<br>
|
||||||
|
|
||||||
|
## onEmote [TikTokEmoteEvent](https://github.com/jwdeveloper/TikTokLiveJava/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/TikTokEmoteEvent.java)
|
||||||
|
|
||||||
|
|
||||||
|
Triggered every time a subscriber sends an emote (sticker).
|
||||||
|
|
||||||
|
|
||||||
|
```java
|
||||||
|
TikTokLive.newClient("host-name")
|
||||||
|
.onEmote((liveClient, event) ->
|
||||||
|
{
|
||||||
|
|
||||||
|
})
|
||||||
|
.buildAndConnect();
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<br>
|
<br>
|
||||||
|
|
||||||
## onJoin [TikTokJoinEvent](https://github.com/jwdeveloper/TikTokLiveJava/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/social/TikTokJoinEvent.java)
|
## onJoin [TikTokJoinEvent](https://github.com/jwdeveloper/TikTokLiveJava/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/social/TikTokJoinEvent.java)
|
||||||
@@ -561,6 +552,59 @@ TikTokLive.newClient("host-name")
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<br>
|
||||||
|
|
||||||
|
## onLike [TikTokLikeEvent](https://github.com/jwdeveloper/TikTokLiveJava/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/social/TikTokLikeEvent.java)
|
||||||
|
|
||||||
|
|
||||||
|
Triggered when a viewer sends likes to the streamer. For streams with many viewers, this event is not always triggered by TikTok.
|
||||||
|
|
||||||
|
|
||||||
|
```java
|
||||||
|
TikTokLive.newClient("host-name")
|
||||||
|
.onLike((liveClient, event) ->
|
||||||
|
{
|
||||||
|
|
||||||
|
})
|
||||||
|
.buildAndConnect();
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<br>
|
||||||
|
|
||||||
|
## onLivePaused [TikTokLivePausedEvent](https://github.com/jwdeveloper/TikTokLiveJava/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/TikTokLivePausedEvent.java)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
```java
|
||||||
|
TikTokLive.newClient("host-name")
|
||||||
|
.onLivePaused((liveClient, event) ->
|
||||||
|
{
|
||||||
|
|
||||||
|
})
|
||||||
|
.buildAndConnect();
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<br>
|
||||||
|
|
||||||
|
## onWebsocketResponse [TikTokWebsocketResponseEvent](https://github.com/jwdeveloper/TikTokLiveJava/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/websocket/TikTokWebsocketResponseEvent.java)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
```java
|
||||||
|
TikTokLive.newClient("host-name")
|
||||||
|
.onWebsocketResponse((liveClient, event) ->
|
||||||
|
{
|
||||||
|
|
||||||
|
})
|
||||||
|
.buildAndConnect();
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<br>
|
<br>
|
||||||
|
|
||||||
## onWebsocketUnhandledMessage [TikTokWebsocketUnhandledMessageEvent](https://github.com/jwdeveloper/TikTokLiveJava/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/websocket/TikTokWebsocketUnhandledMessageEvent.java)
|
## onWebsocketUnhandledMessage [TikTokWebsocketUnhandledMessageEvent](https://github.com/jwdeveloper/TikTokLiveJava/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/websocket/TikTokWebsocketUnhandledMessageEvent.java)
|
||||||
@@ -582,13 +626,13 @@ TikTokLive.newClient("host-name")
|
|||||||
|
|
||||||
<br>
|
<br>
|
||||||
|
|
||||||
## onWebsocketResponse [TikTokWebsocketResponseEvent](https://github.com/jwdeveloper/TikTokLiveJava/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/websocket/TikTokWebsocketResponseEvent.java)
|
## onHttpResponse [TikTokHttpResponseEvent](https://github.com/jwdeveloper/TikTokLiveJava/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/http/TikTokHttpResponseEvent.java)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
```java
|
```java
|
||||||
TikTokLive.newClient("host-name")
|
TikTokLive.newClient("host-name")
|
||||||
.onWebsocketResponse((liveClient, event) ->
|
.onHttpResponse((liveClient, event) ->
|
||||||
{
|
{
|
||||||
|
|
||||||
})
|
})
|
||||||
@@ -602,7 +646,8 @@ TikTokLive.newClient("host-name")
|
|||||||
## onWebsocketMessage [TikTokWebsocketMessageEvent](https://github.com/jwdeveloper/TikTokLiveJava/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/websocket/TikTokWebsocketMessageEvent.java)
|
## onWebsocketMessage [TikTokWebsocketMessageEvent](https://github.com/jwdeveloper/TikTokLiveJava/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/websocket/TikTokWebsocketMessageEvent.java)
|
||||||
|
|
||||||
|
|
||||||
Triggered every time a protobuf encoded webcast message arrives. You can deserialize the binary object depending on the use case.
|
Triggered every time TikTok sends data. Data incoming as protobuf message.
|
||||||
|
You can deserialize the binary object depending on the use case.
|
||||||
|
|
||||||
|
|
||||||
```java
|
```java
|
||||||
@@ -618,8 +663,20 @@ TikTokLive.newClient("host-name")
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<br>
|
<br>
|
||||||
|
|
||||||
|
|
||||||
|
## Extensions
|
||||||
|
|
||||||
|
List of extensions (addons) to TiktokLiveJava
|
||||||
|
that will save your time
|
||||||
|
|
||||||
|
- [Video Recorder](https://github.com/jwdeveloper/TikTokLiveJava/tree/master/extension-recorder)
|
||||||
|
- [Live data collector to database](https://github.com/jwdeveloper/TikTokLiveJava/tree/master/extension-collector)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## Listeners
|
## Listeners
|
||||||
|
|
||||||
```java
|
```java
|
||||||
@@ -694,4 +751,7 @@ public static class CustomListener implements TikTokEventListener {
|
|||||||
|
|
||||||
|
|
||||||
## Contributing
|
## Contributing
|
||||||
|
|
||||||
|
[Library documentation for contributors](https://github.com/jwdeveloper/TikTokLiveJava/wiki)
|
||||||
|
|
||||||
Your improvements are welcome! Feel free to open an <a href="https://github.com/jwdeveloper/TikTok-Live-Java/issues">issue</a> or <a href="https://github.com/jwdeveloper/TikTok-Live-Java/pulls">pull request</a>.
|
Your improvements are welcome! Feel free to open an <a href="https://github.com/jwdeveloper/TikTok-Live-Java/issues">issue</a> or <a href="https://github.com/jwdeveloper/TikTok-Live-Java/pulls">pull request</a>.
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>TikTokLiveJava</artifactId>
|
<artifactId>TikTokLiveJava</artifactId>
|
||||||
<groupId>io.github.jwdeveloper.tiktok</groupId>
|
<groupId>io.github.jwdeveloper.tiktok</groupId>
|
||||||
<version>1.0.17-Release</version>
|
<version>1.1.0-Release</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>TikTokLiveJava</artifactId>
|
<artifactId>TikTokLiveJava</artifactId>
|
||||||
<groupId>io.github.jwdeveloper.tiktok</groupId>
|
<groupId>io.github.jwdeveloper.tiktok</groupId>
|
||||||
<version>1.0.17-Release</version>
|
<version>1.1.0-Release</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<artifactId>Tools-EventsWebViewer</artifactId>
|
<artifactId>Tools-EventsWebViewer</artifactId>
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>TikTokLiveJava</artifactId>
|
<artifactId>TikTokLiveJava</artifactId>
|
||||||
<groupId>io.github.jwdeveloper.tiktok</groupId>
|
<groupId>io.github.jwdeveloper.tiktok</groupId>
|
||||||
<version>1.0.17-Release</version>
|
<version>1.1.0-Release</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
|||||||
@@ -126,7 +126,6 @@ TikTokLive.newClient("bangbetmenygy")
|
|||||||
{
|
{
|
||||||
settings.setHostName("bangbetmenygy"); // This method is useful in case you want change hostname later
|
settings.setHostName("bangbetmenygy"); // This method is useful in case you want change hostname later
|
||||||
settings.setClientLanguage("en"); // Language
|
settings.setClientLanguage("en"); // Language
|
||||||
settings.setTimeout(Duration.ofSeconds(2)); // Connection timeout
|
|
||||||
settings.setLogLevel(Level.ALL); // Log level
|
settings.setLogLevel(Level.ALL); // Log level
|
||||||
settings.setPrintToConsole(true); // Printing all logs to console even if log level is Level.OFF
|
settings.setPrintToConsole(true); // Printing all logs to console even if log level is Level.OFF
|
||||||
settings.setRetryOnConnectionFailure(true); // Reconnecting if TikTok user is offline
|
settings.setRetryOnConnectionFailure(true); // Reconnecting if TikTok user is offline
|
||||||
@@ -152,35 +151,73 @@ TikTokLive.newClient("bangbetmenygy")
|
|||||||
|
|
||||||
**Control**:
|
**Control**:
|
||||||
|
|
||||||
- [onConnected](#onconnected-tiktokconnectedevent)
|
|
||||||
- [onDisconnected](#ondisconnected-tiktokdisconnectedevent)
|
|
||||||
- [onReconnecting](#onreconnecting-tiktokreconnectingevent)
|
- [onReconnecting](#onreconnecting-tiktokreconnectingevent)
|
||||||
- [onError](#onerror-tiktokerrorevent)
|
- [onError](#onerror-tiktokerrorevent)
|
||||||
|
- [onConnected](#onconnected-tiktokconnectedevent)
|
||||||
|
- [onDisconnected](#ondisconnected-tiktokdisconnectedevent)
|
||||||
|
|
||||||
**Message**:
|
**Message**:
|
||||||
|
|
||||||
- [onEvent](#onevent-tiktokevent)
|
- [onEvent](#onevent-tiktokevent)
|
||||||
- [onSubscribe](#onsubscribe-tiktoksubscribeevent)
|
- [onEvent](#onevent-tiktokevent)
|
||||||
- [onQuestion](#onquestion-tiktokquestionevent)
|
|
||||||
- [onFollow](#onfollow-tiktokfollowevent)
|
|
||||||
- [onLike](#onlike-tiktoklikeevent)
|
|
||||||
- [onLiveEnded](#onliveended-tiktokliveendedevent)
|
|
||||||
- [onRoomInfo](#onroominfo-tiktokroominfoevent)
|
|
||||||
- [onShare](#onshare-tiktokshareevent)
|
|
||||||
- [onGiftCombo](#ongiftcombo-tiktokgiftcomboevent)
|
|
||||||
- [onEmote](#onemote-tiktokemoteevent)
|
|
||||||
- [onGift](#ongift-tiktokgiftevent)
|
|
||||||
- [onComment](#oncomment-tiktokcommentevent)
|
- [onComment](#oncomment-tiktokcommentevent)
|
||||||
- [onLivePaused](#onlivepaused-tiktoklivepausedevent)
|
- [onRoomInfo](#onroominfo-tiktokroominfoevent)
|
||||||
|
- [onGift](#ongift-tiktokgiftevent)
|
||||||
|
- [onSubscribe](#onsubscribe-tiktoksubscribeevent)
|
||||||
|
- [onFollow](#onfollow-tiktokfollowevent)
|
||||||
|
- [onGiftCombo](#ongiftcombo-tiktokgiftcomboevent)
|
||||||
|
- [onLiveEnded](#onliveended-tiktokliveendedevent)
|
||||||
|
- [onQuestion](#onquestion-tiktokquestionevent)
|
||||||
|
- [onShare](#onshare-tiktokshareevent)
|
||||||
- [onLiveUnpaused](#onliveunpaused-tiktokliveunpausedevent)
|
- [onLiveUnpaused](#onliveunpaused-tiktokliveunpausedevent)
|
||||||
|
- [onEmote](#onemote-tiktokemoteevent)
|
||||||
- [onJoin](#onjoin-tiktokjoinevent)
|
- [onJoin](#onjoin-tiktokjoinevent)
|
||||||
|
- [onLike](#onlike-tiktoklikeevent)
|
||||||
|
- [onLivePaused](#onlivepaused-tiktoklivepausedevent)
|
||||||
|
|
||||||
**Debug**:
|
**Debug**:
|
||||||
|
|
||||||
- [onWebsocketUnhandledMessage](#onwebsocketunhandledmessage-tiktokwebsocketunhandledmessageevent)
|
|
||||||
- [onWebsocketResponse](#onwebsocketresponse-tiktokwebsocketresponseevent)
|
- [onWebsocketResponse](#onwebsocketresponse-tiktokwebsocketresponseevent)
|
||||||
|
- [onWebsocketUnhandledMessage](#onwebsocketunhandledmessage-tiktokwebsocketunhandledmessageevent)
|
||||||
|
- [onHttpResponse](#onhttpresponse-tiktokhttpresponseevent)
|
||||||
- [onWebsocketMessage](#onwebsocketmessage-tiktokwebsocketmessageevent)
|
- [onWebsocketMessage](#onwebsocketmessage-tiktokwebsocketmessageevent)
|
||||||
# Examples
|
# Examples
|
||||||
|
<br>
|
||||||
|
|
||||||
|
## onReconnecting [TikTokReconnectingEvent](https://github.com/jwdeveloper/TikTokLiveJava/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/TikTokReconnectingEvent.java)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
```java
|
||||||
|
TikTokLive.newClient("host-name")
|
||||||
|
.onReconnecting((liveClient, event) ->
|
||||||
|
{
|
||||||
|
|
||||||
|
})
|
||||||
|
.buildAndConnect();
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<br>
|
||||||
|
|
||||||
|
## onError [TikTokErrorEvent](https://github.com/jwdeveloper/TikTokLiveJava/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/TikTokErrorEvent.java)
|
||||||
|
|
||||||
|
|
||||||
|
General error event. You should handle this.
|
||||||
|
|
||||||
|
|
||||||
|
```java
|
||||||
|
TikTokLive.newClient("host-name")
|
||||||
|
.onError((liveClient, event) ->
|
||||||
|
{
|
||||||
|
|
||||||
|
})
|
||||||
|
.buildAndConnect();
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<br>
|
<br>
|
||||||
|
|
||||||
## onConnected [TikTokConnectedEvent](https://github.com/jwdeveloper/TikTokLiveJava/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/TikTokConnectedEvent.java)
|
## onConnected [TikTokConnectedEvent](https://github.com/jwdeveloper/TikTokLiveJava/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/TikTokConnectedEvent.java)
|
||||||
@@ -222,32 +259,15 @@ TikTokLive.newClient("host-name")
|
|||||||
|
|
||||||
<br>
|
<br>
|
||||||
|
|
||||||
## onReconnecting [TikTokReconnectingEvent](https://github.com/jwdeveloper/TikTokLiveJava/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/TikTokReconnectingEvent.java)
|
## onEvent [TikTokEvent](https://github.com/jwdeveloper/TikTokLiveJava/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/common/TikTokEvent.java)
|
||||||
|
|
||||||
|
|
||||||
|
Base class for all events
|
||||||
```java
|
|
||||||
TikTokLive.newClient("host-name")
|
|
||||||
.onReconnecting((liveClient, event) ->
|
|
||||||
{
|
|
||||||
|
|
||||||
})
|
|
||||||
.buildAndConnect();
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<br>
|
|
||||||
|
|
||||||
## onError [TikTokErrorEvent](https://github.com/jwdeveloper/TikTokLiveJava/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/TikTokErrorEvent.java)
|
|
||||||
|
|
||||||
|
|
||||||
General error event. You should handle this.
|
|
||||||
|
|
||||||
|
|
||||||
```java
|
```java
|
||||||
TikTokLive.newClient("host-name")
|
TikTokLive.newClient("host-name")
|
||||||
.onError((liveClient, event) ->
|
.onEvent((liveClient, event) ->
|
||||||
{
|
{
|
||||||
|
|
||||||
})
|
})
|
||||||
@@ -277,91 +297,15 @@ TikTokLive.newClient("host-name")
|
|||||||
|
|
||||||
<br>
|
<br>
|
||||||
|
|
||||||
## onSubscribe [TikTokSubscribeEvent](https://github.com/jwdeveloper/TikTokLiveJava/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/TikTokSubscribeEvent.java)
|
## onComment [TikTokCommentEvent](https://github.com/jwdeveloper/TikTokLiveJava/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/TikTokCommentEvent.java)
|
||||||
|
|
||||||
|
|
||||||
Triggers when a user creates a subscription.
|
Triggered every time a new chat comment arrives.
|
||||||
|
|
||||||
|
|
||||||
```java
|
```java
|
||||||
TikTokLive.newClient("host-name")
|
TikTokLive.newClient("host-name")
|
||||||
.onSubscribe((liveClient, event) ->
|
.onComment((liveClient, event) ->
|
||||||
{
|
|
||||||
|
|
||||||
})
|
|
||||||
.buildAndConnect();
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<br>
|
|
||||||
|
|
||||||
## onQuestion [TikTokQuestionEvent](https://github.com/jwdeveloper/TikTokLiveJava/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/TikTokQuestionEvent.java)
|
|
||||||
|
|
||||||
|
|
||||||
Triggered every time someone asks a new question via the question feature.
|
|
||||||
|
|
||||||
|
|
||||||
```java
|
|
||||||
TikTokLive.newClient("host-name")
|
|
||||||
.onQuestion((liveClient, event) ->
|
|
||||||
{
|
|
||||||
|
|
||||||
})
|
|
||||||
.buildAndConnect();
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<br>
|
|
||||||
|
|
||||||
## onFollow [TikTokFollowEvent](https://github.com/jwdeveloper/TikTokLiveJava/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/social/TikTokFollowEvent.java)
|
|
||||||
|
|
||||||
|
|
||||||
Triggers when a user follows the streamer. Based on social event.
|
|
||||||
|
|
||||||
|
|
||||||
```java
|
|
||||||
TikTokLive.newClient("host-name")
|
|
||||||
.onFollow((liveClient, event) ->
|
|
||||||
{
|
|
||||||
|
|
||||||
})
|
|
||||||
.buildAndConnect();
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<br>
|
|
||||||
|
|
||||||
## onLike [TikTokLikeEvent](https://github.com/jwdeveloper/TikTokLiveJava/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/social/TikTokLikeEvent.java)
|
|
||||||
|
|
||||||
|
|
||||||
Triggered when a viewer sends likes to the streamer. For streams with many viewers, this event is not always triggered by TikTok.
|
|
||||||
|
|
||||||
|
|
||||||
```java
|
|
||||||
TikTokLive.newClient("host-name")
|
|
||||||
.onLike((liveClient, event) ->
|
|
||||||
{
|
|
||||||
|
|
||||||
})
|
|
||||||
.buildAndConnect();
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<br>
|
|
||||||
|
|
||||||
## onLiveEnded [TikTokLiveEndedEvent](https://github.com/jwdeveloper/TikTokLiveJava/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/TikTokLiveEndedEvent.java)
|
|
||||||
|
|
||||||
|
|
||||||
Triggered when the live stream gets terminated by the host. Will also trigger the TikTokDisconnectedEvent event.
|
|
||||||
|
|
||||||
|
|
||||||
```java
|
|
||||||
TikTokLive.newClient("host-name")
|
|
||||||
.onLiveEnded((liveClient, event) ->
|
|
||||||
{
|
{
|
||||||
|
|
||||||
})
|
})
|
||||||
@@ -375,6 +319,8 @@ TikTokLive.newClient("host-name")
|
|||||||
## onRoomInfo [TikTokRoomInfoEvent](https://github.com/jwdeveloper/TikTokLiveJava/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/room/TikTokRoomInfoEvent.java)
|
## onRoomInfo [TikTokRoomInfoEvent](https://github.com/jwdeveloper/TikTokLiveJava/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/room/TikTokRoomInfoEvent.java)
|
||||||
|
|
||||||
|
|
||||||
|
Triggered when LiveRoomInfo got updated such as likes, viewers, ranking ....
|
||||||
|
|
||||||
|
|
||||||
```java
|
```java
|
||||||
TikTokLive.newClient("host-name")
|
TikTokLive.newClient("host-name")
|
||||||
@@ -387,73 +333,6 @@ TikTokLive.newClient("host-name")
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
<br>
|
|
||||||
|
|
||||||
## onShare [TikTokShareEvent](https://github.com/jwdeveloper/TikTokLiveJava/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/social/TikTokShareEvent.java)
|
|
||||||
|
|
||||||
|
|
||||||
Triggers when a user shares the stream. Based on social event.
|
|
||||||
|
|
||||||
|
|
||||||
```java
|
|
||||||
TikTokLive.newClient("host-name")
|
|
||||||
.onShare((liveClient, event) ->
|
|
||||||
{
|
|
||||||
|
|
||||||
})
|
|
||||||
.buildAndConnect();
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<br>
|
|
||||||
|
|
||||||
## onGiftCombo [TikTokGiftComboEvent](https://github.com/jwdeveloper/TikTokLiveJava/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/gift/TikTokGiftComboEvent.java)
|
|
||||||
|
|
||||||
|
|
||||||
Triggered every time gift is sent
|
|
||||||
|
|
||||||
@see GiftSendType it has 3 states
|
|
||||||
|
|
||||||
<p>Example when user sends gift with combo</p>
|
|
||||||
<p>>Combo: 1 -> comboState = GiftSendType.Begin</p>
|
|
||||||
<p>Combo: 4 -> comboState = GiftSendType.Active</p>
|
|
||||||
<p>Combo: 8 -> comboState = GiftSendType.Active</p>
|
|
||||||
<p>Combo: 12 -> comboState = GiftSendType.Finsihed</p>
|
|
||||||
|
|
||||||
Remember if comboState is Finsihed both TikTokGiftComboEvent and TikTokGiftEvent event gets triggered
|
|
||||||
|
|
||||||
|
|
||||||
```java
|
|
||||||
TikTokLive.newClient("host-name")
|
|
||||||
.onGiftCombo((liveClient, event) ->
|
|
||||||
{
|
|
||||||
|
|
||||||
})
|
|
||||||
.buildAndConnect();
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<br>
|
|
||||||
|
|
||||||
## onEmote [TikTokEmoteEvent](https://github.com/jwdeveloper/TikTokLiveJava/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/TikTokEmoteEvent.java)
|
|
||||||
|
|
||||||
|
|
||||||
Triggered every time a subscriber sends an emote (sticker).
|
|
||||||
|
|
||||||
|
|
||||||
```java
|
|
||||||
TikTokLive.newClient("host-name")
|
|
||||||
.onEmote((liveClient, event) ->
|
|
||||||
{
|
|
||||||
|
|
||||||
})
|
|
||||||
.buildAndConnect();
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<br>
|
<br>
|
||||||
|
|
||||||
## onGift [TikTokGiftEvent](https://github.com/jwdeveloper/TikTokLiveJava/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/gift/TikTokGiftEvent.java)
|
## onGift [TikTokGiftEvent](https://github.com/jwdeveloper/TikTokLiveJava/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/gift/TikTokGiftEvent.java)
|
||||||
@@ -477,15 +356,15 @@ TikTokLive.newClient("host-name")
|
|||||||
|
|
||||||
<br>
|
<br>
|
||||||
|
|
||||||
## onComment [TikTokCommentEvent](https://github.com/jwdeveloper/TikTokLiveJava/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/TikTokCommentEvent.java)
|
## onSubscribe [TikTokSubscribeEvent](https://github.com/jwdeveloper/TikTokLiveJava/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/TikTokSubscribeEvent.java)
|
||||||
|
|
||||||
|
|
||||||
Triggered every time a new chat comment arrives.
|
Triggers when a user creates a subscription.
|
||||||
|
|
||||||
|
|
||||||
```java
|
```java
|
||||||
TikTokLive.newClient("host-name")
|
TikTokLive.newClient("host-name")
|
||||||
.onComment((liveClient, event) ->
|
.onSubscribe((liveClient, event) ->
|
||||||
{
|
{
|
||||||
|
|
||||||
})
|
})
|
||||||
@@ -496,13 +375,101 @@ TikTokLive.newClient("host-name")
|
|||||||
|
|
||||||
<br>
|
<br>
|
||||||
|
|
||||||
## onLivePaused [TikTokLivePausedEvent](https://github.com/jwdeveloper/TikTokLiveJava/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/TikTokLivePausedEvent.java)
|
## onFollow [TikTokFollowEvent](https://github.com/jwdeveloper/TikTokLiveJava/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/social/TikTokFollowEvent.java)
|
||||||
|
|
||||||
|
|
||||||
|
Triggers when a user follows the streamer. Based on social event.
|
||||||
|
|
||||||
|
|
||||||
```java
|
```java
|
||||||
TikTokLive.newClient("host-name")
|
TikTokLive.newClient("host-name")
|
||||||
.onLivePaused((liveClient, event) ->
|
.onFollow((liveClient, event) ->
|
||||||
|
{
|
||||||
|
|
||||||
|
})
|
||||||
|
.buildAndConnect();
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<br>
|
||||||
|
|
||||||
|
## onGiftCombo [TikTokGiftComboEvent](https://github.com/jwdeveloper/TikTokLiveJava/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/gift/TikTokGiftComboEvent.java)
|
||||||
|
|
||||||
|
|
||||||
|
Triggered every time gift is sent
|
||||||
|
|
||||||
|
@see GiftSendType it has 3 states
|
||||||
|
|
||||||
|
<p>Example when user sends gift with combo</p>
|
||||||
|
<p>>Combo: 1 -> comboState = GiftSendType.Begin</p>
|
||||||
|
<p>Combo: 4 -> comboState = GiftSendType.Active</p>
|
||||||
|
<p>Combo: 8 -> comboState = GiftSendType.Active</p>
|
||||||
|
<p>Combo: 12 -> comboState = GiftSendType.Finsihed</p>
|
||||||
|
<p>
|
||||||
|
Remember if comboState is Finsihed both TikTokGiftComboEvent and TikTokGiftEvent event gets triggered
|
||||||
|
|
||||||
|
|
||||||
|
```java
|
||||||
|
TikTokLive.newClient("host-name")
|
||||||
|
.onGiftCombo((liveClient, event) ->
|
||||||
|
{
|
||||||
|
|
||||||
|
})
|
||||||
|
.buildAndConnect();
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<br>
|
||||||
|
|
||||||
|
## onLiveEnded [TikTokLiveEndedEvent](https://github.com/jwdeveloper/TikTokLiveJava/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/TikTokLiveEndedEvent.java)
|
||||||
|
|
||||||
|
|
||||||
|
Triggered when the live stream gets terminated by the host. Will also trigger the TikTokDisconnectedEvent event.
|
||||||
|
|
||||||
|
|
||||||
|
```java
|
||||||
|
TikTokLive.newClient("host-name")
|
||||||
|
.onLiveEnded((liveClient, event) ->
|
||||||
|
{
|
||||||
|
|
||||||
|
})
|
||||||
|
.buildAndConnect();
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<br>
|
||||||
|
|
||||||
|
## onQuestion [TikTokQuestionEvent](https://github.com/jwdeveloper/TikTokLiveJava/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/TikTokQuestionEvent.java)
|
||||||
|
|
||||||
|
|
||||||
|
Triggered every time someone asks a new question via the question feature.
|
||||||
|
|
||||||
|
|
||||||
|
```java
|
||||||
|
TikTokLive.newClient("host-name")
|
||||||
|
.onQuestion((liveClient, event) ->
|
||||||
|
{
|
||||||
|
|
||||||
|
})
|
||||||
|
.buildAndConnect();
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<br>
|
||||||
|
|
||||||
|
## onShare [TikTokShareEvent](https://github.com/jwdeveloper/TikTokLiveJava/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/social/TikTokShareEvent.java)
|
||||||
|
|
||||||
|
|
||||||
|
Triggers when a user shares the stream. Based on social event.
|
||||||
|
|
||||||
|
|
||||||
|
```java
|
||||||
|
TikTokLive.newClient("host-name")
|
||||||
|
.onShare((liveClient, event) ->
|
||||||
{
|
{
|
||||||
|
|
||||||
})
|
})
|
||||||
@@ -528,6 +495,25 @@ TikTokLive.newClient("host-name")
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<br>
|
||||||
|
|
||||||
|
## onEmote [TikTokEmoteEvent](https://github.com/jwdeveloper/TikTokLiveJava/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/TikTokEmoteEvent.java)
|
||||||
|
|
||||||
|
|
||||||
|
Triggered every time a subscriber sends an emote (sticker).
|
||||||
|
|
||||||
|
|
||||||
|
```java
|
||||||
|
TikTokLive.newClient("host-name")
|
||||||
|
.onEmote((liveClient, event) ->
|
||||||
|
{
|
||||||
|
|
||||||
|
})
|
||||||
|
.buildAndConnect();
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<br>
|
<br>
|
||||||
|
|
||||||
## onJoin [TikTokJoinEvent](https://github.com/jwdeveloper/TikTokLiveJava/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/social/TikTokJoinEvent.java)
|
## onJoin [TikTokJoinEvent](https://github.com/jwdeveloper/TikTokLiveJava/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/social/TikTokJoinEvent.java)
|
||||||
@@ -545,6 +531,59 @@ TikTokLive.newClient("host-name")
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<br>
|
||||||
|
|
||||||
|
## onLike [TikTokLikeEvent](https://github.com/jwdeveloper/TikTokLiveJava/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/social/TikTokLikeEvent.java)
|
||||||
|
|
||||||
|
|
||||||
|
Triggered when a viewer sends likes to the streamer. For streams with many viewers, this event is not always triggered by TikTok.
|
||||||
|
|
||||||
|
|
||||||
|
```java
|
||||||
|
TikTokLive.newClient("host-name")
|
||||||
|
.onLike((liveClient, event) ->
|
||||||
|
{
|
||||||
|
|
||||||
|
})
|
||||||
|
.buildAndConnect();
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<br>
|
||||||
|
|
||||||
|
## onLivePaused [TikTokLivePausedEvent](https://github.com/jwdeveloper/TikTokLiveJava/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/TikTokLivePausedEvent.java)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
```java
|
||||||
|
TikTokLive.newClient("host-name")
|
||||||
|
.onLivePaused((liveClient, event) ->
|
||||||
|
{
|
||||||
|
|
||||||
|
})
|
||||||
|
.buildAndConnect();
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<br>
|
||||||
|
|
||||||
|
## onWebsocketResponse [TikTokWebsocketResponseEvent](https://github.com/jwdeveloper/TikTokLiveJava/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/websocket/TikTokWebsocketResponseEvent.java)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
```java
|
||||||
|
TikTokLive.newClient("host-name")
|
||||||
|
.onWebsocketResponse((liveClient, event) ->
|
||||||
|
{
|
||||||
|
|
||||||
|
})
|
||||||
|
.buildAndConnect();
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<br>
|
<br>
|
||||||
|
|
||||||
## onWebsocketUnhandledMessage [TikTokWebsocketUnhandledMessageEvent](https://github.com/jwdeveloper/TikTokLiveJava/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/websocket/TikTokWebsocketUnhandledMessageEvent.java)
|
## onWebsocketUnhandledMessage [TikTokWebsocketUnhandledMessageEvent](https://github.com/jwdeveloper/TikTokLiveJava/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/websocket/TikTokWebsocketUnhandledMessageEvent.java)
|
||||||
@@ -566,13 +605,13 @@ TikTokLive.newClient("host-name")
|
|||||||
|
|
||||||
<br>
|
<br>
|
||||||
|
|
||||||
## onWebsocketResponse [TikTokWebsocketResponseEvent](https://github.com/jwdeveloper/TikTokLiveJava/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/websocket/TikTokWebsocketResponseEvent.java)
|
## onHttpResponse [TikTokHttpResponseEvent](https://github.com/jwdeveloper/TikTokLiveJava/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/http/TikTokHttpResponseEvent.java)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
```java
|
```java
|
||||||
TikTokLive.newClient("host-name")
|
TikTokLive.newClient("host-name")
|
||||||
.onWebsocketResponse((liveClient, event) ->
|
.onHttpResponse((liveClient, event) ->
|
||||||
{
|
{
|
||||||
|
|
||||||
})
|
})
|
||||||
@@ -586,7 +625,8 @@ TikTokLive.newClient("host-name")
|
|||||||
## onWebsocketMessage [TikTokWebsocketMessageEvent](https://github.com/jwdeveloper/TikTokLiveJava/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/websocket/TikTokWebsocketMessageEvent.java)
|
## onWebsocketMessage [TikTokWebsocketMessageEvent](https://github.com/jwdeveloper/TikTokLiveJava/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/websocket/TikTokWebsocketMessageEvent.java)
|
||||||
|
|
||||||
|
|
||||||
Triggered every time a protobuf encoded webcast message arrives. You can deserialize the binary object depending on the use case.
|
Triggered every time TikTok sends data. Data incoming as protobuf message.
|
||||||
|
You can deserialize the binary object depending on the use case.
|
||||||
|
|
||||||
|
|
||||||
```java
|
```java
|
||||||
@@ -602,6 +642,17 @@ TikTokLive.newClient("host-name")
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
{{for item of data }}
|
||||||
|
|
||||||
|
{{if item is 2}}
|
||||||
|
|
||||||
|
my name is {{item.name}}
|
||||||
|
|
||||||
|
{{else}}
|
||||||
|
|
||||||
|
{{end}}
|
||||||
|
|
||||||
|
{{end}}
|
||||||
<br>
|
<br>
|
||||||
|
|
||||||
## Listeners
|
## Listeners
|
||||||
@@ -628,7 +679,7 @@ TikTokLive.newClient("host-name")
|
|||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* Method in TikTokEventListener should meet 4 requirements to be detected
|
* Method in TikTokEventListener should meet 4 requirements to be detected
|
||||||
* - must have @TikTokEventHandler annotation
|
* - must have @TikTokEventObserver annotation
|
||||||
* - must have 2 parameters
|
* - must have 2 parameters
|
||||||
* - first parameter must be LiveClient
|
* - first parameter must be LiveClient
|
||||||
* - second must be class that extending TikTokEvent
|
* - second must be class that extending TikTokEvent
|
||||||
@@ -636,24 +687,24 @@ TikTokLive.newClient("host-name")
|
|||||||
|
|
||||||
public static class CustomListener implements TikTokEventListener {
|
public static class CustomListener implements TikTokEventListener {
|
||||||
|
|
||||||
@TikTokEventHandler
|
@TikTokEventObserver
|
||||||
public void onLike(LiveClient liveClient, TikTokLikeEvent event) {
|
public void onLike(LiveClient liveClient, TikTokLikeEvent event) {
|
||||||
System.out.println(event.toString());
|
System.out.println(event.toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
@TikTokEventHandler
|
@TikTokEventObserver
|
||||||
public void onError(LiveClient liveClient, TikTokErrorEvent event) {
|
public void onError(LiveClient liveClient, TikTokErrorEvent event) {
|
||||||
// event.getException().printStackTrace();
|
// event.getException().printStackTrace();
|
||||||
}
|
}
|
||||||
|
|
||||||
@TikTokEventHandler
|
@TikTokEventObserver
|
||||||
public void onComment(LiveClient liveClient, TikTokCommentEvent event) {
|
public void onComment(LiveClient liveClient, TikTokCommentEvent event) {
|
||||||
var userName = event.getUser().getName();
|
var userName = event.getUser().getName();
|
||||||
var text = event.getText();
|
var text = event.getText();
|
||||||
liveClient.getLogger().info(userName + ": " + text);
|
liveClient.getLogger().info(userName + ": " + text);
|
||||||
}
|
}
|
||||||
|
|
||||||
@TikTokEventHandler
|
@TikTokEventObserver
|
||||||
public void onGift(LiveClient liveClient, TikTokGiftEvent event) {
|
public void onGift(LiveClient liveClient, TikTokGiftEvent event) {
|
||||||
var message = switch (event.getGift()) {
|
var message = switch (event.getGift()) {
|
||||||
case ROSE -> "Thanks :)";
|
case ROSE -> "Thanks :)";
|
||||||
@@ -666,7 +717,7 @@ TikTokLive.newClient("host-name")
|
|||||||
liveClient.getLogger().info(message);
|
liveClient.getLogger().info(message);
|
||||||
}
|
}
|
||||||
|
|
||||||
@TikTokEventHandler
|
@TikTokEventObserver
|
||||||
public void onAnyEvent(LiveClient liveClient, TikTokEvent event) {
|
public void onAnyEvent(LiveClient liveClient, TikTokEvent event) {
|
||||||
liveClient.getLogger().info(event.getClass().getSimpleName());
|
liveClient.getLogger().info(event.getClass().getSimpleName());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>TikTokLiveJava</artifactId>
|
<artifactId>TikTokLiveJava</artifactId>
|
||||||
<groupId>io.github.jwdeveloper.tiktok</groupId>
|
<groupId>io.github.jwdeveloper.tiktok</groupId>
|
||||||
<version>1.0.17-Release</version>
|
<version>1.1.0-Release</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,64 @@
|
|||||||
|
Collects live data to mongodb database
|
||||||
|
|
||||||
|
|
||||||
|
```xml
|
||||||
|
<repositories>
|
||||||
|
<repository>
|
||||||
|
<id>jitpack.io</id>
|
||||||
|
<url>https://jitpack.io</url>
|
||||||
|
</repository>
|
||||||
|
</repositories>
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.github.jwdeveloper.TikTok-Live-Java</groupId>
|
||||||
|
<artifactId>Client</artifactId>
|
||||||
|
<version>1.1.0-Release</version>
|
||||||
|
<scope>compile</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.github.jwdeveloper.TikTok-Live-Java</groupId>
|
||||||
|
<artifactId>extension-collector</artifactId>
|
||||||
|
<version>1.1.0-Release</version>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
Usage
|
||||||
|
|
||||||
|
```java
|
||||||
|
public static void main(String[] args) throws IOException {
|
||||||
|
|
||||||
|
var collector = TikTokLiveCollector.use(settings ->
|
||||||
|
{
|
||||||
|
settings.setConnectionUrl("mongodb+srv://" + mongoUser + ":" + mongoPassword + "@" + mongoDatabase + "/?retryWrites=true&w=majority");
|
||||||
|
settings.setDatabaseName("tiktok");
|
||||||
|
});
|
||||||
|
collector.connectDatabase();
|
||||||
|
|
||||||
|
var users = List.of("tehila_723", "dino123597", "domaxyzx", "dash4214", "obserwacje_live");
|
||||||
|
var sessionTag = "Tag1";
|
||||||
|
for (var user : users) {
|
||||||
|
TikTokLive.newClient(user)
|
||||||
|
.configure(liveClientSettings ->
|
||||||
|
{
|
||||||
|
liveClientSettings.setPrintToConsole(true);
|
||||||
|
})
|
||||||
|
.onError((liveClient, event) ->
|
||||||
|
{
|
||||||
|
event.getException().printStackTrace();
|
||||||
|
})
|
||||||
|
.addListener(collector.newListener(Map.of("sessionTag", sessionTag), document ->
|
||||||
|
{
|
||||||
|
if (document.get("dataType") == "message") {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}))
|
||||||
|
.buildAndConnectAsync();
|
||||||
|
}
|
||||||
|
|
||||||
|
System.in.read();
|
||||||
|
collector.disconnectDatabase();
|
||||||
|
}
|
||||||
|
```
|
||||||
@@ -6,7 +6,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>io.github.jwdeveloper.tiktok</groupId>
|
<groupId>io.github.jwdeveloper.tiktok</groupId>
|
||||||
<artifactId>TikTokLiveJava</artifactId>
|
<artifactId>TikTokLiveJava</artifactId>
|
||||||
<version>1.0.14-Release</version>
|
<version>1.1.0-Release</version>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
|
|
||||||
@@ -33,7 +33,7 @@
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>io.github.jwdeveloper.tiktok</groupId>
|
<groupId>io.github.jwdeveloper.tiktok</groupId>
|
||||||
<artifactId>API</artifactId>
|
<artifactId>API</artifactId>
|
||||||
<version>1.0.17-Release</version>
|
<version>1.1.0-Release</version>
|
||||||
<scope>compile</scope>
|
<scope>compile</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|||||||
@@ -0,0 +1,56 @@
|
|||||||
|
|
||||||
|
Records stream to flv file
|
||||||
|
|
||||||
|
|
||||||
|
```xml
|
||||||
|
<repositories>
|
||||||
|
<repository>
|
||||||
|
<id>jitpack.io</id>
|
||||||
|
<url>https://jitpack.io</url>
|
||||||
|
</repository>
|
||||||
|
</repositories>
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.github.jwdeveloper.TikTok-Live-Java</groupId>
|
||||||
|
<artifactId>Client</artifactId>
|
||||||
|
<version>1.1.0-Release</version>
|
||||||
|
<scope>compile</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.github.jwdeveloper.TikTok-Live-Java</groupId>
|
||||||
|
<artifactId>extension-recorder</artifactId>
|
||||||
|
<version>1.1.0-Release</version>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
Usage
|
||||||
|
|
||||||
|
```java
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
|
||||||
|
TikTokLive.newClient("bangbetmenygy")
|
||||||
|
.configure(liveClientSettings ->
|
||||||
|
{
|
||||||
|
liveClientSettings.setPrintToConsole(true);
|
||||||
|
})
|
||||||
|
.onError((liveClient, event) ->
|
||||||
|
{
|
||||||
|
event.getException().printStackTrace();
|
||||||
|
})
|
||||||
|
.addListener(TikTokLiveRecorder.use(recorderSettings ->
|
||||||
|
{
|
||||||
|
recorderSettings.setFfmpegPath("C:\\Users\\ja\\IdeaProjects\\TikTokLiveJava\\extension-recorder\\libs\\ffmpeg.exe");
|
||||||
|
recorderSettings.setOutputPath("C:\\Users\\ja\\IdeaProjects\\TikTokLiveJava\\extension-recorder\\out");
|
||||||
|
recorderSettings.setOutputFileName("test.flv");
|
||||||
|
}))
|
||||||
|
.onEvent(TikTokLiveRecorderStartedEvent.class, (liveClient, event) ->
|
||||||
|
{
|
||||||
|
System.out.println(event.getDownloadData().getFullUrl());
|
||||||
|
})
|
||||||
|
.buildAndConnect();
|
||||||
|
|
||||||
|
}
|
||||||
|
```
|
||||||
@@ -5,7 +5,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>TikTokLiveJava</artifactId>
|
<artifactId>TikTokLiveJava</artifactId>
|
||||||
<groupId>io.github.jwdeveloper.tiktok</groupId>
|
<groupId>io.github.jwdeveloper.tiktok</groupId>
|
||||||
<version>1.0.14-Release</version>
|
<version>1.1.0-Release</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<artifactId>extension-recorder</artifactId>
|
<artifactId>extension-recorder</artifactId>
|
||||||
@@ -13,19 +13,13 @@
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>io.github.jwdeveloper.tiktok</groupId>
|
<groupId>io.github.jwdeveloper.tiktok</groupId>
|
||||||
<artifactId>Client</artifactId>
|
<artifactId>Client</artifactId>
|
||||||
<version>1.0.14-Release</version>
|
<version>${project.version}</version>
|
||||||
<scope>compile</scope>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>net.bramp.ffmpeg</groupId>
|
|
||||||
<artifactId>ffmpeg</artifactId>
|
|
||||||
<version>0.8.0</version>
|
|
||||||
<scope>compile</scope>
|
<scope>compile</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>io.github.jwdeveloper.tiktok</groupId>
|
<groupId>io.github.jwdeveloper.tiktok</groupId>
|
||||||
<artifactId>API</artifactId>
|
<artifactId>API</artifactId>
|
||||||
<version>1.0.17-Release</version>
|
<version>${project.version}</version>
|
||||||
<scope>compile</scope>
|
<scope>compile</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|||||||
@@ -24,28 +24,18 @@ package io.github.jwdeveloper.tiktok.extension.recorder.impl;
|
|||||||
|
|
||||||
import com.google.gson.JsonParser;
|
import com.google.gson.JsonParser;
|
||||||
import io.github.jwdeveloper.tiktok.annotations.TikTokEventObserver;
|
import io.github.jwdeveloper.tiktok.annotations.TikTokEventObserver;
|
||||||
import io.github.jwdeveloper.tiktok.data.events.TikTokLiveEndedEvent;
|
import io.github.jwdeveloper.tiktok.data.events.*;
|
||||||
import io.github.jwdeveloper.tiktok.data.settings.LiveClientSettings;
|
|
||||||
import io.github.jwdeveloper.tiktok.extension.recorder.api.LiveRecorder;
|
|
||||||
import io.github.jwdeveloper.tiktok.data.events.TikTokConnectedEvent;
|
|
||||||
import io.github.jwdeveloper.tiktok.data.events.TikTokDisconnectedEvent;
|
|
||||||
import io.github.jwdeveloper.tiktok.exceptions.TikTokLiveException;
|
|
||||||
import io.github.jwdeveloper.tiktok.extension.recorder.impl.data.DownloadData;
|
|
||||||
import io.github.jwdeveloper.tiktok.extension.recorder.impl.data.RecorderSettings;
|
|
||||||
import io.github.jwdeveloper.tiktok.data.events.http.TikTokRoomDataResponseEvent;
|
import io.github.jwdeveloper.tiktok.data.events.http.TikTokRoomDataResponseEvent;
|
||||||
|
import io.github.jwdeveloper.tiktok.data.settings.LiveClientSettings;
|
||||||
|
import io.github.jwdeveloper.tiktok.exceptions.TikTokLiveException;
|
||||||
|
import io.github.jwdeveloper.tiktok.extension.recorder.api.LiveRecorder;
|
||||||
|
import io.github.jwdeveloper.tiktok.extension.recorder.impl.data.*;
|
||||||
import io.github.jwdeveloper.tiktok.extension.recorder.impl.enums.LiveQuality;
|
import io.github.jwdeveloper.tiktok.extension.recorder.impl.enums.LiveQuality;
|
||||||
import io.github.jwdeveloper.tiktok.extension.recorder.impl.event.TikTokLiveRecorderStartedEvent;
|
|
||||||
import io.github.jwdeveloper.tiktok.http.HttpClientFactory;
|
|
||||||
import io.github.jwdeveloper.tiktok.live.LiveClient;
|
import io.github.jwdeveloper.tiktok.live.LiveClient;
|
||||||
import net.bramp.ffmpeg.FFmpeg;
|
|
||||||
import net.bramp.ffmpeg.FFmpegExecutor;
|
|
||||||
import net.bramp.ffmpeg.RunProcessFunction;
|
|
||||||
import net.bramp.ffmpeg.builder.FFmpegBuilder;
|
|
||||||
|
|
||||||
import javax.net.ssl.HttpsURLConnection;
|
import javax.net.ssl.HttpsURLConnection;
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
import java.util.List;
|
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
@@ -90,46 +80,11 @@ public class RecorderListener implements LiveRecorder {
|
|||||||
throw new TikTokLiveException("Unable to find download live url!");
|
throw new TikTokLiveException("Unable to find download live url!");
|
||||||
}
|
}
|
||||||
liveClient.getLogger().info("Live download url found!");
|
liveClient.getLogger().info("Live download url found!");
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@TikTokEventObserver
|
@TikTokEventObserver
|
||||||
private void onConnected(LiveClient liveClient, TikTokConnectedEvent event) {
|
private void onConnected(LiveClient liveClient, TikTokConnectedEvent event) {
|
||||||
/* liveDownloadThread = new Thread(() ->
|
liveDownloadThread = new Thread(() -> {
|
||||||
{
|
|
||||||
try {
|
|
||||||
var ffmpeg = new FFmpeg(settings.getFfmpegPath(), new RunProcessFunction() {
|
|
||||||
@Override
|
|
||||||
public Process run(final List<String> args) throws IOException {
|
|
||||||
var process = super.run(args);
|
|
||||||
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
|
|
||||||
terminateFfmpeg(process);
|
|
||||||
}, "FFmpeg process destroyer"));
|
|
||||||
return process;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
var builder = new FFmpegBuilder()
|
|
||||||
.setInput(downloadData.getFullUrl())
|
|
||||||
.addOutput(settings.getOutputPath() + File.separator + settings.getOutputFileName()) // Set the output file path
|
|
||||||
.setFormat("mp4")
|
|
||||||
.done();
|
|
||||||
|
|
||||||
var executor = new FFmpegExecutor(ffmpeg);
|
|
||||||
var ffmpegProcess = executor.createJob(builder, (progress)-> {
|
|
||||||
liveClient.getLogger().info("Downloading stream: " +progress.total_size);
|
|
||||||
});
|
|
||||||
ffmpegProcess.run();
|
|
||||||
liveClient.publishEvent(new TikTokLiveRecorderStartedEvent(downloadData));
|
|
||||||
|
|
||||||
} catch (Exception e) {
|
|
||||||
throw new TikTokLiveException("Unable to run ffmpeg drivers",e);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
*/
|
|
||||||
|
|
||||||
liveDownloadThread = new Thread(() ->
|
|
||||||
{
|
|
||||||
try {
|
try {
|
||||||
var bufferSize = 1024;
|
var bufferSize = 1024;
|
||||||
var url = new URL(downloadData.getFullUrl());
|
var url = new URL(downloadData.getFullUrl());
|
||||||
@@ -139,41 +94,33 @@ public class RecorderListener implements LiveRecorder {
|
|||||||
socksConnection.setRequestProperty(entry.getKey(), entry.getValue());
|
socksConnection.setRequestProperty(entry.getKey(), entry.getValue());
|
||||||
}
|
}
|
||||||
|
|
||||||
System.out.println(socksConnection.getResponseCode());
|
var in = new BufferedInputStream(socksConnection.getInputStream());
|
||||||
try (var in = new BufferedInputStream(socksConnection.getInputStream())) {
|
|
||||||
var path = settings.getOutputPath() + File.separator + settings.getOutputFileName();
|
var path = settings.getOutputPath() + File.separator + settings.getOutputFileName();
|
||||||
var file = new File(path);
|
var file = new File(path);
|
||||||
file.getParentFile().mkdirs();
|
file.getParentFile().mkdirs();
|
||||||
var fileOutputStream = new FileOutputStream(file);
|
var fileOutputStream = new FileOutputStream(file);
|
||||||
byte dataBuffer[] = new byte[bufferSize];
|
byte[] dataBuffer = new byte[bufferSize];
|
||||||
int bytesRead;
|
int bytesRead;
|
||||||
while ((bytesRead = in.read(dataBuffer, 0, bufferSize)) != -1) {
|
while ((bytesRead = in.read(dataBuffer, 0, bufferSize)) != -1) {
|
||||||
fileOutputStream.write(dataBuffer, 0, bytesRead);
|
fileOutputStream.write(dataBuffer, 0, bytesRead);
|
||||||
}
|
}
|
||||||
} catch (IOException e) {
|
in.close();
|
||||||
throw e;
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
liveDownloadThread.start();
|
liveDownloadThread.start();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private static void downloadUsingStream(String urlStr, String file) throws IOException {
|
private static void downloadUsingStream(String urlStr, String file) throws IOException {
|
||||||
URL url = new URL(urlStr);
|
URL url = new URL(urlStr);
|
||||||
BufferedInputStream bis = new BufferedInputStream(url.openStream());
|
BufferedInputStream bis = new BufferedInputStream(url.openStream());
|
||||||
FileOutputStream fis = new FileOutputStream(file);
|
FileOutputStream fis = new FileOutputStream(file);
|
||||||
byte[] buffer = new byte[1024];
|
byte[] buffer = new byte[1024];
|
||||||
int count = 0;
|
int count;
|
||||||
while ((count = bis.read(buffer, 0, 1024)) != -1) {
|
while ((count = bis.read(buffer, 0, 1024)) != -1)
|
||||||
fis.write(buffer, 0, count);
|
fis.write(buffer, 0, count);
|
||||||
}
|
|
||||||
fis.close();
|
fis.close();
|
||||||
bis.close();
|
bis.close();
|
||||||
}
|
}
|
||||||
@@ -181,25 +128,23 @@ public class RecorderListener implements LiveRecorder {
|
|||||||
|
|
||||||
@TikTokEventObserver
|
@TikTokEventObserver
|
||||||
private void onDisconnected(LiveClient liveClient, TikTokDisconnectedEvent event) {
|
private void onDisconnected(LiveClient liveClient, TikTokDisconnectedEvent event) {
|
||||||
|
if (isConnected())
|
||||||
liveDownloadThread.interrupt();
|
liveDownloadThread.interrupt();
|
||||||
}
|
}
|
||||||
|
|
||||||
@TikTokEventObserver
|
@TikTokEventObserver
|
||||||
private void onDisconnected(LiveClient liveClient, TikTokLiveEndedEvent event) {
|
private void onDisconnected(LiveClient liveClient, TikTokLiveEndedEvent event) {
|
||||||
|
if (isConnected())
|
||||||
liveDownloadThread.interrupt();
|
liveDownloadThread.interrupt();
|
||||||
}
|
}
|
||||||
|
|
||||||
private int terminateFfmpeg(final Process process) {
|
private int terminateFfmpeg(final Process process) {
|
||||||
if (!process.isAlive()) {
|
if (!process.isAlive()) {
|
||||||
/*
|
// ffmpeg -version, do nothing
|
||||||
* ffmpeg -version, do nothing
|
|
||||||
*/
|
|
||||||
return process.exitValue();
|
return process.exitValue();
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
// ffmpeg -f x11grab
|
||||||
* ffmpeg -f x11grab
|
|
||||||
*/
|
|
||||||
System.out.println("About to destroy the child process...");
|
System.out.println("About to destroy the child process...");
|
||||||
try (final OutputStreamWriter out = new OutputStreamWriter(process.getOutputStream(), UTF_8)) {
|
try (final OutputStreamWriter out = new OutputStreamWriter(process.getOutputStream(), UTF_8)) {
|
||||||
out.write('q');
|
out.write('q');
|
||||||
@@ -212,7 +157,7 @@ public class RecorderListener implements LiveRecorder {
|
|||||||
process.waitFor();
|
process.waitFor();
|
||||||
}
|
}
|
||||||
return process.exitValue();
|
return process.exitValue();
|
||||||
} catch (final InterruptedException ie) {
|
} catch (InterruptedException ie) {
|
||||||
System.out.println("Interrupted");
|
System.out.println("Interrupted");
|
||||||
ie.printStackTrace();
|
ie.printStackTrace();
|
||||||
Thread.currentThread().interrupt();
|
Thread.currentThread().interrupt();
|
||||||
@@ -239,12 +184,10 @@ public class RecorderListener implements LiveRecorder {
|
|||||||
.get("flv")
|
.get("flv")
|
||||||
.getAsString();
|
.getAsString();
|
||||||
|
|
||||||
|
|
||||||
var sessionId = streamDataJsonObject.getAsJsonObject("common")
|
var sessionId = streamDataJsonObject.getAsJsonObject("common")
|
||||||
.get("session_id")
|
.get("session_id")
|
||||||
.getAsString();
|
.getAsString();
|
||||||
|
|
||||||
|
|
||||||
//main
|
//main
|
||||||
//https://pull-f5-tt03.fcdn.eu.tiktokcdn.com/stage/stream-3284937501738533765.flv?session_id=136-20240109000954BF818F1B3A8E5E39E238&_webnoredir=1
|
//https://pull-f5-tt03.fcdn.eu.tiktokcdn.com/stage/stream-3284937501738533765.flv?session_id=136-20240109000954BF818F1B3A8E5E39E238&_webnoredir=1
|
||||||
//Working
|
//Working
|
||||||
@@ -254,5 +197,7 @@ public class RecorderListener implements LiveRecorder {
|
|||||||
return new DownloadData(urlLink, sessionId);
|
return new DownloadData(urlLink, sessionId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean isConnected() {
|
||||||
|
return liveDownloadThread != null && liveDownloadThread.isAlive();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -34,6 +34,6 @@ public class DownloadData {
|
|||||||
private String sessionId;
|
private String sessionId;
|
||||||
|
|
||||||
public String getFullUrl() {
|
public String getFullUrl() {
|
||||||
return downloadLiveUrl + "?_webnoredir=1&session_id=" + sessionId;
|
return downloadLiveUrl + "&_webnoredir=1&session_id=" + sessionId;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -29,25 +29,6 @@ import lombok.Setter;
|
|||||||
|
|
||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
|
|
||||||
/**
|
|
||||||
* self,
|
|
||||||
* path: str,
|
|
||||||
* duration: Optional[int] = None,
|
|
||||||
* quality: Optional[VideoQuality] = None,
|
|
||||||
* verbose: bool = True,
|
|
||||||
* loglevel: str = "error",
|
|
||||||
* global_options: Set[str] = set(),
|
|
||||||
* inputs: Dict[str, str] = dict(),
|
|
||||||
* outputs: Dict[str, str] = dict()
|
|
||||||
* :param loglevel: Set the FFmpeg log level
|
|
||||||
* :param outputs: Pass custom params to FFmpeg outputs
|
|
||||||
* :param inputs: Pass custom params to FFmpeg inputs
|
|
||||||
* :param global_options: Pass custom params to FFmpeg global options
|
|
||||||
* :param path: The path to download the livestream video to
|
|
||||||
* :param duration: If duration is None or less than 1, download will go forever
|
|
||||||
* :param quality: If quality is None, download quality will auto
|
|
||||||
* :param verbose: Whether to log info about the download in console
|
|
||||||
*/
|
|
||||||
@Getter
|
@Getter
|
||||||
@Setter
|
@Setter
|
||||||
public class RecorderSettings {
|
public class RecorderSettings {
|
||||||
@@ -63,19 +44,10 @@ public class RecorderSettings {
|
|||||||
return new RecorderSettings();
|
return new RecorderSettings();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setQuality(String format) {
|
|
||||||
this.format = format;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setQuality(LiveQuality quality) {
|
public void setQuality(LiveQuality quality) {
|
||||||
this.quality = quality.name();
|
this.quality = quality.name();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public void setFormat(String format) {
|
|
||||||
this.format = format;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setFormat(LiveFormat format) {
|
public void setFormat(LiveFormat format) {
|
||||||
this.format = format.name();
|
this.format = format.name();
|
||||||
}
|
}
|
||||||
|
|||||||
2
pom.xml
2
pom.xml
@@ -7,7 +7,7 @@
|
|||||||
<groupId>io.github.jwdeveloper.tiktok</groupId>
|
<groupId>io.github.jwdeveloper.tiktok</groupId>
|
||||||
<artifactId>TikTokLiveJava</artifactId>
|
<artifactId>TikTokLiveJava</artifactId>
|
||||||
<packaging>pom</packaging>
|
<packaging>pom</packaging>
|
||||||
<version>1.0.17-Release</version>
|
<version>1.1.0-Release</version>
|
||||||
<modules>
|
<modules>
|
||||||
<module>API</module>
|
<module>API</module>
|
||||||
<module>Client</module>
|
<module>Client</module>
|
||||||
|
|||||||
Reference in New Issue
Block a user