cli + tui to publish to leaflet (wip) & manage tasks, notes & watch/read lists 馃崈
charm leaflet readability golang
at main 83 lines 2.0 kB view raw
1package services 2 3import ( 4 "net/url" 5 "strings" 6 7 "github.com/gocolly/colly/v2" 8) 9 10type Searchable interface { 11 Search(query string) ([]Media, error) 12} 13 14type Fetchable interface { 15 MakeRequest(url string) (string, error) 16 MovieRequest(url string) (*Movie, error) 17 TVRequest(url string) (*TVSeries, error) 18} 19 20// DefaultFetcher provides the default implementation using colly 21type DefaultFetcher struct{} 22 23func (f *DefaultFetcher) MakeRequest(url string) (string, error) { 24 return FetchHTML(url) 25} 26 27func (f *DefaultFetcher) MovieRequest(url string) (*Movie, error) { 28 return FetchMovie(url) 29} 30 31func (f *DefaultFetcher) TVRequest(url string) (*TVSeries, error) { 32 return FetchTVSeries(url) 33} 34 35func (f *DefaultFetcher) Search(query string) ([]Media, error) { 36 return SearchRottenTomatoes(query) 37} 38 39// SearchRottenTomatoes fetches live search results for a query. 40var SearchRottenTomatoes = func(q string) ([]Media, error) { 41 searchURL := "https://www.rottentomatoes.com/search?search=" + url.QueryEscape(q) 42 html, err := FetchHTML(searchURL) 43 if err != nil { 44 return nil, err 45 } 46 return ParseSearch(strings.NewReader(html)) 47} 48 49var FetchHTML = func(url string) (string, error) { 50 var html string 51 c := colly.NewCollector( 52 colly.AllowedDomains("www.rottentomatoes.com", "rottentomatoes.com"), 53 ) 54 c.OnResponse(func(r *colly.Response) { html = string(r.Body) }) 55 if err := c.Visit(url); err != nil { 56 return "", err 57 } 58 return html, nil 59} 60 61var FetchTVSeries = func(url string) (*TVSeries, error) { 62 html, err := FetchHTML(url) 63 if err != nil { 64 return nil, err 65 } 66 return ExtractTVSeriesMetadata(strings.NewReader(html)) 67} 68 69var FetchMovie = func(url string) (*Movie, error) { 70 html, err := FetchHTML(url) 71 if err != nil { 72 return nil, err 73 } 74 return ExtractMovieMetadata(strings.NewReader(html)) 75} 76 77var FetchTVSeason = func(url string) (*TVSeason, error) { 78 html, err := FetchHTML(url) 79 if err != nil { 80 return nil, err 81 } 82 return ExtractTVSeasonMetadata(strings.NewReader(html)) 83}