main.go 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. package main
  2. import (
  3. "fmt"
  4. "log"
  5. "net/http"
  6. "os"
  7. "os/exec"
  8. "text/template"
  9. "time"
  10. "github.com/mmcdole/gofeed"
  11. "gogs.carduccidante.edu.it/karmen/core/util/pandoc"
  12. tplutil "gogs.carduccidante.edu.it/karmen/core/util/template"
  13. )
  14. var funcmap = template.FuncMap{
  15. "date": func() string {
  16. now := time.Now()
  17. return now.Format("2006-02-01")
  18. },
  19. }
  20. func convertPDFToPNG(filename string) error {
  21. out, err := exec.Command("pdftoppm", filename, "./data/screen", "-png").CombinedOutput()
  22. if string(out) != "" {
  23. return fmt.Errorf("pdftoppm: %s", string(out))
  24. }
  25. if err != nil {
  26. return err
  27. }
  28. return nil
  29. }
  30. func serveScreen(res http.ResponseWriter, req *http.Request) {
  31. fp := gofeed.NewParser()
  32. feed, _ := fp.ParseURL("https://www.agi.it/innovazione/rss")
  33. tpl, err := tplutil.LoadTextTemplate("./data/screen.tpl.md", funcmap)
  34. if err != nil {
  35. panic(err)
  36. }
  37. f, err := os.Create("./data/screen.md")
  38. if err != nil {
  39. panic(err)
  40. }
  41. defer f.Close()
  42. var data struct {
  43. Title string
  44. Item *gofeed.Item
  45. }
  46. data.Title = feed.Title
  47. data.Item = feed.Items[0]
  48. log.Println("Generating markdown file from template.")
  49. if err := tpl.Execute(f, data); err != nil {
  50. panic(err)
  51. }
  52. log.Println("Converting markdown to pdf.")
  53. err = pandoc.Convert("./data/screen.md", "./data/screen.pdf", "-V", "geometry:papersize={3.8in,6.4in}", "-V", "pagestyle:empty")
  54. if err != nil {
  55. panic(err)
  56. }
  57. log.Println("Converting pdf to png.")
  58. err = convertPDFToPNG("./data/screen.pdf")
  59. if err != nil {
  60. panic(err)
  61. }
  62. log.Println("Serving screen.png...")
  63. http.ServeFile(res, req, "./data/screen-1.png")
  64. }
  65. func main() {
  66. http.HandleFunc("/", serveScreen)
  67. log.Println("Start alba backend...")
  68. http.ListenAndServe(":3000", nil)
  69. }