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.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() {
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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]+"),
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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"
|
||||||
}
|
}
|
||||||
|
|||||||
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
|
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]+"),
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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{
|
||||||
|
|||||||
Reference in New Issue
Block a user