提交 b6cddc70 编写于 作者: P peterq

add: vip 通道播放视频

上级 54e8fcc0
......@@ -34,7 +34,7 @@ var panApiAsyncRoutes = map[string]asyncHandler{
},
"pan.link": func(p map[string]interface{}, resolve func(interface{}), reject func(interface{}), progress func(interface{}), qmlMsg chan interface{}) {
link, err := pan_api.Link(fmt.Sprint(int(p["fid"].(float64))))
link, err := pan_download.LinkResolver(p["fid"].(string))
if err != nil {
reject(err.Error())
} else {
......
......@@ -316,21 +316,21 @@ function isVideo(f){
var videoAgentLink = (function(){
var server
return function(meta) {
return function(fid) {
if (!server) {
server = callGoSync('env.internal_server_url')
console.log('internal url', JSON.stringify(server))
}
return server + '/videoAgent?fid=' + meta.fs_id
return server + '/videoAgent?fid=' + fid
}
})()
function getFileLink(meta) {
return callGoAsync('pan.link', {fid: meta.fs_id})
return callGoAsync('pan.link', {fid: 'direct.' + meta.fs_id})
}
function getFileLinkVip(meta) {
return callGoAsync('pan.link.vip', {fid: meta.fs_id})
return callGoAsync('pan.link', {fid: 'vip.' + meta.fs_id})
}
var playVideo = (function(){
......@@ -340,11 +340,10 @@ var playVideo = (function(){
if (!ins || !ins.playVideo) {
ins = comp.createObject(G.root)
}
var linkPromise = (useVip ?
getFileLinkVip(meta) :
getFileLink(meta))
var fid = (useVip ? 'vip.' : 'direct.') + meta.fs_id
var linkPromise = callGoAsync('pan.link', {fid: fid})
.then(function(link){
var agentLink = videoAgentLink(meta, useVip)
var agentLink = videoAgentLink(fid)
console.log('play link', agentLink, link)
return agentLink
})
......
......@@ -4,6 +4,7 @@ import (
"github.com/pkg/errors"
"io"
"io/ioutil"
"log"
"net/http"
"net/http/cookiejar"
"time"
......@@ -37,23 +38,41 @@ func readHtml(reader io.Reader) string {
return string(html)
}
var BaiduUA = "netdisk;4.6.2.0;PC;PC-Windows;10.0.10240;WindowsBaiduYunGuanJia"
type tBin []byte
type tJson map[string]interface{}
func VideoProxy(writer http.ResponseWriter, request *http.Request, targetLink string) {
myReq := newRequest("GET", targetLink)
type linkTime struct {
link string
time time.Time
}
for k, vs := range request.Header {
if k == "Referer" {
continue
}
for _, h := range vs {
//log.Println(k, h)
myReq.Header.Add(k, h)
}
}
//log.Println("-----------------")
myReq.Header.Set("user-agent", BaiduUA)
func (l *linkTime) expired() bool {
return false
resp, err := httpClient.Do(myReq)
if err != nil {
log.Println(err)
return
}
for k, vs := range resp.Header {
if k == "Content-Disposition" {
continue
}
for _, h := range vs {
//log.Println(k, h)
writer.Header().Add(k, h)
}
writer.Header().Set("Connection", "close")
}
writer.WriteHeader(resp.StatusCode)
io.Copy(writer, resp.Body)
}
type fidLinks struct {
direct *linkTime
vip *linkTime
}
var BaiduUA = "netdisk;4.6.2.0;PC;PC-Windows;10.0.10240;WindowsBaiduYunGuanJia"
var linkCacheMap = map[string]fidLinks{}
type tBin []byte
type tJson map[string]interface{}
......@@ -172,15 +172,7 @@ func ListDir(path string) (list interface{}, err error) {
}
// 链接解析
func Link(fid string) (link string, err error) {
if c, ok := linkCacheMap[fid]; !ok {
linkCacheMap[fid] = fidLinks{}
} else {
if c.direct != nil && !c.direct.expired() {
return c.direct.link, nil
}
}
func LinkDirect(fid string) (link string, err error) {
req := newRequest("GET", "dlink")
params := map[string]interface{}{
......@@ -217,17 +209,6 @@ func Link(fid string) (link string, err error) {
}
link = data["dlink"].([]interface{})[0].(map[string]interface{})["dlink"].(string)
link = getRedirectedLink(link)
linkCacheMap[fid] = fidLinks{
direct: &linkTime{
link: link,
time: time.Now(),
},
}
return
}
// vip 转存解析
func linkByVip() (link string, err error) {
return
}
......
......@@ -28,7 +28,7 @@ func init() {
CoroutineNumber: 32,
SegmentSize: 1024 * 1024 * 2,
WroteToDiskBufferSize: 1024 * 512,
LinkResolver: linkResolver,
LinkResolver: LinkResolver,
HttpClient: &http.Client{
Transport: &http.Transport{
MaxIdleConns: parallel,
......@@ -50,8 +50,31 @@ func Manager() *downloader.Manager {
return manager
}
func linkResolver(fileId string) (link string, err error) {
log.Println(fileId)
type linkTime struct {
link string
time time.Time
}
func (l *linkTime) expired() bool {
return time.Now().Sub(l.time) > time.Hour
}
var linkCacheMap = map[string]linkTime{}
func LinkResolver(fileId string) (link string, err error) {
if c, ok := linkCacheMap[fileId]; ok {
if !c.expired() {
return c.link, nil
}
}
defer func() {
if err == nil && link != "" {
linkCacheMap[fileId] = linkTime{
link: link,
time: time.Now(),
}
}
}()
defer func() {
if e := recover(); e != nil {
err = errors.New("链接解析严重错误: " + fmt.Sprint(e))
......@@ -62,7 +85,7 @@ func linkResolver(fileId string) (link string, err error) {
case "vip":
return vipLink(args[1])
case "direct":
return pan_api.Link(args[1])
return pan_api.LinkDirect(args[1])
case "share":
fileSize, _ := strconv.ParseInt(args[3], 10, 64)
return VipLinkByMd5(args[1], args[2], fileSize)
......@@ -108,7 +131,7 @@ func DownloadFile(fid, savePath string) (taskId downloader.TaskId, err error) {
}
func RapidUploadMd5(fid string) (md5, sliceMd5 string, fileSize int64, err error) {
link, err := pan_api.Link(fid)
link, err := pan_api.LinkDirect(fid)
if err != nil {
err = errors.Wrap(err, "解析直链错误")
return
......
package pan_api
package pan_download
import (
"fmt"
"github.com/peterq/pan-light/pc/dep"
"github.com/peterq/pan-light/pc/pan-api"
"github.com/peterq/pan-light/pc/storage"
"io"
"log"
"net"
"net/http"
......@@ -63,41 +63,11 @@ func startAgentServer() {
}
func videoAgent(writer http.ResponseWriter, request *http.Request) {
if ca, ok := linkCacheMap[request.URL.Query().Get("fid")]; ok {
lt := ca.direct
myReq := newRequest("GET", lt.link)
for k, vs := range request.Header {
if k == "Referer" {
continue
}
for _, h := range vs {
//log.Println(k, h)
myReq.Header.Add(k, h)
}
}
//log.Println("-----------------")
myReq.Header.Set("user-agent", BaiduUA)
resp, err := httpClient.Do(myReq)
if err != nil {
log.Println(err)
return
}
for k, vs := range resp.Header {
if k == "Content-Disposition" {
continue
}
for _, h := range vs {
//log.Println(k, h)
writer.Header().Add(k, h)
}
writer.Header().Set("Connection", "close")
}
writer.WriteHeader(resp.StatusCode)
io.Copy(writer, resp.Body)
} else {
link, err := LinkResolver(request.URL.Query().Get("fid"))
if err != nil {
writer.WriteHeader(500)
log.Println(err)
return
}
pan_api.VideoProxy(writer, request, link)
}
......@@ -287,7 +287,6 @@ func (v *Vip) getRedirectedLink(link string) string {
log.Println(err)
}
end := resp.Request.URL.String()
log.Println(end)
resp.Body.Close()
return end
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册