@@ -6,28 +6,29 @@ import (
66 "github.com/peterq/pan-light/pc/dep"
77 "github.com/peterq/pan-light/pc/downloader"
88 "github.com/peterq/pan-light/pc/pan-api"
9+ "github.com/peterq/pan-light/pc/server-api"
910 "github.com/peterq/pan-light/pc/util"
1011 "github.com/pkg/errors"
1112 "io/ioutil"
1213 "log"
1314 "net/http"
1415 "os"
1516 "path/filepath"
17+ "strconv"
18+ "strings"
1619 "time"
1720)
1821
1922var manager * downloader.Manager
2023
21- var useVipMap = map [downloader.TaskId ]bool {}
22-
2324func init () {
2425 dep .OnInit (func () {
2526 parallel := 1024
2627 manager = & downloader.Manager {
2728 CoroutineNumber : 32 ,
2829 SegmentSize : 1024 * 1024 * 2 ,
2930 WroteToDiskBufferSize : 1024 * 512 ,
30- LinkResolver : pan_api . Link ,
31+ LinkResolver : linkResolver ,
3132 HttpClient : & http.Client {
3233 Transport : & http.Transport {
3334 MaxIdleConns : parallel ,
@@ -49,6 +50,37 @@ func Manager() *downloader.Manager {
4950 return manager
5051}
5152
53+ func linkResolver (fileId string ) (link string , err error ) {
54+ log .Println (fileId )
55+ defer func () {
56+ if e := recover (); e != nil {
57+ err = errors .New ("链接解析严重错误: " + fmt .Sprint (e ))
58+ }
59+ }()
60+ args := strings .Split (fileId , "." )
61+ switch args [0 ] {
62+ case "vip" :
63+ return vipLink (args [1 ])
64+ case "direct" :
65+ return pan_api .Link (args [1 ])
66+ case "share" :
67+ fileSize , _ := strconv .ParseInt (args [3 ], 10 , 64 )
68+ return VipLinkByMd5 (args [1 ], args [2 ], fileSize )
69+ default :
70+ err = errors .New ("unknown download method: " + args [0 ])
71+ }
72+ return
73+ }
74+
75+ func vipLink (fileId string ) (link string , err error ) {
76+ md5 , sliceMd5 , fileSize , err := RapidUploadMd5 (fileId )
77+ if err != nil {
78+ err = errors .Wrap (err , "获取文件md5错误" )
79+ return
80+ }
81+ return VipLinkByMd5 (md5 , sliceMd5 , fileSize )
82+ }
83+
5284func handleDownloadEvent (event * downloader.DownloadEvent ) {
5385 dep .NotifyQml ("task.event" , map [string ]interface {}{
5486 "type" : event .Event ,
@@ -61,24 +93,21 @@ func test() {
6193 //fileCompare()
6294 //return
6395 time .Sleep (3 * time .Second )
64- id , err := DownloadFile ("730136432970379" , "./yx.mp4" , false )
96+ id , err := DownloadFile ("direct. 730136432970379" , "./yx.mp4" )
6597 //id, err := DownloadFile("835313540804", "./project.mp4")
6698 log .Println (id , err )
6799}
68100
69- func DownloadFile (fid , savePath string , useVip bool ) (taskId downloader.TaskId , err error ) {
101+ func DownloadFile (fid , savePath string ) (taskId downloader.TaskId , err error ) {
70102 savePath , err = filepath .Abs (savePath )
71103 if err != nil {
72104 return
73105 }
74106 taskId , err = manager .NewTask (fid , savePath , requestDecorator )
75- if err == nil {
76- useVipMap [taskId ] = true
77- }
78107 return
79108}
80109
81- func RapidUploadMd5 (fid string ) (sliceMd5 string , err error ) {
110+ func RapidUploadMd5 (fid string ) (md5 , sliceMd5 string , fileSize int64 , err error ) {
82111 link , err := pan_api .Link (fid )
83112 if err != nil {
84113 err = errors .Wrap (err , "解析直链错误" )
@@ -96,6 +125,15 @@ func RapidUploadMd5(fid string) (sliceMd5 string, err error) {
96125 err = errors .Wrap (err , "访问直链错误" )
97126 return
98127 }
128+ md5 = resp .Header .Get ("Content-Md5" )
129+ s := resp .Header .Get ("Content-Range" )
130+ s = strings .Trim (s , "]" )
131+ s = strings .Split (s , "/" )[1 ]
132+ fileSize , err = strconv .ParseInt (s , 10 , 64 )
133+ if err != nil {
134+ err = errors .Wrap (err , "获取文件大小失败" )
135+ return
136+ }
99137 defer resp .Body .Close ()
100138 bin , err := ioutil .ReadAll (resp .Body )
101139 if err != nil {
@@ -109,15 +147,26 @@ func RapidUploadMd5(fid string) (sliceMd5 string, err error) {
109147 return
110148}
111149
150+ func VipLinkByMd5 (md5 , sliceMd5 string , fileSize int64 ) (link string , err error ) {
151+ result , err := server_api .Call ("link-md5" , map [string ]interface {}{
152+ "md5" : md5 ,
153+ "sliceMd5" : sliceMd5 ,
154+ "fileSize" : fileSize ,
155+ })
156+ if err != nil {
157+ err = errors .Wrap (err , "调用vip链接接口错误" )
158+ return
159+ }
160+ link = result .(string )
161+ return
162+ }
163+
112164func requestDecorator (request * http.Request ) * http.Request {
113165 request .Header .Set ("User-Agent" , pan_api .BaiduUA )
114166 return request
115167}
116168
117169func Resume (id string , bin string , useVip bool ) error {
118- if useVip {
119- useVipMap [downloader .TaskId (id )] = true
120- }
121170 return manager .Resume (map [downloader.TaskId ]string {
122171 downloader .TaskId (id ): bin ,
123172 }, requestDecorator )
0 commit comments