cli + tui to publish to leaflet (wip) & manage tasks, notes & watch/read lists 馃崈
charm
leaflet
readability
golang
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}