main.go 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. package main
  2. import (
  3. "fmt"
  4. "http"
  5. "exp/template"
  6. mysql "github.com/Philio/GoMySQL"
  7. "os"
  8. )
  9. type Song struct {
  10. Yid string
  11. Title string
  12. User string
  13. }
  14. type Playlist struct {
  15. Id string
  16. Songs []*Song
  17. }
  18. var templates map[string]*template.Template
  19. const debug = true
  20. var db *mysql.Client
  21. func home(w http.ResponseWriter, r *http.Request) {
  22. fmt.Fprintf(w, "path is %s", r.URL.Path[1:])
  23. }
  24. func playlist(w http.ResponseWriter, r *http.Request) {
  25. id := r.URL.Path[len("/p/"):]
  26. if len(id) != 8 {
  27. http.Redirect(w, r, "/", 303)
  28. return
  29. }
  30. query, err := db.Prepare("SELECT `yid`,`title`,`user` FROM `playlist` JOIN `song` WHERE `id` = ?;")
  31. if err != nil {
  32. http.Error(w, err.String(), http.StatusInternalServerError)
  33. return
  34. }
  35. err = query.BindParams(id)
  36. if err != nil {
  37. http.Error(w, err.String(), http.StatusInternalServerError)
  38. return
  39. }
  40. err = query.Execute()
  41. if err != nil {
  42. http.Error(w, err.String(), http.StatusInternalServerError)
  43. return
  44. }
  45. playlist := Playlist{Id: id, Songs: make([]*Song, 0, 2)}
  46. for {
  47. song := new(Song)
  48. query.BindResult(&song.Yid, &song.Title, &song.User)
  49. eof, err := query.Fetch()
  50. if err != nil {
  51. http.Error(w, err.String(), http.StatusInternalServerError)
  52. return
  53. }
  54. if eof {
  55. break
  56. }
  57. playlist.Songs = append(playlist.Songs, song)
  58. }
  59. err = query.FreeResult()
  60. if err != nil {
  61. http.Error(w, err.String(), http.StatusInternalServerError)
  62. return
  63. }
  64. if debug {
  65. t, err := template.ParseFile("templates/p.html")
  66. if err != nil {
  67. http.Error(w, err.String(), http.StatusInternalServerError)
  68. return
  69. }
  70. err = t.Execute(w, playlist)
  71. if err != nil {
  72. w.Write([]byte(err.String()))
  73. fmt.Fprintln(os.Stderr, err.String())
  74. return
  75. }
  76. } else {
  77. err = templates["p"].Execute(w, playlist)
  78. if err != nil {
  79. fmt.Fprintln(os.Stderr, err.String())
  80. }
  81. }
  82. }
  83. func add(w http.ResponseWriter, r *http.Request) {
  84. query, err := db.Prepare("SELECT `pid` FROM `playlist` WHERE `id` = ?;")
  85. if err != nil {
  86. http.Error(w, err.String(), http.StatusInternalServerError)
  87. return
  88. }
  89. q := r.URL.Query()
  90. err = query.BindParams(q.Get("pid"))
  91. if err != nil {
  92. http.Error(w, err.String(), http.StatusInternalServerError)
  93. return
  94. }
  95. err = query.Execute()
  96. if err != nil {
  97. http.Error(w, err.String(), http.StatusInternalServerError)
  98. return
  99. }
  100. var pid int
  101. query.BindResult(&pid)
  102. _, err = query.Fetch()
  103. if err != nil {
  104. http.Error(w, err.String(), http.StatusInternalServerError)
  105. return
  106. }
  107. err = query.FreeResult()
  108. if err != nil {
  109. http.Error(w, err.String(), http.StatusInternalServerError)
  110. return
  111. }
  112. sql :="INSERT INTO `song` (`pid`,`yid`,`title`,`user`) VALUES(%d,'%s','%s','%s')"
  113. sql = fmt.Sprintf(sql, pid,
  114. db.Escape(q.Get("yid")),
  115. db.Escape(q.Get("title")),
  116. db.Escape(q.Get("user")))
  117. err = db.Query(sql)
  118. if err != nil {
  119. http.Error(w, err.String(), http.StatusInternalServerError)
  120. return
  121. }
  122. w.Write([]byte("1"))
  123. }
  124. func main() {
  125. templates = make(map[string]*template.Template)
  126. for _, path := range []string{"p"} {
  127. t, err := template.ParseFile("templates/" + path + ".html")
  128. if err != nil {
  129. fmt.Println(err)
  130. return
  131. }
  132. templates[path] = t
  133. }
  134. var err os.Error
  135. db, err = mysql.DialTCP("raylu.net", "audio", "audio", "audio")
  136. if err != nil {
  137. fmt.Println(err)
  138. os.Exit(1)
  139. }
  140. http.HandleFunc("/", home)
  141. http.HandleFunc("/p/", playlist)
  142. http.HandleFunc("/add/", add)
  143. http.ListenAndServe(":8000", nil)
  144. }