tvl-depot/rfcToKindle/main.go
William Carroll 916e46d7ce Support script to download RFCs to my Kindle
Today I learned that you can email your Kindle files to read them using the
paperwhite display. I'm attempting to read RFCs, so after reading 1/4 of the way
through RFC6479 (on OAuth2.0), I realized that it might be easier to read on my
Kindle instead of on my computer screen. Out of this, rfcToKindle.go was born.

I'm not sure if I'd like to publish this or not.
2020-02-02 18:54:26 +00:00

89 lines
2.3 KiB
Go

// Author: wpcarro@gmail.com
//
// Wirelessly transfer RFC documents to your Kindle to device for an alternative
// medium for reading.
//
// Usage:
// ```shell
// > go run rfcToKindle.go -document rfc6479 -recipient username@kindle.com
// ```
//
// This uses `sendgmr` to send the file to the Kindle. Make sure:
// 1. That `sendgmr` is installed and available on $PATH.
// 2. That it is configured to work with your preferred email address.
// 3. That the email address `sendgmr` is configured to use is whitelisted in
// your Kindle "Personal Document Settings".
package main
import (
"flag"
"fmt"
"io"
"io/ioutil"
"log"
"net/http"
"os"
"os/exec"
"strings"
)
func main() {
document := flag.String("document", "", "(Required) The name of the document to fetch. For example \"RFC6479\".")
recipient := flag.String("recipient", "", "(Required) The email address of the Kindle device.")
subject := flag.String("subject", "", "(Optional) The email address of the Kindle device.")
flag.Parse()
if *document == "" {
// TODO: Is log.Fatal the best function to use here?
log.Fatal("-document cannot be empty. See -help for more information.")
}
if *recipient == "" {
log.Fatal("-recipient cannot be empty. See -help for more information.")
}
*document = strings.ToLower(*document)
url := fmt.Sprintf("https://www.ietf.org/rfc/%s.txt", *document)
resp, err := http.Get(url)
fmt.Printf("Downloading %s ... ", url)
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
f, err := ioutil.TempFile("", fmt.Sprintf("%s-*.txt", *document))
if err != nil {
log.Fatal(err)
}
// TODO: Verify if this is cleaning up or not.
defer os.Remove(f.Name())
_, err = io.Copy(f, resp.Body)
if err != nil {
log.Fatal(err)
}
fmt.Println("done.")
if *subject == "" {
*subject = fmt.Sprintf("%s - Sent from rfcToKindle.go", *document)
}
// Although I couldn't find it documented anywhere, the email sent to the
// Kindle must have a body, even if the body isn't used for anything.
fmt.Printf("Emailing %s to %s ... ", f.Name(), *recipient)
cmd := exec.Command("sendgmr",
fmt.Sprintf("--to=%s", *recipient),
fmt.Sprintf("--body_file=%s", f.Name()),
fmt.Sprintf("--subject=%s", *subject),
fmt.Sprintf("--attachment_files=%s", f.Name()))
err = cmd.Run()
if err != nil {
log.Fatal(err)
}
fmt.Println("done.")
os.Exit(0)
}