diff --git a/adept.go b/adept.go index 1e579a1..6a368dd 100644 --- a/adept.go +++ b/adept.go @@ -1,26 +1,10 @@ package main import ( - "github.com/spf13/viper" - - "git.metaunix.net/BitGoblin/adept/config" - "git.metaunix.net/BitGoblin/adept/transcoder" + "git.metaunix.net/BitGoblin/adept/cmd" ) +// start the app - that's where all the good stuff happens func main() { - // load configuration via Viper - config.LoadConfig() - - // configure our app logging - logHandle := config.InitLogging() - if logHandle != nil { - defer logHandle.Close() - } - - // initialize the video repository - r := transcoder.NewRepository(viper.GetString("transcoder.repository")) - - // create transcoder object and start the main loop - t := transcoder.NewTranscoder(*r) - t.Start() + cmd.Execute() } diff --git a/cmd/root.go b/cmd/root.go new file mode 100644 index 0000000..b726364 --- /dev/null +++ b/cmd/root.go @@ -0,0 +1,45 @@ +package cmd + +import ( + "fmt" + "os" + + "github.com/spf13/cobra" + "github.com/spf13/viper" + + "git.metaunix.net/BitGoblin/adept/config" + "git.metaunix.net/BitGoblin/adept/transcoder" +) + +// ./adept - this is the primary command and is how the service is intended to be launched +var rootCmd = &cobra.Command{ + Use: "adept", + Short: "Adept is a video transcoder service", + Long: `An automated video transcoder service that archives ingested footage. + https://git.metaunix.net/BitGoblin/adept`, + Run: func(cmd *cobra.Command, args []string) { + // load configuration via Viper + config.LoadConfig() + + // configure our app logging + logHandle := config.InitLogging() + if logHandle != nil { + defer logHandle.Close() + } + + // initialize the video repository + r := transcoder.NewRepository(viper.GetString("transcoder.repository")) + + // create transcoder object and start the main loop + t := transcoder.NewTranscoder(*r) + t.Start() + }, +} + +// this is the main function to launch Cobra +func Execute() { + if err := rootCmd.Execute(); err != nil { + fmt.Println(err) + os.Exit(1) + } +} diff --git a/cmd/setup.go b/cmd/setup.go new file mode 100644 index 0000000..7404c7d --- /dev/null +++ b/cmd/setup.go @@ -0,0 +1,34 @@ +package cmd + +import ( + "github.com/spf13/cobra" + "github.com/spf13/viper" + + "git.metaunix.net/BitGoblin/adept/config" + "git.metaunix.net/BitGoblin/adept/transcoder" +) + +// initializes the sub-command +func init() { + rootCmd.AddCommand(setupCmd) +} + +var setupCmd = &cobra.Command{ + Use: "setup", + Short: "Initialize the video directories.", + Long: `Adept can't run if it doesn't have a place to ingest/transcode files from.`, + Run: func(cmd *cobra.Command, args []string) { + // load configuration via Viper + config.LoadConfig() + + // configure our app logging + logHandle := config.InitLogging() + if logHandle != nil { + defer logHandle.Close() + } + + // initialize the video repository + r := transcoder.NewRepository(viper.GetString("transcoder.repository")) + r.Setup() + }, +} diff --git a/go.mod b/go.mod index 18afc15..a8b01ec 100644 --- a/go.mod +++ b/go.mod @@ -11,6 +11,7 @@ require ( github.com/pelletier/go-toml/v2 v2.0.1 // indirect github.com/spf13/afero v1.8.2 // indirect github.com/spf13/cast v1.5.0 // indirect + github.com/spf13/cobra v1.5.0 // indirect github.com/spf13/jwalterweatherman v1.1.0 // indirect github.com/spf13/pflag v1.0.5 // indirect github.com/spf13/viper v1.12.0 diff --git a/go.sum b/go.sum index 0d04429..43b387f 100644 --- a/go.sum +++ b/go.sum @@ -93,6 +93,7 @@ github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWH github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= @@ -239,6 +240,8 @@ github.com/hashicorp/serf v0.9.6/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpT github.com/hashicorp/serf v0.9.7/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= @@ -327,6 +330,7 @@ github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1 github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/sagikazarmark/crypt v0.6.0/go.mod h1:U8+INwJo3nBv1m6A/8OBXAq7Jnpspk5AxSgDyEQcea8= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= @@ -338,6 +342,8 @@ github.com/spf13/afero v1.8.2 h1:xehSyVa0YnHWsJ49JFljMpg1HX19V6NDZ1fkm1Xznbo= github.com/spf13/afero v1.8.2/go.mod h1:CtAatgMJh6bJEIs48Ay/FOnkljP3WeGUG0MC1RfAqwo= github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= +github.com/spf13/cobra v1.5.0 h1:X+jTBEBqF0bHN+9cSMgmfuvv2VHJ9ezmFNf9Y/XstYU= +github.com/spf13/cobra v1.5.0/go.mod h1:dWXEIy2H428czQCjInthrTRUg7yKbok+2Qi/yBIJoUM= github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= diff --git a/transcoder/repository.go b/transcoder/repository.go index f59c6e5..1ce004c 100644 --- a/transcoder/repository.go +++ b/transcoder/repository.go @@ -14,6 +14,7 @@ type Repository struct { outputPath string } +// Repository struct constructor func NewRepository(path string) *Repository { r := new(Repository) r.basePath = path @@ -21,13 +22,6 @@ func NewRepository(path string) *Repository { r.archivePath = filepath.Join(path, "archive") r.outputPath = filepath.Join(path, "output") - // make sure repository base directory exists - create_repo_dir(r.basePath) - // make sure the folder structure is setup - create_repo_dir(r.ingestPath) - create_repo_dir(r.archivePath) - create_repo_dir(r.archivePath) - return r } @@ -39,6 +33,16 @@ func (r *Repository) GetOutputPath() string { return r.outputPath } +// Initializes the video repository by ensuring the directories are available +func (r *Repository) Setup() { + // make sure repository base directory exists + create_repo_dir(r.basePath) + // make sure the folder structure is setup + create_repo_dir(r.ingestPath) + create_repo_dir(r.archivePath) + create_repo_dir(r.archivePath) +} + func (r *Repository) SearchIngest() []os.FileInfo { log.Printf("Searching ingest directory for files to transcode...")