ytva/file.go
Logan G dc0f9af220
Sanitize file names
I falsely assumed that YT didn't allow this

Not only was this wrong, but other platforms exist too...
2025-01-03 02:01:48 -07:00

85 lines
2.1 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 main
import (
"fmt"
"os"
"errors"
"io"
"strings"
"regexp"
"github.com/charmbracelet/log"
"github.com/h2non/filetype"
)
func getExtension(filePath string) (extension string, err error) {
buf, _ := os.ReadFile(filePath)
kind, _ := filetype.Match(buf)
if kind == filetype.Unknown {
return "", errors.New(fmt.Sprintf("Unknown file type."))
}
return kind.Extension, nil
}
func copyFile(src, dst string) (error) {
log.Debugf("Copying file \"%s\" to \"%s\"", src, dst)
// Get source file stats (e.g. permissions).
srcFileStat, err := os.Stat(src)
if err != nil {
return fmt.Errorf("failed to get file info for %s: %v", src, err)
}
// Check whether the source is a regular file.
if !srcFileStat.Mode().IsRegular() {
return fmt.Errorf("source file %s is not a regular file", src)
}
// Open the source file.
srcFile, err := os.Open(src)
if err != nil {
return fmt.Errorf("failed to open source file %s: %v", src, err)
}
defer srcFile.Close()
// Create the destination file, with the same permissions as the source.
dstFile, err := os.OpenFile(dst, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, srcFileStat.Mode())
if err != nil {
return fmt.Errorf("failed to create destination file %s: %v", dst, err)
}
defer dstFile.Close()
// Copy the file contents from source to destination.
if _, err := io.Copy(dstFile, srcFile); err != nil {
return fmt.Errorf("error copying file from %s to %s: %v", src, dst, err)
}
return nil
}
func replaceDelimiters(input string) string {
replacer := strings.NewReplacer(
"/", "",
"\\", "",
)
return replacer.Replace(input)
}
func sanitizeFilename(filename string) string {
invalidFilenameChars := regexp.MustCompile(`[^a-zA-Z0-9._-[[:blank:]]]+`)
sanitized := invalidFilenameChars.ReplaceAllString(filename, "-")
// Trim any leading or trailing spaces or underscores.
sanitized = strings.Trim(sanitized, " _.")
if sanitized == "" {
sanitized = " "
}
return sanitized
}