main.go 3.3 KB

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