MultiThread/local-tools/src/main/java/cn/bunny/video/VideoDownloadVersion1.java

101 lines
4.0 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package cn.bunny.video;
import cn.bunny.video.dao.Response;
import cn.bunny.video.dao.VideoEntity;
import cn.bunny.video.utils.HttpRequestUtils;
import cn.bunny.video.utils.SystemControlUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils;
import java.time.Duration;
import java.time.Instant;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
@Slf4j
public class VideoDownloadVersion1 {
// 当前下载页
private final static Integer currentPage = 7;
// 线程池个数
private final static Integer threadPoolSize = 10;
// 开始线程池
private final static ExecutorService executorService = Executors.newFixedThreadPool(threadPoolSize);
public static void main(String[] args) {
try {
// 记录程序开始时间
Instant start = Instant.now();
String url = "https://mjfh136.cyou/view/videoList/1637462276570050562/" + currentPage + "/80";
HttpRequestUtils<Response<VideoEntity>> requestUtils = new HttpRequestUtils<>();
Response<VideoEntity> responseData = requestUtils.requestGET(url);
// 接收到返回信息
downloadVideoList(responseData);
// 执行完成后播放音乐
executorService.shutdown();
boolean awaitTermination = executorService.awaitTermination(Long.MAX_VALUE, TimeUnit.SECONDS);
if (awaitTermination) {
SystemControlUtils.playMusic();
// 计算程序运行时间
Instant end = Instant.now();
Duration duration = Duration.between(start, end);
long minutes = duration.toMinutes();
long seconds = duration.minusMinutes(minutes).getSeconds();
log.info("程序运行时间: {} 分钟 {} 秒", minutes, seconds);
}
} catch (Exception exception) {
throw new RuntimeException(exception);
}
}
/**
* 下载视频列表内容
*
* @param responseData 返回一页的数据响应
*/
private static void downloadVideoList(Response<VideoEntity> responseData) {
// 使用原子化操作,记录每个下载当前索引
AtomicInteger index = new AtomicInteger(0);
// 拿到每个数据
List<VideoEntity> videoEntities = responseData.getData().getList();
LinkedBlockingQueue<VideoEntity> videoQueue = new LinkedBlockingQueue<>(videoEntities);
videoQueue.stream()
.filter(videoEntity -> videoEntity.getPlayUrl().contains("http"))
.peek(videoEntity -> {
String videoTag = StringUtils.hasText(videoEntity.getVideoTag()) ? videoEntity.getVideoTag() : videoEntity.getVideoTypeTitle();
videoEntity.setVideoTag(videoTag);
})
.forEach((videoEntity) -> executorService.submit(() -> {
int currentIndex = index.incrementAndGet();
log.info("开始下载第:{}个线程Id{}", currentIndex, Thread.currentThread().getName());
// 整理命令行参数
List<String> command = new ArrayList<>();
command.add("N_m3u8DL-CLI");
command.add("\"" + videoEntity.getPlayUrl() + "\"");
command.add("--workDir");
command.add("\"G:\\video\\" + videoEntity.getVideoTag() + "\"");
command.add("--saveName");
command.add("\"" + videoEntity.getTitle().trim() + "\"");
command.add("--enableDelAfterDone");
command.add("--enableBinaryMerge");
command.add("--enableMuxFastStart");
// 开始下载
SystemControlUtils.startProcess(command, currentIndex);
}));
}
}