Created
February 2, 2020 18:39
-
-
Save wpcarro/48f0ea2f2182819c7087bb6acba5dfd2 to your computer and use it in GitHub Desktop.
Download RFCs to your Kindle
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| // 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) | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment