package main import ( "flag" "text/template" "net/http" "fmt" //"io" "log" "strconv" //"path" "git.sr.ht/~ark/ytparser" ) func getLangs() []string { return []string{"en", "fr", "de", "ja", "ru"} } func serve(w http.ResponseWriter, templatePath string, data interface{}) { funcMap := template.FuncMap { "inc": func(i int) int { return i + 1 }, "dec": func(i int) int { return i - 1 }, } t, err := template.New("base.html").Funcs(funcMap).ParseFiles("templates/base.html", templatePath) if err != nil { panic(err) } else { if err := t.Execute(w, data); err != nil { log.Println(err) } } } func index(w http.ResponseWriter, r *http.Request) { data := struct { Langs []string }{ getLangs(), } serve(w, "templates/index.html", data) } func search(w http.ResponseWriter, r *http.Request) { switch r.Method { case "GET": query := r.URL.Query() term := query.Get("term") sPage := query.Get("page") lang := query.Get("lang") var page int if sPage == "" { page = 0 } else { p, err := strconv.Atoi(sPage) if err != nil { page = 0 } else { page = p } } log.Printf("searching: %s, page: %d, lang: %s\n", term, page, lang) items, err := ytparser.Search(term, page, lang) if err != nil { log.Println(err) data := struct { Error error }{ err, } serve(w, "templates/error.html", data) } else { data := struct { Items []ytparser.Item Term string Page int Lang string Langs []string }{ items, term, page, lang, getLangs(), } serve(w, "templates/search.html", data) } default: } } func embed(w http.ResponseWriter, r *http.Request) { switch r.Method { case "GET": query := r.URL.Query() id := query.Get("id") serve(w, "templates/embed.html", id) default: } } func favicon(w http.ResponseWriter, r *http.Request) { http.ServeFile(w, r, "favicon.ico") } func main() { port := flag.Int("p", 8080, "The port to bind to.") flag.Parse() fs := http.FileServer(http.Dir("static")) http.Handle("/static/", http.StripPrefix("/static/", fs)) http.HandleFunc("/favicon.ico", favicon) http.HandleFunc("/", index) http.HandleFunc("/search", search) http.HandleFunc("/embed", embed) log.Fatal(http.ListenAndServe(fmt.Sprintf(":%d", *port), nil)) }