golang MusicBrainz WS2 API客户端插件库GoMusicBrainz的使用

GoMusicBrainz - Golang MusicBrainz WS2 API 客户端库

gopherbrainz Oo

GoMusicBrainz 是一个用于访问 MusicBrainz WS2 API 的 Golang 客户端库,目前仍在开发中。

当前状态

目前 GoMusicBrainz 提供了执行搜索和查找请求的方法,暂不支持浏览请求。

安装

$ go get github.com/michiwend/gomusicbrainz

搜索请求

GoMusicBrainz 为每种 WS2 搜索请求提供了搜索方法,形式如下:

func (*WS2Client) Search<ENTITY>(searchTerm, limit, offset) (<ENTITY>SearchResponse, error)

searchTerm 遵循 Apache Lucene 语法,可以包含多个带有逻辑运算符的字段,也可以只是一个简单的搜索字符串。关于 lucene 语法的更多细节,请参考 lucene.apache.org。MusicBrainz 网站提供了所有可能的查询字段信息。

示例

这个示例演示了一个简单的搜索请求,用于查找艺术家 “Parov Stelar”。你可以在示例文件夹中找到可运行的 Go 程序。

// 创建一个新的 WS2Client
client := gomusicbrainz.NewWS2Client(
    "https://musicbrainz.org/ws/2",
    "A GoMusicBrainz example",
    "0.0.1-beta",
    "http://github.com/michiwend/gomusicbrainz")

// 搜索艺术家
resp, _ := client.SearchArtist(`artist:"Parov Stelar"`, -1, -1)

// 打印每个返回艺术家的名称和分数
for _, artist := range resp.Artists {
    fmt.Printf("Name: %-25sScore: %d\n", artist.Name, resp.Scores[artist])
}

上面的代码将产生以下输出:

Name: Parov Stelar             Score: 100
Name: Parov Stelar Trio        Score: 80
Name: Parov Stelar & the Band  Score: 70

查找请求

GoMusicBrainz 提供了两种执行查找请求的方式:对于每个具有查找端点的实体,都有特定的查找方法,形式如下:

func(*WS2Client) Lookup<ETITY>(id MBID, inc ...string) (*<ENTITY>, error)

或者如果你已经有一个实现了 MBLookupEntity 接口的实体(带有 MBID),可以使用通用的查找方法:

func(*WS2Client) Lookup(entity MBLookupEntity, inc ...string) error

示例

以下示例演示了(特定的)LookupArtist 方法。你可以在示例文件夹中找到可运行的 Go 程序。

// 创建一个新的 WS2Client
client, _ := gomusicbrainz.NewWS2Client(
    "https://musicbrainz.org/ws/2",
    "A GoMusicBrainz example",
    "0.0.1-beta",
    "http://github.com/michiwend/gomusicbrainz")

// 通过 ID 查找艺术家
artist, err := client.LookupArtist("9a709693-b4f8-4da9-8cc1-038c911a61be")

if err != nil {
    fmt.Println(err)
    return
}

fmt.Printf("%+v", artist)

包文档

完整的包文档可以在 GoDoc 和 GoWalker 上找到。


更多关于golang MusicBrainz WS2 API客户端插件库GoMusicBrainz的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang MusicBrainz WS2 API客户端插件库GoMusicBrainz的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


GoMusicBrainz - MusicBrainz WS2 API 客户端库

GoMusicBrainz 是一个用于与 MusicBrainz 数据库交互的 Go 语言客户端库,实现了 MusicBrainz WS2 API。下面我将介绍如何使用这个库进行常见操作。

安装

首先安装 GoMusicBrainz 库:

go get github.com/michiwend/gomusicbrainz

基本使用

初始化客户端

package main

import (
	"fmt"
	"log"
	"github.com/michiwend/gomusicbrainz"
)

