完善文件夹创建细节,章节命名

master
fantasticbin 6 months ago
parent 6e8cd8403f
commit 71799a4858

@ -6,16 +6,20 @@ import (
) )
var ( var (
url string url string
max int folderTitleUrl string
output string max int
host = "https://img4.qy0.ru" output string
chapter int
host = "https://img4.qy0.ru"
) )
func init() { func init() {
rootCmd.PersistentFlags().StringVarP(&url, "url", "u", "", "除域名外的链接") rootCmd.PersistentFlags().StringVarP(&url, "url", "u", "", "除域名外的链接")
rootCmd.PersistentFlags().IntVarP(&max, "max", "m", 1, "图片最大值") rootCmd.PersistentFlags().IntVarP(&max, "max", "m", 1, "图片最大值")
rootCmd.PersistentFlags().StringVarP(&output, "output", "o", "anime", "设置漫画抓取结果的保存位置,默认为当前用户的主目录下的 anime 文件夹") rootCmd.PersistentFlags().StringVarP(&output, "output", "o", "anime", "设置漫画抓取结果的保存位置,默认为当前用户的主目录下的 anime 文件夹")
rootCmd.PersistentFlags().StringVarP(&folderTitleUrl, "folderTitleUrl", "t", "", "文件夹标题抓取链接")
rootCmd.PersistentFlags().IntVarP(&chapter, "chapter", "c", 1, "指定章节,用于文件夹标题抓取")
} }
func IfPathNotExistDoMkdir(path string) error { func IfPathNotExistDoMkdir(path string) error {

@ -6,6 +6,8 @@ import (
"io" "io"
"net/http" "net/http"
"os" "os"
"path/filepath"
"regexp"
"strconv" "strconv"
"strings" "strings"
"sync" "sync"
@ -13,22 +15,36 @@ import (
var wg sync.WaitGroup var wg sync.WaitGroup
// start 开始执行
func start() { func start() {
err := IfPathNotExistDoMkdir(output) path := output
if folderTitleUrl != "" {
chapterTitle := findChapterTitle(folderTitleUrl, chapter)
title := strings.Join([]string{
"第",
strconv.Itoa(chapter),
"章-",
chapterTitle,
}, "")
path = filepath.Join(output, title) // 组装章节路径
}
err := IfPathNotExistDoMkdir(path)
if err != nil { if err != nil {
fmt.Println("输出目录创建失败") fmt.Println("输出目录创建失败:", err)
return return
} }
for i := 1; i <= max; i++ { for i := 1; i <= max; i++ {
wg.Add(1) wg.Add(1)
go get(i) go get(i, path)
} }
wg.Wait() wg.Wait()
} }
func get(num int) { // get 获取漫画图片
func get(num int, path string) {
defer wg.Done() defer wg.Done()
// 兼容未携带斜杆的地址 // 兼容未携带斜杆的地址
@ -36,10 +52,27 @@ func get(num int) {
url = "/" + url url = "/" + url
} }
urlSlice := strings.Split(url, "_") // 取URL组装 numString := strconv.Itoa(num)
fileSlice := strings.Split(urlSlice[1], ".") // 取后缀名 urlSlice := strings.Split(url, "_") // 取URL组装
fileName := strconv.Itoa(num) + "." + fileSlice[1] // 组装文件名 fileSlice := strings.Split(urlSlice[1], ".") // 取后缀名
imgUrl := host + urlSlice[0] + "_" + fmt.Sprintf("%02d", num) + "." + fileSlice[1] // 组装图片URL fileName := strings.Join([]string{ // 组装文件名
numString,
fileSlice[1],
}, ".")
urlNum := numString
if fileSlice[0][0] == '0' { // 序号首位为0则链接补0
urlNum = fmt.Sprintf("%02d", num)
}
imgUrl := strings.Join([]string{ // 组装图片URL
host,
urlSlice[0],
"_",
urlNum,
".",
fileSlice[1],
}, "")
fmt.Println("获取图片:" + imgUrl) fmt.Println("获取图片:" + imgUrl)
resp, err := http.Get(imgUrl) resp, err := http.Get(imgUrl)
@ -47,15 +80,27 @@ func get(num int) {
fmt.Println(fileName, "图片获取失败:", err) fmt.Println(fileName, "图片获取失败:", err)
return return
} }
defer resp.Body.Close() defer func(Body io.ReadCloser) {
err := Body.Close()
if err != nil {
fmt.Println(fileName, "http请求关闭失败:", err)
return
}
}(resp.Body)
reader := bufio.NewReaderSize(resp.Body, 32*1024) reader := bufio.NewReaderSize(resp.Body, 32*1024)
file, err := os.Create(output + "/" + fileName) file, err := os.Create(path + "/" + fileName)
if err != nil { if err != nil {
fmt.Println(fileName, "图片创建失败:", err) fmt.Println(fileName, "图片创建失败:", err)
return return
} }
defer file.Close() defer func(file *os.File) {
err := file.Close()
if err != nil {
fmt.Println(fileName, "文件流关闭失败:", err)
return
}
}(file)
_, err = io.Copy(file, reader) _, err = io.Copy(file, reader)
if err != nil { if err != nil {
@ -63,3 +108,51 @@ func get(num int) {
return return
} }
} }
// findChapterTitle 解析文件夹标题
func findChapterTitle(url string, num int) string {
resp, err := http.Get(url)
if err != nil {
fmt.Println("请求文件夹标题失败:", err)
return ""
}
defer func(Body io.ReadCloser) {
err := Body.Close()
if err != nil {
fmt.Println("文件夹标题http请求关闭失败:", err)
return
}
}(resp.Body)
body, err := io.ReadAll(resp.Body)
if err != nil {
fmt.Println("文件夹标题读取失败:", err)
return ""
}
content := string(body)
re := regexp.MustCompile(`\\u7b2c` + strconv.Itoa(num) + `\\u8bdd (.+?)"`)
matches := re.FindAllStringSubmatch(content, -1)
if len(matches) == 0 {
return ""
}
unquoted, err := strconv.Unquote(`"` + matches[0][1] + `"`)
if err != nil {
fmt.Println("文件夹标题转码失败:", err)
return ""
}
replacements := map[string]string{
"?": "",
":": "",
"!": "",
}
unquoted = strings.TrimSpace(unquoted)
for old, re := range replacements {
unquoted = strings.ReplaceAll(unquoted, old, re)
}
return unquoted
}

Loading…
Cancel
Save