Skip to content

Commit 2fc3ef4

Browse files
committed
feat: Stop AfreecaTvChatCrawler on missing live broadcast info
1 parent a71b669 commit 2fc3ef4

4 files changed

Lines changed: 48 additions & 10 deletions

File tree

src/main/java/net/ledestudio/acc/http/AccHttpRequester.java

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package net.ledestudio.acc.http;
22

3+
import com.google.gson.JsonElement;
34
import com.google.gson.JsonObject;
45
import com.google.gson.JsonParser;
56
import org.apache.http.HttpEntity;
@@ -9,6 +10,7 @@
910
import org.apache.http.impl.client.HttpClients;
1011
import org.apache.http.util.EntityUtils;
1112
import org.jetbrains.annotations.NotNull;
13+
import org.jetbrains.annotations.Nullable;
1214

1315
import java.io.IOException;
1416
import java.nio.charset.StandardCharsets;
@@ -41,7 +43,7 @@ public AccHttpRequester(@NotNull String afreecaTvLiveUrl) {
4143
this.bno = split[1];
4244
}
4345

44-
public @NotNull CompletableFuture<AccHttpRequestResult> request() {
46+
public @NotNull CompletableFuture<@Nullable AccHttpRequestResult> request() {
4547
return CompletableFuture.supplyAsync(() -> {
4648
String url = "https://live.afreecatv.com/afreeca/player_live_api.php";
4749

@@ -58,7 +60,14 @@ public AccHttpRequester(@NotNull String afreecaTvLiveUrl) {
5860
String responseStr = EntityUtils.toString(entity, StandardCharsets.UTF_8);
5961

6062
JsonObject root = JsonParser.parseString(responseStr).getAsJsonObject();
63+
if (root == null || !root.has("CHANNEL")) {
64+
return null;
65+
}
66+
6167
JsonObject channel = root.getAsJsonObject("CHANNEL");
68+
if (channel == null || !channel.has("CHDOMAIN")) {
69+
return null;
70+
}
6271

6372
// mapping result
6473
AccHttpRequestResult result = new AccHttpRequestResult();
@@ -75,8 +84,7 @@ public AccHttpRequester(@NotNull String afreecaTvLiveUrl) {
7584
System.err.println("An error occurred during HTTP request execution: " + e.getMessage());
7685
}
7786

78-
// return empty result
79-
return new AccHttpRequestResult();
87+
return null;
8088
});
8189
}
8290

src/main/java/net/ledestudio/acc/service/AfreecaTvChatCrawler.java

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,12 @@
1717
import java.security.NoSuchAlgorithmException;
1818
import java.util.Set;
1919
import java.util.concurrent.*;
20+
import java.util.logging.Logger;
2021

2122
public class AfreecaTvChatCrawler {
2223

24+
private static final Logger LOGGER = Logger.getLogger(AfreecaTvChatCrawler.class.getSimpleName());
25+
2326
private AccClient client;
2427
private AccHttpRequestResult result;
2528

@@ -65,9 +68,12 @@ public void connect() {
6568
Executors.newSingleThreadExecutor().execute(() -> {
6669
try {
6770
// Request AfreecaTv Live Information
68-
final AccHttpRequester requester = new AccHttpRequester(url);
69-
final CompletableFuture<AccHttpRequestResult> future = requester.request();
70-
this.result = future.get();
71+
this.result = getLiveBroadcastResult();
72+
73+
if (result == null) {
74+
LOGGER.warning("Unable to find live broadcast information.");
75+
return;
76+
}
7177

7278
// Create Draft
7379
Draft_6455 draft = new Draft_6455(Lists.newArrayList(),
@@ -103,9 +109,16 @@ public void connect() {
103109
public void reconnect() {
104110
if (client != null) {
105111
try {
112+
this.result = getLiveBroadcastResult();
113+
if (result == null) {
114+
LOGGER.warning("Unable to find live broadcast information.");
115+
close();
116+
return;
117+
}
118+
106119
client.reconnectBlocking();
107120
sendPacket();
108-
} catch (InterruptedException e) {
121+
} catch (InterruptedException | ExecutionException e) {
109122
e.printStackTrace();
110123
}
111124
}
@@ -120,6 +133,12 @@ public void close() {
120133
}
121134
}
122135

136+
private @Nullable AccHttpRequestResult getLiveBroadcastResult() throws ExecutionException, InterruptedException {
137+
final AccHttpRequester requester = new AccHttpRequester(url);
138+
final CompletableFuture<AccHttpRequestResult> future = requester.request();
139+
return future.get();
140+
}
141+
123142
private void sendPacket() {
124143
if (client == null) {
125144
return;
@@ -136,7 +155,6 @@ private void sendPacket() {
136155
// Repeatedly Sending Ping Packet
137156
scheduler = Executors.newSingleThreadScheduledExecutor();
138157
scheduler.scheduleAtFixedRate(() -> {
139-
System.out.println("Send Ping Packet");
140158
client.send(AccConstants.createPingPacket());
141159
}, AccConstants.PING_PACKET_PERIOD_SECONDS, AccConstants.PING_PACKET_PERIOD_SECONDS, TimeUnit.SECONDS);
142160
}

src/test/java/net/ledestudio/acc/AccHttpTest.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,11 @@ public void accHttpRequesterUrlConstructorTest() throws ExecutionException, Inte
1414
AccHttpRequester requester = new AccHttpRequester("https://play.afreecatv.com/seokwngud/262914674");
1515
CompletableFuture<AccHttpRequestResult> future = requester.request();
1616
AccHttpRequestResult result = future.get();
17+
18+
if (result == null) {
19+
System.out.println("Cannot found live broadcast information");
20+
return;
21+
}
1722
System.out.println(result.toString());
1823
}
1924

src/test/java/net/ledestudio/acc/AccWebSocketTest.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import org.java_websocket.client.WebSocketClient;
1010
import org.java_websocket.drafts.Draft_6455;
1111
import org.jetbrains.annotations.NotNull;
12+
import org.jetbrains.annotations.Nullable;
1213
import org.junit.jupiter.api.Test;
1314

1415
import java.time.format.DateTimeFormatter;
@@ -19,8 +20,14 @@ public class AccWebSocketTest {
1920
@Test
2021
public void accWebSocketClientConnectTest() throws ExecutionException, InterruptedException {
2122
AccHttpRequester requester = new AccHttpRequester("https://play.afreecatv.com/seokwngud/262914674");
22-
CompletableFuture<AccHttpRequestResult> future = requester.request();
23-
WebSocketClient client = new AccClient(future.get(), new Draft_6455());
23+
CompletableFuture<@Nullable AccHttpRequestResult> future = requester.request();
24+
AccHttpRequestResult result = future.get();
25+
if (result == null) {
26+
System.out.println("Cannot found live broadcast information");
27+
return;
28+
}
29+
30+
WebSocketClient client = new AccClient(result, new Draft_6455());
2431
client.connectBlocking();
2532
}
2633

0 commit comments

Comments
 (0)