package main import ( "fmt" "io" "log" "net/http" ) const youtubeAPI = "https://www.googleapis.com/youtube/v3/" /* function to make an api request */ func apiRequest(w http.ResponseWriter, r *http.Request, endpoint string, videoIdParam string, part string) { videoID := r.URL.Query().Get("id") if videoID == "" { msg := "Missing ?id=VIDEO_ID parameter" http.Error(w, msg, http.StatusBadRequest) return } if apiKey == "" { msg := "API_KEY environment variable not set" http.Error(w, msg, http.StatusInternalServerError) log.Println(msg) return } url := fmt.Sprintf("%s?part=%s&%s=%s&key=%s", youtubeAPI + endpoint, part, videoIdParam, videoID, apiKey) resp, err := http.Get(url) if err != nil { msg := "Failed to fetch video info: " + err.Error() http.Error(w, msg, http.StatusInternalServerError) log.Println(msg) return } defer resp.Body.Close() if resp.StatusCode != http.StatusOK { msg := "YouTube API error: " + resp.Status http.Error(w, msg, http.StatusBadGateway) log.Println(msg) return } w.Header().Set("Content-Type", "application/json") io.Copy(w, resp.Body) } /* routes */ func setupRoutesAPI() { http.HandleFunc("/api/details", func(w http.ResponseWriter, r *http.Request) { apiRequest(w, r, "videos", "id", "snippet,statistics,topicDetails") }) http.HandleFunc("/api/comments", func(w http.ResponseWriter, r *http.Request) { apiRequest(w, r, "commentThreads", "videoId", "snippet,replies&maxResults=100") }) }