2025-03-10 17:51:03 +05:00

239 lines
6.6 KiB
Go
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 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
//}