@@ -12,30 +12,54 @@ interface DownloadOptions {
1212 quality : SongLevelType ;
1313 downloadPath ?: string ;
1414 skipIfExist ?: boolean ;
15+ mode ?: "standard" | "playback" ;
1516}
1617
1718export const downloadSong = async ( {
1819 song,
1920 quality,
2021 downloadPath,
2122 skipIfExist,
23+ mode,
2224} : DownloadOptions ) : Promise < { success : boolean ; skipped ?: boolean ; message ?: string } > => {
2325 try {
2426 const settingStore = useSettingStore ( ) ;
2527 let url = "" ;
2628 let type = "mp3" ;
2729
30+ const usePlayback = mode ? mode === "playback" : settingStore . usePlaybackForDownload ;
31+
2832 // 获取下载链接
29- if ( settingStore . usePlaybackForDownload ) {
30- const levelName = songLevelData [ quality ] . level ;
31- // @ts -ignore
32- const result = await songUrl ( song . id , levelName ) ;
33- if ( result . code !== 200 || ! result ?. data ?. [ 0 ] ?. url ) {
34- return { success : false , message : result . message || "获取播放链接失败" } ;
33+ const levelName = songLevelData [ quality ] . level ;
34+ // songUrl 仅支持以下音质
35+ const allowedLevels = [
36+ "standard" ,
37+ "higher" ,
38+ "exhigh" ,
39+ "lossless" ,
40+ "hires" ,
41+ "jyeffect" ,
42+ "sky" ,
43+ "jymaster" ,
44+ ] ;
45+
46+ // 如果开启了“使用播放链接下载”且音质支持,则尝试获取播放链接
47+ if ( usePlayback && allowedLevels . includes ( levelName ) ) {
48+ try {
49+ // @ts -ignore: levelName is checked against allowedLevels at runtime
50+ const result = await songUrl ( song . id , levelName ) ;
51+ if ( result . code === 200 && result ?. data ?. [ 0 ] ?. url ) {
52+ url = result . data [ 0 ] . url ;
53+ type = ( result . data [ 0 ] . type || result . data [ 0 ] . encodeType || "mp3" ) . toLowerCase ( ) ;
54+ }
55+ } catch ( e ) {
56+ console . error ( "Error fetching playback url for download:" , e ) ;
3557 }
36- url = result . data [ 0 ] . url ;
37- type = ( result . data [ 0 ] . type || result . data [ 0 ] . encodeType || "mp3" ) . toLowerCase ( ) ;
38- } else {
58+ }
59+
60+ // 如果没有获取到 URL (可能是因为没开启设置,或者音质不支持,或者获取失败),则使用标准下载接口
61+ if ( ! url ) {
62+
3963 const result = await songDownloadUrl ( song . id , quality ) ;
4064 if ( result . code !== 200 || ! result ?. data ?. url ) {
4165 return { success : false , message : result . message || "获取下载链接失败" } ;
0 commit comments