add support quality method & add quality cmd in cmdline tool

This commit is contained in:
aynakeya
2025-07-05 02:04:10 +08:00
parent 5f59badfe1
commit bec3112c20
10 changed files with 95 additions and 3 deletions

View File

@@ -0,0 +1,34 @@
package cmds
import (
"fmt"
"github.com/AynaLivePlayer/miaosic"
"github.com/spf13/cobra"
"os"
)
var CmdQuality = &cobra.Command{
Use: "quality <provider>",
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)
}
},
}

View File

@@ -43,6 +43,7 @@ func init() {
rootCmd.AddCommand(cmds.CmdInfo) rootCmd.AddCommand(cmds.CmdInfo)
rootCmd.AddCommand(cmds.CmdUrl) rootCmd.AddCommand(cmds.CmdUrl)
rootCmd.AddCommand(cmds.CmdLyric) rootCmd.AddCommand(cmds.CmdLyric)
rootCmd.AddCommand(cmds.CmdQuality)
} }
func main() { func main() {

View File

@@ -86,6 +86,7 @@ func (p *Playlist) Copy() Playlist {
type MediaProvider interface { type MediaProvider interface {
// GetName returns the name of the provider. // GetName returns the name of the provider.
GetName() string GetName() string
Qualities() []Quality
// Search returns a list of MetaData. // Search returns a list of MetaData.
Search(keyword string, page, size int) ([]MediaInfo, error) Search(keyword string, page, size int) ([]MediaInfo, error)

View File

@@ -31,6 +31,10 @@ type BilibiliVideo struct {
cidApi dphttp.ApiResultFunc[string, []string] cidApi dphttp.ApiResultFunc[string, []string]
} }
func (b *BilibiliVideo) Qualities() []miaosic.Quality {
return []miaosic.Quality{miaosic.QualityAny}
}
func NewBilibiliViedo() *BilibiliVideo { func NewBilibiliViedo() *BilibiliVideo {
pvdr := &BilibiliVideo{ pvdr := &BilibiliVideo{
BVRegex: regexp.MustCompile("^BV[0-9A-Za-z]+"), BVRegex: regexp.MustCompile("^BV[0-9A-Za-z]+"),

View File

@@ -15,6 +15,7 @@ import (
"net/http" "net/http"
"net/url" "net/url"
"regexp" "regexp"
"slices"
"strings" "strings"
"time" "time"
) )
@@ -39,6 +40,19 @@ type Kugou struct {
dfid string // dfid. default should be "-" 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 { func (k *Kugou) cookieString() string {
var cookieStr strings.Builder var cookieStr strings.Builder
for key, value := range k.cookie { for key, value := range k.cookie {
@@ -151,9 +165,10 @@ func (k *Kugou) MatchMedia(uri string) (miaosic.MetaData, bool) {
return miaosic.MetaData{}, false return miaosic.MetaData{}, false
} }
func (k *Kugou) GetMediaUrl(meta miaosic.MetaData, quality miaosic.Quality) ([]miaosic.MediaUrl, error) { func (k *Kugou) quality2str(quality miaosic.Quality) string {
//albumId := jsonResp.Get("data.0.audio_id").String() if slices.Contains(k.Qualities(), quality) {
currentUnix := time.Now().UnixMilli() return string(quality)
}
var qualityStr string var qualityStr string
if strings.HasPrefix(string(quality), "magic_") { if strings.HasPrefix(string(quality), "magic_") {
qualityStr = string(quality) qualityStr = string(quality)
@@ -173,7 +188,13 @@ func (k *Kugou) GetMediaUrl(meta miaosic.MetaData, quality miaosic.Quality) ([]m
qualityStr = "320" 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{ data := map[string]any{
"album_audio_id": 0, "album_audio_id": 0,
"appid": k.appid, "appid": k.appid,

View File

@@ -8,6 +8,10 @@ type KugouInstrumental struct {
k *Kugou k *Kugou
} }
func (k *KugouInstrumental) Qualities() []miaosic.Quality {
return []miaosic.Quality{"magic_acappella"}
}
func (k *KugouInstrumental) GetName() string { func (k *KugouInstrumental) GetName() string {
return "kugou-instr" return "kugou-instr"
} }

View File

@@ -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" // 蝰蛇全景声
)

View File

@@ -26,6 +26,10 @@ type Kuwo struct {
header map[string]string header map[string]string
} }
func (k *Kuwo) Qualities() []miaosic.Quality {
return []miaosic.Quality{miaosic.QualityAny}
}
func NewKuwo() *Kuwo { func NewKuwo() *Kuwo {
kw := &Kuwo{ kw := &Kuwo{
PlaylistRegex0: regexp.MustCompile("[0-9]+"), PlaylistRegex0: regexp.MustCompile("[0-9]+"),

View File

@@ -31,6 +31,10 @@ type Local struct {
playlists map[string]*localPlaylist playlists map[string]*localPlaylist
} }
func (l *Local) Qualities() []miaosic.Quality {
return []miaosic.Quality{miaosic.QualityAny}
}
func NewLocal(localdir string) *Local { func NewLocal(localdir string) *Local {
l := &Local{localDir: localdir, playlists: make(map[string]*localPlaylist, 0)} l := &Local{localDir: localdir, playlists: make(map[string]*localPlaylist, 0)}
if err := os.MkdirAll(localdir, 0755); err != nil { if err := os.MkdirAll(localdir, 0755); err != nil {

View File

@@ -20,6 +20,10 @@ type Netease struct {
PlaylistRegex1 *regexp.Regexp PlaylistRegex1 *regexp.Regexp
} }
func (n *Netease) Qualities() []miaosic.Quality {
return []miaosic.Quality{miaosic.QualityAny}
}
func NewNetease() *Netease { func NewNetease() *Netease {
return &Netease{ return &Netease{
ReqData: neteaseUtil.RequestData{ ReqData: neteaseUtil.RequestData{