mirror of
				https://github.com/bestnite/bilinovel-downloader.git
				synced 2025-10-26 09:11:01 +00:00 
			
		
		
		
	refactor: streamline download process and enhance browser handling in Bilinovel
This commit is contained in:
		
							
								
								
									
										120
									
								
								cmd/download.go
									
									
									
									
									
								
							
							
						
						
									
										120
									
								
								cmd/download.go
									
									
									
									
									
								
							| @@ -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 | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user