diff --git a/main.go b/main.go index c750756..fef1302 100644 --- a/main.go +++ b/main.go @@ -405,7 +405,7 @@ func contains(slice []string, item string) bool { func ripTrack(track *task.Track, token string, mediaUserToken string) { var err error 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 if track.Type == "music-videos" { @@ -620,6 +620,7 @@ func ripStation(albumId string, token string, storefront string, mediaUserToken if err != nil { return err } + fmt.Println(" -", station.Type) meta := station.Resp var Codec string @@ -1394,7 +1395,7 @@ func writeMP4Tags(track *task.Track, lrc string) error { t.ItunesArtistID = int32(artistID) } - if track.PreType == "playlists" && !Config.UseSongInfoForPlaylist { + if (track.PreType == "playlists" || track.PreType == "stations") && !Config.UseSongInfoForPlaylist { t.DiscNumber = 1 t.DiscTotal = 1 t.TrackNumber = int16(track.TaskNum) @@ -1403,7 +1404,7 @@ func writeMP4Tags(track *task.Track, lrc string) error { t.AlbumSort = track.PlaylistData.Attributes.Name t.AlbumArtist = 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所在的专辑信息 len := len(track.AlbumData.Relationships.Tracks.Data) t.DiscTotal = int16(track.AlbumData.Relationships.Tracks.Data[len-1].Attributes.DiscNumber) @@ -1522,22 +1523,23 @@ func main() { albumTotal := len(os.Args) for { 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 //mv dl dev if strings.Contains(urlRaw, "/music-video/") { + fmt.Println("Music Video") if debug_mode { continue } counter.Total++ 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++ continue } 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++ continue } @@ -1562,6 +1564,7 @@ func main() { continue } if strings.Contains(urlRaw, "/song/") { + fmt.Printf("Song->") urlRaw, err = getUrlSong(urlRaw, token) dl_song = true if err != nil { @@ -1575,21 +1578,24 @@ func main() { var urlArg_i = parse.Query().Get("i") if strings.Contains(urlRaw, "/album/") { + fmt.Println("Album") storefront, albumId = checkUrl(urlRaw) err := ripAlbum(albumId, token, storefront, Config.MediaUserToken, urlArg_i) if err != nil { fmt.Println("Failed to rip album:", err) } } else if strings.Contains(urlRaw, "/playlist/") { + fmt.Println("Playlist") storefront, albumId = checkUrlPlaylist(urlRaw) err := ripPlaylist(albumId, token, storefront, Config.MediaUserToken) if err != nil { fmt.Println("Failed to rip playlist:", err) } } else if strings.Contains(urlRaw, "/station/") { + fmt.Printf("Station") storefront, albumId = checkUrlStation(urlRaw) 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 } err := ripStation(albumId, token, storefront, Config.MediaUserToken) @@ -1597,7 +1603,7 @@ func main() { fmt.Println("Failed to rip station:", err) } } 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) diff --git a/utils/runv3/runv3.go b/utils/runv3/runv3.go index 1bf3404..66b21e1 100644 --- a/utils/runv3/runv3.go +++ b/utils/runv3/runv3.go @@ -367,35 +367,35 @@ func ExtMvData(keyAndUrls string, savePath string) error { pipeReaders := make([]*io.PipeReader, len(urls)) var wg sync.WaitGroup //最多同时5个下载请求 - sem :=make(chan int, 10) + sem :=make(chan int, 5) go func(pipeReaders []*io.PipeReader) { - for i, url := range urls { - pr, pw := io.Pipe() - pipeReaders[i] = pr - sem <- 1 - wg.Add(1) - go func(i int, url string, pw *io.PipeWriter) { - //fmt.Printf("协程 %d 开始\n", i) - defer wg.Done() - resp, err := http.Get(url) - if err != nil { - // 出错时,通过 CloseWithError 通知后续读取端 - pw.CloseWithError(err) - fmt.Printf("下载 %s 失败: %v\n", url, err) - return - } - defer resp.Body.Close() - // 将 HTTP 响应体通过 pipe 写出(实现流式传输) - _, err = io.Copy(pw, resp.Body) - // 将可能的错误传递给 pipe - pw.CloseWithError(err) - }(i, url, pw) - } - }(pipeReaders) + for i, url := range urls { + pr, pw := io.Pipe() + pipeReaders[i] = pr + sem <- 1 + wg.Add(1) + go func(i int, url string, pw *io.PipeWriter) { + //fmt.Printf("协程 %d 开始\n", i) + defer wg.Done() + resp, err := http.Get(url) + if err != nil { + // 出错时,通过 CloseWithError 通知后续读取端 + pw.CloseWithError(err) + fmt.Printf("下载 %s 失败: %v\n", url, err) + return + } + defer resp.Body.Close() + // 将 HTTP 响应体通过 pipe 写出(实现流式传输) + _, err = io.Copy(pw, resp.Body) + // 将可能的错误传递给 pipe + pw.CloseWithError(err) + }(i, url, pw) + } + }(pipeReaders) // 按顺序读取每个 pipe 的数据并写入文件 for i := range len(urls) { - <-sem - //fmt.Printf("写入 %d 开始\n", i) + <-sem + //fmt.Printf("写入 %d 开始\n", i) if _, err := io.Copy(barWriter, pipeReaders[i]); err != nil { fmt.Printf("写入第 %d 部分失败: %v\n", i+1, err) return err diff --git a/utils/task/station.go b/utils/task/station.go index 478167d..221a529 100644 --- a/utils/task/station.go +++ b/utils/task/station.go @@ -88,6 +88,8 @@ func (a *Station) GetResp(mutoken, token, l string) error { PreID: a.ID, AlbumData: albumResp.Data[0], }) + a.Tracks[i].PlaylistData.Attributes.Name = a.Name + a.Tracks[i].PlaylistData.Attributes.ArtistName = "Apple Music Station" } return nil }