mirror of
https://github.com/AynaLivePlayer/miaosic.git
synced 2025-12-06 13:02:48 +08:00
add support quality method & add quality cmd in cmdline tool
This commit is contained in:
34
cmd/miaosic/cmds/quality.go
Normal file
34
cmd/miaosic/cmds/quality.go
Normal 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)
|
||||
}
|
||||
},
|
||||
}
|
||||
@@ -43,6 +43,7 @@ func init() {
|
||||
rootCmd.AddCommand(cmds.CmdInfo)
|
||||
rootCmd.AddCommand(cmds.CmdUrl)
|
||||
rootCmd.AddCommand(cmds.CmdLyric)
|
||||
rootCmd.AddCommand(cmds.CmdQuality)
|
||||
}
|
||||
|
||||
func main() {
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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]+"),
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
|
||||
15
providers/kugou/quality.go
Normal file
15
providers/kugou/quality.go
Normal 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" // 蝰蛇全景声
|
||||
)
|
||||
@@ -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]+"),
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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{
|
||||
|
||||
Reference in New Issue
Block a user