133 lines
5.3 KiB
Java
133 lines
5.3 KiB
Java
package com.yutou.bilibili.services;
|
|
|
|
import com.alibaba.fastjson2.JSONArray;
|
|
import com.alibaba.fastjson2.JSONObject;
|
|
import com.yutou.biliapi.api.LiveApi;
|
|
import com.yutou.biliapi.bean.live.LiveAnchorInfo;
|
|
import com.yutou.biliapi.bean.live.LiveRoomConfig;
|
|
import com.yutou.biliapi.bean.live.LiveRoomInfo;
|
|
import com.yutou.biliapi.bean.live.LiveRoomPlayInfo;
|
|
import com.yutou.biliapi.bean.live.database.LiveConfigDatabaseBean;
|
|
import com.yutou.biliapi.bean.live.database.LiveVideoDatabaseBean;
|
|
import com.yutou.biliapi.databases.BiliLiveConfigDatabase;
|
|
import com.yutou.biliapi.databases.BiliLiveDatabase;
|
|
import com.yutou.biliapi.net.BiliLiveNetApiManager;
|
|
import com.yutou.bilibili.Tools.DateFormatUtils;
|
|
import com.yutou.bilibili.datas.web.LiveData;
|
|
import com.yutou.common.okhttp.BaseBean;
|
|
import com.yutou.common.okhttp.HttpLoggingInterceptor;
|
|
import com.yutou.common.utils.FFmpegUtils;
|
|
import com.yutou.common.utils.Log;
|
|
import jakarta.annotation.Resource;
|
|
import org.springframework.stereotype.Service;
|
|
import org.springframework.util.StringUtils;
|
|
|
|
import java.io.File;
|
|
import java.io.IOException;
|
|
import java.util.*;
|
|
|
|
@Service
|
|
public class LiveService {
|
|
BiliLiveConfigDatabase liveConfigDatabase;
|
|
@Resource
|
|
LiveVideoDownloadService videoDownloadService;
|
|
@Resource
|
|
LiveDanmuService danmuService;
|
|
LiveApi api;
|
|
|
|
public LiveService() {
|
|
liveConfigDatabase = new BiliLiveConfigDatabase();
|
|
api = BiliLiveNetApiManager.getInstance().getApi(null);
|
|
}
|
|
|
|
public int getConfigCount() {
|
|
return liveConfigDatabase.getAllConfig().size();
|
|
}
|
|
|
|
public List<LiveData> getLiveList(int page, int limit) {
|
|
List<LiveConfigDatabaseBean> allConfig = liveConfigDatabase.getAllConfig();
|
|
List<LiveData> liveDataList = new ArrayList<>();
|
|
if (allConfig.isEmpty()) {
|
|
return liveDataList;
|
|
}
|
|
JSONArray uids = new JSONArray();
|
|
JSONObject param = new JSONObject();
|
|
for (LiveConfigDatabaseBean bean : allConfig) {
|
|
uids.add(bean.getAnchorUid());
|
|
}
|
|
param.put("uids", uids);
|
|
try {
|
|
Map<String, LiveAnchorInfo> map = api.getLiveRoomStatus(param).execute().body().getData();
|
|
if (map == null) {
|
|
map = new HashMap<>();
|
|
}
|
|
List<LiveAnchorInfo> onlineList = new ArrayList<>();
|
|
List<LiveAnchorInfo> offlineList = new ArrayList<>();
|
|
for (LiveAnchorInfo info : map.values()) {
|
|
if (info.getLiveStatus() == 1) {
|
|
onlineList.add(info);
|
|
} else {
|
|
offlineList.add(info);
|
|
}
|
|
}
|
|
onlineList.addAll(offlineList);
|
|
int totalSize = onlineList.size();
|
|
int fromIndex = (page - 1) * limit;
|
|
int toIndex = Math.min(fromIndex + limit, totalSize);
|
|
if (fromIndex >= totalSize) {
|
|
return new ArrayList<>(); // 返回空列表
|
|
}
|
|
List<LiveAnchorInfo> list = onlineList.subList(fromIndex, toIndex);
|
|
for (LiveAnchorInfo info : list) {
|
|
LiveData liveData = new LiveData();
|
|
liveData.setRoomId(info.getRoomId());
|
|
liveData.setAnchorUid(info.getUid());
|
|
liveData.setAnchorName(info.getUname());
|
|
liveData.setAnchorFace(info.getFace());
|
|
if (info.getLiveTime() == 0) {
|
|
liveData.setLiveTime("未开播");
|
|
} else {
|
|
liveData.setLiveTime(DateFormatUtils.getInstance().formatMillis(System.currentTimeMillis() - info.getLiveTime()*1000));
|
|
}
|
|
liveData.setDownloadVideo(videoDownloadService.checkDownload(info.getRoomId()));
|
|
liveData.setDanmu(danmuService.check(info.getRoomId()));
|
|
liveData.setTitle(info.getTitle());
|
|
liveData.setLive(info.getLiveStatus() == 1);
|
|
if (info.getLiveStatus() == 1 && StringUtils.hasText(info.getKeyframe())) {
|
|
liveData.setCover(info.getKeyframe());
|
|
} else {
|
|
liveData.setCover(info.getCoverFromUser());
|
|
}
|
|
liveDataList.add(liveData);
|
|
}
|
|
|
|
} catch (IOException e) {
|
|
throw new RuntimeException(e);
|
|
}
|
|
return liveDataList;
|
|
}
|
|
|
|
public JSONObject getGiftInfo(String roomId, String videoId) {
|
|
BiliLiveDatabase database = new BiliLiveDatabase(LiveRoomConfig.buildConfig(roomId));
|
|
LiveVideoDatabaseBean videoBean = database.getVideo(videoId);
|
|
if (videoBean == null) {
|
|
return null;
|
|
}
|
|
File videoFile = new File(videoBean.getPath().replace(".flv", ".mp4"));
|
|
if (!videoFile.exists()) {
|
|
videoFile = new File(videoBean.getPath());
|
|
}
|
|
long videoTime = FFmpegUtils.getVideoTime(videoFile);
|
|
long startTime = Long.parseLong(videoId);
|
|
long endTime = Long.parseLong(videoId) + videoTime;
|
|
return database.getGiftInfo(startTime, endTime);
|
|
}
|
|
|
|
public static void main(String[] args) {
|
|
HttpLoggingInterceptor.setLog(true);
|
|
LiveService service = new LiveService();
|
|
List<LiveData> data = service.getLiveList(1, 16);
|
|
System.out.println(data.size());
|
|
}
|
|
}
|