func getPlaylistM3u8(episode *Episode) <-chan bool { channel := make(chan bool, 1) go func() { result, err := http.Get(episode.Link) if err == nil { episode.PlaylistM3u8 = result.Data m3u8Filenames := episode.PlaylistM3u8.FindAllString(`.+m3u8`, -1) // Get file with highest resolution if m3u8Filenames.Length() > 0 { lastM3u8Filename := m3u8Filenames[m3u8Filenames.Length()-1] baseM3u8Url := episode.Link.ReplaceWithRegexp(`[^/]+m3u8$`, "") lastM3u8FilePath := baseM3u8Url + lastM3u8Filename resultm3u8, errm3u8 := http.Get(lastM3u8FilePath) if errm3u8 == nil { episode.EpisodeM3u8 = resultm3u8.Data.ReplaceWithRegexp(`(.+\.ts)`, baseM3u8Url+"${1}") // ioutil.WriteFile("./dump/test.m3u8", episode.EpisodeM3u8.ToBytes(), 0644) } } } channel <- true }() return channel }
func getSrtContent(episode *Episode, isEn dna.Bool) <-chan bool { channel := make(chan bool, 1) go func() { var result *http.Result var err error if isEn == true { result, err = http.Get(episode.SubtitleExt[1]) } else { result, err = http.Get(episode.SubtitleExt[0]) } if err == nil { if isEn == true { // It is hard to detect an encoding of a string. // Therefore we convert them to BASE64 episode.EnSrt = dna.String(base64.StdEncoding.EncodeToString(result.Data.ToBytes())) // episode.EnSrt = ISO8859_1ToUTF8String(result.Data.ToBytes()) // ioutil.WriteFile("./dump/test_en_srt.srt", result.Data.ToBytes(), 0644) } else { // Vietnamese Subtitle encoded in UTF-16 Little Ending // It has to be converted to UTF-8 if result.Data.Match(`^[0-9a-fA-F]+$`) == false { // episode.ViSrt = UTF16ToUTF8String(result.Data.ToBytes(), binary.LittleEndian) episode.ViSrt = dna.String(base64.StdEncoding.EncodeToString(result.Data.ToBytes())) } // dna.Log(result.Data.Substring(0, 100)) } } channel <- true }() return channel }
// getSongFromXML returns values from url: http://nhacso.net/flash/song/xnl/1/id/ func getSongFromXML(song *Song) <-chan bool { channel := make(chan bool, 1) go func() { link := "http://nhacso.net/flash/song/xnl/1/id/" + GetKey(song.Id) result, err := http.Get(link) if err == nil { song.Title = getValueXML(&result.Data, "name", 1).Trim() song.Artists = getValueXML(&result.Data, "artist", 0).ToStringArray().SplitWithRegexp("\\|\\|").SplitWithRegexp(" / ").SplitWithRegexp(" - ") song.Artistid = getValueXML(&result.Data, "artistlink", 0).ReplaceWithRegexp("\\.html", "").ReplaceWithRegexp(`^.+-`, "").ToInt() authors := getValueXML(&result.Data, "author", 0) if !authors.IsBlank() { song.Authors = authors.ToStringArray().SplitWithRegexp("\\|\\|").SplitWithRegexp(" / ").SplitWithRegexp(" - ") song.Authorid = getValueXML(&result.Data, "authorlink", 0).ReplaceWithRegexp(`\.html`, "").ReplaceWithRegexp(`^.+-`, "").ToInt() } duration := result.Data.FindAllString("<totalTime.+totalTime>", 1) if duration.Length() > 0 { song.Duration = duration[0].RemoveHtmlTags("").Trim().ToInt() } song.Link = getValueXML(&result.Data, "mp3link", 0) if song.Title != "" && song.Link != "/" { ts := song.Link.FindAllString(`\/[0-9]+_`, 1)[0].ReplaceWithRegexp(`\/`, "").ReplaceWithRegexp(`_`, "") unix := ts.ToInt().ToFloat() * dna.Float(math.Pow10(13-len(ts))) song.DateCreated = dna.Int(int64(unix) / 1000).ToTime() song.DateUpdated = time.Now() } } channel <- true }() return channel }
func getSongFromXML(song *Song) <-chan bool { channel := make(chan bool, 1) go func() { link := "http://m.mp3.zing.vn/xml/song/" + song.GetEncodedKey(Bitrate128) result, err := http.Get(link) if err == nil { data := &result.Data linkArr := data.FindAllStringSubmatch(`"source":"(.+?)"`, -1) if len(linkArr) > 0 { song.Link = linkArr[0][1].Replace(`\/`, `/`) pathArr := song.Link.FindAllStringSubmatch(`song-load/(.+)`, -1) if len(linkArr) > 0 { song.Path = DecodePath(pathArr[0][1]) dateCreatedArr := song.Path.FindAllStringSubmatch(`^/?(\d{4}/\d{2}/\d{2})`, -1) if len(dateCreatedArr) > 0 { year := dateCreatedArr[0][1].FindAllStringSubmatch(`^(\d{4})/\d{2}/\d{2}`, -1)[0][1].ToInt() month := dateCreatedArr[0][1].FindAllStringSubmatch(`^\d{4}/(\d{2})/\d{2}`, -1)[0][1].ToInt() day := dateCreatedArr[0][1].FindAllStringSubmatch(`^\d{4}/\d{2}/(\d{2})`, -1)[0][1].ToInt() song.DateCreated = time.Date(int(year), time.Month(month), int(day), 0, 0, 0, 0, time.UTC) } } } } channel <- true }() return channel }
// getAPIAlbumSimilars fetches album's similars // with the following url format: // http://www.allmusic.com/album/google-bot-mw0002585207/similar/mobile func getAPIAlbumSimilars(album *APIAlbum) <-chan bool { channel := make(chan bool, 1) go func() { link := "http://www.allmusic.com/album/google-bot-mw" + album.Id.ToFormattedString(10, true) + "/similar/mobile" result, err := http.Get(link) if err == nil { data := &result.Data idsArr := data.FindAllString(`<a href=".+`, -1) ids := dna.IntArray(idsArr.Map(func(val dna.String, idx dna.Int) dna.Int { idArr := val.FindAllStringSubmatch(`mw([0-9]+)`, -1) if len(idArr) > 0 { return idArr[0][1].ToInt() } else { return 0 } }).([]dna.Int)).Filter(func(val dna.Int, idx dna.Int) dna.Bool { if val > 0 { return true } else { return false } }) if ids.Length() > 0 { album.Similars = ids } } channel <- true }() return channel }
func getAlbumCategory(albums *[]*Album, genre Genre, page dna.Int) <-chan bool { channel := make(chan bool, 1) go func() { link := "http://nhacso.net/album-theo-the-loai-" + genre.Id.ToString() + "/joke-link-2-" + page.ToString() + ".html" // dna.Log(link) result, err := http.Get(link) if err == nil { data := &result.Data temp := data.FindAllStringSubmatch(`getTotalSongInAlbum\('(.+)', 'album_new_totalsong_'`, -1) tmpalbums := &[]*Album{} if len(temp) > 0 { albumList := temp[0][1].Split(",").ToIntArray() for _, albumid := range albumList { album := NewAlbum() album.Id = albumid cats := dna.StringArray{genre.Name} album.Category = transformCats(cats) *tmpalbums = append(*tmpalbums, album) } } *albums = *tmpalbums } channel <- true }() return channel }
// getAPIAlbumAwards fetches album's awards // with the following url format: // http://www.allmusic.com/album/google-bot-mw0002585207/similar/mobile func getAPIAlbumAwards(album *APIAlbum) <-chan bool { channel := make(chan bool, 1) go func() { link := "http://www.allmusic.com/album/google-bot-mw" + album.Id.ToFormattedString(10, true) + "/awards/mobile" result, err := http.Get(link) if err == nil { data := &result.Data var awardSections = []APIAwardSection{} sectionsArr := data.FindAllString(`(?mis)<section class=.+?</section>`, -1) sectionsArr.ForEach(func(section dna.String, idx dna.Int) { awardSections = append(awardSections, getSection(section)) }) if len(awardSections) > 0 { bAwards, derr := json.Marshal(awardSections) if derr == nil { album.Awards = dna.String(string(bAwards)) } } } channel <- true }() return channel }
// getSongPlays returns song plays func getSongPlays(song *Song, body dna.String) { // POST METHOD // link := "http://www.nhaccuatui.com/interaction/api/hit-counter?jsoncallback=nct" // http.DefaulHeader.Set("Content-Type", "application/x-www-form-urlencoded ") // result, err := http.Post(dna.String(link), body) // // Log(link) // if err == nil { // data := &result.Data // tpl := dna.String(`{"counter":([0-9]+)}`) // playsArr := data.FindAllStringSubmatch(tpl, -1) // if len(playsArr) > 0 { // song.Plays = playsArr[0][1].ToInt() // } // } // GET METHOD link := "http://www.nhaccuatui.com/interaction/api/counter?jsoncallback=nct&listSongIds=" + song.Id.ToString() result, err := http.Get(link) if err == nil { data := &result.Data tpl := dna.Sprintf(`{"%v":([0-9]+)}`, song.Id) // dna.Log(data) playsArr := data.FindAllStringSubmatch(tpl, -1) if len(playsArr) > 0 { song.Plays = playsArr[0][1].ToInt() } } }
func getExercises(cat Category) <-chan Exercises { channel := make(chan Exercises) exercises := Exercises{} go func() { link := "http://www.indiabix.com" + cat.Url // dna.Log(link) result, err := http.Get(link) if err == nil { data := &result.Data exercisesArr := data.FindAllStringSubmatch(`(?mis)ib-lefttbar-container.+Exercise(.+?)id="ib-main-bar"`, 1) // dna.Log(exercisesArr) if len(exercisesArr) > 0 { sectionArr := exercisesArr[0][1].FindAllString(`<a href=.+?</a>`, -1) for _, section := range sectionArr { exc := NewExercise() exc.Cat = cat exc.Cat.Url = section.GetTagAttributes("href") exc.No = exc.Cat.Url.ReplaceWithRegexp(`/$`, "").ReplaceWithRegexp(`^.+/`, "").ToInt() exercises = append(exercises, *exc) // dna.Log(exc.Cat.Url.ReplaceWithRegexp(`/$`, "").Replace(`^.+/`, "")) } } } channel <- exercises }() return channel }
func getGracenoteSongLyric(artist, title dna.String, song *Song) { link := "http://lyrics.wikia.com/Gracenote:" + artist.Replace(" ", "_") + ":" + title.Replace(" ", "_") result, err := http.Get(link) if err == nil { data := &result.Data writersArr := data.FindAllString(`Songwriters.+`, 1) if writersArr.Length() > 0 { song.GracenoteSongwriters = writersArr[0].GetTags("em")[0].RemoveHtmlTags("").DecodeHTML() } publisheraArr := data.FindAllString(`Publishers.+`, 1) if publisheraArr.Length() > 0 { song.GracenotePublishers = publisheraArr[0].GetTags("em")[0].RemoveHtmlTags("").DecodeHTML() } lyricArr := data.FindAllStringSubmatch(`(?mis)<div class='lyricbox'>(.+?)<\!--`, 1) if len(lyricArr) > 0 { song.GracenoteLyric = lyricArr[0][1].Trim().DecodeHTML().ReplaceWithRegexp(`(?mis)^<div.+?</span></div>`, "").Trim().Replace("<br />", "\n") } if song.GracenoteLyric != "" { song.DownloadGracenoteDone = 1 } else { song.DownloadGracenoteDone = 0 } } }
// getSongXML returns song from main page func getSongXML(song *Song) <-chan bool { channel := make(chan bool, 1) go func() { link := "http://www.chacha.vn/player/songXml/" + song.Id.ToString() result, err := http.Get(link) // dna.Log(link) if err == nil && !result.Data.Match(`Không tìm thấy bài hát`) { data := &result.Data if data.Match(`<enclosure.+label="320K"`) { song.Bitrate = 320 link := data.FindAllString(`<enclosure.+label="320K".+/>`, -1) if link.Length() > 0 { song.Link = link[0].GetTagAttributes("url") } } else { if data.Match(`<enclosure.+label="128K"`) { song.Bitrate = 128 link := data.FindAllString(`<enclosure.+label="128K".+?`, -1) if link.Length() > 0 { song.Link = link[0].GetTagAttributes("url") } } } } channel <- true }() return channel }
// getVideoFromXML returns video from main page func getVideoFromXML(video *Video) <-chan bool { channel := make(chan bool, 1) go func() { link := "http://hcm.nhac.vui.vn/asx2.php?type=1&id=" + video.Id.ToString() result, err := http.Get(link) // dna.Log(link) if err == nil { data := &result.Data linkArr := data.FindAllStringSubmatch(`<jwplayer:file><\!\[CDATA\[(.+)\]\]></jwplayer:file>`, 1) if len(linkArr) > 0 { video.Link = linkArr[0][1].Trim() switch { case video.Link.Match("mp3") == true: video.Type = "song" case video.Link.Match("(?mis)mp4") == true: video.Type = "video" case video.Link.Match("flv") == true: video.Type = "video" } } } channel <- true }() return channel }
func GetAPIMovie(movieid, ep dna.Int) (*APIMovie, error) { urlb := NewURLBuilder() var link dna.String = "" if ep == 0 { link = urlb.GetMovie(movieid) } else { link = urlb.GetEpisole(movieid, ep) } // dna.Log(link) result, err := http.Get(link) if err == nil { if result.Data.Match(`"r":"acesstokenkey invalid or expired"`) == true { return nil, errors.New("ACCESS_TOKEN_KEY invalid or expired") } var apiMoveiJSON = &APIMovieJSON{} errd := json.Unmarshal(result.Data.ToBytes(), apiMoveiJSON) if errd == nil { apiMoveiJSON.Movie.MovieId = movieid apiMoveiJSON.Movie.EpId = ep return &apiMoveiJSON.Movie, nil } else { return nil, errd } } else { return nil, err } }
func getSongFormats(subject *Subject) <-chan bool { channel := make(chan bool, 1) go func() { link := "http://www.indiabix.com/" + subject.Name.ToDashCase().ToLowerCase() // dna.Log(link) result, err := http.Get(link) if err == nil { data := &result.Data tables := data.FindAllString(`(?mis)<table width="100%" id="ib-tbl-topics">.+?</table>`, -1) for _, table := range tables { cells := table.FindAllString(`<td>.+?</td>`, -1) if cells.Length() > 0 { for _, cell := range cells { cat := &Category{subject.Name, cell.RemoveHtmlTags(""), cell.GetTagAttributes("href")} subject.Cats = append(subject.Cats, cat) // dna.Log(cat) } } } } channel <- true }() return channel }
// getSongFromMainPage returns song from main page func getSongFromMainPage(song *Song) <-chan bool { channel := make(chan bool, 1) go func() { link := "http://nhacso.net/nghe-nhac/google-bot." + GetKey(song.Id) + "==.html" result, err := http.Get(link) // Log(link) // Log(result.Data) if err == nil && !result.Data.Match("Rất tiếc, chúng tôi không tìm thấy thông tin bạn yêu cầu!") { data := &result.Data if data.Match("official") { song.Official = 1 } bitrate := data.FindAllString(`\d+kb\/s`, 1)[0] if !bitrate.IsBlank() { song.Bitrate = bitrate.FindAllString(`\d+`, 1)[0].ToInt() } plays := data.FindAllString("total_listen_song_detail_\\d+.+", 1)[0] if !plays.IsBlank() { song.Plays = plays.ReplaceWithRegexp("<\\/span>.+$", "").ReplaceWithRegexp("^.+>", "").ReplaceWithRegexp("\\.", "").ToInt() } topics := data.FindAllString("<li><a\\shref\\=\\\"http\\:\\/\\/nhacso\\.net\\/the-loai.+", 1)[0] if !topics.IsBlank() { topics = topics.ReplaceWithRegexp("^.+\\\">|<\\/a><\\/li>", "") song.Topics = topics.ToStringArray().SplitWithRegexp(" - ").SplitWithRegexp("/") temp := data.FindAllString("<a.+class=\"casi\".+>(.+?)<\\/a>", 1) var singer dna.String if temp.Length() > 0 { singer = temp[0] } else { singer = "" } if topics.Match("Nhạc Hoa") && singer.Match(` / `) { song.SameArtist = 1 } } lyric := data.FindAllString(`(?mis)txtlyric.+Bạn chưa nhập nội bài hát`, 1)[0] if !lyric.IsBlank() { song.Islyric = 1 song.Lyric = lyric.ReplaceWithRegexp("(?mis)<\\/textarea>.+$", "").ReplaceWithRegexp("^.+>", "") if song.Lyric.Match("Hãy đóng góp lời bài hát chính xác cho Nhacso nhé") { song.Lyric = `` song.Islyric = 0 } } } channel <- true }() return channel }
func getSongLrc(song *Song) { result, err := http.Get(song.LrcUrl) if err == nil { lrc, derr := DecryptLRC(result.Data) if derr == nil { song.Lrc = lrc } else { dna.Log("ERR WHILE DECRYPT SONG ", song.Id) dna.Log("-----\n") } } }
//GetAPISongLyric fetchs a song lyric from API url. An url pattern is: // http://api.mp3.zing.vn/api/mobile/song/getlyrics?keycode=fafd463e2131914934b73310aa34a23f&requestdata={"id":"ZW67FWWF"} // // The following result: // { // "id": 1188945, // "content": "Chuyện hai chúng ta bây giờ khác rồi\nThật lòng anh không muốn ai phải bối rối\nSợ em nhìn thấy nên anh đành phải lẳng lặng đứng xa\nChuyện tình thay đổi nên bây giờ trở thành người thứ ba\nTrách ai bây giờ, trách mình thôi.....\n\nĐK:\nNhìn em hạnh phúc bên ai càng làm anh tan nát lòng\nMới hiểu tại sao tình yêu người ta sợ khi cách xa\nĐiều anh lo lắng cứ vẫn luôn xảy ra\nNếu không đổi thay chẳng có ai sống được vì thiếu mất yêu thương.\n\nThời gian giết chết cuộc tình còn đau hơn giết chính mình\nTại sao mọi thứ xung quanh vẫn thế chỉ lòng người thay đổi\nGiờ em chỉ là tất cả quá khứ anh phải cố xoá trong nước mắt\n\n[ Trong tình yêu, thuộc về ai không quan trọng\nMột giây mơ màng là đã mất nhau....]\n\nCàng nghĩ đến em, anh càng hối hận\nVì xa em nên mất em thật ngu ngốc\nGiờ tình anh như bức tranh bằng nước mắt không màu sắc\nNhẹ nhàng và trong suốt cho dù đau đớn vẫn lặng yên\nTrách ai bây giờ, trách mình thôi....\n\nĐK:\nNhìn em hạnh phúc bên ai càng làm anh tan nát lòng\nMới hiểu tại sao tình yêu người ta sợ khi cách xa\nĐiều anh lo lắng cứ vẫn luôn xảy ra\nNếu không đổi thay chẳng có ai sống được vì thiếu mất yêu thương.\n\nThời gian giết chết cuộc tình còn đau hơn giết chính mình\nTại sao mọi thứ xung quanh vẫn thế chỉ lòng người thay đổi\nGiờ em chỉ là tất cả quá khứ anh phải cố xoá trong nước mắt.\n\nNụ cười em vẫn như xưa mà lòng em sao khác rồi\nNỗi đau này chỉ mình anh nhận lấy vì anh đã sai\nGiờ anh phải cố giữ nước mắt đừng rơi\nBức tranh tình yêu của em từ lâu đã không hề có anh......\n\nTrong tình yêu, thuộc về ai không quan trọng, rồi cũng mất nhau…", // "mark": 4664, // "author": "o0cobemuaxuan0o", // "response": { // "msgCode": 1 // } // } func GetAPISongLyric(id Int) (*APISongLyric, error) { var apisongLyric = new(APISongLyric) baseURL := "http://api.mp3.zing.vn/api/mobile/song/getlyrics?" link := Sprintf(`%vkeycode=%v&requestdata={"id":"%v"}`, baseURL, API_KEYCODE, GetKey(id)) result, err := http.Get(link) if err == nil { data := &result.Data json.Unmarshal([]byte(*data), apisongLyric) return apisongLyric, nil } else { return nil, err } }
func getSongLrcUrl(song *Song) { link := "http://www.nhaccuatui.com/flash/xml?key1=" + song.LinkKey result, err := http.Get(link) if err == nil { data := &result.Data lrcArr := data.FindAllStringSubmatch(`<lyric><\!\[CDATA\[(.+)\]\]></lyric>`, 1) if len(lrcArr) > 0 { song.LrcUrl = lrcArr[0][1].Trim() getSongLrc(song) } } }
//GetAPIVideo fetchs a video from API url. An url pattern is: //http://api.mp3.zing.vn/api/mobile/video/getvideoinfo?keycode=fafd463e2131914934b73310aa34a23f&requestdata={"id":1074729245} // //The following result: // { // "video_id": 1074729245, // "title": "Xin Anh Đừng Đến", // "artist_id": "465", // "artist": "Bảo Thy", // "genre_id": "1,8,66", // "thumbnail": "thumb_video/d/c/dcacff355635deedf62fd80de34f2346_1380622208.jpg", // "duration": 307, // "status_id": 1, // "link": "/video-clip/Xin-Anh-Dung-Den-Bao-Thy/ZW686I9D.html", // "source": { // "240": "http://api.mp3.zing.vn/api/mobile/source/video/LncGtLGazaDuFAQyFlHTFGLn", // "360": "http://api.mp3.zing.vn/api/mobile/source/video/LHJmTkHaAaFiDlQtdCnyDnLG", // "480": "http://api.mp3.zing.vn/api/mobile/source/video/LHcHTknNlNFuFzpylJnyFHZm", // "720": "http://api.mp3.zing.vn/api/mobile/source/video/ZHJHyLHNSNFRDzWyNbmTDmLm", // "1080": "http://api.mp3.zing.vn/api/mobile/source/video/ZnxmTkGalNvuvzQtkGcntvHLn" // }, // "total_play": 1684238, // "likes": 7663, // "like_this": false, // "favourites": 0, // "favourite_this": false, // "comments": 246, // "genre_name": "Việt Nam, Nhạc Trẻ, Nhạc Dance", // "response": { // "msgCode": 1 // } // } func GetAPIVideo(id Int) (*APIVideo, error) { var apivideo = new(APIVideo) apivideo.Id = id baseURL := "http://api.mp3.zing.vn/api/mobile/video/getvideoinfo?" link := Sprintf(`%vkeycode=%v&requestdata={"id":"%v"}`, baseURL, API_KEYCODE, apivideo.Id-ID_DIFFERENCE) result, err := http.Get(link) if err == nil { data := &result.Data json.Unmarshal([]byte(*data), apivideo) return apivideo, nil } else { return nil, err } }
//GetAPIArtist fetchs an artist from API url. An url pattern is: //http://api.mp3.zing.vn/api/mobile/artist/getartistinfo?key=fafd463e2131914934b73310aa34a23f&requestdata={"id":828} // //The following result: // { // "artist_id": 828, // "name": "Quang Lê", // "alias": "", // "birthname": "Leon Quang Lê", // "birthday": "24/01/1981", // "sex": 1, // "genre_id": "1,11,13", // "avatar": "avatars/9/6/96c7f8568cdc943997aace39708bf7b6_1376539870.jpg", // "cover": "cover_artist/9/9/9920ce8b6c7eb43328383041acb58e76_1376539928.jpg", // "cover2": "", // "zme_acc": "", // "role": "1", // "website": "", // "biography": "Quang Lê sinh ra tại Huế, trong gia đình gồm 6 anh em và một người chị nuôi, Quang Lê là con thứ 3 trong gia đình.\r\nĐầu những năm 1990, Quang Lê theo gia đình sang định cư tại bang Missouri, Mỹ.\r\nHiện nay Quang Lê sống cùng gia đình ở Los Angeles, nhưng vẫn thường xuyên về Việt Nam biểu diễn.\r\n\r\nSự nghiệp:\r\n\r\nSay mê ca hát từ nhỏ và niềm say mê đó đã cho Quang Lê những cơ hội để đi đến con đường ca hát ngày hôm nay. Có sẵn chất giọng Huế ngọt ngào, Quang Lê lại được cha mẹ cho theo học nhạc từ năm lớp 9 đến năm thứ 2 của đại học khi gia đình chuyển sang sống ở California . Anh từng đoạt huy chương bạc trong một cuộc thi tài năng trẻ tổ chức tại California. Thời gian đầu, Quang Lê chỉ xuất hiện trong những sinh hoạt của cộng đồng địa phương, mãi đến năm 2000 mới chính thức theo nghiệp ca hát. Nhưng cũng phải gần 2 năm sau, Quang Lê mới tạo được chỗ đứng trên sân khấu ca nhạc của cộng đồng người Việt ở Mỹ. Và từ đó, Quang Lê liên tục nhận được những lời mời biểu diễn ở Mỹ, cũng như ở Canada, Úc...\r\nLà một ca sĩ trẻ, cùng gia đình định cư ở Mỹ từ năm 10 tuổi, Quang Lê đã chọn và biểu diễn thành công dòng nhạc quê hương. Nhạc sĩ lão thành Châu Kỳ cũng từng khen Quang Lê là ca sĩ trẻ diễn đạt thành công nhất những tác phẩm của ông…\r\nQuang Lê rất hạnh phúc và anh xem lời khen tặng đó là sự khích lệ rất lớn để anh cố gắng nhiều hơn nữa trong việc diễn đạt những bài hát của nhạc sĩ Châu Kỳ cũng như những bài hát về tình yêu quê hương đất nước. 25 tuổi, được xếp vào số những ca sĩ trẻ thành công, nhưng Quang Lê luôn khiêm tốn cho rằng thành công thường đi chung với sự may mắn, và điều may mắn của anh là được lớn lên trong tiếng đàn của cha, giọng hát của mẹ.\r\nTiếng hát, tiếng đàn của cha mẹ anh quyện lấy nhau, như một sợi dây vô hình kết nối mọi người trong gia đình lại với nhau. Những âm thanh ngọt ngào đó chính là dòng nhạc quê hương mà Quang Lê trình diễn ngày hôm nay. Quang Lê cho biết: \"Mặc dù sống ở Mỹ đã lâu nhưng hình ảnh quê hương không bao giờ phai mờ trong tâm trí Quang Lê, nên mỗi khi hát những nhạc phẩm quê hương, những hình ảnh đó lại như hiện ra trước mắt\". Có lẽ vì thế mà giọng hát của Quang Lê như phảng phất cái không khí êm đềm của thành phố Huế.\r\nQuang Lê là con thứ 3 trong gia đình gồm 6 anh em và một người chị nuôi. Từ nhỏ, Quang Lê thường được người chung quanh khen là có triển vọng. Cậu bé chẳng hiểu \"có triển vọng\" là gì, chỉ biết là mình rất thích hát, và thích được cất tiếng hát trước người thân, để được khen ngợi và cổ vũ.\r\nĐầu những năm 1990, Quang Lê theo gia đình sang định cư tại bang Missouri, Mỹ. Một hôm, nhân có buổi lễ được tổ chức ở ngôi chùa gần nhà, một người quen của gia đình đã đưa Quang Lê đến để giúp vui cho chương trình sinh hoạt của chùa, và anh đã nhận được sự đón nhận nhiệt tình của khán giả. Quang Lê nhớ lại, \"người nghe không chỉ vỗ tay hoan hô mà còn thưởng tiền nữa\". Đối với một đứa trẻ 10 tuổi, thì đó quả là một niềm hạnh phúc lớn lao, khi nghĩ rằng niềm đam mê của mình lại còn có thể kiếm tiền giúp đỡ gia đình.\r\nQuan điểm của Quang Lê là khi dự định làm một việc gì thì hãy cố gắng hết mình để đạt được những điều mà mình mơ ước. Quang Lê cho biết anh toàn tâm toàn ý với dòng nhạc quê hương trữ tình mà anh đã chọn lựa và được đón nhận, nhưng anh tiết lộ là những lúc đi hát vũ trường, vì muốn thay đổi và để hòa đồng với các bạn trẻ, anh cũng trình bày những ca khúc \"Techno\" và cũng nhảy nhuyễn không kém gì vũ đoàn minh họa.\r\n\r\nAlbum:\r\n\r\nSương trắng miền quê ngoại (2003)\r\nXin gọi nhau là cố nhân (2004)\r\nHuế đêm trăng (2004)\r\nKẻ ở miền xa (2004)\r\n7000 đêm góp Lại (2005)\r\nĐập vỡ cây đàn (2007)\r\nHai quê (2008)\r\nTương tư nàng ca sĩ (2009)\r\nĐôi mắt người xưa (2010)\r\nPhải lòng con gái bến tre (2011)\r\nKhông phải tại chúng mình (2012)", // "agency_name": "Ca sĩ Tự Do", // "national_name": "Việt Nam", // "is_official": 1, // "year_active": "2000", // "status_id": 1, // "created_date": 0, // "link": "/nghe-si/Quang-Le", // "genre_name": "Việt Nam, Nhạc Trữ Tình", // "response": { // "msgCode": 1 // } // } func GetAPIArtist(id Int) (*APIArtist, error) { var apiArtist = new(APIArtist) apiArtist.Id = id baseURL := "http://api.mp3.zing.vn/api/mobile/artist/getartistinfo?" link := Sprintf(`%vkeycode=%v&requestdata={"id":"%v"}`, baseURL, API_KEYCODE, apiArtist.Id) result, err := http.Get(link) if err == nil { data := &result.Data json.Unmarshal([]byte(*data), apiArtist) return apiArtist, nil } else { return nil, err } }
// getVideoFromMainPage returns video from main page func getVideoFromMainPage(video *Video) <-chan bool { channel := make(chan bool, 1) go func() { link := "http://www.chacha.vn/video/google-bot," + video.Id.ToString() + ".html" result, err := http.Get(link) // dna.Log(link) if err == nil && !result.Data.Match(`Không tìm thấy trang`) { data := &result.Data titleArr := data.FindAllStringSubmatch(`<h1 class="name">(.+)</h1>`, 1) if len(titleArr) > 0 { video.Title = titleArr[0][1].Trim() } artistArr := data.FindAllStringSubmatch(`(?mis)<li>Nghệ sĩ:(.+?)</li>`, 1) if len(artistArr) > 0 { video.Artists = refineAuthorsOrArtists(artistArr[0][1].RemoveHtmlTags("").Trim()) } topicArr := data.FindAllStringSubmatch(`(?mis)<li>Thể loại:(.+?)</li>`, 1) if len(topicArr) > 0 { video.Topics = topicArr[0][1].RemoveHtmlTags("").Trim().ToStringArray() } yearReleasedArr := data.FindAllStringSubmatch(`Năm phát hành: <span>(.+?)</span>`, 1) if len(yearReleasedArr) > 0 { video.YearReleased = yearReleasedArr[0][1].Trim().ToInt() } playsArr := data.FindAllStringSubmatch(`([0-9]+) lượt xem`, 1) if len(playsArr) > 0 { video.Plays = playsArr[0][1].ToInt() } coverartArr := data.FindAllString(`<meta property="og:image".+`, 1) if coverartArr.Length() > 0 { video.Thumbnail = coverartArr[0].GetTagAttributes("content") } lyricArr := data.FindAllStringSubmatch(`(?mis)<p class="lyric" id="lyric_box">(.+?)<a class="fs11 more" id="lyric_more".+?</a>`, 1) if len(lyricArr) > 0 { video.Lyric = lyricArr[0][1].Replace(`<br /> `, "\n").Replace(`<br />`, "\n").RemoveHtmlTags("").Trim() } } channel <- true }() return channel }
//GetAPITV fetchs an artist from API url. An url pattern is: //http://api.tv.zing.vn/2.0/media/info?api_key=d04210a70026ad9323076716781c223f&media_id=51497&session_key=91618dfec493ed7dc9d61ac088dff36b& // //NOTICE: SubTitle and Tracking fields are not properly decoded. // //The following result: // { // "response": { // "id": 51497, // "title": "Vòng Liveshow", // "full_name": "The Voice - Season 5 - Tập 23 - Vòng Liveshow", // "episode": 23, // "release_date": "6/12/2013", // "duration": 2537, // "thumbnail": "2013/1206/e3/fb7ee815918eff0e231760e7b2f4fe2c_1386344026.jpg", // "file_url": "stream6.tv.zdn.vn/streaming/e466a331d093ceece2a383a3d2523309/52a291af/2013/1206/e3/8cbe06097d66e66284b9488c850e0875.mp4?format=f360&device=ios", // "other_url": { // "Video3GP": "stream.m.tv.zdn.vn/tv/b74aaf5ea32af297c60a0493d310f560/52a291af/Video3GP/2013/1206/e3/eb28c70b3d5a75eae62a3f7b3825ddcc.3gp?format=f3gp&device=ios", // "Video720": "stream6.tv.zdn.vn/streaming/46d702b8f98fc59a3a3ffb5b104b2470/52a291af/Video720/2013/1206/e3/d4bbac8c340dbbd2131070b87a07e876.mp4?format=f720&device=ios", // "Video480": "stream6.tv.zdn.vn/streaming/5e6b574fe2c59e513ae71473a7f801fd/52a291af/Video480/2013/1206/e3/4142383c2cffccbfec718321a513c488.mp4?format=f480&device=ios" // }, // "link_url": "http://tv.zing.vn/video/the-voice---season-5-tap-23-vong-liveshow/IWZAI9A9.html", // "program_id": 1848, // "program_name": "The Voice - Season 5", // "program_thumbnail": "channel/2/2/221b495a68ee884668f203ad34a0468e_1379405083.jpg", // "program_genre": [ // { // "id": 78, // "name": "TV Show" // } // ], // "listen": 4527, // "comment": 2, // "like": 11, // "rating": 10, // "sub_title": {}, // "tracking": {}, // "signature": "b7b45e7b6f8220fe68ab6ada7a4218a0" // } // } func GetAPITV(id Int) (*APITV, error) { baseURL := "http://api.tv.zing.vn/2.0/media/info" link := Sprintf("%v?api_key=%v&media_id=%v&session_key=%v&", baseURL, TV_API_KEY, (id - ID_DIFFERENCE), TV_SESSION_KEY) // Log(link) tvRes := new(tempAPITVReponse) result, err := http.Get(link) if err == nil { data := &result.Data json.Unmarshal([]byte(*data), tvRes) return &tvRes.Response, nil } else { return nil, err } }
// getSongFromMainPage returns song from main page func getSongFromMainPage(song *Song) <-chan bool { channel := make(chan bool, 1) go func() { link := "http://www.chacha.vn/song/google-bot," + song.Id.ToString() + ".html" result, err := http.Get(link) // dna.Log(link) if err == nil && !result.Data.Match(`Không tìm thấy bài hát`) { data := &result.Data titleArr := data.FindAllStringSubmatch(`<h1 class="name">(.+)</h1>`, 1) if len(titleArr) > 0 { song.Title = titleArr[0][1].Trim().DecodeHTML() } artistArr := data.FindAllStringSubmatch(`(?mis)<li>Nghệ sĩ:(.+?)</li>`, 1) if len(artistArr) > 0 { song.Artists = refineAuthorsOrArtists(artistArr[0][1].RemoveHtmlTags("").Trim()) artistid := artistArr[0][1].GetTagAttributes("href").FindAllString(`[0-9]+`, 1) if artistid.Length() > 0 { song.Artistid = artistid[0].ToInt() } } topicArr := data.FindAllStringSubmatch(`(?mis)<li>Thể loại:(.+?)</li>`, 1) if len(topicArr) > 0 { song.Topics = topicArr[0][1].RemoveHtmlTags("").Trim().ToStringArray() } playsArr := data.FindAllStringSubmatch(`([0-9]+) lượt nghe`, 1) if len(playsArr) > 0 { song.Plays = playsArr[0][1].ToInt() } lyricArr := data.FindAllStringSubmatch(`(?mis)<p class="lyric" id="lyric_box">(.+?)<a class="fs11 more" id="lyric_more".+?</a>`, 1) if len(lyricArr) > 0 { song.Lyrics = lyricArr[0][1].Replace(`<br /> `, "\n").Replace(`<br />`, "\n").RemoveHtmlTags("").Trim() } coverartArr := data.FindAllString(`<meta property="og:image".+`, 1) if coverartArr.Length() > 0 { song.Coverart = coverartArr[0].GetTagAttributes("content") } } channel <- true }() return channel }
func getAlbumTotalPlays(album *Album) <-chan bool { channel := make(chan bool, 1) go func() { link := "http://nhacso.net/statistic/albumtotallisten?listIds=" + album.Id.ToString() result, err := http.Get(link) if err == nil { plays := result.Data.FindAllStringSubmatch(`"totalListen":"([0-9]+)"`, 1) if len(plays) > 0 && plays[0].Length() > 1 { album.Plays = plays[0][1].ToInt() } } channel <- true }() return channel }
//GetAPIVideoLyric fetchs a video from API url. An url pattern is: //http://api.mp3.zing.vn/api/mobile/video/getlyrics?keycode=fafd463e2131914934b73310aa34a23f&requestdata={"id":1074729245} // //The following result: // { // "id": "1207338", // "content": "Xin Anh Đừng Đến\n(Bảo Thy on the mind)\nÁnh sáng trắng xóa bỗng thấy em trong cơn mơ\nMột mình em như kề bên không còn ai\nBờ vai em đang run run khi không gian đang chìm sâu\nTrong ánh mắt em giờ đây một màu u tối.\n\nNhớ ánh mắt ấy tiếng nói ấy sao giờ đây\nChỉ còn em đang ngồi bên những niềm đau\nTự dặn mình hãy cố xóa hết những giấc mơ khi bên anh\nEm còn mơ, em còn mơ đầy thương nhớ.\n\nEm sẽ xóa hết những phút giây ta yêu thương\nĐể về sau gặp lại nhau em sẽ vơi đi nỗi đau\nHãy để nỗi nhớ khi mà em đang bơ vơ\nKhông cần anh không cần thương nhớ\nNhững ngày còn vụn vỡ\n\n(em sẽ cố quên)\n(tình yêu đó)\n\n[ĐK:]\nXin anh hãy nói, đôi ta chia tay\nCho con tim em không như bao ngày\nXin anh đừng đến trong cơn mơ\nĐể từng ngày qua em thôi trông mong chờ\nLeave me alone!\n\nHey Boy ! Shake your body x3\nHey Girl ! Let me Put your hands up in the air\n\n[ĐK:]\nXin anh hãy nói, đôi ta chia tay\nCho con tim em không như bao ngày\nXin anh đừng đến trong cơn mơ\nĐể từng ngày qua em thôi trông mong chờ\nLeave me alone!", // "mark": 593, // "status_id": 0, // "author": "pynyuno", // "created_date": 1380727569, // "response": { // "msgCode": 1 // } // } func GetAPIVideoLyric(id Int) (*APIVideoLyric, error) { var apiVideoLyric = new(APIVideoLyric) baseURL := "http://api.mp3.zing.vn/api/mobile/video/getlyrics?" link := Sprintf(`%vkeycode=%v&requestdata={"id":"%v"}`, baseURL, API_KEYCODE, id-ID_DIFFERENCE) // Log(link) result, err := http.Get(link) if err == nil { data := &result.Data // Log(*data) json.Unmarshal([]byte(*data), apiVideoLyric) return apiVideoLyric, nil } else { return nil, err } }
//GetAPIAlbum fetchs an album from API url. An url pattern is: //http://api.mp3.zing.vn/api/mobile/playlist/getplaylistinfo?key=fafd463e2131914934b73310aa34a23f&requestdata={"id":1073816610} // //The following result: // { // "playlist_id": 1073816610, // "title": "Thời Gian", // "artist_id": "28768", // "artist": "Stillrock", // "genre_id": "1,10", // "zaloid": 0, // "username": "", // "cover": "covers/3/e/3e2c54b351be6220c2afe114f2cc0b90_1356856078.jpg", // "description": "Ý tưởng của album dựa trên những diễn biến cuộc sống đời thường của ban nhạc. Có bắt tay vào làm việc mà cụ thể là đầu tư cho một album rock trong điều kiện còn nhiều khó khăn quả thực lúc đó mới biết quí THỜI GIAN. Đam mê thứ tài sản vô giá mà mỗi rocker chân chính có được, ROCK gieo vào đầu óc những ý nghĩ tích cực: sự mạnh mẽ, sự táo bạo và cả sự nghiêm túc đàng hoàng. Quả thực, rock đã tiếp sức để mỗi người trẻ tự vượt qua những cám dỗ trong cuộc sống, những lũ nhện ma quái giăng tơ huyền ảo khắp nơi. Đó chính là TƠ NHỆN. Niềm vui , những điều hạnh phúc vừa đến, lại phải đối mặt với khó khăn và nỗi đau. Trong văn chương nói rất nhiều cái gọi là cõi tạm, sinh ra là khóc là khổ. Vậy mới biết “Có nước mắt trôi trên cuộc đời, có sóng gió mênh mang bầu trời, hãy đứng vững bằng đôi chân không mềm yếu” (trích lời bài CHIẾN SĨ) . Phải đứng vững trên đôi chân mình, chân lí sống không bao giờ thay đổi và hãy nghe TẤT CẢ để thấy mình trong đó, cuộc sống đôi khi vô thường, nhàm chán đến tận cùng, vậy mới biết lí trí chẳng vượt qua được sự tận cùng. Chưa hết, TRĂNG MỜ muốn đem tới cho rock fan một chút cảm thụ nhân văn mà tác giả Phan Hoàng Thái muốn gửi gắm. Quả đất là một vòng tròn, Mặt trăng là một vòng tròn, mỗi con người lần lượt phải đi qua cái vòng tròn lẫn quẩn đó… cái chết. Để rồi khi đối mặt với nó có nghĩa là chúng ta thấy sự sống quí giá chừng nào. RUNG xô đẩy người nghe từ đất liền ra biển khơi, ở đâu cũng vậy cũng có hiền nhân và quĩ dữ, cũng có nguy nan và bình s", // "is_hit": 1, // "is_official": 1, // "is_album": 1, // "year": "2008", // "status_id": 1, // "link": "/album/Thoi-Gian-Stillrock/ZWZA7UAW.html", // "total_play": 285289, // "genre_name": "Việt Nam, Rock Việt", // "likes": 102, // "like_this": false, // "comments": 0, // "favourites": 0, // "favourite_this": false, // "response": { // "msgCode": 1 // } // } func GetAPIAlbum(id Int) (*APIAlbum, error) { var apialbum = new(APIAlbum) apialbum.Id = id baseURL := "http://api.mp3.zing.vn/api/mobile/playlist/getplaylistinfo?" link := Sprintf(`%vkeycode=%v&requestdata={"id":"%v"}`, baseURL, API_KEYCODE, apialbum.Id-ID_DIFFERENCE) // Log(link) result, err := http.Get(link) if err == nil { data := &result.Data json.Unmarshal([]byte(*data), apialbum) return apialbum, nil } else { return nil, err } }
func getVideoFromMainPage(video *Video) <-chan bool { channel := make(chan bool, 1) go func() { link := "http://hcm.nhac.vui.vn/google-bot-clip" + video.Id.ToString() + "c1.html" // Log(link) result, err := http.Get(link) if err == nil { data := &result.Data tmpArr := data.FindAllStringSubmatch(`<div class="nghenhac-baihat"><h1>(.+)</h1></div>`, 1) if len(tmpArr) > 0 { tmp := tmpArr[0][1].Trim().Split(` - `) video.Title = tmp[0] if tmp.Length() > 1 { tmp.Shift() video.Artists = refineAuthorsOrArtists(tmp.Join(" - ")) } } topicsArr := data.FindAllStringSubmatch(`Thể loại: (<a.+?)\|`, 1) if len(topicsArr) > 0 { video.Topics = topicsArr[0][1].RemoveHtmlTags("").Trim().ToStringArray().SplitWithRegexp(` / `).SplitWithRegexp(`/`) } playsArr := data.FindAllStringSubmatch(`Lượt nghe: (.+?)</div>`, 1) if len(playsArr) > 0 { video.Plays = playsArr[0][1].Trim().Replace(",", "").ToInt() } thumbArr := data.FindAllStringSubmatch(`(<meta property="og:image".+)`, 1) if len(thumbArr) > 0 { video.Thumbnail = thumbArr[0][1].GetTagAttributes("content").Trim() } lyricArr := data.FindAllString(`(?mis)<div class="nghenhac-loibaihat-cnt.+<div class="loi-bai-hat-footer">`, 1) if lyricArr.Length() > 0 { lyric := lyricArr[0].Trim().Replace(`<br/>`, "\n").RemoveHtmlTags("").Trim() if !lyric.Match(`Hiện bài hát.+chưa có lời.`) { video.Lyric = lyric } } } channel <- true }() return channel }
// GetAPISongsByArtist returns a list of songs, HasMore songs form an artist // from artistid, pageIdex and pageSize. // If artist id is not available, then the hot song lists will be returned. func GetAPISongsByArtist(id, pageIndex, pageSize dna.Int) ([]APISong, dna.Bool, error) { urlb := NewURLBuilder() link := urlb.GetSongsByArtist(id, pageIndex, pageSize) result, err := http.Get(link) if err == nil { var asongList = &apiSongList{} errd := json.Unmarshal(result.Data.ToBytes(), asongList) if errd == nil { return asongList.Data, asongList.HasMore, nil } else { return nil, false, errd } } else { return nil, false, err } }
func getAlbumTotalSongs(album *Album) <-chan bool { channel := make(chan bool, 1) go func() { link := "http://nhacso.net/album/gettotalsong?listIds=" + album.Id.ToString() result, err := http.Get(link) if err == nil { data := &result.Data nsongs := data.FindAllString(`"TotalSong":"[0-9]+"`, 1) if nsongs.Length() > 0 { album.Nsongs = nsongs[0].FindAllString(`[0-9]+`, 1)[0].ToInt() } } channel <- true }() return channel }
func getVideoDurationAndSublink(video *Video) <-chan bool { channel := make(chan bool, 1) go func() { link := "http://nhacso.net/flash/video/xnl/1/id/" + GetKey(video.Id) // Log(link) result, err := http.Get(link) if err == nil { data := &result.Data // getValueXML is in song.go // Log(getValueXML(data, "duration", 0)) video.Duration = getValueXML(data, "duration", 0).RemoveHtmlTags("").ToInt() video.Sublink = getValueXML(data, "subUrl", 0) } channel <- true }() return channel }