Add command line flags
This commit is contained in:
30
main.go
30
main.go
@@ -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
|
||||||
|
Reference in New Issue
Block a user