func main() {
	// 创建客户端实例
	client, err := gomusicbrainz.NewWS2Client(
		"https://musicbrainz.org/ws/2",
		"YourAppName/Version (contact@example.com)",
		gomusicbrainz.RateLimit25PerSecond,
	)
	if err != nil {
		log.Fatal(err)
	}
	
	// 使用客户端进行查询...
}

搜索艺术家

func searchArtist(client *gomusicbrainz.WS2Client, name string) {
	// 构建搜索查询
	query := fmt.Sprintf(`artist:"%s"`, name)
	
	// 执行搜索
	resp, err := client.SearchArtist(query, -1, -1)
	if err != nil {
		log.Fatal(err)
	}
	
	// 输出结果
	for _, artist := range resp.Artists {
		fmt.Printf("ID: %s, Name: %s, Type: %s\n", 
			artist.ID, artist.Name, artist.Type)
	}
}

获取艺术家详细信息

func getArtistDetails(client *gomusicbrainz.WS2Client, mbid string) {
	// 设置要包含的额外信息
	inc := gomusicbrainz.Inc{
		Recordings: true,
		Releases:   true,
	}
	
	// 获取艺术家信息
	artist, err := client.LookupArtist(mbid, inc)
	if err != nil {
		log.Fatal(err)
	}
	
	fmt.Printf("艺术家: %s\n", artist.Name)
	fmt.Println("专辑:")
	for _, release := range artist.Releases {
		fmt.Printf("- %s (%s)\n", release.Title, release.Date)
	}
}

搜索专辑

func searchRelease(client *gomusicbrainz.WS2Client, title string) {
	query := fmt.Sprintf(`release:"%s"`, title)
	
	resp, err := client.SearchRelease(query, -1, -1)
	if err != nil {
		log.Fatal(err)
	}
	
	for _, release := range resp.Releases {
		fmt.Printf("ID: %s, Title: %s, Artist: %s\n",
			release.ID, release.Title, release.ArtistCredit.NameCredit())
	}
}

获取专辑曲目列表

func getReleaseTracks(client *gomusicbrainz.WS2Client, mbid string) {
	// 包含曲目信息
	inc := gomusicbrainz.Inc{
		Recordings: true,
	}
	
	release, err := client.LookupRelease(mbid, inc)
	if err != nil {
		log.Fatal(err)
	}
	
	fmt.Printf("专辑: %s\n", release.Title)
	fmt.Println("曲目列表:")
	for _, medium := range release.Media {
		for _, track := range medium.Tracks {
			fmt.Printf("%d. %s (%s)\n", 
				track.Position, track.Recording.Title, track.Length)
		}
	}
}

高级功能

使用缓存

import (
	"github.com/michiwend/gomusicbrainz/cache"
)

func createClientWithCache() *gomusicbrainz.WS2Client {
	// 创建内存缓存
	memCache := cache.NewMemoryCache()
	
	client, err := gomusicbrainz.NewWS2Client(
		"https://musicbrainz.org/ws/2",
		"YourAppName/Version",
		gomusicbrainz.RateLimit25PerSecond,
	)
	if err != nil {
		log.Fatal(err)
	}
	
	// 设置缓存
	client.SetCache(memCache)
	
	return client
}

批量查询

func batchLookup(client *gomusicbrainz.WS2Client, mbids []string) {
	// 批量查询艺术家
	artists, err := client.BrowseArtists("", "", mbids, -1, -1)
	if err != nil {
		log.Fatal(err)
	}
	
	for _, artist := range artists.Artists {
		fmt.Println(artist.Name)
	}
}

注意事项

  1. 遵守 MusicBrainz 的使用条款
  2. 设置合理的用户代理字符串(包含应用名称和联系方式)
  3. 遵守 API 请求频率限制(默认25次/秒)
  4. 考虑使用缓存减少重复请求

GoMusicBrainz 提供了完整的 MusicBrainz WS2 API 覆盖,包括艺术家、专辑、曲目、标签等所有主要实体类型的查询功能。更多详细用法可以参考项目的GitHub页面

回到顶部