grabrr/lib/bunkr/bunkr.go

110 lines
2.3 KiB
Go
Raw Normal View History

2025-07-22 15:09:48 +03:00
package lib
2025-07-23 15:08:33 +03:00
import (
"fmt"
"net/http"
"net/url"
"strconv"
"strings"
strux "tea.chunkbyte.com/kato/grabrr/lib/strux"
"github.com/PuerkitoBio/goquery"
)
2025-07-22 15:09:48 +03:00
func GetBunkrAlbum() {
}
2025-07-23 15:08:33 +03:00
func FetchAlbumInfo(rawURL string) (*strux.Album, error) {
resp, err := http.Get(rawURL)
if err != nil {
return nil, fmt.Errorf("failed to fetch page: %w", err)
}
defer resp.Body.Close()
if resp.StatusCode != 200 {
return nil, fmt.Errorf("non-200 response: %d", resp.StatusCode)
}
doc, err := goquery.NewDocumentFromReader(resp.Body)
if err != nil {
return nil, fmt.Errorf("failed to parse HTML: %w", err)
}
var album *strux.Album = &strux.Album{}
fmt.Println(rawURL)
album.URL, err = url.Parse(rawURL)
if err != nil {
return nil, fmt.Errorf("failed to parse URL: %w", err)
}
// Title
album.Title = strings.TrimSpace(doc.Find("h1.truncate").First().Text())
// Files
doc.Find(".grid-images .theItem").Each(func(i int, s *goquery.Selection) {
linkTag := s.Find("a")
href, exists := linkTag.Attr("href")
if !exists {
return
}
fileTitle := "No name"
var fileSize int64 = 0
if theTitleEl := s.Find(".theName"); theTitleEl != nil {
fileTitle = strings.TrimSpace(theTitleEl.Text())
}
if theSizeEl := s.Find(".theSize"); theSizeEl != nil {
fileSize, err = ParseSizeToKB(theSizeEl.Text())
}
if href[0] == '/' {
href = fmt.Sprintf("%s://%s%s", album.URL.Scheme, album.URL.Hostname(), href)
}
fileURL, _ := url.Parse(href)
file := strux.File{
Title: fileTitle,
URL: fileURL,
Filename: fileTitle,
SizeKB: fileSize,
Format: fileURL.Path[strings.LastIndex(fileURL.Path, ".")+1:],
}
album.Files = append(album.Files, file)
})
return album, nil
}
func ParseSizeToKB(sizeStr string) (int64, error) {
s := strings.TrimSpace(strings.ToLower(sizeStr))
var multiplier float64
switch {
case strings.HasSuffix(s, "gb"):
multiplier = 1024 * 1024
s = strings.TrimSuffix(s, "gb")
case strings.HasSuffix(s, "mb"):
multiplier = 1024
s = strings.TrimSuffix(s, "mb")
case strings.HasSuffix(s, "kb"):
multiplier = 1
s = strings.TrimSuffix(s, "kb")
default:
return 0, fmt.Errorf("unrecognized unit in %q", sizeStr)
}
s = strings.TrimSpace(s)
value, err := strconv.ParseFloat(s, 64)
if err != nil {
return 0, fmt.Errorf("invalid number %q: %w", s, err)
}
return int64(value * multiplier), nil
}