Add command line flags
This commit is contained in:
30
main.go
30
main.go
@@ -2,6 +2,7 @@ package main
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"flag"
|
||||
"fmt"
|
||||
"io"
|
||||
"net/http"
|
||||
@@ -12,18 +13,28 @@ import (
|
||||
)
|
||||
|
||||
// HTTP клиент с таймаутом
|
||||
var httpClient = &http.Client{
|
||||
Timeout: 30 * time.Second,
|
||||
}
|
||||
var httpClient *http.Client
|
||||
|
||||
func main() {
|
||||
if len(os.Args) != 3 {
|
||||
timeout := flag.Duration("t", 60*time.Second, "request timeout")
|
||||
retries := flag.Int("r", 5, "number of download attempts")
|
||||
jobs := flag.Int("j", 5, "concurrent downloads")
|
||||
|
||||
flag.Parse()
|
||||
|
||||
args := flag.Args()
|
||||
|
||||
if len(args) != 2 {
|
||||
fmt.Println("Usage: program <json-file> <output-dir>")
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
jsonFile := os.Args[1]
|
||||
outputDir := os.Args[2]
|
||||
jsonFile := args[0]
|
||||
outputDir := args[1]
|
||||
|
||||
httpClient = &http.Client{
|
||||
Timeout: *timeout,
|
||||
}
|
||||
|
||||
// Создаем директорию для загрузок
|
||||
if err := os.MkdirAll(outputDir, 0755); err != nil {
|
||||
@@ -46,7 +57,7 @@ func main() {
|
||||
}
|
||||
|
||||
// Семафор для ограничения параллелизма
|
||||
sem := make(chan struct{}, 5)
|
||||
sem := make(chan struct{}, *jobs)
|
||||
var wg sync.WaitGroup
|
||||
|
||||
start := time.Now()
|
||||
@@ -59,7 +70,7 @@ func main() {
|
||||
defer func() { <-sem }() // Освобождаем слот
|
||||
|
||||
filename := filepath.Join(outputDir, fmt.Sprintf("image_%06d%s", idx, fileExtension(url)))
|
||||
if err := downloadImage(url, filename); err != nil {
|
||||
if err := downloadImage(url, filename, *retries); err != nil {
|
||||
fmt.Printf("Error downloading %s: %v\n", url, err)
|
||||
} else {
|
||||
fmt.Printf("Downloaded %s -> %s\n", url, filename)
|
||||
@@ -92,8 +103,7 @@ func fileExtension(url string) string {
|
||||
}
|
||||
|
||||
// Скачиваем и сохраняем изображение
|
||||
func downloadImage(url, filename string) error {
|
||||
const maxRetries = 3
|
||||
func downloadImage(url, filename string, maxRetries int) error {
|
||||
const retryDelay = 1 * time.Second
|
||||
|
||||
var lastErr error
|
||||
|
Reference in New Issue
Block a user