💥 Unified youtube skill

This commit is contained in:
OpenWaygate committed 2026-04-08 21:12:08 +08:00
1 parent 54734409c7
commit 40ecc96a8e
103 files changed
+982 -4272

No files matched your search

+1
View File
@@ -50,6 +50,7 @@ dist/
/.clwb/
/docs/superpowers
.worktrees/
# except for the following files
!winres/*
!server.json
+7 -2
View File
@@ -1,4 +1,4 @@
load("@rules_go//go:def.bzl", "go_binary", "go_library")
load("@rules_go//go:def.bzl", "go_binary", "go_library", "go_test")
go_library(
name = "skillgen_lib",
@@ -31,7 +31,6 @@ go_library(
"//cmd/videoCategory",
"//cmd/watermark",
"@com_github_spf13_cobra//:cobra",
"@com_github_spf13_pflag//:pflag",
],
)
@@ -40,3 +39,9 @@ go_binary(
embed = [":skillgen_lib"],
visibility = ["//:__subpackages__"],
)
go_test(
name = "skillgen_test",
srcs = ["main_test.go"],
embed = [":skillgen_lib"],
)
+216 -265
View File
@@ -15,7 +15,6 @@ import (
"github.com/eat-pray-ai/yutu/cmd"
"github.com/spf13/cobra"
"github.com/spf13/pflag"
// Blank-import every resource package so that its init() registers the
// subcommand (and sub-subcommands) on cmd.RootCmd.
@@ -46,165 +45,164 @@ import (
//go:embed setup.md
var setupContent string
func main() {
out := flag.String("out", "./skills", "output directory for generated skills")
flag.Parse()
// ---------------------------------------------------------------------------
// Types
// ---------------------------------------------------------------------------
root := cmd.RootCmd
root.InitDefaultHelpCmd()
type verbEntry struct {
name string
short string
}
for _, c := range root.Commands() {
if !strings.HasPrefix(c.Short, "Manage") {
type resourceEntry struct {
name string
kebab string
human string
short string
long string
verbs []verbEntry
}
type categoryGroup struct {
name string
resources []resourceEntry
}
// ---------------------------------------------------------------------------
// Category mapping
// ---------------------------------------------------------------------------
var categoryOrder = []string{
"Content", "Organization", "Community", "Channel", "Discovery", "Metadata",
}
var categoryMap = map[string]string{
"video": "Content",
"caption": "Content",
"thumbnail": "Content",
"watermark": "Content",
"playlist": "Organization",
"playlistItem": "Organization",
"playlistImage": "Organization",
"comment": "Community",
"commentThread": "Community",
"subscription": "Community",
"member": "Community",
"membershipsLevel": "Community",
"superChatEvent": "Community",
"channel": "Channel",
"channelBanner": "Channel",
"channelSection": "Channel",
"search": "Discovery",
"activity": "Discovery",
"videoCategory": "Metadata",
"videoAbuseReportReason": "Metadata",
"i18nLanguage": "Metadata",
"i18nRegion": "Metadata",
}
// resourceCategory returns the category for a resource, or "Other" if unmapped.
func resourceCategory(name string) string {
if cat, ok := categoryMap[name]; ok {
return cat
}
return "Other"
}
// collectResource builds a resourceEntry from a cobra resource command.
func collectResource(c *cobra.Command) resourceEntry {
name := c.Name()
var verbs []verbEntry
for _, sub := range c.Commands() {
if sub.Name() == "help" {
continue
}
skill := c.Name()
kebabSkill := camelToKebab(skill)
dir := filepath.Join(*out, "youtube-"+kebabSkill)
refDir := filepath.Join(dir, "references")
if err := os.MkdirAll(refDir, 0o755); err != nil {
log.Fatalf("mkdir %s: %v", refDir, err)
}
setupPath := filepath.Join(refDir, "setup.md")
if err := writeSetup(setupPath); err != nil {
log.Fatalf("write setup %s: %v", setupPath, err)
}
var verbs []*cobra.Command
for _, sub := range c.Commands() {
if sub.Name() == "help" {
continue
}
verbs = append(verbs, sub)
}
sort.Slice(
verbs, func(i, j int) bool {
return verbs[i].Name() < verbs[j].Name()
},
)
for _, verb := range verbs {
refPath := filepath.Join(refDir, skill+"-"+verb.Name()+".md")
if err := writeReference(refPath, c, verb); err != nil {
log.Fatalf("write reference %s: %v", refPath, err)
}
}
skillPath := filepath.Join(dir, "SKILL.md")
if err := writeSkill(skillPath, c, verbs, kebabSkill); err != nil {
log.Fatalf("write skill %s: %v", skillPath, err)
}
fmt.Printf("Generated skill: %s (%d verbs)\n", skill, len(verbs))
verbs = append(verbs, verbEntry{name: sub.Name(), short: sub.Short})
}
sort.Slice(verbs, func(i, j int) bool {
return verbs[i].name < verbs[j].name
})
return resourceEntry{
name: name,
kebab: camelToKebab(name),
human: camelToWords(name),
short: c.Short,
long: c.Long,
verbs: verbs,
}
}
func writeSetup(path string) error {
return os.WriteFile(path, []byte(setupContent), 0o644)
// groupByCategory groups resources into categories ordered by categoryOrder,
// with "Other" appended at the end for any unmapped resources.
func groupByCategory(resources []resourceEntry) []categoryGroup {
byCategory := make(map[string][]resourceEntry)
for _, r := range resources {
cat := resourceCategory(r.name)
byCategory[cat] = append(byCategory[cat], r)
}
var groups []categoryGroup
for _, cat := range categoryOrder {
if rs, ok := byCategory[cat]; ok {
sort.Slice(rs, func(i, j int) bool {
return rs[i].name < rs[j].name
})
groups = append(groups, categoryGroup{name: cat, resources: rs})
delete(byCategory, cat)
}
}
// Append "Other" for any remaining unmapped categories.
if rs, ok := byCategory["Other"]; ok {
sort.Slice(rs, func(i, j int) bool {
return rs[i].name < rs[j].name
})
groups = append(groups, categoryGroup{name: "Other", resources: rs})
}
return groups
}
// writeReference generates a reference Markdown file for a single verb
// command, including required-flag indicators and skill-oriented language.
func writeReference(path string, parent, verb *cobra.Command) error {
// ---------------------------------------------------------------------------
// Unified description builder
// ---------------------------------------------------------------------------
// buildUnifiedDescription constructs the skill description with high-frequency
// triggers and a broad fallback. Intentionally concise — no exhaustive verb list.
func buildUnifiedDescription(_ []categoryGroup) string {
return "Use when working with YouTube — upload videos, search content, manage playlists and channels, post and moderate comments, handle subscriptions and memberships, add captions, set thumbnails, check analytics, or any YouTube Data API operation via the yutu CLI."
}
// ---------------------------------------------------------------------------
// Static content for SKILL.md sections
// ---------------------------------------------------------------------------
const workflowSummary = `- **Upload a video**: ` + "`yutu video insert --file video.mp4 --title \"...\" --privacy public`" + `, then optionally set thumbnail
- **Update video metadata**: Fetch current with ` + "`yutu video list --id VIDEO_ID`" + `, then update changed fields
- **Create playlist + add videos**: Create with ` + "`yutu playlist insert`" + `, find videos with ` + "`yutu search list --forMine`" + `, add with ` + "`yutu playlistItem insert`" + `
- **Post a comment**: Get channel ID with ` + "`yutu channel list --mine`" + `, find video, then ` + "`yutu commentThread insert`" + `
- **Channel analytics**: ` + "`yutu channel list --mine`" + ` + ` + "`yutu search list --forMine`" + ` + ` + "`yutu video list --id ...`" + `
- **Competitor analysis**: ` + "`yutu channel list --forHandle @handle`" + ` + compare stats and top videos
- **Delete content**: Always verify with a list command first, then delete — deletions are irreversible
- **Subscribe/unsubscribe**: Check with ` + "`yutu subscription list --mine --forChannelId ...`" + ` before acting`
const growthTips = `- **Titles**: Use curiosity gaps and power words. Front-load keywords. Keep under 60 characters.
- **Descriptions**: First 2 lines appear in search. Include keywords, timestamps, CTAs, and 3-5 hashtags.
- **Tags**: Mix broad and long-tail keywords. First 2-3 tags carry the most weight.
- **Thumbnails**: High contrast, 3-4 word text, expressive faces, consistent branding.
- **Publishing**: Post when audience is active. Maintain consistent schedule.
- **Engagement**: Pin a comment with a question. Reply within the first hour.`
// ---------------------------------------------------------------------------
// Unified SKILL.md writer
// ---------------------------------------------------------------------------
// writeUnifiedSkill generates the single unified SKILL.md for the youtube skill.
func writeUnifiedSkill(path string, groups []categoryGroup) error {
var b strings.Builder
skill := parent.Name()
verbName := verb.Name()
humanSkill := camelToWords(skill)
title := titleCase(humanSkill) + " " + titleCase(verbName)
desc := buildUnifiedDescription(groups)
b.WriteString(fmt.Sprintf("# %s\n\n", title))
desc := rewriteToolPhrase(verb.Long)
if desc != "" {
b.WriteString(desc + "\n\n")
}
b.WriteString("## Usage\n\n")
b.WriteString(
fmt.Sprintf(
"```bash\nyutu %s %s [flags]\n```\n", skill, verbName,
),
)
requiredFlags := requiredFlagNames(verb)
type flagEntry struct {
name string
shorthand string
usage string
required bool
}
var flags []flagEntry
verb.Flags().VisitAll(
func(f *pflag.Flag) {
if f.Name == "help" {
return
}
usage := f.Usage
if f.DefValue != "" && f.DefValue != "false" && f.DefValue != "0" && f.DefValue != "[]" {
usage += fmt.Sprintf(" (default %s)", formatDefault(f))
}
flags = append(
flags, flagEntry{
name: f.Name,
shorthand: f.Shorthand,
usage: escPipe(usage),
required: requiredFlags[f.Name],
},
)
},
)
if len(flags) > 0 {
b.WriteString("\n## Flags\n\n")
b.WriteString("| Flag | Shorthand | Required | Description |\n")
b.WriteString("|------|-----------|----------|-------------|\n")
for _, f := range flags {
sh := ""
if f.shorthand != "" {
sh = "`-" + f.shorthand + "`"
}
req := ""
if f.required {
req = "Yes"
}
b.WriteString(
fmt.Sprintf(
"| `--%-s` | %s | %s | %s |\n", f.name, sh, req, f.usage,
),
)
}
}
if verb.Example != "" {
b.WriteString("\n## Examples\n\n```bash\n")
b.WriteString(strings.TrimSpace(verb.Example) + "\n")
b.WriteString("```\n")
}
return os.WriteFile(path, []byte(b.String()), 0o644)
}
// writeSkill generates the SKILL.md overview file for a resource command
// following skill-creator best practices: "pushy" description, overview
// paragraph, progressive-disclosure table, and quick-start snippet.
func writeSkill(
path string, c *cobra.Command, verbs []*cobra.Command, kebabSkill string,
) error {
var b strings.Builder
skill := c.Name()
humanSkill := camelToWords(skill)
desc := buildDescription(c, verbs, humanSkill)
skillName := "youtube-" + kebabSkill
_, _ = fmt.Fprintf(
&b, `---
name: %s
_, _ = fmt.Fprintf(&b, `---
name: youtube
description: "%s"
metadata:
openclaw:
@@ -226,153 +224,106 @@ metadata:
bins: [yutu]
---
`, skillName, strings.ReplaceAll(desc, `"`, `\"`),
)
`, strings.ReplaceAll(desc, `"`, `\"`))
_, _ = fmt.Fprintf(&b, "# YouTube %s\n\n", titleCase(humanSkill))
overview := rewriteToolPhrase(c.Long)
if overview == "" {
overview = c.Short
}
b.WriteString(overview + "\n\n")
b.WriteString("# YouTube\n\n")
b.WriteString("Manage YouTube resources using the yutu CLI — videos, playlists, comments, channels, captions, subscriptions, and more.\n\n")
b.WriteString("## Before You Begin\n\n")
b.WriteString("yutu requires Google Cloud Platform OAuth credentials and a cached token to access the YouTube API. ")
b.WriteString("If you haven't set up yutu yet, read the [setup guide](references/setup.md) first.\n\n")
b.WriteString("## Operations\n\n")
b.WriteString("Read the linked reference for full flag details and examples.\n\n")
b.WriteString("Run `yutu <resource> <verb> -h` for full flag details and examples.\n\n")
if len(verbs) > 0 {
b.WriteString("| Operation | Description | Reference |\n")
b.WriteString("|-----------|-------------|----------|\n")
for _, verb := range verbs {
refFile := fmt.Sprintf("references/%s-%s.md", skill, verb.Name())
_, _ = fmt.Fprintf(
&b, "| %s | %s | [details](%s) |\n",
verb.Name(), escPipe(verb.Short), refFile,
)
for _, g := range groups {
_, _ = fmt.Fprintf(&b, "### %s\n\n", g.name)
b.WriteString("| Resource | Operation | Description |\n")
b.WriteString("|----------|-----------|-------------|\n")
for _, r := range g.resources {
for _, v := range r.verbs {
_, _ = fmt.Fprintf(&b, "| %s | %s | %s |\n", r.human, v.name, escPipe(v.short))
}
}
b.WriteString("\n")
}
_, _ = fmt.Fprintf(
&b, "## Quick Start\n\n```bash\n# Show all %s commands\nyutu %s --help\n",
humanSkill, skill,
)
for _, verb := range verbs {
if verb.Name() == "list" {
_, _ = fmt.Fprintf(&b, "\n# List %s\nyutu %s list\n", humanSkill, skill)
break
}
}
b.WriteString("```\n")
b.WriteString("## Common Workflows\n\n")
b.WriteString("See [references/workflows.md](references/workflows.md) for detailed walkthroughs.\n\n")
b.WriteString(workflowSummary + "\n\n")
b.WriteString("## YouTube Growth Tips\n\n")
b.WriteString("See [references/seo-guide.md](references/seo-guide.md) for the full guide.\n\n")
b.WriteString(growthTips + "\n")
return os.WriteFile(path, []byte(b.String()), 0o644)
}
// buildDescription constructs a "pushy" skill description that encourages
// broad triggering, even when the user doesn't explicitly name the resource.
func buildDescription(
c *cobra.Command, verbs []*cobra.Command, humanSkill string,
) string {
base := rewriteToolPhrase(c.Long)
if base == "" {
base = c.Short
// ---------------------------------------------------------------------------
// Setup writer
// ---------------------------------------------------------------------------
func writeSetup(path string) error {
return os.WriteFile(path, []byte(setupContent), 0o644)
}
// ---------------------------------------------------------------------------
// main
// ---------------------------------------------------------------------------
func main() {
out := flag.String("out", "./skills", "output directory for generated skills")
flag.Parse()
root := cmd.RootCmd
root.InitDefaultHelpCmd()
dir := filepath.Join(*out, "youtube")
refDir := filepath.Join(dir, "references")
if err := os.MkdirAll(refDir, 0o755); err != nil {
log.Fatalf("mkdir %s: %v", refDir, err)
}
var verbNames []string
for _, v := range verbs {
verbNames = append(verbNames, v.Name())
setupPath := filepath.Join(refDir, "setup.md")
if err := writeSetup(setupPath); err != nil {
log.Fatalf("write setup %s: %v", setupPath, err)
}
actions := "manage"
if len(verbNames) > 0 {
if len(verbNames) == 1 {
actions = verbNames[0]
} else if len(verbNames) == 2 {
actions = verbNames[0] + " and " + verbNames[1]
} else {
actions = strings.Join(
verbNames[:len(verbNames)-1], ", ",
) + ", and " + verbNames[len(verbNames)-1]
var resources []resourceEntry
for _, c := range root.Commands() {
if !strings.HasPrefix(c.Short, "Manage") {
continue
}
resources = append(resources, collectResource(c))
}
groups := groupByCategory(resources)
skillPath := filepath.Join(dir, "SKILL.md")
if err := writeUnifiedSkill(skillPath, groups); err != nil {
log.Fatalf("write skill %s: %v", skillPath, err)
}
totalVerbs := 0
for _, g := range groups {
for _, r := range g.resources {
totalVerbs += len(r.verbs)
}
}
base += fmt.Sprintf(
" Useful when working with YouTube %s — provides commands to %s %s via the yutu CLI. Includes setup and installation instructions for first-time users.",
humanSkill, actions, humanSkill,
)
base += " Triggers: " + naturalTriggerPhrases(humanSkill, verbs)
return base
fmt.Printf("Generated unified youtube skill: %d resources, %d verbs, %d categories\n",
len(resources), totalVerbs, len(groups))
}
// naturalTriggerPhrases generates trigger phrases that feel like natural user
// requests rather than mechanical "verb + resource" pairs.
func naturalTriggerPhrases(humanSkill string, verbs []*cobra.Command) string {
var phrases []string
for _, v := range verbs {
short := strings.ToLower(v.Short)
name := v.Name()
phrases = append(phrases, short)
phrases = append(phrases, name+" "+humanSkill)
phrases = append(phrases, name+" my "+humanSkill)
}
return strings.Join(phrases, ", ")
}
// requiredFlagNames returns the set of flag names marked as required on cmd.
func requiredFlagNames(cmd *cobra.Command) map[string]bool {
required := make(map[string]bool)
cmd.Flags().VisitAll(
func(f *pflag.Flag) {
if ann := f.Annotations; ann != nil {
if _, ok := ann[cobra.BashCompOneRequiredFlag]; ok {
required[f.Name] = true
}
}
},
)
return required
}
// formatDefault returns a display-friendly default value for a flag.
func formatDefault(f *pflag.Flag) string {
v := f.DefValue
if f.Value.Type() == "string" && v != "" {
return fmt.Sprintf("%q", v)
}
return v
}
// ---------------------------------------------------------------------------
// String utilities
// ---------------------------------------------------------------------------
// escPipe escapes pipe characters for markdown table cells.
func escPipe(s string) string {
return strings.ReplaceAll(s, "|", "\\|")
}
// titleCase capitalises the first letter of each word in s.
func titleCase(s string) string {
words := strings.Fields(s)
for i, w := range words {
if w != "" {
words[i] = strings.ToUpper(w[:1]) + w[1:]
}
}
return strings.Join(words, " ")
}
// rewriteToolPhrase replaces "Use this tool" phrasing with skill-oriented
// language so the text reads naturally inside a skill context.
func rewriteToolPhrase(s string) string {
s = strings.Replace(s, "Use this tool to", "Use this skill to", 1)
s = strings.Replace(s, "Use this tool", "Use this skill", 1)
return strings.TrimSpace(s)
}
// camelToWords splits a camelCase string into lowercase space-separated words.
func camelToWords(s string) string {
return strings.Join(camelSplit(s), " ")
+284
View File
@@ -0,0 +1,284 @@
// Copyright 2026 eat-pray-ai & OpenWaygate
// SPDX-License-Identifier: Apache-2.0
package main
import (
"os"
"path/filepath"
"strings"
"testing"
)
func TestResourceCategory(t *testing.T) {
expected := map[string]string{
"video": "Content",
"caption": "Content",
"thumbnail": "Content",
"watermark": "Content",
"playlist": "Organization",
"playlistItem": "Organization",
"playlistImage": "Organization",
"comment": "Community",
"commentThread": "Community",
"subscription": "Community",
"member": "Community",
"membershipsLevel": "Community",
"superChatEvent": "Community",
"channel": "Channel",
"channelBanner": "Channel",
"channelSection": "Channel",
"search": "Discovery",
"activity": "Discovery",
"videoCategory": "Metadata",
"videoAbuseReportReason": "Metadata",
"i18nLanguage": "Metadata",
"i18nRegion": "Metadata",
}
for resource, wantCategory := range expected {
got := resourceCategory(resource)
if got != wantCategory {
t.Errorf("resourceCategory(%q) = %q, want %q", resource, got, wantCategory)
}
}
// Unknown resource should return "Other".
if got := resourceCategory("unknownResource"); got != "Other" {
t.Errorf("resourceCategory(%q) = %q, want %q", "unknownResource", got, "Other")
}
}
func TestGroupByCategory(t *testing.T) {
resources := []resourceEntry{
{name: "video", verbs: []verbEntry{{name: "list", short: "List videos"}}},
{name: "playlist", verbs: []verbEntry{{name: "insert", short: "Create a playlist"}}},
{name: "comment", verbs: []verbEntry{{name: "list", short: "List comments"}}},
{name: "channel", verbs: []verbEntry{{name: "list", short: "List channels"}}},
{name: "search", verbs: []verbEntry{{name: "list", short: "Search"}}},
{name: "videoCategory", verbs: []verbEntry{{name: "list", short: "List categories"}}},
{name: "caption", verbs: []verbEntry{{name: "list", short: "List captions"}}},
}
groups := groupByCategory(resources)
// Should follow categoryOrder: Content, Organization, Community, Channel, Discovery, Metadata.
wantOrder := []string{"Content", "Organization", "Community", "Channel", "Discovery", "Metadata"}
if len(groups) != len(wantOrder) {
t.Fatalf("got %d groups, want %d", len(groups), len(wantOrder))
}
for i, g := range groups {
if g.name != wantOrder[i] {
t.Errorf("group[%d].name = %q, want %q", i, g.name, wantOrder[i])
}
}
// Content should have video and caption (sorted).
contentGroup := groups[0]
if len(contentGroup.resources) != 2 {
t.Fatalf("Content group has %d resources, want 2", len(contentGroup.resources))
}
if contentGroup.resources[0].name != "caption" {
t.Errorf("Content[0] = %q, want %q", contentGroup.resources[0].name, "caption")
}
if contentGroup.resources[1].name != "video" {
t.Errorf("Content[1] = %q, want %q", contentGroup.resources[1].name, "video")
}
}
func TestGroupByCategoryWithOther(t *testing.T) {
resources := []resourceEntry{
{name: "video", verbs: []verbEntry{{name: "list", short: "List videos"}}},
{name: "unknownThing", verbs: []verbEntry{{name: "list", short: "List unknowns"}}},
}
groups := groupByCategory(resources)
// Should have Content + Other.
if len(groups) != 2 {
t.Fatalf("got %d groups, want 2", len(groups))
}
if groups[0].name != "Content" {
t.Errorf("groups[0].name = %q, want %q", groups[0].name, "Content")
}
if groups[1].name != "Other" {
t.Errorf("groups[1].name = %q, want %q", groups[1].name, "Other")
}
if groups[1].resources[0].name != "unknownThing" {
t.Errorf("Other[0] = %q, want %q", groups[1].resources[0].name, "unknownThing")
}
}
func TestBuildUnifiedDescription(t *testing.T) {
groups := []categoryGroup{
{
name: "Content",
resources: []resourceEntry{
{name: "video", human: "video", verbs: []verbEntry{
{name: "list", short: "List videos"},
{name: "insert", short: "Upload a video"},
}},
},
},
{
name: "Community",
resources: []resourceEntry{
{name: "comment", human: "comment", verbs: []verbEntry{
{name: "list", short: "List comments"},
}},
},
},
}
desc := buildUnifiedDescription(groups)
// Should start with the broad fallback.
if !strings.HasPrefix(desc, "Use when working with YouTube") {
t.Error("description should start with broad fallback")
}
// Should contain key topics.
for _, phrase := range []string{
"upload videos",
"search content",
"manage playlists",
"captions",
"thumbnails",
"analytics",
"YouTube Data API",
} {
if !strings.Contains(desc, phrase) {
t.Errorf("description missing phrase %q", phrase)
}
}
// Should be concise — no duplicated trigger list.
if strings.Contains(desc, "Triggers:") {
t.Error("description should not have a separate Triggers section")
}
}
func TestWriteUnifiedSkill(t *testing.T) {
groups := []categoryGroup{
{
name: "Content",
resources: []resourceEntry{
{name: "video", human: "video", verbs: []verbEntry{
{name: "insert", short: "Upload a video"},
{name: "list", short: "List videos"},
}},
{name: "caption", human: "caption", verbs: []verbEntry{
{name: "list", short: "List captions"},
}},
},
},
{
name: "Organization",
resources: []resourceEntry{
{name: "playlist", human: "playlist", verbs: []verbEntry{
{name: "insert", short: "Create a playlist"},
}},
},
},
{
name: "Community",
resources: []resourceEntry{
{name: "comment", human: "comment", verbs: []verbEntry{
{name: "list", short: "List comments"},
}},
},
},
{
name: "Channel",
resources: []resourceEntry{
{name: "channel", human: "channel", verbs: []verbEntry{
{name: "list", short: "List channels"},
}},
},
},
{
name: "Discovery",
resources: []resourceEntry{
{name: "search", human: "search", verbs: []verbEntry{
{name: "list", short: "Search YouTube"},
}},
},
},
{
name: "Metadata",
resources: []resourceEntry{
{name: "videoCategory", human: "video category", verbs: []verbEntry{
{name: "list", short: "List video categories"},
}},
},
},
}
tmpDir := t.TempDir()
path := filepath.Join(tmpDir, "SKILL.md")
if err := writeUnifiedSkill(path, groups); err != nil {
t.Fatalf("writeUnifiedSkill: %v", err)
}
data, err := os.ReadFile(path)
if err != nil {
t.Fatalf("read SKILL.md: %v", err)
}
content := string(data)
// Frontmatter has name: youtube.
if !strings.Contains(content, "name: youtube") {
t.Error("SKILL.md missing 'name: youtube' in frontmatter")
}
// All 6 category headers present.
for _, cat := range []string{"Content", "Organization", "Community", "Channel", "Discovery", "Metadata"} {
if !strings.Contains(content, "### "+cat) {
t.Errorf("SKILL.md missing category header ### %s", cat)
}
}
// Operations table rows present.
for _, row := range []string{
"| video | insert | Upload a video |",
"| video | list | List videos |",
"| caption | list | List captions |",
"| playlist | insert | Create a playlist |",
"| comment | list | List comments |",
"| channel | list | List channels |",
"| search | list | Search YouTube |",
"| video category | list | List video categories |",
} {
if !strings.Contains(content, row) {
t.Errorf("SKILL.md missing table row %q", row)
}
}
// CLI help instruction present.
if !strings.Contains(content, "Run `yutu <resource> <verb> -h` for full flag details and examples.") {
t.Error("SKILL.md missing CLI help instruction")
}
// Workflow section present.
if !strings.Contains(content, "## Common Workflows") {
t.Error("SKILL.md missing Common Workflows section")
}
if !strings.Contains(content, "references/workflows.md") {
t.Error("SKILL.md missing workflows.md reference")
}
if !strings.Contains(content, "Upload a video") {
t.Error("SKILL.md missing workflow summary content")
}
// SEO/Growth Tips section present.
if !strings.Contains(content, "## YouTube Growth Tips") {
t.Error("SKILL.md missing YouTube Growth Tips section")
}
if !strings.Contains(content, "references/seo-guide.md") {
t.Error("SKILL.md missing seo-guide.md reference")
}
if !strings.Contains(content, "curiosity gaps") {
t.Error("SKILL.md missing growth tips content")
}
}
-48
View File
@@ -1,48 +0,0 @@
---
name: youtube-activity
description: "Manage activities on YouTube. Use this skill to list channel activities. Useful when working with YouTube activity — provides commands to list activity via the yutu CLI. Includes setup and installation instructions for first-time users. Triggers: list activities, list activity, list my activity"
metadata:
openclaw:
requires:
env:
- YUTU_CREDENTIAL
- YUTU_CACHE_TOKEN
bins:
- yutu
config:
- client_secret.json
- youtube.token.json
primaryEnv: YUTU_CREDENTIAL
emoji: "\U0001F3AC\U0001F430"
homepage: https://github.com/eat-pray-ai/yutu
install:
- kind: node
package: "@eat-pray-ai/yutu"
bins: [yutu]
---
# YouTube Activity
Manage activities on YouTube. Use this skill to list channel activities.
## Before You Begin
yutu requires Google Cloud Platform OAuth credentials and a cached token to access the YouTube API. If you haven't set up yutu yet, read the [setup guide](references/setup.md) first.
## Operations
Read the linked reference for full flag details and examples.
| Operation | Description | Reference |
|-----------|-------------|----------|
| list | List activities | [details](references/activity-list.md) |
## Quick Start
```bash
# Show all activity commands
yutu activity --help
# List activity
yutu activity list
```
@@ -1,34 +0,0 @@
# Activity List
List activities. Use this skill to list activities such as uploads, likes, and favorites.
## Usage
```bash
yutu activity list [flags]
```
## Flags
| Flag | Shorthand | Required | Description |
|------|-----------|----------|-------------|
| `--channelId` | `-c` | | ID of the channel |
| `--home` | `-H` | | true\|false\|null (default true) |
| `--maxResults` | `-n` | | The maximum number of items that should be returned, 0 for no limit (default 5) |
| `--mine` | `-M` | | true\|false\|null (default true) |
| `--output` | `-o` | | json\|yaml\|table (default "table") |
| `--parts` | `-p` | | Comma separated parts (default [id,snippet,contentDetails]) |
| `--publishedAfter` | `-a` | | Filter on activities published after this date |
| `--publishedBefore` | `-b` | | Filter on activities published before this date |
| `--regionCode` | `-r` | | Display the content as seen by viewers in this country |
## Examples
```bash
# List my activities
yutu activity list --mine
# List activities by channel ID with limit
yutu activity list --channelId UC_x5XG1OV2P6uZZ5FSM9Ttw --maxResults 10
# List activities after a date in JSON format
yutu activity list --publishedAfter 2024-01-01T00:00:00Z --output json
```
-52
View File
@@ -1,52 +0,0 @@
---
name: youtube-caption
description: "Manage YouTube video captions. Use this skill to list, insert, update, download, or delete video captions. Useful when working with YouTube caption — provides commands to delete, download, insert, list, and update caption via the yutu CLI. Includes setup and installation instructions for first-time users. Triggers: delete captions, delete caption, delete my caption, download a caption, download caption, download my caption, insert a caption, insert caption, insert my caption, list captions, list caption, list my caption, update a video caption, update caption, update my caption"
metadata:
openclaw:
requires:
env:
- YUTU_CREDENTIAL
- YUTU_CACHE_TOKEN
bins:
- yutu
config:
- client_secret.json
- youtube.token.json
primaryEnv: YUTU_CREDENTIAL
emoji: "\U0001F3AC\U0001F430"
homepage: https://github.com/eat-pray-ai/yutu
install:
- kind: node
package: "@eat-pray-ai/yutu"
bins: [yutu]
---
# YouTube Caption
Manage YouTube video captions. Use this skill to list, insert, update, download, or delete video captions.
## Before You Begin
yutu requires Google Cloud Platform OAuth credentials and a cached token to access the YouTube API. If you haven't set up yutu yet, read the [setup guide](references/setup.md) first.
## Operations
Read the linked reference for full flag details and examples.
| Operation | Description | Reference |
|-----------|-------------|----------|
| delete | Delete captions | [details](references/caption-delete.md) |
| download | Download a caption | [details](references/caption-download.md) |
| insert | Insert a caption | [details](references/caption-insert.md) |
| list | List captions | [details](references/caption-list.md) |
| update | Update a video caption | [details](references/caption-update.md) |
## Quick Start
```bash
# Show all caption commands
yutu caption --help
# List caption
yutu caption list
```
@@ -1,26 +0,0 @@
# Caption Delete
Delete captions. Use this skill to delete captions of a video by IDs.
## Usage
```bash
yutu caption delete [flags]
```
## Flags
| Flag | Shorthand | Required | Description |
|------|-----------|----------|-------------|
| `--ids` | `-i` | Yes | IDs of the captions to delete |
| `--onBehalfOf` | `-b` | | ID of the YouTube account that the content owner is acting on behalf of |
| `--onBehalfOfContentOwner` | `-B` | | ID of the content owner, for YouTube content partners |
## Examples
```bash
# Delete a caption by ID
yutu caption delete --ids abc123
# Delete multiple captions
yutu caption delete --ids abc123,def456
```
@@ -1,31 +0,0 @@
# Caption Download
Download a caption. Use this skill to download a caption from a video.
## Usage
```bash
yutu caption download [flags]
```
## Flags
| Flag | Shorthand | Required | Description |
|------|-----------|----------|-------------|
| `--file` | `-f` | Yes | Path to save the caption file |
| `--id` | `-i` | Yes | ID of the caption to download |
| `--onBehalfOf` | `-b` | | ID of the YouTube account that the content owner is acting on behalf of |
| `--onBehalfOfContentOwner` | `-B` | | ID of the content owner, for YouTube content partners |
| `--tfmt` | `-t` | | sbv\|srt\|vtt |
| `--tlang` | `-l` | | Translate the captions into this language |
## Examples
```bash
# Download a caption as SRT
yutu caption download --id abc123 --file subtitle.srt
# Download a caption as VTT
yutu caption download --id abc123 --file subtitle.vtt --tfmt vtt
# Download a caption translated to French
yutu caption download --id abc123 --file subtitle.srt --tlang fr
```
@@ -1,39 +0,0 @@
# Caption Insert
Insert a caption. Use this skill to insert a caption to a video.
## Usage
```bash
yutu caption insert [flags]
```
## Flags
| Flag | Shorthand | Required | Description |
|------|-----------|----------|-------------|
| `--audioTrackType` | `-a` | | unknown\|primary\|commentary\|descriptive (default "unknown") |
| `--file` | `-f` | Yes | Path to save the caption file |
| `--isAutoSynced` | `-A` | | Whether YouTube synchronized the caption track to the audio track in the video (default true) |
| `--isCC` | `-C` | | Whether the track contains closed captions for the deaf and hard of hearing |
| `--isDraft` | `-D` | | whether the caption track is a draft |
| `--isEasyReader` | `-E` | | Whether caption track is formatted for 'easy reader' |
| `--isLarge` | `-L` | | Whether the caption track uses large text for the vision-impaired |
| `--language` | `-l` | | Language of the caption track |
| `--name` | `-n` | | Name of the caption track |
| `--onBehalfOf` | `-b` | | ID of the YouTube account that the content owner is acting on behalf of |
| `--onBehalfOfContentOwner` | `-B` | | ID of the content owner, for YouTube content partners |
| `--output` | `-o` | | json\|yaml\|silent |
| `--trackKind` | `-t` | | standard\|ASR\|forced (default "standard") |
| `--videoId` | `-v` | Yes | ID of the video |
## Examples
```bash
# Insert a caption to a video
yutu caption insert --file subtitle.srt --videoId dQw4w9WgXcQ
# Insert a caption with language and name
yutu caption insert --file subtitle.srt --videoId dQw4w9WgXcQ --language en --name English
# Insert a standard caption and publish immediately
yutu caption insert --file subtitle.srt --videoId dQw4w9WgXcQ --trackKind standard --isDraft=false
```
@@ -1,31 +0,0 @@
# Caption List
List captions. Use this skill to list captions of a video.
## Usage
```bash
yutu caption list [flags]
```
## Flags
| Flag | Shorthand | Required | Description |
|------|-----------|----------|-------------|
| `--ids` | `-i` | | IDs of the captions to list |
| `--onBehalfOf` | `-b` | | ID of the YouTube account that the content owner is acting on behalf of |
| `--onBehalfOfContentOwner` | `-B` | | ID of the content owner, for YouTube content partners |
| `--output` | `-o` | | json\|yaml\|table (default "table") |
| `--parts` | `-p` | | Comma separated parts (default [id,snippet]) |
| `--videoId` | `-v` | | ID of the video |
## Examples
```bash
# List captions of a video
yutu caption list --videoId dQw4w9WgXcQ
# List captions in JSON format
yutu caption list --videoId dQw4w9WgXcQ --output json
# List specific captions by IDs
yutu caption list --ids abc123,def456 --videoId dQw4w9WgXcQ
```
@@ -1,39 +0,0 @@
# Caption Update
Update a video caption. Use this skill to update a video caption.
## Usage
```bash
yutu caption update [flags]
```
## Flags
| Flag | Shorthand | Required | Description |
|------|-----------|----------|-------------|
| `--audioTrackType` | `-a` | | unknown\|primary\|commentary\|descriptive (default "unknown") |
| `--file` | `-f` | | Path to save the caption file |
| `--isAutoSynced` | `-A` | | Whether YouTube synchronized the caption track to the audio track in the video (default true) |
| `--isCC` | `-C` | | Whether the track contains closed captions for the deaf and hard of hearing |
| `--isDraft` | `-D` | | whether the caption track is a draft |
| `--isEasyReader` | `-E` | | Whether caption track is formatted for 'easy reader' |
| `--isLarge` | `-L` | | Whether the caption track uses large text for the vision-impaired |
| `--language` | `-l` | | Language of the caption track |
| `--name` | `-n` | | Name of the caption track |
| `--onBehalfOf` | `-b` | | ID of the YouTube account that the content owner is acting on behalf of |
| `--onBehalfOfContentOwner` | `-B` | | ID of the content owner, for YouTube content partners |
| `--output` | `-o` | | json\|yaml\|silent |
| `--trackKind` | `-t` | | standard\|ASR\|forced (default "standard") |
| `--videoId` | `-v` | Yes | ID of the video |
## Examples
```bash
# Publish a draft caption
yutu caption update --videoId dQw4w9WgXcQ --isDraft=false
# Update caption language and name
yutu caption update --videoId dQw4w9WgXcQ --language en --name English
# Update caption file
yutu caption update --videoId dQw4w9WgXcQ --file updated.srt
```
@@ -1,65 +0,0 @@
<!-- Keep in sync with README.md Prerequisites and Installation sections. -->
# Yutu Setup Guide
Before using any yutu skill, you need to install `yutu` and configure YouTube API credentials.
## Prerequisites
An account on [Google Cloud Platform](https://console.cloud.google.com/) is required. Set up the following:
1. **Create a GCP Project** and enable these APIs under `APIs & Services -> Enable APIs and services`:
- [YouTube Data API v3](https://console.cloud.google.com/apis/api/youtube.googleapis.com/overview) (Required)
- [YouTube Analytics API](https://console.cloud.google.com/apis/api/youtubeanalytics.googleapis.com/overview) (Optional)
- [YouTube Reporting API](https://console.cloud.google.com/apis/api/youtubereporting.googleapis.com/overview) (Optional)
2. **Create OAuth credentials**:
- Go to `APIs & Services -> OAuth consent screen`, create a consent screen with yourself as a test user
- Go to `Credentials -> Create Credentials -> OAuth Client ID`, select `Web Application`
- Add `http://localhost:8216` as an authorized redirect URI
- Download the credential file and save it as `client_secret.json`
3. **Authenticate**:
```bash
yutu auth --credential client_secret.json
```
A browser window will open for you to grant YouTube access. After granting permission, a token is saved to `youtube.token.json`.
## Installation
Install `yutu` using one of these methods:
```bash
# Node.js (all platforms)
npm i -g @eat-pray-ai/yutu
# macOS
brew install yutu
# Linux
brew install yutu
# Windows
winget install yutu
# Gopher
go install github.com/eat-pray-ai/yutu@latest
```
### Other platforms
Download a prebuilt binary from the [releases page](https://github.com/eat-pray-ai/yutu/releases/latest) and place it in your PATH.
## Environment Variables
| Variable | Description | Default |
|----------|-------------|---------|
| `YUTU_CREDENTIAL` | Path, base64, or JSON of OAuth client secret | `client_secret.json` |
| `YUTU_CACHE_TOKEN` | Path, base64, or JSON of cached OAuth token | `youtube.token.json` |
| `YUTU_ROOT` | Root directory for file resolution | Current working directory |
| `YUTU_LOG_LEVEL` | Log level: `DEBUG`, `INFO`, `WARN`, `ERROR` | `INFO` |
For more details, see the [yutu README](https://github.com/eat-pray-ai/yutu#readme).
-45
View File
@@ -1,45 +0,0 @@
---
name: youtube-channel-banner
description: "Manage YouTube channel banners. Use this skill to insert or upload channel banners. Useful when working with YouTube channel banner — provides commands to insert channel banner via the yutu CLI. Includes setup and installation instructions for first-time users. Triggers: insert a channel banner, insert channel banner, insert my channel banner"
metadata:
openclaw:
requires:
env:
- YUTU_CREDENTIAL
- YUTU_CACHE_TOKEN
bins:
- yutu
config:
- client_secret.json
- youtube.token.json
primaryEnv: YUTU_CREDENTIAL
emoji: "\U0001F3AC\U0001F430"
homepage: https://github.com/eat-pray-ai/yutu
install:
- kind: node
package: "@eat-pray-ai/yutu"
bins: [yutu]
---
# YouTube Channel Banner
Manage YouTube channel banners. Use this skill to insert or upload channel banners.
## Before You Begin
yutu requires Google Cloud Platform OAuth credentials and a cached token to access the YouTube API. If you haven't set up yutu yet, read the [setup guide](references/setup.md) first.
## Operations
Read the linked reference for full flag details and examples.
| Operation | Description | Reference |
|-----------|-------------|----------|
| insert | Insert a channel banner | [details](references/channelBanner-insert.md) |
## Quick Start
```bash
# Show all channel banner commands
yutu channelBanner --help
```
@@ -1,28 +0,0 @@
# Channel Banner Insert
Insert a channel banner. Use this skill to upload a channel banner.
## Usage
```bash
yutu channelBanner insert [flags]
```
## Flags
| Flag | Shorthand | Required | Description |
|------|-----------|----------|-------------|
| `--channelId` | `-c` | Yes | ID of the channel to insert the banner for |
| `--file` | `-f` | Yes | Path to the banner image |
| `--onBehalfOfContentOwner` | `-b` | | ID of the content owner, for YouTube content partners |
| `--onBehalfOfContentOwnerChannel` | `-B` | | YouTube channel ID linked to the content owner |
| `--output` | `-o` | | json\|yaml\|silent |
## Examples
```bash
# Upload a channel banner
yutu channelBanner insert --channelId UC_x5XG1OV2P6uZZ5FSM9Ttw --file banner.jpg
# Upload a channel banner with JSON output
yutu channelBanner insert --channelId UC_x5XG1OV2P6uZZ5FSM9Ttw --file banner.png --output json
```
@@ -1,65 +0,0 @@
<!-- Keep in sync with README.md Prerequisites and Installation sections. -->
# Yutu Setup Guide
Before using any yutu skill, you need to install `yutu` and configure YouTube API credentials.
## Prerequisites
An account on [Google Cloud Platform](https://console.cloud.google.com/) is required. Set up the following:
1. **Create a GCP Project** and enable these APIs under `APIs & Services -> Enable APIs and services`:
- [YouTube Data API v3](https://console.cloud.google.com/apis/api/youtube.googleapis.com/overview) (Required)
- [YouTube Analytics API](https://console.cloud.google.com/apis/api/youtubeanalytics.googleapis.com/overview) (Optional)
- [YouTube Reporting API](https://console.cloud.google.com/apis/api/youtubereporting.googleapis.com/overview) (Optional)
2. **Create OAuth credentials**:
- Go to `APIs & Services -> OAuth consent screen`, create a consent screen with yourself as a test user
- Go to `Credentials -> Create Credentials -> OAuth Client ID`, select `Web Application`
- Add `http://localhost:8216` as an authorized redirect URI
- Download the credential file and save it as `client_secret.json`
3. **Authenticate**:
```bash
yutu auth --credential client_secret.json
```
A browser window will open for you to grant YouTube access. After granting permission, a token is saved to `youtube.token.json`.
## Installation
Install `yutu` using one of these methods:
```bash
# Node.js (all platforms)
npm i -g @eat-pray-ai/yutu
# macOS
brew install yutu
# Linux
brew install yutu
# Windows
winget install yutu
# Gopher
go install github.com/eat-pray-ai/yutu@latest
```
### Other platforms
Download a prebuilt binary from the [releases page](https://github.com/eat-pray-ai/yutu/releases/latest) and place it in your PATH.
## Environment Variables
| Variable | Description | Default |
|----------|-------------|---------|
| `YUTU_CREDENTIAL` | Path, base64, or JSON of OAuth client secret | `client_secret.json` |
| `YUTU_CACHE_TOKEN` | Path, base64, or JSON of cached OAuth token | `youtube.token.json` |
| `YUTU_ROOT` | Root directory for file resolution | Current working directory |
| `YUTU_LOG_LEVEL` | Log level: `DEBUG`, `INFO`, `WARN`, `ERROR` | `INFO` |
For more details, see the [yutu README](https://github.com/eat-pray-ai/yutu#readme).
-49
View File
@@ -1,49 +0,0 @@
---
name: youtube-channel-section
description: "Manage YouTube channel sections. Use this skill to list or delete channel sections. Useful when working with YouTube channel section — provides commands to delete and list channel section via the yutu CLI. Includes setup and installation instructions for first-time users. Triggers: delete channel sections, delete channel section, delete my channel section, list channel sections, list channel section, list my channel section"
metadata:
openclaw:
requires:
env:
- YUTU_CREDENTIAL
- YUTU_CACHE_TOKEN
bins:
- yutu
config:
- client_secret.json
- youtube.token.json
primaryEnv: YUTU_CREDENTIAL
emoji: "\U0001F3AC\U0001F430"
homepage: https://github.com/eat-pray-ai/yutu
install:
- kind: node
package: "@eat-pray-ai/yutu"
bins: [yutu]
---
# YouTube Channel Section
Manage YouTube channel sections. Use this skill to list or delete channel sections.
## Before You Begin
yutu requires Google Cloud Platform OAuth credentials and a cached token to access the YouTube API. If you haven't set up yutu yet, read the [setup guide](references/setup.md) first.
## Operations
Read the linked reference for full flag details and examples.
| Operation | Description | Reference |
|-----------|-------------|----------|
| delete | Delete channel sections | [details](references/channelSection-delete.md) |
| list | List channel sections | [details](references/channelSection-list.md) |
## Quick Start
```bash
# Show all channel section commands
yutu channelSection --help
# List channel section
yutu channelSection list
```
@@ -1,25 +0,0 @@
# Channel Section Delete
Delete channel sections. Use this skill to delete channel sections by IDs.
## Usage
```bash
yutu channelSection delete [flags]
```
## Flags
| Flag | Shorthand | Required | Description |
|------|-----------|----------|-------------|
| `--ids` | `-i` | Yes | Delete the channel sections with the given ids |
| `--onBehalfOfContentOwner` | `-b` | | ID of the content owner, for YouTube content partners |
## Examples
```bash
# Delete a channel section by ID
yutu channelSection delete --ids abc123
# Delete multiple channel sections
yutu channelSection delete --ids abc123,def456
```
@@ -1,32 +0,0 @@
# Channel Section List
List channel sections. Use this skill to list channel sections.
## Usage
```bash
yutu channelSection list [flags]
```
## Flags
| Flag | Shorthand | Required | Description |
|------|-----------|----------|-------------|
| `--channelId` | `-c` | | Return the ChannelSections owned by the specified channel id |
| `--hl` | `-l` | | Return content in specified language |
| `--ids` | `-i` | | Return the channel sections with the given ids |
| `--mine` | `-M` | | Return the ChannelSections owned by the authenticated user |
| `--onBehalfOfContentOwner` | `-b` | | ID of the content owner, for YouTube content partners |
| `--output` | `-o` | | json\|yaml\|table (default "table") |
| `--parts` | `-p` | | Comma separated parts (default [id,snippet]) |
## Examples
```bash
# List my channel sections
yutu channelSection list --mine
# List channel sections by channel ID
yutu channelSection list --channelId UC_x5XG1OV2P6uZZ5FSM9Ttw
# List specific channel sections in JSON format
yutu channelSection list --ids abc123,def456 --output json
```
@@ -1,65 +0,0 @@
<!-- Keep in sync with README.md Prerequisites and Installation sections. -->
# Yutu Setup Guide
Before using any yutu skill, you need to install `yutu` and configure YouTube API credentials.
## Prerequisites
An account on [Google Cloud Platform](https://console.cloud.google.com/) is required. Set up the following:
1. **Create a GCP Project** and enable these APIs under `APIs & Services -> Enable APIs and services`:
- [YouTube Data API v3](https://console.cloud.google.com/apis/api/youtube.googleapis.com/overview) (Required)
- [YouTube Analytics API](https://console.cloud.google.com/apis/api/youtubeanalytics.googleapis.com/overview) (Optional)
- [YouTube Reporting API](https://console.cloud.google.com/apis/api/youtubereporting.googleapis.com/overview) (Optional)
2. **Create OAuth credentials**:
- Go to `APIs & Services -> OAuth consent screen`, create a consent screen with yourself as a test user
- Go to `Credentials -> Create Credentials -> OAuth Client ID`, select `Web Application`
- Add `http://localhost:8216` as an authorized redirect URI
- Download the credential file and save it as `client_secret.json`
3. **Authenticate**:
```bash
yutu auth --credential client_secret.json
```
A browser window will open for you to grant YouTube access. After granting permission, a token is saved to `youtube.token.json`.
## Installation
Install `yutu` using one of these methods:
```bash
# Node.js (all platforms)
npm i -g @eat-pray-ai/yutu
# macOS
brew install yutu
# Linux
brew install yutu
# Windows
winget install yutu
# Gopher
go install github.com/eat-pray-ai/yutu@latest
```
### Other platforms
Download a prebuilt binary from the [releases page](https://github.com/eat-pray-ai/yutu/releases/latest) and place it in your PATH.
## Environment Variables
| Variable | Description | Default |
|----------|-------------|---------|
| `YUTU_CREDENTIAL` | Path, base64, or JSON of OAuth client secret | `client_secret.json` |
| `YUTU_CACHE_TOKEN` | Path, base64, or JSON of cached OAuth token | `youtube.token.json` |
| `YUTU_ROOT` | Root directory for file resolution | Current working directory |
| `YUTU_LOG_LEVEL` | Log level: `DEBUG`, `INFO`, `WARN`, `ERROR` | `INFO` |
For more details, see the [yutu README](https://github.com/eat-pray-ai/yutu#readme).
-49
View File
@@ -1,49 +0,0 @@
---
name: youtube-channel
description: "Manage YouTube channels. Use this skill to list or update channels. Useful when working with YouTube channel — provides commands to list and update channel via the yutu CLI. Includes setup and installation instructions for first-time users. Triggers: list channel information, list channel, list my channel, update channel information, update channel, update my channel"
metadata:
openclaw:
requires:
env:
- YUTU_CREDENTIAL
- YUTU_CACHE_TOKEN
bins:
- yutu
config:
- client_secret.json
- youtube.token.json
primaryEnv: YUTU_CREDENTIAL
emoji: "\U0001F3AC\U0001F430"
homepage: https://github.com/eat-pray-ai/yutu
install:
- kind: node
package: "@eat-pray-ai/yutu"
bins: [yutu]
---
# YouTube Channel
Manage YouTube channels. Use this skill to list or update channels.
## Before You Begin
yutu requires Google Cloud Platform OAuth credentials and a cached token to access the YouTube API. If you haven't set up yutu yet, read the [setup guide](references/setup.md) first.
## Operations
Read the linked reference for full flag details and examples.
| Operation | Description | Reference |
|-----------|-------------|----------|
| list | List channel information | [details](references/channel-list.md) |
| update | Update channel information | [details](references/channel-update.md) |
## Quick Start
```bash
# Show all channel commands
yutu channel --help
# List channel
yutu channel list
```
@@ -1,39 +0,0 @@
# Channel List
List channel information. Use this skill to list channel information.
## Usage
```bash
yutu channel list [flags]
```
## Flags
| Flag | Shorthand | Required | Description |
|------|-----------|----------|-------------|
| `--categoryId` | `-g` | | Return the channels within the specified guide category id |
| `--forHandle` | `-d` | | Return the channel associated with a YouTube handle |
| `--forUsername` | `-u` | | Return the channel associated with a YouTube username |
| `--hl` | `-l` | | Specifies the localization language of the metadata |
| `--ids` | `-i` | | Return the channels with the specified Ids |
| `--managedByMe` | `-E` | | Return the channels managed by the authenticated user |
| `--maxResults` | `-n` | | The maximum number of items that should be returned, 0 for no limit (default 5) |
| `--mine` | `-M` | | Return the ids of channels owned by the authenticated user (default true) |
| `--mySubscribers` | `-S` | | Return the channels subscribed to the authenticated user |
| `--onBehalfOfContentOwner` | `-b` | | ID of the content owner, for YouTube content partners |
| `--output` | `-o` | | json\|yaml\|table (default "table") |
| `--parts` | `-p` | | Comma separated parts (default [id,snippet,status]) |
## Examples
```bash
# List my channel info
yutu channel list --mine
# List channel by handle
yutu channel list --forHandle @GoogleDevelopers
# List channel by ID in JSON format
yutu channel list --ids UC_x5XG1OV2P6uZZ5FSM9Ttw --output json
# List channels in table format
yutu channel list --maxResults 10 --output table
```
@@ -1,32 +0,0 @@
# Channel Update
Update channel information. Use this skill to update channel information.
## Usage
```bash
yutu channel update [flags]
```
## Flags
| Flag | Shorthand | Required | Description |
|------|-----------|----------|-------------|
| `--country` | `-c` | | Country of the channel |
| `--customUrl` | `-u` | | Custom URL of the channel |
| `--defaultLanguage` | `-l` | | The language of the channel's default title and description |
| `--description` | `-d` | | Description of the channel |
| `--id` | `-i` | Yes | ID of the channel to update |
| `--output` | `-o` | | json\|yaml\|silent |
| `--title` | `-t` | | Title of the channel |
## Examples
```bash
# Update channel description
yutu channel update --id UC_x5XG1OV2P6uZZ5FSM9Ttw --description 'New description'
# Update channel title and country
yutu channel update --id UC_x5XG1OV2P6uZZ5FSM9Ttw --title 'New Title' --country US
# Update channel default language
yutu channel update --id UC_x5XG1OV2P6uZZ5FSM9Ttw --defaultLanguage en
```
@@ -1,65 +0,0 @@
<!-- Keep in sync with README.md Prerequisites and Installation sections. -->
# Yutu Setup Guide
Before using any yutu skill, you need to install `yutu` and configure YouTube API credentials.
## Prerequisites
An account on [Google Cloud Platform](https://console.cloud.google.com/) is required. Set up the following:
1. **Create a GCP Project** and enable these APIs under `APIs & Services -> Enable APIs and services`:
- [YouTube Data API v3](https://console.cloud.google.com/apis/api/youtube.googleapis.com/overview) (Required)
- [YouTube Analytics API](https://console.cloud.google.com/apis/api/youtubeanalytics.googleapis.com/overview) (Optional)
- [YouTube Reporting API](https://console.cloud.google.com/apis/api/youtubereporting.googleapis.com/overview) (Optional)
2. **Create OAuth credentials**:
- Go to `APIs & Services -> OAuth consent screen`, create a consent screen with yourself as a test user
- Go to `Credentials -> Create Credentials -> OAuth Client ID`, select `Web Application`
- Add `http://localhost:8216` as an authorized redirect URI
- Download the credential file and save it as `client_secret.json`
3. **Authenticate**:
```bash
yutu auth --credential client_secret.json
```
A browser window will open for you to grant YouTube access. After granting permission, a token is saved to `youtube.token.json`.
## Installation
Install `yutu` using one of these methods:
```bash
# Node.js (all platforms)
npm i -g @eat-pray-ai/yutu
# macOS
brew install yutu
# Linux
brew install yutu
# Windows
winget install yutu
# Gopher
go install github.com/eat-pray-ai/yutu@latest
```
### Other platforms
Download a prebuilt binary from the [releases page](https://github.com/eat-pray-ai/yutu/releases/latest) and place it in your PATH.
## Environment Variables
| Variable | Description | Default |
|----------|-------------|---------|
| `YUTU_CREDENTIAL` | Path, base64, or JSON of OAuth client secret | `client_secret.json` |
| `YUTU_CACHE_TOKEN` | Path, base64, or JSON of cached OAuth token | `youtube.token.json` |
| `YUTU_ROOT` | Root directory for file resolution | Current working directory |
| `YUTU_LOG_LEVEL` | Log level: `DEBUG`, `INFO`, `WARN`, `ERROR` | `INFO` |
For more details, see the [yutu README](https://github.com/eat-pray-ai/yutu#readme).
-49
View File
@@ -1,49 +0,0 @@
---
name: youtube-comment-thread
description: "Manage YouTube comment threads. Use this skill to list or insert new top-level comment threads. Useful when working with YouTube comment thread — provides commands to insert and list comment thread via the yutu CLI. Includes setup and installation instructions for first-time users. Triggers: insert a new comment thread, insert comment thread, insert my comment thread, list comment threads, list comment thread, list my comment thread"
metadata:
openclaw:
requires:
env:
- YUTU_CREDENTIAL
- YUTU_CACHE_TOKEN
bins:
- yutu
config:
- client_secret.json
- youtube.token.json
primaryEnv: YUTU_CREDENTIAL
emoji: "\U0001F3AC\U0001F430"
homepage: https://github.com/eat-pray-ai/yutu
install:
- kind: node
package: "@eat-pray-ai/yutu"
bins: [yutu]
---
# YouTube Comment Thread
Manage YouTube comment threads. Use this skill to list or insert new top-level comment threads.
## Before You Begin
yutu requires Google Cloud Platform OAuth credentials and a cached token to access the YouTube API. If you haven't set up yutu yet, read the [setup guide](references/setup.md) first.
## Operations
Read the linked reference for full flag details and examples.
| Operation | Description | Reference |
|-----------|-------------|----------|
| insert | Insert a new comment thread | [details](references/commentThread-insert.md) |
| list | List comment threads | [details](references/commentThread-list.md) |
## Quick Start
```bash
# Show all comment thread commands
yutu commentThread --help
# List comment thread
yutu commentThread list
```
@@ -1,28 +0,0 @@
# Comment Thread Insert
Insert a new comment thread. Use this skill to insert a new comment thread.
## Usage
```bash
yutu commentThread insert [flags]
```
## Flags
| Flag | Shorthand | Required | Description |
|------|-----------|----------|-------------|
| `--authorChannelId` | `-a` | | Channel id of the comment author |
| `--channelId` | `-c` | Yes | Channel id of the video owner |
| `--output` | `-o` | | json\|yaml\|silent |
| `--textOriginal` | `-t` | Yes | Text of the comment |
| `--videoId` | `-v` | Yes | ID of the video |
## Examples
```bash
# Post a comment on a video
yutu commentThread insert --channelId UC_x5X --videoId dQw4w9WgXcQ --authorChannelId UA_x5X --textOriginal 'Great video!'
# Post a comment with JSON output
yutu commentThread insert --channelId UC_x5X --videoId dQw4w9WgXcQ --authorChannelId UA_x5X --textOriginal 'Nice work!' --output json
```
@@ -1,36 +0,0 @@
# Comment Thread List
List comment threads. Use this skill to list comment threads.
## Usage
```bash
yutu commentThread list [flags]
```
## Flags
| Flag | Shorthand | Required | Description |
|------|-----------|----------|-------------|
| `--allThreadsRelatedToChannelId` | `-a` | | Returns the comment threads of all videos of the channel and the channel comments as well |
| `--channelId` | `-c` | | Channel id of the video owner |
| `--ids` | `-i` | | IDs of the comment threads |
| `--maxResults` | `-n` | | The maximum number of items that should be returned, 0 for no limit (default 5) |
| `--moderationStatus` | `-m` | | published\|heldForReview\|likelySpam\|rejected (default "published") |
| `--order` | `-O` | | orderUnspecified\|time\|relevance (default "time") |
| `--output` | `-o` | | json\|yaml\|table (default "table") |
| `--parts` | `-p` | | Comma separated parts (default [id,snippet]) |
| `--searchTerms` | `-s` | | Search terms |
| `--textFormat` | `-t` | | textFormatUnspecified\|html (default "html") |
| `--videoId` | `-v` | | Returns the comment threads of the specified video |
## Examples
```bash
# List comment threads on a video
yutu commentThread list --videoId dQw4w9WgXcQ --maxResults 10
# Search comment threads by terms
yutu commentThread list --channelId UC_x5XG1OV2P6uZZ5FSM9Ttw --searchTerms 'hello'
# List specific comment threads in JSON format
yutu commentThread list --ids abc123,def456 --output json
```
@@ -1,65 +0,0 @@
<!-- Keep in sync with README.md Prerequisites and Installation sections. -->
# Yutu Setup Guide
Before using any yutu skill, you need to install `yutu` and configure YouTube API credentials.
## Prerequisites
An account on [Google Cloud Platform](https://console.cloud.google.com/) is required. Set up the following:
1. **Create a GCP Project** and enable these APIs under `APIs & Services -> Enable APIs and services`:
- [YouTube Data API v3](https://console.cloud.google.com/apis/api/youtube.googleapis.com/overview) (Required)
- [YouTube Analytics API](https://console.cloud.google.com/apis/api/youtubeanalytics.googleapis.com/overview) (Optional)
- [YouTube Reporting API](https://console.cloud.google.com/apis/api/youtubereporting.googleapis.com/overview) (Optional)
2. **Create OAuth credentials**:
- Go to `APIs & Services -> OAuth consent screen`, create a consent screen with yourself as a test user
- Go to `Credentials -> Create Credentials -> OAuth Client ID`, select `Web Application`
- Add `http://localhost:8216` as an authorized redirect URI
- Download the credential file and save it as `client_secret.json`
3. **Authenticate**:
```bash
yutu auth --credential client_secret.json
```
A browser window will open for you to grant YouTube access. After granting permission, a token is saved to `youtube.token.json`.
## Installation
Install `yutu` using one of these methods:
```bash
# Node.js (all platforms)
npm i -g @eat-pray-ai/yutu
# macOS
brew install yutu
# Linux
brew install yutu
# Windows
winget install yutu
# Gopher
go install github.com/eat-pray-ai/yutu@latest
```
### Other platforms
Download a prebuilt binary from the [releases page](https://github.com/eat-pray-ai/yutu/releases/latest) and place it in your PATH.
## Environment Variables
| Variable | Description | Default |
|----------|-------------|---------|
| `YUTU_CREDENTIAL` | Path, base64, or JSON of OAuth client secret | `client_secret.json` |
| `YUTU_CACHE_TOKEN` | Path, base64, or JSON of cached OAuth token | `youtube.token.json` |
| `YUTU_ROOT` | Root directory for file resolution | Current working directory |
| `YUTU_LOG_LEVEL` | Log level: `DEBUG`, `INFO`, `WARN`, `ERROR` | `INFO` |
For more details, see the [yutu README](https://github.com/eat-pray-ai/yutu#readme).
-53
View File
@@ -1,53 +0,0 @@
---
name: youtube-comment
description: "Manage YouTube comments. Use this skill to list, create, update, delete, mark as spam, or set moderation status for comments. Useful when working with YouTube comment — provides commands to delete, insert, list, markAsSpam, setModerationStatus, and update comment via the yutu CLI. Includes setup and installation instructions for first-time users. Triggers: delete comments, delete comment, delete my comment, create a comment, insert comment, insert my comment, list comments, list comment, list my comment, mark comments as spam, markAsSpam comment, markAsSpam my comment, set comment moderation status, setModerationStatus comment, setModerationStatus my comment, update a comment on a video, update comment, update my comment"
metadata:
openclaw:
requires:
env:
- YUTU_CREDENTIAL
- YUTU_CACHE_TOKEN
bins:
- yutu
config:
- client_secret.json
- youtube.token.json
primaryEnv: YUTU_CREDENTIAL
emoji: "\U0001F3AC\U0001F430"
homepage: https://github.com/eat-pray-ai/yutu
install:
- kind: node
package: "@eat-pray-ai/yutu"
bins: [yutu]
---
# YouTube Comment
Manage YouTube comments. Use this skill to list, create, update, delete, mark as spam, or set moderation status for comments.
## Before You Begin
yutu requires Google Cloud Platform OAuth credentials and a cached token to access the YouTube API. If you haven't set up yutu yet, read the [setup guide](references/setup.md) first.
## Operations
Read the linked reference for full flag details and examples.
| Operation | Description | Reference |
|-----------|-------------|----------|
| delete | Delete comments | [details](references/comment-delete.md) |
| insert | Create a comment | [details](references/comment-insert.md) |
| list | List comments | [details](references/comment-list.md) |
| markAsSpam | Mark comments as spam | [details](references/comment-markAsSpam.md) |
| setModerationStatus | Set comment moderation status | [details](references/comment-setModerationStatus.md) |
| update | Update a comment on a video | [details](references/comment-update.md) |
## Quick Start
```bash
# Show all comment commands
yutu comment --help
# List comment
yutu comment list
```
@@ -1,24 +0,0 @@
# Comment Delete
Delete comments. Use this skill to delete comments by IDs.
## Usage
```bash
yutu comment delete [flags]
```
## Flags
| Flag | Shorthand | Required | Description |
|------|-----------|----------|-------------|
| `--ids` | `-i` | Yes | IDs of comments |
## Examples
```bash
# Delete a comment by ID
yutu comment delete --ids abc123
# Delete multiple comments
yutu comment delete --ids abc123,def456
```
@@ -1,30 +0,0 @@
# Comment Insert
Create a comment. Use this skill to create a comment on a video.
## Usage
```bash
yutu comment insert [flags]
```
## Flags
| Flag | Shorthand | Required | Description |
|------|-----------|----------|-------------|
| `--authorChannelId` | `-a` | | Channel id of the comment author |
| `--canRate` | `-R` | | Whether the viewer can rate the comment |
| `--channelId` | `-c` | | Channel id of the video owner |
| `--output` | `-o` | | json\|yaml\|silent |
| `--parentId` | `-P` | Yes | ID of the parent comment |
| `--textOriginal` | `-t` | Yes | Text of the comment |
| `--videoId` | `-v` | | ID of the video |
## Examples
```bash
# Reply to a comment
yutu comment insert --channelId UC_x5X --videoId dQw4w9 --authorChannelId UA_x5X --parentId UgyXXX --textOriginal 'Hello'
# Reply with rating enabled
yutu comment insert --channelId UC_x5X --videoId dQw4w9 --authorChannelId UA_x5X --parentId UgyXXX --textOriginal 'Reply' --canRate
```
@@ -1,31 +0,0 @@
# Comment List
List comments. Use this skill to list comments by IDs.
## Usage
```bash
yutu comment list [flags]
```
## Flags
| Flag | Shorthand | Required | Description |
|------|-----------|----------|-------------|
| `--ids` | `-i` | | IDs of comments |
| `--maxResults` | `-n` | | The maximum number of items that should be returned, 0 for no limit (default 5) |
| `--output` | `-o` | | json\|yaml\|table (default "table") |
| `--parentId` | `-P` | | Returns replies to the specified comment |
| `--parts` | `-p` | | Comma separated parts (default [id,snippet]) |
| `--textFormat` | `-t` | | textFormatUnspecified\|html\|plainText (default "html") |
## Examples
```bash
# List replies to a comment
yutu comment list --parentId UgyXXXXXXXX --maxResults 10
# List specific comments in JSON format
yutu comment list --ids abc123,def456 --output json
# List a comment in plain text
yutu comment list --ids abc123 --textFormat plainText
```
@@ -1,25 +0,0 @@
# Comment MarkAsSpam
Mark comments as spam. Use this skill to mark comments as spam.
## Usage
```bash
yutu comment markAsSpam [flags]
```
## Flags
| Flag | Shorthand | Required | Description |
|------|-----------|----------|-------------|
| `--ids` | `-i` | Yes | IDs of comments |
| `--output` | `-o` | | json\|yaml\|silent |
## Examples
```bash
# Mark a comment as spam
yutu comment markAsSpam --ids abc123
# Mark multiple comments as spam
yutu comment markAsSpam --ids abc123,def456
```
@@ -1,29 +0,0 @@
# Comment SetModerationStatus
Set comment moderation status. Use this skill to set comment moderation status.
## Usage
```bash
yutu comment setModerationStatus [flags]
```
## Flags
| Flag | Shorthand | Required | Description |
|------|-----------|----------|-------------|
| `--banAuthor` | `-A` | | If set to true the author of the comment gets added to the ban list |
| `--ids` | `-i` | Yes | IDs of comments |
| `--moderationStatus` | `-s` | Yes | heldForReview\|published\|rejected |
| `--output` | `-o` | | json\|yaml\|silent |
## Examples
```bash
# Publish a held comment
yutu comment setModerationStatus --ids abc123 --moderationStatus published
# Hold multiple comments for review
yutu comment setModerationStatus --ids abc123,def456 --moderationStatus heldForReview
# Reject a comment and ban author
yutu comment setModerationStatus --ids abc123 --moderationStatus rejected --banAuthor
```
@@ -1,30 +0,0 @@
# Comment Update
Update a comment on a video. Use this skill to update a comment on a video.
## Usage
```bash
yutu comment update [flags]
```
## Flags
| Flag | Shorthand | Required | Description |
|------|-----------|----------|-------------|
| `--canRate` | `-R` | | Whether the viewer can rate the comment |
| `--id` | `-i` | Yes | ID of the comment |
| `--output` | `-o` | | json\|yaml\|silent |
| `--textOriginal` | `-t` | | Text of the comment |
| `--viewerRating` | `-r` | | none\|like\|dislike |
## Examples
```bash
# Update comment text
yutu comment update --id abc123 --textOriginal 'Updated comment'
# Like a comment
yutu comment update --id abc123 --viewerRating like
# Update comment text with rating enabled
yutu comment update --id abc123 --textOriginal 'New text' --canRate
```
@@ -1,65 +0,0 @@
<!-- Keep in sync with README.md Prerequisites and Installation sections. -->
# Yutu Setup Guide
Before using any yutu skill, you need to install `yutu` and configure YouTube API credentials.
## Prerequisites
An account on [Google Cloud Platform](https://console.cloud.google.com/) is required. Set up the following:
1. **Create a GCP Project** and enable these APIs under `APIs & Services -> Enable APIs and services`:
- [YouTube Data API v3](https://console.cloud.google.com/apis/api/youtube.googleapis.com/overview) (Required)
- [YouTube Analytics API](https://console.cloud.google.com/apis/api/youtubeanalytics.googleapis.com/overview) (Optional)
- [YouTube Reporting API](https://console.cloud.google.com/apis/api/youtubereporting.googleapis.com/overview) (Optional)
2. **Create OAuth credentials**:
- Go to `APIs & Services -> OAuth consent screen`, create a consent screen with yourself as a test user
- Go to `Credentials -> Create Credentials -> OAuth Client ID`, select `Web Application`
- Add `http://localhost:8216` as an authorized redirect URI
- Download the credential file and save it as `client_secret.json`
3. **Authenticate**:
```bash
yutu auth --credential client_secret.json
```
A browser window will open for you to grant YouTube access. After granting permission, a token is saved to `youtube.token.json`.
## Installation
Install `yutu` using one of these methods:
```bash
# Node.js (all platforms)
npm i -g @eat-pray-ai/yutu
# macOS
brew install yutu
# Linux
brew install yutu
# Windows
winget install yutu
# Gopher
go install github.com/eat-pray-ai/yutu@latest
```
### Other platforms
Download a prebuilt binary from the [releases page](https://github.com/eat-pray-ai/yutu/releases/latest) and place it in your PATH.
## Environment Variables
| Variable | Description | Default |
|----------|-------------|---------|
| `YUTU_CREDENTIAL` | Path, base64, or JSON of OAuth client secret | `client_secret.json` |
| `YUTU_CACHE_TOKEN` | Path, base64, or JSON of cached OAuth token | `youtube.token.json` |
| `YUTU_ROOT` | Root directory for file resolution | Current working directory |
| `YUTU_LOG_LEVEL` | Log level: `DEBUG`, `INFO`, `WARN`, `ERROR` | `INFO` |
For more details, see the [yutu README](https://github.com/eat-pray-ai/yutu#readme).
-48
View File
@@ -1,48 +0,0 @@
---
name: youtube-i18n-language
description: "Manage YouTube i18n languages. Use this skill to list available internationalization languages. Useful when working with YouTube i18n language — provides commands to list i18n language via the yutu CLI. Includes setup and installation instructions for first-time users. Triggers: list i18n languages, list i18n language, list my i18n language"
metadata:
openclaw:
requires:
env:
- YUTU_CREDENTIAL
- YUTU_CACHE_TOKEN
bins:
- yutu
config:
- client_secret.json
- youtube.token.json
primaryEnv: YUTU_CREDENTIAL
emoji: "\U0001F3AC\U0001F430"
homepage: https://github.com/eat-pray-ai/yutu
install:
- kind: node
package: "@eat-pray-ai/yutu"
bins: [yutu]
---
# YouTube I18n Language
Manage YouTube i18n languages. Use this skill to list available internationalization languages.
## Before You Begin
yutu requires Google Cloud Platform OAuth credentials and a cached token to access the YouTube API. If you haven't set up yutu yet, read the [setup guide](references/setup.md) first.
## Operations
Read the linked reference for full flag details and examples.
| Operation | Description | Reference |
|-----------|-------------|----------|
| list | List i18n languages | [details](references/i18nLanguage-list.md) |
## Quick Start
```bash
# Show all i18n language commands
yutu i18nLanguage --help
# List i18n language
yutu i18nLanguage list
```
@@ -1,17 +0,0 @@
# I18n Language List
List i18n languages. Use this skill to list available internationalization languages.
## Usage
```bash
yutu i18nLanguage list [flags]
```
## Flags
| Flag | Shorthand | Required | Description |
|------|-----------|----------|-------------|
| `--hl` | `-l` | | Host language |
| `--output` | `-o` | | json\|yaml\|table (default "table") |
| `--parts` | `-p` | | Comma separated parts (default [id,snippet]) |
@@ -1,65 +0,0 @@
<!-- Keep in sync with README.md Prerequisites and Installation sections. -->
# Yutu Setup Guide
Before using any yutu skill, you need to install `yutu` and configure YouTube API credentials.
## Prerequisites
An account on [Google Cloud Platform](https://console.cloud.google.com/) is required. Set up the following:
1. **Create a GCP Project** and enable these APIs under `APIs & Services -> Enable APIs and services`:
- [YouTube Data API v3](https://console.cloud.google.com/apis/api/youtube.googleapis.com/overview) (Required)
- [YouTube Analytics API](https://console.cloud.google.com/apis/api/youtubeanalytics.googleapis.com/overview) (Optional)
- [YouTube Reporting API](https://console.cloud.google.com/apis/api/youtubereporting.googleapis.com/overview) (Optional)
2. **Create OAuth credentials**:
- Go to `APIs & Services -> OAuth consent screen`, create a consent screen with yourself as a test user
- Go to `Credentials -> Create Credentials -> OAuth Client ID`, select `Web Application`
- Add `http://localhost:8216` as an authorized redirect URI
- Download the credential file and save it as `client_secret.json`
3. **Authenticate**:
```bash
yutu auth --credential client_secret.json
```
A browser window will open for you to grant YouTube access. After granting permission, a token is saved to `youtube.token.json`.
## Installation
Install `yutu` using one of these methods:
```bash
# Node.js (all platforms)
npm i -g @eat-pray-ai/yutu
# macOS
brew install yutu
# Linux
brew install yutu
# Windows
winget install yutu
# Gopher
go install github.com/eat-pray-ai/yutu@latest
```
### Other platforms
Download a prebuilt binary from the [releases page](https://github.com/eat-pray-ai/yutu/releases/latest) and place it in your PATH.
## Environment Variables
| Variable | Description | Default |
|----------|-------------|---------|
| `YUTU_CREDENTIAL` | Path, base64, or JSON of OAuth client secret | `client_secret.json` |
| `YUTU_CACHE_TOKEN` | Path, base64, or JSON of cached OAuth token | `youtube.token.json` |
| `YUTU_ROOT` | Root directory for file resolution | Current working directory |
| `YUTU_LOG_LEVEL` | Log level: `DEBUG`, `INFO`, `WARN`, `ERROR` | `INFO` |
For more details, see the [yutu README](https://github.com/eat-pray-ai/yutu#readme).
-48
View File
@@ -1,48 +0,0 @@
---
name: youtube-i18n-region
description: "Manage YouTube i18n regions. Use this skill to list available internationalization regions. Useful when working with YouTube i18n region — provides commands to list i18n region via the yutu CLI. Includes setup and installation instructions for first-time users. Triggers: list i18n regions, list i18n region, list my i18n region"
metadata:
openclaw:
requires:
env:
- YUTU_CREDENTIAL
- YUTU_CACHE_TOKEN
bins:
- yutu
config:
- client_secret.json
- youtube.token.json
primaryEnv: YUTU_CREDENTIAL
emoji: "\U0001F3AC\U0001F430"
homepage: https://github.com/eat-pray-ai/yutu
install:
- kind: node
package: "@eat-pray-ai/yutu"
bins: [yutu]
---
# YouTube I18n Region
Manage YouTube i18n regions. Use this skill to list available internationalization regions.
## Before You Begin
yutu requires Google Cloud Platform OAuth credentials and a cached token to access the YouTube API. If you haven't set up yutu yet, read the [setup guide](references/setup.md) first.
## Operations
Read the linked reference for full flag details and examples.
| Operation | Description | Reference |
|-----------|-------------|----------|
| list | List i18n regions | [details](references/i18nRegion-list.md) |
## Quick Start
```bash
# Show all i18n region commands
yutu i18nRegion --help
# List i18n region
yutu i18nRegion list
```
@@ -1,17 +0,0 @@
# I18n Region List
List i18n regions. Use this skill to list available internationalization regions.
## Usage
```bash
yutu i18nRegion list [flags]
```
## Flags
| Flag | Shorthand | Required | Description |
|------|-----------|----------|-------------|
| `--hl` | `-l` | | Host language |
| `--output` | `-o` | | json\|yaml\|table (default "table") |
| `--parts` | `-p` | | Comma separated parts (default [id,snippet]) |
@@ -1,65 +0,0 @@
<!-- Keep in sync with README.md Prerequisites and Installation sections. -->
# Yutu Setup Guide
Before using any yutu skill, you need to install `yutu` and configure YouTube API credentials.
## Prerequisites
An account on [Google Cloud Platform](https://console.cloud.google.com/) is required. Set up the following:
1. **Create a GCP Project** and enable these APIs under `APIs & Services -> Enable APIs and services`:
- [YouTube Data API v3](https://console.cloud.google.com/apis/api/youtube.googleapis.com/overview) (Required)
- [YouTube Analytics API](https://console.cloud.google.com/apis/api/youtubeanalytics.googleapis.com/overview) (Optional)
- [YouTube Reporting API](https://console.cloud.google.com/apis/api/youtubereporting.googleapis.com/overview) (Optional)
2. **Create OAuth credentials**:
- Go to `APIs & Services -> OAuth consent screen`, create a consent screen with yourself as a test user
- Go to `Credentials -> Create Credentials -> OAuth Client ID`, select `Web Application`
- Add `http://localhost:8216` as an authorized redirect URI
- Download the credential file and save it as `client_secret.json`
3. **Authenticate**:
```bash
yutu auth --credential client_secret.json
```
A browser window will open for you to grant YouTube access. After granting permission, a token is saved to `youtube.token.json`.
## Installation
Install `yutu` using one of these methods:
```bash
# Node.js (all platforms)
npm i -g @eat-pray-ai/yutu
# macOS
brew install yutu
# Linux
brew install yutu
# Windows
winget install yutu
# Gopher
go install github.com/eat-pray-ai/yutu@latest
```
### Other platforms
Download a prebuilt binary from the [releases page](https://github.com/eat-pray-ai/yutu/releases/latest) and place it in your PATH.
## Environment Variables
| Variable | Description | Default |
|----------|-------------|---------|
| `YUTU_CREDENTIAL` | Path, base64, or JSON of OAuth client secret | `client_secret.json` |
| `YUTU_CACHE_TOKEN` | Path, base64, or JSON of cached OAuth token | `youtube.token.json` |
| `YUTU_ROOT` | Root directory for file resolution | Current working directory |
| `YUTU_LOG_LEVEL` | Log level: `DEBUG`, `INFO`, `WARN`, `ERROR` | `INFO` |
For more details, see the [yutu README](https://github.com/eat-pray-ai/yutu#readme).
-48
View File
@@ -1,48 +0,0 @@
---
name: youtube-member
description: "Manage YouTube channel members. Use this skill to list information about channel members. Useful when working with YouTube member — provides commands to list member via the yutu CLI. Includes setup and installation instructions for first-time users. Triggers: list channel members, list member, list my member"
metadata:
openclaw:
requires:
env:
- YUTU_CREDENTIAL
- YUTU_CACHE_TOKEN
bins:
- yutu
config:
- client_secret.json
- youtube.token.json
primaryEnv: YUTU_CREDENTIAL
emoji: "\U0001F3AC\U0001F430"
homepage: https://github.com/eat-pray-ai/yutu
install:
- kind: node
package: "@eat-pray-ai/yutu"
bins: [yutu]
---
# YouTube Member
Manage YouTube channel members. Use this skill to list information about channel members.
## Before You Begin
yutu requires Google Cloud Platform OAuth credentials and a cached token to access the YouTube API. If you haven't set up yutu yet, read the [setup guide](references/setup.md) first.
## Operations
Read the linked reference for full flag details and examples.
| Operation | Description | Reference |
|-----------|-------------|----------|
| list | List channel members | [details](references/member-list.md) |
## Quick Start
```bash
# Show all member commands
yutu member --help
# List member
yutu member list
```
@@ -1,29 +0,0 @@
# Member List
List channel members. Use this skill to list information about channel members.
## Usage
```bash
yutu member list [flags]
```
## Flags
| Flag | Shorthand | Required | Description |
|------|-----------|----------|-------------|
| `--hasAccessToLevel` | `-a` | | Filter members in the results set to the ones that have access to a level |
| `--maxResults` | `-n` | | The maximum number of items that should be returned, 0 for no limit (default 5) |
| `--memberChannelId` | `-c` | | Comma separated list of channel Ids. Only data about members that are part of this list will be included |
| `--mode` | `-m` | | listMembersModeUnknown, updates, or all_current (default "all_current") |
| `--output` | `-o` | | json\|yaml\|table (default "table") |
| `--parts` | `-p` | | Comma separated parts (default [snippet]) |
## Examples
```bash
# List all current members
yutu member list --mode all_current
# List members with limit
yutu member list --maxResults 10
```
-65
View File
@@ -1,65 +0,0 @@
<!-- Keep in sync with README.md Prerequisites and Installation sections. -->
# Yutu Setup Guide
Before using any yutu skill, you need to install `yutu` and configure YouTube API credentials.
## Prerequisites
An account on [Google Cloud Platform](https://console.cloud.google.com/) is required. Set up the following:
1. **Create a GCP Project** and enable these APIs under `APIs & Services -> Enable APIs and services`:
- [YouTube Data API v3](https://console.cloud.google.com/apis/api/youtube.googleapis.com/overview) (Required)
- [YouTube Analytics API](https://console.cloud.google.com/apis/api/youtubeanalytics.googleapis.com/overview) (Optional)
- [YouTube Reporting API](https://console.cloud.google.com/apis/api/youtubereporting.googleapis.com/overview) (Optional)
2. **Create OAuth credentials**:
- Go to `APIs & Services -> OAuth consent screen`, create a consent screen with yourself as a test user
- Go to `Credentials -> Create Credentials -> OAuth Client ID`, select `Web Application`
- Add `http://localhost:8216` as an authorized redirect URI
- Download the credential file and save it as `client_secret.json`
3. **Authenticate**:
```bash
yutu auth --credential client_secret.json
```
A browser window will open for you to grant YouTube access. After granting permission, a token is saved to `youtube.token.json`.
## Installation
Install `yutu` using one of these methods:
```bash
# Node.js (all platforms)
npm i -g @eat-pray-ai/yutu
# macOS
brew install yutu
# Linux
brew install yutu
# Windows
winget install yutu
# Gopher
go install github.com/eat-pray-ai/yutu@latest
```
### Other platforms
Download a prebuilt binary from the [releases page](https://github.com/eat-pray-ai/yutu/releases/latest) and place it in your PATH.
## Environment Variables
| Variable | Description | Default |
|----------|-------------|---------|
| `YUTU_CREDENTIAL` | Path, base64, or JSON of OAuth client secret | `client_secret.json` |
| `YUTU_CACHE_TOKEN` | Path, base64, or JSON of cached OAuth token | `youtube.token.json` |
| `YUTU_ROOT` | Root directory for file resolution | Current working directory |
| `YUTU_LOG_LEVEL` | Log level: `DEBUG`, `INFO`, `WARN`, `ERROR` | `INFO` |
For more details, see the [yutu README](https://github.com/eat-pray-ai/yutu#readme).
-48
View File
@@ -1,48 +0,0 @@
---
name: youtube-memberships-level
description: "Manage YouTube memberships levels. Use this skill to list information about channel membership levels. Useful when working with YouTube memberships level — provides commands to list memberships level via the yutu CLI. Includes setup and installation instructions for first-time users. Triggers: list memberships levels, list memberships level, list my memberships level"
metadata:
openclaw:
requires:
env:
- YUTU_CREDENTIAL
- YUTU_CACHE_TOKEN
bins:
- yutu
config:
- client_secret.json
- youtube.token.json
primaryEnv: YUTU_CREDENTIAL
emoji: "\U0001F3AC\U0001F430"
homepage: https://github.com/eat-pray-ai/yutu
install:
- kind: node
package: "@eat-pray-ai/yutu"
bins: [yutu]
---
# YouTube Memberships Level
Manage YouTube memberships levels. Use this skill to list information about channel membership levels.
## Before You Begin
yutu requires Google Cloud Platform OAuth credentials and a cached token to access the YouTube API. If you haven't set up yutu yet, read the [setup guide](references/setup.md) first.
## Operations
Read the linked reference for full flag details and examples.
| Operation | Description | Reference |
|-----------|-------------|----------|
| list | List memberships levels | [details](references/membershipsLevel-list.md) |
## Quick Start
```bash
# Show all memberships level commands
yutu membershipsLevel --help
# List memberships level
yutu membershipsLevel list
```
@@ -1,23 +0,0 @@
# Memberships Level List
List memberships levels. Use this skill to list information about channel membership levels.
## Usage
```bash
yutu membershipsLevel list [flags]
```
## Flags
| Flag | Shorthand | Required | Description |
|------|-----------|----------|-------------|
| `--output` | `-o` | | json\|yaml\|table (default "table") |
| `--parts` | `-p` | | Comma separated parts (default [id,snippet]) |
## Examples
```bash
# List membership levels in JSON format
yutu membershipsLevel list --output json
```
@@ -1,65 +0,0 @@
<!-- Keep in sync with README.md Prerequisites and Installation sections. -->
# Yutu Setup Guide
Before using any yutu skill, you need to install `yutu` and configure YouTube API credentials.
## Prerequisites
An account on [Google Cloud Platform](https://console.cloud.google.com/) is required. Set up the following:
1. **Create a GCP Project** and enable these APIs under `APIs & Services -> Enable APIs and services`:
- [YouTube Data API v3](https://console.cloud.google.com/apis/api/youtube.googleapis.com/overview) (Required)
- [YouTube Analytics API](https://console.cloud.google.com/apis/api/youtubeanalytics.googleapis.com/overview) (Optional)
- [YouTube Reporting API](https://console.cloud.google.com/apis/api/youtubereporting.googleapis.com/overview) (Optional)
2. **Create OAuth credentials**:
- Go to `APIs & Services -> OAuth consent screen`, create a consent screen with yourself as a test user
- Go to `Credentials -> Create Credentials -> OAuth Client ID`, select `Web Application`
- Add `http://localhost:8216` as an authorized redirect URI
- Download the credential file and save it as `client_secret.json`
3. **Authenticate**:
```bash
yutu auth --credential client_secret.json
```
A browser window will open for you to grant YouTube access. After granting permission, a token is saved to `youtube.token.json`.
## Installation
Install `yutu` using one of these methods:
```bash
# Node.js (all platforms)
npm i -g @eat-pray-ai/yutu
# macOS
brew install yutu
# Linux
brew install yutu
# Windows
winget install yutu
# Gopher
go install github.com/eat-pray-ai/yutu@latest
```
### Other platforms
Download a prebuilt binary from the [releases page](https://github.com/eat-pray-ai/yutu/releases/latest) and place it in your PATH.
## Environment Variables
| Variable | Description | Default |
|----------|-------------|---------|
| `YUTU_CREDENTIAL` | Path, base64, or JSON of OAuth client secret | `client_secret.json` |
| `YUTU_CACHE_TOKEN` | Path, base64, or JSON of cached OAuth token | `youtube.token.json` |
| `YUTU_ROOT` | Root directory for file resolution | Current working directory |
| `YUTU_LOG_LEVEL` | Log level: `DEBUG`, `INFO`, `WARN`, `ERROR` | `INFO` |
For more details, see the [yutu README](https://github.com/eat-pray-ai/yutu#readme).
-51
View File
@@ -1,51 +0,0 @@
---
name: youtube-playlist-image
description: "Manage YouTube playlist images. Use this skill to list, insert, update, or delete playlist images. Useful when working with YouTube playlist image — provides commands to delete, insert, list, and update playlist image via the yutu CLI. Includes setup and installation instructions for first-time users. Triggers: delete playlist images, delete playlist image, delete my playlist image, insert a playlist image, insert playlist image, insert my playlist image, list playlist images, list playlist image, list my playlist image, update a playlist image, update playlist image, update my playlist image"
metadata:
openclaw:
requires:
env:
- YUTU_CREDENTIAL
- YUTU_CACHE_TOKEN
bins:
- yutu
config:
- client_secret.json
- youtube.token.json
primaryEnv: YUTU_CREDENTIAL
emoji: "\U0001F3AC\U0001F430"
homepage: https://github.com/eat-pray-ai/yutu
install:
- kind: node
package: "@eat-pray-ai/yutu"
bins: [yutu]
---
# YouTube Playlist Image
Manage YouTube playlist images. Use this skill to list, insert, update, or delete playlist images.
## Before You Begin
yutu requires Google Cloud Platform OAuth credentials and a cached token to access the YouTube API. If you haven't set up yutu yet, read the [setup guide](references/setup.md) first.
## Operations
Read the linked reference for full flag details and examples.
| Operation | Description | Reference |
|-----------|-------------|----------|
| delete | Delete playlist images | [details](references/playlistImage-delete.md) |
| insert | Insert a playlist image | [details](references/playlistImage-insert.md) |
| list | List playlist images | [details](references/playlistImage-list.md) |
| update | Update a playlist image | [details](references/playlistImage-update.md) |
## Quick Start
```bash
# Show all playlist image commands
yutu playlistImage --help
# List playlist image
yutu playlistImage list
```
@@ -1,25 +0,0 @@
# Playlist Image Delete
Delete playlist images. Use this skill to delete playlist images by IDs.
## Usage
```bash
yutu playlistImage delete [flags]
```
## Flags
| Flag | Shorthand | Required | Description |
|------|-----------|----------|-------------|
| `--ids` | `-i` | Yes | IDs of the playlist images to delete |
| `--onBehalfOfContentOwner` | `-b` | | ID of the content owner, for YouTube content partners |
## Examples
```bash
# Delete a playlist image by ID
yutu playlistImage delete --ids abc123
# Delete multiple playlist images
yutu playlistImage delete --ids abc123,def456
```
@@ -1,33 +0,0 @@
# Playlist Image Insert
Insert a playlist image. Use this skill to insert a YouTube playlist image for a given playlist ID.
## Usage
```bash
yutu playlistImage insert [flags]
```
## Flags
| Flag | Shorthand | Required | Description |
|------|-----------|----------|-------------|
| `--file` | `-f` | Yes | Path to the image file |
| `--height` | `-H` | | The image height |
| `--onBehalfOfContentOwner` | `-b` | | ID of the content owner, for YouTube content partners |
| `--onBehalfOfContentOwnerChannel` | `-B` | | YouTube channel ID linked to the content owner |
| `--output` | `-o` | | json\|yaml\|silent |
| `--playlistId` | `-p` | Yes | ID of the playlist this image is associated with |
| `--type` | `-t` | | The image type (e.g., 'hero') |
| `--width` | `-W` | | The image width |
## Examples
```bash
# Insert a playlist cover image
yutu playlistImage insert --file cover.jpg --playlistId PLxxx
# Insert a hero image
yutu playlistImage insert --file cover.png --playlistId PLxxx --type hero
# Insert an image with custom dimensions
yutu playlistImage insert --file cover.jpg --playlistId PLxxx --width 2048 --height 1152
```
@@ -1,29 +0,0 @@
# Playlist Image List
List playlist images. Use this skill to list playlist images.
## Usage
```bash
yutu playlistImage list [flags]
```
## Flags
| Flag | Shorthand | Required | Description |
|------|-----------|----------|-------------|
| `--maxResults` | `-n` | | The maximum number of items that should be returned, 0 for no limit (default 5) |
| `--onBehalfOfContentOwner` | `-b` | | ID of the content owner, for YouTube content partners |
| `--onBehalfOfContentOwnerChannel` | `-B` | | YouTube channel ID linked to the content owner |
| `--output` | `-o` | | json\|yaml\|table (default "table") |
| `--parent` | `-P` | | Return PlaylistImages for this playlist id |
| `--parts` | `-p` | | Comma separated parts (default [id,kind,snippet]) |
## Examples
```bash
# List images of a playlist
yutu playlistImage list --parent PLxxx
# List playlist images with limit in JSON format
yutu playlistImage list --parent PLxxx --maxResults 10 --output json
```
@@ -1,28 +0,0 @@
# Playlist Image Update
Update a playlist image. Use this skill to update a playlist image.
## Usage
```bash
yutu playlistImage update [flags]
```
## Flags
| Flag | Shorthand | Required | Description |
|------|-----------|----------|-------------|
| `--height` | `-H` | | The image height |
| `--onBehalfOfContentOwner` | `-b` | | ID of the content owner, for YouTube content partners |
| `--onBehalfOfContentOwnerChannel` | `-B` | | YouTube channel ID linked to the content owner |
| `--output` | `-o` | | json\|yaml\|silent |
| `--playlistId` | `-p` | Yes | ID of the playlist this image is associated with |
| `--type` | `-t` | | The image type (e.g., 'hero') |
| `--width` | `-W` | | The image width |
## Examples
```bash
# Update a playlist image
yutu playlistImage update --playlistId PLxxx --type hero --width 2048 --height 1152
```
@@ -1,65 +0,0 @@
<!-- Keep in sync with README.md Prerequisites and Installation sections. -->
# Yutu Setup Guide
Before using any yutu skill, you need to install `yutu` and configure YouTube API credentials.
## Prerequisites
An account on [Google Cloud Platform](https://console.cloud.google.com/) is required. Set up the following:
1. **Create a GCP Project** and enable these APIs under `APIs & Services -> Enable APIs and services`:
- [YouTube Data API v3](https://console.cloud.google.com/apis/api/youtube.googleapis.com/overview) (Required)
- [YouTube Analytics API](https://console.cloud.google.com/apis/api/youtubeanalytics.googleapis.com/overview) (Optional)
- [YouTube Reporting API](https://console.cloud.google.com/apis/api/youtubereporting.googleapis.com/overview) (Optional)
2. **Create OAuth credentials**:
- Go to `APIs & Services -> OAuth consent screen`, create a consent screen with yourself as a test user
- Go to `Credentials -> Create Credentials -> OAuth Client ID`, select `Web Application`
- Add `http://localhost:8216` as an authorized redirect URI
- Download the credential file and save it as `client_secret.json`
3. **Authenticate**:
```bash
yutu auth --credential client_secret.json
```
A browser window will open for you to grant YouTube access. After granting permission, a token is saved to `youtube.token.json`.
## Installation
Install `yutu` using one of these methods:
```bash
# Node.js (all platforms)
npm i -g @eat-pray-ai/yutu
# macOS
brew install yutu
# Linux
brew install yutu
# Windows
winget install yutu
# Gopher
go install github.com/eat-pray-ai/yutu@latest
```
### Other platforms
Download a prebuilt binary from the [releases page](https://github.com/eat-pray-ai/yutu/releases/latest) and place it in your PATH.
## Environment Variables
| Variable | Description | Default |
|----------|-------------|---------|
| `YUTU_CREDENTIAL` | Path, base64, or JSON of OAuth client secret | `client_secret.json` |
| `YUTU_CACHE_TOKEN` | Path, base64, or JSON of cached OAuth token | `youtube.token.json` |
| `YUTU_ROOT` | Root directory for file resolution | Current working directory |
| `YUTU_LOG_LEVEL` | Log level: `DEBUG`, `INFO`, `WARN`, `ERROR` | `INFO` |
For more details, see the [yutu README](https://github.com/eat-pray-ai/yutu#readme).
-51
View File
@@ -1,51 +0,0 @@
---
name: youtube-playlist-item
description: "Manage YouTube playlist items. Use this skill to list items in a playlist, add new items, update items, or remove items. Useful when working with YouTube playlist item — provides commands to delete, insert, list, and update playlist item via the yutu CLI. Includes setup and installation instructions for first-time users. Triggers: delete items from a playlist, delete playlist item, delete my playlist item, insert a playlist item into a playlist, insert playlist item, insert my playlist item, list playlist items, list playlist item, list my playlist item, update a playlist item, update playlist item, update my playlist item"
metadata:
openclaw:
requires:
env:
- YUTU_CREDENTIAL
- YUTU_CACHE_TOKEN
bins:
- yutu
config:
- client_secret.json
- youtube.token.json
primaryEnv: YUTU_CREDENTIAL
emoji: "\U0001F3AC\U0001F430"
homepage: https://github.com/eat-pray-ai/yutu
install:
- kind: node
package: "@eat-pray-ai/yutu"
bins: [yutu]
---
# YouTube Playlist Item
Manage YouTube playlist items. Use this skill to list items in a playlist, add new items, update items, or remove items.
## Before You Begin
yutu requires Google Cloud Platform OAuth credentials and a cached token to access the YouTube API. If you haven't set up yutu yet, read the [setup guide](references/setup.md) first.
## Operations
Read the linked reference for full flag details and examples.
| Operation | Description | Reference |
|-----------|-------------|----------|
| delete | Delete items from a playlist | [details](references/playlistItem-delete.md) |
| insert | Insert a playlist item into a playlist | [details](references/playlistItem-insert.md) |
| list | List playlist items | [details](references/playlistItem-list.md) |
| update | Update a playlist item | [details](references/playlistItem-update.md) |
## Quick Start
```bash
# Show all playlist item commands
yutu playlistItem --help
# List playlist item
yutu playlistItem list
```
@@ -1,25 +0,0 @@
# Playlist Item Delete
Delete items from a playlist. Use this skill to delete items from a playlist by IDs.
## Usage
```bash
yutu playlistItem delete [flags]
```
## Flags
| Flag | Shorthand | Required | Description |
|------|-----------|----------|-------------|
| `--ids` | `-i` | Yes | IDs of the playlist items to delete |
| `--onBehalfOfContentOwner` | `-b` | | ID of the content owner, for YouTube content partners |
## Examples
```bash
# Delete a playlist item by ID
yutu playlistItem delete --ids abc123
# Delete multiple playlist items
yutu playlistItem delete --ids abc123,def456
```
@@ -1,34 +0,0 @@
# Playlist Item Insert
Insert a playlist item into a playlist. Use this skill to insert a playlist item into a playlist.
## Usage
```bash
yutu playlistItem insert [flags]
```
## Flags
| Flag | Shorthand | Required | Description |
|------|-----------|----------|-------------|
| `--channelId` | `-c` | Yes | ID that YouTube uses to uniquely identify the user that added the item to the playlist |
| `--description` | `-d` | | Description of the playlist item |
| `--kChannelId` | `-C` | | ID of the channel if kind is channel |
| `--kPlaylistId` | `-Y` | | ID of the playlist if kind is playlist |
| `--kVideoId` | `-V` | | ID of the video if kind is video |
| `--kind` | `-k` | Yes | video\|channel\|playlist |
| `--onBehalfOfContentOwner` | `-b` | | ID of the content owner, for YouTube content partners |
| `--output` | `-o` | | json\|yaml\|silent |
| `--playlistId` | `-y` | Yes | The id that YouTube uses to uniquely identify the playlist that the item is in |
| `--privacy` | `-p` | | public\|private\|unlisted |
| `--title` | `-t` | | Title of the playlist item |
## Examples
```bash
# Add a video to a playlist
yutu playlistItem insert --kind video --playlistId PLxxx --channelId UC_x5X --kVideoId dQw4w9WgXcQ
# Add a video to a playlist with privacy setting
yutu playlistItem insert --kind video --playlistId PLxxx --channelId UC_x5X --kVideoId dQw4w9 --privacy public
```
@@ -1,32 +0,0 @@
# Playlist Item List
List playlist items. Use this skill to list playlist items.
## Usage
```bash
yutu playlistItem list [flags]
```
## Flags
| Flag | Shorthand | Required | Description |
|------|-----------|----------|-------------|
| `--ids` | `-i` | | IDs of the playlist items to list |
| `--maxResults` | `-n` | | The maximum number of items that should be returned, 0 for no limit (default 5) |
| `--onBehalfOfContentOwner` | `-b` | | ID of the content owner, for YouTube content partners |
| `--output` | `-o` | | json\|yaml\|table (default "table") |
| `--parts` | `-p` | | Comma separated parts (default [id,snippet,status]) |
| `--playlistId` | `-y` | | Return the playlist items within the given playlist |
| `--videoId` | `-v` | | Return the playlist items associated with the given video id |
## Examples
```bash
# List items in a playlist
yutu playlistItem list --playlistId PLxxx
# List playlist items with limit in JSON format
yutu playlistItem list --playlistId PLxxx --maxResults 20 --output json
# List specific playlist items by IDs
yutu playlistItem list --ids abc123,def456
```
@@ -1,31 +0,0 @@
# Playlist Item Update
Update a playlist item. Use this skill to update a playlist item.
## Usage
```bash
yutu playlistItem update [flags]
```
## Flags
| Flag | Shorthand | Required | Description |
|------|-----------|----------|-------------|
| `--description` | `-d` | | Description of the playlist item |
| `--id` | `-i` | Yes | ID of the playlist item to update |
| `--onBehalfOfContentOwner` | `-b` | | ID of the content owner, for YouTube content partners |
| `--output` | `-o` | | json\|yaml\|silent |
| `--privacy` | `-p` | | public\|private\|unlisted |
| `--title` | `-t` | | Title of the playlist item |
## Examples
```bash
# Update playlist item title
yutu playlistItem update --id abc123 --title 'Updated Title'
# Update playlist item description and privacy
yutu playlistItem update --id abc123 --description 'New description' --privacy public
# Update playlist item privacy with JSON output
yutu playlistItem update --id abc123 --privacy private --output json
```
@@ -1,65 +0,0 @@
<!-- Keep in sync with README.md Prerequisites and Installation sections. -->
# Yutu Setup Guide
Before using any yutu skill, you need to install `yutu` and configure YouTube API credentials.
## Prerequisites
An account on [Google Cloud Platform](https://console.cloud.google.com/) is required. Set up the following:
1. **Create a GCP Project** and enable these APIs under `APIs & Services -> Enable APIs and services`:
- [YouTube Data API v3](https://console.cloud.google.com/apis/api/youtube.googleapis.com/overview) (Required)
- [YouTube Analytics API](https://console.cloud.google.com/apis/api/youtubeanalytics.googleapis.com/overview) (Optional)
- [YouTube Reporting API](https://console.cloud.google.com/apis/api/youtubereporting.googleapis.com/overview) (Optional)
2. **Create OAuth credentials**:
- Go to `APIs & Services -> OAuth consent screen`, create a consent screen with yourself as a test user
- Go to `Credentials -> Create Credentials -> OAuth Client ID`, select `Web Application`
- Add `http://localhost:8216` as an authorized redirect URI
- Download the credential file and save it as `client_secret.json`
3. **Authenticate**:
```bash
yutu auth --credential client_secret.json
```
A browser window will open for you to grant YouTube access. After granting permission, a token is saved to `youtube.token.json`.
## Installation
Install `yutu` using one of these methods:
```bash
# Node.js (all platforms)
npm i -g @eat-pray-ai/yutu
# macOS
brew install yutu
# Linux
brew install yutu
# Windows
winget install yutu
# Gopher
go install github.com/eat-pray-ai/yutu@latest
```
### Other platforms
Download a prebuilt binary from the [releases page](https://github.com/eat-pray-ai/yutu/releases/latest) and place it in your PATH.
## Environment Variables
| Variable | Description | Default |
|----------|-------------|---------|
| `YUTU_CREDENTIAL` | Path, base64, or JSON of OAuth client secret | `client_secret.json` |
| `YUTU_CACHE_TOKEN` | Path, base64, or JSON of cached OAuth token | `youtube.token.json` |
| `YUTU_ROOT` | Root directory for file resolution | Current working directory |
| `YUTU_LOG_LEVEL` | Log level: `DEBUG`, `INFO`, `WARN`, `ERROR` | `INFO` |
For more details, see the [yutu README](https://github.com/eat-pray-ai/yutu#readme).
-51
View File
@@ -1,51 +0,0 @@
---
name: youtube-playlist
description: "Manage YouTube playlists. Use this skill to list, create, update, or delete playlists. Useful when working with YouTube playlist — provides commands to delete, insert, list, and update playlist via the yutu CLI. Includes setup and installation instructions for first-time users. Triggers: delete playlists, delete playlist, delete my playlist, create a new playlist, insert playlist, insert my playlist, list playlist information, list playlist, list my playlist, update a playlist, update playlist, update my playlist"
metadata:
openclaw:
requires:
env:
- YUTU_CREDENTIAL
- YUTU_CACHE_TOKEN
bins:
- yutu
config:
- client_secret.json
- youtube.token.json
primaryEnv: YUTU_CREDENTIAL
emoji: "\U0001F3AC\U0001F430"
homepage: https://github.com/eat-pray-ai/yutu
install:
- kind: node
package: "@eat-pray-ai/yutu"
bins: [yutu]
---
# YouTube Playlist
Manage YouTube playlists. Use this skill to list, create, update, or delete playlists.
## Before You Begin
yutu requires Google Cloud Platform OAuth credentials and a cached token to access the YouTube API. If you haven't set up yutu yet, read the [setup guide](references/setup.md) first.
## Operations
Read the linked reference for full flag details and examples.
| Operation | Description | Reference |
|-----------|-------------|----------|
| delete | Delete playlists | [details](references/playlist-delete.md) |
| insert | Create a new playlist | [details](references/playlist-insert.md) |
| list | List playlist information | [details](references/playlist-list.md) |
| update | Update a playlist | [details](references/playlist-update.md) |
## Quick Start
```bash
# Show all playlist commands
yutu playlist --help
# List playlist
yutu playlist list
```
@@ -1,25 +0,0 @@
# Playlist Delete
Delete playlists. Use this skill to delete playlists by IDs.
## Usage
```bash
yutu playlist delete [flags]
```
## Flags
| Flag | Shorthand | Required | Description |
|------|-----------|----------|-------------|
| `--ids` | `-i` | Yes | IDs of the playlists to delete |
| `--onBehalfOfContentOwner` | `-b` | | ID of the content owner, for YouTube content partners |
## Examples
```bash
# Delete a playlist by ID
yutu playlist delete --ids PLxxxx
# Delete multiple playlists
yutu playlist delete --ids PLxxx1,PLxxx2
```
@@ -1,32 +0,0 @@
# Playlist Insert
Create a new playlist. Use this skill to create a new playlist.
## Usage
```bash
yutu playlist insert [flags]
```
## Flags
| Flag | Shorthand | Required | Description |
|------|-----------|----------|-------------|
| `--channelId` | `-c` | Yes | Channel id of the playlist |
| `--description` | `-d` | | Description of the playlist |
| `--language` | `-l` | | Language of the playlist |
| `--output` | `-o` | | json\|yaml\|silent |
| `--privacy` | `-p` | Yes | public\|private\|unlisted |
| `--tags` | `-a` | | Comma separated tags |
| `--title` | `-t` | Yes | Title of the playlist |
## Examples
```bash
# Create a public playlist
yutu playlist insert --title 'My Playlist' --channelId UC_x5XG1OV2P6uZZ5FSM9Ttw --privacy public
# Create a private playlist with description
yutu playlist insert --title 'Tutorial Series' --channelId UC_x5X --privacy private --description 'My tutorials'
# Create an unlisted playlist with tags
yutu playlist insert --title 'Music' --channelId UC_x5X --privacy unlisted --tags 'music,pop'
```
@@ -1,34 +0,0 @@
# Playlist List
List playlist information. Use this skill to list playlist information.
## Usage
```bash
yutu playlist list [flags]
```
## Flags
| Flag | Shorthand | Required | Description |
|------|-----------|----------|-------------|
| `--channelId` | `-c` | | Return the playlists owned by the specified channel id |
| `--hl` | `-l` | | Return content in specified language |
| `--ids` | `-i` | | Return the playlists with the given Ids for Stubby or Apiary |
| `--maxResults` | `-n` | | The maximum number of items that should be returned, 0 for no limit (default 5) |
| `--mine` | `-M` | | Return the playlists owned by the authenticated user (default true) |
| `--onBehalfOfContentOwner` | `-b` | | ID of the content owner, for YouTube content partners |
| `--onBehalfOfContentOwnerChannel` | `-B` | | YouTube channel ID linked to the content owner |
| `--output` | `-o` | | json\|yaml\|table (default "table") |
| `--parts` | `-p` | | Comma separated parts (default [id,snippet,status]) |
## Examples
```bash
# List my playlists
yutu playlist list --mine
# List playlists by channel ID with limit
yutu playlist list --channelId UC_x5XG1OV2P6uZZ5FSM9Ttw --maxResults 10
# List specific playlists in JSON format
yutu playlist list --ids PLxxx1,PLxxx2 --output json
```
@@ -1,32 +0,0 @@
# Playlist Update
Update a playlist. Use this skill to update a playlist.
## Usage
```bash
yutu playlist update [flags]
```
## Flags
| Flag | Shorthand | Required | Description |
|------|-----------|----------|-------------|
| `--description` | `-d` | | Description of the playlist |
| `--id` | `-i` | Yes | ID of the playlist to update |
| `--language` | `-l` | | Language of the playlist |
| `--output` | `-o` | | json\|yaml\|silent |
| `--privacy` | `-p` | | public\|private\|unlisted |
| `--tags` | `-a` | | Comma separated tags |
| `--title` | `-t` | | Title of the playlist |
## Examples
```bash
# Update playlist title
yutu playlist update --id PLxxx --title 'Updated Title'
# Update playlist description and privacy
yutu playlist update --id PLxxx --description 'New description' --privacy public
# Update playlist tags
yutu playlist update --id PLxxx --tags 'music,pop,2024'
```
@@ -1,65 +0,0 @@
<!-- Keep in sync with README.md Prerequisites and Installation sections. -->
# Yutu Setup Guide
Before using any yutu skill, you need to install `yutu` and configure YouTube API credentials.
## Prerequisites
An account on [Google Cloud Platform](https://console.cloud.google.com/) is required. Set up the following:
1. **Create a GCP Project** and enable these APIs under `APIs & Services -> Enable APIs and services`:
- [YouTube Data API v3](https://console.cloud.google.com/apis/api/youtube.googleapis.com/overview) (Required)
- [YouTube Analytics API](https://console.cloud.google.com/apis/api/youtubeanalytics.googleapis.com/overview) (Optional)
- [YouTube Reporting API](https://console.cloud.google.com/apis/api/youtubereporting.googleapis.com/overview) (Optional)
2. **Create OAuth credentials**:
- Go to `APIs & Services -> OAuth consent screen`, create a consent screen with yourself as a test user
- Go to `Credentials -> Create Credentials -> OAuth Client ID`, select `Web Application`
- Add `http://localhost:8216` as an authorized redirect URI
- Download the credential file and save it as `client_secret.json`
3. **Authenticate**:
```bash
yutu auth --credential client_secret.json
```
A browser window will open for you to grant YouTube access. After granting permission, a token is saved to `youtube.token.json`.
## Installation
Install `yutu` using one of these methods:
```bash
# Node.js (all platforms)
npm i -g @eat-pray-ai/yutu
# macOS
brew install yutu
# Linux
brew install yutu
# Windows
winget install yutu
# Gopher
go install github.com/eat-pray-ai/yutu@latest
```
### Other platforms
Download a prebuilt binary from the [releases page](https://github.com/eat-pray-ai/yutu/releases/latest) and place it in your PATH.
## Environment Variables
| Variable | Description | Default |
|----------|-------------|---------|
| `YUTU_CREDENTIAL` | Path, base64, or JSON of OAuth client secret | `client_secret.json` |
| `YUTU_CACHE_TOKEN` | Path, base64, or JSON of cached OAuth token | `youtube.token.json` |
| `YUTU_ROOT` | Root directory for file resolution | Current working directory |
| `YUTU_LOG_LEVEL` | Log level: `DEBUG`, `INFO`, `WARN`, `ERROR` | `INFO` |
For more details, see the [yutu README](https://github.com/eat-pray-ai/yutu#readme).
-48
View File
@@ -1,48 +0,0 @@
---
name: youtube-search
description: "Manage YouTube search. Use this skill to search for videos, channels, playlists, and other resources. Useful when working with YouTube search — provides commands to list search via the yutu CLI. Includes setup and installation instructions for first-time users. Triggers: search resources, list search, list my search"
metadata:
openclaw:
requires:
env:
- YUTU_CREDENTIAL
- YUTU_CACHE_TOKEN
bins:
- yutu
config:
- client_secret.json
- youtube.token.json
primaryEnv: YUTU_CREDENTIAL
emoji: "\U0001F3AC\U0001F430"
homepage: https://github.com/eat-pray-ai/yutu
install:
- kind: node
package: "@eat-pray-ai/yutu"
bins: [yutu]
---
# YouTube Search
Manage YouTube search. Use this skill to search for videos, channels, playlists, and other resources.
## Before You Begin
yutu requires Google Cloud Platform OAuth credentials and a cached token to access the YouTube API. If you haven't set up yutu yet, read the [setup guide](references/setup.md) first.
## Operations
Read the linked reference for full flag details and examples.
| Operation | Description | Reference |
|-----------|-------------|----------|
| list | Search resources | [details](references/search-list.md) |
## Quick Start
```bash
# Show all search commands
yutu search --help
# List search
yutu search list
```
@@ -1,58 +0,0 @@
# Search List
Search resources. Use this skill to search for videos, channels, playlists, and other resources.
## Usage
```bash
yutu search list [flags]
```
## Flags
| Flag | Shorthand | Required | Description |
|------|-----------|----------|-------------|
| `--channelId` | | | Filter on resources belonging to this channelId |
| `--channelType` | | | channelTypeUnspecified\|any\|show (default "channelTypeUnspecified") |
| `--eventType` | | | none\|upcoming\|live\|completed (default "none") |
| `--forContentOwner` | | | Search owned by content owner |
| `--forDeveloper` | | | Only retrieve videos uploaded using the project id of the authenticated user |
| `--forMine` | | | Search for the private videos of the authenticated user |
| `--location` | | | Filter on location of the video |
| `--locationRadius` | | | Filter on distance from the location |
| `--maxResults` | | | The maximum number of items that should be returned, 0 for no limit (default 5) |
| `--onBehalfOfContentOwner` | | | ID of the content owner, for YouTube content partners |
| `--order` | | | searchSortUnspecified, date, rating, viewCount, relevance, title, videoCount (default "relevance") |
| `--output` | | | json\|yaml\|table (default "table") |
| `--parts` | | | Comma separated parts (default [id,snippet]) |
| `--publishedAfter` | | | Filter on resources published after this date |
| `--publishedBefore` | | | Filter on resources published before this date |
| `--q` | | | Textual search terms to match |
| `--regionCode` | | | Display the content as seen by viewers in this country |
| `--relevanceLanguage` | | | Return results relevant to this language |
| `--safeSearch` | | | safeSearchSettingUnspecified\|none\|moderate\|strict (default "moderate") |
| `--topicId` | | | Restrict results to a particular topic |
| `--types` | | | Restrict results to a particular set of resource types from One Platform |
| `--videoCaption` | | | videoCaptionUnspecified\|any\|closedCaption\|none (default "any") |
| `--videoCategoryId` | | | Filter on videos in a specific category |
| `--videoDefinition` | | | Filter on the definition of the videos |
| `--videoDimension` | | | any\|2d\|3d (default "any") |
| `--videoDuration` | | | videoDurationUnspecified\|any\|short\|medium\|long (default "any") |
| `--videoEmbeddable` | | | videoEmbeddableUnspecified\|any\|true |
| `--videoLicense` | | | any\|youtube\|creativeCommon |
| `--videoPaidProductPlacement` | | | videoPaidProductPlacementUnspecified\|any\|true |
| `--videoSyndicated` | | | videoSyndicatedUnspecified\|any\|true |
| `--videoType` | | | videoTypeUnspecified\|any\|movie\|episode |
## Examples
```bash
# Search for videos by keyword
yutu search list --q 'golang tutorial' --maxResults 10
# Search videos by duration in JSON format
yutu search list --q 'music' --types video --videoDuration medium --output json
# List latest videos from a channel
yutu search list --channelId UC_x5XG1OV2P6uZZ5FSM9Ttw --order date --maxResults 5
# Search for live streams
yutu search list --q 'live coding' --eventType live --types video
```
-65
View File
@@ -1,65 +0,0 @@
<!-- Keep in sync with README.md Prerequisites and Installation sections. -->
# Yutu Setup Guide
Before using any yutu skill, you need to install `yutu` and configure YouTube API credentials.
## Prerequisites
An account on [Google Cloud Platform](https://console.cloud.google.com/) is required. Set up the following:
1. **Create a GCP Project** and enable these APIs under `APIs & Services -> Enable APIs and services`:
- [YouTube Data API v3](https://console.cloud.google.com/apis/api/youtube.googleapis.com/overview) (Required)
- [YouTube Analytics API](https://console.cloud.google.com/apis/api/youtubeanalytics.googleapis.com/overview) (Optional)
- [YouTube Reporting API](https://console.cloud.google.com/apis/api/youtubereporting.googleapis.com/overview) (Optional)
2. **Create OAuth credentials**:
- Go to `APIs & Services -> OAuth consent screen`, create a consent screen with yourself as a test user
- Go to `Credentials -> Create Credentials -> OAuth Client ID`, select `Web Application`
- Add `http://localhost:8216` as an authorized redirect URI
- Download the credential file and save it as `client_secret.json`
3. **Authenticate**:
```bash
yutu auth --credential client_secret.json
```
A browser window will open for you to grant YouTube access. After granting permission, a token is saved to `youtube.token.json`.
## Installation
Install `yutu` using one of these methods:
```bash
# Node.js (all platforms)
npm i -g @eat-pray-ai/yutu
# macOS
brew install yutu
# Linux
brew install yutu
# Windows
winget install yutu
# Gopher
go install github.com/eat-pray-ai/yutu@latest
```
### Other platforms
Download a prebuilt binary from the [releases page](https://github.com/eat-pray-ai/yutu/releases/latest) and place it in your PATH.
## Environment Variables
| Variable | Description | Default |
|----------|-------------|---------|
| `YUTU_CREDENTIAL` | Path, base64, or JSON of OAuth client secret | `client_secret.json` |
| `YUTU_CACHE_TOKEN` | Path, base64, or JSON of cached OAuth token | `youtube.token.json` |
| `YUTU_ROOT` | Root directory for file resolution | Current working directory |
| `YUTU_LOG_LEVEL` | Log level: `DEBUG`, `INFO`, `WARN`, `ERROR` | `INFO` |
For more details, see the [yutu README](https://github.com/eat-pray-ai/yutu#readme).
-50
View File
@@ -1,50 +0,0 @@
---
name: youtube-subscription
description: "Manage YouTube subscriptions. Use this skill to list subscriptions/subscribers, subscribe to channels, or unsubscribe. Useful when working with YouTube subscription — provides commands to delete, insert, and list subscription via the yutu CLI. Includes setup and installation instructions for first-time users. Triggers: delete subscriptions, delete subscription, delete my subscription, insert a new subscription, insert subscription, insert my subscription, list subscription information, list subscription, list my subscription"
metadata:
openclaw:
requires:
env:
- YUTU_CREDENTIAL
- YUTU_CACHE_TOKEN
bins:
- yutu
config:
- client_secret.json
- youtube.token.json
primaryEnv: YUTU_CREDENTIAL
emoji: "\U0001F3AC\U0001F430"
homepage: https://github.com/eat-pray-ai/yutu
install:
- kind: node
package: "@eat-pray-ai/yutu"
bins: [yutu]
---
# YouTube Subscription
Manage YouTube subscriptions. Use this skill to list subscriptions/subscribers, subscribe to channels, or unsubscribe.
## Before You Begin
yutu requires Google Cloud Platform OAuth credentials and a cached token to access the YouTube API. If you haven't set up yutu yet, read the [setup guide](references/setup.md) first.
## Operations
Read the linked reference for full flag details and examples.
| Operation | Description | Reference |
|-----------|-------------|----------|
| delete | Delete subscriptions | [details](references/subscription-delete.md) |
| insert | Insert a new subscription | [details](references/subscription-insert.md) |
| list | List subscription information | [details](references/subscription-list.md) |
## Quick Start
```bash
# Show all subscription commands
yutu subscription --help
# List subscription
yutu subscription list
```
@@ -1,65 +0,0 @@
<!-- Keep in sync with README.md Prerequisites and Installation sections. -->
# Yutu Setup Guide
Before using any yutu skill, you need to install `yutu` and configure YouTube API credentials.
## Prerequisites
An account on [Google Cloud Platform](https://console.cloud.google.com/) is required. Set up the following:
1. **Create a GCP Project** and enable these APIs under `APIs & Services -> Enable APIs and services`:
- [YouTube Data API v3](https://console.cloud.google.com/apis/api/youtube.googleapis.com/overview) (Required)
- [YouTube Analytics API](https://console.cloud.google.com/apis/api/youtubeanalytics.googleapis.com/overview) (Optional)
- [YouTube Reporting API](https://console.cloud.google.com/apis/api/youtubereporting.googleapis.com/overview) (Optional)
2. **Create OAuth credentials**:
- Go to `APIs & Services -> OAuth consent screen`, create a consent screen with yourself as a test user
- Go to `Credentials -> Create Credentials -> OAuth Client ID`, select `Web Application`
- Add `http://localhost:8216` as an authorized redirect URI
- Download the credential file and save it as `client_secret.json`
3. **Authenticate**:
```bash
yutu auth --credential client_secret.json
```
A browser window will open for you to grant YouTube access. After granting permission, a token is saved to `youtube.token.json`.
## Installation
Install `yutu` using one of these methods:
```bash
# Node.js (all platforms)
npm i -g @eat-pray-ai/yutu
# macOS
brew install yutu
# Linux
brew install yutu
# Windows
winget install yutu
# Gopher
go install github.com/eat-pray-ai/yutu@latest
```
### Other platforms
Download a prebuilt binary from the [releases page](https://github.com/eat-pray-ai/yutu/releases/latest) and place it in your PATH.
## Environment Variables
| Variable | Description | Default |
|----------|-------------|---------|
| `YUTU_CREDENTIAL` | Path, base64, or JSON of OAuth client secret | `client_secret.json` |
| `YUTU_CACHE_TOKEN` | Path, base64, or JSON of cached OAuth token | `youtube.token.json` |
| `YUTU_ROOT` | Root directory for file resolution | Current working directory |
| `YUTU_LOG_LEVEL` | Log level: `DEBUG`, `INFO`, `WARN`, `ERROR` | `INFO` |
For more details, see the [yutu README](https://github.com/eat-pray-ai/yutu#readme).
@@ -1,24 +0,0 @@
# Subscription Delete
Delete subscriptions. Use this skill to delete subscriptions by IDs.
## Usage
```bash
yutu subscription delete [flags]
```
## Flags
| Flag | Shorthand | Required | Description |
|------|-----------|----------|-------------|
| `--ids` | `-i` | Yes | IDs of the subscriptions to delete |
## Examples
```bash
# Delete a subscription by ID
yutu subscription delete --ids abc123
# Delete multiple subscriptions
yutu subscription delete --ids abc123,def456
```
@@ -1,28 +0,0 @@
# Subscription Insert
Insert a new subscription. Use this skill to insert a new subscription.
## Usage
```bash
yutu subscription insert [flags]
```
## Flags
| Flag | Shorthand | Required | Description |
|------|-----------|----------|-------------|
| `--channelId` | `-c` | Yes | ID of the channel to be subscribed |
| `--description` | `-d` | | Description of the subscription |
| `--output` | `-o` | | json\|yaml\|silent |
| `--subscriberChannelId` | `-s` | Yes | Subscriber's channel id |
| `--title` | `-t` | | Title of the subscription |
## Examples
```bash
# Subscribe to a channel
yutu subscription insert --subscriberChannelId UC_abc --channelId UC_x5XG1OV2P6uZZ5FSM9Ttw
# Subscribe with a title
yutu subscription insert --subscriberChannelId UC_abc --channelId UC_x5X --title 'Google Developers'
```
@@ -1,39 +0,0 @@
# Subscription List
List subscription information. Use this skill to list subscription information.
## Usage
```bash
yutu subscription list [flags]
```
## Flags
| Flag | Shorthand | Required | Description |
|------|-----------|----------|-------------|
| `--channelId` | `-c` | | Return the subscriptions of the given channel owner |
| `--forChannelId` | `-C` | | Return the subscriptions to the subset of these channels that the authenticated user is subscribed to |
| `--ids` | `-i` | | Return the subscriptions with the given ids for Stubby or Apiary |
| `--maxResults` | `-n` | | The maximum number of items that should be returned, 0 for no limit (default 5) |
| `--mine` | `-M` | | Return the subscriptions of the authenticated user (default true) |
| `--myRecentSubscribers` | `-R` | | true\|false\|null |
| `--mySubscribers` | `-S` | | Return the subscribers of the given channel owner |
| `--onBehalfOfContentOwner` | `-b` | | ID of the content owner, for YouTube content partners |
| `--onBehalfOfContentOwnerChannel` | `-B` | | YouTube channel ID linked to the content owner |
| `--order` | `-O` | | subscriptionOrderUnspecified\|relevance\|unread\|alphabetical (default "relevance") |
| `--output` | `-o` | | json\|yaml\|table (default "table") |
| `--parts` | `-p` | | Comma separated parts (default [id,snippet]) |
## Examples
```bash
# List my subscriptions
yutu subscription list --mine
# List subscriptions by channel ID with limit
yutu subscription list --channelId UC_x5XG1OV2P6uZZ5FSM9Ttw --maxResults 10
# List specific subscriptions in JSON format
yutu subscription list --ids abc123,def456 --output json
# List subscriptions for a channel alphabetically
yutu subscription list --forChannelId UC_x5XG1OV2P6uZZ5FSM9Ttw --order alphabetical
```
-48
View File
@@ -1,48 +0,0 @@
---
name: youtube-super-chat-event
description: "Manage YouTube Super Chat events. Use this skill to list Super Chat events for a channel. Useful when working with YouTube super chat event — provides commands to list super chat event via the yutu CLI. Includes setup and installation instructions for first-time users. Triggers: list super chat events, list super chat event, list my super chat event"
metadata:
openclaw:
requires:
env:
- YUTU_CREDENTIAL
- YUTU_CACHE_TOKEN
bins:
- yutu
config:
- client_secret.json
- youtube.token.json
primaryEnv: YUTU_CREDENTIAL
emoji: "\U0001F3AC\U0001F430"
homepage: https://github.com/eat-pray-ai/yutu
install:
- kind: node
package: "@eat-pray-ai/yutu"
bins: [yutu]
---
# YouTube Super Chat Event
Manage YouTube Super Chat events. Use this skill to list Super Chat events for a channel.
## Before You Begin
yutu requires Google Cloud Platform OAuth credentials and a cached token to access the YouTube API. If you haven't set up yutu yet, read the [setup guide](references/setup.md) first.
## Operations
Read the linked reference for full flag details and examples.
| Operation | Description | Reference |
|-----------|-------------|----------|
| list | List Super Chat events | [details](references/superChatEvent-list.md) |
## Quick Start
```bash
# Show all super chat event commands
yutu superChatEvent --help
# List super chat event
yutu superChatEvent list
```
@@ -1,65 +0,0 @@
<!-- Keep in sync with README.md Prerequisites and Installation sections. -->
# Yutu Setup Guide
Before using any yutu skill, you need to install `yutu` and configure YouTube API credentials.
## Prerequisites
An account on [Google Cloud Platform](https://console.cloud.google.com/) is required. Set up the following:
1. **Create a GCP Project** and enable these APIs under `APIs & Services -> Enable APIs and services`:
- [YouTube Data API v3](https://console.cloud.google.com/apis/api/youtube.googleapis.com/overview) (Required)
- [YouTube Analytics API](https://console.cloud.google.com/apis/api/youtubeanalytics.googleapis.com/overview) (Optional)
- [YouTube Reporting API](https://console.cloud.google.com/apis/api/youtubereporting.googleapis.com/overview) (Optional)
2. **Create OAuth credentials**:
- Go to `APIs & Services -> OAuth consent screen`, create a consent screen with yourself as a test user
- Go to `Credentials -> Create Credentials -> OAuth Client ID`, select `Web Application`
- Add `http://localhost:8216` as an authorized redirect URI
- Download the credential file and save it as `client_secret.json`
3. **Authenticate**:
```bash
yutu auth --credential client_secret.json
```
A browser window will open for you to grant YouTube access. After granting permission, a token is saved to `youtube.token.json`.
## Installation
Install `yutu` using one of these methods:
```bash
# Node.js (all platforms)
npm i -g @eat-pray-ai/yutu
# macOS
brew install yutu
# Linux
brew install yutu
# Windows
winget install yutu
# Gopher
go install github.com/eat-pray-ai/yutu@latest
```
### Other platforms
Download a prebuilt binary from the [releases page](https://github.com/eat-pray-ai/yutu/releases/latest) and place it in your PATH.
## Environment Variables
| Variable | Description | Default |
|----------|-------------|---------|
| `YUTU_CREDENTIAL` | Path, base64, or JSON of OAuth client secret | `client_secret.json` |
| `YUTU_CACHE_TOKEN` | Path, base64, or JSON of cached OAuth token | `youtube.token.json` |
| `YUTU_ROOT` | Root directory for file resolution | Current working directory |
| `YUTU_LOG_LEVEL` | Log level: `DEBUG`, `INFO`, `WARN`, `ERROR` | `INFO` |
For more details, see the [yutu README](https://github.com/eat-pray-ai/yutu#readme).
@@ -1,25 +0,0 @@
# Super Chat Event List
List Super Chat events. Use this skill to list Super Chat events.
## Usage
```bash
yutu superChatEvent list [flags]
```
## Flags
| Flag | Shorthand | Required | Description |
|------|-----------|----------|-------------|
| `--hl` | `-l` | | Return rendered funding amounts in specified language |
| `--maxResults` | `-n` | | The maximum number of items that should be returned, 0 for no limit (default 5) |
| `--output` | `-o` | | json\|yaml\|table (default "table") |
| `--parts` | `-p` | | Comma separated parts (default [id,snippet]) |
## Examples
```bash
# List Super Chat events
yutu superChatEvent list --maxResults 10
```
-45
View File
@@ -1,45 +0,0 @@
---
name: youtube-thumbnail
description: "Manage YouTube video thumbnails. Use this skill to set custom thumbnails for videos. Useful when working with YouTube thumbnail — provides commands to set thumbnail via the yutu CLI. Includes setup and installation instructions for first-time users. Triggers: set a thumbnail for a video, set thumbnail, set my thumbnail"
metadata:
openclaw:
requires:
env:
- YUTU_CREDENTIAL
- YUTU_CACHE_TOKEN
bins:
- yutu
config:
- client_secret.json
- youtube.token.json
primaryEnv: YUTU_CREDENTIAL
emoji: "\U0001F3AC\U0001F430"
homepage: https://github.com/eat-pray-ai/yutu
install:
- kind: node
package: "@eat-pray-ai/yutu"
bins: [yutu]
---
# YouTube Thumbnail
Manage YouTube video thumbnails. Use this skill to set custom thumbnails for videos.
## Before You Begin
yutu requires Google Cloud Platform OAuth credentials and a cached token to access the YouTube API. If you haven't set up yutu yet, read the [setup guide](references/setup.md) first.
## Operations
Read the linked reference for full flag details and examples.
| Operation | Description | Reference |
|-----------|-------------|----------|
| set | Set a thumbnail for a video | [details](references/thumbnail-set.md) |
## Quick Start
```bash
# Show all thumbnail commands
yutu thumbnail --help
```
@@ -1,65 +0,0 @@
<!-- Keep in sync with README.md Prerequisites and Installation sections. -->
# Yutu Setup Guide
Before using any yutu skill, you need to install `yutu` and configure YouTube API credentials.
## Prerequisites
An account on [Google Cloud Platform](https://console.cloud.google.com/) is required. Set up the following:
1. **Create a GCP Project** and enable these APIs under `APIs & Services -> Enable APIs and services`:
- [YouTube Data API v3](https://console.cloud.google.com/apis/api/youtube.googleapis.com/overview) (Required)
- [YouTube Analytics API](https://console.cloud.google.com/apis/api/youtubeanalytics.googleapis.com/overview) (Optional)
- [YouTube Reporting API](https://console.cloud.google.com/apis/api/youtubereporting.googleapis.com/overview) (Optional)
2. **Create OAuth credentials**:
- Go to `APIs & Services -> OAuth consent screen`, create a consent screen with yourself as a test user
- Go to `Credentials -> Create Credentials -> OAuth Client ID`, select `Web Application`
- Add `http://localhost:8216` as an authorized redirect URI
- Download the credential file and save it as `client_secret.json`
3. **Authenticate**:
```bash
yutu auth --credential client_secret.json
```
A browser window will open for you to grant YouTube access. After granting permission, a token is saved to `youtube.token.json`.
## Installation
Install `yutu` using one of these methods:
```bash
# Node.js (all platforms)
npm i -g @eat-pray-ai/yutu
# macOS
brew install yutu
# Linux
brew install yutu
# Windows
winget install yutu
# Gopher
go install github.com/eat-pray-ai/yutu@latest
```
### Other platforms
Download a prebuilt binary from the [releases page](https://github.com/eat-pray-ai/yutu/releases/latest) and place it in your PATH.
## Environment Variables
| Variable | Description | Default |
|----------|-------------|---------|
| `YUTU_CREDENTIAL` | Path, base64, or JSON of OAuth client secret | `client_secret.json` |
| `YUTU_CACHE_TOKEN` | Path, base64, or JSON of cached OAuth token | `youtube.token.json` |
| `YUTU_ROOT` | Root directory for file resolution | Current working directory |
| `YUTU_LOG_LEVEL` | Log level: `DEBUG`, `INFO`, `WARN`, `ERROR` | `INFO` |
For more details, see the [yutu README](https://github.com/eat-pray-ai/yutu#readme).
@@ -1,26 +0,0 @@
# Thumbnail Set
Set a thumbnail for a video. Use this skill to set a thumbnail for a video.
## Usage
```bash
yutu thumbnail set [flags]
```
## Flags
| Flag | Shorthand | Required | Description |
|------|-----------|----------|-------------|
| `--file` | `-f` | Yes | Path to the thumbnail file |
| `--output` | `-o` | | json\|yaml\|silent |
| `--videoId` | `-v` | Yes | ID of the video |
## Examples
```bash
# Set a thumbnail for a video
yutu thumbnail set --file image.jpg --videoId dQw4w9WgXcQ
# Set a thumbnail with JSON output
yutu thumbnail set --file image.png --videoId dQw4w9WgXcQ --output json
```
@@ -1,48 +0,0 @@
---
name: youtube-video-abuse-report-reason
description: "Manage YouTube video abuse report reasons. Use this skill to list available abuse report reasons. Useful when working with YouTube video abuse report reason — provides commands to list video abuse report reason via the yutu CLI. Includes setup and installation instructions for first-time users. Triggers: list video abuse report reasons, list video abuse report reason, list my video abuse report reason"
metadata:
openclaw:
requires:
env:
- YUTU_CREDENTIAL
- YUTU_CACHE_TOKEN
bins:
- yutu
config:
- client_secret.json
- youtube.token.json
primaryEnv: YUTU_CREDENTIAL
emoji: "\U0001F3AC\U0001F430"
homepage: https://github.com/eat-pray-ai/yutu
install:
- kind: node
package: "@eat-pray-ai/yutu"
bins: [yutu]
---
# YouTube Video Abuse Report Reason
Manage YouTube video abuse report reasons. Use this skill to list available abuse report reasons.
## Before You Begin
yutu requires Google Cloud Platform OAuth credentials and a cached token to access the YouTube API. If you haven't set up yutu yet, read the [setup guide](references/setup.md) first.
## Operations
Read the linked reference for full flag details and examples.
| Operation | Description | Reference |
|-----------|-------------|----------|
| list | List video abuse report reasons | [details](references/videoAbuseReportReason-list.md) |
## Quick Start
```bash
# Show all video abuse report reason commands
yutu videoAbuseReportReason --help
# List video abuse report reason
yutu videoAbuseReportReason list
```
@@ -1,65 +0,0 @@
<!-- Keep in sync with README.md Prerequisites and Installation sections. -->
# Yutu Setup Guide
Before using any yutu skill, you need to install `yutu` and configure YouTube API credentials.
## Prerequisites
An account on [Google Cloud Platform](https://console.cloud.google.com/) is required. Set up the following:
1. **Create a GCP Project** and enable these APIs under `APIs & Services -> Enable APIs and services`:
- [YouTube Data API v3](https://console.cloud.google.com/apis/api/youtube.googleapis.com/overview) (Required)
- [YouTube Analytics API](https://console.cloud.google.com/apis/api/youtubeanalytics.googleapis.com/overview) (Optional)
- [YouTube Reporting API](https://console.cloud.google.com/apis/api/youtubereporting.googleapis.com/overview) (Optional)
2. **Create OAuth credentials**:
- Go to `APIs & Services -> OAuth consent screen`, create a consent screen with yourself as a test user
- Go to `Credentials -> Create Credentials -> OAuth Client ID`, select `Web Application`
- Add `http://localhost:8216` as an authorized redirect URI
- Download the credential file and save it as `client_secret.json`
3. **Authenticate**:
```bash
yutu auth --credential client_secret.json
```
A browser window will open for you to grant YouTube access. After granting permission, a token is saved to `youtube.token.json`.
## Installation
Install `yutu` using one of these methods:
```bash
# Node.js (all platforms)
npm i -g @eat-pray-ai/yutu
# macOS
brew install yutu
# Linux
brew install yutu
# Windows
winget install yutu
# Gopher
go install github.com/eat-pray-ai/yutu@latest
```
### Other platforms
Download a prebuilt binary from the [releases page](https://github.com/eat-pray-ai/yutu/releases/latest) and place it in your PATH.
## Environment Variables
| Variable | Description | Default |
|----------|-------------|---------|
| `YUTU_CREDENTIAL` | Path, base64, or JSON of OAuth client secret | `client_secret.json` |
| `YUTU_CACHE_TOKEN` | Path, base64, or JSON of cached OAuth token | `youtube.token.json` |
| `YUTU_ROOT` | Root directory for file resolution | Current working directory |
| `YUTU_LOG_LEVEL` | Log level: `DEBUG`, `INFO`, `WARN`, `ERROR` | `INFO` |
For more details, see the [yutu README](https://github.com/eat-pray-ai/yutu#readme).
@@ -1,24 +0,0 @@
# Video Abuse Report Reason List
List video abuse report reasons. Use this skill to list available abuse report reasons.
## Usage
```bash
yutu videoAbuseReportReason list [flags]
```
## Flags
| Flag | Shorthand | Required | Description |
|------|-----------|----------|-------------|
| `--hl` | `-l` | | Host language |
| `--output` | `-o` | | json\|yaml\|table (default "table") |
| `--parts` | `-p` | | Comma separated parts (default [id,snippet]) |
## Examples
```bash
# List video abuse report reasons
yutu videoAbuseReportReason list --hl en
```
-48
View File
@@ -1,48 +0,0 @@
---
name: youtube-video-category
description: "Manage YouTube video categories. Use this skill to list available video categories. Useful when working with YouTube video category — provides commands to list video category via the yutu CLI. Includes setup and installation instructions for first-time users. Triggers: list video categories, list video category, list my video category"
metadata:
openclaw:
requires:
env:
- YUTU_CREDENTIAL
- YUTU_CACHE_TOKEN
bins:
- yutu
config:
- client_secret.json
- youtube.token.json
primaryEnv: YUTU_CREDENTIAL
emoji: "\U0001F3AC\U0001F430"
homepage: https://github.com/eat-pray-ai/yutu
install:
- kind: node
package: "@eat-pray-ai/yutu"
bins: [yutu]
---
# YouTube Video Category
Manage YouTube video categories. Use this skill to list available video categories.
## Before You Begin
yutu requires Google Cloud Platform OAuth credentials and a cached token to access the YouTube API. If you haven't set up yutu yet, read the [setup guide](references/setup.md) first.
## Operations
Read the linked reference for full flag details and examples.
| Operation | Description | Reference |
|-----------|-------------|----------|
| list | List video categories | [details](references/videoCategory-list.md) |
## Quick Start
```bash
# Show all video category commands
yutu videoCategory --help
# List video category
yutu videoCategory list
```
@@ -1,65 +0,0 @@
<!-- Keep in sync with README.md Prerequisites and Installation sections. -->
# Yutu Setup Guide
Before using any yutu skill, you need to install `yutu` and configure YouTube API credentials.
## Prerequisites
An account on [Google Cloud Platform](https://console.cloud.google.com/) is required. Set up the following:
1. **Create a GCP Project** and enable these APIs under `APIs & Services -> Enable APIs and services`:
- [YouTube Data API v3](https://console.cloud.google.com/apis/api/youtube.googleapis.com/overview) (Required)
- [YouTube Analytics API](https://console.cloud.google.com/apis/api/youtubeanalytics.googleapis.com/overview) (Optional)
- [YouTube Reporting API](https://console.cloud.google.com/apis/api/youtubereporting.googleapis.com/overview) (Optional)
2. **Create OAuth credentials**:
- Go to `APIs & Services -> OAuth consent screen`, create a consent screen with yourself as a test user
- Go to `Credentials -> Create Credentials -> OAuth Client ID`, select `Web Application`
- Add `http://localhost:8216` as an authorized redirect URI
- Download the credential file and save it as `client_secret.json`
3. **Authenticate**:
```bash
yutu auth --credential client_secret.json
```
A browser window will open for you to grant YouTube access. After granting permission, a token is saved to `youtube.token.json`.
## Installation
Install `yutu` using one of these methods:
```bash
# Node.js (all platforms)
npm i -g @eat-pray-ai/yutu
# macOS
brew install yutu
# Linux
brew install yutu
# Windows
winget install yutu
# Gopher
go install github.com/eat-pray-ai/yutu@latest
```
### Other platforms
Download a prebuilt binary from the [releases page](https://github.com/eat-pray-ai/yutu/releases/latest) and place it in your PATH.
## Environment Variables
| Variable | Description | Default |
|----------|-------------|---------|
| `YUTU_CREDENTIAL` | Path, base64, or JSON of OAuth client secret | `client_secret.json` |
| `YUTU_CACHE_TOKEN` | Path, base64, or JSON of cached OAuth token | `youtube.token.json` |
| `YUTU_ROOT` | Root directory for file resolution | Current working directory |
| `YUTU_LOG_LEVEL` | Log level: `DEBUG`, `INFO`, `WARN`, `ERROR` | `INFO` |
For more details, see the [yutu README](https://github.com/eat-pray-ai/yutu#readme).
@@ -1,19 +0,0 @@
# Video Category List
List video categories. Use this skill to list available video categories.
## Usage
```bash
yutu videoCategory list [flags]
```
## Flags
| Flag | Shorthand | Required | Description |
|------|-----------|----------|-------------|
| `--hl` | `-l` | | Host language |
| `--ids` | `-i` | | IDs of the video categories |
| `--output` | `-o` | | json\|yaml\|table (default "table") |
| `--parts` | `-p` | | Comma separated parts (default [id,snippet]) |
| `--regionCode` | `-r` | | Region code (default "US") |
-54
View File
@@ -1,54 +0,0 @@
---
name: youtube-video
description: "Manage YouTube videos. Use this skill to list, upload, update, delete, get rating, or report videos. Useful when working with YouTube video — provides commands to delete, getRating, insert, list, rate, reportAbuse, and update video via the yutu CLI. Includes setup and installation instructions for first-time users. Triggers: delete videos, delete video, delete my video, get video ratings, getRating video, getRating my video, upload a video, insert video, insert my video, list video information, list video, list my video, rate a video, rate video, rate my video, report abuse on a video, reportAbuse video, reportAbuse my video, update a video, update video, update my video"
metadata:
openclaw:
requires:
env:
- YUTU_CREDENTIAL
- YUTU_CACHE_TOKEN
bins:
- yutu
config:
- client_secret.json
- youtube.token.json
primaryEnv: YUTU_CREDENTIAL
emoji: "\U0001F3AC\U0001F430"
homepage: https://github.com/eat-pray-ai/yutu
install:
- kind: node
package: "@eat-pray-ai/yutu"
bins: [yutu]
---
# YouTube Video
Manage YouTube videos. Use this skill to list, upload, update, delete, get rating, or report videos.
## Before You Begin
yutu requires Google Cloud Platform OAuth credentials and a cached token to access the YouTube API. If you haven't set up yutu yet, read the [setup guide](references/setup.md) first.
## Operations
Read the linked reference for full flag details and examples.
| Operation | Description | Reference |
|-----------|-------------|----------|
| delete | Delete videos | [details](references/video-delete.md) |
| getRating | Get video ratings | [details](references/video-getRating.md) |
| insert | Upload a video | [details](references/video-insert.md) |
| list | List video information | [details](references/video-list.md) |
| rate | Rate a video | [details](references/video-rate.md) |
| reportAbuse | Report abuse on a video | [details](references/video-reportAbuse.md) |
| update | Update a video | [details](references/video-update.md) |
## Quick Start
```bash
# Show all video commands
yutu video --help
# List video
yutu video list
```
-65
View File
@@ -1,65 +0,0 @@
<!-- Keep in sync with README.md Prerequisites and Installation sections. -->
# Yutu Setup Guide
Before using any yutu skill, you need to install `yutu` and configure YouTube API credentials.
## Prerequisites
An account on [Google Cloud Platform](https://console.cloud.google.com/) is required. Set up the following:
1. **Create a GCP Project** and enable these APIs under `APIs & Services -> Enable APIs and services`:
- [YouTube Data API v3](https://console.cloud.google.com/apis/api/youtube.googleapis.com/overview) (Required)
- [YouTube Analytics API](https://console.cloud.google.com/apis/api/youtubeanalytics.googleapis.com/overview) (Optional)
- [YouTube Reporting API](https://console.cloud.google.com/apis/api/youtubereporting.googleapis.com/overview) (Optional)
2. **Create OAuth credentials**:
- Go to `APIs & Services -> OAuth consent screen`, create a consent screen with yourself as a test user
- Go to `Credentials -> Create Credentials -> OAuth Client ID`, select `Web Application`
- Add `http://localhost:8216` as an authorized redirect URI
- Download the credential file and save it as `client_secret.json`
3. **Authenticate**:
```bash
yutu auth --credential client_secret.json
```
A browser window will open for you to grant YouTube access. After granting permission, a token is saved to `youtube.token.json`.
## Installation
Install `yutu` using one of these methods:
```bash
# Node.js (all platforms)
npm i -g @eat-pray-ai/yutu
# macOS
brew install yutu
# Linux
brew install yutu
# Windows
winget install yutu
# Gopher
go install github.com/eat-pray-ai/yutu@latest
```
### Other platforms
Download a prebuilt binary from the [releases page](https://github.com/eat-pray-ai/yutu/releases/latest) and place it in your PATH.
## Environment Variables
| Variable | Description | Default |
|----------|-------------|---------|
| `YUTU_CREDENTIAL` | Path, base64, or JSON of OAuth client secret | `client_secret.json` |
| `YUTU_CACHE_TOKEN` | Path, base64, or JSON of cached OAuth token | `youtube.token.json` |
| `YUTU_ROOT` | Root directory for file resolution | Current working directory |
| `YUTU_LOG_LEVEL` | Log level: `DEBUG`, `INFO`, `WARN`, `ERROR` | `INFO` |
For more details, see the [yutu README](https://github.com/eat-pray-ai/yutu#readme).
@@ -1,24 +0,0 @@
# Video Delete
Delete videos. Use this skill to delete videos by IDs.
## Usage
```bash
yutu video delete [flags]
```
## Flags
| Flag | Shorthand | Required | Description |
|------|-----------|----------|-------------|
| `--ids` | `-i` | Yes | IDs of the videos to delete |
## Examples
```bash
# Delete a video by ID
yutu video delete --ids dQw4w9WgXcQ
# Delete multiple videos
yutu video delete --ids dQw4w9WgXcQ,abc123
```
@@ -1,26 +0,0 @@
# Video GetRating
Get video ratings. Use this skill to get video ratings by IDs.
## Usage
```bash
yutu video getRating [flags]
```
## Flags
| Flag | Shorthand | Required | Description |
|------|-----------|----------|-------------|
| `--ids` | `-i` | Yes | IDs of the videos to get the rating for |
| `--onBehalfOfContentOwner` | `-b` | | ID of the content owner, for YouTube content partners |
| `--output` | `-o` | | json\|yaml\|table |
## Examples
```bash
# Get rating of a video
yutu video getRating --ids dQw4w9WgXcQ
# Get ratings of multiple videos in JSON format
yutu video getRating --ids dQw4w9WgXcQ,abc123 --output json
```
@@ -1,46 +0,0 @@
# Video Insert
Upload a video. Use this skill to upload a video.
## Usage
```bash
yutu video insert [flags]
```
## Flags
| Flag | Shorthand | Required | Description |
|------|-----------|----------|-------------|
| `--autoLevels` | `-A` | | Should auto-levels be applied to the upload (default true) |
| `--categoryId` | `-g` | Yes | Category of the video |
| `--channelId` | `-c` | | Channel id of the video |
| `--description` | `-d` | | Description of the video |
| `--embeddable` | `-E` | | Whether the video is embeddable (default true) |
| `--file` | `-f` | Yes | Path to the video file |
| `--forKids` | `-K` | | Whether the video is for kids |
| `--language` | `-l` | | Language of the video |
| `--license` | `-L` | | youtube\|creativeCommon (default "youtube") |
| `--notifySubscribers` | `-N` | | Notify the channel subscribers about the new video (default true) |
| `--onBehalfOfContentOwner` | `-b` | | ID of the content owner, for YouTube content partners |
| `--onBehalfOfContentOwnerChannel` | `-B` | | YouTube channel ID linked to the content owner |
| `--output` | `-o` | | json\|yaml\|silent |
| `--playlistId` | `-y` | | Playlist id of the video |
| `--privacy` | `-p` | Yes | public\|private\|unlisted |
| `--publicStatsViewable` | `-P` | | Whether the extended video statistics can be viewed by everyone |
| `--publishAt` | `-U` | | Datetime when the video is scheduled to publish |
| `--stabilize` | `-S` | | Should stabilize be applied to the upload (default true) |
| `--tags` | `-a` | | Comma separated tags |
| `--thumbnail` | `-u` | | Path to the thumbnail file |
| `--title` | `-t` | | Title of the video |
## Examples
```bash
# Upload a public video
yutu video insert --file video.mp4 --title 'My Video' --categoryId 22 --privacy public
# Upload a private video with tags
yutu video insert --file video.mp4 --title 'Tutorial' --categoryId 27 --privacy private --tags 'go,tutorial'
# Upload an unlisted video with custom thumbnail
yutu video insert --file video.mp4 --title 'Music Video' --categoryId 10 --privacy unlisted --thumbnail cover.jpg
```
@@ -1,40 +0,0 @@
# Video List
List video information. Use this skill to list video information.
## Usage
```bash
yutu video list [flags]
```
## Flags
| Flag | Shorthand | Required | Description |
|------|-----------|----------|-------------|
| `--chart` | `-c` | | chartUnspecified\|mostPopular |
| `--hl` | `-l` | | Specifies the localization language |
| `--ids` | `-i` | | Return videos with the given ids |
| `--locale` | `-L` | | Locale of the video metadata to return |
| `--maxHeight` | `-H` | | Max height of the embedded player in pixels |
| `--maxResults` | `-n` | | The maximum number of items that should be returned, 0 for no limit (default 5) |
| `--maxWidth` | `-W` | | Max width of the embedded player in pixels |
| `--myRating` | `-R` | | Return videos liked/disliked by the authenticated user |
| `--onBehalfOfContentOwner` | `-b` | | ID of the content owner, for YouTube content partners |
| `--output` | `-o` | | json\|yaml\|table (default "table") |
| `--parts` | `-p` | | Comma separated parts (default [id,snippet,status,statistics]) |
| `--regionCode` | `-r` | | Specific to the specified region |
| `--videoCategoryId` | `-g` | | Category of the video |
## Examples
```bash
# List a video by ID
yutu video list --ids IBju0NwjQRc
# List multiple videos in JSON format
yutu video list --ids IBju0NwjQRc,wZ9z3FUuNvQ --output json
# List most popular videos by region
yutu video list --chart mostPopular --regionCode US --maxResults 10
# List my liked videos
yutu video list --myRating like --output yaml
```
@@ -1,27 +0,0 @@
# Video Rate
Rate a video. Use this skill to rate a video.
## Usage
```bash
yutu video rate [flags]
```
## Flags
| Flag | Shorthand | Required | Description |
|------|-----------|----------|-------------|
| `--ids` | `-i` | Yes | IDs of the videos to rate |
| `--rating` | `-r` | Yes | like\|dislike\|none |
## Examples
```bash
# Like a video
yutu video rate --ids dQw4w9WgXcQ --rating like
# Dislike multiple videos
yutu video rate --ids dQw4w9WgXcQ,abc123 --rating dislike
# Remove rating from a video
yutu video rate --ids dQw4w9WgXcQ --rating none
```
@@ -1,31 +0,0 @@
# Video ReportAbuse
Report abuse on a video. Use this skill to report abuse on a video.
## Usage
```bash
yutu video reportAbuse [flags]
```
## Flags
| Flag | Shorthand | Required | Description |
|------|-----------|----------|-------------|
| `--comments` | `-c` | | Additional comments regarding the abuse report |
| `--ids` | `-i` | Yes | IDs of the videos to report abuse on |
| `--language` | `-l` | | Language that the content was viewed in |
| `--onBehalfOfContentOwner` | `-b` | | ID of the content owner, for YouTube content partners |
| `--reasonId` | `-r` | Yes | ID of the reason for reporting abuse |
| `--secondaryReasonId` | `-s` | | ID of the secondary reason for reporting abuse |
## Examples
```bash
# Report abuse on a video
yutu video reportAbuse --ids dQw4w9WgXcQ --reasonId V
# Report abuse with secondary reason and language
yutu video reportAbuse --ids dQw4w9WgXcQ --reasonId V --secondaryReasonId V1 --language en
# Report abuse with comments
yutu video reportAbuse --ids dQw4w9WgXcQ --reasonId N --comments 'Spam content'
```
@@ -1,37 +0,0 @@
# Video Update
Update a video. Use this skill to update a video.
## Usage
```bash
yutu video update [flags]
```
## Flags
| Flag | Shorthand | Required | Description |
|------|-----------|----------|-------------|
| `--categoryId` | `-g` | | Category of the video |
| `--description` | `-d` | | Description of the video |
| `--embeddable` | `-E` | | Whether the video is embeddable (default true) |
| `--id` | `-i` | Yes | ID of the video to update |
| `--language` | `-l` | | Language of the video |
| `--license` | `-L` | | youtube\|creativeCommon (default "youtube") |
| `--output` | `-o` | | json\|yaml\|silent |
| `--playlistId` | `-y` | | Playlist id of the video |
| `--privacy` | `-p` | | public\|private\|unlisted |
| `--tags` | `-a` | | Comma separated tags |
| `--thumbnail` | `-u` | | Path to the thumbnail file |
| `--title` | `-t` | | Title of the video |
## Examples
```bash
# Update video title
yutu video update --id dQw4w9WgXcQ --title 'New Title'
# Update video description and privacy
yutu video update --id dQw4w9WgXcQ --description 'Updated description' --privacy public
# Update video tags and category
yutu video update --id dQw4w9WgXcQ --tags 'music,pop,2024' --categoryId 10
```
-46
View File
@@ -1,46 +0,0 @@
---
name: youtube-watermark
description: "Manage YouTube watermarks. Use this skill to set or unset watermarks for channel videos. Useful when working with YouTube watermark — provides commands to set and unset watermark via the yutu CLI. Includes setup and installation instructions for first-time users. Triggers: set a watermark for channel's videos, set watermark, set my watermark, unset a watermark for channel's videos, unset watermark, unset my watermark"
metadata:
openclaw:
requires:
env:
- YUTU_CREDENTIAL
- YUTU_CACHE_TOKEN
bins:
- yutu
config:
- client_secret.json
- youtube.token.json
primaryEnv: YUTU_CREDENTIAL
emoji: "\U0001F3AC\U0001F430"
homepage: https://github.com/eat-pray-ai/yutu
install:
- kind: node
package: "@eat-pray-ai/yutu"
bins: [yutu]
---
# YouTube Watermark
Manage YouTube watermarks. Use this skill to set or unset watermarks for channel videos.
## Before You Begin
yutu requires Google Cloud Platform OAuth credentials and a cached token to access the YouTube API. If you haven't set up yutu yet, read the [setup guide](references/setup.md) first.
## Operations
Read the linked reference for full flag details and examples.
| Operation | Description | Reference |
|-----------|-------------|----------|
| set | Set a watermark for channel's videos | [details](references/watermark-set.md) |
| unset | Unset a watermark for channel's videos | [details](references/watermark-unset.md) |
## Quick Start
```bash
# Show all watermark commands
yutu watermark --help
```
@@ -1,65 +0,0 @@
<!-- Keep in sync with README.md Prerequisites and Installation sections. -->
# Yutu Setup Guide
Before using any yutu skill, you need to install `yutu` and configure YouTube API credentials.
## Prerequisites
An account on [Google Cloud Platform](https://console.cloud.google.com/) is required. Set up the following:
1. **Create a GCP Project** and enable these APIs under `APIs & Services -> Enable APIs and services`:
- [YouTube Data API v3](https://console.cloud.google.com/apis/api/youtube.googleapis.com/overview) (Required)
- [YouTube Analytics API](https://console.cloud.google.com/apis/api/youtubeanalytics.googleapis.com/overview) (Optional)
- [YouTube Reporting API](https://console.cloud.google.com/apis/api/youtubereporting.googleapis.com/overview) (Optional)
2. **Create OAuth credentials**:
- Go to `APIs & Services -> OAuth consent screen`, create a consent screen with yourself as a test user
- Go to `Credentials -> Create Credentials -> OAuth Client ID`, select `Web Application`
- Add `http://localhost:8216` as an authorized redirect URI
- Download the credential file and save it as `client_secret.json`
3. **Authenticate**:
```bash
yutu auth --credential client_secret.json
```
A browser window will open for you to grant YouTube access. After granting permission, a token is saved to `youtube.token.json`.
## Installation
Install `yutu` using one of these methods:
```bash
# Node.js (all platforms)
npm i -g @eat-pray-ai/yutu
# macOS
brew install yutu
# Linux
brew install yutu
# Windows
winget install yutu
# Gopher
go install github.com/eat-pray-ai/yutu@latest
```
### Other platforms
Download a prebuilt binary from the [releases page](https://github.com/eat-pray-ai/yutu/releases/latest) and place it in your PATH.
## Environment Variables
| Variable | Description | Default |
|----------|-------------|---------|
| `YUTU_CREDENTIAL` | Path, base64, or JSON of OAuth client secret | `client_secret.json` |
| `YUTU_CACHE_TOKEN` | Path, base64, or JSON of cached OAuth token | `youtube.token.json` |
| `YUTU_ROOT` | Root directory for file resolution | Current working directory |
| `YUTU_LOG_LEVEL` | Log level: `DEBUG`, `INFO`, `WARN`, `ERROR` | `INFO` |
For more details, see the [yutu README](https://github.com/eat-pray-ai/yutu#readme).
@@ -1,32 +0,0 @@
# Watermark Set
Set a watermark for channel's videos. Use this skill to set a watermark for channel's videos.
## Usage
```bash
yutu watermark set [flags]
```
## Flags
| Flag | Shorthand | Required | Description |
|------|-----------|----------|-------------|
| `--channelId` | `-c` | Yes | ID of the channel |
| `--durationMs` | `-d` | | Duration in milliseconds for which the watermark should be displayed |
| `--file` | `-f` | Yes | Path to the watermark file |
| `--inVideoPosition` | `-p` | | topLeft\|topRight\|bottomLeft\|bottomRight |
| `--offsetMs` | `-m` | | Defines the time at which the watermark will appear |
| `--offsetType` | `-t` | | offsetFromStart\|offsetFromEnd |
| `--onBehalfOfContentOwner` | `-b` | | ID of the content owner, for YouTube content partners |
## Examples
```bash
# Set a watermark for a channel
yutu watermark set --channelId UC_x5XG1OV2P6uZZ5FSM9Ttw --file watermark.png
# Set a watermark with position and offset
yutu watermark set --channelId UC_x5X --file logo.png --inVideoPosition bottomRight --offsetType offsetFromEnd --offsetMs 1000
# Set a watermark with duration
yutu watermark set --channelId UC_x5X --file logo.png --durationMs 5000 --offsetMs 2000
```
@@ -1,22 +0,0 @@
# Watermark Unset
Unset a watermark for channel's videos. Use this skill to unset a watermark for a channel's videos.
## Usage
```bash
yutu watermark unset [flags]
```
## Flags
| Flag | Shorthand | Required | Description |
|------|-----------|----------|-------------|
| `--channelId` | `-c` | Yes | ID of the channel |
## Examples
```bash
# Unset watermark for a channel
yutu watermark unset --channelId UC_x5XG1OV2P6uZZ5FSM9Ttw
```
+140
View File
@@ -0,0 +1,140 @@
---
name: youtube
description: "Use when working with YouTube — upload videos, search content, manage playlists and channels, post and moderate comments, handle subscriptions and memberships, add captions, set thumbnails, check analytics, or any YouTube Data API operation via the yutu CLI."
metadata:
openclaw:
requires:
env:
- YUTU_CREDENTIAL
- YUTU_CACHE_TOKEN
bins:
- yutu
config:
- client_secret.json
- youtube.token.json
primaryEnv: YUTU_CREDENTIAL
emoji: "\U0001F3AC\U0001F430"
homepage: https://github.com/eat-pray-ai/yutu
install:
- kind: node
package: "@eat-pray-ai/yutu"
bins: [yutu]
---
# YouTube
Manage YouTube resources using the yutu CLI — videos, playlists, comments, channels, captions, subscriptions, and more.
## Before You Begin
yutu requires Google Cloud Platform OAuth credentials and a cached token to access the YouTube API. If you haven't set up yutu yet, read the [setup guide](references/setup.md) first.
## Operations
Run `yutu <resource> <verb> -h` for full flag details and examples.
### Content
| Resource | Operation | Description |
|----------|-----------|-------------|
| caption | delete | Delete captions |
| caption | download | Download a caption |
| caption | insert | Insert a caption |
| caption | list | List captions |
| caption | update | Update a video caption |
| thumbnail | set | Set a thumbnail for a video |
| video | delete | Delete videos |
| video | getRating | Get video ratings |
| video | insert | Upload a video |
| video | list | List video information |
| video | rate | Rate a video |
| video | reportAbuse | Report abuse on a video |
| video | update | Update a video |
| watermark | set | Set a watermark for channel's videos |
| watermark | unset | Unset a watermark for channel's videos |
### Organization
| Resource | Operation | Description |
|----------|-----------|-------------|
| playlist | delete | Delete playlists |
| playlist | insert | Create a new playlist |
| playlist | list | List playlist information |
| playlist | update | Update a playlist |
| playlist image | delete | Delete playlist images |
| playlist image | insert | Insert a playlist image |
| playlist image | list | List playlist images |
| playlist image | update | Update a playlist image |
| playlist item | delete | Delete items from a playlist |
| playlist item | insert | Insert a playlist item into a playlist |
| playlist item | list | List playlist items |
| playlist item | update | Update a playlist item |
### Community
| Resource | Operation | Description |
|----------|-----------|-------------|
| comment | delete | Delete comments |
| comment | insert | Create a comment |
| comment | list | List comments |
| comment | markAsSpam | Mark comments as spam |
| comment | setModerationStatus | Set comment moderation status |
| comment | update | Update a comment on a video |
| comment thread | insert | Insert a new comment thread |
| comment thread | list | List comment threads |
| member | list | List channel members |
| memberships level | list | List memberships levels |
| subscription | delete | Delete subscriptions |
| subscription | insert | Insert a new subscription |
| subscription | list | List subscription information |
| super chat event | list | List Super Chat events |
### Channel
| Resource | Operation | Description |
|----------|-----------|-------------|
| channel | list | List channel information |
| channel | update | Update channel information |
| channel banner | insert | Insert a channel banner |
| channel section | delete | Delete channel sections |
| channel section | list | List channel sections |
### Discovery
| Resource | Operation | Description |
|----------|-----------|-------------|
| activity | list | List activities |
| search | list | Search resources |
### Metadata
| Resource | Operation | Description |
|----------|-----------|-------------|
| i18n language | list | List i18n languages |
| i18n region | list | List i18n regions |
| video abuse report reason | list | List video abuse report reasons |
| video category | list | List video categories |
## Common Workflows
See [references/workflows.md](references/workflows.md) for detailed walkthroughs.
- **Upload a video**: `yutu video insert --file video.mp4 --title "..." --privacy public`, then optionally set thumbnail
- **Update video metadata**: Fetch current with `yutu video list --id VIDEO_ID`, then update changed fields
- **Create playlist + add videos**: Create with `yutu playlist insert`, find videos with `yutu search list --forMine`, add with `yutu playlistItem insert`
- **Post a comment**: Get channel ID with `yutu channel list --mine`, find video, then `yutu commentThread insert`
- **Channel analytics**: `yutu channel list --mine` + `yutu search list --forMine` + `yutu video list --id ...`
- **Competitor analysis**: `yutu channel list --forHandle @handle` + compare stats and top videos
- **Delete content**: Always verify with a list command first, then delete — deletions are irreversible
- **Subscribe/unsubscribe**: Check with `yutu subscription list --mine --forChannelId ...` before acting
## YouTube Growth Tips
See [references/seo-guide.md](references/seo-guide.md) for the full guide.
- **Titles**: Use curiosity gaps and power words. Front-load keywords. Keep under 60 characters.
- **Descriptions**: First 2 lines appear in search. Include keywords, timestamps, CTAs, and 3-5 hashtags.
- **Tags**: Mix broad and long-tail keywords. First 2-3 tags carry the most weight.
- **Thumbnails**: High contrast, 3-4 word text, expressive faces, consistent branding.
- **Publishing**: Post when audience is active. Maintain consistent schedule.
- **Engagement**: Pin a comment with a question. Reply within the first hour.
Loaded 100 of 103 files, more files were not shown because too many files have changed in this diff. Show more