refactor: streamline download process and enhance browser handling in Bilinovel

This commit is contained in:
2025-08-24 19:04:00 +10:00
parent ed5440f5fb
commit 560cdfdec9
5 changed files with 137 additions and 163 deletions

View File

@@ -50,128 +50,88 @@ func runDownloadNovel() error {
if err != nil {
return fmt.Errorf("failed to create downloader: %v", err)
}
// 确保在函数结束时关闭资源
defer func() {
if closeErr := downloader.Close(); closeErr != nil {
log.Printf("Failed to close downloader: %v", closeErr)
}
}()
if downloadArgs.NovelId == 0 {
return fmt.Errorf("novel id is required")
}
if downloadArgs.VolumeId == 0 {
novel, err := downloadNovel(downloader)
// 下载整本小说
novel, err := downloader.GetNovel(downloadArgs.NovelId, true)
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)
}
for _, volume := range novel.Volumes {
err = downloadVolume(downloader, volume.Id)
if err != nil {
return fmt.Errorf("failed to download volume: %v", err)
}
}
} else {
// 下载单卷
volume, err := downloadVolume(downloader)
err = downloadVolume(downloader, downloadArgs.VolumeId)
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 fmt.Errorf("failed to download volume: %v", err)
}
}
return nil
}
func downloadNovel(downloader model.Downloader) (*model.Novel, error) {
jsonPath := filepath.Join(downloadArgs.outputPath, fmt.Sprintf("novel-%d.json", downloadArgs.NovelId))
func downloadVolume(downloader model.Downloader, volumeId int) error {
jsonPath := filepath.Join(downloadArgs.outputPath, fmt.Sprintf("volume-%d-%d.json", downloadArgs.NovelId, 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)
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)
return 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)
volume, err = downloader.GetVolume(downloadArgs.NovelId, volumeId, false)
if err != nil {
return nil, fmt.Errorf("failed to get volume: %v", err)
return 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)
return 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)
return fmt.Errorf("failed to encode json file: %v", err)
}
} else {
return nil, fmt.Errorf("failed to get volume: %v", err)
return 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)
return 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 fmt.Errorf("failed to decode json file: %v", err)
}
}
return volume, nil
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
}