Skip to content

Commit 1809304

Browse files
committed
fix(media): clean decode task regularly
1 parent a5a1826 commit 1809304

17 files changed

Lines changed: 149 additions & 42 deletions
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package cn.programcx.foxnaserver.api.media;
2+
3+
import cn.programcx.foxnaserver.entity.TranscodeJob;
4+
import cn.programcx.foxnaserver.service.media.TranscodeJobService;
5+
import org.springframework.beans.factory.annotation.Autowired;
6+
import org.springframework.stereotype.Service;
7+
import java.time.LocalDateTime;
8+
9+
@Service
10+
public class CacheHLSCleanService {
11+
12+
@Autowired
13+
private TranscodeJobService transcodeJobService;
14+
15+
/**
16+
* 检查任务是否过期,如果过期则删除任务记录和文件
17+
*
18+
* @param job 需要检验的任务
19+
* @return 如果任务过期且清理成功则返回true,否则返回false
20+
*/
21+
public boolean cleanIfExpired(TranscodeJob job) {
22+
Long expireSecs = job.getExpireSecs();
23+
LocalDateTime completedTime = job.getCompletedAt();
24+
LocalDateTime updatedTime = job.getUpdatedAt();
25+
LocalDateTime createTime = job.getCreatedAt();
26+
27+
if (completedTime != null) {
28+
if (completedTime.isBefore(LocalDateTime.now().minusSeconds(expireSecs))) {
29+
return cleanupJob(job);
30+
}
31+
} else if (updatedTime != null) {
32+
if (updatedTime.isBefore(LocalDateTime.now().minusSeconds(expireSecs))) {
33+
return cleanupJob(job);
34+
}
35+
} else if (createTime != null) {
36+
if (createTime.isBefore(LocalDateTime.now().minusSeconds(expireSecs))) {
37+
return cleanupJob(job);
38+
}
39+
}
40+
return false;
41+
}
42+
43+
public boolean cleanupJob(TranscodeJob job) {
44+
if (job.getStatus().equals(TranscodeJob.Status.FAILED.name()) ||
45+
job.getStatus().equals(TranscodeJob.Status.CANCELLED.name())) {
46+
try {
47+
transcodeJobService.cleanupJobFiles(job);
48+
return true;
49+
} catch (Exception e) {
50+
return false;
51+
}
52+
} else if (job.getStatus().equals(TranscodeJob.Status.PENDING.name())) {
53+
return true;
54+
}
55+
return transcodeJobService.deleteJob(job.getJobId(), job.getCreatorId());
56+
}
57+
}

