diff --git a/internal/data/source.go b/internal/data/source.go index 43f6e64..8461039 100644 --- a/internal/data/source.go +++ b/internal/data/source.go @@ -1,13 +1,15 @@ package data import ( - "errors" "regexp" ) type SourceType struct { - Name string - Regex *regexp.Regexp + Name string + Regex *regexp.Regexp + RegexArtist *regexp.Regexp + RegexAlbum *regexp.Regexp + RegexSong *regexp.Regexp } var SourceTypes = []SourceType{ @@ -24,39 +26,14 @@ func GetSourceType(name string) *SourceType { panic("couldn't find source type for " + name) } +type ObjectType string + +const SongSource = ObjectType("song") +const AlbumSource = ObjectType("album") +const ArtistSource = ObjectType("artist") + type Source struct { - Url string - Type *SourceType -} - -func (st *SourceType) NewSource(url string) (Source, error) { - var err error = nil - if !st.Regex.MatchString(url) { - err = errors.New("url " + url + " didn't match source " + st.Name) - } - - return Source{ - Url: url, - Type: st, - }, err -} - -func NewSource(url string) (Source, error) { - var st *SourceType = nil - - for i, source := range SourceTypes { - if source.Regex.MatchString(url) { - st = &SourceTypes[i] - break - } - } - - if st == nil { - return Source{}, errors.New("couldn't find a source type for the url " + url) - } - - return Source{ - Url: url, - Type: st, - }, nil + Url string + SourceType *SourceType + ObjectType ObjectType } diff --git a/internal/plugin/interface.go b/internal/plugin/interface.go index ca8aa66..2bc261c 100644 --- a/internal/plugin/interface.go +++ b/internal/plugin/interface.go @@ -1,6 +1,7 @@ package plugin import ( + "errors" "regexp" "gitea.elara.ws/Hazel/music-kraken/internal/data" @@ -8,14 +9,16 @@ import ( type Plugin interface { Name() string - GetRegex() *regexp.Regexp + Regex() *regexp.Regexp + RegexArtist() *regexp.Regexp + RegexAlbum() *regexp.Regexp + RegexSong() *regexp.Regexp - Search(query string) []data.MusicObject + Search(query string) ([]data.MusicObject, error) - Fetch(source data.Source) data.MusicObject - FetchSong(source data.Source) data.Song - FetchAlbum(source data.Source) data.Album - FetchArtist(source data.Source) data.Artist + FetchArtist(source data.Source) (data.Artist, error) + FetchAlbum(source data.Source) (data.Album, error) + FetchSong(source data.Source) (data.Song, error) } var namePlugins = map[string]Plugin{} @@ -25,34 +28,80 @@ func RegisterPlugin(plugin Plugin) { name := plugin.Name() nameSourceType[name] = data.SourceType{ - Name: name, - Regex: plugin.GetRegex(), + Name: name, + Regex: plugin.Regex(), + RegexArtist: plugin.RegexArtist(), + RegexAlbum: plugin.RegexAlbum(), + RegexSong: plugin.RegexSong(), } namePlugins[name] = plugin } -func compileSource(source data.Source) data.Source { - if source.Type != nil { - return source +func compileSourceType(source data.Source) (data.Source, error) { + if source.SourceType != nil { + return source, nil } for _, st := range nameSourceType { if m := st.Regex.FindString(source.Url); m != "" { source.Url = m - return source + return source, nil } } - panic("couldn't find source type for " + source.Url) + + return source, errors.New("couldn't find source type for " + source.Url) } -func FetchUrl(url string) data.MusicObject { - return FetchSource(data.Source{ - Url: string, - Type: nil, - }) +func compileSource(source data.Source) (data.Source, error) { + source, err := compileSourceType(source) + if err != nil { + return source, err + } + + // find what object this source corresponds to + sourceType := source.SourceType + + if sourceType.RegexSong.MatchString(source.Url) { + source.ObjectType = data.SongSource + return source, nil + } + + if sourceType.RegexAlbum.MatchString(source.Url) { + source.ObjectType = data.AlbumSource + return source, nil + } + + if sourceType.RegexArtist.MatchString(source.Url) { + source.ObjectType = data.ArtistSource + return source, nil + } + + return source, errors.New("couldn't find corresponding object source on " + sourceType.Name + " for " + source.Url) } -func FetchSource(source data.Source) data.MusicObject { +func Fetch(source data.Source) (data.MusicObject, error) { + source, err := compileSource(source) + if err != nil { + return nil, err + } + plugin, ok := namePlugins[source.SourceType.Name] + if !ok { + return nil, errors.New("didn't find plugin of the name " + source.SourceType.Name) + } + + if source.ObjectType == data.SongSource { + return plugin.FetchSong(source) + } + + if source.ObjectType == data.AlbumSource { + return plugin.FetchAlbum(source) + } + + if source.ObjectType == data.ArtistSource { + return plugin.FetchArtist(source) + } + + return nil, nil } diff --git a/internal/plugin/musify.go b/internal/plugin/musify.go index 1f25755..b301a29 100644 --- a/internal/plugin/musify.go +++ b/internal/plugin/musify.go @@ -14,25 +14,33 @@ func (m Musify) Name() string { } func (m Musify) Regex() *regexp.Regexp { - return regexp.MustCompile(`(?i)https?://musify\.club/(artist|track|release)/[a-z\-0-9]+`) + return regexp.MustCompile(`(?i)https?://musify\.club/(artist|release|track)/[a-z\-0-9]+`) } -func (m *Musify) Fetch(source data.Source) data.MusicObject { +func (m Musify) RegexArtist() *regexp.Regexp { + return regexp.MustCompile(`(?i)https?://musify\.club/artist/[a-z\-0-9]+`) +} + +func (m Musify) RegexAlbum() *regexp.Regexp { + return regexp.MustCompile(`(?i)https?://musify\.club/release/[a-z\-0-9]+`) +} + +func (m Musify) RegexSong() *regexp.Regexp { + return regexp.MustCompile(`(?i)https?://musify\.club/track/[a-z\-0-9]+`) +} + +func (m *Musify) FetchArtist(source data.Source) (data.Artist, error) { panic("unimplemented") } -func (m *Musify) FetchAlbum(source data.Source) data.Album { +func (m *Musify) FetchAlbum(source data.Source) (data.Album, error) { panic("unimplemented") } -func (m *Musify) FetchArtist(source data.Source) data.Artist { +func (m *Musify) FetchSong(source data.Source) (data.Song, error) { panic("unimplemented") } -func (m *Musify) FetchSong(source data.Source) data.Song { - panic("unimplemented") -} - -func (m *Musify) Search(query string) []data.MusicObject { +func (m *Musify) Search(query string) ([]data.MusicObject, error) { panic("unimplemented") } diff --git a/main.go b/main.go index 5c9f98b..7aed47f 100644 --- a/main.go +++ b/main.go @@ -4,13 +4,9 @@ import ( "fmt" "gitea.elara.ws/Hazel/music-kraken/internal/data" - "gitea.elara.ws/Hazel/music-kraken/internal/plugin" ) func main() { - plugins := []plugin.Plugin{ - &plugin.Musify{}, - } fmt.Println("music kraken") data.GetSourceType("Youtube") }