239 lines
6.6 KiB
Go
239 lines
6.6 KiB
Go
package processor
|
||
|
||
import (
|
||
"fmt"
|
||
"os"
|
||
"os/exec"
|
||
"strconv"
|
||
"strings"
|
||
"time"
|
||
)
|
||
|
||
// partitionTime convert numbers from type STRING to type INT.
|
||
func partitionTime(time string) (startHour int, startMinute int, err error) {
|
||
// Part hours and minutes.
|
||
s := []byte(time)
|
||
h := []byte{s[0], s[1]}
|
||
m := []byte{s[3], s[4]}
|
||
|
||
// Transforms hours and minutes into INTs.
|
||
startHour, err = strconv.Atoi(string(h))
|
||
if err != nil {
|
||
return 0, 0, err
|
||
}
|
||
startMinute, err = strconv.Atoi(string(m))
|
||
if err != nil {
|
||
return 0, 0, err
|
||
}
|
||
|
||
return startHour, startMinute, nil
|
||
}
|
||
|
||
// createTXT collects filenames into TXT file.
|
||
func createTXT(path, date, startTime, endTime string) (string, error) {
|
||
//fileNames := make([]string, 0)
|
||
|
||
fileNameTXT := startTime + "_" + endTime + ".txt"
|
||
f, err := os.Create(path + fileNameTXT)
|
||
if err != nil {
|
||
return "", fmt.Errorf("create file error: %s", err.Error())
|
||
}
|
||
defer f.Close()
|
||
|
||
// Read the directory.
|
||
dirEntry, err := os.ReadDir(path)
|
||
if err != nil {
|
||
return "", fmt.Errorf("read directory error: %s", err.Error())
|
||
}
|
||
|
||
// Calculate start time and end time of the required fragment.
|
||
startHour, startMinute, endHour, endMinute := calcNeededTime(startTime, endTime)
|
||
|
||
for i := startHour; i <= endHour; i++ {
|
||
for j := startMinute; j < endMinute; j++ { // exclude the last minute as endMinute is the final time
|
||
for _, entry := range dirEntry {
|
||
if strings.Contains(entry.Name(), strconv.Itoa(i)+"-"+strconv.Itoa(j)+"-00"+"_"+date) {
|
||
_, err = f.WriteString("file '" + entry.Name() + "'\n")
|
||
if err != nil {
|
||
return "", fmt.Errorf("write file error: %s", err.Error())
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
return fileNameTXT, nil
|
||
}
|
||
|
||
// mergeFiles merges the collected files into one MP4 file.
|
||
func mergeFiles(path, fileNamesTXT string) (string, error) {
|
||
fileNameRes := time.Now().Format("15-04-05") + "_video.mp4"
|
||
|
||
cmd := exec.Command("ffmpeg",
|
||
"-f", "concat",
|
||
"-safe", "0",
|
||
"-fflags", "+genpts",
|
||
"-i", path+fileNamesTXT,
|
||
"-c", "copy",
|
||
path+fileNameRes)
|
||
|
||
err := cmd.Run()
|
||
if err != nil {
|
||
return "", fmt.Errorf("merge files error: %s", err.Error())
|
||
}
|
||
|
||
return fileNameRes, nil
|
||
}
|
||
|
||
/////////////////////////////////////////////////////////////////////////////////////
|
||
|
||
//// Функция copyFile находит файл в репозитории и создает его копию.
|
||
//func copyFiles(path string, filename []string) (filenameCopied []string, err error) {
|
||
// for i := 0; i < len(filename); i++ {
|
||
// input, err := os.Open(path + filename[i])
|
||
// if err != nil {
|
||
// log.Println("Ошибка открытия input файла: ", err)
|
||
// }
|
||
// defer func() {
|
||
// err = input.Close()
|
||
// if err != nil {
|
||
// log.Println("Ошибка закрытия input файла.")
|
||
// }
|
||
// }()
|
||
//
|
||
// output, err := os.Create(time.Now().Format("15-04-05") + "video.mkv")
|
||
// if err != nil {
|
||
// log.Println("Ошибка создания output файла: ", err)
|
||
// }
|
||
// defer func() {
|
||
// err = output.Close()
|
||
// if err != nil {
|
||
// log.Println("Ошибка закрытия output файла.")
|
||
// }
|
||
//
|
||
// }()
|
||
//
|
||
// _, err = io.Copy(output, input)
|
||
// if err != nil {
|
||
// log.Println("Ошибка копирования файла")
|
||
// }
|
||
// }
|
||
//
|
||
// log.Println("Файлы скопированы.")
|
||
// return filename, err
|
||
//}
|
||
//
|
||
//// MergeMKV принимает названия видеофайлов для объединения.
|
||
//func MergeMKV(filenames ...string) {
|
||
// // Создание файла со списком видеофайлов для объединения
|
||
// f, err := os.Create("videoList.txt")
|
||
// if err != nil {
|
||
// log.Fatalln("Ошибка создания файла со списком видеофайлов для объединения", err)
|
||
// }
|
||
// defer func() {
|
||
// err = f.Close()
|
||
// if err != nil {
|
||
// log.Fatalln("Ошибка закрытия файла: ", err.Error())
|
||
// }
|
||
// }()
|
||
//
|
||
// // Запись видеофайлов для объединения
|
||
// n := len(filenames)
|
||
//
|
||
// for i := 0; i < n; i++ {
|
||
// _, err = f.WriteString("file '" + filenames[i] + "'\n")
|
||
// if err != nil {
|
||
// log.Fatalln(err)
|
||
// }
|
||
// }
|
||
//
|
||
// err = mergeFfmpeg(f)
|
||
// if err != nil {
|
||
// log.Fatalln("Ошибка объединения видеофайлов с помощью ffmpeg: ", err)
|
||
// }
|
||
//
|
||
// err = os.Remove("videoList.txt")
|
||
// if err != nil {
|
||
// log.Println("Ошибка удаления временного файла videoList.txt: ", err)
|
||
// }
|
||
// log.Println("Временный файл videoList.txt успешно удален")
|
||
//}
|
||
//
|
||
//// DeleteTrimmedFragments удаляет временно созданные файлы.
|
||
//func DeleteTrimmedFragments(filenames ...string) {
|
||
// n := len(filenames)
|
||
//
|
||
// for i := 0; i < n; i++ {
|
||
// err := os.Remove(filenames[i])
|
||
// if err != nil {
|
||
// log.Printf("Ошибка удаления временного файла %s: %s", filenames[i], err.Error())
|
||
// }
|
||
// log.Printf("Временный файл %s успешно удален", filenames[i])
|
||
// }
|
||
//}
|
||
//
|
||
//
|
||
//// createFilename forms first part of the filename which contains time and date.
|
||
//func createFilename(time, date string) (fileName string) {
|
||
// s := []byte(time)
|
||
// s[3], s[4] = '0', '0'
|
||
// fileName = string(s) + "_" + date
|
||
// return fileName
|
||
//}
|
||
//
|
||
//// Добавление одного часа к строке в формате ЧЧ-ММ
|
||
//func addHour(startTime string) (fileName string) {
|
||
// s := []byte(startTime)
|
||
// if s[0] == '0' && s[1] == '9' {
|
||
// s[0] = '1'
|
||
// s[1] = '0'
|
||
// } else if s[0] == '1' && s[1] == '9' {
|
||
// s[0] = '2'
|
||
// s[1] = '0'
|
||
// } else {
|
||
// s[1]++
|
||
// }
|
||
// fileName = string(s)
|
||
// return fileName
|
||
//}
|
||
//
|
||
//// Проверка наличия файла
|
||
//func checkFile(path, fileName string) (string, error) {
|
||
// found := false
|
||
// filenameIn := fileName
|
||
//
|
||
// dirEntry, err := os.ReadDir(path)
|
||
// if err != nil {
|
||
// return "", err
|
||
// }
|
||
// for _, entry := range dirEntry {
|
||
// if strings.Contains(entry.Name(), filenameIn) {
|
||
// filenameIn = entry.Name()
|
||
// break
|
||
// }
|
||
// return "", fmt.Errorf("file %s not found", filenameIn)
|
||
// }
|
||
//
|
||
// err = filepath.Walk(path, func(filePath string, info os.FileInfo, err error) error {
|
||
// if err != nil {
|
||
// return err // Возвращаем ошибку, если возникла
|
||
// }
|
||
// if !info.IsDir() && info.Name() == filenameIn {
|
||
// log.Println("Файл обнаружен:", filePath)
|
||
// found = true
|
||
// return filepath.SkipDir // Останавливаем обход после нахождения
|
||
// }
|
||
// return nil
|
||
// })
|
||
//
|
||
// if err != nil {
|
||
// return "", err
|
||
// }
|
||
//
|
||
// if !found {
|
||
// return "", errors.New("file not found")
|
||
// }
|
||
//
|
||
// return filenameIn, nil
|
||
//}
|