From c8ffdbe616d1418bf519fd1a4f9ae1c9abf79ffc Mon Sep 17 00:00:00 2001 From: 0xboobface <0xboobface@gmail.com> Date: Wed, 23 Jan 2019 14:14:14 +0100 Subject: [PATCH] Send heartbeat every now and again The heartbeat has to sent every now and again to keep the stream going. Otherwise you will get a 403 after a few minutes when trying to access the playlist. --- .../java/ctbrec/sites/fc2live/Fc2Model.java | 39 +++++++++++++------ 1 file changed, 27 insertions(+), 12 deletions(-) diff --git a/common/src/main/java/ctbrec/sites/fc2live/Fc2Model.java b/common/src/main/java/ctbrec/sites/fc2live/Fc2Model.java index 57616338..ef924c89 100644 --- a/common/src/main/java/ctbrec/sites/fc2live/Fc2Model.java +++ b/common/src/main/java/ctbrec/sites/fc2live/Fc2Model.java @@ -49,6 +49,8 @@ public class Fc2Model extends AbstractModel { private WebSocket ws; private String playlistUrl; private AtomicInteger websocketUsage = new AtomicInteger(0); + private long lastHeartBeat = System.currentTimeMillis(); + private int messageId = 1; @Override public boolean isOnline(boolean ignoreCache) throws IOException, ExecutionException, InterruptedException { @@ -237,8 +239,7 @@ public class Fc2Model extends AbstractModel { * @throws IOException */ public void openWebsocket() throws InterruptedException, IOException { - // TODO send heartbeat (maybe every minute) {"name":"heartbeat","arguments":{},"id":2} - + messageId = 1; int usage = websocketUsage.incrementAndGet(); LOG.debug("{} objects using the websocket for {}", usage, this); if(ws != null) { @@ -261,27 +262,41 @@ public class Fc2Model extends AbstractModel { @Override public void onOpen(WebSocket webSocket, Response response) { response.close(); - webSocket.send("{\"name\":\"get_hls_information\",\"arguments\":{},\"id\":1}"); + webSocket.send("{\"name\":\"get_hls_information\",\"arguments\":{},\"id\":" + (messageId++) + "}"); } @Override public void onMessage(WebSocket webSocket, String text) { JSONObject json = new JSONObject(text); - if(json.optString("name").equals("_response_") && json.optInt("id") == 1) { - //LOG.debug(json.toString(2)); - JSONObject args = json.getJSONObject("arguments"); - JSONArray playlists = args.getJSONArray("playlists_high_latency"); - JSONObject playlist = playlists.getJSONObject(0); - playlistUrl = playlist.getString("url"); - LOG.debug("Master Playlist: {}", playlistUrl); - synchronized (monitor) { - monitor.notify(); + if(json.optString("name").equals("_response_")) { + if(json.has("arguments")) { + JSONObject args = json.getJSONObject("arguments"); + if(args.has("playlists_high_latency")) { + JSONArray playlists = args.getJSONArray("playlists_high_latency"); + JSONObject playlist = playlists.getJSONObject(0); + playlistUrl = playlist.getString("url"); + LOG.debug("Master Playlist: {}", playlistUrl); + synchronized (monitor) { + monitor.notify(); + } + } else { + LOG.debug(json.toString()); + } } } else if(json.optString("name").equals("user_count") || json.optString("name").equals("comment")) { // ignore } else { LOG.debug("WS <-- {}", text); } + + // send heartbeat every now and again + long now = System.currentTimeMillis(); + if( (now - lastHeartBeat) > TimeUnit.SECONDS.toMillis(30)) { + webSocket.send("{\"name\":\"heartbeat\",\"arguments\":{},\"id\":" + messageId + "}"); + lastHeartBeat = now; + LOG.debug("Sending heartbeat (messageId: {})", messageId); + messageId++; + } } @Override