src/main/java/cn/programcx/foxnaserver/api/media/MediaServiceController.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
import cn.programcx.foxnaserver.dto.media.MediaInfoDTO;
77
import cn.programcx.foxnaserver.dto.media.SubtitleJobStatus;
88
import cn.programcx.foxnaserver.dto.media.SubtitleTranscodeTask;
9-
import cn.programcx.foxnaserver.dto.media.TranscodeTask;
109
import cn.programcx.foxnaserver.entity.TranscodeJob;
1110
import cn.programcx.foxnaserver.mapper.ResourceMapper;
1211
import cn.programcx.foxnaserver.service.media.DecodeMediaService;
@@ -32,7 +31,6 @@
3231
import org.springframework.web.bind.annotation.*;
3332
import java.io.File;
3433
import java.io.IOException;
35-
import java.io.InputStream;
3634
import java.nio.file.Files;
3735
import java.nio.file.Path;
3836
import java.time.LocalDateTime;
@@ -46,7 +44,8 @@
4644
@Tag(name = "MediaServiceController", description = "提供流媒体相关的接口")
4745
public class MediaServiceController {
4846

49-
private final String tempDir = System.getProperty("java.io.tmpdir") +
47+
private final String tempDir = System.getProperty("user.dir") +
48+
File.separator + "temp" +
5049
File.separator + "foxnas" +
5150
File.separator + "transcode";
5251

@@ -313,7 +312,7 @@ public ResponseEntity<Map<String, String>> submit(@RequestBody TranscodeRequest
313312
req.getAudioTrackIndex(),
314313
req.getSubtitleTrackIndex(),
315314
req.isImmediate(),
316-
fingerprint
315+
fingerprint, req.getExpireSecs()
317316
);
318317

319318
boolean isReused = !job.getJobId().equals(req.getFingerprint()) &&
@@ -568,6 +567,7 @@ class TranscodeRequest {
568567
private int subtitleTrackIndex = -1;
569568
private boolean immediate = false; // true=立即观看(高优先级)
570569
private String fingerprint; // 可选,如果前端已计算指纹可直接传入
570+
private Long expireSecs = 86400L; // 缓存过期时间,默认24小时
571571
}
572572

573573
@Data

src/main/java/cn/programcx/foxnaserver/api/media/TranscodeJobController.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ public Result<TranscodeJob> createJob(@RequestBody CreateJobRequest request) {
7474
request.getAudioTrackIndex(),
7575
request.getSubtitleTrackIndex(),
7676
request.isImmediate(),
77-
fingerprint
77+
fingerprint, request.getExpireSecs()
7878
);
7979

8080
return Result.success(job);
@@ -337,6 +337,7 @@ public static class CreateJobRequest {
337337
private Integer subtitleTrackIndex = -1;
338338
private boolean immediate = false;
339339
private String fingerprint; // 可选
340+
private Long expireSecs = 86400L; // 缓存过期时间,默认24小时
340341
}
341342

342343
@Data

src/main/java/cn/programcx/foxnaserver/config/oauth/CleanupConsumer.java renamed to src/main/java/cn/programcx/foxnaserver/config/consumer/CleanupConsumer.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
1-
package cn.programcx.foxnaserver.config.oauth;
1+
package cn.programcx.foxnaserver.config.consumer;
22

33
import cn.programcx.foxnaserver.dto.media.CleanupTask;
4+
import cn.programcx.foxnaserver.service.media.TranscodeJobService;
45
import cn.programcx.foxnaserver.service.media.VideoFingerprintService;
56
import lombok.RequiredArgsConstructor;
67
import lombok.extern.slf4j.Slf4j;
78
import org.springframework.amqp.rabbit.annotation.RabbitListener;
89
import org.springframework.stereotype.Component;
910

10-
import java.io.File;
1111
import java.io.IOException;
1212
import java.nio.file.Files;
1313
import java.nio.file.Path;
@@ -20,6 +20,7 @@
2020
public class CleanupConsumer {
2121

2222
private final VideoFingerprintService fingerprintService;
23+
private final TranscodeJobService transcodeJobService;
2324

2425
@RabbitListener(queues = "task.cleanup") // 延迟队列到期后路由到这里
2526
public void onCleanup(CleanupTask task) throws IOException {

src/main/java/cn/programcx/foxnaserver/config/oauth/DLQConsumer.java renamed to src/main/java/cn/programcx/foxnaserver/config/consumer/DLQConsumer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package cn.programcx.foxnaserver.config.oauth;
1+
package cn.programcx.foxnaserver.config.consumer;
22

33
import cn.programcx.foxnaserver.config.TranscodeRabbitMQConfig;
44
import cn.programcx.foxnaserver.dto.media.JobStatus;

src/main/java/cn/programcx/foxnaserver/config/oauth/SubtitleTranscodeConsumer.java renamed to src/main/java/cn/programcx/foxnaserver/config/consumer/SubtitleTranscodeConsumer.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package cn.programcx.foxnaserver.config.oauth;
1+
package cn.programcx.foxnaserver.config.consumer;
22

33
import cn.programcx.foxnaserver.config.TranscodeRabbitMQConfig;
44
import cn.programcx.foxnaserver.dto.media.SubtitleJobStatus;
@@ -13,6 +13,7 @@
1313
import org.springframework.data.redis.core.RedisTemplate;
1414
import org.springframework.stereotype.Component;
1515

16+
import java.io.File;
1617
import java.io.IOException;
1718
import java.nio.file.Files;
1819
import java.nio.file.Path;
@@ -32,7 +33,8 @@ public class SubtitleTranscodeConsumer {
3233
private final RedisTemplate<String, Object> redisTemplate;
3334
private final RabbitTemplate rabbitTemplate;
3435

35-
private static final String TEMP_DIR = System.getProperty("java.io.tmpdir") +
36+
private static final String TEMP_DIR = System.getProperty("user.dir") +
37+
File.separator + "temp" +
3638
java.io.File.separator + "foxnas" +
3739
java.io.File.separator + "transcode";
3840

src/main/java/cn/programcx/foxnaserver/config/oauth/TranscodeConsumer.java renamed to src/main/java/cn/programcx/foxnaserver/config/consumer/TranscodeConsumer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package cn.programcx.foxnaserver.config.oauth;
1+
package cn.programcx.foxnaserver.config.consumer;
22

33
import cn.programcx.foxnaserver.config.TranscodeRabbitMQConfig;
44
import cn.programcx.foxnaserver.dto.media.CleanupTask;

src/main/java/cn/programcx/foxnaserver/dto/media/FFmpegProcessManager.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@
1818
@Slf4j
1919
public class FFmpegProcessManager {
2020

21-
private final String tempDir = System.getProperty("java.io.tmpdir") +
21+
private final String tempDir = System.getProperty("user.dir") +
22+
File.separator + "temp" +
2223
File.separator + "foxnas" +
2324
File.separator + "transcode";
2425

src/main/java/cn/programcx/foxnaserver/entity/TranscodeJob.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,12 @@ public class TranscodeJob {
129129
@TableField("completed_at")
130130
private LocalDateTime completedAt;
131131

132+
/**
133+
* 清理时间,单位秒,默认24小时
134+
*/
135+
@TableField("expire_secs")
136+
private Long expireSecs = 86400L; // 缓存过期时间,默认24小时
137+
132138
/**
133139
* 任务状态枚举
134140
*/
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package cn.programcx.foxnaserver.jobs;
2+
3+
4+
import cn.programcx.foxnaserver.api.media.CacheHLSCleanService;
5+
import cn.programcx.foxnaserver.entity.TranscodeJob;
6+
import cn.programcx.foxnaserver.mapper.TranscodeJobMapper;
7+
import lombok.extern.slf4j.Slf4j;
8+
import org.springframework.beans.factory.annotation.Autowired;
9+
import org.springframework.scheduling.annotation.Scheduled;
10+
import org.springframework.stereotype.Component;
11+
12+
import java.util.List;
13+
14+
@Slf4j
15+
@Component
16+
public class CleanHLSCacheJob{
17+
18+
@Autowired
19+
private CacheHLSCleanService cacheHLSCleanService;
20+
21+
@Autowired
22+
private TranscodeJobMapper transcodeJobMapper;
23+
24+
@Scheduled(cron = "0 0/1 * * * ?")
25+
public void scheduled()
26+
{
27+
log.info("正在清理过期任务...");
28+
List<TranscodeJob> jobs = transcodeJobMapper.selectAllJob();
29+
30+
for(TranscodeJob job : jobs) {
31+
if(cacheHLSCleanService.cleanIfExpired(job)) {
32+
log.info("清理过期任务[{}], 任务路径: {}", job.getJobId(), job.getVideoPath());
33+
}else{
34+
log.info("任务[{}]未过期or清理失败, 任务路径: {}", job.getJobId(), job.getVideoPath());
35+
}
36+
}
37+
}
38+
}

0 commit comments

Comments
 (0)