-
Notifications
You must be signed in to change notification settings - Fork 8
/
douyu.go
84 lines (73 loc) · 1.76 KB
/
douyu.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
package extractors
import (
"encoding/json"
"log"
"github.com/iawia002/annie/downloader"
"github.com/iawia002/annie/request"
"github.com/iawia002/annie/utils"
)
type douyuVideoData struct {
VideoURL string `json:"video_url"`
}
type douyuData struct {
Error int `json:"error"`
Data douyuVideoData `json:"data"`
}
type douyuURLInfo struct {
URL string
Size int64
}
func douyuM3u8(url string) ([]douyuURLInfo, int64) {
var data []douyuURLInfo
var temp douyuURLInfo
var size, totalSize int64
urls := utils.M3u8URLs(url)
for _, u := range urls {
size = request.Size(u, url)
totalSize += size
temp = douyuURLInfo{
URL: u,
Size: size,
}
data = append(data, temp)
}
return data, totalSize
}
// Douyu download function
func Douyu(url string) downloader.VideoData {
liveVid := utils.MatchOneOf(url, `https?://www.douyu.com/(\S+)`)
if liveVid != nil {
log.Fatal("暂不支持斗鱼直播")
}
html := request.Get(url, url)
title := utils.MatchOneOf(html, `<title>(.*?)</title>`)[1]
vid := utils.MatchOneOf(url, `https?://v.douyu.com/show/(\S+)`)[1]
dataString := request.Get("http://vmobile.douyu.com/video/getInfo?vid="+vid, url)
var dataDict douyuData
json.Unmarshal([]byte(dataString), &dataDict)
m3u8URLs, totalSize := douyuM3u8(dataDict.Data.VideoURL)
urls := []downloader.URLData{}
var temp downloader.URLData
for _, u := range m3u8URLs {
temp = downloader.URLData{
URL: u.URL,
Size: u.Size,
Ext: "ts",
}
urls = append(urls, temp)
}
format := map[string]downloader.FormatData{
"default": {
URLs: urls,
Size: totalSize,
},
}
extractedData := downloader.VideoData{
Site: "斗鱼 douyu.com",
Title: title,
Type: "video",
Formats: format,
}
extractedData.Download(url)
return extractedData
}