From a1382ff7be3c2646b3e6571a1ca36edcac4db715 Mon Sep 17 00:00:00 2001 From: Yutousama <583819556@qq.com> Date: Sun, 24 Apr 2022 20:57:46 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=BC=B9=E5=B9=95=E8=BD=ACas?= =?UTF-8?q?s=E5=B7=A5=E5=85=B7=EF=BC=88=E6=9C=AA=E4=B8=8A=E7=BA=BF?= =?UTF-8?q?=E8=87=B3=E7=BD=91=E9=A1=B5=EF=BC=89=20=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E8=8E=B7=E5=8F=96=E7=9B=B4=E6=92=AD=E7=8A=B6=E6=80=81=E7=9A=84?= =?UTF-8?q?=E6=96=B9=E6=B3=95=20=E6=96=B0=E5=A2=9E=E4=B8=BB=E6=92=ADuid?= =?UTF-8?q?=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Web/html/body/bilibili/upInfo.html | 28 +- .../Controllers/UpInfoController.java | 37 +-- .../bilibili/BiliBili/Datas/DanmuData.java | 7 +- .../com/yutou/bilibili/BiliBili/Live.java | 28 +- .../yutou/bilibili/BiliBili/LiveUtils.java | 83 +++--- .../bilibili/BiliBili/Tools/BiliTools.java | 3 +- .../bilibili/BiliBili/Tools/SaveLive.java | 42 ++- .../yutou/bilibili/BilibiliApplication.java | 2 +- .../yutou/bilibili/Tools/ApplicationInit.java | 13 +- .../com/yutou/bilibili/Tools/AssTools.java | 158 +++++++++++ .../com/yutou/bilibili/Tools/DanmuTools.java | 66 +++++ .../com/yutou/bilibili/Tools/HttpTools.java | 247 +++++++++++++----- .../java/com/yutou/bilibili/Tools/Log.java | 3 + .../Bili/mybatis/model/BilibiliUpInfo.java | 12 +- .../mybatis/model/BilibiliUpInfoExample.java | 60 +++++ .../sqlite/BiliBiliLiveDatabasesManager.java | 17 +- .../yutou/bilibili/sqlite/SQLiteManager.java | 19 +- .../resources/mappers/BilibiliUpInfoDao.xml | 31 ++- 18 files changed, 662 insertions(+), 194 deletions(-) create mode 100644 src/main/java/com/yutou/bilibili/Tools/AssTools.java create mode 100644 src/main/java/com/yutou/bilibili/Tools/DanmuTools.java 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