Add command line flags

This commit is contained in:
2025-06-13 17:28:26 +03:00
parent 8a10e7425f
commit 14f115fbe0

30
main.go
View File

@@ -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