diff --git a/Web/html/body/bilibili/upInfo.html b/Web/html/body/bilibili/upInfo.html
index 3613aa4..0636a73 100644
--- a/Web/html/body/bilibili/upInfo.html
+++ b/Web/html/body/bilibili/upInfo.html
@@ -156,7 +156,7 @@
, {field: "right", width: 200, toolbar: '#listTools'}
]]
, done: function (res, curr, count) {
- let index=layer.load()
+ let index = layer.load()
$('#htitle').on('click', function () {
var that = this;
layer.tips('当名字变成绿色则代表后台正在统计中,为黑色则代表未统计,如果需要统计请打开统计开关后刷新查看结果', that, {
@@ -196,25 +196,27 @@
$.post('/upinfo/get/liveInfo.do', function (json) {
if (json.code === 0) {
$('#online').text("当前正在直播:" + json.data.online)
- for (let i in json.data.info) {
- console.log('input[name="liveCheckbox' + json.data.info[i].roomid + '"]')
- $('input[name="liveCheckbox' + json.data.info[i].roomid + '"]').prop('checked', true);
- }
for (let i in json.data.live) {
- $('#' + json.data.live[i].roomid).css('color', '#8FE18F')
- console.log('绿了:'+json.data.live[i].roomid)
+ console.log('input[name="liveCheckbox' + json.data.live[i].roomid + '"]')
+ $('input[name="liveCheckbox' + json.data.live[i].roomid + '"]').prop('checked', true);
+ }
+ for (let i in json.data.info) {
+ if (json.data.info[i].listen === 1) {
+ $('#' + json.data.info[i].roomid).css('color', '#8FE18F')
+ console.log('绿了:' + json.data.info[i].roomid)
+ }
}
- $.post('/user/get/test.do',function (json) {
+ $.post('/user/get/test.do', function (json) {
console.log(json.data.power)
- if(json.data.power.indexOf(-1)===-1&&json.data.power.indexOf(4)===-1){
- $('input[type="checkbox"]').prop('disabled',true)
+ if (json.data.power.indexOf(-1) === -1 && json.data.power.indexOf(4) === -1) {
+ $('input[type="checkbox"]').prop('disabled', true)
}
layer.close(index);
form.render();
})
- }else{
+ } else {
layer.msg("close")
layer.close();
}
@@ -254,7 +256,7 @@
title: '请输入房间号或直播地址(直播地址请勿包含参数 如http://live.bilibili.com/110?abcd)',
area: ['350px', '30px'] //自定义文本域宽高
}, function (value, index, elem) {
- let dialogIndex=layer.load();
+ let dialogIndex = layer.load();
queryUpInfo(obj.data.roomid, function (udata) {
udata.url = value;
udata.offlinelistening = udata.offlinelistening ? 1 : 0;
@@ -263,7 +265,7 @@
console.log(udata)
$.post("/upinfo/update.do", udata, function (json) {
layer.close(dialogIndex);
- layer.msg(json.msg,function () {
+ layer.msg(json.msg, function () {
window.location.reload();
})
layer.close(index)
diff --git a/src/main/java/com/yutou/bilibili/BiliBili/Controllers/UpInfoController.java b/src/main/java/com/yutou/bilibili/BiliBili/Controllers/UpInfoController.java
index f1d9f53..a88c653 100644
--- a/src/main/java/com/yutou/bilibili/BiliBili/Controllers/UpInfoController.java
+++ b/src/main/java/com/yutou/bilibili/BiliBili/Controllers/UpInfoController.java
@@ -30,16 +30,16 @@ public class UpInfoController {
@RequestMapping("/upinfo/get/list.do")
@ResponseBody
public JSONObject upInfoList(HttpServletRequest request) {
- String token= AppTools.getLoginToken(request);
- UUser user= userService.getUserToToken(token);
+ String token = AppTools.getLoginToken(request);
+ UUser user = userService.getUserToToken(token);
JSONObject json = new JSONObject();
- if(user==null){
- json.put("code",-1);
- json.put("msg","未登录");
- json.put("data","[]");
+ if (user == null) {
+ json.put("code", -1);
+ json.put("msg", "未登录");
+ json.put("data", "[]");
return json;
}
- List upDataList =service.getUpInfo(user.getId(),user.getPower());
+ List upDataList = service.getUpInfo(user.getId(), user.getPower());
com.yutou.bilibili.Tools.Log.i("UP用户数:" + upDataList.size());
json.put("code", 0);
json.put("data", JSONArray.toJSON(upDataList));
@@ -73,7 +73,7 @@ public class UpInfoController {
@RequestMapping("/upinfo/set/update.do")
public JSONObject update(BilibiliUpInfo upData) {
JSONObject json = new JSONObject();
- com.yutou.bilibili.Tools.Log.i("old data ="+upData);
+ com.yutou.bilibili.Tools.Log.i("old data =" + upData);
BilibiliUpInfo old = service.queryUp(upData);
if (!old.getUrl().equals(upData.getUrl())) {
upData = BiliTools.checkout(upData);
@@ -83,7 +83,7 @@ public class UpInfoController {
upData.setOfflinelistening(0);
}
}
- com.yutou.bilibili.Tools.Log.i("save data = "+upData);
+ com.yutou.bilibili.Tools.Log.i("save data = " + upData);
boolean flag = service.updateUpInfo(upData);
if (flag) {
LiveController.getInstance().updateUpInfo(upData);
@@ -127,20 +127,21 @@ public class UpInfoController {
JSONObject data = new JSONObject();
JSONArray info = new JSONArray();
JSONArray liveArray = new JSONArray();
- int online=0;
+ int online = 0;
+ JSONObject infoByUid = LiveUtils.getStatusInfoByUid(list);
+ JSONObject infoData = infoByUid.getJSONObject("data");
for (BilibiliUpInfo up : list) {
- if (LiveUtils.isLivePlayer(up.getRoomid())) {
+ JSONObject user = infoData.getJSONObject(up.getMid() + "");
+ up.setLive(user.getInteger("live_status"));
+ if (up.checkLiveStatus() == 1) {
online++;
- if(LiveUtils.liveContains(up)==null){
- up.setLive(0);
- }else{
- up.setLive(1);
- }
- info.add(JSON.toJSON(up));
}
+ JSONObject item= (JSONObject) JSON.toJSON(up);
+ item.put("listen",Live.lives.get(up.getRoomid())!=null);
+ info.add(JSON.toJSON(up));
}
for (Live live : Live.lives.values()) {
- if(live.geData().getLive()==1){
+ if (live.geData().getLive() == 1) {
liveArray.add(JSON.toJSON(live.geData()));
}
}
diff --git a/src/main/java/com/yutou/bilibili/BiliBili/Datas/DanmuData.java b/src/main/java/com/yutou/bilibili/BiliBili/Datas/DanmuData.java
index 0295685..90b05d7 100644
--- a/src/main/java/com/yutou/bilibili/BiliBili/Datas/DanmuData.java
+++ b/src/main/java/com/yutou/bilibili/BiliBili/Datas/DanmuData.java
@@ -13,13 +13,14 @@ public class DanmuData {
private long time;
private String uCode;
private String danmu;
- private int uid;
+ private long uid;
private String uname;
- public Date getTimeDate(){
+ public Date getTimeDate() {
return new Date(time);
}
- public String getFontColorHex(){
+
+ public String getFontColorHex() {
return Integer.toHexString(fontColor);
}
}
diff --git a/src/main/java/com/yutou/bilibili/BiliBili/Live.java b/src/main/java/com/yutou/bilibili/BiliBili/Live.java
index 79a6bd7..251a50e 100644
--- a/src/main/java/com/yutou/bilibili/BiliBili/Live.java
+++ b/src/main/java/com/yutou/bilibili/BiliBili/Live.java
@@ -132,14 +132,12 @@ public class Live implements ApplicationContextAware {
*/
private void start() throws Exception {
run = true;
- if (LiveUtils.isLivePlayer(roomId)) {
- upData.setLive(-1);
- }
String url = LiveUtils.getLiveUrl(roomId);
if (url == null) {
stop();
return;
}
+ upData.checkLiveStatus();
startTime = new Date();
HashMap header = new HashMap<>();
header.put("Sec-WebSocket-Extensions", "permessage-deflate; client_max_window_bits");
@@ -325,7 +323,7 @@ public class Live implements ApplicationContextAware {
}
public void checkLive() {
- boolean isLive = LiveUtils.isLivePlayer(roomId);
+ boolean isLive = upData.checkLiveStatus() == 1;
if (SaveLive.getInstance().checkLive(roomId)) {
return;
}
@@ -489,19 +487,17 @@ public class Live implements ApplicationContextAware {
service.addLiveData(liveData);
break;
case "LIVE"://开始直播,不过有在心跳包上做检测了,所以也无所谓?
- if (upData.getLive() == 1) {
- break;
- }
- upData.setLive(1);
- JSONObject liveInfo = LiveUtils.getLiveInfo(roomId);
+
+ JSONObject liveInfo = LiveUtils.getLiveInfo(upData);
if (liveInfo == null) {
break;
}
+ upData.setLive(liveInfo.getInteger("live_status"));
LiveInfo info = new LiveInfo();
- info.setTitle(liveInfo.getJSONObject("data").getJSONObject("room_info").getString("title"));
- info.setKeyframe(liveInfo.getJSONObject("data").getJSONObject("room_info").getString("keyframe"));
- info.setRoomId(liveInfo.getJSONObject("data").getJSONObject("room_info").getInteger("room_id"));
- info.setShortId(liveInfo.getJSONObject("data").getJSONObject("room_info").getInteger("short_id"));
+ info.setTitle(liveInfo.getString("title"));
+ info.setKeyframe(liveInfo.getString("keyframe"));
+ info.setRoomId(liveInfo.getInteger("room_id"));
+ info.setShortId(liveInfo.getInteger("short_id"));
info.setInfo(liveInfo);
setLiveInfo(info);
StringBuilder builder = new StringBuilder();
@@ -520,8 +516,8 @@ public class Live implements ApplicationContextAware {
break;
case "WATCHED_CHANGE"://人气值
try {
- Live.this.info.setPopular(Integer.getInteger(json.getJSONObject("data").getString("text_small")));
- }catch (Exception ignored){
+ Live.this.info.setPopular(Integer.getInteger(json.getJSONObject("data").getString("text_small")));
+ } catch (Exception ignored) {
}
break;
case "SUPER_CHAT_MESSAGE_JPN":
@@ -624,7 +620,7 @@ public class Live implements ApplicationContextAware {
}
updateUpInfo();
if (upData.getOfflinelistening() != 1) {
- if (!LiveUtils.isLivePlayer(upData.getRoomid())) {
+ if (upData.getLive() == 0) {
stop();
}
}
diff --git a/src/main/java/com/yutou/bilibili/BiliBili/LiveUtils.java b/src/main/java/com/yutou/bilibili/BiliBili/LiveUtils.java
index 79bf9c8..48f0412 100644
--- a/src/main/java/com/yutou/bilibili/BiliBili/LiveUtils.java
+++ b/src/main/java/com/yutou/bilibili/BiliBili/LiveUtils.java
@@ -8,6 +8,7 @@ import com.alibaba.fastjson.JSONObject;
import com.yutou.bilibili.BiliBili.Services.IBiliBiliLiveService;
import com.yutou.bilibili.BiliBili.Tools.SaveLive;
import com.yutou.bilibili.Tools.AppTools;
+import com.yutou.bilibili.Tools.HttpTools;
import com.yutou.bilibili.Tools.Log;
import com.yutou.bilibili.Tools.RedisTools;
import com.yutou.bilibili.mybatis.Bili.mybatis.model.BilibiliUpInfo;
@@ -348,11 +349,26 @@ public class LiveUtils {
return null;
}
- public static JSONObject getLiveInfo(int roomId) {
- return http_get("https://api.live.bilibili.com/xlive/web-room/v1/index/getInfoByRoom?room_id=" + roomId + "&protocol=0,1&format=0,1,2&codec=0,1&qn=10000&platform=web&ptype=8");
+ public static long getMid(int roomId) {
+ JSONObject http_get = http_get("http://api.live.bilibili.com/room/v1/Room/room_init?id=" + roomId);
+ if (http_get == null) {
+ return -1;
+ }
+ if (http_get.getInteger("code") == 0) {
+ return http_get.getJSONObject("data").getLong("uid");
+ }
+ return -1;
}
- public static JSONObject getLiveRoomInfo(int roomId){
- String url="https://api.live.bilibili.com/xlive/web-room/v2/index/getRoomPlayInfo?room_id="+ roomId + "&protocol=0,1&format=0,1,2&codec=0,1&qn=10000&platform=web&ptype=8";
+
+ public static JSONObject getLiveInfo(BilibiliUpInfo info) {
+ List list = new ArrayList<>();
+ list.add(info);
+ JSONObject infoByUid = getStatusInfoByUid(list);
+ return infoByUid.getJSONObject("data").getJSONObject(info.getMid() + "");
+ }
+
+ public static JSONObject getLiveRoomInfo(int roomId) {
+ String url = "https://api.live.bilibili.com/xlive/web-room/v2/index/getRoomPlayInfo?room_id=" + roomId + "&protocol=0,1&format=0,1,2&codec=0,1&qn=10000&platform=web&ptype=8";
return http_get(url);
}
@@ -360,42 +376,37 @@ public class LiveUtils {
return liveStateMap.getOrDefault(roomId, false);
}
- public static void reloadLiveState(int roomId) {
- JSONObject json = getLiveRoomInfo(roomId);
- if (json != null) {
- try {
- liveStateMap.put(roomId, json.getJSONObject("data").getInteger("live_status") == 1);
- } catch (Exception e) {
- Log.i("live state = "+json);
+ public static JSONObject getStatusInfoByUid(List list) {
+ JSONArray userId = new JSONArray();
+ for (BilibiliUpInfo info : list) {
+ userId.add(info.getMid());
+ }
+ JSONObject json=new JSONObject();
+ json.put("uids",userId);
+ return JSONObject.parseObject(HttpTools.post("https://api.live.bilibili.com/room/v1/Room/get_status_info_by_uids", json.toJSONString().getBytes(StandardCharsets.UTF_8)));
+ }
+
+ public static void reloadLiveState(List list) {
+ JSONObject json = getStatusInfoByUid(list);
+ try {
+ if (json.getInteger("code") == 0) {
+ JSONObject data = json.getJSONObject("data");
+ for (BilibiliUpInfo info : list) {
+ if (data.containsKey(info.getMid() + "")) {
+ liveStateMap.put(info.getRoomid(), data.getJSONObject(info.getMid()+"").getInteger("live_status") == 1);
+ }
+ }
}
+ } catch (Exception e) {
+ Log.i("live state = " + json);
}
}
- public static String getLiveTitle(int roomId) {
- JSONObject json = getLiveInfo(roomId);
- if (json != null) {
- return json.getJSONObject("data").getJSONObject("room_info").getString("title");
- }
- return null;
- }
public static boolean isLivePlayer(int roomId) {
- return getLiveState(roomId);
+ return getLiveState(roomId);
}
- private static void checkLiveSave(int roomId) {
- BilibiliUpInfo upData = new BilibiliUpInfo();
- upData.setRoomid(roomId);
- Live live = liveContains(upData);
- if (live == null) {
- live = new Live();
- live.add(roomId, !StringUtils.isEmpty(AppTools.readFile(new File("cookies.json"))));
- }
- if (!SaveLive.getInstance().checkLive(roomId)) {
- SaveLive.getInstance().addLive(roomId);
- }
-
- }
public static class LiveGiftConfig {
@Resource
@@ -428,8 +439,12 @@ public class LiveUtils {
}
public static void main(String[] args) {
- LiveUtils.reloadLiveState(22047448);
- System.out.println(LiveUtils.getLiveState(22047448));
+ List list=new ArrayList<>();
+ BilibiliUpInfo info=new BilibiliUpInfo();
+ info.setMid(402417817L);
+ list.add(info);
+ JSONObject infoByUid = getStatusInfoByUid(list);
+ System.out.println(infoByUid);
}
}
diff --git a/src/main/java/com/yutou/bilibili/BiliBili/Tools/BiliTools.java b/src/main/java/com/yutou/bilibili/BiliBili/Tools/BiliTools.java
index ed48fc8..025cf1c 100644
--- a/src/main/java/com/yutou/bilibili/BiliBili/Tools/BiliTools.java
+++ b/src/main/java/com/yutou/bilibili/BiliBili/Tools/BiliTools.java
@@ -31,11 +31,10 @@ public class BiliTools {
com.yutou.bilibili.Tools.Log.i(json);
String roomId = json.getJSONObject("data").getJSONObject("room_info").getInteger("room_id") + "";
String name = json.getJSONObject("data").getJSONObject("anchor_info").getJSONObject("base_info").getString("uname");
- com.yutou.bilibili.Tools.Log.i(roomId);
- com.yutou.bilibili.Tools.Log.i(name);
upData.setRoomid(Integer.parseInt(roomId));
upData.setName(name);
upData.setUrl(url);
+ upData.setMid(LiveUtils.getMid(upData.getRoomid()));
return upData;
}
}
diff --git a/src/main/java/com/yutou/bilibili/BiliBili/Tools/SaveLive.java b/src/main/java/com/yutou/bilibili/BiliBili/Tools/SaveLive.java
index 0d7ecc0..a274861 100644
--- a/src/main/java/com/yutou/bilibili/BiliBili/Tools/SaveLive.java
+++ b/src/main/java/com/yutou/bilibili/BiliBili/Tools/SaveLive.java
@@ -20,7 +20,6 @@ public class SaveLive {
private final Map heartbeats = new HashMap<>();
public static void main(String[] args) {
- SaveLive.getInstance().addLive(3715397);
}
private SaveLive() {
@@ -34,7 +33,13 @@ public class SaveLive {
}
public void addLive(Live live) {
- addLive(live.geData().getRoomid());
+ if (saveList.contains(live.getInfo().getRoomid() + "")) {
+ return;
+ }
+ if (live.geData().checkLiveStatus() == 0) {
+ return;
+ }
+ start(live.getInfo().getRoomid());
}
public void startLive(int roomId) {
@@ -42,15 +47,6 @@ public class SaveLive {
saveList.add(roomId + "");
}
- public void addLive(int roomId) {
- if (saveList.contains(roomId + "")) {
- return;
- }
- if (!LiveUtils.isLivePlayer(roomId)) {
- return;
- }
- start(roomId);
- }
public boolean checkLive(int roomId) {
return saveList.contains(roomId + "");
@@ -120,9 +116,9 @@ public class SaveLive {
super.run();
String url = getLiveUrl(roomId);
try {
- if(AppData.LIVE_SAVE_FFMPEG){
+ if (AppData.LIVE_SAVE_FFMPEG) {
ffmpegDownload(url);
- }else {
+ } else {
httpDownload(url);
}
} catch (Exception e) {
@@ -138,7 +134,7 @@ public class SaveLive {
private void ffmpegDownload(String url) throws Exception {
liveFile = new File(String.format("%slive%s%s%s[%s]%d.mp4",
- ConfigTools.load(ConfigTools.CONFIG,"liveSavePath"),
+ ConfigTools.load(ConfigTools.CONFIG, "liveSavePath"),
File.separator,
AppTools.getToDayTime(),
File.separator,
@@ -158,16 +154,16 @@ public class SaveLive {
""
);
System.out.println(exec);
- boolean isPrint=false;
- Process process=AppTools.exec(exec);
+ boolean isPrint = false;
+ Process process = AppTools.exec(exec);
InputStream inputStream = process.getErrorStream();
byte[] bytes = new byte[2048];
- while (inputStream.read(bytes) > -1&&isSave) {
+ while (inputStream.read(bytes) > -1 && isSave) {
//System.out.println(new String(bytes,StandardCharsets.UTF_8));
- if(!isPrint){
+ if (!isPrint) {
com.yutou.bilibili.Tools.Log.i("开始录制:" + roomId);
QQBotManager.getInstance().sendMessage(roomId + " 已启动录制");
- isPrint=true;
+ isPrint = true;
}
}
process.destroy();
@@ -188,7 +184,7 @@ public class SaveLive {
//heartbeats.add(beat);
InputStream inputStream = connection.getInputStream();
liveFile = new File(String.format("%slive%s%s%s[%s]%d.mp4",
- ConfigTools.load(ConfigTools.CONFIG,"liveSavePath"),
+ ConfigTools.load(ConfigTools.CONFIG, "liveSavePath"),
File.separator,
AppTools.getToDayTime(),
File.separator,
@@ -198,17 +194,17 @@ public class SaveLive {
liveFile.mkdirs();
liveFile.delete();
}
- boolean isPrint=false;
+ boolean isPrint = false;
FileOutputStream outputStream = new FileOutputStream(liveFile);
int len;
byte[] bytes = new byte[1024];
while ((len = inputStream.read(bytes)) != -1 && isSave) {
outputStream.write(bytes, 0, len);
outputStream.flush();
- if(!isPrint){
+ if (!isPrint) {
com.yutou.bilibili.Tools.Log.i("开始录制:" + roomId);
QQBotManager.getInstance().sendMessage(roomId + " 已启动录制");
- isPrint=true;
+ isPrint = true;
}
}
outputStream.close();
diff --git a/src/main/java/com/yutou/bilibili/BilibiliApplication.java b/src/main/java/com/yutou/bilibili/BilibiliApplication.java
index 37f78cf..2d1b912 100644
--- a/src/main/java/com/yutou/bilibili/BilibiliApplication.java
+++ b/src/main/java/com/yutou/bilibili/BilibiliApplication.java
@@ -13,7 +13,7 @@ import org.springframework.context.annotation.Import;
@SpringBootApplication
public class BilibiliApplication {
- public static String version="0.8.3";
+ public static String version="0.8.4";
public static void main(String[] args) {
QQBotManager.getInstance().init();
diff --git a/src/main/java/com/yutou/bilibili/Tools/ApplicationInit.java b/src/main/java/com/yutou/bilibili/Tools/ApplicationInit.java
index 0e04066..e7416f4 100644
--- a/src/main/java/com/yutou/bilibili/Tools/ApplicationInit.java
+++ b/src/main/java/com/yutou/bilibili/Tools/ApplicationInit.java
@@ -37,8 +37,8 @@ public class ApplicationInit implements ApplicationRunner {
@Override
public void run(ApplicationArguments args) throws Exception {
LiveUtils.LiveGiftConfig.getInstance();
- AppData.FFMPEG=configService.getConfig(Config.SYSTEM_VIDEO_FFMPEG);
- AppData.LIVE_SAVE_FFMPEG= configService.getConfig(Config.SYSTEM_VIDEO_SAVE_MODEL) != null && configService.getConfig(Config.SYSTEM_VIDEO_SAVE_MODEL).equals("ffmpeg");
+ AppData.FFMPEG = configService.getConfig(Config.SYSTEM_VIDEO_FFMPEG);
+ AppData.LIVE_SAVE_FFMPEG = configService.getConfig(Config.SYSTEM_VIDEO_SAVE_MODEL) != null && configService.getConfig(Config.SYSTEM_VIDEO_SAVE_MODEL).equals("ffmpeg");
startTimer();
}
@@ -93,10 +93,11 @@ public class ApplicationInit implements ApplicationRunner {
}
private void checkLive() {
- for (BilibiliUpInfo info : service.getUpInfo()) {
- LiveUtils.reloadLiveState(info.getRoomid());
+ List list = service.getUpInfo();
+ LiveUtils.reloadLiveState(list);
+ for (BilibiliUpInfo info : list) {
if (info.getOfflinelistening() == 1) {
- if (info.getEnable() == 1) {
+ if (info.getEnable() == 1 && LiveUtils.isLivePlayer(info.getRoomid())) {
Live live = LiveUtils.liveContains(info);
if (live == null) {
live = new Live();
@@ -106,7 +107,7 @@ public class ApplicationInit implements ApplicationRunner {
}
}
}
- }, 0, 2*60 * 1000);
+ }, 0, 2 * 60 * 1000);
}
}
diff --git a/src/main/java/com/yutou/bilibili/Tools/AssTools.java b/src/main/java/com/yutou/bilibili/Tools/AssTools.java
new file mode 100644
index 0000000..e476661
--- /dev/null
+++ b/src/main/java/com/yutou/bilibili/Tools/AssTools.java
@@ -0,0 +1,158 @@
+package com.yutou.bilibili.Tools;
+
+import com.yutou.bilibili.BiliBili.Datas.DanmuData;
+
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.text.DecimalFormat;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+
+public class AssTools {
+ private final StringBuilder builder;
+ private final Date startTime;
+ private int y = 0;
+ private List filters = new ArrayList<>();
+ private String alpha="80";
+
+ /**
+ * 弹幕转换ass
+ * @param title 标题
+ * @param startTime 录像起始时间
+ */
+ public AssTools(String title, Date startTime) {
+ builder = new StringBuilder();
+ this.startTime = startTime;
+ initAssHeader(title);
+ }
+
+ /**
+ * 弹幕过滤器
+ * @param filter 过滤词
+ */
+ public void addFilter(String... filter) {
+ filters.addAll(Arrays.asList(filter));
+ }
+
+ /**
+ * 弹幕透明度
+ * @param alpha 0 完全不透明 255 完全透明
+ */
+ public void setAlpha(int alpha){
+ this.alpha=Integer.toHexString(alpha);
+ }
+ private void addBuilder(String txt) {
+ builder.append(txt).append("\n");
+ }
+
+ private void initAssHeader(String title) {
+ addBuilder("[Script Info]");
+ addBuilder("Title: " + title);
+ addBuilder("Original Script: 本字幕由@yutou生成");
+ addBuilder("ScriptType: v4.00+");
+ addBuilder("Collisions: Normal");
+ addBuilder("PlayResX: 560");
+ addBuilder("PlayResY: 420");
+ addBuilder("Timer: 10.0000");
+ addBuilder("");
+ addBuilder("[V4+ Styles]");
+ addBuilder("Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, ");
+ addBuilder("MarginL, MarginR, MarginV, Encoding");
+ addBuilder("Style: Fix,Microsoft YaHei UI,25,&H66FFFFFF,&H66FFFFFF,&H66000000,&H66000000,1,0,0,0,100,100,0,0,1,2,0,2,20,20,2,0");
+ addBuilder("Style: R2L,Microsoft YaHei UI,25,&H66FFFFFF,&H66FFFFFF,&H66000000,&H66000000,1,0,0,0,100,100,0,0,1,2,0,2,20,20,2,0");
+ addBuilder("");
+ addBuilder("[Events]");
+ addBuilder("Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text");
+ }
+
+ /**
+ * 保存弹幕文件
+ * @param savePath 存储路径
+ * @return 存储结果
+ */
+ public boolean saveDanmu(String savePath) {
+ System.out.println("savePath = " + savePath);
+ File file = new File(savePath);
+ try {
+ if (file.exists()) {
+ if (!file.delete()) {
+ return false;
+ }
+ }
+ boolean mkdirs = file.mkdirs();
+ boolean delete = file.delete();
+ if (!mkdirs || !delete) {
+ return false;
+ }
+ if (!file.createNewFile()) {
+ return false;
+ }
+ FileWriter writer = new FileWriter(file);
+ writer.write(builder.toString());
+ writer.flush();
+ writer.close();
+ return true;
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ return false;
+ }
+
+ /**
+ * 添加弹幕
+ * @param danmuData 弹幕
+ */
+ public void addDanmu(DanmuData danmuData) {
+ if (filters.contains(danmuData.getDanmu())) {
+ return;
+ }
+ addY();
+ long _time = (danmuData.getTime() - startTime.getTime());
+ long h = TimeUnit.MILLISECONDS.toHours(_time);
+ long m = TimeUnit.MILLISECONDS.toMinutes(_time) % 60;
+ long s = TimeUnit.MILLISECONDS.toSeconds(_time) % 60;
+ String sTime = String.format("%s:%s:%s.0",
+ new DecimalFormat("00").format(h),
+ new DecimalFormat("00").format(m),
+ new DecimalFormat("00").format(s));
+ if (s >= 52) {
+ s = (s + 8) - 60;
+ m++;
+ } else {
+ s += 8;
+ }
+ String eTime = String.format("%s:%s:%s.0",
+ new DecimalFormat("00").format(h),
+ new DecimalFormat("00").format(m),
+ new DecimalFormat("00").format(s));
+ float x1, x2;
+ x1 = 560 + (danmuData.getDanmu().length() * 12.5f);
+ x2 = 0 - (danmuData.getDanmu().length() * 12.5f);
+
+ String ass = String.format("Dialogue: 0,%s,%s,R2L,,20,20,2,,{\\move(%.1f,%d,%.1f,%d)\\c&%s\\alpha&H%s}%s",
+ sTime,
+ eTime,
+ x1,
+ y,
+ x2,
+ y,
+ danmuData.getFontColorHex(),
+ alpha,
+ danmuData.getDanmu()
+ );
+ addBuilder(ass);
+ }
+
+
+ private void addY() {
+ y += 25;
+ if (y >= 420) {
+ y = 25;
+ }
+ }
+
+}
diff --git a/src/main/java/com/yutou/bilibili/Tools/DanmuTools.java b/src/main/java/com/yutou/bilibili/Tools/DanmuTools.java
new file mode 100644
index 0000000..75efcef
--- /dev/null
+++ b/src/main/java/com/yutou/bilibili/Tools/DanmuTools.java
@@ -0,0 +1,66 @@
+package com.yutou.bilibili.Tools;
+
+import com.yutou.bilibili.BiliBili.Datas.DanmuData;
+import com.yutou.bilibili.sqlite.BiliBiliLiveDatabasesManager;
+
+import java.io.File;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.nio.file.attribute.BasicFileAttributes;
+import java.nio.file.attribute.FileTime;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class DanmuTools {
+ public static File danmuToAss(File live, File danmu, boolean useFileNameData, String... filterDanmu) {
+ BiliBiliLiveDatabasesManager manager = new BiliBiliLiveDatabasesManager();
+ try {
+ FileTime creationTime = Files.readAttributes(Paths.get(live.getAbsolutePath()), BasicFileAttributes.class).creationTime();
+ FileTime lastModifiedTime = Files.readAttributes(Paths.get(live.getAbsolutePath()), BasicFileAttributes.class).lastModifiedTime();
+ Date startTime;
+ if (useFileNameData) {
+ startTime = getLiveDate(live.getName());
+ } else {
+ startTime = new Date(creationTime.toMillis());
+ }
+ manager.init(danmu);
+ List danmuData = manager.queryDanmu(startTime, new Date(lastModifiedTime.toMillis()));
+ AssTools assTools = new AssTools(live.getName(), startTime);
+ assTools.addFilter(filterDanmu);
+ assTools.setAlpha(128);
+ for (DanmuData danmuDatum : danmuData) {
+ assTools.addDanmu(danmuDatum);
+ }
+ assTools.saveDanmu(live.getAbsolutePath().replace(live.getName().substring(live.getName().lastIndexOf(".")), ".ass"));
+ } catch (Exception e) {
+ e.printStackTrace();
+ } finally {
+ manager.close();
+ }
+ return null;
+ }
+
+ private static Date getLiveDate(String fileName) {
+ Pattern pattern = Pattern.compile("(\\[.*\\]).");
+ Matcher matcher = pattern.matcher(fileName);
+ if (matcher.find()) {
+ String str = matcher.group(1);
+ try {
+ return new SimpleDateFormat("[yyyy-MM-dd HHmmss]").parse(str);
+ } catch (ParseException e) {
+ e.printStackTrace();
+ }
+ }
+ return null;
+ }
+
+ public static void main(String[] args) {
+ File live = new File("Z:\\BiliBiliLive\\2021年7月10日BML-Sp\\[2021-07-10 165521]22408644.mp4");
+ File danmu = new File("Z:\\BiliBiliLive\\2021年7月10日BML-Sp\\[2021-07-10]22408644.db");
+ danmuToAss(live, danmu,true, "老板大气!点点红包抽礼物!");
+ }
+}
diff --git a/src/main/java/com/yutou/bilibili/Tools/HttpTools.java b/src/main/java/com/yutou/bilibili/Tools/HttpTools.java
index ef6f3cc..49722c3 100644
--- a/src/main/java/com/yutou/bilibili/Tools/HttpTools.java
+++ b/src/main/java/com/yutou/bilibili/Tools/HttpTools.java
@@ -1,86 +1,104 @@
package com.yutou.bilibili.Tools;
import com.alibaba.fastjson.JSONObject;
-import com.yutou.bilibili.interfaces.NetworkInterface;
+import com.yutou.bilibili.interfaces.DownloadInterface;
+import org.springframework.util.StringUtils;
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.io.OutputStream;
+import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
+import java.net.URLConnection;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
+import java.util.Map;
import java.util.Set;
public class HttpTools {
+ private static final int HttpRequestIndex = 3;
+
public static String get(String url) {
+ return https_get(url, null);
+ }
+
+ public static String post(final String url, final byte[] body) {
+ return http_post(url, body, 0, null);
+ }
+
+ public static File syncDownload(final String url, final String saveName) {
+ return new HttpTools().http_syncDownload(url, saveName);
+ }
+
+ public static String https_get(String url, Map header) {
try {
- HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
- connection.setRequestProperty("User-Agent", getKuKuUA());
+ URLConnection connection;
+ connection = new URL(url).openConnection();
+ connection.setConnectTimeout(60*1000);
+ connection.setReadTimeout(60*1000);
+ connection.setRequestProperty("User-Agent", getExtUa());
+ if (header != null) {
+ for (String key : header.keySet()) {
+ connection.addRequestProperty(key, header.get(key));
+ }
+ }
+ connection.connect();
BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
StringBuilder str = new StringBuilder();
String tmp;
while ((tmp = reader.readLine()) != null) {
- str.append(tmp);
+ str.append(tmp).append("\n");
}
reader.close();
- connection.disconnect();
return str.toString();
} catch (Exception e) {
- com.yutou.bilibili.Tools.Log.e(e);
+ System.err.println("error url = " + url);
+ e.printStackTrace();
}
return null;
}
- public synchronized static void post(final String url, final byte[] body, final NetworkInterface networkInterface) {
-
- new Thread(new Runnable() {
-
- @Override
- public void run() {
- String tmp;
- StringBuilder str = new StringBuilder();
- try {
- HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
- connection.setRequestMethod("POST");
- connection.setDoOutput(true);
- connection.setDoInput(true);
- connection.setConnectTimeout(5 * 1000);
- connection.setReadTimeout(10 * 1000);
- connection.addRequestProperty("Connection", "keep-alive");
- connection.addRequestProperty("Accept", "*/*");
- connection.addRequestProperty("User-Agent", getExtUa());
- //connection.addRequestProperty("content-type", "application/json");
- connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
- connection.addRequestProperty("charset", "UTF-8");
- OutputStream outputStream = connection.getOutputStream();
-
- outputStream.write(body);
- outputStream.write("\n".getBytes(StandardCharsets.UTF_8));
- outputStream.flush();
- BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
- while ((tmp = reader.readLine()) != null) {
- str.append(tmp);
- }
-
- // com.yutou.bilibili.Tools.Log.i( "[" + url + "?" + new String(body,StandardCharsets.UTF_8) + "]body:" + str + " (" + connection.getResponseCode() + ")");
- if (networkInterface != null) {
- try {
- networkInterface.httpGetData(str.toString(), connection.getResponseCode());
- } catch (IOException e) {
- com.yutou.bilibili.Tools.Log.e(e);
- }
- networkInterface.onCookie(connection.getHeaderField("Set-Cookie"));
- }
- connection.disconnect();
- outputStream.close();
- reader.close();
- } catch (Exception e) {
- networkInterface.httpError(e);
+ public static String http_post(String url, byte[] body, int index, Map headers) {
+ String tmp;
+ StringBuilder str = new StringBuilder();
+ try {
+ HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
+ connection.setRequestMethod("POST");
+ if (headers != null) {
+ for (String key : headers.keySet()) {
+ connection.addRequestProperty(key, headers.get(key));
}
}
- }).start();
+ connection.setDoOutput(true);
+ connection.setDoInput(true);
+ connection.addRequestProperty("User-Agent", getExtUa());
+ connection.setConnectTimeout(5 * 1000);
+ connection.setReadTimeout(10 * 1000);
+ //connection.addRequestProperty("Connection", "keep-alive");
+ //connection.addRequestProperty("User-Agent", getExtUa());
+ connection.addRequestProperty("content-type", "application/json");
+ //connection.addRequestProperty("charset", "UTF-8");
+ OutputStream outputStream = connection.getOutputStream();
+ //System.out.println(new String(body));
+ outputStream.write(body);
+ outputStream.flush();
+ outputStream.close();
+ connection.connect();
+ BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
+ while ((tmp = reader.readLine()) != null) {
+ str.append(tmp);
+ }
+ String finalStr = str.toString();
+
+ connection.disconnect();
+ reader.close();
+ return finalStr;
+ } catch (Exception e) {
+ if (index < HttpRequestIndex) {
+ return http_post(url, body, index + 1, headers);
+ } else {
+ e.printStackTrace();
+ return null;
+ }
+ }
}
private static String getExtUa() {
@@ -96,11 +114,11 @@ public class HttpTools {
Set keys = json.keySet();
for (String key : keys) {
try {
- string.append("&").append(key).append("=").append(URLEncoder.encode(json.getString(key), "UTF-8"));
+ string.append("&").append(key).append("=").append(URLEncoder.encode(json.getString(key),"utf-8"));
} catch (Exception e) {
- com.yutou.bilibili.Tools.Log.e(e);
+ e.printStackTrace();
try {
- string.append("&").append(URLEncoder.encode(key, "UTF-8")).append("=");
+ string.append("&").append(URLEncoder.encode(key, "utf-8")).append("=");
// string += "&" + key + "=";
} catch (Exception e1) {
string.append("&").append(key).append("=");
@@ -130,7 +148,114 @@ public class HttpTools {
}
});
}*/
- com.yutou.bilibili.Tools.Log.i(url);
- //String str=get(url);
+ }
+
+ private static String donwloadPath = "tmp" + File.separator;
+
+ public synchronized static void download(final String url, final String saveName, final DownloadInterface downloadInterface) {
+ new Thread(new Runnable() {
+ @Override
+ public void run() {
+ File jar = null;
+ try {
+ File savePath = new File(donwloadPath);
+ if (!savePath.exists()) {
+ savePath.mkdirs();
+ }
+ Log.i("DOWNLOAD", "下载文件:" + url + " 保存文件:" + saveName);
+ HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
+ connection.addRequestProperty("User-Agent", getExtUa());
+ // Log.i(TAG,"获取到网络请求:"+connection.getResponseCode());
+
+
+ InputStream inputStream = connection.getInputStream();
+ jar = new File(donwloadPath + saveName + "_tmp.tmp");
+ jar.createNewFile();
+ Log.i("DOWNLOAD", "临时保存文件:" + jar.getAbsolutePath());
+ OutputStream outputStream = new FileOutputStream(jar);
+ byte[] bytes = new byte[1024];
+ double size = connection.getContentLength();
+ double downSize = 0;
+ int len;
+ while ((len = inputStream.read(bytes)) > 0) {
+ outputStream.write(bytes, 0, len);
+ downSize += len;
+ if (downloadInterface != null) {
+ downloadInterface.onDownloading(downSize, size);
+ }
+ }
+ outputStream.close();
+ inputStream.close();
+ File oldJar = new File(donwloadPath + saveName);
+ if (oldJar.exists()) {
+ oldJar.delete();
+ }
+ jar.renameTo(oldJar);
+ Log.i("DOWNLOAD", "实际保存:" + oldJar.getAbsolutePath() + " " + oldJar.getName());
+ if (downloadInterface != null) {
+ downloadInterface.onDownload(oldJar);
+
+ }
+
+ } catch (Exception e) {
+ e.printStackTrace();
+ if (jar != null) {
+ jar.delete();
+ }
+ if (downloadInterface != null) {
+ downloadInterface.onError(e);
+ }
+ }
+ }
+ }).start();
+ }
+
+ public synchronized File http_syncDownload(final String url, final String saveName) {
+ if (StringUtils.isEmpty(url)) {
+ return null;
+ }
+ File jar = null;
+ try {
+ File savePath = new File(donwloadPath);
+ if (!savePath.exists()) {
+ savePath.mkdirs();
+ }
+ Log.i("DOWNLOAD", "下载文件:" + url + " 保存文件:" + saveName);
+ HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
+ connection.addRequestProperty("User-Agent", getExtUa());
+ // Log.i(TAG,"获取到网络请求:"+connection.getResponseCode());
+
+
+ InputStream inputStream = connection.getInputStream();
+ jar = new File(donwloadPath + saveName + "_tmp.tmp");
+ jar.createNewFile();
+ Log.i("DOWNLOAD", "临时保存文件:" + jar.getAbsolutePath());
+ OutputStream outputStream = new FileOutputStream(jar);
+ byte[] bytes = new byte[1024];
+ double size = connection.getContentLength();
+ double downSize = 0;
+ int len;
+ while ((len = inputStream.read(bytes)) > 0) {
+ outputStream.write(bytes, 0, len);
+ downSize += len;
+ }
+ outputStream.close();
+ inputStream.close();
+ File oldJar = new File(donwloadPath + saveName);
+ if (oldJar.exists()) {
+ oldJar.delete();
+ }
+ connection.disconnect();
+ jar.renameTo(oldJar);
+ Log.i("DOWNLOAD", "实际保存:" + oldJar.getAbsolutePath() + " " + oldJar.getName());
+ return oldJar;
+
+ } catch (Exception e) {
+ e.printStackTrace();
+ if (jar != null) {
+ jar.delete();
+ }
+ return null;
+ }
}
}
diff --git a/src/main/java/com/yutou/bilibili/Tools/Log.java b/src/main/java/com/yutou/bilibili/Tools/Log.java
index f07f380..57d8adf 100644
--- a/src/main/java/com/yutou/bilibili/Tools/Log.java
+++ b/src/main/java/com/yutou/bilibili/Tools/Log.java
@@ -10,6 +10,9 @@ import java.util.logging.Logger;
public class Log {
private static Logger logger;
+ public static void i(String tag, Object log) {
+ i('[' + tag + ']' + log);
+ }
public static void i(Object log) {
if (!((boolean) ConfigTools.load(ConfigTools.CONFIG, "logout"))) {
return;
diff --git a/src/main/java/com/yutou/bilibili/mybatis/Bili/mybatis/model/BilibiliUpInfo.java b/src/main/java/com/yutou/bilibili/mybatis/Bili/mybatis/model/BilibiliUpInfo.java
index a752210..f14d90b 100644
--- a/src/main/java/com/yutou/bilibili/mybatis/Bili/mybatis/model/BilibiliUpInfo.java
+++ b/src/main/java/com/yutou/bilibili/mybatis/Bili/mybatis/model/BilibiliUpInfo.java
@@ -1,6 +1,8 @@
package com.yutou.bilibili.mybatis.Bili.mybatis.model;
import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
import com.yutou.bilibili.BiliBili.LiveUtils;
import lombok.Data;
@@ -23,6 +25,8 @@ public class BilibiliUpInfo implements Serializable {
*/
private String url;
+ private Long mid=0L;
+
/**
* 房间号
*/
@@ -43,8 +47,14 @@ public class BilibiliUpInfo implements Serializable {
private static final long serialVersionUID = 1L;
+ public Integer checkLiveStatus(){
+ List list=new ArrayList<>();
+ list.add(this);
+ live= LiveUtils.getStatusInfoByUid(list).getJSONObject("data").getJSONObject(mid+"").getInteger("live_status");
+ return live;
+ }
+
public Integer getLive() {
- live= LiveUtils.getLiveState(roomid)?1:0;
return live;
}
}
\ No newline at end of file
diff --git a/src/main/java/com/yutou/bilibili/mybatis/Bili/mybatis/model/BilibiliUpInfoExample.java b/src/main/java/com/yutou/bilibili/mybatis/Bili/mybatis/model/BilibiliUpInfoExample.java
index 8027cc1..1b17922 100644
--- a/src/main/java/com/yutou/bilibili/mybatis/Bili/mybatis/model/BilibiliUpInfoExample.java
+++ b/src/main/java/com/yutou/bilibili/mybatis/Bili/mybatis/model/BilibiliUpInfoExample.java
@@ -304,6 +304,66 @@ public class BilibiliUpInfoExample {
return (Criteria) this;
}
+ public Criteria andMidIsNull() {
+ addCriterion("mid is null");
+ return (Criteria) this;
+ }
+
+ public Criteria andMidIsNotNull() {
+ addCriterion("mid is not null");
+ return (Criteria) this;
+ }
+
+ public Criteria andMidEqualTo(Integer value) {
+ addCriterion("mid =", value, "mid");
+ return (Criteria) this;
+ }
+
+ public Criteria andMidNotEqualTo(Integer value) {
+ addCriterion("mid <>", value, "mid");
+ return (Criteria) this;
+ }
+
+ public Criteria andMidGreaterThan(Integer value) {
+ addCriterion("mid >", value, "mid");
+ return (Criteria) this;
+ }
+
+ public Criteria andMidGreaterThanOrEqualTo(Integer value) {
+ addCriterion("mid >=", value, "mid");
+ return (Criteria) this;
+ }
+
+ public Criteria andMidLessThan(Integer value) {
+ addCriterion("mid <", value, "mid");
+ return (Criteria) this;
+ }
+
+ public Criteria andMidLessThanOrEqualTo(Integer value) {
+ addCriterion("mid <=", value, "mid");
+ return (Criteria) this;
+ }
+
+ public Criteria andMidIn(List values) {
+ addCriterion("mid in", values, "mid");
+ return (Criteria) this;
+ }
+
+ public Criteria andMidNotIn(List values) {
+ addCriterion("mid not in", values, "mid");
+ return (Criteria) this;
+ }
+
+ public Criteria andMidBetween(Integer value1, Integer value2) {
+ addCriterion("mid between", value1, value2, "mid");
+ return (Criteria) this;
+ }
+
+ public Criteria andMidNotBetween(Integer value1, Integer value2) {
+ addCriterion("mid not between", value1, value2, "mid");
+ return (Criteria) this;
+ }
+
public Criteria andRoomidIsNull() {
addCriterion("roomid is null");
return (Criteria) this;
diff --git a/src/main/java/com/yutou/bilibili/sqlite/BiliBiliLiveDatabasesManager.java b/src/main/java/com/yutou/bilibili/sqlite/BiliBiliLiveDatabasesManager.java
index c16c08a..a8dc1cf 100644
--- a/src/main/java/com/yutou/bilibili/sqlite/BiliBiliLiveDatabasesManager.java
+++ b/src/main/java/com/yutou/bilibili/sqlite/BiliBiliLiveDatabasesManager.java
@@ -10,6 +10,7 @@ import com.yutou.bilibili.Tools.AppTools;
import com.yutou.bilibili.Tools.Log;
import com.yutou.bilibili.mybatis.Bili.mybatis.model.BilibiliLiveData;
+import java.io.File;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
@@ -23,11 +24,21 @@ public class BiliBiliLiveDatabasesManager extends SQLiteManager {
super();
}
+ private JSONObject getInitJSON(){
+ return JSONObject.parseObject("{\"file\":\"bilibili.db\",\"table\":[{\"name\":\"danmu\",\"item\":[{\"name\":\"id\",\"type\":\"int\",\"isNull\":false,\"isKey\":true},{\"name\":\"model\",\"type\":\"int\",\"isNull\":false,\"isKey\":false},{\"name\":\"fontSize\",\"type\":\"int\",\"isNull\":false,\"isKey\":false},{\"name\":\"fontColor\",\"type\":\"int\",\"isNull\":false,\"isKey\":false},{\"name\":\"time\",\"type\":\"int\",\"isNull\":false,\"isKey\":false},{\"name\":\"uCode\",\"type\":\"String\",\"isNull\":false,\"isKey\":false},{\"name\":\"danmu\",\"type\":\"String\",\"isNull\":false,\"isKey\":false},{\"name\":\"uid\",\"type\":\"int\",\"isNull\":false,\"isKey\":false},{\"name\":\"uname\",\"type\":\"String\",\"isNull\":false,\"isKey\":false}]}]}");
+ }
public void init(String fileName){
- JSONObject json = JSONObject.parseObject("{\"file\":\"bilibili.db\",\"table\":[{\"name\":\"danmu\",\"item\":[{\"name\":\"id\",\"type\":\"int\",\"isNull\":false,\"isKey\":true},{\"name\":\"model\",\"type\":\"int\",\"isNull\":false,\"isKey\":false},{\"name\":\"fontSize\",\"type\":\"int\",\"isNull\":false,\"isKey\":false},{\"name\":\"fontColor\",\"type\":\"int\",\"isNull\":false,\"isKey\":false},{\"name\":\"time\",\"type\":\"int\",\"isNull\":false,\"isKey\":false},{\"name\":\"uCode\",\"type\":\"String\",\"isNull\":false,\"isKey\":false},{\"name\":\"danmu\",\"type\":\"String\",\"isNull\":false,\"isKey\":false},{\"name\":\"uid\",\"type\":\"int\",\"isNull\":false,\"isKey\":false},{\"name\":\"uname\",\"type\":\"String\",\"isNull\":false,\"isKey\":false}]}]}");
+ JSONObject json = getInitJSON();
+ json.put("model","create");
json.put("file",fileName+".db");
build(json);
}
+ public void init(File file){
+ JSONObject json = getInitJSON();
+ json.put("model","load");
+ json.put("file",file.getAbsolutePath());
+ build(json);
+ }
/**
* 添加弹幕
@@ -72,10 +83,10 @@ public class BiliBiliLiveDatabasesManager extends SQLiteManager {
data.setModel(set.getInt("model"));
data.setFontSize(set.getInt("fontSize"));
data.setFontColor(set.getInt("fontColor"));
- data.setTime(set.getInt("time"));
+ data.setTime(set.getLong("time"));
data.setUCode(set.getString("uCode"));
data.setDanmu(set.getString("danmu"));
- data.setUid(set.getInt("uid"));
+ data.setUid(set.getLong("uid"));
data.setUname(set.getString("uname"));
list.add(data);
}
diff --git a/src/main/java/com/yutou/bilibili/sqlite/SQLiteManager.java b/src/main/java/com/yutou/bilibili/sqlite/SQLiteManager.java
index e718300..67799c3 100644
--- a/src/main/java/com/yutou/bilibili/sqlite/SQLiteManager.java
+++ b/src/main/java/com/yutou/bilibili/sqlite/SQLiteManager.java
@@ -30,7 +30,8 @@ public class SQLiteManager {
com.yutou.bilibili.Tools.Log.e(e);
}
}
- public void close(){
+
+ public void close() {
try {
conn.close();
} catch (SQLException throwables) {
@@ -49,22 +50,24 @@ public class SQLiteManager {
protected SQLiteManager() {
}
- private void createSql(JSONObject json){
+
+ private void createSql(JSONObject json) {
try {
sql.mkdirs();
sql.delete();
conn = DriverManager.getConnection(url + sql.getAbsolutePath());
- }catch (Exception e){
+ } catch (Exception e) {
com.yutou.bilibili.Tools.Log.e(e);
}
startBatch();
- JSONArray array=json.getJSONArray("table");
+ JSONArray array = json.getJSONArray("table");
for (Object o : array) {
- com.yutou.bilibili.Tools.Log.i("创建表:"+((JSONObject)o).getString("name"));
+ com.yutou.bilibili.Tools.Log.i("创建表:" + ((JSONObject) o).getString("name"));
createSqlOfTable((JSONObject) o);
}
closeBatch();
}
+
private void createSqlOfTable(JSONObject table) {
String tableName = table.getString("name");
try {
@@ -109,7 +112,11 @@ public class SQLiteManager {
protected void build(JSONObject json) {
try {
Class.forName("org.sqlite.JDBC");
- sql = new File("databases" + File.separator + json.getString("file"));
+ if ("load".equals(json.getString("model"))) {
+ sql = new File(json.getString("file"));
+ } else {
+ sql = new File("databases" + File.separator + json.getString("file"));
+ }
if (!sql.exists()) {
createSql(json);
} else {
diff --git a/src/main/resources/mappers/BilibiliUpInfoDao.xml b/src/main/resources/mappers/BilibiliUpInfoDao.xml
index 157e036..2ec2e6f 100644
--- a/src/main/resources/mappers/BilibiliUpInfoDao.xml
+++ b/src/main/resources/mappers/BilibiliUpInfoDao.xml
@@ -5,6 +5,7 @@
+
@@ -71,7 +72,7 @@
- id, `name`, url, roomid, offlineListening, saveDanmu, `enable`, live, saveLive
+ id, `name`, url, mid, roomid, offlineListening, saveDanmu, `enable`, live, saveLive