From bec3112c2015f1cf22d769a6bf90fa491c5f3415 Mon Sep 17 00:00:00 2001 From: aynakeya Date: Sat, 5 Jul 2025 02:04:10 +0800 Subject: [PATCH] add support quality method & add quality cmd in cmdline tool --- cmd/miaosic/cmds/quality.go | 34 +++++++++++++++++++++++++++ cmd/miaosic/main.go | 1 + miaosic.go | 1 + providers/bilivideo/bilivideo.go | 4 ++++ providers/kugou/kugou.go | 27 ++++++++++++++++++--- providers/kugou/kugou_instrumental.go | 4 ++++ providers/kugou/quality.go | 15 ++++++++++++ providers/kuwo/kuwo.go | 4 ++++ providers/local/local.go | 4 ++++ providers/netease/media.go | 4 ++++ 10 files changed, 95 insertions(+), 3 deletions(-) create mode 100644 cmd/miaosic/cmds/quality.go create mode 100644 providers/kugou/quality.go diff --git a/cmd/miaosic/cmds/quality.go b/cmd/miaosic/cmds/quality.go new file mode 100644 index 0000000..3dcb090 --- /dev/null +++ b/cmd/miaosic/cmds/quality.go @@ -0,0 +1,34 @@ +package cmds + +import ( + "fmt" + "github.com/AynaLivePlayer/miaosic" + "github.com/spf13/cobra" + "os" +) + +var CmdQuality = &cobra.Command{ + Use: "quality ", + Short: "List supported qualities for a provider", + Args: cobra.ExactArgs(1), + Run: func(cmd *cobra.Command, args []string) { + providerName := args[0] + + provider, ok := miaosic.GetProvider(providerName) + if !ok { + fmt.Printf("Provider not found: %s\n", providerName) + os.Exit(1) + } + + qualities := provider.Qualities() + if len(qualities) == 0 { + fmt.Printf("No qualities found for provider: %s\n", providerName) + return + } + + fmt.Printf("Supported qualities for %s:\n", providerName) + for i, quality := range qualities { + fmt.Printf("%d. %s\n", i+1, quality) + } + }, +} diff --git a/cmd/miaosic/main.go b/cmd/miaosic/main.go index 76d0536..02c8410 100644 --- a/cmd/miaosic/main.go +++ b/cmd/miaosic/main.go @@ -43,6 +43,7 @@ func init() { rootCmd.AddCommand(cmds.CmdInfo) rootCmd.AddCommand(cmds.CmdUrl) rootCmd.AddCommand(cmds.CmdLyric) + rootCmd.AddCommand(cmds.CmdQuality) } func main() { diff --git a/miaosic.go b/miaosic.go index 850f4df..8c82ec9 100644 --- a/miaosic.go +++ b/miaosic.go @@ -86,6 +86,7 @@ func (p *Playlist) Copy() Playlist { type MediaProvider interface { // GetName returns the name of the provider. GetName() string + Qualities() []Quality // Search returns a list of MetaData. Search(keyword string, page, size int) ([]MediaInfo, error) diff --git a/providers/bilivideo/bilivideo.go b/providers/bilivideo/bilivideo.go index 742d1bd..da372dc 100644 --- a/providers/bilivideo/bilivideo.go +++ b/providers/bilivideo/bilivideo.go @@ -31,6 +31,10 @@ type BilibiliVideo struct { cidApi dphttp.ApiResultFunc[string, []string] } +func (b *BilibiliVideo) Qualities() []miaosic.Quality { + return []miaosic.Quality{miaosic.QualityAny} +} + func NewBilibiliViedo() *BilibiliVideo { pvdr := &BilibiliVideo{ BVRegex: regexp.MustCompile("^BV[0-9A-Za-z]+"), diff --git a/providers/kugou/kugou.go b/providers/kugou/kugou.go index 503bb37..e4352cb 100644 --- a/providers/kugou/kugou.go +++ b/providers/kugou/kugou.go @@ -15,6 +15,7 @@ import ( "net/http" "net/url" "regexp" + "slices" "strings" "time" ) @@ -39,6 +40,19 @@ type Kugou struct { dfid string // dfid. default should be "-" } +func (k *Kugou) Qualities() []miaosic.Quality { + return []miaosic.Quality{ + Quality128k, + Quality320k, + QualityFlac, + QualityHigh, + QualityViperTape, + QualityViperClear, + QualityViperHiFi, + QualityViperAtmosphere, + } +} + func (k *Kugou) cookieString() string { var cookieStr strings.Builder for key, value := range k.cookie { @@ -151,9 +165,10 @@ func (k *Kugou) MatchMedia(uri string) (miaosic.MetaData, bool) { return miaosic.MetaData{}, false } -func (k *Kugou) GetMediaUrl(meta miaosic.MetaData, quality miaosic.Quality) ([]miaosic.MediaUrl, error) { - //albumId := jsonResp.Get("data.0.audio_id").String() - currentUnix := time.Now().UnixMilli() +func (k *Kugou) quality2str(quality miaosic.Quality) string { + if slices.Contains(k.Qualities(), quality) { + return string(quality) + } var qualityStr string if strings.HasPrefix(string(quality), "magic_") { qualityStr = string(quality) @@ -173,7 +188,13 @@ func (k *Kugou) GetMediaUrl(meta miaosic.MetaData, quality miaosic.Quality) ([]m qualityStr = "320" } } + return qualityStr +} +func (k *Kugou) GetMediaUrl(meta miaosic.MetaData, quality miaosic.Quality) ([]miaosic.MediaUrl, error) { + //albumId := jsonResp.Get("data.0.audio_id").String() + currentUnix := time.Now().UnixMilli() + qualityStr := k.quality2str(quality) data := map[string]any{ "album_audio_id": 0, "appid": k.appid, diff --git a/providers/kugou/kugou_instrumental.go b/providers/kugou/kugou_instrumental.go index ddb00ca..d19d1d0 100644 --- a/providers/kugou/kugou_instrumental.go +++ b/providers/kugou/kugou_instrumental.go @@ -8,6 +8,10 @@ type KugouInstrumental struct { k *Kugou } +func (k *KugouInstrumental) Qualities() []miaosic.Quality { + return []miaosic.Quality{"magic_acappella"} +} + func (k *KugouInstrumental) GetName() string { return "kugou-instr" } diff --git a/providers/kugou/quality.go b/providers/kugou/quality.go new file mode 100644 index 0000000..78f0bd1 --- /dev/null +++ b/providers/kugou/quality.go @@ -0,0 +1,15 @@ +package kugou + +import "github.com/AynaLivePlayer/miaosic" + +const ( + // todo 添加魔法音质, "dolby" + Quality128k miaosic.Quality = "128" // 标准音质 + Quality320k miaosic.Quality = "320" // 高品音质 + QualityFlac miaosic.Quality = "flac" // 无损音质 + QualityHigh miaosic.Quality = "high" // Hi-Res音质 + QualityViperTape miaosic.Quality = "viper_tape" // 蝰蛇母带 少部分有 如果没有会返回320k + QualityViperClear miaosic.Quality = "viper_clear" // 蝰蛇超清 + QualityViperHiFi miaosic.Quality = "viper_hifi" // 蝰蛇hifi + QualityViperAtmosphere miaosic.Quality = "viper_atmos" // 蝰蛇全景声 +) diff --git a/providers/kuwo/kuwo.go b/providers/kuwo/kuwo.go index b0a44db..a1730f2 100644 --- a/providers/kuwo/kuwo.go +++ b/providers/kuwo/kuwo.go @@ -26,6 +26,10 @@ type Kuwo struct { header map[string]string } +func (k *Kuwo) Qualities() []miaosic.Quality { + return []miaosic.Quality{miaosic.QualityAny} +} + func NewKuwo() *Kuwo { kw := &Kuwo{ PlaylistRegex0: regexp.MustCompile("[0-9]+"), diff --git a/providers/local/local.go b/providers/local/local.go index 0931299..fdb22d1 100644 --- a/providers/local/local.go +++ b/providers/local/local.go @@ -31,6 +31,10 @@ type Local struct { playlists map[string]*localPlaylist } +func (l *Local) Qualities() []miaosic.Quality { + return []miaosic.Quality{miaosic.QualityAny} +} + func NewLocal(localdir string) *Local { l := &Local{localDir: localdir, playlists: make(map[string]*localPlaylist, 0)} if err := os.MkdirAll(localdir, 0755); err != nil { diff --git a/providers/netease/media.go b/providers/netease/media.go index b0fcb6d..caa119e 100644 --- a/providers/netease/media.go +++ b/providers/netease/media.go @@ -20,6 +20,10 @@ type Netease struct { PlaylistRegex1 *regexp.Regexp } +func (n *Netease) Qualities() []miaosic.Quality { + return []miaosic.Quality{miaosic.QualityAny} +} + func NewNetease() *Netease { return &Netease{ ReqData: neteaseUtil.RequestData{