Commit b7b35d9bad6b163c22ad57dbbd92255f358e2086
1 parent
3c59c549
添加录像巡查 超过保存时间的录像文件进行移除
Showing
5 changed files
with
161 additions
and
35 deletions
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 | ... | ... |