More stufferino
This commit is contained in:
parent
0777c108ee
commit
b5f8fb0118
|
@ -22,14 +22,14 @@ to quickly create a Cobra application.`,
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
url string
|
albumURLLink string
|
||||||
downloadLocation string
|
downloadLocation string
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
rootCmd.AddCommand(getCmd)
|
rootCmd.AddCommand(getCmd)
|
||||||
|
|
||||||
getCmd.Flags().StringVarP(&url, "url", "u", "", "Bunkrr album url (required)")
|
getCmd.Flags().StringVarP(&albumURLLink, "url", "u", "", "Bunkrr album url (required)")
|
||||||
getCmd.Flags().StringVarP(&downloadLocation, "location", "l", "./", "Download destination, it will create a folder inside of it with the album id")
|
getCmd.Flags().StringVarP(&downloadLocation, "location", "l", "./", "Download destination, it will create a folder inside of it with the album id")
|
||||||
getCmd.MarkFlagRequired("url")
|
getCmd.MarkFlagRequired("url")
|
||||||
|
|
||||||
|
|
22
cmd/info.go
22
cmd/info.go
|
@ -2,6 +2,9 @@ package cmd
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"log"
|
||||||
|
|
||||||
|
bunkr "tea.chunkbyte.com/kato/grabrr/lib/bunkr"
|
||||||
|
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
)
|
)
|
||||||
|
@ -12,7 +15,9 @@ var infoCmd = &cobra.Command{
|
||||||
Short: "A simple info fetch of a bunkr album",
|
Short: "A simple info fetch of a bunkr album",
|
||||||
Long: `The command is used to fetch information about a specific bunkrr album, it will reply with all the information it has about it.`,
|
Long: `The command is used to fetch information about a specific bunkrr album, it will reply with all the information it has about it.`,
|
||||||
Run: func(cmd *cobra.Command, args []string) {
|
Run: func(cmd *cobra.Command, args []string) {
|
||||||
fmt.Println("info called")
|
if err := runInfoCommand(); err != nil {
|
||||||
|
log.Fatalf("error: %v", err)
|
||||||
|
}
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -25,5 +30,18 @@ func init() {
|
||||||
|
|
||||||
infoCmd.Flags().StringVarP(&albumURL, "url", "u", "", "Bunkrr album url (required)")
|
infoCmd.Flags().StringVarP(&albumURL, "url", "u", "", "Bunkrr album url (required)")
|
||||||
infoCmd.MarkFlagRequired("url")
|
infoCmd.MarkFlagRequired("url")
|
||||||
|
}
|
||||||
|
|
||||||
|
func runInfoCommand() error {
|
||||||
|
album, err := bunkr.FetchAlbumInfo(albumURL)
|
||||||
|
|
||||||
|
// Print
|
||||||
|
fmt.Printf("Album Title: %s\n", album.Title)
|
||||||
|
fmt.Printf("Album URL: %s\n", album.URL.String())
|
||||||
|
fmt.Printf("Files (%d):\n", len(album.Files))
|
||||||
|
for _, f := range album.Files {
|
||||||
|
fmt.Printf(" - %s (%s)\n", f.Filename, f.URL.String())
|
||||||
|
}
|
||||||
|
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,109 @@
|
||||||
package lib
|
package lib
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"net/http"
|
||||||
|
"net/url"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
strux "tea.chunkbyte.com/kato/grabrr/lib/strux"
|
||||||
|
|
||||||
|
"github.com/PuerkitoBio/goquery"
|
||||||
|
)
|
||||||
|
|
||||||
func GetBunkrAlbum() {
|
func GetBunkrAlbum() {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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
|
||||||
|
}
|
||||||
|
|
|
@ -8,9 +8,9 @@ import (
|
||||||
// File represents a single file within a Bunkkr album.
|
// File represents a single file within a Bunkkr album.
|
||||||
type File struct {
|
type File struct {
|
||||||
Title string `json:"title"`
|
Title string `json:"title"`
|
||||||
SizeKB float64 `json:"size_kb"`
|
SizeKB int64 `json:"size_kb"`
|
||||||
DateUploaded time.Time `json:"date_uploaded"`
|
DateUploaded time.Time `json:"date_uploaded"`
|
||||||
URL url.URL `json:"url"`
|
URL *url.URL `json:"url"`
|
||||||
Filename string `json:"filename"`
|
Filename string `json:"filename"`
|
||||||
Format string `json:"format"`
|
Format string `json:"format"`
|
||||||
}
|
}
|
||||||
|
@ -21,6 +21,6 @@ type Album struct {
|
||||||
Views int `json:"views"`
|
Views int `json:"views"`
|
||||||
Files []File `json:"files"`
|
Files []File `json:"files"`
|
||||||
ID string `json:"id"`
|
ID string `json:"id"`
|
||||||
URL url.URL `json:"url"`
|
URL *url.URL `json:"url"`
|
||||||
SizeKB float64 `json:"size_kb"`
|
SizeKB int64 `json:"size_kb"`
|
||||||
}
|
}
|
Loading…
Reference in New Issue