Untitled

mail@pastecode.io avatarunknown
plain_text
a month ago
4.8 kB
2
Indexable
Never
func LoadFileFromURL(inputURL string) (beep.Streamer, beep.Format, error) {
	resp, err := http.Head(inputURL)
	if err != nil {
		fmt.Println("Head URL failed")
		return nil, beep.Format{}, err
	}
	contentType := resp.Header.Get("Content-Type")
	if !isAudioContentType(contentType) {
		panic("URL does not point to an audio resource")
	}
	defer resp.Body.Close()
	response, errGet := http.Get(inputURL)
	if errGet != nil {
		fmt.Println("Get URL failed")
		return nil, beep.Format{}, errGet
	}
	defer response.Body.Close()
	streamer, format, errDecode := mp3.Decode(response.Body)
	if errDecode != nil {
		fmt.Println("Decode failed")
		fmt.Println(errDecode.Error())
		return nil, beep.Format{}, errDecode
	}
	// defer streamer.Close()
	err = speaker.Init(format.SampleRate, format.SampleRate.N(time.Second/10))
	if err != nil {
		fmt.Println("Init failed")
		return nil, beep.Format{}, err
	}
	return streamer, format, nil
}

func MixTwoAudio(source1, source2 string) (beep.Streamer, error) {
	fmt.Println(source1)
	fmt.Println(source2)
	streamer1, format1, err := LoadFileFromURL(source1)
	if err != nil {
		log.Fatal("Load file failed")
		return nil, err
	}
	streamer2, format2, err := LoadFileFromURL(source2)
	if err != nil {
		log.Fatal("Load file failed")
		return nil, err
	}
	//
	if format1.SampleRate != format2.SampleRate {
		log.Fatal("Difference SampleRate")
		return nil, errors.New("Difference SampleRate")
	}

	speaker.Init(format1.SampleRate, format1.SampleRate.N(time.Second/10))

	// Mix the two audio streams.
	mixedStreamer := beep.Mix(streamer1, streamer2)

	return mixedStreamer, nil
	
}
func ReadFilesFromFolder(folder string) ([]string, error) {
	endpoint := "upload-static.fpt.net:80"
	accessKeyID := "aGktZnB0"
	secretAccessKey := "WHl6aGlmcHQxMjM="
	bucketName := "sys"
	minioClient, err := minio.New(endpoint, &minio.Options{
		Creds:  credentials.NewStaticV4(accessKeyID, secretAccessKey, ""),
		Secure: false,
	})
	if err != nil {
		log.Fatal(err)
		return nil, err
	}
	objectCh := minioClient.ListObjects(context.Background(), bucketName, minio.ListObjectsOptions{
		Prefix:    "hifpt/pnc_pdx/record_call_stag/" + folder,
		Recursive: true,
	})
	var results []string
	rootURL := "https://hi-static.fpt.vn/sys/"
	for object := range objectCh {
		if object.Err != nil {
			fmt.Println(object.Err)
			return nil, object.Err
		}
		results = append(results, rootURL+object.Key)
	}
	return results, nil
}
func AppendSingleCall(folder string) { //"2023-07-27"

	listInput, err := ReadFilesFromFolder(folder)
	if err != nil {
		log.Fatal(err)
		return
	}
	// get list caller and list callee

	var listCaller []string
	var listCallee []string
	for _, record := range listInput {
		if strings.Contains(record, "caller") {
			listCaller = append(listCaller, record)
		} else if strings.Contains(record, "callee") {
			listCallee = append(listCallee, record)
		}
	}
	sort.Strings(listCaller)
	sort.Strings(listCallee)
	//
	fmt.Println(len(listCallee))
	fmt.Println(len(listCaller))
	//
	// ********************************************* TODO: Append Audio after mixed
	// var final beep.Streamer
	// for i := 0; i < len(listCallee); i++ {
	// 	fmt.Println(i)
	// 	temp, err := MixTwoAudio(listCallee[i], listCaller[i])
	// 	if err != nil {
	// 		panic(err)
	// 	}
	// 	if i == 0 {
	// 		final = temp
	// 		continue
	// 	}
	// 	final = beep.Seq(final, temp)
	// }
    // ********************** TODO: Test mixing
	_, format, _ := LoadFileFromURL(listCallee[0])

	outputFile, err := os.Create("output.mp3")
	if err != nil {
		panic(err)
	}
	defer outputFile.Close()
	final, errFinal := MixTwoAudio(listCallee[0], listCaller[0])
	if errFinal != nil {
		panic(err)
	}
	if err := wav.Encode(outputFile, final, format); err != nil {
		panic(err)
	}
	fmt.Println("Audio fetched and saved successfully")
}
func main(){
    AppendSingleCall("2023-08-14/d06c97be-bbfe-49ba-8e36-b57c1011aba5eee") //TODO: Append 1 call
}


// *************************** TODO: Test Local
func loadMP3File(filename string) (beep.Streamer, beep.Format, error) {
	f, err := os.Open(filename)
	if err != nil {
		return nil, beep.Format{}, err
	}
	streamer, format, err := mp3.Decode(f)
	if err != nil {
		return nil, beep.Format{}, err
	}
	return streamer, format, nil
}
// ************************** TODO: Download file from URL 
func downloadFile(url, filename string) error {
	response, err := http.Get(url)
	if err != nil {
		return err
	}
	defer response.Body.Close()

	file, err := os.Create(filename)
	if err != nil {
		return err
	}
	defer file.Close()

	_, err = io.Copy(file, response.Body)
	if err != nil {
		return err
	}

	return nil
}