1

Fix downloading of forums with many pages

This commit is contained in:
Vladimir Hodakov 2021-12-20 17:45:05 +04:00
parent 2de559f5cb
commit 21d9108539
Signed by: Vladimir Hodakov
GPG Key ID: 673980B6882F82C6
5 changed files with 48 additions and 21 deletions

View File

@ -36,6 +36,7 @@ func main() {
c.Init()
c.Logger.Info().Str("версия", version).Str("коммит", commit).Str("дата сборки", date).
Msg("Загрузчик торрентов из разделов NNM-Club начинает свою работу")
c.Logger.Info().Msg("Copyright (c) 2012-2022 Vladimir «fat0troll» Hodakov")
c.InitConfig()
loginer.New(c)

View File

@ -5,6 +5,7 @@
package fetcher
import (
"fmt"
"os"
"path/filepath"
"strconv"
@ -89,7 +90,7 @@ func download(topic *forumTopic) {
}
func fetch(forumID int) {
startPage := "https://" + c.Config.URL + "/forum/viewforum.php?f=" + strconv.Itoa(forumID)
startPage := fmt.Sprintf("https://%s/forum/viewforum.php?f=%d", c.Config.URL, forumID)
time.Sleep(5 * time.Second)
@ -109,9 +110,7 @@ func fetch(forumID int) {
dlog.Info().Str("название форума", getForumName(forumPages[1])).Msg("Определён форум для загрузки")
getNavigation(forumPages[1])
downloadAdditionalPages()
downloadAdditionalPages(forumID)
for _, forumPage := range forumPages {
getTopics(forumPage)

View File

@ -91,17 +91,6 @@ func getLastModeratedDate(querier *goquery.Document) string {
return dateValue.Format("2006-01-02")
}
func getNavigation(querier *goquery.Document) {
querier.Find("td[align=right] .nav a").Each(func(i int, sel *goquery.Selection) {
if !strings.Contains(sel.Text(), "След") {
href, _ := sel.Attr("href")
forumPagesLinks[sel.Text()] = href
}
})
dlog.Info().Int("количество страниц", len(forumPagesLinks)+1).Msg("Определено количество страниц")
}
func getTopics(querier *goquery.Document) {
querier.Find(".forumline tr").Each(func(i int, sel *goquery.Selection) {
if strings.Contains(sel.Text(), "DL:") {
@ -119,3 +108,15 @@ func getTopics(querier *goquery.Document) {
}
})
}
func isForumPageEmpty(querier *goquery.Document) bool {
isEmpty := false
querier.Find(".forumline tr").Each(func(i int, sel *goquery.Selection) {
if strings.Contains(sel.Text(), "В этом форуме пока нет сообщений") {
isEmpty = true
}
})
return isEmpty
}

View File

@ -38,6 +38,10 @@ func setQuerier(pageFile string, pageType string, page int) error {
return errors.New("получена анонимная страница")
}
if isForumPageEmpty(querier) {
return errors.New("получена пустая страница")
}
forumPages[page] = querier
default:

View File

@ -5,27 +5,49 @@
package fetcher
import (
"fmt"
"io"
"io/ioutil"
"net/http"
"strconv"
"time"
"golang.org/x/text/encoding/charmap"
"golang.org/x/text/transform"
)
func downloadAdditionalPages() {
for i := range forumPagesLinks {
forumPage, _ := strconv.Atoi(i)
const (
forumPageOffset = 50
)
func downloadAdditionalPages(forumID int) {
forumPage := 2
for {
dlog.Info().Int("номер страницы", forumPage).Msg("Скачивается ещё одна страница форума")
pageFile, err := downloadFile("https://"+c.Config.URL+"/forum/"+forumPagesLinks[i], true)
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("Не удалось загрузить страницу форума")
}
_ = setQuerier(pageFile, "forumPage", forumPage)
err = setQuerier(pageFile, "forumPage", forumPage)
if err != nil {
dlog.Info().Str("причина завершения", err.Error()).
Msg("Завершено скачивание страниц форума")
// Found empty page, leaving cycle
break
}
forumPage++
}
}