package main import ( "flag" "fmt" "log" "os" "sort" "strings" "mangacrawler/createepub" "mangacrawler/mangacrawler" "gopkg.in/yaml.v2" ) func main() { // get infos for the manga we want to download var path string var file string var forceDl bool var forceEpub bool var mangas []mangacrawler.MangaYaml var skipDl bool var completedMangas []string homepath, err := os.UserHomeDir() if err != nil { log.Fatal(err) } flag.StringVar(&path, "path", homepath+"/mangas", "Path where to download mangas and create EPUBs in. (Default is ~/mangas)") flag.BoolVar(&forceEpub, "force-epub", false, "Flag for creating an EPUB from the manga") flag.BoolVar(&skipDl, "skip-download", false, "Flag for not downloading the manga") flag.BoolVar(&forceDl, "force-download", false, "Download already downloaded chapters") flag.StringVar(&file, "file", "", "File with manga IDs. If not provided you need to add manga IDs as arguments") flag.Parse() if len(flag.Args()) == 0 && file == "" { fmt.Printf("Usage: %s [options] [--file /path/to/yaml] or [id1 id2 ...]\n\nParameters:\n", os.Args[0]) flag.PrintDefaults() os.Exit(0) } if file != "" { mangas = parseFile(file) } else { for _, id := range flag.Args() { var manga mangacrawler.MangaYaml manga.ID = id manga.Chapter = -1 manga.Completed = false mangas = append(mangas, manga) } } sort.Sort(mangacrawler.ByName(mangas)) for i, manga := range mangas { if manga.Completed { completedMangas = append(completedMangas, manga.Name) continue } var newChapter bool if manga.Name == "" { manga.Name, manga.Completed = mangacrawler.GetMangaInfo(manga) } mangaPath := strings.Join([]string{path, "MangaDex", manga.Name}, "/") if _, err := os.Stat(strings.Join([]string{homepath, "mangas/MangaDex", manga.Name}, "/")); err == nil { fmt.Printf("%s found on system!\n", manga.Name) } else { os.MkdirAll(mangaPath, 0755) } if !skipDl || forceDl { manga, newChapter = mangacrawler.GetManga(manga, mangaPath, forceDl) } if forceEpub || newChapter { os.MkdirAll("/tmp/epub", 0755) fmt.Println("Generating EPUB") createepub.CreateEpub(mangaPath, manga.Name, manga.ID) fmt.Printf("EPUB created and saved under: %s\n\n", "/tmp/epub") } else { fmt.Printf("%s has no updates!\n\n", manga.Name) } mangas[i] = manga } if file != "" { writeFile(file, mangas) } if file == "" { yamlPrint, _ := yaml.Marshal(&mangas) fmt.Println(string(yamlPrint)) } fmt.Println("Finished mangas on system:") sort.Strings(completedMangas) for _, manga := range completedMangas { fmt.Printf(" %s\n", manga) } } func parseFile(file string) []mangacrawler.MangaYaml { var fBytes []byte var yamlData []mangacrawler.MangaYaml if !strings.HasPrefix(file, "/") { cwd, _ := os.Getwd() if _, err := os.Stat(strings.Join([]string{cwd, file}, "/")); err != nil { log.Fatal("File not found: ", file) } fBytes, _ = os.ReadFile(strings.Join([]string{cwd, file}, "/")) } else { if _, err := os.Stat(file); err != nil { log.Fatal("File not found: ", file) } fBytes, _ = os.ReadFile(file) } err := yaml.Unmarshal(fBytes, &yamlData) if err != nil { panic(err) } mangas := yamlData return mangas } func writeFile(file string, mangas []mangacrawler.MangaYaml) { var filePath string if !strings.HasPrefix(file, "/") { cwd, _ := os.Getwd() if _, err := os.Stat(strings.Join([]string{cwd, file}, "/")); err != nil { log.Fatal("File not found: ", file) } filePath = strings.Join([]string{cwd, file}, "/") } else { if _, err := os.Stat(file); err != nil { log.Fatal("File not found: ", file) } filePath = file } data, err := yaml.Marshal(&mangas) if err != nil { panic(err) } _ = os.WriteFile(filePath, data, 0644) }