implemented proper fetching and matching the source
This commit is contained in:
parent
62cb5259ac
commit
6fd2478359
@ -1,13 +1,15 @@
|
||||
package data
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"regexp"
|
||||
)
|
||||
|
||||
type SourceType struct {
|
||||
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
|
||||
SourceType *SourceType
|
||||
ObjectType ObjectType
|
||||
}
|
||||
|
@ -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{}
|
||||
@ -26,33 +29,79 @@ func RegisterPlugin(plugin Plugin) {
|
||||
|
||||
nameSourceType[name] = data.SourceType{
|
||||
Name: name,
|
||||
Regex: plugin.GetRegex(),
|
||||
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
|
||||
}
|
||||
|
@ -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")
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user