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 ( import (
"encoding/json" "encoding/json"
"flag"
"fmt" "fmt"
"io" "io"
"net/http" "net/http"
@@ -12,18 +13,28 @@ import (
) )
// HTTP клиент с таймаутом // HTTP клиент с таймаутом
var httpClient = &http.Client{ var httpClient *http.Client
Timeout: 30 * time.Second,
}
func main() { 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>") fmt.Println("Usage: program <json-file> <output-dir>")
os.Exit(1) os.Exit(1)
} }
jsonFile := os.Args[1] jsonFile := args[0]
outputDir := os.Args[2] outputDir := args[1]
httpClient = &http.Client{
Timeout: *timeout,
}
// Создаем директорию для загрузок // Создаем директорию для загрузок
if err := os.MkdirAll(outputDir, 0755); err != nil { 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 var wg sync.WaitGroup
start := time.Now() start := time.Now()
@@ -59,7 +70,7 @@ func main() {
defer func() { <-sem }() // Освобождаем слот defer func() { <-sem }() // Освобождаем слот
filename := filepath.Join(outputDir, fmt.Sprintf("image_%06d%s", idx, fileExtension(url))) 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) fmt.Printf("Error downloading %s: %v\n", url, err)
} else { } else {
fmt.Printf("Downloaded %s -> %s\n", url, filename) fmt.Printf("Downloaded %s -> %s\n", url, filename)
@@ -92,8 +103,7 @@ func fileExtension(url string) string {
} }
// Скачиваем и сохраняем изображение // Скачиваем и сохраняем изображение
func downloadImage(url, filename string) error { func downloadImage(url, filename string, maxRetries int) error {
const maxRetries = 3
const retryDelay = 1 * time.Second const retryDelay = 1 * time.Second
var lastErr error var lastErr error