package main import ( "context" "fmt" "log" "os" "strings" "path/filepath" "encoding/base64" "os/exec" "golang.org/x/oauth2/google" "google.golang.org/api/gmail/v1" "google.golang.org/api/option" ) const CREDENTIALS_DIR = "creds" const TOKEN_FILE = "token.json" const CREDENTIALS_FILE = "credentials.json" const USER = "me" func getEmail(service *gmail.Service, msgID string) *gmail.Message { r, err := service.Users.Messages.Get(USER, msgID).Format("FULL").Do() if err != nil { log.Fatalf("Error when getting mail content: %v", err) } if r == nil { log.Fatalf("Response when getting mail was nil") } return r } func getEmailPlaintext (mail *gmail.Message) (fromAddr string, bodyStr string) { part := mail.Payload.Parts[0].Body.Data body, err := base64.StdEncoding.DecodeString(part) if err != nil { log.Fatalf("Error in message body decoding: %v", err) } for _, header := range mail.Payload.Headers { if header.Name == "From" { _, addrPart, _ := strings.Cut(header.Value, "<") fromAddr, _, _ = strings.Cut(addrPart, ">") } } return fromAddr, string(body) } func main() { ctx := context.Background() creds_file := filepath.Join(CREDENTIALS_DIR, CREDENTIALS_FILE) creds_b, err := os.ReadFile(creds_file) if err != nil { log.Fatalf("Unable to read client secret file: %v", err) } config, err := google.ConfigFromJSON(creds_b, gmail.GmailReadonlyScope) if err != nil { log.Fatalf("Unable to parse client secret file to config: %v", err) } client := getClient(config) service, err := gmail.NewService(ctx, option.WithHTTPClient(client)) if err != nil { log.Fatalf("Unable to retrieve Gmail client: %v", err) } user := "me" r, err := service.Users.Messages.List(user).LabelIds("INBOX").Do() if err != nil { log.Fatalf("Unable to retrieve messages: %v", err) } if len(r.Messages) == 0 { fmt.Println("No messages found") return } fmt.Println("Messages:") for _, msg := range r.Messages { fmt.Printf("- %s\n", msg.Id) mail := getEmail(service, msg.Id) fromAddr, msgBody := getEmailPlaintext(mail) fmt.Printf("From: %s\n", fromAddr) fmt.Printf("Message:\n%s\n", msgBody) cmd := exec.Command("yt-dlp", msgBody) cmd.Stdout = os.Stdout cmd.Stderr = os.Stderr _ = cmd.Run() } }