gomu/search.go

122 lines
2.9 KiB
Go

package main
import (
"encoding/json"
"net/http"
"net/url"
"github.com/spf13/viper"
"github.com/ztrue/tracerr"
)
type ResponseError struct {
Code string `json:"code"`
Message string `json:"message"`
}
func (r *ResponseError) Error() string {
return r.Message
}
type Thumbnail struct {
Quality string `json:"quality,omitempty"`
Url string `json:"url,omitempty"`
Width int `json:"width,omitempty"`
Height int `json:"height,omitempty"`
}
type YoutubeVideo struct {
Type string `json:"type,omitempty"`
Title string `json:"title,omitempty"`
VideoId string `json:"videoId,omitempty"`
Author string `json:"author,omitempty"`
AuthorId string `json:"authorId,omitempty"`
AuthorUrl string `json:"authorUrl,omitempty"`
VideoThumbnails []Thumbnail `json:"videoThumbnails,omitempty"`
Description string `json:"description,omitempty"`
DescriptionHtml string `json:"descriptionHtml,omitempty"`
ViewCount int `json:"viewCount,omitempty"`
Published int `json:"published,omitempty"`
PublishedText string `json:"publishedText,omitempty"`
LengthSeconds int `json:"lengthSeconds,omitempty"`
LiveNow bool `json:"liveNow,omitempty"`
Paid bool `json:"paid,omitempty"`
Premium bool `json:"premium,omitempty"`
IsUpcoming bool `json:"isUpcoming,omitempty"`
}
const userAgent = "Mozilla/5.0 (Windows NT 10.0; rv:68.0) Gecko/20100101 Firefox/68.0"
func getRequest(url string, v interface{}) error {
client := &http.Client{}
req, err := http.NewRequest("GET", url, nil)
if err != nil {
return tracerr.Wrap(err)
}
req.Header.Set("User-Agent", userAgent)
res, err := client.Do(req)
if err != nil {
return tracerr.Wrap(err)
}
defer res.Body.Close()
if res.StatusCode != 200 {
var resErr ResponseError
err = json.NewDecoder(res.Body).Decode(&resErr)
if err != nil {
return tracerr.Wrap(err)
}
return &resErr
}
err = json.NewDecoder(res.Body).Decode(&v)
if err != nil {
return tracerr.Wrap(err)
}
return nil
}
func getSearchResult(query string) ([]YoutubeVideo, error) {
query = url.QueryEscape(query)
domain := viper.GetString("general.invidious_instance")
targetUrl := domain + `/api/v1/search?q=` + query
yt := []YoutubeVideo{}
err := getRequest(targetUrl, &yt)
if err != nil {
return nil, err
}
return yt, nil
}
func getSuggestions(query string) ([]string, error) {
query = url.QueryEscape(query)
targetUrl :=
`http://suggestqueries.google.com/complete/search?client=firefox&ds=yt&q=` + query
res := []json.RawMessage{}
err := getRequest(targetUrl, &res)
if err != nil {
return nil, tracerr.Wrap(err)
}
suggestions := []string{}
err = json.Unmarshal(res[1], &suggestions)
if err != nil {
return nil, tracerr.Wrap(err)
}
return suggestions, nil
}