mu-go/cmd/cli/main.go
2025-09-12 21:32:58 +02:00

171 lines
3.7 KiB
Go

package main
import (
"fmt"
"log"
"os"
"strings"
"github.com/labstack/echo/v4"
"github.com/labstack/echo/v4/middleware"
"github.com/urfave/cli/v2"
"gitnet.fr/deblan/mu-go/internal/shell"
"gitnet.fr/deblan/mu-go/internal/web"
)
var (
Commands = []*cli.Command{}
version = "dev"
defaultListen = "127.0.0.1"
defaultPort = "4000"
defaultApiUrl = "http://127.0.0.1:4000"
defaultServerDirectory = "."
defaultDownloadDirectory = "."
defaultName = ""
defaultOrder = "date"
)
var (
flagListen = "listen"
flagPort = "port"
flagApiUrl = "api-url"
flagDirectory = "directory"
flagDebug = "debug"
flagName = "name"
flagOrder = "order"
)
func main() {
app := &cli.App{
Commands: []*cli.Command{
{
Name: "serve",
Aliases: []string{"s"},
Flags: []cli.Flag{
&cli.StringFlag{
Name: flagListen,
Aliases: []string{"l"},
Value: defaultListen,
},
&cli.StringFlag{
Name: flagPort,
Aliases: []string{"p"},
Value: defaultPort,
},
&cli.StringFlag{
Name: flagApiUrl,
Aliases: []string{"u"},
Value: defaultApiUrl,
},
&cli.StringFlag{
Name: flagDirectory,
Aliases: []string{"d"},
Value: defaultServerDirectory,
},
&cli.StringFlag{
Name: flagDebug,
},
},
Usage: "run http server to serve api and files",
Action: func(ctx *cli.Context) error {
listen := ctx.String("listen")
port := ctx.Int64("port")
directory := strings.TrimSuffix(ctx.String(flagDirectory), "/")
url := strings.TrimSuffix(ctx.String(flagApiUrl), "/")
e := echo.New()
if ctx.Bool(flagDebug) {
e.Use(middleware.Logger())
e.Use(middleware.Recover())
}
e.GET("/api/list", func(ctx echo.Context) error {
return web.List(ctx, directory, url)
})
e.GET("/api/stream", func(ctx echo.Context) error {
return web.Stream(ctx, directory, url)
})
e.Logger.Fatal(e.Start(fmt.Sprintf("%s:%d", listen, port)))
return nil
},
},
{
Name: "play",
Usage: "run player",
Aliases: []string{"p"},
Flags: []cli.Flag{
&cli.StringFlag{
Name: flagApiUrl,
Aliases: []string{"u"},
Value: defaultApiUrl,
},
&cli.StringFlag{
Name: flagName,
Aliases: []string{"n"},
Value: defaultName,
},
&cli.StringFlag{
Name: flagOrder,
Aliases: []string{"o"},
Value: defaultOrder,
},
},
Action: func(ctx *cli.Context) error {
s := shell.NewShell(
ctx.String(flagName),
ctx.String(flagOrder),
ctx.String(flagDirectory),
ctx.String(flagApiUrl),
)
return s.Run("play", ctx.Args())
},
},
{
Name: "download",
Usage: "run downloder",
Aliases: []string{"d"},
Flags: []cli.Flag{
&cli.StringFlag{
Name: flagApiUrl,
Aliases: []string{"u"},
Value: defaultApiUrl,
},
&cli.StringFlag{
Name: flagDirectory,
Aliases: []string{"d"},
Value: defaultDownloadDirectory,
},
&cli.StringFlag{
Name: flagName,
Aliases: []string{"n"},
Value: defaultName,
},
&cli.StringFlag{
Name: flagOrder,
Aliases: []string{"o"},
Value: defaultOrder,
},
},
Action: func(ctx *cli.Context) error {
s := shell.NewShell(
ctx.String(flagName),
ctx.String(flagOrder),
ctx.String(flagDirectory),
ctx.String(flagApiUrl),
)
return s.Run("download", ctx.Args())
},
},
},
}
if err := app.Run(os.Args); err != nil {
log.Fatal(err)
}
}