main.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  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. "day": func() int {
  16. _, _, day := time.Now().Date()
  17. return day
  18. },
  19. "month": func() int {
  20. _, month, _ := time.Now().Date()
  21. return int(month)
  22. },
  23. "year": func() int {
  24. year, _, _ := time.Now().Date()
  25. return year
  26. },
  27. "news": func() []*gofeed.Item {
  28. result := make([]*gofeed.Item, 0)
  29. fp := gofeed.NewParser()
  30. feed, _ := fp.ParseURL("https://www.agi.it/innovazione/rss")
  31. for _, it := range feed.Items {
  32. result = append(result, it)
  33. }
  34. return result[:2]
  35. },
  36. "weather": func() []*gofeed.Item {
  37. result := make([]*gofeed.Item, 0)
  38. fp := gofeed.NewParser()
  39. feed, _ := fp.ParseURL("https://www.meteowebcam.eu/rss.xml")
  40. for _, it := range feed.Items {
  41. result = append(result, it)
  42. }
  43. return result[:1]
  44. },
  45. }
  46. func convertPDFToBMP(filename string) error {
  47. out, err := exec.Command("pdftoppm", filename, "./data/screen", "-png").CombinedOutput()
  48. if string(out) != "" {
  49. return fmt.Errorf("pdftoppm: %s", string(out))
  50. }
  51. if err != nil {
  52. return err
  53. }
  54. out, err = exec.Command("convert", "./data/screen-1.png",
  55. "-rotate", "-90",
  56. "-resize", "800x480!",
  57. "-dither", "none",
  58. "-remap", "./data/palette.gif",
  59. "BMP3:./data/screen.bmp",
  60. ).CombinedOutput()
  61. if string(out) != "" {
  62. return fmt.Errorf("covert: %s", string(out))
  63. }
  64. if err != nil {
  65. return err
  66. }
  67. return nil
  68. }
  69. func serveScreen(res http.ResponseWriter, req *http.Request) {
  70. tpl, err := tplutil.LoadTextTemplate("./data/screen.tpl.md", funcmap)
  71. if err != nil {
  72. panic(err)
  73. }
  74. f, err := os.Create("./data/screen.md")
  75. if err != nil {
  76. panic(err)
  77. }
  78. defer f.Close()
  79. var data struct {
  80. Title string
  81. Item *gofeed.Item
  82. }
  83. log.Println("Generating markdown file from template.")
  84. if err := tpl.Execute(f, data); err != nil {
  85. panic(err)
  86. }
  87. log.Println("Converting markdown to pdf.")
  88. // err = pandoc.Convert("./data/screen.md", "./data/screen.pdf", "-V", "geometry:papersize={3.8in,6in}", "-V", "pagestyle:empty")
  89. err = pandoc.Convert("./data/screen.md", "./data/screen.pdf", "-V", "pagestyle:empty")
  90. if err != nil {
  91. panic(err)
  92. }
  93. log.Println("Converting PDF to monochrome BMP.")
  94. err = convertPDFToBMP("./data/screen.pdf")
  95. if err != nil {
  96. panic(err)
  97. }
  98. log.Println("Serving screen.png...")
  99. http.ServeFile(res, req, "./data/screen.bmp")
  100. }
  101. func main() {
  102. http.HandleFunc("/", serveScreen)
  103. log.Println("Start alba backend...")
  104. http.ListenAndServe(":3000", nil)
  105. }