From 4f4f81c267eb425eb367c59a343bdc476d78b130 Mon Sep 17 00:00:00 2001 From: listen1 Date: Tue, 10 May 2016 21:13:19 +0800 Subject: [PATCH] adjust playlist height, make module for platform code, fix bug for qq not playable tracks --- css/player.css | 6 +- js/app.js | 37 ++- js/loweb.js | 129 +++++----- js/netease.js | 688 +++++++++++++++++++++++++------------------------ js/qq.js | 536 ++++++++++++++++++++------------------ js/xiami.js | 447 ++++++++++++++++---------------- 6 files changed, 962 insertions(+), 881 deletions(-) diff --git a/css/player.css b/css/player.css index ee7f93c..7ba9ecb 100644 --- a/css/player.css +++ b/css/player.css @@ -496,7 +496,7 @@ em, i { _bottom: 90px; right: 0px; _right: 0px; - height: 330px; + height: 349px; width: 100%; background-color: #121212; } @@ -504,7 +504,7 @@ em, i { .m-playbar .menu ul { display: inline-block; padding-left: 0px; - height: 290px; + height: 308px; overflow-y: scroll; width: 60%; margin-bottom: 0px; @@ -520,7 +520,7 @@ em, i { text-align: center; width: 39%; display: inline-block; - height: 290px; + height: 308px; overflow-y: scroll; position: relative; } diff --git a/js/app.js b/js/app.js index 3262634..57f3340 100644 --- a/js/app.js +++ b/js/app.js @@ -37,6 +37,18 @@ }; }); + function getSourceName(sourceId) { + if (sourceId == 0) { + return 'netease'; + } + if (sourceId == 1) { + return 'xiami'; + } + if (sourceId == 2) { + return 'qq'; + } + } + // control main view of page, it can be called any place app.controller('NavigationController', ['$scope', '$http', '$httpParamSerializerJQLike', '$timeout', @@ -389,7 +401,17 @@ if (angularPlayer.getRepeatStatus() == false) { angularPlayer.repeatToggle(); } - $timeout(function(){angularPlayer.setBootstrapTrack(loWeb.bootstrapTrack);}, 0); + $timeout( + function(){ + angularPlayer.setBootstrapTrack( + loWeb.bootstrapTrack( + function(){}, + function(){ + Notification.info('版权原因无法播放,请搜索其他平台'); + }) + ); + }, 0 + ); if (track_id == -1) { return; @@ -535,7 +557,10 @@ var content = line.replace(/\[(\d{2,})\:(\d{2})(?:\.(\d{1,3}))?\]/g, ''); var min = parseInt(timeRegResult[1]); var sec = parseInt(timeRegResult[2]); - var microsec = parseInt(rightPadding(timeRegResult[3], 3, '0')); + var microsec = 0; + if (timeRegResult[3] != null) { + microsec = parseInt(rightPadding(timeRegResult[3], 3, '0')); + } var seconds = min * 60 * 1000 + sec*1000 + microsec; var lyricObject = {}; lyricObject.content = content; @@ -618,7 +643,7 @@ $scope.changeTab = function(newTab){ $scope.tab = newTab; $scope.result = []; - loWeb.get('/search?source='+ $scope.tab + '&keywords=' + $scope.keywords).success(function(data) { + loWeb.get('/search?source=' + getSourceName($scope.tab) + '&keywords=' + $scope.keywords).success(function(data) { // update the textarea $scope.result = data.result; }); @@ -637,7 +662,7 @@ // go ahead and retrieve the data if (tmpStr === $scope.keywords) { - loWeb.get('/search?source='+ $scope.tab + '&keywords=' + $scope.keywords).success(function(data) { + loWeb.get('/search?source=' + getSourceName($scope.tab) + '&keywords=' + $scope.keywords).success(function(data) { // update the textarea $scope.result = data.result; }); @@ -848,7 +873,7 @@ $scope.tab = newTab; $scope.result = []; - loWeb.get('/show_playlist?source=' + $scope.tab).success(function(data) { + loWeb.get('/show_playlist?source=' + getSourceName($scope.tab)).success(function(data) { $scope.result = data.result; }); @@ -863,7 +888,7 @@ $scope.loadPlaylist = function(){ - loWeb.get('/show_playlist?source=' + $scope.tab).success(function(data) { + loWeb.get('/show_playlist?source=' + getSourceName($scope.tab)).success(function(data) { $scope.result = data.result; }); }; diff --git a/js/loweb.js b/js/loweb.js index 5db8bef..e9e2e23 100644 --- a/js/loweb.js +++ b/js/loweb.js @@ -1,100 +1,87 @@ var ngloWebManager = angular.module('loWebManager', []); +function getProviderByName(sourceName) { + if (sourceName == 'netease') { + return netease; + } + if (sourceName == 'xiami') { + return xiami; + } + if (sourceName == 'qq') { + return qq; + } +} + +function getProviderByItemId(itemId) { + var prefix = itemId.slice(0,2); + if (prefix == 'ne') { + return netease; + } + if (prefix == 'xm') { + return xiami; + } + if (prefix == 'qq') { + return qq; + } +} + ngloWebManager.factory('loWeb', ['$rootScope', '$log', '$http', '$httpParamSerializerJQLike', function($rootScope, $log, $http, $httpParamSerializerJQLike) { - var response = null; return { get: function(url) { if (url.search('/show_playlist') != -1) { var source = getParameterByName('source', url); - if (source == '0') { - return ne_show_playlist(url, $http); - } - if (source == '1') { - return xm_show_playlist(url, $http); - } - if (source == '2') { - return qq_show_playlist(url, $http); - } + var provider = getProviderByName(source); + return provider.show_playlist(url, $http); } if (url.search('/playlist') != -1) { var list_id = getParameterByName('list_id', url); - if (list_id.search('xmplaylist')!= -1) { - return xm_get_playlist(url, $http); - } - if (list_id.search('neplaylist')!= -1) { - return ne_get_playlist(url, $http); - } - if (list_id.search('qqplaylist')!= -1) { - return qq_get_playlist(url, $http); - } - + var provider = getProviderByItemId(list_id); + return provider.get_playlist(url, $http); } if (url.search('/search') != -1) { var source = getParameterByName('source', url); - if (source == '0') { - return ne_search(url, $http, $httpParamSerializerJQLike); - } - if (source == '1') { - return xm_search(url, $http, $httpParamSerializerJQLike); - } - if (source == '2') { - return qq_search(url, $http, $httpParamSerializerJQLike); - } + var provider = getProviderByName(source); + return provider.search(url, $http, $httpParamSerializerJQLike); } if (url.search('/album') != -1) { var album_id = getParameterByName('album_id', url); - if (album_id.search('xmalbum')!= -1) { - return xm_album(url, $http, $httpParamSerializerJQLike); - } - if (album_id.search('nealbum')!= -1) { - return ne_album(url, $http, $httpParamSerializerJQLike); - } - if (album_id.search('qqalbum')!= -1) { - return qq_album(url, $http, $httpParamSerializerJQLike); - } + var provider = getProviderByItemId(album_id); + return provider.album(url, $http, $httpParamSerializerJQLike); } if (url.search('/artist') != -1) { var artist_id = getParameterByName('artist_id', url); - if (artist_id.search('xmartist')!= -1) { - return xm_artist(url, $http, $httpParamSerializerJQLike); - } - if (artist_id.search('neartist')!= -1) { - return ne_artist(url, $http, $httpParamSerializerJQLike); - } - if (artist_id.search('qqartist')!= -1) { - return qq_artist(url, $http, $httpParamSerializerJQLike); - } + var provider = getProviderByItemId(artist_id); + return provider.artist(url, $http, $httpParamSerializerJQLike); } if (url.search('/lyric') != -1) { var track_id = getParameterByName('track_id', url); - if (track_id.search('xmtrack')!= -1) { - return xm_lyric(url, $http, $httpParamSerializerJQLike); - } - if (track_id.search('netrack')!= -1) { - return ne_lyric(url, $http, $httpParamSerializerJQLike); - } - if (track_id.search('qqtrack')!= -1) { - return qq_lyric(url, $http, $httpParamSerializerJQLike); - } + var provider = getProviderByItemId(track_id); + return provider.lyric(url, $http, $httpParamSerializerJQLike); } }, - bootstrapTrack: function(sound, track, callback){ - // always refresh url, becaues url will expires - // if (sound.url.search('http') != -1){ - // callback(); - // return; - // } - if(track.source == 'xiami') { - xm_bootstrap_track(sound, track, callback, $http, $httpParamSerializerJQLike); - } - if(track.source == 'netease') { - ne_bootstrap_track(sound, track, callback, $http, $httpParamSerializerJQLike); - } - if(track.source == 'qq') { - qq_bootstrap_track(sound, track, callback, $http, $httpParamSerializerJQLike); - } + bootstrapTrack: function(success, failure) { + return function(sound, track, callback){ + // always refresh url, becaues url will expires + // if (sound.url.search('http') != -1){ + // callback(); + // return; + // } + function successCallback() { + callback(); + success(); + } + + function failureCallback() { + failure(); + } + var source = track.source; + var provider = getProviderByName(source); + + provider.bootstrap_track(sound, track, successCallback, failureCallback, $http, $httpParamSerializerJQLike); + + }; } }; }]); diff --git a/js/netease.js b/js/netease.js index ba28a13..f2747fe 100644 --- a/js/netease.js +++ b/js/netease.js @@ -1,348 +1,370 @@ -function ne_show_playlist(url, hm) { - var target_url = 'http://music.163.com/discover/playlist/'; +var netease = (function() { + 'use strict'; - return { - success: function(fn) { - var result = []; - hm.get(target_url).success(function(data) { - data = $.parseHTML(data); - $(data).find('.m-cvrlst li').each(function(){ - var default_playlist = { - 'cover_img_url' : '', - 'title': '', - 'list_id': '', - 'source_url': '' - }; - default_playlist.cover_img_url = $(this).find('img')[0].src; - default_playlist.title = $(this).find('div a')[0].title; - var url = $(this).find('div a')[0].href; - var list_id = getParameterByName('id',url); - default_playlist.list_id = 'neplaylist_' + list_id; - default_playlist.source_url = 'http://music.163.com/#/playlist?id=' + list_id; - result.push(default_playlist); + var ne_show_playlist = function(url, hm) { + var target_url = 'http://music.163.com/discover/playlist/'; + + return { + success: function(fn) { + var result = []; + hm.get(target_url).success(function(data) { + data = $.parseHTML(data); + $(data).find('.m-cvrlst li').each(function(){ + var default_playlist = { + 'cover_img_url' : '', + 'title': '', + 'list_id': '', + 'source_url': '' + }; + default_playlist.cover_img_url = $(this).find('img')[0].src; + default_playlist.title = $(this).find('div a')[0].title; + var url = $(this).find('div a')[0].href; + var list_id = getParameterByName('id',url); + default_playlist.list_id = 'neplaylist_' + list_id; + default_playlist.source_url = 'http://music.163.com/#/playlist?id=' + list_id; + result.push(default_playlist); + }); + return fn({"result":result}); }); - return fn({"result":result}); - }); - } - }; -} + } + }; + } -function ne_get_playlist(url, hm) { - var list_id = getParameterByName('list_id', url).split('_').pop(); - var target_url = 'http://music.163.com/playlist?id=' + list_id; - return { - success: function(fn) { - hm.get(target_url).success(function(data) { - data = $.parseHTML(data); - var dataObj = $(data); - var info = { - 'list_id': list_id, - 'cover_img_url': dataObj.find('.u-cover img').attr('src'), - 'title': dataObj.find('.tit h2').text(), - 'source_url': 'http://music.163.com/#/playlist?id=' + list_id - }; - var tracks = []; - var json_string = dataObj.find('textarea').val(); - var track_json_list = JSON.parse(json_string); - $.each(track_json_list, function(index, track_json){ - var default_track = { - 'id': '0', - 'title': '', - 'artist': '', - 'artist_id': 'neartist_0', - 'album': '', - 'album_id': 'nealbum_0', - 'source': 'netease', - 'source_url': 'http://www.xiami.com/song/0', - 'img_url': '', - 'url': '' + var ne_get_playlist = function(url, hm) { + var list_id = getParameterByName('list_id', url).split('_').pop(); + var target_url = 'http://music.163.com/playlist?id=' + list_id; + return { + success: function(fn) { + hm.get(target_url).success(function(data) { + data = $.parseHTML(data); + var dataObj = $(data); + var info = { + 'list_id': list_id, + 'cover_img_url': dataObj.find('.u-cover img').attr('src'), + 'title': dataObj.find('.tit h2').text(), + 'source_url': 'http://music.163.com/#/playlist?id=' + list_id }; - default_track.id = 'netrack_' + track_json.id; - default_track.title = track_json.name; - default_track.artist = track_json.artists[0].name; - default_track.artist_id = 'neartist_' + track_json.artists[0].id; - default_track.album = track_json.album.name; - default_track.album_id = 'nealbum_' + track_json.album.id; - default_track.source_url = 'http://music.163.com/#/song?id=' + track_json.id; - default_track.img_url = track_json.album.picUrl; - default_track.url = default_track.id; - tracks.push(default_track); + var tracks = []; + var json_string = dataObj.find('textarea').val(); + var track_json_list = JSON.parse(json_string); + $.each(track_json_list, function(index, track_json){ + var default_track = { + 'id': '0', + 'title': '', + 'artist': '', + 'artist_id': 'neartist_0', + 'album': '', + 'album_id': 'nealbum_0', + 'source': 'netease', + 'source_url': 'http://www.xiami.com/song/0', + 'img_url': '', + 'url': '' + }; + default_track.id = 'netrack_' + track_json.id; + default_track.title = track_json.name; + default_track.artist = track_json.artists[0].name; + default_track.artist_id = 'neartist_' + track_json.artists[0].id; + default_track.album = track_json.album.name; + default_track.album_id = 'nealbum_' + track_json.album.id; + default_track.source_url = 'http://music.163.com/#/song?id=' + track_json.id; + default_track.img_url = track_json.album.picUrl; + default_track.url = default_track.id; + tracks.push(default_track); + }); + return fn({"info":info,"tracks":tracks,'is_mine':'0'}); }); - return fn({"info":info,"tracks":tracks,'is_mine':'0'}); - }); + } + }; + } + + function _create_secret_key(size) { + var result = []; + var choice = '012345679abcdef'.split(''); + for (var i=0; i').html(value).text(); -} +var qq = (function() { + 'use strict'; -function qq_show_playlist(url, hm) { - var target_url = 'http://i.y.qq.com/s.plcloud/fcgi-bin/fcg_get_diss_by_tag' + - '.fcg?categoryId=10000000&sortId=1&sin=0&ein=49&' + - 'format=jsonp&g_tk=5381&loginUin=0&hostUin=0&' + - 'format=jsonp&inCharset=GB2312&outCharset=utf-8' + - '¬ice=0&platform=yqq&jsonpCallback=' + - 'MusicJsonCallback&needNewCode=0'; + function htmlDecode(value){ + return $('
').html(value).text(); + } - return { - success: function(fn) { - var result = []; - hm({ - url:target_url, - method: 'GET', - transformResponse: undefined - }).success(function(data) { - data = data.slice('MusicJsonCallback('.length, -')'.length); - data = JSON.parse(data); + var qq_show_playlist = function(url, hm) { + var target_url = 'http://i.y.qq.com/s.plcloud/fcgi-bin/fcg_get_diss_by_tag' + + '.fcg?categoryId=10000000&sortId=1&sin=0&ein=49&' + + 'format=jsonp&g_tk=5381&loginUin=0&hostUin=0&' + + 'format=jsonp&inCharset=GB2312&outCharset=utf-8' + + '¬ice=0&platform=yqq&jsonpCallback=' + + 'MusicJsonCallback&needNewCode=0'; - var playlists = []; - $.each(data.data.list, function(index, item){ - var d = { - 'cover_img_url': item.imgurl, - 'title': htmlDecode(item.dissname), - 'list_id':'qqplaylist_' + item.dissid, - 'source_url': 'http://y.qq.com/#type=taoge&id=' + item.dissid + return { + success: function(fn) { + var result = []; + hm({ + url:target_url, + method: 'GET', + transformResponse: undefined + }).success(function(data) { + data = data.slice('MusicJsonCallback('.length, -')'.length); + data = JSON.parse(data); + var playlists = []; + $.each(data.data.list, function(index, item){ + var d = { + 'cover_img_url': item.imgurl, + 'title': htmlDecode(item.dissname), + 'list_id':'qqplaylist_' + item.dissid, + 'source_url': 'http://y.qq.com/#type=taoge&id=' + item.dissid + + }; + playlists.push(d); + }); + + return fn({"result":playlists}); + }); + } + }; + } + + function qq_get_image_url(qqimgid, img_type) { + var category = ''; + if(img_type == 'artist') { + category = 'mid_singer_300' + } + if(img_type == 'album') { + category = 'mid_album_300'; + } + var s = [category, qqimgid[qqimgid.length - 2], qqimgid[qqimgid.length - 1], qqimgid].join('/'); + var url = 'http://imgcache.qq.com/music/photo/' + s + '.jpg'; + return url; + } + + function qq_convert_song(song) { + var d = { + 'id': 'qqtrack_' + song.songmid, + 'title': htmlDecode(song.songname), + 'artist': htmlDecode(song.singer[0].name), + 'artist_id': 'qqartist_' + song.singer[0].mid, + 'album': htmlDecode(song.albumname), + 'album_id': 'qqalbum_' + song.albummid, + 'img_url': qq_get_image_url(song.albummid, 'album'), + 'source': 'qq', + 'source_url': 'http://y.qq.com/#type=song&mid=' + + song.songmid + '&tpl=yqq_song_detail', + 'url': 'qqtrack_' + song.songmid + } + return d + } + + function qq_is_playable(song) { + var switch_flag = song['switch'].toString(2).split(''); + switch_flag.pop(); + switch_flag.reverse(); + // flag switch table meaning: + // ["play_lq", "play_hq", "play_sq", "down_lq", "down_hq", "down_sq", "soso", "fav", "share", "bgm", "ring", "sing", "radio", "try", "give"] + var play_flag = switch_flag[0]; + var try_flag = switch_flag[13]; + return ((play_flag == 1) || ((play_flag == 1) && (try_flag == 1))); + } + + var qq_get_playlist = function(url, hm) { + var list_id = getParameterByName('list_id', url).split('_').pop(); + + return { + success: function(fn) { + var target_url = 'http://i.y.qq.com/qzone-music/fcg-bin/fcg_ucc_getcdinfo_' + + 'byids_cp.fcg?type=1&json=1&utf8=1&onlysong=0&jsonpCallback=' + + 'jsonCallback&nosign=1&disstid=' + list_id +'&g_tk=5381&loginUin=0&hostUin=0' + + '&format=jsonp&inCharset=GB2312&outCharset=utf-8¬ice=0' + + '&platform=yqq&jsonpCallback=jsonCallback&needNewCode=0'; + hm({ + url:target_url, + method: 'GET', + transformResponse: undefined + }) + .success(function(data) { + data = data.slice('jsonCallback('.length, -')'.length); + data = JSON.parse(data); + + var info = { + 'cover_img_url': data.cdlist[0].logo, + 'title': data.cdlist[0].dissname, + 'id': 'qqplaylist_' + list_id, + 'source_url': 'http://y.qq.com/#type=taoge&id=' + list_id }; - playlists.push(d); + + var tracks = []; + $.each(data.cdlist[0].songlist, function(index, item){ + if (qq_is_playable(item)) { + var track = qq_convert_song(item); + tracks.push(track); + } + }); + return fn({"tracks":tracks, "info":info}); }); - - return fn({"result":playlists}); - }); - } - }; -} - -function qq_get_image_url(qqimgid, img_type) { - var category = ''; - if(img_type == 'artist') { - category = 'mid_singer_300' + } + }; } - if(img_type == 'album') { - category = 'mid_album_300'; + + var qq_album = function(url, hm) { + var album_id = getParameterByName('album_id', url).split('_').pop(); + + return { + success: function(fn) { + var target_url = 'http://i.y.qq.com/v8/fcg-bin/fcg_v8_album_info_cp.fcg' + + '?platform=h5page&albummid=' + album_id + '&g_tk=938407465' + + '&uin=0&format=jsonp&inCharset=utf-8&outCharset=utf-8' + + '¬ice=0&platform=h5&needNewCode=1&_=1459961045571' + + '&jsonpCallback=asonglist1459961045566'; + hm({ + url: target_url, + method: 'GET', + transformResponse: undefined + }) + .success(function(data) { + data = data.slice(' asonglist1459961045566('.length, -')'.length); + data = JSON.parse(data); + + var info = { + 'cover_img_url': qq_get_image_url(album_id, 'album'), + 'title': data.data.name, + 'id': 'qqalbum_' + album_id, + 'source_url': 'http://y.qq.com/#type=album&mid=' + album_id + }; + + var tracks = []; + $.each(data.data.list, function(index, item){ + if (qq_is_playable(item)) { + var track = qq_convert_song(item); + tracks.push(track); + } + }); + return fn({"tracks":tracks, "info":info}); + }); + } + }; } - var s = [category, qqimgid[qqimgid.length - 2], qqimgid[qqimgid.length - 1], qqimgid].join('/'); - var url = 'http://imgcache.qq.com/music/photo/' + s + '.jpg'; - return url; -} -function qq_convert_song(song) { - d = { - 'id': 'qqtrack_' + song.songmid, - 'title': htmlDecode(song.songname), - 'artist': htmlDecode(song.singer[0].name), - 'artist_id': 'qqartist_' + song.singer[0].mid, - 'album': htmlDecode(song.albumname), - 'album_id': 'qqalbum_' + song.albummid, - 'img_url': qq_get_image_url(song.albummid, 'album'), - 'source': 'qq', - 'source_url': 'http://y.qq.com/#type=song&mid=' + - song.songmid + '&tpl=yqq_song_detail', - 'url': 'qqtrack_' + song.songmid + var qq_artist = function(url, hm) { + var artist_id = getParameterByName('artist_id', url).split('_').pop(); + + return { + success: function(fn) { + var target_url = 'http://i.y.qq.com/v8/fcg-bin/fcg_v8_singer_track_cp.fcg' + + '?platform=h5page&order=listen&begin=0&num=50&singermid=' + artist_id + + '&g_tk=938407465&uin=0&format=jsonp&' + + 'inCharset=utf-8&outCharset=utf-8¬ice=0&platform=' + + 'h5&needNewCode=1&from=h5&_=1459960621777&' + + 'jsonpCallback=ssonglist1459960621772'; + hm({ + url: target_url, + method: 'GET', + transformResponse: undefined + }) + .success(function(data) { + data = data.slice(' ssonglist1459960621772('.length, -')'.length); + data = JSON.parse(data); + + var info = { + 'cover_img_url': qq_get_image_url(artist_id, 'artist'), + 'title': data.data.singer_name, + 'id': 'qqartist_' + artist_id, + 'source_url': 'http://y.qq.com/#type=singer&mid=' + artist_id + }; + + var tracks = []; + $.each(data.data.list, function(index, item){ + if (qq_is_playable(item.musicData)) { + var track = qq_convert_song(item.musicData); + tracks.push(track); + } + }); + return fn({"tracks":tracks, "info":info}); + }); + } + }; } - return d -} -function qq_get_playlist(url, hm) { - var list_id = getParameterByName('list_id', url).split('_').pop(); - - return { - success: function(fn) { - var target_url = 'http://i.y.qq.com/qzone-music/fcg-bin/fcg_ucc_getcdinfo_' + - 'byids_cp.fcg?type=1&json=1&utf8=1&onlysong=0&jsonpCallback=' + - 'jsonCallback&nosign=1&disstid=' + list_id +'&g_tk=5381&loginUin=0&hostUin=0' + - '&format=jsonp&inCharset=GB2312&outCharset=utf-8¬ice=0' + - '&platform=yqq&jsonpCallback=jsonCallback&needNewCode=0'; - hm({ - url:target_url, - method: 'GET', - transformResponse: undefined - }) - .success(function(data) { - data = data.slice('jsonCallback('.length, -')'.length); - data = JSON.parse(data); - - var info = { - 'cover_img_url': data.cdlist[0].logo, - 'title': data.cdlist[0].dissname, - 'id': 'qqplaylist_' + list_id, - 'source_url': 'http://y.qq.com/#type=taoge&id=' + list_id - }; - - var tracks = []; - $.each(data.cdlist[0].songlist, function(index, item){ - var track = qq_convert_song(item); - tracks.push(track); + var qq_search = function(url, hm, se) { + return { + success: function(fn) { + var keyword = getParameterByName('keywords', url); + var target_url = 'http://i.y.qq.com/s.music/fcgi-bin/search_for_qq_cp?' + + 'g_tk=938407465&uin=0&format=jsonp&inCharset=utf-8' + + '&outCharset=utf-8¬ice=0&platform=h5&needNewCode=1' + + '&w=' + keyword + '&zhidaqu=1&catZhida=1' + + '&t=0&flag=1&ie=utf-8&sem=1&aggr=0&perpage=20&n=20&p=1' + + '&remoteplace=txt.mqq.all&_=1459991037831&jsonpCallback=jsonp4'; + hm({ + url:target_url, + method: 'GET', + transformResponse: undefined + }) + .success(function(data) { + data = data.slice('jsonp4('.length, -')'.length); + data = JSON.parse(data); + var tracks = []; + $.each(data.data.song.list, function(index, item){ + if (qq_is_playable(item)) { + var track = qq_convert_song(item); + tracks.push(track); + } + }); + return fn({"result":tracks}); }); - return fn({"tracks":tracks, "info":info}); - }); - } - }; -} + } + }; + } -function qq_album(url, hm) { - var album_id = getParameterByName('album_id', url).split('_').pop(); + var qq_bootstrap_track = function(sound, track, success, failure, hm, se) { + var target_url ='http://base.music.qq.com/fcgi-bin/fcg_musicexpress.fcg?' + + 'json=3&guid=780782017&g_tk=938407465&loginUin=0&hostUin=0&' + + 'format=jsonp&inCharset=GB2312&outCharset=GB2312¬ice=0&' + + 'platform=yqq&jsonpCallback=jsonCallback&needNewCode=0'; - return { - success: function(fn) { - var target_url = 'http://i.y.qq.com/v8/fcg-bin/fcg_v8_album_info_cp.fcg' + - '?platform=h5page&albummid=' + album_id + '&g_tk=938407465' + - '&uin=0&format=jsonp&inCharset=utf-8&outCharset=utf-8' + - '¬ice=0&platform=h5&needNewCode=1&_=1459961045571' + - '&jsonpCallback=asonglist1459961045566'; - hm({ - url: target_url, - method: 'GET', - transformResponse: undefined - }) - .success(function(data) { - data = data.slice(' asonglist1459961045566('.length, -')'.length); - data = JSON.parse(data); + hm({ + url:target_url, + method: 'GET', + transformResponse: undefined + }) + .success(function(data) { + data = data.slice('jsonCallback('.length, -');'.length); + data = JSON.parse(data); + var token = data.key; + var url = 'http://cc.stream.qqmusic.qq.com/C200' + track.id.slice('qqtrack_'.length) + '.m4a?vkey=' + + token + '&fromtag=0&guid=780782017'; + sound.url = url; + success(); + }); + } - var info = { - 'cover_img_url': qq_get_image_url(album_id, 'album'), - 'title': data.data.name, - 'id': 'qqalbum_' + album_id, - 'source_url': 'http://y.qq.com/#type=album&mid=' + album_id - }; + function str2ab(str) { + // string to array buffer. + var buf = new ArrayBuffer(str.length); + var bufView = new Uint8Array(buf); + for (var i=0, strLen=str.length; i