pixiv-scrapper/main.go

195 lines
4.8 KiB
Go

package main
import (
"flag"
"fmt"
"log"
"path"
"syscall"
"git.magicalmirro.red/voice/pixiv-scrapper/pixiv"
)
type cmdlineT struct {
followings bool
favs bool
illusts bool
userID string
setCookies string
setProxy string
workDirectory string
userAgent string
printID bool
printURL bool
test bool
logErrorsFile string
threads int
setXAttrTags bool
setTagsFile string
testString string
}
var (
cmdline cmdlineT
cookies string
pix pixiv.Pixiv
)
func main() {
flags()
pix = pixiv.New(cmdline.setCookies, cmdline.logErrorsFile, cmdline.threads, cmdline.setXAttrTags)
defer pix.Close()
if len(cmdline.setProxy) > 0 {
pix.SetProxy(cmdline.setProxy)
}
if len(cmdline.workDirectory) > 0 {
pix.WorkDirectory = cmdline.workDirectory
}
if cmdline.illusts {
err := fetchIllusts(cmdline.userID)
if err != nil {
log.Fatal(err.Error())
}
}
if cmdline.favs {
err := fetchBookmarks(cmdline.userID)
if err != nil {
log.Fatal(err.Error())
}
}
if cmdline.followings {
err := fetchFollows(cmdline.userID)
if err != nil {
log.Fatal(err.Error())
}
}
if len(cmdline.setTagsFile) > 0 {
err := setTagsFile(cmdline.setTagsFile)
if err != nil {
fmt.Printf("%s\n", err.Error())
}
}
}
func fetchFollows(userID string) (err error) {
users, err := pix.GetFollows(userID)
if err != nil {
return
}
for _, user := range users {
fmt.Printf("%s %s %s %s\n", user.UserID, "followed_user", "defered", user.UserName)
}
return
}
func fetchBookmarks(userID string) (err error) {
illusts, err := pix.GetBookmarks(userID)
if err != nil {
return
}
for _, illust := range illusts {
if cmdline.printID {
fmt.Printf("%s %s %s %s %s\n", illust.ID, "illust", "defered", illust.Title, illust.Alt)
continue
}
if !illust.Complited() {
err := pix.ComplateIllust(&illust)
if err != nil {
return err
}
}
if cmdline.printURL {
for _, page := range illust.Pages {
fmt.Println(page.URLs.Original)
}
continue
}
if !(cmdline.printURL && cmdline.printID) {
if !(cmdline.printURL && cmdline.printID) {
for _, illust := range illusts {
pix.DownloadChannel <- illust
}
}
}
}
return
}
func setTagsFile(filename string) (err error) {
if ok, id := pix.TypicalFilenamesMatcher(path.Base(filename)); ok {
illust, err := pix.GetIllust(id)
if err != nil {
return err
}
err = syscall.Setxattr(filename, "user.xdg.tags", []byte(illust.TagsString()), 0)
if err != nil {
return err
}
}
return
}
func fetchIllusts(userID string) (err error) {
illusts, err := pix.GetUserIllustsID(userID)
if err != nil {
return
}
if cmdline.printID {
for _, illust := range illusts {
fmt.Println(illust.ID)
}
return
}
if cmdline.printURL {
for _, illust := range illusts {
id := illust.ID
illust, err := pix.GetIllust(id)
if err != nil {
return err
}
for _, page := range illust.Pages {
fmt.Println(page.URLs.Original)
}
}
return
}
if !(cmdline.printURL && cmdline.printID) {
for _, illust := range illusts {
pix.DownloadChannel <- illust
}
}
if len(cmdline.setTagsFile) > 0 {
err = setTagsFile(cmdline.setTagsFile)
if err != nil {
fmt.Printf("Request error or ID not recognized: %s\n", err.Error())
}
}
return
}
func flags() {
flag.BoolVar(&cmdline.illusts, "illusts", false, "download illusts")
flag.BoolVar(&cmdline.followings, "followings", false, "fetch user followings")
flag.BoolVar(&cmdline.favs, "favs", false, "fetch user favorites")
flag.StringVar(&cmdline.userID, "user-id", "", "set userID to extract followings, favs or illustrations from")
flag.StringVar(&cmdline.setCookies, "set-cookies", "", "set cookies for request. PHPSESSID is REQUIRED if you want to see R-18 works. SHOULD be something like PHPSESSID=12345678_MEPujYEEwOfXKYdB9TXeMIxaq7pQPYXA")
flag.StringVar(&cmdline.setProxy, "set-proxy", "", "set proxy for request")
flag.StringVar(&cmdline.workDirectory, "workdir", "", "set directory to save images in")
flag.StringVar(&cmdline.userAgent, "user-agent", "Mozilla/5.0 (Windows NT 10.0; rv:78.0) Gecko/20100101 Firefox/78.0", "set user agent")
flag.BoolVar(&cmdline.printID, "print-id", false, "only print IDs, not download")
flag.BoolVar(&cmdline.printURL, "print-url", false, "only print URLs, not download")
flag.BoolVar(&cmdline.test, "test", false, "test")
flag.StringVar(&cmdline.logErrorsFile, "log-errors", "", "file to strore failed items")
flag.IntVar(&cmdline.threads, "threads", 1, "threads number")
flag.StringVar(&cmdline.setTagsFile, "set-xattr-file", "", "fetch illustration's tags and write them to xattrs of the specified file.")
flag.BoolVar(&cmdline.setXAttrTags, "set-xattr", false, "also write tags to xattrs")
flag.StringVar(&cmdline.testString, "test-string", "", "used for testing purposes")
flag.Parse()
}