新增弹幕转ass工具(未上线至网页)
修改获取直播状态的方法 新增主播uid字段
This commit is contained in:
parent
8dff5bf7bf
commit
a1382ff7be
@ -196,13 +196,15 @@
|
|||||||
$.post('/upinfo/get/liveInfo.do', function (json) {
|
$.post('/upinfo/get/liveInfo.do', function (json) {
|
||||||
if (json.code === 0) {
|
if (json.code === 0) {
|
||||||
$('#online').text("当前正在直播:" + json.data.online)
|
$('#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) {
|
for (let i in json.data.live) {
|
||||||
$('#' + json.data.live[i].roomid).css('color', '#8FE18F')
|
console.log('input[name="liveCheckbox' + json.data.live[i].roomid + '"]')
|
||||||
console.log('绿了:'+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) {
|
||||||
|
@ -128,17 +128,18 @@ public class UpInfoController {
|
|||||||
JSONArray info = new JSONArray();
|
JSONArray info = new JSONArray();
|
||||||
JSONArray liveArray = 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) {
|
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++;
|
online++;
|
||||||
if(LiveUtils.liveContains(up)==null){
|
|
||||||
up.setLive(0);
|
|
||||||
}else{
|
|
||||||
up.setLive(1);
|
|
||||||
}
|
}
|
||||||
|
JSONObject item= (JSONObject) JSON.toJSON(up);
|
||||||
|
item.put("listen",Live.lives.get(up.getRoomid())!=null);
|
||||||
info.add(JSON.toJSON(up));
|
info.add(JSON.toJSON(up));
|
||||||
}
|
}
|
||||||
}
|
|
||||||
for (Live live : Live.lives.values()) {
|
for (Live live : Live.lives.values()) {
|
||||||
if (live.geData().getLive() == 1) {
|
if (live.geData().getLive() == 1) {
|
||||||
liveArray.add(JSON.toJSON(live.geData()));
|
liveArray.add(JSON.toJSON(live.geData()));
|
||||||
|
@ -13,12 +13,13 @@ public class DanmuData {
|
|||||||
private long time;
|
private long time;
|
||||||
private String uCode;
|
private String uCode;
|
||||||
private String danmu;
|
private String danmu;
|
||||||
private int uid;
|
private long uid;
|
||||||
private String uname;
|
private String uname;
|
||||||
|
|
||||||
public Date getTimeDate() {
|
public Date getTimeDate() {
|
||||||
return new Date(time);
|
return new Date(time);
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getFontColorHex() {
|
public String getFontColorHex() {
|
||||||
return Integer.toHexString(fontColor);
|
return Integer.toHexString(fontColor);
|
||||||
}
|
}
|
||||||
|
@ -132,14 +132,12 @@ public class Live implements ApplicationContextAware {
|
|||||||
*/
|
*/
|
||||||
private void start() throws Exception {
|
private void start() throws Exception {
|
||||||
run = true;
|
run = true;
|
||||||
if (LiveUtils.isLivePlayer(roomId)) {
|
|
||||||
upData.setLive(-1);
|
|
||||||
}
|
|
||||||
String url = LiveUtils.getLiveUrl(roomId);
|
String url = LiveUtils.getLiveUrl(roomId);
|
||||||
if (url == null) {
|
if (url == null) {
|
||||||
stop();
|
stop();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
upData.checkLiveStatus();
|
||||||
startTime = new Date();
|
startTime = new Date();
|
||||||
HashMap<String, String> header = new HashMap<>();
|
HashMap<String, String> header = new HashMap<>();
|
||||||
header.put("Sec-WebSocket-Extensions", "permessage-deflate; client_max_window_bits");
|
header.put("Sec-WebSocket-Extensions", "permessage-deflate; client_max_window_bits");
|
||||||
@ -325,7 +323,7 @@ public class Live implements ApplicationContextAware {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void checkLive() {
|
public void checkLive() {
|
||||||
boolean isLive = LiveUtils.isLivePlayer(roomId);
|
boolean isLive = upData.checkLiveStatus() == 1;
|
||||||
if (SaveLive.getInstance().checkLive(roomId)) {
|
if (SaveLive.getInstance().checkLive(roomId)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -489,19 +487,17 @@ public class Live implements ApplicationContextAware {
|
|||||||
service.addLiveData(liveData);
|
service.addLiveData(liveData);
|
||||||
break;
|
break;
|
||||||
case "LIVE"://开始直播,不过有在心跳包上做检测了,所以也无所谓?
|
case "LIVE"://开始直播,不过有在心跳包上做检测了,所以也无所谓?
|
||||||
if (upData.getLive() == 1) {
|
|
||||||
break;
|
JSONObject liveInfo = LiveUtils.getLiveInfo(upData);
|
||||||
}
|
|
||||||
upData.setLive(1);
|
|
||||||
JSONObject liveInfo = LiveUtils.getLiveInfo(roomId);
|
|
||||||
if (liveInfo == null) {
|
if (liveInfo == null) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
upData.setLive(liveInfo.getInteger("live_status"));
|
||||||
LiveInfo info = new LiveInfo();
|
LiveInfo info = new LiveInfo();
|
||||||
info.setTitle(liveInfo.getJSONObject("data").getJSONObject("room_info").getString("title"));
|
info.setTitle(liveInfo.getString("title"));
|
||||||
info.setKeyframe(liveInfo.getJSONObject("data").getJSONObject("room_info").getString("keyframe"));
|
info.setKeyframe(liveInfo.getString("keyframe"));
|
||||||
info.setRoomId(liveInfo.getJSONObject("data").getJSONObject("room_info").getInteger("room_id"));
|
info.setRoomId(liveInfo.getInteger("room_id"));
|
||||||
info.setShortId(liveInfo.getJSONObject("data").getJSONObject("room_info").getInteger("short_id"));
|
info.setShortId(liveInfo.getInteger("short_id"));
|
||||||
info.setInfo(liveInfo);
|
info.setInfo(liveInfo);
|
||||||
setLiveInfo(info);
|
setLiveInfo(info);
|
||||||
StringBuilder builder = new StringBuilder();
|
StringBuilder builder = new StringBuilder();
|
||||||
@ -624,7 +620,7 @@ public class Live implements ApplicationContextAware {
|
|||||||
}
|
}
|
||||||
updateUpInfo();
|
updateUpInfo();
|
||||||
if (upData.getOfflinelistening() != 1) {
|
if (upData.getOfflinelistening() != 1) {
|
||||||
if (!LiveUtils.isLivePlayer(upData.getRoomid())) {
|
if (upData.getLive() == 0) {
|
||||||
stop();
|
stop();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -8,6 +8,7 @@ import com.alibaba.fastjson.JSONObject;
|
|||||||
import com.yutou.bilibili.BiliBili.Services.IBiliBiliLiveService;
|
import com.yutou.bilibili.BiliBili.Services.IBiliBiliLiveService;
|
||||||
import com.yutou.bilibili.BiliBili.Tools.SaveLive;
|
import com.yutou.bilibili.BiliBili.Tools.SaveLive;
|
||||||
import com.yutou.bilibili.Tools.AppTools;
|
import com.yutou.bilibili.Tools.AppTools;
|
||||||
|
import com.yutou.bilibili.Tools.HttpTools;
|
||||||
import com.yutou.bilibili.Tools.Log;
|
import com.yutou.bilibili.Tools.Log;
|
||||||
import com.yutou.bilibili.Tools.RedisTools;
|
import com.yutou.bilibili.Tools.RedisTools;
|
||||||
import com.yutou.bilibili.mybatis.Bili.mybatis.model.BilibiliUpInfo;
|
import com.yutou.bilibili.mybatis.Bili.mybatis.model.BilibiliUpInfo;
|
||||||
@ -348,9 +349,24 @@ public class LiveUtils {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static JSONObject getLiveInfo(int roomId) {
|
public static long getMid(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");
|
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 getLiveInfo(BilibiliUpInfo info) {
|
||||||
|
List<BilibiliUpInfo> list = new ArrayList<>();
|
||||||
|
list.add(info);
|
||||||
|
JSONObject infoByUid = getStatusInfoByUid(list);
|
||||||
|
return infoByUid.getJSONObject("data").getJSONObject(info.getMid() + "");
|
||||||
|
}
|
||||||
|
|
||||||
public static JSONObject getLiveRoomInfo(int roomId) {
|
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";
|
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);
|
return http_get(url);
|
||||||
@ -360,42 +376,37 @@ public class LiveUtils {
|
|||||||
return liveStateMap.getOrDefault(roomId, false);
|
return liveStateMap.getOrDefault(roomId, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void reloadLiveState(int roomId) {
|
public static JSONObject getStatusInfoByUid(List<BilibiliUpInfo> list) {
|
||||||
JSONObject json = getLiveRoomInfo(roomId);
|
JSONArray userId = new JSONArray();
|
||||||
if (json != null) {
|
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<BilibiliUpInfo> list) {
|
||||||
|
JSONObject json = getStatusInfoByUid(list);
|
||||||
try {
|
try {
|
||||||
liveStateMap.put(roomId, json.getJSONObject("data").getInteger("live_status") == 1);
|
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) {
|
} catch (Exception e) {
|
||||||
Log.i("live state = " + json);
|
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) {
|
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 {
|
public static class LiveGiftConfig {
|
||||||
@Resource
|
@Resource
|
||||||
@ -428,8 +439,12 @@ public class LiveUtils {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
LiveUtils.reloadLiveState(22047448);
|
List<BilibiliUpInfo> list=new ArrayList<>();
|
||||||
System.out.println(LiveUtils.getLiveState(22047448));
|
BilibiliUpInfo info=new BilibiliUpInfo();
|
||||||
|
info.setMid(402417817L);
|
||||||
|
list.add(info);
|
||||||
|
JSONObject infoByUid = getStatusInfoByUid(list);
|
||||||
|
System.out.println(infoByUid);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -31,11 +31,10 @@ public class BiliTools {
|
|||||||
com.yutou.bilibili.Tools.Log.i(json);
|
com.yutou.bilibili.Tools.Log.i(json);
|
||||||
String roomId = json.getJSONObject("data").getJSONObject("room_info").getInteger("room_id") + "";
|
String roomId = json.getJSONObject("data").getJSONObject("room_info").getInteger("room_id") + "";
|
||||||
String name = json.getJSONObject("data").getJSONObject("anchor_info").getJSONObject("base_info").getString("uname");
|
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.setRoomid(Integer.parseInt(roomId));
|
||||||
upData.setName(name);
|
upData.setName(name);
|
||||||
upData.setUrl(url);
|
upData.setUrl(url);
|
||||||
|
upData.setMid(LiveUtils.getMid(upData.getRoomid()));
|
||||||
return upData;
|
return upData;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -20,7 +20,6 @@ public class SaveLive {
|
|||||||
private final Map<Integer, Timer> heartbeats = new HashMap<>();
|
private final Map<Integer, Timer> heartbeats = new HashMap<>();
|
||||||
|
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
SaveLive.getInstance().addLive(3715397);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private SaveLive() {
|
private SaveLive() {
|
||||||
@ -34,7 +33,13 @@ public class SaveLive {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void addLive(Live live) {
|
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) {
|
public void startLive(int roomId) {
|
||||||
@ -42,15 +47,6 @@ public class SaveLive {
|
|||||||
saveList.add(roomId + "");
|
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) {
|
public boolean checkLive(int roomId) {
|
||||||
return saveList.contains(roomId + "");
|
return saveList.contains(roomId + "");
|
||||||
|
@ -13,7 +13,7 @@ import org.springframework.context.annotation.Import;
|
|||||||
@SpringBootApplication
|
@SpringBootApplication
|
||||||
public class BilibiliApplication {
|
public class BilibiliApplication {
|
||||||
|
|
||||||
public static String version="0.8.3";
|
public static String version="0.8.4";
|
||||||
|
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
QQBotManager.getInstance().init();
|
QQBotManager.getInstance().init();
|
||||||
|
@ -93,10 +93,11 @@ public class ApplicationInit implements ApplicationRunner {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void checkLive() {
|
private void checkLive() {
|
||||||
for (BilibiliUpInfo info : service.getUpInfo()) {
|
List<BilibiliUpInfo> list = service.getUpInfo();
|
||||||
LiveUtils.reloadLiveState(info.getRoomid());
|
LiveUtils.reloadLiveState(list);
|
||||||
|
for (BilibiliUpInfo info : list) {
|
||||||
if (info.getOfflinelistening() == 1) {
|
if (info.getOfflinelistening() == 1) {
|
||||||
if (info.getEnable() == 1) {
|
if (info.getEnable() == 1 && LiveUtils.isLivePlayer(info.getRoomid())) {
|
||||||
Live live = LiveUtils.liveContains(info);
|
Live live = LiveUtils.liveContains(info);
|
||||||
if (live == null) {
|
if (live == null) {
|
||||||
live = new Live();
|
live = new Live();
|
||||||
|
158
src/main/java/com/yutou/bilibili/Tools/AssTools.java
Normal file
158
src/main/java/com/yutou/bilibili/Tools/AssTools.java
Normal file
@ -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<String> 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
66
src/main/java/com/yutou/bilibili/Tools/DanmuTools.java
Normal file
66
src/main/java/com/yutou/bilibili/Tools/DanmuTools.java
Normal file
@ -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> 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, "老板大气!点点红包抽礼物!");
|
||||||
|
}
|
||||||
|
}
|
@ -1,86 +1,104 @@
|
|||||||
package com.yutou.bilibili.Tools;
|
package com.yutou.bilibili.Tools;
|
||||||
|
|
||||||
import com.alibaba.fastjson.JSONObject;
|
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.*;
|
||||||
import java.io.IOException;
|
|
||||||
import java.io.InputStreamReader;
|
|
||||||
import java.io.OutputStream;
|
|
||||||
import java.net.HttpURLConnection;
|
import java.net.HttpURLConnection;
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
|
import java.net.URLConnection;
|
||||||
import java.net.URLEncoder;
|
import java.net.URLEncoder;
|
||||||
import java.nio.charset.StandardCharsets;
|
import java.nio.charset.StandardCharsets;
|
||||||
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
public class HttpTools {
|
public class HttpTools {
|
||||||
|
private static final int HttpRequestIndex = 3;
|
||||||
|
|
||||||
public static String get(String url) {
|
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<String, String> header) {
|
||||||
try {
|
try {
|
||||||
HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
|
URLConnection connection;
|
||||||
connection.setRequestProperty("User-Agent", getKuKuUA());
|
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()));
|
BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
|
||||||
StringBuilder str = new StringBuilder();
|
StringBuilder str = new StringBuilder();
|
||||||
String tmp;
|
String tmp;
|
||||||
while ((tmp = reader.readLine()) != null) {
|
while ((tmp = reader.readLine()) != null) {
|
||||||
str.append(tmp);
|
str.append(tmp).append("\n");
|
||||||
}
|
}
|
||||||
reader.close();
|
reader.close();
|
||||||
connection.disconnect();
|
|
||||||
return str.toString();
|
return str.toString();
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
com.yutou.bilibili.Tools.Log.e(e);
|
System.err.println("error url = " + url);
|
||||||
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public synchronized static void post(final String url, final byte[] body, final NetworkInterface networkInterface) {
|
public static String http_post(String url, byte[] body, int index, Map<String, String> headers) {
|
||||||
|
|
||||||
new Thread(new Runnable() {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
String tmp;
|
String tmp;
|
||||||
StringBuilder str = new StringBuilder();
|
StringBuilder str = new StringBuilder();
|
||||||
try {
|
try {
|
||||||
HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
|
HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
|
||||||
connection.setRequestMethod("POST");
|
connection.setRequestMethod("POST");
|
||||||
|
if (headers != null) {
|
||||||
|
for (String key : headers.keySet()) {
|
||||||
|
connection.addRequestProperty(key, headers.get(key));
|
||||||
|
}
|
||||||
|
}
|
||||||
connection.setDoOutput(true);
|
connection.setDoOutput(true);
|
||||||
connection.setDoInput(true);
|
connection.setDoInput(true);
|
||||||
|
connection.addRequestProperty("User-Agent", getExtUa());
|
||||||
connection.setConnectTimeout(5 * 1000);
|
connection.setConnectTimeout(5 * 1000);
|
||||||
connection.setReadTimeout(10 * 1000);
|
connection.setReadTimeout(10 * 1000);
|
||||||
connection.addRequestProperty("Connection", "keep-alive");
|
//connection.addRequestProperty("Connection", "keep-alive");
|
||||||
connection.addRequestProperty("Accept", "*/*");
|
//connection.addRequestProperty("User-Agent", getExtUa());
|
||||||
connection.addRequestProperty("User-Agent", getExtUa());
|
connection.addRequestProperty("content-type", "application/json");
|
||||||
//connection.addRequestProperty("content-type", "application/json");
|
//connection.addRequestProperty("charset", "UTF-8");
|
||||||
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
|
|
||||||
connection.addRequestProperty("charset", "UTF-8");
|
|
||||||
OutputStream outputStream = connection.getOutputStream();
|
OutputStream outputStream = connection.getOutputStream();
|
||||||
|
//System.out.println(new String(body));
|
||||||
outputStream.write(body);
|
outputStream.write(body);
|
||||||
outputStream.write("\n".getBytes(StandardCharsets.UTF_8));
|
|
||||||
outputStream.flush();
|
outputStream.flush();
|
||||||
|
outputStream.close();
|
||||||
|
connection.connect();
|
||||||
BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
|
BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
|
||||||
while ((tmp = reader.readLine()) != null) {
|
while ((tmp = reader.readLine()) != null) {
|
||||||
str.append(tmp);
|
str.append(tmp);
|
||||||
}
|
}
|
||||||
|
String finalStr = str.toString();
|
||||||
|
|
||||||
// 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();
|
connection.disconnect();
|
||||||
outputStream.close();
|
|
||||||
reader.close();
|
reader.close();
|
||||||
|
return finalStr;
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
networkInterface.httpError(e);
|
if (index < HttpRequestIndex) {
|
||||||
|
return http_post(url, body, index + 1, headers);
|
||||||
|
} else {
|
||||||
|
e.printStackTrace();
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}).start();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static String getExtUa() {
|
private static String getExtUa() {
|
||||||
@ -96,11 +114,11 @@ public class HttpTools {
|
|||||||
Set<String> keys = json.keySet();
|
Set<String> keys = json.keySet();
|
||||||
for (String key : keys) {
|
for (String key : keys) {
|
||||||
try {
|
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) {
|
} catch (Exception e) {
|
||||||
com.yutou.bilibili.Tools.Log.e(e);
|
e.printStackTrace();
|
||||||
try {
|
try {
|
||||||
string.append("&").append(URLEncoder.encode(key, "UTF-8")).append("=");
|
string.append("&").append(URLEncoder.encode(key, "utf-8")).append("=");
|
||||||
// string += "&" + key + "=";
|
// string += "&" + key + "=";
|
||||||
} catch (Exception e1) {
|
} catch (Exception e1) {
|
||||||
string.append("&").append(key).append("=");
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -10,6 +10,9 @@ import java.util.logging.Logger;
|
|||||||
public class Log {
|
public class Log {
|
||||||
private static Logger logger;
|
private static Logger logger;
|
||||||
|
|
||||||
|
public static void i(String tag, Object log) {
|
||||||
|
i('[' + tag + ']' + log);
|
||||||
|
}
|
||||||
public static void i(Object log) {
|
public static void i(Object log) {
|
||||||
if (!((boolean) ConfigTools.load(ConfigTools.CONFIG, "logout"))) {
|
if (!((boolean) ConfigTools.load(ConfigTools.CONFIG, "logout"))) {
|
||||||
return;
|
return;
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
package com.yutou.bilibili.mybatis.Bili.mybatis.model;
|
package com.yutou.bilibili.mybatis.Bili.mybatis.model;
|
||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
import com.yutou.bilibili.BiliBili.LiveUtils;
|
import com.yutou.bilibili.BiliBili.LiveUtils;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
@ -23,6 +25,8 @@ public class BilibiliUpInfo implements Serializable {
|
|||||||
*/
|
*/
|
||||||
private String url;
|
private String url;
|
||||||
|
|
||||||
|
private Long mid=0L;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 房间号
|
* 房间号
|
||||||
*/
|
*/
|
||||||
@ -43,8 +47,14 @@ public class BilibiliUpInfo implements Serializable {
|
|||||||
|
|
||||||
private static final long serialVersionUID = 1L;
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
public Integer checkLiveStatus(){
|
||||||
|
List<BilibiliUpInfo> list=new ArrayList<>();
|
||||||
|
list.add(this);
|
||||||
|
live= LiveUtils.getStatusInfoByUid(list).getJSONObject("data").getJSONObject(mid+"").getInteger("live_status");
|
||||||
|
return live;
|
||||||
|
}
|
||||||
|
|
||||||
public Integer getLive() {
|
public Integer getLive() {
|
||||||
live= LiveUtils.getLiveState(roomid)?1:0;
|
|
||||||
return live;
|
return live;
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -304,6 +304,66 @@ public class BilibiliUpInfoExample {
|
|||||||
return (Criteria) this;
|
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<Integer> values) {
|
||||||
|
addCriterion("mid in", values, "mid");
|
||||||
|
return (Criteria) this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Criteria andMidNotIn(List<Integer> 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() {
|
public Criteria andRoomidIsNull() {
|
||||||
addCriterion("roomid is null");
|
addCriterion("roomid is null");
|
||||||
return (Criteria) this;
|
return (Criteria) this;
|
||||||
|
@ -10,6 +10,7 @@ import com.yutou.bilibili.Tools.AppTools;
|
|||||||
import com.yutou.bilibili.Tools.Log;
|
import com.yutou.bilibili.Tools.Log;
|
||||||
import com.yutou.bilibili.mybatis.Bili.mybatis.model.BilibiliLiveData;
|
import com.yutou.bilibili.mybatis.Bili.mybatis.model.BilibiliLiveData;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
import java.sql.ResultSet;
|
import java.sql.ResultSet;
|
||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
import java.sql.Statement;
|
import java.sql.Statement;
|
||||||
@ -23,11 +24,21 @@ public class BiliBiliLiveDatabasesManager extends SQLiteManager {
|
|||||||
super();
|
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){
|
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");
|
json.put("file",fileName+".db");
|
||||||
build(json);
|
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.setModel(set.getInt("model"));
|
||||||
data.setFontSize(set.getInt("fontSize"));
|
data.setFontSize(set.getInt("fontSize"));
|
||||||
data.setFontColor(set.getInt("fontColor"));
|
data.setFontColor(set.getInt("fontColor"));
|
||||||
data.setTime(set.getInt("time"));
|
data.setTime(set.getLong("time"));
|
||||||
data.setUCode(set.getString("uCode"));
|
data.setUCode(set.getString("uCode"));
|
||||||
data.setDanmu(set.getString("danmu"));
|
data.setDanmu(set.getString("danmu"));
|
||||||
data.setUid(set.getInt("uid"));
|
data.setUid(set.getLong("uid"));
|
||||||
data.setUname(set.getString("uname"));
|
data.setUname(set.getString("uname"));
|
||||||
list.add(data);
|
list.add(data);
|
||||||
}
|
}
|
||||||
|
@ -30,6 +30,7 @@ public class SQLiteManager {
|
|||||||
com.yutou.bilibili.Tools.Log.e(e);
|
com.yutou.bilibili.Tools.Log.e(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void close() {
|
public void close() {
|
||||||
try {
|
try {
|
||||||
conn.close();
|
conn.close();
|
||||||
@ -49,6 +50,7 @@ public class SQLiteManager {
|
|||||||
protected SQLiteManager() {
|
protected SQLiteManager() {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void createSql(JSONObject json) {
|
private void createSql(JSONObject json) {
|
||||||
try {
|
try {
|
||||||
sql.mkdirs();
|
sql.mkdirs();
|
||||||
@ -65,6 +67,7 @@ public class SQLiteManager {
|
|||||||
}
|
}
|
||||||
closeBatch();
|
closeBatch();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void createSqlOfTable(JSONObject table) {
|
private void createSqlOfTable(JSONObject table) {
|
||||||
String tableName = table.getString("name");
|
String tableName = table.getString("name");
|
||||||
try {
|
try {
|
||||||
@ -109,7 +112,11 @@ public class SQLiteManager {
|
|||||||
protected void build(JSONObject json) {
|
protected void build(JSONObject json) {
|
||||||
try {
|
try {
|
||||||
Class.forName("org.sqlite.JDBC");
|
Class.forName("org.sqlite.JDBC");
|
||||||
|
if ("load".equals(json.getString("model"))) {
|
||||||
|
sql = new File(json.getString("file"));
|
||||||
|
} else {
|
||||||
sql = new File("databases" + File.separator + json.getString("file"));
|
sql = new File("databases" + File.separator + json.getString("file"));
|
||||||
|
}
|
||||||
if (!sql.exists()) {
|
if (!sql.exists()) {
|
||||||
createSql(json);
|
createSql(json);
|
||||||
} else {
|
} else {
|
||||||
|
@ -5,6 +5,7 @@
|
|||||||
<id column="id" jdbcType="INTEGER" property="id" />
|
<id column="id" jdbcType="INTEGER" property="id" />
|
||||||
<result column="name" jdbcType="VARCHAR" property="name" />
|
<result column="name" jdbcType="VARCHAR" property="name" />
|
||||||
<result column="url" jdbcType="VARCHAR" property="url" />
|
<result column="url" jdbcType="VARCHAR" property="url" />
|
||||||
|
<result column="mid" jdbcType="INTEGER" property="mid" />
|
||||||
<result column="roomid" jdbcType="INTEGER" property="roomid" />
|
<result column="roomid" jdbcType="INTEGER" property="roomid" />
|
||||||
<result column="offlineListening" jdbcType="INTEGER" property="offlinelistening" />
|
<result column="offlineListening" jdbcType="INTEGER" property="offlinelistening" />
|
||||||
<result column="saveDanmu" jdbcType="INTEGER" property="savedanmu" />
|
<result column="saveDanmu" jdbcType="INTEGER" property="savedanmu" />
|
||||||
@ -71,7 +72,7 @@
|
|||||||
</where>
|
</where>
|
||||||
</sql>
|
</sql>
|
||||||
<sql id="Base_Column_List">
|
<sql id="Base_Column_List">
|
||||||
id, `name`, url, roomid, offlineListening, saveDanmu, `enable`, live, saveLive
|
id, `name`, url, mid, roomid, offlineListening, saveDanmu, `enable`, live, saveLive
|
||||||
</sql>
|
</sql>
|
||||||
<select id="selectByExample" parameterType="com.yutou.bilibili.mybatis.Bili.mybatis.model.BilibiliUpInfoExample" resultMap="BaseResultMap">
|
<select id="selectByExample" parameterType="com.yutou.bilibili.mybatis.Bili.mybatis.model.BilibiliUpInfoExample" resultMap="BaseResultMap">
|
||||||
select
|
select
|
||||||
@ -104,12 +105,14 @@
|
|||||||
</if>
|
</if>
|
||||||
</delete>
|
</delete>
|
||||||
<insert id="insert" keyColumn="id" keyProperty="id" parameterType="com.yutou.bilibili.mybatis.Bili.mybatis.model.BilibiliUpInfo" useGeneratedKeys="true">
|
<insert id="insert" keyColumn="id" keyProperty="id" parameterType="com.yutou.bilibili.mybatis.Bili.mybatis.model.BilibiliUpInfo" useGeneratedKeys="true">
|
||||||
insert into bilibili_up_info (`name`, url, roomid,
|
insert into bilibili_up_info (`name`, url, mid,
|
||||||
offlineListening, saveDanmu, `enable`,
|
roomid, offlineListening, saveDanmu,
|
||||||
live, saveLive)
|
`enable`, live, saveLive
|
||||||
values (#{name,jdbcType=VARCHAR}, #{url,jdbcType=VARCHAR}, #{roomid,jdbcType=INTEGER},
|
)
|
||||||
#{offlinelistening,jdbcType=INTEGER}, #{savedanmu,jdbcType=INTEGER}, #{enable,jdbcType=INTEGER},
|
values (#{name,jdbcType=VARCHAR}, #{url,jdbcType=VARCHAR}, #{mid,jdbcType=INTEGER},
|
||||||
#{live,jdbcType=INTEGER}, #{savelive,jdbcType=INTEGER})
|
#{roomid,jdbcType=INTEGER}, #{offlinelistening,jdbcType=INTEGER}, #{savedanmu,jdbcType=INTEGER},
|
||||||
|
#{enable,jdbcType=INTEGER}, #{live,jdbcType=INTEGER}, #{savelive,jdbcType=INTEGER}
|
||||||
|
)
|
||||||
</insert>
|
</insert>
|
||||||
<insert id="insertSelective" keyColumn="id" keyProperty="id" parameterType="com.yutou.bilibili.mybatis.Bili.mybatis.model.BilibiliUpInfo" useGeneratedKeys="true">
|
<insert id="insertSelective" keyColumn="id" keyProperty="id" parameterType="com.yutou.bilibili.mybatis.Bili.mybatis.model.BilibiliUpInfo" useGeneratedKeys="true">
|
||||||
insert into bilibili_up_info
|
insert into bilibili_up_info
|
||||||
@ -120,6 +123,9 @@
|
|||||||
<if test="url != null">
|
<if test="url != null">
|
||||||
url,
|
url,
|
||||||
</if>
|
</if>
|
||||||
|
<if test="mid != null">
|
||||||
|
mid,
|
||||||
|
</if>
|
||||||
<if test="roomid != null">
|
<if test="roomid != null">
|
||||||
roomid,
|
roomid,
|
||||||
</if>
|
</if>
|
||||||
@ -146,6 +152,9 @@
|
|||||||
<if test="url != null">
|
<if test="url != null">
|
||||||
#{url,jdbcType=VARCHAR},
|
#{url,jdbcType=VARCHAR},
|
||||||
</if>
|
</if>
|
||||||
|
<if test="mid != null">
|
||||||
|
#{mid,jdbcType=INTEGER},
|
||||||
|
</if>
|
||||||
<if test="roomid != null">
|
<if test="roomid != null">
|
||||||
#{roomid,jdbcType=INTEGER},
|
#{roomid,jdbcType=INTEGER},
|
||||||
</if>
|
</if>
|
||||||
@ -184,6 +193,9 @@
|
|||||||
<if test="record.url != null">
|
<if test="record.url != null">
|
||||||
url = #{record.url,jdbcType=VARCHAR},
|
url = #{record.url,jdbcType=VARCHAR},
|
||||||
</if>
|
</if>
|
||||||
|
<if test="record.mid != null">
|
||||||
|
mid = #{record.mid,jdbcType=INTEGER},
|
||||||
|
</if>
|
||||||
<if test="record.roomid != null">
|
<if test="record.roomid != null">
|
||||||
roomid = #{record.roomid,jdbcType=INTEGER},
|
roomid = #{record.roomid,jdbcType=INTEGER},
|
||||||
</if>
|
</if>
|
||||||
@ -212,6 +224,7 @@
|
|||||||
set id = #{record.id,jdbcType=INTEGER},
|
set id = #{record.id,jdbcType=INTEGER},
|
||||||
`name` = #{record.name,jdbcType=VARCHAR},
|
`name` = #{record.name,jdbcType=VARCHAR},
|
||||||
url = #{record.url,jdbcType=VARCHAR},
|
url = #{record.url,jdbcType=VARCHAR},
|
||||||
|
mid = #{record.mid,jdbcType=INTEGER},
|
||||||
roomid = #{record.roomid,jdbcType=INTEGER},
|
roomid = #{record.roomid,jdbcType=INTEGER},
|
||||||
offlineListening = #{record.offlinelistening,jdbcType=INTEGER},
|
offlineListening = #{record.offlinelistening,jdbcType=INTEGER},
|
||||||
saveDanmu = #{record.savedanmu,jdbcType=INTEGER},
|
saveDanmu = #{record.savedanmu,jdbcType=INTEGER},
|
||||||
@ -231,6 +244,9 @@
|
|||||||
<if test="url != null">
|
<if test="url != null">
|
||||||
url = #{url,jdbcType=VARCHAR},
|
url = #{url,jdbcType=VARCHAR},
|
||||||
</if>
|
</if>
|
||||||
|
<if test="mid != null">
|
||||||
|
mid = #{mid,jdbcType=INTEGER},
|
||||||
|
</if>
|
||||||
<if test="roomid != null">
|
<if test="roomid != null">
|
||||||
roomid = #{roomid,jdbcType=INTEGER},
|
roomid = #{roomid,jdbcType=INTEGER},
|
||||||
</if>
|
</if>
|
||||||
@ -256,6 +272,7 @@
|
|||||||
update bilibili_up_info
|
update bilibili_up_info
|
||||||
set `name` = #{name,jdbcType=VARCHAR},
|
set `name` = #{name,jdbcType=VARCHAR},
|
||||||
url = #{url,jdbcType=VARCHAR},
|
url = #{url,jdbcType=VARCHAR},
|
||||||
|
mid = #{mid,jdbcType=INTEGER},
|
||||||
roomid = #{roomid,jdbcType=INTEGER},
|
roomid = #{roomid,jdbcType=INTEGER},
|
||||||
offlineListening = #{offlinelistening,jdbcType=INTEGER},
|
offlineListening = #{offlinelistening,jdbcType=INTEGER},
|
||||||
saveDanmu = #{savedanmu,jdbcType=INTEGER},
|
saveDanmu = #{savedanmu,jdbcType=INTEGER},
|
||||||
|
Loading…
Reference in New Issue
Block a user