main.go 2.7 KB

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