package main import ( "html/template" "net/http" "net/url" ) var templateWatchFiles = []string{ "templates/base.html", "templates/watch.html" } var templateWatch = template.Must(template.ParseFiles(templateWatchFiles...)) /* render template */ type WatchTemplateData struct { Src string } func renderWatchTemplate(w http.ResponseWriter, id string, rawQuery string) { if debug { reloadTemplate(&templateWatch, templateWatchFiles...) } // construct url query from existing rawQuery q, parseErr := url.ParseQuery(rawQuery) if parseErr != nil { templateError(parseErr, w) return } q.Add("enablejsapi", "1") q.Add("autoplay", "1") q.Del("v") if q.Has("t") { q.Add("start", q.Get("t")) // translate 't' to 'start' (embed equivalent) q.Del("t") } // construct url u, urlErr := url.Parse("https://www.youtube-nocookie.com/embed/" + id) if urlErr != nil { templateError(urlErr, w) return } u.RawQuery = q.Encode() // execute template err := templateWatch.Execute(w, WatchTemplateData{ Src: u.String(), }) if err != nil { templateError(err, w) } } /* routes */ func registerRoutesWatch(mux *http.ServeMux) { mux.HandleFunc("/watch", func(w http.ResponseWriter, r *http.Request) { id := r.URL.Query().Get("v") renderWatchTemplate(w, id, r.URL.RawQuery) }) }