main.go 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. package main
  2. import (
  3. "errors"
  4. "fmt"
  5. "image"
  6. "image/jpeg"
  7. "log"
  8. "net/http"
  9. "os"
  10. "path"
  11. "plugin"
  12. )
  13. type Transformer struct {
  14. name string
  15. t func(image.Image) image.Image
  16. priority int // priority can be 0 or 1
  17. }
  18. func loadPlugin(path string) (*Transformer, error) {
  19. fmt.Println("Loading", path)
  20. p, err := plugin.Open(path)
  21. if err != nil {
  22. return nil, err
  23. }
  24. transformSymbol, err := p.Lookup("Transform")
  25. if err != nil {
  26. return nil, err
  27. }
  28. transform, ok := transformSymbol.(func(image.Image) image.Image)
  29. if !ok {
  30. return nil, errors.New(fmt.Sprintf("%s: Transform not a func(image.Image) image.Image", path))
  31. }
  32. var priority int
  33. prioritySymbol, err := p.Lookup("Priority")
  34. if err != nil {
  35. fmt.Println("Error looking up Priority:", err)
  36. } else {
  37. var ok bool
  38. priority, ok = prioritySymbol.(int)
  39. if !ok {
  40. fmt.Println("Error casting Priority to int")
  41. }
  42. }
  43. return &Transformer{path, transform, priority}, nil
  44. }
  45. func getPlugins(pluginDir string) (map[int][]*Transformer, error) {
  46. pDir, err := os.Open(pluginDir)
  47. if err != nil {
  48. return nil, err
  49. }
  50. pFiles, err := pDir.Readdir(0)
  51. if err != nil {
  52. return nil, err
  53. }
  54. ret := make(map[int][]*Transformer)
  55. for _, pFile := range pFiles {
  56. if pFile.IsDir() {
  57. continue
  58. }
  59. p, err := loadPlugin(path.Join(pluginDir, pFile.Name()))
  60. if err != nil {
  61. log.Printf("Failed to load pluging %s", p)
  62. } else {
  63. ret[p.priority] = append(ret[p.priority], p)
  64. }
  65. }
  66. return ret, nil
  67. }
  68. func handler(w http.ResponseWriter, r *http.Request) {
  69. fi, _ := os.Open("lca.jpg")
  70. i, _ := jpeg.Decode(fi)
  71. plugins, err := getPlugins(pluginDir)
  72. if err != nil {
  73. panic(err)
  74. }
  75. for _, p := range plugins[1] {
  76. fmt.Println("Apply", p.name)
  77. i = p.t(i)
  78. }
  79. for _, p := range plugins[0] {
  80. fmt.Println("Apply", p.name)
  81. i = p.t(i)
  82. }
  83. jpeg.Encode(w, i, nil)
  84. }
  85. var pluginDir string
  86. func main() {
  87. pluginDir = os.Args[1]
  88. http.HandleFunc("/a.jpg", handler)
  89. http.ListenAndServe(":8080", nil)
  90. }