package netease
import (
"errors"
netURL "net/url"
"strings"
"github.com/iawia002/annie/downloader"
"github.com/iawia002/annie/extractors"
"github.com/iawia002/annie/request"
"github.com/iawia002/annie/utils"
)
// Extract is the main function for extracting data
func Extract(url string) ([]downloader.Data, error) {
url = strings.Replace(url, "/#/", "/", 1)
vid := utils.MatchOneOf(url, `/(mv|video)\?id=(\w+)`)
if vid == nil {
return nil, errors.New("invalid url for netease music")
}
html, err := request.Get(url, url, nil)
if err != nil {
return nil, err
}
if strings.Contains(html, "u-errlg-404") {
return nil, errors.New("404 music not found")
}
titles := utils.MatchOneOf(html, ``)
if titles == nil || len(titles) < 2 {
return nil, extractors.ErrURLParseFailed
}
title := titles[1]
realURLs := utils.MatchOneOf(html, ``)
if realURLs == nil || len(realURLs) < 2 {
return nil, extractors.ErrURLParseFailed
}
realURL, _ := netURL.QueryUnescape(realURLs[1])
size, err := request.Size(realURL, url)
if err != nil {
return nil, err
}
urlData := downloader.URL{
URL: realURL,
Size: size,
Ext: "mp4",
}
streams := map[string]downloader.Stream{
"default": {
URLs: []downloader.URL{urlData},
Size: size,
},
}
return []downloader.Data{
{
Site: "网易云音乐 music.163.com",
Title: title,
Type: "video",
Streams: streams,
URL: url,
},
}, nil
}