Merge pull request #33 from itouakirai/main

添加重试功能和warning统计
main
ZHAAREY 4 days ago committed by GitHub
commit eade99df4f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 97
      main.go

@ -84,8 +84,16 @@ type Config struct {
var config Config var config Config
var txtpath string var txtpath string
var oktrackNum int = 0 //统计结果
var trackTotalnum int = 0 var counter Counter
type Counter struct {
Unavailable int
NotSong int
Error int
Success int
Total int
}
var okDict = make(map[string][]int)
type SampleInfo struct { type SampleInfo struct {
data []byte data []byte
@ -1594,16 +1602,24 @@ func rip(albumId string, token string, storefront string, userToken string) erro
} }
for trackNum, track := range meta.Data[0].Relationships.Tracks.Data { for trackNum, track := range meta.Data[0].Relationships.Tracks.Data {
trackNum++ trackNum++
if isInArray(okDict[albumId], trackNum) {
//fmt.Println("已完成直接跳过.\n")
counter.Total++
counter.Success++
continue
}
if isInArray(selected, trackNum) { if isInArray(selected, trackNum) {
trackTotalnum += 1 counter.Total++
fmt.Printf("Track %d of %d:\n", trackNum, trackTotal) fmt.Printf("Track %d of %d:\n", trackNum, trackTotal)
manifest, err := getInfoFromAdam(track.ID, token, storefront) manifest, err := getInfoFromAdam(track.ID, token, storefront)
if err != nil { if err != nil {
fmt.Println("Failed to get manifest.\n", err) fmt.Println("Failed to get manifest.\n", err)
counter.NotSong++
continue continue
} }
if manifest.Attributes.ExtendedAssetUrls.EnhancedHls == "" { if manifest.Attributes.ExtendedAssetUrls.EnhancedHls == "" {
fmt.Println("Unavailable.") fmt.Println("Unavailable.")
counter.Unavailable++
continue continue
} }
needCheck := false needCheck := false
@ -1628,6 +1644,7 @@ func rip(albumId string, token string, storefront string, userToken string) erro
Quality, err = extractMediaQuality(manifest.Attributes.ExtendedAssetUrls.EnhancedHls) Quality, err = extractMediaQuality(manifest.Attributes.ExtendedAssetUrls.EnhancedHls)
if err != nil { if err != nil {
fmt.Println("Failed to extract quality from manifest.\n", err) fmt.Println("Failed to extract quality from manifest.\n", err)
counter.Error++
continue continue
} }
} }
@ -1697,7 +1714,8 @@ func rip(albumId string, token string, storefront string, userToken string) erro
} }
if exists { if exists {
fmt.Println("Track already exists locally.") fmt.Println("Track already exists locally.")
oktrackNum += 1 counter.Success++
okDict[albumId] = append(okDict[albumId], trackNum)
continue continue
} }
m4aexists, err := fileExists(m4atrackPath) m4aexists, err := fileExists(m4atrackPath)
@ -1706,18 +1724,21 @@ func rip(albumId string, token string, storefront string, userToken string) erro
} }
if m4aexists { if m4aexists {
fmt.Println("Track already exists locally.") fmt.Println("Track already exists locally.")
oktrackNum += 1 counter.Success++
okDict[albumId] = append(okDict[albumId], trackNum)
continue continue
} }
trackUrl, keys, err := extractMedia(manifest.Attributes.ExtendedAssetUrls.EnhancedHls) trackUrl, keys, err := extractMedia(manifest.Attributes.ExtendedAssetUrls.EnhancedHls)
if err != nil { if err != nil {
fmt.Println("Failed to extract info from manifest.\n", err) fmt.Println("Failed to extract info from manifest.\n", err)
counter.Error++
continue continue
} }
info, err := extractSong(trackUrl) info, err := extractSong(trackUrl)
if err != nil { if err != nil {
fmt.Println("Failed to extract track.", err) fmt.Println("Failed to extract track.", err)
counter.Error++
continue continue
} }
samplesOk := true samplesOk := true
@ -1734,11 +1755,13 @@ func rip(albumId string, token string, storefront string, userToken string) erro
break break
} }
if !samplesOk { if !samplesOk {
counter.Error++
continue continue
} }
err = decryptSong(info, keys, meta, trackPath, trackNum, trackTotal) err = decryptSong(info, keys, meta, trackPath, trackNum, trackTotal)
if err != nil { if err != nil {
fmt.Println("Failed to decrypt track.\n", err) fmt.Println("Failed to decrypt track.\n", err)
counter.Error++
continue continue
} }
tags := []string{ tags := []string{
@ -1799,11 +1822,13 @@ func rip(albumId string, token string, storefront string, userToken string) erro
} }
if err := cmd.Run(); err != nil { if err := cmd.Run(); err != nil {
fmt.Printf("Embed failed: %v\n", err) fmt.Printf("Embed failed: %v\n", err)
counter.Error++
continue continue
} }
if strings.Contains(albumId, "pl.") && config.DlAlbumcoverForPlaylist { if strings.Contains(albumId, "pl.") && config.DlAlbumcoverForPlaylist {
if err := os.Remove(fmt.Sprintf("%s/%s.%s", sanAlbumFolder, track.ID, config.CoverFormat)); err != nil { if err := os.Remove(fmt.Sprintf("%s/%s.%s", sanAlbumFolder, track.ID, config.CoverFormat)); err != nil {
fmt.Printf("Error deleting file: %s/%s.%s\n", sanAlbumFolder, track.ID, config.CoverFormat) fmt.Printf("Error deleting file: %s/%s.%s\n", sanAlbumFolder, track.ID, config.CoverFormat)
counter.Error++
continue continue
} }
} }
@ -1811,11 +1836,13 @@ func rip(albumId string, token string, storefront string, userToken string) erro
fmt.Printf("Deleting original EC3 file: %s\n", filepath.Base(trackPath)) fmt.Printf("Deleting original EC3 file: %s\n", filepath.Base(trackPath))
if err := os.Remove(trackPath); err != nil { if err := os.Remove(trackPath); err != nil {
fmt.Printf("Error deleting file: %v\n", err) fmt.Printf("Error deleting file: %v\n", err)
counter.Error++
continue continue
} }
fmt.Printf("Successfully processed and deleted %s\n", filepath.Base(trackPath)) fmt.Printf("Successfully processed and deleted %s\n", filepath.Base(trackPath))
} }
oktrackNum += 1 counter.Success++
okDict[albumId] = append(okDict[albumId], trackNum)
} }
} }
return err return err
@ -1875,36 +1902,44 @@ func main() {
os.Args = newArgs os.Args = newArgs
} }
albumTotal := len(os.Args) albumTotal := len(os.Args)
for albumNum, url := range os.Args { for {
fmt.Printf("Album %d of %d:\n", albumNum+1, albumTotal) for albumNum, url := range os.Args {
var storefront, albumId string fmt.Printf("Album %d of %d:\n", albumNum+1, albumTotal)
if strings.Contains(url, ".txt") { var storefront, albumId string
txtpath = url if strings.Contains(url, ".txt") {
fileName := filepath.Base(url) txtpath = url
parts := strings.SplitN(fileName, "_", 3) fileName := filepath.Base(url)
storefront = parts[0] parts := strings.SplitN(fileName, "_", 3)
albumId = parts[1] storefront = parts[0]
} else { albumId = parts[1]
if strings.Contains(url, "/playlist/") {
storefront, albumId = checkUrlPlaylist(url)
txtpath = ""
} else { } else {
storefront, albumId = checkUrl(url) if strings.Contains(url, "/playlist/") {
txtpath = "" storefront, albumId = checkUrlPlaylist(url)
txtpath = ""
} else {
storefront, albumId = checkUrl(url)
txtpath = ""
}
}
if albumId == "" {
fmt.Printf("Invalid URL: %s\n", url)
continue
}
err = rip(albumId, token, storefront, config.MediaUserToken)
if err != nil {
fmt.Println("Album failed.")
fmt.Println(err)
} }
} }
fmt.Printf("======= [\u2714 ] Completed: %d/%d | [\u26A0 ] Warnings: %d | [\u2716 ] Errors: %d =======\n", counter.Success, counter.Total, counter.Unavailable+counter.NotSong, counter.Error)
if albumId == "" { if counter.Error == 0 {
fmt.Printf("Invalid URL: %s\n", url) break
continue
}
err = rip(albumId, token, storefront, config.MediaUserToken)
if err != nil {
fmt.Println("Album failed.")
fmt.Println(err)
} }
fmt.Println("Error detected, press Enter to try again...")
fmt.Scanln()
fmt.Println("Start trying again...")
counter = Counter{}
} }
fmt.Printf("======= Completed %d/%d ###### %d errors!! =======\n", oktrackNum, trackTotalnum, trackTotalnum-oktrackNum)
} }
func conventSyllableTTMLToLRC(ttml string) (string, error) { func conventSyllableTTMLToLRC(ttml string) (string, error) {

Loading…
Cancel
Save