Commit b7b35d9bad6b163c22ad57dbbd92255f358e2086

Authored by 648540858
1 parent 3c59c549

添加录像巡查 超过保存时间的录像文件进行移除

src/main/java/top/panll/assist/config/TaskConfig.java
... ... @@ -31,13 +31,13 @@ public class TaskConfig {
31 31 @Scheduled(cron = "0 0 0 * * ?")
32 32 private void configureTasks() {
33 33 logger.info("录像过期自检任务执行");
34   - List<File> appList = videoFileService.getAppList();
  34 + List<File> appList = videoFileService.getAppList(false);
35 35 Calendar calendar = Calendar.getInstance();
36 36 calendar.add(Calendar.DATE, - 7);
37 37 Date monday = calendar.getTime();
38 38 if (appList != null && appList.size() > 0) {
39 39 for (File appFile : appList) {
40   - List<File> streamList = videoFileService.getStreamList(appFile.getName());
  40 + List<File> streamList = videoFileService.getStreamList(appFile.getName(), false);
41 41 if (streamList != null && streamList.size() > 0) {
42 42 for (File streamFile : streamList) {
43 43 File[] recordDateFileList = streamFile.listFiles();
... ...
src/main/java/top/panll/assist/controller/RecordController.java
... ... @@ -79,9 +79,11 @@ public class RecordController {
79 79 @RequestParam int count){
80 80 WVPResult<PageInfo<String>> result = new WVPResult<>();
81 81 List<String> resultData = new ArrayList<>();
82   - List<File> appList = videoFileService.getAppList();
83   - for (File file : appList) {
84   - resultData.add(file.getName());
  82 + List<File> appList = videoFileService.getAppList(true);
  83 + if (appList != null) {
  84 + for (File file : appList) {
  85 + resultData.add(file.getName());
  86 + }
85 87 }
86 88 result.setCode(0);
87 89 result.setMsg("success");
... ... @@ -114,9 +116,11 @@ public class RecordController {
114 116 result.setMsg("app不能为空");
115 117 return result;
116 118 }
117   - List<File> streamList = videoFileService.getStreamList(app);
118   - for (File file : streamList) {
119   - resultData.add(file.getName());
  119 + List<File> streamList = videoFileService.getStreamList(app, true);
  120 + if (streamList != null) {
  121 + for (File file : streamList) {
  122 + resultData.add(file.getName());
  123 + }
120 124 }
121 125 result.setCode(0);
122 126 result.setMsg("success");
... ... @@ -155,7 +159,7 @@ public class RecordController {
155 159 result.setMsg("stream不能为空");
156 160 return result;
157 161 }
158   - List<File> dateList = videoFileService.getDateList(app, stream, year, month);
  162 + List<File> dateList = videoFileService.getDateList(app, stream, year, month, true);
159 163 for (File file : dateList) {
160 164 resultData.add(file.getName());
161 165 }
... ...
src/main/java/top/panll/assist/service/FFmpegExecUtils.java
... ... @@ -52,8 +52,16 @@ public class FFmpegExecUtils implements InitializingBean{
52 52 @Autowired
53 53 private RedisUtil redisUtil;
54 54  
55   - public FFprobe ffprobe;
56   - public FFmpeg ffmpeg;
  55 + private FFprobe ffprobe;
  56 + private FFmpeg ffmpeg;
  57 +
  58 + public FFprobe getFfprobe() {
  59 + return ffprobe;
  60 + }
  61 +
  62 + public FFmpeg getFfmpeg() {
  63 + return ffmpeg;
  64 + }
57 65  
58 66 @Override
59 67 public void afterPropertiesSet() throws Exception {
... ...
src/main/java/top/panll/assist/service/FileManagerTimer.java 0 → 100644
  1 +package top.panll.assist.service;
  2 +
  3 +import org.apache.commons.io.FileUtils;
  4 +import org.slf4j.Logger;
  5 +import org.slf4j.LoggerFactory;
  6 +import org.springframework.beans.factory.annotation.Autowired;
  7 +import org.springframework.scheduling.annotation.Scheduled;
  8 +import org.springframework.stereotype.Component;
  9 +import top.panll.assist.dto.UserSettings;
  10 +
  11 +import java.io.File;
  12 +import java.text.ParseException;
  13 +import java.text.SimpleDateFormat;
  14 +import java.util.Calendar;
  15 +import java.util.Date;
  16 +import java.util.List;
  17 +
  18 +@Component
  19 +public class FileManagerTimer {
  20 +
  21 + private SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
  22 +
  23 + private final static Logger logger = LoggerFactory.getLogger(FileManagerTimer.class);
  24 +
  25 + @Autowired
  26 + private UserSettings userSettings;
  27 +
  28 + @Autowired
  29 + private VideoFileService videoFileService;
  30 +
  31 +// @Scheduled(fixedDelay = 20000) //测试 20秒执行一次
  32 + @Scheduled(cron = "0 0 0 * * ?") //每天的0点执行
  33 + public void execute(){
  34 + int recordDay = userSettings.getRecordDay();
  35 + Date date=new Date();
  36 + Calendar calendar = Calendar.getInstance();
  37 + calendar.setTime(date);
  38 + calendar.add(Calendar.DAY_OF_MONTH, 0 - recordDay);
  39 + date = calendar.getTime();
  40 + logger.info("[录像巡查]移除 {} 之前的文件", formatter.format(date));
  41 + File recordFileDir = new File(userSettings.getRecord());
  42 + if (recordFileDir.canWrite()) {
  43 + List<File> appList = videoFileService.getAppList(false);
  44 + if (appList != null && appList.size() > 0) {
  45 + for (File appFile : appList) {
  46 + if ("download.html".equals(appFile.getName())) {
  47 + continue;
  48 + }
  49 + List<File> streamList = videoFileService.getStreamList(appFile, false);
  50 + if (streamList != null && streamList.size() > 0) {
  51 + for (File streamFile : streamList) {
  52 + List<File> dateList = videoFileService.getDateList(streamFile, null, null, false);
  53 + if (dateList != null && dateList.size() > 0) {
  54 + for (File dateFile : dateList) {
  55 + try {
  56 + Date parse = formatter.parse(dateFile.getName());
  57 + if (parse.before(date)) {
  58 + boolean result = FileUtils.deleteQuietly(dateFile);
  59 + if (result) {
  60 + logger.info("[录像巡查]成功移除 {} ", dateFile.getAbsolutePath());
  61 + }else {
  62 + logger.info("[录像巡查]移除失败 {} ", dateFile.getAbsolutePath());
  63 + }
  64 + }
  65 + } catch (ParseException e) {
  66 + e.printStackTrace();
  67 + }
  68 + }
  69 + }
  70 + if (streamFile.listFiles() == null && streamFile.listFiles().length == 0) {
  71 + boolean result = FileUtils.deleteQuietly(streamFile);
  72 + if (result) {
  73 + logger.info("[录像巡查]成功移除 {} ", streamFile.getAbsolutePath());
  74 + }else {
  75 + logger.info("[录像巡查]移除失败 {} ", streamFile.getAbsolutePath());
  76 + }
  77 + }
  78 + }
  79 + }
  80 + if (appFile.listFiles() == null || appFile.listFiles().length == 0) {
  81 + boolean result = FileUtils.deleteQuietly(appFile);
  82 + if (result) {
  83 + logger.info("[录像巡查]成功移除 {} ", appFile.getAbsolutePath());
  84 + }else {
  85 + logger.info("[录像巡查]移除失败 {} ", appFile.getAbsolutePath());
  86 + }
  87 + }
  88 +
  89 + }
  90 + }
  91 + }
  92 + }
  93 +}
... ...
src/main/java/top/panll/assist/service/VideoFileService.java
... ... @@ -40,7 +40,7 @@ public class VideoFileService {
40 40 private RedisTemplate redisTemplate;
41 41  
42 42 @Autowired
43   - private FFmpegExecUtils fFmpegExecUtils;
  43 + private FFmpegExecUtils ffmpegExecUtils;
44 44  
45 45  
46 46  
... ... @@ -49,12 +49,14 @@ public class VideoFileService {
49 49  
50 50 private final String keyStr = "MERGEORCUT";
51 51  
52   - public List<File> getAppList() {
  52 + public List<File> getAppList(Boolean sort) {
53 53 File recordFile = new File(userSettings.getRecord());
54   - if (recordFile != null) {
  54 + if (recordFile != null && recordFile.isDirectory()) {
55 55 File[] files = recordFile.listFiles();
56 56 List<File> result = Arrays.asList(files);
57   - Collections.sort(result);
  57 + if (sort != null && sort) {
  58 + Collections.sort(result);
  59 + }
58 60 return result;
59 61 }else {
60 62 return null;
... ... @@ -98,12 +100,18 @@ public class VideoFileService {
98 100 // }
99 101 // }
100 102  
101   - public List<File> getStreamList(String app) {
  103 + public List<File> getStreamList(String app, Boolean sort) {
102 104 File appFile = new File(userSettings.getRecord() + File.separator + app);
103   - if (appFile != null) {
  105 + return getStreamList(appFile, sort);
  106 + }
  107 +
  108 + public List<File> getStreamList(File appFile, Boolean sort) {
  109 + if (appFile != null && appFile.isDirectory()) {
104 110 File[] files = appFile.listFiles();
105 111 List<File> result = Arrays.asList(files);
106   - Collections.sort(result);
  112 + if (sort != null && sort) {
  113 + Collections.sort(result);
  114 + }
107 115 return result;
108 116 }else {
109 117 return null;
... ... @@ -116,7 +124,7 @@ public class VideoFileService {
116 124 * @throws ParseException
117 125 */
118 126 public void handFile(File file) {
119   - FFprobe ffprobe = fFmpegExecUtils.ffprobe;
  127 + FFprobe ffprobe = ffmpegExecUtils.getFfprobe();
120 128 if(file.exists() && file.isFile() && !file.getName().startsWith(".")&& file.getName().endsWith(".mp4") && file.getName().indexOf(":") < 0) {
121 129 try {
122 130 FFmpegProbeResult in = null;
... ... @@ -137,7 +145,7 @@ public class VideoFileService {
137 145 String newName = file.getAbsolutePath().replace(file.getName(),
138 146 simpleDateFormat.format(startTime) + "-" + simpleDateFormat.format(endTime) + "-" + durationLong + ".mp4");
139 147 file.renameTo(new File(newName));
140   - System.out.println(newName);
  148 + logger.debug("[处理文件] {}", file.getName());
141 149 } catch (IOException e) {
142 150 logger.warn("文件可能以损坏[{}]", file.getAbsolutePath());
143 151 // e.printStackTrace();
... ... @@ -151,11 +159,11 @@ public class VideoFileService {
151 159  
152 160 List<Map<String, String>> result = new ArrayList<>();
153 161  
154   - List<File> appList = getAppList();
  162 + List<File> appList = getAppList(true);
155 163 if (appList != null && appList.size() > 0) {
156 164 for (File appFile : appList) {
157 165 if (appFile.isDirectory()) {
158   - List<File> streamList = getStreamList(appFile.getName());
  166 + List<File> streamList = getStreamList(appFile.getName(), true);
159 167 if (streamList != null && streamList.size() > 0) {
160 168 for (File streamFile : streamList) {
161 169 Map<String, String> data = new HashMap<>();
... ... @@ -340,7 +348,7 @@ public class VideoFileService {
340 348 mergeOrCutTaskInfo.setEndTime(endTimeInFile);
341 349 }
342 350  
343   - fFmpegExecUtils.mergeOrCutFile(filesInTime, recordFile, stream, (status, percentage, result)->{
  351 + ffmpegExecUtils.mergeOrCutFile(filesInTime, recordFile, stream, (status, percentage, result)->{
344 352 // 发出redis通知
345 353 if (status.equals(Progress.Status.END.name())) {
346 354 mergeOrCutTaskInfo.setPercentage("1");
... ... @@ -363,11 +371,22 @@ public class VideoFileService {
363 371 return taskId;
364 372 }
365 373  
366   - public List<File> getDateList(String app, String stream, Integer year, Integer month) {
  374 + /**
  375 + * 获取指定时间的日期文件夹
  376 + * @param app
  377 + * @param stream
  378 + * @param year
  379 + * @param month
  380 + * @return
  381 + */
  382 + public List<File> getDateList(String app, String stream, Integer year, Integer month, Boolean sort) {
367 383 File recordFile = new File(userSettings.getRecord());
368 384 File streamFile = new File(recordFile.getAbsolutePath() + File.separator + app + File.separator + stream);
369   - if (!streamFile.exists()) {
370   - logger.warn("获取[app: {}, stream: {}]的视频时未找到目录: {}", app, stream, stream);
  385 + return getDateList(streamFile, year, month, sort);
  386 + }
  387 + public List<File> getDateList(File streamFile, Integer year, Integer month, Boolean sort) {
  388 + if (!streamFile.exists() && streamFile.isDirectory()) {
  389 + logger.warn("获取[]的视频时未找到目录: {}",streamFile.getName());
371 390 return null;
372 391 }
373 392 File[] dateFiles = streamFile.listFiles((File dir, String name)->{
... ... @@ -393,17 +412,19 @@ public class VideoFileService {
393 412  
394 413 });
395 414 List<File> dateFileList = Arrays.asList(dateFiles);
  415 + if (sort != null && sort) {
  416 + dateFileList.sort((File f1, File f2)->{
  417 + int sortResult = 0;
396 418  
397   - dateFileList.sort((File f1, File f2)->{
398   - int sortResult = 0;
  419 + try {
  420 + sortResult = simpleDateFormat.parse(f1.getName()).compareTo(simpleDateFormat.parse(f2.getName()));
  421 + } catch (ParseException e) {
  422 + logger.error("格式化时间{}/{}错误", f1.getName(), f2.getName());
  423 + }
  424 + return sortResult;
  425 + });
  426 + }
399 427  
400   - try {
401   - sortResult = simpleDateFormat.parse(f1.getName()).compareTo(simpleDateFormat.parse(f2.getName()));
402   - } catch (ParseException e) {
403   - logger.error("格式化时间{}/{}错误", f1.getName(), f2.getName());
404   - }
405   - return sortResult;
406   - });
407 428 return dateFileList;
408 429 }
409 430  
... ...