vodular/main.go

121 lines
2.5 KiB
Go

package main
import (
"context"
"encoding/json"
"fmt"
"os"
toml "github.com/pelletier/go-toml/v2"
"google.golang.org/api/option"
"google.golang.org/api/youtube/v3"
)
type (
Config struct {
Google GoogleConfig `toml:"google"`
}
GoogleConfig struct {
ApiKey string `toml:"api_key"`
ClientID string `toml:"client_id"`
ClientSecret string `toml:"client_secret"`
}
)
var DEFAULT_TAGS = []string{
"ari melody",
"ari melody LIVE",
"livestream",
"vtuber",
"twitch",
"gaming",
"let's play",
"full VOD",
"VOD",
"stream",
"archive",
}
const (
CATEGORY_GAMING = "20"
)
func main() {
if len(os.Args) < 2 {
fmt.Printf("usage: %s <video ID>\n", os.Args[0])
os.Exit(0)
}
// videoID := os.Args[1]
cfgBytes, err := os.ReadFile("config.toml")
if err != nil {
fmt.Fprintf(os.Stderr, "fatal: failed to read config file: %s\n", err.Error())
os.Exit(1)
}
cfg := Config{}
err = toml.Unmarshal(cfgBytes, &cfg)
if err != nil {
fmt.Fprintf(os.Stderr, "fatal: failed to parse config: %s\n", err.Error())
os.Exit(1)
}
ctx := context.Background()
service, err := youtube.NewService(
ctx,
option.WithScopes(youtube.YoutubeUploadScope),
option.WithAPIKey(cfg.Google.ApiKey),
)
if err != nil {
fmt.Fprintf(os.Stderr, "fatal: failed to create youtube service: %s\n", err.Error())
os.Exit(1)
}
videoService := youtube.NewVideosService(service)
// get video by ID
{
// call := service.Videos.List([]string{
// "snippet", "contentDetails", "statistics", "status",
// }).Id(videoID)
// res, err := call.Do()
// if err != nil {
// fmt.Fprintf(os.Stderr, "fatal: failed to request videos list: %s\n", err.Error())
// os.Exit(1)
// }
// data, err := json.MarshalIndent(res, "", " ")
// if err != nil {
// fmt.Fprintf(os.Stderr, "fatal: failed to marshal json: %s\n", err.Error())
// os.Exit(1)
// }
// fmt.Println(string(data))
}
call := videoService.Insert([]string{
"snippet", "status",
}, &youtube.Video{
Snippet: &youtube.VideoSnippet{
Title: "Untitled Video",
Description: "No description",
Tags: DEFAULT_TAGS,
CategoryId: CATEGORY_GAMING, // gaming
},
}).NotifySubscribers(false)
// TODO: call.Media()
video, err := call.Do()
if err != nil {
fmt.Fprintf(os.Stderr, "fatal: failed to upload video: %s\n", err.Error())
os.Exit(1)
}
data, err := json.MarshalIndent(video, "", " ")
if err != nil {
fmt.Fprintf(os.Stderr, "fatal: failed to marshal video data json: %s\n", err.Error())
os.Exit(1)
}
fmt.Println(string(data))
}