Compare commits

...

2 Commits

Author SHA1 Message Date
Hazel Noack
fefa69e92a draft 2025-10-06 16:50:55 +02:00
Hazel Noack
b1cc6506d0 added musify test 2025-10-06 15:21:55 +02:00
8 changed files with 141 additions and 6 deletions

6
.vscode/settings.json vendored Normal file
View File

@ -0,0 +1,6 @@
{
"cSpell.words": [
"musify",
"Musify"
]
}

View File

@ -1 +0,0 @@
package data

View File

@ -1,15 +1,39 @@
package data package data
type MusicObject interface {
}
type Song struct { type Song struct {
Id int Id int
Name string Name string
UnifiedName string UnifiedName string
Isrc string
Genre string Album Album
Note string Artists []Artist
Tracksort int
Artwork string Sources []Source
}
type Album struct {
Id int
Name string
UnifiedName string
Songs []Song
Artists []Artist
Sources []Source
}
type Artist struct {
Id int
Name string
UnifiedName string
Albums []Album
Sources []Source Sources []Source
} }

View File

@ -12,6 +12,7 @@ type SourceType struct {
var SourceTypes = []SourceType{ var SourceTypes = []SourceType{
{Name: "Youtube", Regex: *regexp.MustCompile(`(?i)\b(?:https?:\/\/)?(?:www\.)?(?:youtube\.com\/(?:[^\/\n\s]+\/\S+\/|(?:v|e(?:mbed)?)\/|\S*?[?&]v=)|youtu\.be\/)([a-zA-Z0-9_-]{11})\b`)}, {Name: "Youtube", Regex: *regexp.MustCompile(`(?i)\b(?:https?:\/\/)?(?:www\.)?(?:youtube\.com\/(?:[^\/\n\s]+\/\S+\/|(?:v|e(?:mbed)?)\/|\S*?[?&]v=)|youtu\.be\/)([a-zA-Z0-9_-]{11})\b`)},
{Name: "Musify", Regex: *regexp.MustCompile(`(?i)https?://musify\.club/(artist|track|release)/[a-z\-0-9]+`)},
} }
func GetSourceType(name string) *SourceType { func GetSourceType(name string) *SourceType {

View File

@ -38,3 +38,33 @@ func TestYouTube(t *testing.T) {
} }
} }
} }
func TestMusify(t *testing.T) {
validUrls := []string{
"https://musify.club/artist/plohoyparen-645023",
"https://musify.club/track/plohoyparen-obgon-dve-sploshnie-poh-voobshe-9769231",
"https://musify.club/release/plohoyparen-hello-my-name-2018-1029885",
"https://musify.clUb/Release/plohoyParen-hello-my-name-2018-1029885",
}
invalidUrls := []string{
"https://musify.club/",
"https://musify.club/not-data-type",
"https://m.youtube.com/watch?v=dQw4w9WgXcQ",
}
st := GetSourceType("Musify")
for _, u := range validUrls {
_, err := st.NewSource(u)
if err != nil {
t.Errorf(`%q is a valid musify url`, u)
}
}
for _, u := range invalidUrls {
_, err := st.NewSource(u)
if err == nil {
t.Errorf(`%q is an invalid musify url`, u)
}
}
}

View File

@ -0,0 +1,37 @@
package plugin
import (
"reflect"
"regexp"
"gitea.elara.ws/Hazel/music-kraken/internal/data"
)
type Plugin interface {
GetRegex() regexp.Regexp
Search(query string) []data.MusicObject
Fetch(source data.Source) data.MusicObject
FetchSong(source data.Source) data.Song
FetchAlbum(source data.Source) data.Album
FetchArtist(source data.Source) data.Artist
}
var plugins map[string]Plugin = make(map[string]Plugin)
func AddPlugin(plugin Plugin) {
name := reflect.TypeOf(plugin).Name()
sourceType := data.SourceType{
Name: reflect.TypeOf(plugin).Name(),
Regex: plugin.GetRegex(),
}
plugins[name] = pluginStorage{
plugin: plugin,
sourceType: sourceType,
}
data.SourceTypes = append(data.SourceTypes, &sourceType)
}

34
internal/plugin/musify.go Normal file
View File

@ -0,0 +1,34 @@
package plugin
import (
"regexp"
"gitea.elara.ws/Hazel/music-kraken/internal/data"
)
type Musify struct {
}
func (m *Musify) GetRegex() regexp.Regexp {
return *regexp.MustCompile(`(?i)https?://musify\.club/(artist|track|release)/[a-z\-0-9]+`)
}
func (m *Musify) Fetch(source data.Source) data.MusicObject {
panic("unimplemented")
}
func (m *Musify) FetchAlbum(source data.Source) data.Album {
panic("unimplemented")
}
func (m *Musify) FetchArtist(source data.Source) data.Artist {
panic("unimplemented")
}
func (m *Musify) FetchSong(source data.Source) data.Song {
panic("unimplemented")
}
func (m *Musify) Search(query string) []data.MusicObject {
panic("unimplemented")
}

View File

@ -4,9 +4,13 @@ import (
"fmt" "fmt"
"gitea.elara.ws/Hazel/music-kraken/internal/data" "gitea.elara.ws/Hazel/music-kraken/internal/data"
"gitea.elara.ws/Hazel/music-kraken/internal/plugin"
) )
func main() { func main() {
plugins := []plugin.Plugin{
&plugin.Musify{},
}
fmt.Println("music kraken") fmt.Println("music kraken")
data.GetSourceType("Youtube") data.GetSourceType("Youtube")
} }