Files

179 lines
5.0 KiB
Go

// Copyright 2026 eat-pray-ai & OpenWaygate
// SPDX-License-Identifier: Apache-2.0
package main
import (
"cmp"
"flag"
"fmt"
"log"
"os"
"slices"
"strings"
"github.com/eat-pray-ai/yutu/cmd"
"github.com/spf13/cobra"
_ "github.com/eat-pray-ai/yutu/cmd/abuseReport"
_ "github.com/eat-pray-ai/yutu/cmd/activity"
_ "github.com/eat-pray-ai/yutu/cmd/agent"
_ "github.com/eat-pray-ai/yutu/cmd/caption"
_ "github.com/eat-pray-ai/yutu/cmd/channel"
_ "github.com/eat-pray-ai/yutu/cmd/channelBanner"
_ "github.com/eat-pray-ai/yutu/cmd/channelSection"
_ "github.com/eat-pray-ai/yutu/cmd/comment"
_ "github.com/eat-pray-ai/yutu/cmd/commentThread"
_ "github.com/eat-pray-ai/yutu/cmd/i18nLanguage"
_ "github.com/eat-pray-ai/yutu/cmd/i18nRegion"
_ "github.com/eat-pray-ai/yutu/cmd/liveBroadcast"
_ "github.com/eat-pray-ai/yutu/cmd/liveChatBan"
_ "github.com/eat-pray-ai/yutu/cmd/liveChatMessage"
_ "github.com/eat-pray-ai/yutu/cmd/liveChatModerator"
_ "github.com/eat-pray-ai/yutu/cmd/liveStream"
_ "github.com/eat-pray-ai/yutu/cmd/member"
_ "github.com/eat-pray-ai/yutu/cmd/membershipsLevel"
_ "github.com/eat-pray-ai/yutu/cmd/playlist"
_ "github.com/eat-pray-ai/yutu/cmd/playlistImage"
_ "github.com/eat-pray-ai/yutu/cmd/playlistItem"
_ "github.com/eat-pray-ai/yutu/cmd/search"
_ "github.com/eat-pray-ai/yutu/cmd/subscription"
_ "github.com/eat-pray-ai/yutu/cmd/superChatEvent"
_ "github.com/eat-pray-ai/yutu/cmd/thirdPartyLink"
_ "github.com/eat-pray-ai/yutu/cmd/thumbnail"
_ "github.com/eat-pray-ai/yutu/cmd/video"
_ "github.com/eat-pray-ai/yutu/cmd/videoAbuseReportReason"
_ "github.com/eat-pray-ai/yutu/cmd/videoCategory"
_ "github.com/eat-pray-ai/yutu/cmd/watermark"
)
const header = `#!/usr/bin/env bash
# Copyright 2025 eat-pray-ai & OpenWaygate
# SPDX-License-Identifier: Apache-2.0
set -euo pipefail
# Accept yutu executable path as first parameter
YUTU_PATH="${1:-}"
# If no path provided, build yutu
if [[ -z "$YUTU_PATH" ]]; then
echo "No yutu path provided, building yutu..."
MOD="github.com/eat-pray-ai/yutu/cmd"
Version="${MOD}.Version=$(git describe --tags --always --dirty)"
Commit="${MOD}.Commit=$(git rev-parse --short HEAD)"
CommitDate="${MOD}.CommitDate=$(git log -1 --date='format:%Y-%m-%dT%H:%M:%SZ' --pretty=%cd)"
Os="${MOD}.Os=$(go env GOOS)"
Arch="${MOD}.Arch=$(go env GOARCH)"
Builder="${MOD}.Builder=${GITHUB_ACTOR:-$USER}"
ldflags="-s -X ${Version} -X ${Commit} -X ${CommitDate} -X ${Os} -X ${Arch} -X ${Builder}"
go mod download
go build -ldflags "${ldflags}" -o yutu .
trap 'rm yutu' EXIT
chmod +x yutu
YUTU_PATH="./yutu"
else
# Verify the provided path exists and is executable
if [[ ! -f "$YUTU_PATH" ]]; then
echo "Error: yutu executable not found at: $YUTU_PATH"
exit 1
fi
if [[ ! -x "$YUTU_PATH" ]]; then
echo "Error: $YUTU_PATH is not executable"
exit 1
fi
echo "Using yutu at: $YUTU_PATH"
fi
# Run tests with the yutu executable
"$YUTU_PATH" help
"$YUTU_PATH" completion
"$YUTU_PATH" version
`
func isResource(c *cobra.Command) bool {
return strings.HasPrefix(c.Short, "Manage")
}
func generate() string {
root := cmd.RootCmd
root.InitDefaultHelpCmd()
var b strings.Builder
b.WriteString(header)
var coreCommands, resourceCommands []*cobra.Command
for _, c := range root.Commands() {
name := c.Name()
if name == "help" || name == "completion" || name == "version" {
continue
}
if isResource(c) {
resourceCommands = append(resourceCommands, c)
} else {
coreCommands = append(coreCommands, c)
}
}
slices.SortFunc(
coreCommands, func(a, b *cobra.Command) int {
return cmp.Compare(a.Name(), b.Name())
},
)
slices.SortFunc(
resourceCommands, func(a, b *cobra.Command) int {
return cmp.Compare(a.Name(), b.Name())
},
)
b.WriteString("\n# yutu\n")
for _, c := range coreCommands {
name := c.Name()
_, _ = fmt.Fprintf(&b, "echo \"======= %s =======\"\n", name)
_, _ = fmt.Fprintf(&b, "\"$YUTU_PATH\" %s --help\n\n", name)
}
b.WriteString("# youtube api\n")
for _, c := range resourceCommands {
name := c.Name()
_, _ = fmt.Fprintf(&b, "echo \"======= %s =======\"\n", name)
_, _ = fmt.Fprintf(&b, "\"$YUTU_PATH\" %s --help\n", name)
var subs []*cobra.Command
for _, sub := range c.Commands() {
if sub.Name() == "help" {
continue
}
subs = append(subs, sub)
}
slices.SortFunc(
subs, func(a, b *cobra.Command) int {
return cmp.Compare(a.Name(), b.Name())
},
)
for _, sub := range subs {
_, _ = fmt.Fprintf(&b, "echo \"------- %s -------\"\n", sub.Name())
_, _ = fmt.Fprintf(&b, "\"$YUTU_PATH\" %s %s --help\n", name, sub.Name())
}
b.WriteString("\n")
}
return strings.TrimRight(b.String(), "\n") + "\n"
}
func main() {
out := flag.String("out", "./scripts/command-test.sh", "output file")
flag.Parse()
content := generate()
if err := os.WriteFile(*out, []byte(content), 0o755); err != nil {
log.Fatalf("write %s: %v", *out, err)
}
fmt.Printf("Generated %s\n", *out)
}