Skip to content

Commit

Permalink
work with issue 1064, solve the bilibili playlist download problem (#…
Browse files Browse the repository at this point in the history
…1067)

* work with issue 1064, solve the bilibili playlist download problem

* slove bilibili playlist download problem

* slove bilibili playlist download problem
  • Loading branch information
Hao4715 committed Mar 28, 2022
1 parent 6dc2b3b commit 00c0e8f
Show file tree
Hide file tree
Showing 2 changed files with 53 additions and 1 deletion.
41 changes: 40 additions & 1 deletion extractors/bilibili/bilibili.go
Original file line number Diff line number Diff line change
Expand Up @@ -206,7 +206,46 @@ func extractNormalVideo(url, html string, extractOption extractors.Options) ([]*
}

// handle normal video playlist
// https://www.bilibili.com/video/av20827366/?p=1
if len(pageData.Sections) == 0 {
// https://www.bilibili.com/video/av20827366/?p=* each video in playlist has different p=?
return multiPageDownload(url, html, extractOption, pageData)
}
// handle another kind of playlist
// https://www.bilibili.com/video/av*** each video in playlist has different av/bv id
return multiEpisodeDownload(url, html, extractOption, pageData)
}

// handle multi episode download
func multiEpisodeDownload(url, html string, extractOption extractors.Options, pageData *multiPage) ([]*extractors.Data, error) {
needDownloadItems := utils.NeedDownloadList(extractOption.Items, extractOption.ItemStart, extractOption.ItemEnd, len(pageData.Sections[0].Episodes))
extractedData := make([]*extractors.Data, len(needDownloadItems))
wgp := utils.NewWaitGroupPool(extractOption.ThreadNumber)
dataIndex := 0
for index, u := range pageData.Sections[0].Episodes {
if !utils.ItemInSlice(index+1, needDownloadItems) {
continue
}
wgp.Add()
options := bilibiliOptions{
url: url,
html: html,
aid: u.Aid,
bvid: u.BVid,
cid: u.Cid,
subtitle: u.Title,
}
go func(index int, options bilibiliOptions, extractedData []*extractors.Data) {
defer wgp.Done()
extractedData[index] = bilibiliDownload(options, extractOption)
}(dataIndex, options, extractedData)
dataIndex++
}
wgp.Wait()
return extractedData, nil
}

// handle multi page download
func multiPageDownload(url, html string, extractOption extractors.Options, pageData *multiPage) ([]*extractors.Data, error) {
needDownloadItems := utils.NeedDownloadList(extractOption.Items, extractOption.ItemStart, extractOption.ItemEnd, len(pageData.VideoData.Pages))
extractedData := make([]*extractors.Data, len(needDownloadItems))
wgp := utils.NewWaitGroupPool(extractOption.ThreadNumber)
Expand Down
13 changes: 13 additions & 0 deletions extractors/bilibili/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,9 +36,22 @@ type multiPageVideoData struct {
Pages []videoPagesData `json:"pages"`
}

type episode struct {
Aid int `json:"aid"`
Cid int `json:"cid"`
Title string `json:"title"`
BVid string `json:"bvid"`
}

type multiEpisodeData struct {
Seasionid int `json:"season_id"`
Episodes []episode `json:"episodes"`
}

type multiPage struct {
Aid int `json:"aid"`
BVid string `json:"bvid"`
Sections []multiEpisodeData `json:"sections"`
VideoData multiPageVideoData `json:"videoData"`
}

Expand Down

0 comments on commit 00c0e8f

Please sign in to comment.