package util
import (
"crypto/md5"
"encoding/hex"
"errors"
"net/http"
"net/url"
"os/exec"
"path/filepath"
"regexp"
"strconv"
"bilidown/common"
)
func CheckBvidFormat(bvid string) bool {
return regexp.MustCompile("^BV1[a-zA-Z0-9]+").MatchString(bvid)
}
// GetDefaultDownloadFolder 获取默认下载路径
func GetDefaultDownloadFolder() (string, error) {
return filepath.Abs("./download")
}
func IsNumber(str string) bool {
_, err := strconv.Atoi(str)
return err == nil
}
// IsValidURL 判断字符串是否为合法的URL
func IsValidURL(u string) bool {
_, err := url.ParseRequestURI(u)
return err == nil
}
// IsValidFormatCode 判断格式码是否合法
func IsValidFormatCode(format common.MediaFormat) bool {
allowed := []common.MediaFormat{6, 16, 32, 64, 74, 80, 112, 116, 120, 125, 126, 127}
for _, v := range allowed {
if v == format {
return true
}
}
return false
}
// FilterFileName 过滤字符串中的特殊字符,使其允许作为文件名。
func FilterFileName(fileName string) string {
return regexp.MustCompile(`[\\/:*?"<>|\n]`).ReplaceAllString(fileName, "")
}
// GetFFmpegPath 获取可用的 FFmpeg 执行路径。
func GetFFmpegPath() (string, error) {
if err := exec.Command("ffmpeg", "-version").Run(); err == nil {
return "ffmpeg", nil
}
if err := exec.Command("bin/ffmpeg", "-version").Run(); err == nil {
return "bin/ffmpeg", nil
}
return "", errors.New("ffmpeg not found")
}
// GetRedirectedLocation 获取响应头中的 Location,不会自动跟随重定向。
func GetRedirectedLocation(url string) (string, error) {
client := &http.Client{
CheckRedirect: func(req *http.Request, via []*http.Request) error {
return http.ErrUseLastResponse
},
}
request, err := http.NewRequest("HEAD", url, nil)
if err != nil {
return "", err
}
response, err := client.Do(request)
if err != nil {
return "", err
}
if locationURL, err := response.Location(); err != nil {
return "", err
} else {
return locationURL.String(), nil
}
}
func MD5Hash(str string) string {
hasher := md5.New()
hasher.Write([]byte(str))
hash := hasher.Sum(nil)
hashString := hex.EncodeToString(hash)
return hashString
}