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 //}