52 lines
1.1 KiB
Go
52 lines
1.1 KiB
Go
package cache
|
|
|
|
import (
|
|
"fmt"
|
|
"io/ioutil"
|
|
"net/http"
|
|
"os"
|
|
"path/filepath"
|
|
|
|
"train/pkg/paths"
|
|
)
|
|
|
|
var cacheDir = filepath.Join(paths.BaseDir(), "cache")
|
|
|
|
func GetCachedFile(url string) (string, error) {
|
|
if err := os.MkdirAll(cacheDir, os.ModePerm); err != nil {
|
|
return "", err
|
|
}
|
|
fileName := filepath.Join(cacheDir, filepath.Base(url))
|
|
if _, err := os.Stat(fileName); err == nil {
|
|
return fileName, nil
|
|
}
|
|
return "", nil
|
|
}
|
|
|
|
func SaveToCache(url string, data []byte) (string, error) {
|
|
if err := os.MkdirAll(cacheDir, os.ModePerm); err != nil {
|
|
return "", err
|
|
}
|
|
fileName := filepath.Join(cacheDir, filepath.Base(url))
|
|
if err := ioutil.WriteFile(fileName, data, 0644); err != nil {
|
|
return "", err
|
|
}
|
|
fmt.Printf("Сохранено в кэш: %s\n", fileName)
|
|
return fileName, nil
|
|
}
|
|
|
|
func DownloadWithCache(url string) (string, error) {
|
|
if cached, err := GetCachedFile(url); err == nil && cached != "" {
|
|
return cached, nil
|
|
}
|
|
resp, err := http.Get(url)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
defer resp.Body.Close()
|
|
data, err := ioutil.ReadAll(resp.Body)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
return SaveToCache(url, data)
|
|
} |