diff --git a/cmd/root.go b/cmd/root.go new file mode 100644 index 0000000..56693c9 --- /dev/null +++ b/cmd/root.go @@ -0,0 +1,108 @@ +/* +Copyright © 2021 Vincent Batts + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +*/ +package cmd + +import ( + "fmt" + "os" + + "git.thisco.de/vbatts/book-fetch/pkg/goldenaudiobooks" + homedir "github.com/mitchellh/go-homedir" + log "github.com/sirupsen/logrus" + "github.com/spf13/cobra" + "github.com/spf13/viper" +) + +var cfgFile string + +// rootCmd represents the base command when called without any subcommands +var rootCmd = &cobra.Command{ + Use: "book-fetch", + Short: "A brief description of your application", + Long: `A longer description that spans multiple lines and likely contains +examples and usage of using your application. For example: + +Cobra is a CLI library for Go that empowers applications. +This application is a tool to generate the needed files +to quickly create a Cobra application.`, + // Uncomment the following line if your bare application + // has an action associated with it: + Run: func(cmd *cobra.Command, args []string) { + b, err := goldenaudiobooks.BookScrape("https://goldenaudiobooks.com/the-water-dancer-oprahs-book-club-audiobook/") + if err != nil { + log.Fatal(err) + } + log.Debug(b) + if err = goldenaudiobooks.BookFetccher(b, ".", true); err != nil { + log.Fatal(err) + } + }, +} + +// Execute adds all child commands to the root command and sets flags appropriately. +// This is called by main.main(). It only needs to happen once to the rootCmd. +func Execute() { + if err := rootCmd.Execute(); err != nil { + fmt.Println(err) + os.Exit(1) + } +} + +func init() { + cobra.OnInitialize(initConfig) + + // Here you will define your flags and configuration settings. + // Cobra supports persistent flags, which, if defined here, + // will be global for your application. + + rootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", "config file (default is $HOME/.book-fetch.yaml)") + + // Cobra also supports local flags, which will only run + // when this action is called directly. + rootCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle") +} + +// initConfig reads in config file and ENV variables if set. +func initConfig() { + if cfgFile != "" { + // Use config file from the flag. + viper.SetConfigFile(cfgFile) + } else { + // Find home directory. + home, err := homedir.Dir() + if err != nil { + fmt.Println(err) + os.Exit(1) + } + + // Search config in home directory with name ".book-fetch" (without extension). + viper.AddConfigPath(home) + viper.SetConfigName(".book-fetch") + } + + viper.AutomaticEnv() // read in environment variables that match + + // If a config file is found, read it in. + if err := viper.ReadInConfig(); err == nil { + fmt.Println("Using config file:", viper.ConfigFileUsed()) + } +} diff --git a/main.go b/main.go index 0dbc43e..bcb8942 100644 --- a/main.go +++ b/main.go @@ -1,61 +1,28 @@ +/* +Copyright © 2021 Vincent Batts + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +*/ package main -import ( - "fmt" - "log" - "net/http" - "strings" - - "github.com/PuerkitoBio/goquery" -) - -type Book struct { - URL string - Title string - Files []string -} - -func BookScrape(bookURL string) (*Book, error) { - // Request the HTML page. - res, err := http.Get(bookURL) - if err != nil { - return nil, err - } - defer res.Body.Close() - if res.StatusCode != 200 { - return nil, fmt.Errorf("status code error: %d %s", res.StatusCode, res.Status) - } - - // Load the HTML document - doc, err := goquery.NewDocumentFromReader(res.Body) - if err != nil { - return nil, err - } - /* - - */ - - b := Book{} - b.URL = bookURL - - // Find the review items - doc.Find(".lazy-hidden").Each(func(i int, s *goquery.Selection) { - //title := s.Find("source").Text() - if src, exists := s.Attr("src"); exists && strings.Contains(src, ".mp3") { - fmt.Println(i, src) - b.Files = append(b.Files, src) - } - }) - doc.Find("title").Each(func(i int, s *goquery.Selection) { - b.Title = s.Text() - }) - return &b, nil -} +import "git.thisco.de/vbatts/book-fetch/cmd" func main() { - b, err := BookScrape("https://goldenaudiobooks.com/the-water-dancer-oprahs-book-club-audiobook/") - if err != nil { - log.Fatal(err) - } - fmt.Println(b) + cmd.Execute() } diff --git a/pkg/goldenaudiobooks/golden.go b/pkg/goldenaudiobooks/golden.go new file mode 100644 index 0000000..fa717b6 --- /dev/null +++ b/pkg/goldenaudiobooks/golden.go @@ -0,0 +1,77 @@ +/* +Copyright © 2021 Vincent Batts + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +*/ +package goldenaudiobooks + +import ( + "fmt" + "net/http" + "strings" + + "github.com/PuerkitoBio/goquery" +) + +type Book struct { + URL string + Title string + Files []string +} + +func BookScrape(bookURL string) (*Book, error) { + // Request the HTML page. + res, err := http.Get(bookURL) + if err != nil { + return nil, err + } + defer res.Body.Close() + if res.StatusCode != 200 { + return nil, fmt.Errorf("status code error: %d %s", res.StatusCode, res.Status) + } + + // Load the HTML document + doc, err := goquery.NewDocumentFromReader(res.Body) + if err != nil { + return nil, err + } + /* + + */ + + b := Book{} + b.URL = bookURL + + // Find the review items + doc.Find(".lazy-hidden").Each(func(i int, s *goquery.Selection) { + //title := s.Find("source").Text() + if src, exists := s.Attr("src"); exists && strings.Contains(src, ".mp3") { + fmt.Println(i, src) + b.Files = append(b.Files, src) + } + }) + doc.Find("title").Each(func(i int, s *goquery.Selection) { + b.Title = s.Text() + }) + return &b, nil +} + +func BookFetccher(b *Book, dest string, mkdir bool) error { + return nil +}