You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
90 lines
1.8 KiB
90 lines
1.8 KiB
package linkinfo |
|
|
|
import ( |
|
"net/http" |
|
"net/url" |
|
"time" |
|
) |
|
|
|
type LinkHandler struct { |
|
Hosts []string |
|
Handler func(link string) (*LinkInfo, error) |
|
} |
|
|
|
type LinkInfoApi struct { |
|
Client *http.Client |
|
|
|
Imgur *ImgurInfoApi |
|
Youtube *YoutubeInfoApi |
|
linkHandlers []*LinkHandler |
|
} |
|
|
|
type LinkInfo struct { |
|
Title string `json:"title"` |
|
Description string `json:"description"` |
|
ContentType string `json:"type"` |
|
ContentLength int64 `json:"contentLength"` |
|
Duration string `json:"duration,omitempty"` |
|
Redirects []string `json:"redirects,omitempty"` |
|
} |
|
|
|
func New(opts ...Option) *LinkInfoApi { |
|
api := &LinkInfoApi{ |
|
Client: &http.Client{ |
|
Timeout: 60 * time.Second, |
|
}, |
|
} |
|
|
|
for _, opt := range opts { |
|
switch opt.(type) { |
|
case *ImgurOptions: |
|
api.Imgur = &ImgurInfoApi{api, opt.(*ImgurOptions)} |
|
case *YoutubeOptions: |
|
api.Youtube = &YoutubeInfoApi{api, opt.(*YoutubeOptions)} |
|
} |
|
} |
|
|
|
api.registerDefaultHandlers() |
|
|
|
return api |
|
} |
|
|
|
func (i *LinkInfoApi) registerDefaultHandlers() { |
|
i.linkHandlers = make([]*LinkHandler, 0) |
|
|
|
if i.Imgur != nil { |
|
i.linkHandlers = append(i.linkHandlers, &LinkHandler{ |
|
Hosts: imgurHosts, |
|
Handler: i.Imgur.Handler, |
|
}) |
|
} |
|
|
|
if i.Youtube != nil { |
|
i.linkHandlers = append(i.linkHandlers, &LinkHandler{ |
|
Hosts: youtubeHosts, |
|
Handler: i.Youtube.Handler, |
|
}) |
|
} |
|
} |
|
|
|
func (i *LinkInfoApi) AddHandler(handler *LinkHandler) { |
|
i.linkHandlers = append(i.linkHandlers, handler) |
|
} |
|
|
|
func (i *LinkInfoApi) Retrieve(link string) (*LinkInfo, error) { |
|
u, err := url.Parse(link) |
|
|
|
if err != nil { |
|
return nil, err |
|
} |
|
|
|
for _, handler := range i.linkHandlers { |
|
for _, host := range handler.Hosts { |
|
if host == u.Hostname() { |
|
return handler.Handler(link) |
|
} |
|
} |
|
} |
|
|
|
return i.DefaultLinkHandler(link) |
|
}
|
|
|