style: 显示优化

This commit is contained in:
itouakirai
2025-03-04 13:45:48 +08:00
parent 7dcd164885
commit c9ecc16a3b
3 changed files with 42 additions and 34 deletions

22
main.go
View File

@@ -405,7 +405,7 @@ func contains(slice []string, item string) bool {
func ripTrack(track *task.Track, token string, mediaUserToken string) { func ripTrack(track *task.Track, token string, mediaUserToken string) {
var err error var err error
counter.Total++ counter.Total++
fmt.Printf("Track %d of %d:\n", track.TaskNum, track.TaskTotal) fmt.Printf("Track %d of %d: %s\n", track.TaskNum, track.TaskTotal, track.Type)
//mv dl dev //mv dl dev
if track.Type == "music-videos" { if track.Type == "music-videos" {
@@ -620,6 +620,7 @@ func ripStation(albumId string, token string, storefront string, mediaUserToken
if err != nil { if err != nil {
return err return err
} }
fmt.Println(" -", station.Type)
meta := station.Resp meta := station.Resp
var Codec string var Codec string
@@ -1394,7 +1395,7 @@ func writeMP4Tags(track *task.Track, lrc string) error {
t.ItunesArtistID = int32(artistID) t.ItunesArtistID = int32(artistID)
} }
if track.PreType == "playlists" && !Config.UseSongInfoForPlaylist { if (track.PreType == "playlists" || track.PreType == "stations") && !Config.UseSongInfoForPlaylist {
t.DiscNumber = 1 t.DiscNumber = 1
t.DiscTotal = 1 t.DiscTotal = 1
t.TrackNumber = int16(track.TaskNum) t.TrackNumber = int16(track.TaskNum)
@@ -1403,7 +1404,7 @@ func writeMP4Tags(track *task.Track, lrc string) error {
t.AlbumSort = track.PlaylistData.Attributes.Name t.AlbumSort = track.PlaylistData.Attributes.Name
t.AlbumArtist = track.PlaylistData.Attributes.ArtistName t.AlbumArtist = track.PlaylistData.Attributes.ArtistName
t.AlbumArtistSort = track.PlaylistData.Attributes.ArtistName t.AlbumArtistSort = track.PlaylistData.Attributes.ArtistName
} else if (track.PreType == "playlists" && Config.UseSongInfoForPlaylist) || track.PreType == "stations" { } else if (track.PreType == "playlists" || track.PreType == "stations") && Config.UseSongInfoForPlaylist {
//使用提前获取到的播放列表下track所在的专辑信息 //使用提前获取到的播放列表下track所在的专辑信息
len := len(track.AlbumData.Relationships.Tracks.Data) len := len(track.AlbumData.Relationships.Tracks.Data)
t.DiscTotal = int16(track.AlbumData.Relationships.Tracks.Data[len-1].Attributes.DiscNumber) t.DiscTotal = int16(track.AlbumData.Relationships.Tracks.Data[len-1].Attributes.DiscNumber)
@@ -1522,22 +1523,23 @@ func main() {
albumTotal := len(os.Args) albumTotal := len(os.Args)
for { for {
for albumNum, urlRaw := range os.Args { for albumNum, urlRaw := range os.Args {
fmt.Printf("Album %d of %d:\n", albumNum+1, albumTotal) fmt.Printf("Queue %d of %d: ", albumNum+1, albumTotal)
var storefront, albumId string var storefront, albumId string
//mv dl dev //mv dl dev
if strings.Contains(urlRaw, "/music-video/") { if strings.Contains(urlRaw, "/music-video/") {
fmt.Println("Music Video")
if debug_mode { if debug_mode {
continue continue
} }
counter.Total++ counter.Total++
if len(Config.MediaUserToken) <= 50 { if len(Config.MediaUserToken) <= 50 {
fmt.Println("meida-user-token is not set, skip MV dl") fmt.Println(": meida-user-token is not set, skip MV dl")
counter.Success++ counter.Success++
continue continue
} }
if _, err := exec.LookPath("mp4decrypt"); err != nil { if _, err := exec.LookPath("mp4decrypt"); err != nil {
fmt.Println("mp4decrypt is not found, skip MV dl") fmt.Println(": mp4decrypt is not found, skip MV dl")
counter.Success++ counter.Success++
continue continue
} }
@@ -1562,6 +1564,7 @@ func main() {
continue continue
} }
if strings.Contains(urlRaw, "/song/") { if strings.Contains(urlRaw, "/song/") {
fmt.Printf("Song->")
urlRaw, err = getUrlSong(urlRaw, token) urlRaw, err = getUrlSong(urlRaw, token)
dl_song = true dl_song = true
if err != nil { if err != nil {
@@ -1575,21 +1578,24 @@ func main() {
var urlArg_i = parse.Query().Get("i") var urlArg_i = parse.Query().Get("i")
if strings.Contains(urlRaw, "/album/") { if strings.Contains(urlRaw, "/album/") {
fmt.Println("Album")
storefront, albumId = checkUrl(urlRaw) storefront, albumId = checkUrl(urlRaw)
err := ripAlbum(albumId, token, storefront, Config.MediaUserToken, urlArg_i) err := ripAlbum(albumId, token, storefront, Config.MediaUserToken, urlArg_i)
if err != nil { if err != nil {
fmt.Println("Failed to rip album:", err) fmt.Println("Failed to rip album:", err)
} }
} else if strings.Contains(urlRaw, "/playlist/") { } else if strings.Contains(urlRaw, "/playlist/") {
fmt.Println("Playlist")
storefront, albumId = checkUrlPlaylist(urlRaw) storefront, albumId = checkUrlPlaylist(urlRaw)
err := ripPlaylist(albumId, token, storefront, Config.MediaUserToken) err := ripPlaylist(albumId, token, storefront, Config.MediaUserToken)
if err != nil { if err != nil {
fmt.Println("Failed to rip playlist:", err) fmt.Println("Failed to rip playlist:", err)
} }
} else if strings.Contains(urlRaw, "/station/") { } else if strings.Contains(urlRaw, "/station/") {
fmt.Printf("Station")
storefront, albumId = checkUrlStation(urlRaw) storefront, albumId = checkUrlStation(urlRaw)
if len(Config.MediaUserToken) <= 50 { if len(Config.MediaUserToken) <= 50 {
fmt.Println("meida-user-token is not set, skip station dl") fmt.Println(": meida-user-token is not set, skip station dl")
continue continue
} }
err := ripStation(albumId, token, storefront, Config.MediaUserToken) err := ripStation(albumId, token, storefront, Config.MediaUserToken)
@@ -1597,7 +1603,7 @@ func main() {
fmt.Println("Failed to rip station:", err) fmt.Println("Failed to rip station:", err)
} }
} else { } else {
fmt.Println("Invalid URL.") fmt.Println("Invalid type")
} }
} }
fmt.Printf("======= [\u2714 ] Completed: %d/%d | [\u26A0 ] Warnings: %d | [\u2716 ] Errors: %d =======\n", counter.Success, counter.Total, counter.Unavailable+counter.NotSong, counter.Error) fmt.Printf("======= [\u2714 ] Completed: %d/%d | [\u26A0 ] Warnings: %d | [\u2716 ] Errors: %d =======\n", counter.Success, counter.Total, counter.Unavailable+counter.NotSong, counter.Error)

View File

@@ -367,35 +367,35 @@ func ExtMvData(keyAndUrls string, savePath string) error {
pipeReaders := make([]*io.PipeReader, len(urls)) pipeReaders := make([]*io.PipeReader, len(urls))
var wg sync.WaitGroup var wg sync.WaitGroup
//最多同时5个下载请求 //最多同时5个下载请求
sem :=make(chan int, 10) sem :=make(chan int, 5)
go func(pipeReaders []*io.PipeReader) { go func(pipeReaders []*io.PipeReader) {
for i, url := range urls { for i, url := range urls {
pr, pw := io.Pipe() pr, pw := io.Pipe()
pipeReaders[i] = pr pipeReaders[i] = pr
sem <- 1 sem <- 1
wg.Add(1) wg.Add(1)
go func(i int, url string, pw *io.PipeWriter) { go func(i int, url string, pw *io.PipeWriter) {
//fmt.Printf("协程 %d 开始\n", i) //fmt.Printf("协程 %d 开始\n", i)
defer wg.Done() defer wg.Done()
resp, err := http.Get(url) resp, err := http.Get(url)
if err != nil { if err != nil {
// 出错时,通过 CloseWithError 通知后续读取端 // 出错时,通过 CloseWithError 通知后续读取端
pw.CloseWithError(err) pw.CloseWithError(err)
fmt.Printf("下载 %s 失败: %v\n", url, err) fmt.Printf("下载 %s 失败: %v\n", url, err)
return return
} }
defer resp.Body.Close() defer resp.Body.Close()
// 将 HTTP 响应体通过 pipe 写出(实现流式传输) // 将 HTTP 响应体通过 pipe 写出(实现流式传输)
_, err = io.Copy(pw, resp.Body) _, err = io.Copy(pw, resp.Body)
// 将可能的错误传递给 pipe // 将可能的错误传递给 pipe
pw.CloseWithError(err) pw.CloseWithError(err)
}(i, url, pw) }(i, url, pw)
} }
}(pipeReaders) }(pipeReaders)
// 按顺序读取每个 pipe 的数据并写入文件 // 按顺序读取每个 pipe 的数据并写入文件
for i := range len(urls) { for i := range len(urls) {
<-sem <-sem
//fmt.Printf("写入 %d 开始\n", i) //fmt.Printf("写入 %d 开始\n", i)
if _, err := io.Copy(barWriter, pipeReaders[i]); err != nil { if _, err := io.Copy(barWriter, pipeReaders[i]); err != nil {
fmt.Printf("写入第 %d 部分失败: %v\n", i+1, err) fmt.Printf("写入第 %d 部分失败: %v\n", i+1, err)
return err return err

View File

@@ -88,6 +88,8 @@ func (a *Station) GetResp(mutoken, token, l string) error {
PreID: a.ID, PreID: a.ID,
AlbumData: albumResp.Data[0], AlbumData: albumResp.Data[0],
}) })
a.Tracks[i].PlaylistData.Attributes.Name = a.Name
a.Tracks[i].PlaylistData.Attributes.ArtistName = "Apple Music Station"
} }
return nil return nil
} }