accorder/cmd/build.go

71 lines
3.1 KiB
Go

package cmd
import (
"fmt"
"os"
"accorder/pkg/calibre"
"github.com/satori/go.uuid"
"github.com/spf13/cobra"
"github.com/spf13/viper"
)
var buildCmd = &cobra.Command{
Use: "build",
Short: "Build standalone, portable webapp from Calibre library.",
Long: `Build searchable, standalone, portable webapp against the local Calibre
library including all the metadata needed. It creates BROWSE_LIBRARY.html in
root directory of the local Calibre library. For search (authors, titles,
tags...) it uses rendered metadata from static/data{1-8}.js files.
Every time the directory path and/or librarian is provided it is saved in
the configuration file for the future use (therefore: 'accorder build SESSION'
should be enough for the next successful build).`,
Args: cobra.ExactArgs(1),
Run: func(cmd *cobra.Command, args []string) {
session := args[0]
libraryUUID := viper.GetString(fmt.Sprintf("%s.library_uuid", session))
librarySecret := viper.GetString(fmt.Sprintf("%s.library_secret", session))
calibrePathFromCli, _ := cmd.PersistentFlags().GetString("directory")
librarianNameFromCli, _ := cmd.PersistentFlags().GetString("librarian")
// didn't exist before
if libraryUUID == "" {
// new session provided path + librarian name
if calibrePathFromCli != "" && librarianNameFromCli != "" {
libraryUUID = uuid.NewV4().String()
viper.Set(fmt.Sprintf("%s.library_uuid", args[0]), libraryUUID)
librarySecret = uuid.NewV4().String()
viper.Set(fmt.Sprintf("%s.library_secret", args[0]), librarySecret)
viper.WriteConfig()
fmt.Printf("Added new session `%s` to the config file.\nNext time it is enough to run:\naccorder build %s\nand it will be run with the same settings.", session, session)
} else {
fmt.Printf("Adding new SESSION via `upload` command should have both: \n librarian name and Calibre path \nto be run and automatically added to the config file. For example:\naccorder build -d \"/users/jessica/Calibre library/\" -l \"Aaron Elbakyan\" %s", session)
os.Exit(1)
}
} else if calibrePathFromCli != "" || librarianNameFromCli != "" {
viper.WriteConfig()
}
calibrePath := viper.GetString(fmt.Sprintf("%s.local_upload", args[0]))
librarianName := viper.GetString(fmt.Sprintf("%s.librarian_name", args[0]))
jsonPath, _ := cmd.PersistentFlags().GetString("jsonpath")
calibre.RenderStandaloneApp(calibrePath, librarianName, libraryUUID, librarySecret, jsonPath)
},
}
func init() {
buildCmd.PersistentFlags().StringP("directory", "d", "", "A local Calibre directory path.")
buildCmd.PersistentFlags().StringP("librarian", "l", "", "Librarian's name.")
buildCmd.PersistentFlags().StringP("jsonpath", "j", "", "Path where to render all metadata into JSON.")
buildCmd.PersistentFlags().StringP("bibtex", "b", "", "Import books from BibTex file into Calibre.")
CustomHelpOutput(buildCmd)
session := os.Args[len(os.Args)-1]
viper.BindPFlag(fmt.Sprintf("%s.local_upload", session), buildCmd.PersistentFlags().Lookup("directory"))
viper.BindPFlag(fmt.Sprintf("%s.librarian_name", session), buildCmd.PersistentFlags().Lookup("librarian"))
rootCmd.AddCommand(buildCmd)
}