2021-02-20 20:40:56 +03:00
package main
import (
"flag"
"fmt"
"log"
2021-02-26 12:04:44 +03:00
"path"
"syscall"
2021-02-20 20:40:56 +03:00
2021-03-02 23:50:56 +03:00
"git.magicalmirro.red/voice/pixiv-scrapper/pixiv"
2021-02-20 20:40:56 +03:00
)
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
2021-02-22 21:57:19 +03:00
setXAttrTags bool
setTagsFile string
2021-02-26 01:05:07 +03:00
testString string
2021-02-20 20:40:56 +03:00
}
var (
cmdline cmdlineT
cookies string
pix pixiv . Pixiv
)
func main ( ) {
flags ( )
2021-02-22 21:57:19 +03:00
pix = pixiv . New ( cmdline . setCookies , cmdline . logErrorsFile , cmdline . threads , cmdline . setXAttrTags )
2021-02-20 20:40:56 +03:00
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 ( ) )
}
}
2021-02-26 12:04:44 +03:00
if len ( cmdline . setTagsFile ) > 0 {
err := setTagsFile ( cmdline . setTagsFile )
if err != nil {
fmt . Printf ( "%s\n" , err . Error ( ) )
}
}
2021-02-20 20:40:56 +03:00
}
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
}
2021-02-26 12:04:44 +03:00
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
}
2021-02-20 20:40:56 +03:00
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
}
}
2021-02-26 12:04:44 +03:00
if len ( cmdline . setTagsFile ) > 0 {
err = setTagsFile ( cmdline . setTagsFile )
if err != nil {
fmt . Printf ( "Request error or ID not recognized: %s\n" , err . Error ( ) )
}
}
2021-02-20 20:40:56 +03:00
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" )
2021-02-26 12:04:44 +03:00
flag . StringVar ( & cmdline . setTagsFile , "set-xattr-file" , "" , "fetch illustration's tags and write them to xattrs of the specified file." )
2021-02-22 21:57:19 +03:00
flag . BoolVar ( & cmdline . setXAttrTags , "set-xattr" , false , "also write tags to xattrs" )
2021-02-26 01:05:07 +03:00
flag . StringVar ( & cmdline . testString , "test-string" , "" , "used for testing purposes" )
2021-02-20 20:40:56 +03:00
flag . Parse ( )
}