Compare commits
5 Commits
5f8a9b7b14
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
| f9f23f2d3f | |||
| 3cff965393 | |||
| 7937890acd | |||
| 938dd69e5e | |||
| 7c92c346fa |
@@ -3,7 +3,7 @@ FROM alpine AS alpine
|
||||
RUN apk update && apk add --no-cache ca-certificates tzdata
|
||||
|
||||
# Build Image
|
||||
FROM golang:1.21 AS build
|
||||
FROM golang:1.24 AS build
|
||||
|
||||
# Create Package Directory
|
||||
RUN mkdir -p /opt/antholume
|
||||
|
||||
@@ -53,10 +53,12 @@ func countEPUBWords(filepath string) (int64, error) {
|
||||
rf := rc.Rootfiles[0]
|
||||
|
||||
var completeCount int64
|
||||
for _, item := range rf.Spine.Itemrefs {
|
||||
for _, item := range rf.Itemrefs {
|
||||
f, _ := item.Open()
|
||||
doc, _ := goquery.NewDocumentFromReader(f)
|
||||
completeCount = completeCount + int64(len(strings.Fields(doc.Text())))
|
||||
doc.Find("script, style, noscript, iframe").Remove()
|
||||
words := len(strings.Fields(doc.Text()))
|
||||
completeCount = completeCount + int64(words)
|
||||
}
|
||||
|
||||
return completeCount, nil
|
||||
|
||||
@@ -87,7 +87,7 @@ func GetWordCount(filepath string) (*int64, error) {
|
||||
}
|
||||
return &totalWords, nil
|
||||
} else {
|
||||
return nil, fmt.Errorf("Invalid extension: %s", fileExtension)
|
||||
return nil, fmt.Errorf("invalid extension: %s", fileExtension)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -4,14 +4,11 @@ import (
|
||||
"fmt"
|
||||
"io"
|
||||
"net/url"
|
||||
"regexp"
|
||||
"strings"
|
||||
|
||||
"github.com/PuerkitoBio/goquery"
|
||||
)
|
||||
|
||||
var commentRE = regexp.MustCompile(`(?s)<!--(.*?)-->`)
|
||||
|
||||
func searchAnnasArchive(query string) ([]SearchItem, error) {
|
||||
searchURL := "https://annas-archive.org/search?index=&q=%s&ext=epub&sort=&lang=en"
|
||||
url := fmt.Sprintf(searchURL, url.QueryEscape(query))
|
||||
@@ -32,62 +29,34 @@ func parseAnnasArchive(body io.ReadCloser) ([]SearchItem, error) {
|
||||
|
||||
// Normalize Results
|
||||
var allEntries []SearchItem
|
||||
doc.Find("#aarecord-list > div.justify-center").Each(func(ix int, rawBook *goquery.Selection) {
|
||||
rawBook = getAnnasArchiveBookSelection(rawBook)
|
||||
doc.Find(".js-aarecord-list-outer > div > div").Each(func(ix int, rawBook *goquery.Selection) {
|
||||
|
||||
// Parse Details
|
||||
details := rawBook.Find("div:nth-child(2) > div:nth-child(1)").Text()
|
||||
detailsSplit := strings.Split(details, ", ")
|
||||
details := rawBook.Find("div:nth-child(3)").Text()
|
||||
detailsSplit := strings.Split(details, " · ")
|
||||
|
||||
// Invalid Details
|
||||
if len(detailsSplit) < 4 {
|
||||
if len(detailsSplit) < 3 {
|
||||
return
|
||||
}
|
||||
|
||||
// Parse MD5
|
||||
itemHref, _ := rawBook.Find("a").Attr("href")
|
||||
titleAuthorDetails := rawBook.Find("div a")
|
||||
titleEl := titleAuthorDetails.Eq(0)
|
||||
itemHref, _ := titleEl.Attr("href")
|
||||
hrefArray := strings.Split(itemHref, "/")
|
||||
id := hrefArray[len(hrefArray)-1]
|
||||
|
||||
allEntries = append(allEntries, SearchItem{
|
||||
ID: id,
|
||||
Title: rawBook.Find("h3").First().Text(),
|
||||
Author: rawBook.Find("div:nth-child(2) > div:nth-child(4)").First().Text(),
|
||||
Title: titleEl.Text(),
|
||||
Author: titleAuthorDetails.Eq(1).Text(),
|
||||
Language: detailsSplit[0],
|
||||
FileType: detailsSplit[1],
|
||||
FileSize: detailsSplit[3],
|
||||
FileSize: detailsSplit[2],
|
||||
})
|
||||
})
|
||||
|
||||
// Return Results
|
||||
return allEntries, nil
|
||||
}
|
||||
|
||||
// getAnnasArchiveBookSelection parses potentially commented out HTML. For some reason
|
||||
// Annas Archive comments out blocks "below the fold". They aren't rendered until you
|
||||
// scroll. This attempts to parse the commented out HTML.
|
||||
func getAnnasArchiveBookSelection(rawBook *goquery.Selection) *goquery.Selection {
|
||||
rawHTML, err := rawBook.Html()
|
||||
if err != nil {
|
||||
return rawBook
|
||||
}
|
||||
|
||||
strippedHTML := strings.TrimSpace(rawHTML)
|
||||
if !strings.HasPrefix(strippedHTML, "<!--") || !strings.HasSuffix(strippedHTML, "-->") {
|
||||
return rawBook
|
||||
}
|
||||
|
||||
allMatches := commentRE.FindAllStringSubmatch(strippedHTML, -1)
|
||||
if len(allMatches) != 1 || len(allMatches[0]) != 2 {
|
||||
return rawBook
|
||||
}
|
||||
|
||||
captureGroup := allMatches[0][1]
|
||||
docReader := strings.NewReader(captureGroup)
|
||||
doc, err := goquery.NewDocumentFromReader(docReader)
|
||||
if err != nil {
|
||||
return rawBook
|
||||
}
|
||||
|
||||
return doc.Selection
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user