commit
f71feebc18
@ -7,8 +7,7 @@
|
|||||||
4. 自动内嵌封面和LRC歌词(需要media-user-token,获取方式看最后的说明)
|
4. 自动内嵌封面和LRC歌词(需要media-user-token,获取方式看最后的说明)
|
||||||
5. 自动构建 可以到 [Actions](https://github.com/zhaarey/apple-music-alac-atmos-downloader/actions) 页面下载最新自动构建版本 可以直接`main.exe url`
|
5. 自动构建 可以到 [Actions](https://github.com/zhaarey/apple-music-alac-atmos-downloader/actions) 页面下载最新自动构建版本 可以直接`main.exe url`
|
||||||
6. main_select 支持手动填写m3u8,输入#号,比如#1 #2,支持txt读取m3u8,输入txt文件名
|
6. main_select 支持手动填写m3u8,输入#号,比如#1 #2,支持txt读取m3u8,输入txt文件名
|
||||||
|
7. main 支持使用 go run main.go "txt文件地址" txt文件名需要指定格式 例如 cn_1707581102_THE BOOK 3.txt 建议使用这个[Reqable 脚本代码](https://telegra.ph/Reqable-For-Apple-Music-05-01) 自动生成
|
||||||
|
|
||||||
|
|
||||||
# Apple Music ALAC / Dolby Atmos Downloader
|
# Apple Music ALAC / Dolby Atmos Downloader
|
||||||
|
|
||||||
|
39
main.go
39
main.go
@ -1,6 +1,7 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bufio"
|
||||||
"bytes"
|
"bytes"
|
||||||
"encoding/binary"
|
"encoding/binary"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
@ -47,6 +48,7 @@ type Config struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var config Config
|
var config Config
|
||||||
|
var txtpath string
|
||||||
var oktrackNum int = 0
|
var oktrackNum int = 0
|
||||||
var trackTotalnum int = 0
|
var trackTotalnum int = 0
|
||||||
|
|
||||||
@ -1174,6 +1176,27 @@ func rip(albumId string, token string, storefront string, userToken string) erro
|
|||||||
oktrackNum += 1
|
oktrackNum += 1
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
if txtpath != "" {
|
||||||
|
file, err := os.Open(txtpath)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println("cant open txt:", err)
|
||||||
|
}
|
||||||
|
defer file.Close()
|
||||||
|
scanner := bufio.NewScanner(file)
|
||||||
|
for scanner.Scan() {
|
||||||
|
line := scanner.Text()
|
||||||
|
if strings.HasPrefix(line, track.ID) {
|
||||||
|
parts := strings.SplitN(line, ",", 2)
|
||||||
|
if len(parts) == 2 {
|
||||||
|
manifest.Attributes.ExtendedAssetUrls.EnhancedHls=parts[1]
|
||||||
|
fmt.Println("Found m3u8 from txt")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if err := scanner.Err(); err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
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)
|
||||||
@ -1234,10 +1257,20 @@ func main() {
|
|||||||
for albumNum, url := range os.Args[1:] {
|
for albumNum, url := range os.Args[1:] {
|
||||||
fmt.Printf("Album %d of %d:\n", albumNum+1, albumTotal)
|
fmt.Printf("Album %d of %d:\n", albumNum+1, albumTotal)
|
||||||
var storefront, albumId string
|
var storefront, albumId string
|
||||||
if strings.Contains(url, "/playlist/") {
|
if strings.Contains(url, ".txt") {
|
||||||
storefront, albumId = checkUrlPlaylist(url)
|
txtpath = url
|
||||||
|
fileName := filepath.Base(url)
|
||||||
|
parts := strings.SplitN(fileName, "_", 3)
|
||||||
|
storefront = parts[0]
|
||||||
|
albumId = parts[1]
|
||||||
} else {
|
} else {
|
||||||
storefront, albumId = checkUrl(url)
|
if strings.Contains(url, "/playlist/") {
|
||||||
|
storefront, albumId = checkUrlPlaylist(url)
|
||||||
|
txtpath = ""
|
||||||
|
} else {
|
||||||
|
storefront, albumId = checkUrl(url)
|
||||||
|
txtpath = ""
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if albumId == "" {
|
if albumId == "" {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user