1
uploader_tools/internal/services/fetcher/request.go

113 lines
2.4 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// NNM-Club torrent files mass downloader
// Created for Uploaders group
// Copyright (c) 2012-2022 Vladimir "fat0troll" Hodakov
package fetcher
import (
"fmt"
"io"
"io/ioutil"
"net/http"
"time"
"golang.org/x/text/encoding/charmap"
"golang.org/x/text/transform"
)
const (
forumPageOffset = 50
)
func downloadAdditionalPages(forumID int) {
forumPage := 2
for {
dlog.Info().Int("номер страницы", forumPage).Msg("Скачивается ещё одна страница форума")
pageURL := fmt.Sprintf(
"https://%s/forum/viewforum.php?f=%d&start=%d#pagestart",
c.Config.URL, forumID, (forumPage-1)*forumPageOffset,
)
if uberDebug {
dlog.Debug().Str("URL страницы", pageURL).Msg("Сформирован URL для скачивания")
}
pageFile, err := downloadFile(pageURL, true)
if err != nil {
dlog.Fatal().Err(err).Msg("Не удалось загрузить страницу форума")
}
err = setQuerier(pageFile, "forumPage", forumPage)
if err != nil {
dlog.Info().Str("причина завершения", err.Error()).
Msg("Завершено скачивание страниц форума")
// Found empty page, leaving cycle
break
}
forumPage++
}
}
func downloadFile(url string, transformEncoding bool) (string, error) {
req, err := http.NewRequest(http.MethodGet, url, nil)
if err != nil {
return "", err
}
for i := range c.Cookies {
req.AddCookie(c.Cookies[i])
}
var resp *http.Response
var retryCount int = 0
for {
if retryCount < 5 {
resp, err = dclient.Do(req)
if err != nil {
if uberDebug {
dlog.Debug().Err(err).Int("попытка", retryCount+1).Msg("Не удалось получить данные, пытаемся ещё раз")
}
time.Sleep(time.Second)
retryCount++
} else {
break
}
} else {
return "", err
}
}
defer resp.Body.Close()
tempF, err := ioutil.TempFile("", "massdl-*")
if err != nil {
return "", err
}
defer tempF.Close()
if transformEncoding {
respInUTF8 := transform.NewReader(resp.Body, charmap.Windows1251.NewDecoder())
_, err = io.Copy(tempF, respInUTF8)
if err != nil {
return "", err
}
} else {
_, err = io.Copy(tempF, resp.Body)
if err != nil {
return "", err
}
}
if uberDebug {
dlog.Debug().Str("расположение", tempF.Name()).Msg("Загружен файл из сети")
}
return tempF.Name(), nil
}