FrameTour-BE/src/main/java/com/ycwl/basic/utils/VideoReUploader.java
2025-04-11 16:58:52 +08:00

94 lines
3.5 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 com.ycwl.basic.utils;
import cn.hutool.core.thread.ThreadFactoryBuilder;
import cn.hutool.http.HttpUtil;
import com.ycwl.basic.constant.StorageConstant;
import com.ycwl.basic.mapper.SourceMapper;
import com.ycwl.basic.model.pc.source.entity.SourceEntity;
import com.ycwl.basic.service.pc.ScenicService;
import com.ycwl.basic.storage.adapters.IStorageAdapter;
import com.ycwl.basic.storage.utils.StorageUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.UUID;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
@Component
@Slf4j
public class VideoReUploader {
private static final ThreadFactory threadFactory = new ThreadFactoryBuilder()
.setNamePrefix("Vid-ReUp-")
.build();
private static final ThreadPoolExecutor executor = new ThreadPoolExecutor(8, 1024, 0L, TimeUnit.MILLISECONDS,
new ArrayBlockingQueue<>(1024),
threadFactory
);
@Autowired
private SourceMapper sourceMapper;
@Autowired
private ScenicService scenicService;
public void addTask(String url, Long sourceId) {
try {
URL _url = new URL(url);
if (!StringUtils.startsWith(_url.getHost(), "100.64.")) {
return;
}
} catch (MalformedURLException ignored) {
return;
}
SourceEntity entity = sourceMapper.getEntity(sourceId);
if (entity == null) {
return;
}
if (entity.getScenicId() == null) {
return;
}
if (entity.getType() != 1) {
return;
}
String tmpFilePath = UUID.randomUUID().toString();
executor.execute(() -> {
// 先下载,后上传
File dstFile = new File(tmpFilePath);
log.info("下载视频:{}sourceId{}", url, sourceId);
long size = HttpUtil.downloadFile(url, dstFile);
log.info("下载视频完成:{};大小:{}sourceId{}", url, size, sourceId);
String dstFilePath = StorageUtil.joinPath(StorageConstant.VIDEO_PIECE_PATH, entity.getId().toString() + ".mp4");
IStorageAdapter dstAdapter = scenicService.getScenicStorageAdapter(entity.getScenicId());
try {
log.info("开始上传:{}sourceId{}", dstFilePath, sourceId);
String newUrl = dstAdapter.uploadFile("video/mp4", dstFile, dstFilePath);
log.info("上传成功:{}sourceId{}", newUrl, sourceId);
SourceEntity updateEntity = new SourceEntity();
updateEntity.setId(sourceId);
updateEntity.setVideoUrl(newUrl);
sourceMapper.update(updateEntity);
} catch (Exception e) {
log.info("上传失败:{}sourceId{}", dstFilePath, sourceId, e);
} finally {
try {
dstFile.delete();
} catch (Exception ignored) {
}
}
});
}
}