update 统一管理BiliLiveDatabase
This commit is contained in:
parent
3f10e19e50
commit
8afb8f8f0b
@ -17,13 +17,16 @@ import com.yutou.biliapi.bean.websocket.live.WSData;
|
||||
import com.yutou.biliapi.databases.BiliBiliLoginDatabase;
|
||||
import com.yutou.biliapi.databases.BiliLiveDatabase;
|
||||
import com.yutou.biliapi.utils.BytesUtils;
|
||||
import com.yutou.bilibili.services.LiveDatabasesService;
|
||||
import com.yutou.common.okhttp.HttpBody;
|
||||
import com.yutou.common.okhttp.HttpCallback;
|
||||
import com.yutou.common.utils.ConfigTools;
|
||||
import com.yutou.common.utils.Log;
|
||||
import jakarta.annotation.Resource;
|
||||
import okhttp3.Headers;
|
||||
import org.java_websocket.client.WebSocketClient;
|
||||
import org.java_websocket.handshake.ServerHandshake;
|
||||
import org.springframework.stereotype.Service;
|
||||
import retrofit2.Response;
|
||||
|
||||
import java.io.ByteArrayOutputStream;
|
||||
@ -38,24 +41,20 @@ import java.util.concurrent.ArrayBlockingQueue;
|
||||
import java.util.concurrent.ThreadPoolExecutor;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
public class WebSocketClientManager {
|
||||
@Service
|
||||
public class WebSocketServer {
|
||||
ThreadPoolExecutor executor;
|
||||
private static WebSocketClientManager instance;
|
||||
private static WebSocketServer instance;
|
||||
Map<LiveRoomConfig, DanmuTask> roomMap;
|
||||
private final List<String> userStopList = new ArrayList<>();//手动停止列表
|
||||
@Resource
|
||||
LiveDatabasesService liveDatabasesService;
|
||||
|
||||
private WebSocketClientManager() {
|
||||
private WebSocketServer() {
|
||||
roomMap = new HashMap<>();
|
||||
executor = new ThreadPoolExecutor(2, 4, Long.MAX_VALUE, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(100));
|
||||
}
|
||||
|
||||
public static WebSocketClientManager getInstance() {
|
||||
if (instance == null) {
|
||||
instance = new WebSocketClientManager();
|
||||
}
|
||||
return instance;
|
||||
}
|
||||
|
||||
public boolean checkRoom(LiveRoomConfig roomConfig) {
|
||||
return roomMap.containsKey(roomConfig);
|
||||
}
|
||||
@ -98,13 +97,13 @@ public class WebSocketClientManager {
|
||||
}
|
||||
}
|
||||
|
||||
private static class DanmuTask implements Runnable {
|
||||
private class DanmuTask implements Runnable {
|
||||
LiveRoomConfig roomConfig;
|
||||
WebSocketClientTh client;
|
||||
|
||||
public DanmuTask(LiveRoomConfig config) {
|
||||
this.roomConfig = config;
|
||||
WebSocketClientManager.getInstance().roomMap.put(roomConfig, this);
|
||||
roomMap.put(roomConfig, this);
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -117,7 +116,7 @@ public class WebSocketClientManager {
|
||||
roomConfig.setRoomInfo(execute.body() != null ? execute.body().getData() : null);
|
||||
}
|
||||
} catch (IOException e) {
|
||||
WebSocketClientManager.getInstance().roomMap.remove(roomConfig);
|
||||
roomMap.remove(roomConfig);
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
api.getLiveRoomDanmuInfo(String.valueOf(roomConfig.getRoomId())).enqueue(new HttpCallback<LiveDanmuInfo>() {
|
||||
@ -131,7 +130,7 @@ public class WebSocketClientManager {
|
||||
roomConfig.setLiveInfo(response);
|
||||
client = new WebSocketClientTh(new URI(url), roomConfig);
|
||||
} catch (URISyntaxException e) {
|
||||
WebSocketClientManager.getInstance().roomMap.remove(roomConfig);
|
||||
roomMap.remove(roomConfig);
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
@ -139,7 +138,7 @@ public class WebSocketClientManager {
|
||||
|
||||
@Override
|
||||
public void onFailure(Throwable throwable) {
|
||||
WebSocketClientManager.getInstance().roomMap.remove(roomConfig);
|
||||
roomMap.remove(roomConfig);
|
||||
Log.e(throwable);
|
||||
}
|
||||
});
|
||||
@ -150,7 +149,7 @@ public class WebSocketClientManager {
|
||||
}
|
||||
}
|
||||
|
||||
private static class WebSocketClientTh extends WebSocketClient {
|
||||
private class WebSocketClientTh extends WebSocketClient {
|
||||
private final LiveRoomConfig roomConfig;
|
||||
private final HeartbeatTask heartbeatTask;
|
||||
BiliLiveDatabase liveDatabase;
|
||||
@ -159,7 +158,7 @@ public class WebSocketClientManager {
|
||||
super(serverUri);
|
||||
Log.i("WebSocketClientTh.WebSocketClientTh : " + serverUri);
|
||||
this.roomConfig = roomId;
|
||||
liveDatabase = new BiliLiveDatabase(roomConfig);
|
||||
liveDatabase = liveDatabasesService.getLiveDatabase(roomConfig.getRoomId());
|
||||
Brotli4jLoader.ensureAvailability();
|
||||
heartbeatTask = new HeartbeatTask();
|
||||
addHeader("User-Agent", ConfigTools.getUserAgent());
|
||||
@ -190,8 +189,7 @@ public class WebSocketClientManager {
|
||||
@Override
|
||||
public void onClose(int i, String s, boolean b) {
|
||||
Log.e("WebSocketClientTh.onClose", "i = " + i + ", s = " + s + ", b = " + b, roomConfig.getRoomId(), heartbeatTask.socket.isOpen());
|
||||
WebSocketClientManager.getInstance().roomMap.remove(roomConfig);
|
||||
liveDatabase.close();
|
||||
roomMap.remove(roomConfig);
|
||||
heartbeatTask.cancel();
|
||||
}
|
||||
|
||||
@ -199,8 +197,7 @@ public class WebSocketClientManager {
|
||||
public void onError(Exception e) {
|
||||
Log.i("WebSocketClientTh.onError", roomConfig.getRoomId());
|
||||
Log.e(e);
|
||||
WebSocketClientManager.getInstance().roomMap.remove(roomConfig);
|
||||
liveDatabase.close();
|
||||
roomMap.remove(roomConfig);
|
||||
heartbeatTask.cancel();
|
||||
}
|
||||
|
@ -10,11 +10,12 @@ import com.yutou.biliapi.bean.live.database.LiveVideoDatabaseBean;
|
||||
import com.yutou.biliapi.bean.websocket.live.WSData;
|
||||
import com.yutou.biliapi.databases.BiliLiveConfigDatabase;
|
||||
import com.yutou.biliapi.databases.BiliLiveDatabase;
|
||||
import com.yutou.biliapi.net.WebSocketClientManager;
|
||||
import com.yutou.biliapi.net.WebSocketServer;
|
||||
import com.yutou.bilibili.Tools.AssTools;
|
||||
import com.yutou.bilibili.Tools.Tools;
|
||||
import com.yutou.bilibili.datas.web.LiveVideoDanmu;
|
||||
import com.yutou.common.utils.Log;
|
||||
import jakarta.annotation.Resource;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
@ -23,31 +24,35 @@ import java.util.List;
|
||||
|
||||
@Service
|
||||
public class LiveDanmuService {
|
||||
@Resource
|
||||
LiveDatabasesService liveDatabasesService;
|
||||
@Resource
|
||||
WebSocketServer webSocketServer;
|
||||
|
||||
public void start(String roomId, boolean isUser) {
|
||||
WebSocketClientManager.getInstance().addRoom(LiveRoomConfig.buildConfig(roomId), isUser);
|
||||
webSocketServer.addRoom(LiveRoomConfig.buildConfig(roomId), isUser);
|
||||
}
|
||||
|
||||
public void start(LiveConfigDatabaseBean roomId, boolean isUser) {
|
||||
WebSocketClientManager.getInstance().addRoom(LiveRoomConfig.buildConfig(roomId.getRoomId()), isUser);
|
||||
webSocketServer.addRoom(LiveRoomConfig.buildConfig(roomId.getRoomId()), isUser);
|
||||
}
|
||||
|
||||
public boolean check(String roomId) {
|
||||
LiveRoomConfig roomConfig = new LiveRoomConfig();
|
||||
roomConfig.setRoomId(roomId);
|
||||
return WebSocketClientManager.getInstance().checkRoom(roomConfig);
|
||||
return webSocketServer.checkRoom(roomConfig);
|
||||
}
|
||||
|
||||
public void stop(String roomId, boolean isUser) {
|
||||
WebSocketClientManager.getInstance().stopRoom(roomId, isUser);
|
||||
webSocketServer.stopRoom(roomId, isUser);
|
||||
}
|
||||
|
||||
public JSONArray getLiveRoomList() {
|
||||
return WebSocketClientManager.getInstance().getLiveRoomList();
|
||||
return webSocketServer.getLiveRoomList();
|
||||
}
|
||||
|
||||
public void clearUserList() {
|
||||
WebSocketClientManager.getInstance().clearUserStopList();
|
||||
webSocketServer.clearUserStopList();
|
||||
}
|
||||
|
||||
public List<File> getDanmuFileList(String roomId) {
|
||||
@ -88,7 +93,7 @@ public class LiveDanmuService {
|
||||
|
||||
public LiveVideoDanmu getDanmu(String roomId, String videoId, int page) {
|
||||
LiveVideoDanmu danmus = new LiveVideoDanmu();
|
||||
BiliLiveDatabase liveDatabase = new BiliLiveDatabase(LiveRoomConfig.buildConfig(roomId));
|
||||
BiliLiveDatabase liveDatabase = liveDatabasesService.getLiveDatabase(roomId);
|
||||
try {
|
||||
LiveVideoDatabaseBean videoBean = liveDatabase.getVideo(videoId);
|
||||
if (videoBean == null) {
|
||||
@ -121,8 +126,6 @@ public class LiveDanmuService {
|
||||
|
||||
} catch (Exception e) {
|
||||
Log.e(e);
|
||||
} finally {
|
||||
liveDatabase.close();
|
||||
}
|
||||
|
||||
return danmus;
|
||||
|
@ -0,0 +1,21 @@
|
||||
package com.yutou.bilibili.services;
|
||||
|
||||
import com.yutou.biliapi.bean.live.LiveRoomConfig;
|
||||
import com.yutou.biliapi.databases.BiliLiveDatabase;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
@Service
|
||||
public class LiveDatabasesService {
|
||||
private final Map<String, BiliLiveDatabase> liveDatabases=new HashMap<>();
|
||||
public BiliLiveDatabase getLiveDatabase(String roomId) {
|
||||
if(liveDatabases.containsKey(roomId)) {
|
||||
return liveDatabases.get(roomId);
|
||||
}
|
||||
BiliLiveDatabase liveDatabase = new BiliLiveDatabase(LiveRoomConfig.buildConfig(roomId));
|
||||
liveDatabases.put(roomId, liveDatabase);
|
||||
return liveDatabase;
|
||||
}
|
||||
}
|
@ -33,8 +33,11 @@ public class LiveService {
|
||||
LiveVideoDownloadService videoDownloadService;
|
||||
@Resource
|
||||
LiveDanmuService danmuService;
|
||||
@Resource
|
||||
LiveDatabasesService databasesService;
|
||||
LiveApi api;
|
||||
|
||||
|
||||
public LiveService() {
|
||||
liveConfigDatabase = new BiliLiveConfigDatabase();
|
||||
api = BiliLiveNetApiManager.getInstance().getApi(null);
|
||||
@ -108,7 +111,7 @@ public class LiveService {
|
||||
}
|
||||
|
||||
public JSONObject getGiftInfo(String roomId, String videoId) {
|
||||
BiliLiveDatabase database = new BiliLiveDatabase(LiveRoomConfig.buildConfig(roomId));
|
||||
BiliLiveDatabase database = databasesService.getLiveDatabase(roomId);
|
||||
LiveVideoDatabaseBean videoBean = database.getVideo(videoId);
|
||||
if (videoBean == null) {
|
||||
return null;
|
||||
@ -124,4 +127,6 @@ public class LiveService {
|
||||
List<LiveData> data = service.getLiveList(1, 16);
|
||||
System.out.println(data.size());
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
@ -18,7 +18,7 @@ import com.yutou.biliapi.enums.LiveVideoCodec;
|
||||
import com.yutou.biliapi.enums.LiveVideoDefinition;
|
||||
import com.yutou.biliapi.enums.LiveVideoFormat;
|
||||
import com.yutou.biliapi.net.BiliLiveNetApiManager;
|
||||
import com.yutou.biliapi.net.WebSocketClientManager;
|
||||
import com.yutou.biliapi.net.WebSocketServer;
|
||||
import com.yutou.bilibili.Tools.DateFormatUtils;
|
||||
import com.yutou.bilibili.Tools.FileServerUtils;
|
||||
import com.yutou.bilibili.datas.VideoFilePath;
|
||||
@ -29,6 +29,7 @@ import com.yutou.common.record.AbsVideoRecord;
|
||||
import com.yutou.common.utils.ConfigTools;
|
||||
import com.yutou.common.utils.FFmpegUtils;
|
||||
import com.yutou.common.utils.Log;
|
||||
import jakarta.annotation.Resource;
|
||||
import okhttp3.Headers;
|
||||
import org.apache.commons.io.FileUtils;
|
||||
import org.springframework.stereotype.Service;
|
||||
@ -48,6 +49,10 @@ public class LiveVideoDownloadService {
|
||||
private final ThreadPoolExecutor executor;
|
||||
private final List<String> userStopList = new ArrayList<>();//手动停止列表
|
||||
private final AbsVideoRecord videoRecord;
|
||||
@Resource
|
||||
LiveDatabasesService liveDatabasesService;
|
||||
@Resource
|
||||
WebSocketServer webSocketServer;
|
||||
|
||||
public LiveVideoDownloadService() {
|
||||
Log.i("初始化下载服务");
|
||||
@ -176,7 +181,7 @@ public class LiveVideoDownloadService {
|
||||
config.setLogin(StringUtils.hasText(bean.getRecordUid()));
|
||||
config.setRoomInfo(roomInfo);
|
||||
config.setRootPath(bean.getRecordPath());
|
||||
database = new BiliLiveDatabase(config);
|
||||
database = liveDatabasesService.getLiveDatabase(bean.getRoomId());
|
||||
saveLiveInfo(roomInfo);
|
||||
api.getLiveRoomPlayInfo(
|
||||
bean.getRoomId(),
|
||||
@ -355,14 +360,14 @@ public class LiveVideoDownloadService {
|
||||
|
||||
//录制弹幕
|
||||
private void recordDanmu() {
|
||||
if (bean.isSyncDanmuForLive() && !WebSocketClientManager.getInstance().checkRoom(LiveRoomConfig.buildConfig(bean.getRoomId()))) {
|
||||
WebSocketClientManager.getInstance().addRoom(LiveRoomConfig.buildConfig(bean.getRoomId()), true);
|
||||
if (bean.isSyncDanmuForLive() && !webSocketServer.checkRoom(LiveRoomConfig.buildConfig(bean.getRoomId()))) {
|
||||
webSocketServer.addRoom(LiveRoomConfig.buildConfig(bean.getRoomId()), true);
|
||||
}
|
||||
}
|
||||
|
||||
private void stopRecordDanmu() {
|
||||
if (bean.isSyncDanmuForLive() && WebSocketClientManager.getInstance().checkRoom(LiveRoomConfig.buildConfig(bean.getRoomId()))) {
|
||||
WebSocketClientManager.getInstance().stopRoom(bean.getRoomId(), false);
|
||||
if (bean.isSyncDanmuForLive() && webSocketServer.checkRoom(LiveRoomConfig.buildConfig(bean.getRoomId()))) {
|
||||
webSocketServer.stopRoom(bean.getRoomId(), false);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -381,13 +386,11 @@ public class LiveVideoDownloadService {
|
||||
private VideoFilePath getVideoFilePath(LiveConfigDatabaseBean configBean) {
|
||||
String recordPath = configBean.getRecordPath() + File.separator + configBean.getAnchorName();
|
||||
File recordDir = new File(recordPath);
|
||||
BiliLiveDatabase database = new BiliLiveDatabase(LiveRoomConfig.buildConfig(configBean.getRoomId()), recordDir.getAbsolutePath());
|
||||
VideoFilePath path = createVideoRootFilePath(configBean, recordDir);
|
||||
if (recordDir.exists()) {
|
||||
List<LiveVideoDatabaseBean> infos = database.getLiveInfos();
|
||||
List<LiveVideoDatabaseBean> infos = liveDatabasesService.getLiveDatabase(configBean.getRoomId()).getLiveInfos();
|
||||
path.setChildren(getVideoInfo(infos));
|
||||
}
|
||||
database.close();
|
||||
return path;
|
||||
}
|
||||
|
||||
@ -430,14 +433,12 @@ public class LiveVideoDownloadService {
|
||||
String recordPath = config.getRecordPath() + File.separator + config.getAnchorName();
|
||||
configDatabase.close();
|
||||
LiveVideoDatabaseBean videoInfo = null;
|
||||
BiliLiveDatabase liveDatabase = new BiliLiveDatabase(LiveRoomConfig.buildConfig(roomId), new File(recordPath).getAbsolutePath());
|
||||
for (LiveVideoDatabaseBean info : liveDatabase.getLiveInfos()) {
|
||||
for (LiveVideoDatabaseBean info : liveDatabasesService.getLiveDatabase(roomId).getLiveInfos()) {
|
||||
if (videoId.trim().equals(String.valueOf(info.getSql_time().getTime()))) {
|
||||
videoInfo = info;
|
||||
break;
|
||||
}
|
||||
}
|
||||
liveDatabase.close();
|
||||
if (videoInfo != null) {
|
||||
File videoFile = new File(videoInfo.getPath().replace("-%04d.ts", ".m3u8"));
|
||||
if (!videoFile.exists()) {
|
||||
|
@ -22,6 +22,7 @@ public class SystemService {
|
||||
LiveVideoDownloadService videoService;
|
||||
@Resource
|
||||
LiveDanmuService danmuService;
|
||||
|
||||
SystemConfigDatabases databases = new SystemConfigDatabases();
|
||||
private ScheduledExecutorService timer;
|
||||
private ScheduledFuture<?> scheduled;
|
||||
|
@ -27,7 +27,7 @@ public class RedisTools {
|
||||
//Properties properties = PropertyUtil.loadProperties("jedis.properties");
|
||||
//host = properties.getProperty("redis.host");
|
||||
//port = Integer.valueOf(properties.getProperty("redis.port"));
|
||||
host = "172.21.35.118";
|
||||
host = "192.168.31.148";
|
||||
port = 6379;
|
||||
}
|
||||
|
||||
@ -41,7 +41,6 @@ public class RedisTools {
|
||||
String ret = jedis.set(key, value);
|
||||
jedis.close();
|
||||
} catch (Exception e) {
|
||||
// TODO: handle exception
|
||||
Log.e(e);
|
||||
return false;
|
||||
}
|
||||
@ -71,7 +70,6 @@ public class RedisTools {
|
||||
}
|
||||
jedis.close();
|
||||
} catch (Exception e) {
|
||||
// TODO: handle exception
|
||||
Log.e(e);
|
||||
return false;
|
||||
}
|
||||
|
@ -1,3 +1,8 @@
|
||||
server.port=8080
|
||||
server.port=8880
|
||||
logging.file.path=./logs
|
||||
logging.level.com.log.controller = trace
|
||||
# 启用Hibernate SQL日志
|
||||
spring.jpa.show-sql=true
|
||||
spring.jpa.properties.hibernate.format_sql=true
|
||||
logging.level.org.hibernate.SQL=DEBUG
|
||||
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
|
Loading…
Reference in New Issue
Block a user