init
This commit is contained in:
96
extractor/spotify/providers.go
Normal file
96
extractor/spotify/providers.go
Normal file
@@ -0,0 +1,96 @@
|
||||
package spotify
|
||||
|
||||
import (
|
||||
"git.nobrain.org/r4/dischord/extractor"
|
||||
"git.nobrain.org/r4/dischord/extractor/youtube"
|
||||
|
||||
"errors"
|
||||
"net/url"
|
||||
"strings"
|
||||
)
|
||||
|
||||
func init() {
|
||||
extractor.AddExtractor("spotify", NewExtractor())
|
||||
}
|
||||
|
||||
type matchType int
|
||||
|
||||
const (
|
||||
matchTypeNone matchType = iota
|
||||
matchTypeTrack
|
||||
matchTypeAlbum
|
||||
matchTypePlaylist
|
||||
)
|
||||
|
||||
var (
|
||||
ErrInvalidInput = errors.New("invalid input")
|
||||
)
|
||||
|
||||
func matches(input string) (string, matchType) {
|
||||
u, err := url.Parse(input)
|
||||
if err != nil {
|
||||
return "", matchTypeNone
|
||||
}
|
||||
if u.Scheme != "http" && u.Scheme != "https" {
|
||||
return "", matchTypeNone
|
||||
}
|
||||
if u.Host != "open.spotify.com" {
|
||||
return "", matchTypeNone
|
||||
}
|
||||
sp := strings.Split(u.Path, "/")
|
||||
if len(sp) != 3 || sp[0] != "" {
|
||||
return "", matchTypeNone
|
||||
}
|
||||
switch sp[1] {
|
||||
case "track":
|
||||
return sp[2], matchTypeTrack
|
||||
case "album":
|
||||
return sp[2], matchTypeAlbum
|
||||
case "playlist":
|
||||
return sp[2], matchTypePlaylist
|
||||
}
|
||||
return "", matchTypeNone
|
||||
}
|
||||
|
||||
type Extractor struct {
|
||||
ytSearcher *youtube.Searcher
|
||||
ytSearcherConfig extractor.ProviderConfig
|
||||
ytExtractor *youtube.Extractor
|
||||
ytExtractorConfig extractor.ProviderConfig
|
||||
token apiToken
|
||||
}
|
||||
|
||||
func NewExtractor() *Extractor {
|
||||
extractor := &Extractor{}
|
||||
extractor.ytSearcher = &youtube.Searcher{}
|
||||
extractor.ytSearcherConfig = extractor.ytSearcher.DefaultConfig()
|
||||
extractor.ytExtractor = &youtube.Extractor{}
|
||||
extractor.ytExtractorConfig = extractor.ytExtractor.DefaultConfig()
|
||||
return extractor
|
||||
}
|
||||
|
||||
func (e *Extractor) DefaultConfig() extractor.ProviderConfig {
|
||||
return extractor.ProviderConfig{}
|
||||
}
|
||||
|
||||
func (e *Extractor) Matches(cfg extractor.ProviderConfig, input string) bool {
|
||||
_, m := matches(input)
|
||||
return m != matchTypeNone
|
||||
}
|
||||
|
||||
func (e *Extractor) Extract(cfg extractor.ProviderConfig, input string) ([]extractor.Data, error) {
|
||||
id, m := matches(input)
|
||||
switch m {
|
||||
case matchTypeTrack:
|
||||
d, err := getTrack(e, id)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return []extractor.Data{d}, nil
|
||||
case matchTypeAlbum:
|
||||
return getAlbum(e, id)
|
||||
case matchTypePlaylist:
|
||||
return getPlaylist(e, id)
|
||||
}
|
||||
return nil, ErrInvalidInput
|
||||
}
|
||||
Reference in New Issue
Block a user