mirror of
https://github.com/bestnite/bilinovel-downloader.git
synced 2025-10-26 17:14:24 +00:00
refactor
This commit is contained in:
187
cmd/download.go
187
cmd/download.go
@@ -2,7 +2,14 @@ package cmd
|
||||
|
||||
import (
|
||||
"bilinovel-downloader/downloader/bilinovel"
|
||||
"bilinovel-downloader/epub"
|
||||
"bilinovel-downloader/model"
|
||||
"bilinovel-downloader/text"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"log"
|
||||
"os"
|
||||
"path/filepath"
|
||||
|
||||
"github.com/spf13/cobra"
|
||||
)
|
||||
@@ -11,74 +18,160 @@ var downloadCmd = &cobra.Command{
|
||||
Use: "download",
|
||||
Short: "Download a novel or volume",
|
||||
Long: "Download a novel or volume",
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
err := runDownloadNovel()
|
||||
if err != nil {
|
||||
log.Printf("failed to download novel: %v", err)
|
||||
}
|
||||
},
|
||||
}
|
||||
|
||||
var downloadNovelCmd = &cobra.Command{
|
||||
Use: "novel",
|
||||
Short: "Download a novel, default download all volumes",
|
||||
Long: "Download a novel, default download all volumes",
|
||||
RunE: runDownloadNovel,
|
||||
}
|
||||
|
||||
var downloadVolumeCmd = &cobra.Command{
|
||||
Use: "volume",
|
||||
Short: "Download a volume",
|
||||
Long: "Download a volume",
|
||||
RunE: runDownloadVolume,
|
||||
}
|
||||
|
||||
type downloadNovelArgs struct {
|
||||
NovelId int `validate:"required"`
|
||||
outputPath string
|
||||
}
|
||||
|
||||
type downloadVolumeArgs struct {
|
||||
type downloadCmdArgs struct {
|
||||
NovelId int `validate:"required"`
|
||||
VolumeId int `validate:"required"`
|
||||
outputPath string
|
||||
outputType string
|
||||
}
|
||||
|
||||
var (
|
||||
novelArgs downloadNovelArgs
|
||||
volumeArgs downloadVolumeArgs
|
||||
downloadArgs downloadCmdArgs
|
||||
)
|
||||
|
||||
func init() {
|
||||
downloadNovelCmd.Flags().IntVarP(&novelArgs.NovelId, "novel-id", "n", 0, "novel id")
|
||||
downloadNovelCmd.Flags().StringVarP(&novelArgs.outputPath, "output-path", "o", "./novels", "output path")
|
||||
|
||||
downloadVolumeCmd.Flags().IntVarP(&volumeArgs.NovelId, "novel-id", "n", 0, "novel id")
|
||||
downloadVolumeCmd.Flags().IntVarP(&volumeArgs.VolumeId, "volume-id", "v", 0, "volume id")
|
||||
downloadVolumeCmd.Flags().StringVarP(&volumeArgs.outputPath, "output-path", "o", "./novels", "output path")
|
||||
|
||||
downloadCmd.AddCommand(downloadNovelCmd)
|
||||
downloadCmd.AddCommand(downloadVolumeCmd)
|
||||
downloadCmd.Flags().IntVarP(&downloadArgs.NovelId, "novel-id", "n", 0, "novel id")
|
||||
downloadCmd.Flags().IntVarP(&downloadArgs.VolumeId, "volume-id", "v", 0, "volume id")
|
||||
downloadCmd.Flags().StringVarP(&downloadArgs.outputPath, "output-path", "o", "novels", "output path")
|
||||
downloadCmd.Flags().StringVarP(&downloadArgs.outputType, "output-type", "t", "epub", "output type, epub or text")
|
||||
RootCmd.AddCommand(downloadCmd)
|
||||
}
|
||||
|
||||
func runDownloadNovel(cmd *cobra.Command, args []string) error {
|
||||
if novelArgs.NovelId == 0 {
|
||||
func runDownloadNovel() error {
|
||||
downloader, err := bilinovel.New()
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to create downloader: %v", err)
|
||||
}
|
||||
if downloadArgs.NovelId == 0 {
|
||||
return fmt.Errorf("novel id is required")
|
||||
}
|
||||
err := bilinovel.DownloadNovel(novelArgs.NovelId, novelArgs.outputPath)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to download novel: %v", err)
|
||||
if downloadArgs.VolumeId == 0 {
|
||||
novel, err := downloadNovel(downloader)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to get novel: %v", err)
|
||||
}
|
||||
switch downloadArgs.outputType {
|
||||
case "epub":
|
||||
for _, volume := range novel.Volumes {
|
||||
err = epub.PackVolumeToEpub(volume, downloadArgs.outputPath, downloader.GetStyleCSS(), downloader.GetExtraFiles())
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to pack volume: %v", err)
|
||||
}
|
||||
}
|
||||
case "text":
|
||||
for _, volume := range novel.Volumes {
|
||||
err = text.PackVolumeToText(volume, downloadArgs.outputPath)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to pack volume: %v", err)
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// 下载单卷
|
||||
volume, err := downloadVolume(downloader)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to get volume: %v", err)
|
||||
}
|
||||
switch downloadArgs.outputType {
|
||||
case "epub":
|
||||
err = epub.PackVolumeToEpub(volume, downloadArgs.outputPath, downloader.GetStyleCSS(), downloader.GetExtraFiles())
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to pack volume: %v", err)
|
||||
}
|
||||
case "text":
|
||||
err = text.PackVolumeToText(volume, downloadArgs.outputPath)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to pack volume: %v", err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func runDownloadVolume(cmd *cobra.Command, args []string) error {
|
||||
if volumeArgs.NovelId == 0 {
|
||||
return fmt.Errorf("novel id is required")
|
||||
}
|
||||
if volumeArgs.VolumeId == 0 {
|
||||
return fmt.Errorf("volume id is required")
|
||||
}
|
||||
err := bilinovel.DownloadVolume(volumeArgs.NovelId, volumeArgs.VolumeId, volumeArgs.outputPath)
|
||||
func downloadNovel(downloader model.Downloader) (*model.Novel, error) {
|
||||
jsonPath := filepath.Join(downloadArgs.outputPath, fmt.Sprintf("novel-%d.json", downloadArgs.NovelId))
|
||||
err := os.MkdirAll(filepath.Dir(jsonPath), 0755)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to download volume: %v", err)
|
||||
return nil, fmt.Errorf("failed to create directory: %v", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
_, err = os.Stat(jsonPath)
|
||||
novel := &model.Novel{}
|
||||
if err != nil {
|
||||
if os.IsNotExist(err) {
|
||||
novel, err = downloader.GetNovel(downloadArgs.NovelId)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to get novel: %v", err)
|
||||
}
|
||||
jsonFile, err := os.Create(jsonPath)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to create json file: %v", err)
|
||||
}
|
||||
defer jsonFile.Close()
|
||||
err = json.NewEncoder(jsonFile).Encode(novel)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to encode json file: %v", err)
|
||||
}
|
||||
} else {
|
||||
return nil, fmt.Errorf("failed to get novel: %v", err)
|
||||
}
|
||||
} else {
|
||||
jsonFile, err := os.Open(jsonPath)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to open json file: %v", err)
|
||||
}
|
||||
defer jsonFile.Close()
|
||||
err = json.NewDecoder(jsonFile).Decode(novel)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to decode json file: %v", err)
|
||||
}
|
||||
}
|
||||
return novel, nil
|
||||
}
|
||||
|
||||
func downloadVolume(downloader model.Downloader) (*model.Volume, error) {
|
||||
jsonPath := filepath.Join(downloadArgs.outputPath, fmt.Sprintf("volume-%d-%d.json", downloadArgs.NovelId, downloadArgs.VolumeId))
|
||||
err := os.MkdirAll(filepath.Dir(jsonPath), 0755)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to create directory: %v", err)
|
||||
}
|
||||
_, err = os.Stat(jsonPath)
|
||||
volume := &model.Volume{}
|
||||
if err != nil {
|
||||
if os.IsNotExist(err) {
|
||||
volume, err = downloader.GetVolume(downloadArgs.NovelId, downloadArgs.VolumeId)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to get volume: %v", err)
|
||||
}
|
||||
jsonFile, err := os.Create(jsonPath)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to create json file: %v", err)
|
||||
}
|
||||
err = json.NewEncoder(jsonFile).Encode(volume)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to encode json file: %v", err)
|
||||
}
|
||||
} else {
|
||||
return nil, fmt.Errorf("failed to get volume: %v", err)
|
||||
}
|
||||
} else {
|
||||
jsonFile, err := os.Open(jsonPath)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to open json file: %v", err)
|
||||
}
|
||||
defer jsonFile.Close()
|
||||
err = json.NewDecoder(jsonFile).Decode(volume)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to decode json file: %v", err)
|
||||
}
|
||||
}
|
||||
return volume, nil
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package cmd
|
||||
|
||||
import (
|
||||
"bilinovel-downloader/downloader/bilinovel"
|
||||
"bilinovel-downloader/epub"
|
||||
"fmt"
|
||||
|
||||
"github.com/spf13/cobra"
|
||||
@@ -28,7 +28,7 @@ func init() {
|
||||
}
|
||||
|
||||
func runPackage(cmd *cobra.Command, args []string) error {
|
||||
err := bilinovel.CreateEpub(pArgs.DirPath)
|
||||
err := epub.PackEpub(pArgs.DirPath)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to create epub: %v", err)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user