adjust playlist height, make module for platform code, fix bug for qq not playable tracks
This commit is contained in:
parent
7778c07efa
commit
4f4f81c267
@ -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;
|
||||
}
|
||||
|
37
js/app.js
37
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;
|
||||
});
|
||||
};
|
||||
|
129
js/loweb.js
129
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);
|
||||
|
||||
};
|
||||
}
|
||||
};
|
||||
}]);
|
||||
|
688
js/netease.js
688
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<size; i++) {
|
||||
var index = Math.floor(Math.random() * choice.length);
|
||||
result.push(choice[index]);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
function _create_secret_key(size) {
|
||||
var result = [];
|
||||
var choice = '012345679abcdef'.split('');
|
||||
for (var i=0; i<size; i++) {
|
||||
var index = Math.floor(Math.random() * choice.length);
|
||||
result.push(choice[index]);
|
||||
return result.join('');
|
||||
}
|
||||
return result.join('');
|
||||
}
|
||||
|
||||
|
||||
function _aes_encrypt(text, sec_key) {
|
||||
pad = 16 - text.length % 16;
|
||||
for (var i=0; i<pad; i++) {
|
||||
text = text + String.fromCharCode(pad);
|
||||
}
|
||||
var key = aesjs.util.convertStringToBytes(sec_key);
|
||||
// The initialization vector, which must be 16 bytes
|
||||
var iv = aesjs.util.convertStringToBytes("0102030405060708");
|
||||
var textBytes = aesjs.util.convertStringToBytes(text);
|
||||
var aesCbc = new aesjs.ModeOfOperation.cbc(key, iv);
|
||||
var cipherArray = [];
|
||||
while(textBytes.length != 0) {
|
||||
var block = aesCbc.encrypt(textBytes.slice(0, 16));
|
||||
Array.prototype.push.apply(cipherArray,block);
|
||||
textBytes = textBytes.slice(16);
|
||||
}
|
||||
var ciphertext = '';
|
||||
for (var i=0; i<cipherArray.length; i++) {
|
||||
ciphertext = ciphertext + String.fromCharCode(cipherArray[i]);
|
||||
}
|
||||
ciphertext = btoa(ciphertext)
|
||||
return ciphertext;
|
||||
}
|
||||
|
||||
function hexify(text) {
|
||||
return text.split('').map(function(x){return x.charCodeAt(0).toString(16)}).join('');
|
||||
}
|
||||
|
||||
function zfill(num, size) {
|
||||
var s = num+"";
|
||||
while (s.length < size) s = "0" + s;
|
||||
return s;
|
||||
}
|
||||
|
||||
|
||||
function expmod( base, exp, mymod ) {
|
||||
if ( equalsInt(exp, 0) == 1) return int2bigInt(1,10);
|
||||
if ( equalsInt(mod(exp, int2bigInt(2,10) ), 0) ) {
|
||||
var newexp = dup(exp);
|
||||
rightShift_(newexp,1);
|
||||
var result = powMod(expmod( base, newexp, mymod), [2,0], mymod);
|
||||
return result;
|
||||
}
|
||||
else {
|
||||
var result = mod(mult(expmod( base, sub(exp, int2bigInt(1,10)), mymod), base), mymod);
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
function _rsa_encrypt(text, pubKey, modulus) {
|
||||
text = text.split('').reverse().join('');
|
||||
var base = str2bigInt(hexify(text), 16);
|
||||
var exp = str2bigInt(pubKey, 16);
|
||||
var mod = str2bigInt(modulus, 16);
|
||||
var bigNumber = expmod(base, exp, mod);
|
||||
var rs = bigInt2str(bigNumber, 16);
|
||||
return zfill(rs, 256).toLowerCase();
|
||||
}
|
||||
|
||||
function _encrypted_request(text) {
|
||||
var modulus = '00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b72' +
|
||||
'5152b3ab17a876aea8a5aa76d2e417629ec4ee341f56135fccf695280104e0312ecbd' +
|
||||
'a92557c93870114af6c9d05c4f7f0c3685b7a46bee255932575cce10b424d813cfe48' +
|
||||
'75d3e82047b97ddef52741d546b8e289dc6935b3ece0462db0a22b8e7';
|
||||
var nonce = '0CoJUm6Qyw8W8jud';
|
||||
var pubKey = '010001';
|
||||
text = JSON.stringify(text);
|
||||
var sec_key = _create_secret_key(16);
|
||||
var enc_text = _aes_encrypt(_aes_encrypt(text, nonce), sec_key);
|
||||
var enc_sec_key = _rsa_encrypt(sec_key, pubKey, modulus);
|
||||
var data = {
|
||||
'params': enc_text,
|
||||
'encSecKey': enc_sec_key
|
||||
};
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
function ne_bootstrap_track(sound, track, callback, hm, se) {
|
||||
var target_url = 'http://music.163.com/weapi/song/enhance/player/url?csrf_token=';
|
||||
var csrf = '';
|
||||
var song_id = track.id;
|
||||
|
||||
song_id = song_id.slice('netrack_'.length);
|
||||
var d = {
|
||||
"ids": [song_id],
|
||||
"br": 320000,
|
||||
"csrf_token": csrf
|
||||
}
|
||||
var data = _encrypted_request(d);
|
||||
|
||||
hm({
|
||||
url: target_url,
|
||||
method: 'POST',
|
||||
data: se(data),
|
||||
headers: {
|
||||
'Content-Type': 'application/x-www-form-urlencoded'
|
||||
function _aes_encrypt(text, sec_key) {
|
||||
var pad = 16 - text.length % 16;
|
||||
for (var i=0; i<pad; i++) {
|
||||
text = text + String.fromCharCode(pad);
|
||||
}
|
||||
}).success(function(data) {
|
||||
sound.url = data.data[0].url;
|
||||
callback();
|
||||
});
|
||||
}
|
||||
var key = aesjs.util.convertStringToBytes(sec_key);
|
||||
// The initialization vector, which must be 16 bytes
|
||||
var iv = aesjs.util.convertStringToBytes("0102030405060708");
|
||||
var textBytes = aesjs.util.convertStringToBytes(text);
|
||||
var aesCbc = new aesjs.ModeOfOperation.cbc(key, iv);
|
||||
var cipherArray = [];
|
||||
while(textBytes.length != 0) {
|
||||
var block = aesCbc.encrypt(textBytes.slice(0, 16));
|
||||
Array.prototype.push.apply(cipherArray,block);
|
||||
textBytes = textBytes.slice(16);
|
||||
}
|
||||
var ciphertext = '';
|
||||
for (var i=0; i<cipherArray.length; i++) {
|
||||
ciphertext = ciphertext + String.fromCharCode(cipherArray[i]);
|
||||
}
|
||||
ciphertext = btoa(ciphertext)
|
||||
return ciphertext;
|
||||
}
|
||||
|
||||
function ne_search(url, hm, se) {
|
||||
// use chrome extension to modify referer.
|
||||
var target_url = 'http://music.163.com/api/search/pc';
|
||||
var keyword = getParameterByName('keywords', url);
|
||||
var req_data = {
|
||||
's': keyword,
|
||||
'offset': 0,
|
||||
'limit': 20,
|
||||
'type': 1
|
||||
};
|
||||
return {
|
||||
success: function(fn) {
|
||||
hm({
|
||||
url: target_url,
|
||||
method: 'POST',
|
||||
data: se(req_data),
|
||||
headers: {
|
||||
'Content-Type': 'application/x-www-form-urlencoded'
|
||||
}
|
||||
}).success(function(data) {
|
||||
var tracks = [];
|
||||
$.each(data.result.songs, function(index, song_info) {
|
||||
if (song_info.status == -1) {
|
||||
return;
|
||||
function hexify(text) {
|
||||
return text.split('').map(function(x){return x.charCodeAt(0).toString(16)}).join('');
|
||||
}
|
||||
|
||||
function zfill(num, size) {
|
||||
var s = num+"";
|
||||
while (s.length < size) s = "0" + s;
|
||||
return s;
|
||||
}
|
||||
|
||||
|
||||
function expmod( base, exp, mymod ) {
|
||||
if ( equalsInt(exp, 0) == 1) return int2bigInt(1,10);
|
||||
if ( equalsInt(mod(exp, int2bigInt(2,10) ), 0) ) {
|
||||
var newexp = dup(exp);
|
||||
rightShift_(newexp,1);
|
||||
var result = powMod(expmod( base, newexp, mymod), [2,0], mymod);
|
||||
return result;
|
||||
}
|
||||
else {
|
||||
var result = mod(mult(expmod( base, sub(exp, int2bigInt(1,10)), mymod), base), mymod);
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
function _rsa_encrypt(text, pubKey, modulus) {
|
||||
text = text.split('').reverse().join('');
|
||||
var base = str2bigInt(hexify(text), 16);
|
||||
var exp = str2bigInt(pubKey, 16);
|
||||
var mod = str2bigInt(modulus, 16);
|
||||
var bigNumber = expmod(base, exp, mod);
|
||||
var rs = bigInt2str(bigNumber, 16);
|
||||
return zfill(rs, 256).toLowerCase();
|
||||
}
|
||||
|
||||
function _encrypted_request(text) {
|
||||
var modulus = '00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b72' +
|
||||
'5152b3ab17a876aea8a5aa76d2e417629ec4ee341f56135fccf695280104e0312ecbd' +
|
||||
'a92557c93870114af6c9d05c4f7f0c3685b7a46bee255932575cce10b424d813cfe48' +
|
||||
'75d3e82047b97ddef52741d546b8e289dc6935b3ece0462db0a22b8e7';
|
||||
var nonce = '0CoJUm6Qyw8W8jud';
|
||||
var pubKey = '010001';
|
||||
text = JSON.stringify(text);
|
||||
var sec_key = _create_secret_key(16);
|
||||
var enc_text = _aes_encrypt(_aes_encrypt(text, nonce), sec_key);
|
||||
var enc_sec_key = _rsa_encrypt(sec_key, pubKey, modulus);
|
||||
var data = {
|
||||
'params': enc_text,
|
||||
'encSecKey': enc_sec_key
|
||||
};
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
var ne_bootstrap_track = function(sound, track, success, failure, hm, se) {
|
||||
var target_url = 'http://music.163.com/weapi/song/enhance/player/url?csrf_token=';
|
||||
var csrf = '';
|
||||
var song_id = track.id;
|
||||
|
||||
song_id = song_id.slice('netrack_'.length);
|
||||
var d = {
|
||||
"ids": [song_id],
|
||||
"br": 320000,
|
||||
"csrf_token": csrf
|
||||
}
|
||||
var data = _encrypted_request(d);
|
||||
|
||||
hm({
|
||||
url: target_url,
|
||||
method: 'POST',
|
||||
data: se(data),
|
||||
headers: {
|
||||
'Content-Type': 'application/x-www-form-urlencoded'
|
||||
}
|
||||
}).success(function(data) {
|
||||
var url = data.data[0].url;
|
||||
if (url != null) {
|
||||
sound.url = url;
|
||||
success();
|
||||
}
|
||||
else {
|
||||
failure();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
var ne_search = function(url, hm, se) {
|
||||
// use chrome extension to modify referer.
|
||||
var target_url = 'http://music.163.com/api/search/pc';
|
||||
var keyword = getParameterByName('keywords', url);
|
||||
var req_data = {
|
||||
's': keyword,
|
||||
'offset': 0,
|
||||
'limit': 20,
|
||||
'type': 1
|
||||
};
|
||||
return {
|
||||
success: function(fn) {
|
||||
hm({
|
||||
url: target_url,
|
||||
method: 'POST',
|
||||
data: se(req_data),
|
||||
headers: {
|
||||
'Content-Type': 'application/x-www-form-urlencoded'
|
||||
}
|
||||
var default_track = {
|
||||
'id': 'netrack_' + song_info.id,
|
||||
'title': song_info.name,
|
||||
'artist': song_info.artists[0].name,
|
||||
'artist_id': 'neartist_' + song_info.artists[0].id,
|
||||
'album': song_info.album.name,
|
||||
'album_id': 'nealbum_' + song_info.album.id,
|
||||
'source': 'netease',
|
||||
'source_url': 'http://music.163.com/#/song?id=' + song_info.id,
|
||||
'img_url': song_info.album.picUrl,
|
||||
'url': 'netrack_' + song_info.id
|
||||
};
|
||||
tracks.push(default_track);
|
||||
}).success(function(data) {
|
||||
var tracks = [];
|
||||
$.each(data.result.songs, function(index, song_info) {
|
||||
if (song_info.status == -1) {
|
||||
return;
|
||||
}
|
||||
var default_track = {
|
||||
'id': 'netrack_' + song_info.id,
|
||||
'title': song_info.name,
|
||||
'artist': song_info.artists[0].name,
|
||||
'artist_id': 'neartist_' + song_info.artists[0].id,
|
||||
'album': song_info.album.name,
|
||||
'album_id': 'nealbum_' + song_info.album.id,
|
||||
'source': 'netease',
|
||||
'source_url': 'http://music.163.com/#/song?id=' + song_info.id,
|
||||
'img_url': song_info.album.picUrl,
|
||||
'url': 'netrack_' + song_info.id
|
||||
};
|
||||
tracks.push(default_track);
|
||||
});
|
||||
return fn({"result":tracks});
|
||||
});
|
||||
return fn({"result":tracks});
|
||||
});
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
function ne_album(url, hm, se) {
|
||||
var album_id = getParameterByName('album_id', url).split('_').pop();
|
||||
// use chrome extension to modify referer.
|
||||
var target_url = 'http://music.163.com/api/album/' + album_id;
|
||||
|
||||
return {
|
||||
success: function(fn) {
|
||||
hm({
|
||||
url: target_url,
|
||||
method: 'GET'
|
||||
}).success(function(data) {
|
||||
var info = {
|
||||
'cover_img_url': data.album.picUrl,
|
||||
'title': data.album.name,
|
||||
'id': 'nealbum_' + data.album.id,
|
||||
'source_url': 'http://music.163.com/#/album?id=' + data.album.id
|
||||
};
|
||||
|
||||
var tracks = [];
|
||||
$.each(data.album.songs, function(index, song_info) {
|
||||
var default_track = {
|
||||
'id': 'netrack_' + song_info.id,
|
||||
'title': song_info.name,
|
||||
'artist': song_info.artists[0].name,
|
||||
'artist_id': 'neartist_' + song_info.artists[0].id,
|
||||
'album': song_info.album.name,
|
||||
'album_id': 'nealbum_' + song_info.album.id,
|
||||
'source': 'netease',
|
||||
'source_url': 'http://music.163.com/#/song?id=' + song_info.id,
|
||||
'img_url': song_info.album.picUrl,
|
||||
'url': 'netrack_' + song_info.id
|
||||
};
|
||||
tracks.push(default_track);
|
||||
});
|
||||
return fn({"tracks":tracks, "info":info, "is_mine": 0});
|
||||
});
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
function ne_artist(url, hm, se) {
|
||||
var artist_id = getParameterByName('artist_id', url).split('_').pop();
|
||||
// use chrome extension to modify referer.
|
||||
var target_url = 'http://music.163.com/api/artist/' + artist_id;
|
||||
|
||||
return {
|
||||
success: function(fn) {
|
||||
hm({
|
||||
url: target_url,
|
||||
method: 'GET'
|
||||
}).success(function(data) {
|
||||
var info = {
|
||||
'cover_img_url': data.artist.picUrl,
|
||||
'title': data.artist.name,
|
||||
'id': 'neartist_' + data.artist.id,
|
||||
'source_url': 'http://music.163.com/#/artist?id=' + data.artist.id
|
||||
};
|
||||
|
||||
var tracks = [];
|
||||
$.each(data.hotSongs, function(index, song_info) {
|
||||
var default_track = {
|
||||
'id': 'netrack_' + song_info.id,
|
||||
'title': song_info.name,
|
||||
'artist': song_info.artists[0].name,
|
||||
'artist_id': 'neartist_' + song_info.artists[0].id,
|
||||
'album': song_info.album.name,
|
||||
'album_id': 'nealbum_' + song_info.album.id,
|
||||
'source': 'netease',
|
||||
'source_url': 'http://music.163.com/#/song?id=' + song_info.id,
|
||||
'img_url': song_info.album.picUrl,
|
||||
'url': 'netrack_' + song_info.id
|
||||
};
|
||||
tracks.push(default_track);
|
||||
});
|
||||
return fn({"tracks":tracks, "info":info, "is_mine": 0});
|
||||
});
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
function ne_lyric(url, hm, se) {
|
||||
var track_id = getParameterByName('track_id', url).split('_').pop();
|
||||
// use chrome extension to modify referer.
|
||||
var target_url = 'http://music.163.com/weapi/song/lyric?csrf_token=';
|
||||
var csrf = '';
|
||||
var d = {
|
||||
'id': track_id,
|
||||
'lv': -1,
|
||||
'tv': -1,
|
||||
'csrf_token': csrf
|
||||
}
|
||||
};
|
||||
}
|
||||
var data = _encrypted_request(d);
|
||||
return {
|
||||
success: function(fn) {
|
||||
hm({
|
||||
url: target_url,
|
||||
method: 'POST',
|
||||
data: se(data),
|
||||
headers: {
|
||||
'Content-Type': 'application/x-www-form-urlencoded'
|
||||
}
|
||||
}).success(function(data) {
|
||||
var lrc = '';
|
||||
if (data.lrc != null) {
|
||||
lrc = data.lrc.lyric;
|
||||
}
|
||||
return fn({"lyric":lrc});
|
||||
});
|
||||
|
||||
|
||||
var ne_album = function(url, hm, se) {
|
||||
var album_id = getParameterByName('album_id', url).split('_').pop();
|
||||
// use chrome extension to modify referer.
|
||||
var target_url = 'http://music.163.com/api/album/' + album_id;
|
||||
|
||||
return {
|
||||
success: function(fn) {
|
||||
hm({
|
||||
url: target_url,
|
||||
method: 'GET'
|
||||
}).success(function(data) {
|
||||
var info = {
|
||||
'cover_img_url': data.album.picUrl,
|
||||
'title': data.album.name,
|
||||
'id': 'nealbum_' + data.album.id,
|
||||
'source_url': 'http://music.163.com/#/album?id=' + data.album.id
|
||||
};
|
||||
|
||||
var tracks = [];
|
||||
$.each(data.album.songs, function(index, song_info) {
|
||||
var default_track = {
|
||||
'id': 'netrack_' + song_info.id,
|
||||
'title': song_info.name,
|
||||
'artist': song_info.artists[0].name,
|
||||
'artist_id': 'neartist_' + song_info.artists[0].id,
|
||||
'album': song_info.album.name,
|
||||
'album_id': 'nealbum_' + song_info.album.id,
|
||||
'source': 'netease',
|
||||
'source_url': 'http://music.163.com/#/song?id=' + song_info.id,
|
||||
'img_url': song_info.album.picUrl,
|
||||
'url': 'netrack_' + song_info.id
|
||||
};
|
||||
tracks.push(default_track);
|
||||
});
|
||||
return fn({"tracks":tracks, "info":info, "is_mine": 0});
|
||||
});
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
var ne_artist = function(url, hm, se) {
|
||||
var artist_id = getParameterByName('artist_id', url).split('_').pop();
|
||||
// use chrome extension to modify referer.
|
||||
var target_url = 'http://music.163.com/api/artist/' + artist_id;
|
||||
|
||||
return {
|
||||
success: function(fn) {
|
||||
hm({
|
||||
url: target_url,
|
||||
method: 'GET'
|
||||
}).success(function(data) {
|
||||
var info = {
|
||||
'cover_img_url': data.artist.picUrl,
|
||||
'title': data.artist.name,
|
||||
'id': 'neartist_' + data.artist.id,
|
||||
'source_url': 'http://music.163.com/#/artist?id=' + data.artist.id
|
||||
};
|
||||
|
||||
var tracks = [];
|
||||
$.each(data.hotSongs, function(index, song_info) {
|
||||
var default_track = {
|
||||
'id': 'netrack_' + song_info.id,
|
||||
'title': song_info.name,
|
||||
'artist': song_info.artists[0].name,
|
||||
'artist_id': 'neartist_' + song_info.artists[0].id,
|
||||
'album': song_info.album.name,
|
||||
'album_id': 'nealbum_' + song_info.album.id,
|
||||
'source': 'netease',
|
||||
'source_url': 'http://music.163.com/#/song?id=' + song_info.id,
|
||||
'img_url': song_info.album.picUrl,
|
||||
'url': 'netrack_' + song_info.id
|
||||
};
|
||||
tracks.push(default_track);
|
||||
});
|
||||
return fn({"tracks":tracks, "info":info, "is_mine": 0});
|
||||
});
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
var ne_lyric = function(url, hm, se) {
|
||||
var track_id = getParameterByName('track_id', url).split('_').pop();
|
||||
// use chrome extension to modify referer.
|
||||
var target_url = 'http://music.163.com/weapi/song/lyric?csrf_token=';
|
||||
var csrf = '';
|
||||
var d = {
|
||||
'id': track_id,
|
||||
'lv': -1,
|
||||
'tv': -1,
|
||||
'csrf_token': csrf
|
||||
}
|
||||
};
|
||||
}
|
||||
var data = _encrypted_request(d);
|
||||
return {
|
||||
success: function(fn) {
|
||||
hm({
|
||||
url: target_url,
|
||||
method: 'POST',
|
||||
data: se(data),
|
||||
headers: {
|
||||
'Content-Type': 'application/x-www-form-urlencoded'
|
||||
}
|
||||
}).success(function(data) {
|
||||
var lrc = '';
|
||||
if (data.lrc != null) {
|
||||
lrc = data.lrc.lyric;
|
||||
}
|
||||
return fn({"lyric":lrc});
|
||||
});
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
return {
|
||||
show_playlist: ne_show_playlist,
|
||||
get_playlist: ne_get_playlist,
|
||||
bootstrap_track: ne_bootstrap_track,
|
||||
search: ne_search,
|
||||
album: ne_album,
|
||||
artist: ne_artist,
|
||||
lyric: ne_lyric,
|
||||
};
|
||||
|
||||
})();
|
||||
|
||||
|
536
js/qq.js
536
js/qq.js
@ -1,271 +1,305 @@
|
||||
function htmlDecode(value){
|
||||
return $('<div/>').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 $('<div/>').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<strLen; i++) {
|
||||
bufView[i] = str.charCodeAt(i);
|
||||
}
|
||||
return buf;
|
||||
}
|
||||
|
||||
var tracks = [];
|
||||
$.each(data.data.list, function(index, item){
|
||||
var track = qq_convert_song(item);
|
||||
tracks.push(track);
|
||||
var qq_lyric = function(url, hm, se) {
|
||||
var track_id = getParameterByName('track_id', url).split('_').pop();
|
||||
// use chrome extension to modify referer.
|
||||
var target_url = 'http://i.y.qq.com/lyric/fcgi-bin/fcg_query_lyric.fcg?' +
|
||||
'songmid=' + track_id +
|
||||
'&loginUin=0&hostUin=0&format=jsonp&inCharset=GB2312' +
|
||||
'&outCharset=utf-8¬ice=0&platform=yqq&jsonpCallback=MusicJsonCallback&needNewCode=0';
|
||||
return {
|
||||
success: function(fn) {
|
||||
hm({
|
||||
url:target_url,
|
||||
method: 'GET',
|
||||
transformResponse: undefined
|
||||
}).success(function(data) {
|
||||
data = data.slice('MusicJsonCallback('.length, -')'.length);
|
||||
data = JSON.parse(data);
|
||||
var lrc = '';
|
||||
if (data.lyric != null) {
|
||||
var td = new TextDecoder('utf8');
|
||||
lrc = td.decode(str2ab(atob(data.lyric)));
|
||||
}
|
||||
return fn({"lyric":lrc});
|
||||
});
|
||||
return fn({"tracks":tracks, "info":info});
|
||||
});
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
function qq_artist(url, hm) {
|
||||
var artist_id = getParameterByName('artist_id', url).split('_').pop();
|
||||
return {
|
||||
show_playlist: qq_show_playlist,
|
||||
get_playlist: qq_get_playlist,
|
||||
bootstrap_track: qq_bootstrap_track,
|
||||
search: qq_search,
|
||||
album: qq_album,
|
||||
artist: qq_artist,
|
||||
lyric: qq_lyric,
|
||||
};
|
||||
|
||||
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){
|
||||
var track = qq_convert_song(item.musicData);
|
||||
tracks.push(track);
|
||||
});
|
||||
return fn({"tracks":tracks, "info":info});
|
||||
});
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
function qq_search(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){
|
||||
var track = qq_convert_song(item);
|
||||
tracks.push(track);
|
||||
});
|
||||
return fn({"result":tracks});
|
||||
});
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
function qq_bootstrap_track(sound, track, callback, 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';
|
||||
|
||||
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;
|
||||
callback();
|
||||
});
|
||||
}
|
||||
|
||||
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<strLen; i++) {
|
||||
bufView[i] = str.charCodeAt(i);
|
||||
}
|
||||
return buf;
|
||||
}
|
||||
|
||||
function qq_lyric(url, hm, se) {
|
||||
var track_id = getParameterByName('track_id', url).split('_').pop();
|
||||
// use chrome extension to modify referer.
|
||||
var target_url = 'http://i.y.qq.com/lyric/fcgi-bin/fcg_query_lyric.fcg?' +
|
||||
'songmid=' + track_id +
|
||||
'&loginUin=0&hostUin=0&format=jsonp&inCharset=GB2312' +
|
||||
'&outCharset=utf-8¬ice=0&platform=yqq&jsonpCallback=MusicJsonCallback&needNewCode=0';
|
||||
return {
|
||||
success: function(fn) {
|
||||
hm({
|
||||
url:target_url,
|
||||
method: 'GET',
|
||||
transformResponse: undefined
|
||||
}).success(function(data) {
|
||||
data = data.slice('MusicJsonCallback('.length, -')'.length);
|
||||
data = JSON.parse(data);
|
||||
var lrc = '';
|
||||
if (data.lyric != null) {
|
||||
var td = new TextDecoder('utf8');
|
||||
lrc = td.decode(str2ab(atob(data.lyric)));
|
||||
}
|
||||
return fn({"lyric":lrc});
|
||||
});
|
||||
}
|
||||
};
|
||||
}
|
||||
})();
|
||||
|
||||
|
447
js/xiami.js
447
js/xiami.js
@ -1,215 +1,163 @@
|
||||
function caesar(location){
|
||||
var num = location[0];
|
||||
var avg_len = Math.floor(location.slice(1).length / num);
|
||||
var remainder = location.slice(1).length % num;
|
||||
var xiami = (function() {
|
||||
'use strict';
|
||||
function caesar(location){
|
||||
var num = location[0];
|
||||
var avg_len = Math.floor(location.slice(1).length / num);
|
||||
var remainder = location.slice(1).length % num;
|
||||
|
||||
var result = [];
|
||||
for (var i=0; i<remainder; i++) {
|
||||
var line = location.slice(i * (avg_len + 1) + 1, (i + 1) * (avg_len + 1) + 1);
|
||||
result.push(line);
|
||||
}
|
||||
|
||||
for (var i=0; i<num-remainder; i++) {
|
||||
var line = location.slice((avg_len + 1) * remainder).slice(i * avg_len + 1, (i + 1) * avg_len + 1);
|
||||
result.push(line);
|
||||
}
|
||||
|
||||
var s = [];
|
||||
for (var i=0; i< avg_len; i++) {
|
||||
for (var j=0; j<num; j++){
|
||||
s.push(result[j][i]);
|
||||
var result = [];
|
||||
for (var i=0; i<remainder; i++) {
|
||||
var line = location.slice(i * (avg_len + 1) + 1, (i + 1) * (avg_len + 1) + 1);
|
||||
result.push(line);
|
||||
}
|
||||
|
||||
for (var i=0; i<num-remainder; i++) {
|
||||
var line = location.slice((avg_len + 1) * remainder).slice(i * avg_len + 1, (i + 1) * avg_len + 1);
|
||||
result.push(line);
|
||||
}
|
||||
|
||||
var s = [];
|
||||
for (var i=0; i< avg_len; i++) {
|
||||
for (var j=0; j<num; j++){
|
||||
s.push(result[j][i]);
|
||||
}
|
||||
}
|
||||
|
||||
for (var i=0; i<remainder; i++) {
|
||||
s.push(result[i].slice(-1));
|
||||
}
|
||||
|
||||
return unescape(s.join('')).replace(/\^/g, '0');
|
||||
}
|
||||
|
||||
for (var i=0; i<remainder; i++) {
|
||||
s.push(result[i].slice(-1));
|
||||
function xm_retina_url(s){
|
||||
return s.slice(0, -6) + s.slice(-4);
|
||||
}
|
||||
|
||||
return unescape(s.join('')).replace(/\^/g, '0');
|
||||
}
|
||||
|
||||
function xm_retina_url(s){
|
||||
return s.slice(0, -6) + s.slice(-4);
|
||||
}
|
||||
var xm_show_playlist = function(url, hm) {
|
||||
var target_url = 'http://www.xiami.com/collect/recommend';
|
||||
|
||||
function xm_show_playlist(url, hm) {
|
||||
var target_url = 'http://www.xiami.com/collect/recommend';
|
||||
return {
|
||||
success: function(fn) {
|
||||
var result = [];
|
||||
hm.get(target_url).success(function(data) {
|
||||
data = $.parseHTML(data);
|
||||
$(data).find('.block_list ul 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('h3 a')[0].title;
|
||||
var xiami_url = $(this).find('h3 a')[0].href;
|
||||
var list_id = xiami_url.split('?')[0].split('/').pop()
|
||||
default_playlist.list_id = 'xmplaylist_' + list_id;
|
||||
default_playlist.source_url = 'http://www.xiami.com/collect/' + list_id;
|
||||
result.push(default_playlist);
|
||||
});
|
||||
return fn({"result":result});
|
||||
});
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
return {
|
||||
success: function(fn) {
|
||||
var result = [];
|
||||
hm.get(target_url).success(function(data) {
|
||||
data = $.parseHTML(data);
|
||||
$(data).find('.block_list ul li').each(function(){
|
||||
var default_playlist = {
|
||||
'cover_img_url' : '',
|
||||
'title': '',
|
||||
'list_id': '',
|
||||
'source_url': ''
|
||||
var xm_get_playlist = function(url, hm) {
|
||||
var list_id = getParameterByName('list_id', url).split('_').pop();
|
||||
|
||||
return {
|
||||
success: function(fn) {
|
||||
var target_url = 'http://api.xiami.com/web?v=2.0&app_key=1&id=' + list_id +
|
||||
'&callback=jsonp122&r=collect/detail';
|
||||
hm({
|
||||
url:target_url,
|
||||
method: 'GET',
|
||||
transformResponse: undefined
|
||||
})
|
||||
.success(function(data) {
|
||||
data = data.slice('jsonp122('.length, -')'.length);
|
||||
data = JSON.parse(data);
|
||||
|
||||
var info = {
|
||||
'cover_img_url': xm_retina_url(data.data.logo),
|
||||
'title': data.data.collect_name,
|
||||
'id': 'xmplaylist_' + list_id,
|
||||
'source_url': 'http://www.xiami.com/collect/' + list_id
|
||||
};
|
||||
default_playlist.cover_img_url = $(this).find('img')[0].src;
|
||||
default_playlist.title = $(this).find('h3 a')[0].title;
|
||||
var xiami_url = $(this).find('h3 a')[0].href;
|
||||
var list_id = xiami_url.split('?')[0].split('/').pop()
|
||||
default_playlist.list_id = 'xmplaylist_' + list_id;
|
||||
default_playlist.source_url = 'http://www.xiami.com/collect/' + list_id;
|
||||
result.push(default_playlist);
|
||||
|
||||
var tracks = [];
|
||||
$.each(data.data.songs, function(index, item){
|
||||
var track = xm_convert_song(item, 'artist_name');
|
||||
tracks.push(track);
|
||||
});
|
||||
return fn({"tracks":tracks, "info":info});
|
||||
});
|
||||
return fn({"result":result});
|
||||
});
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
function xm_get_playlist(url, hm) {
|
||||
var list_id = getParameterByName('list_id', url).split('_').pop();
|
||||
var xm_bootstrap_track = function(sound, track, success, failure, hm, se) {
|
||||
var target_url = 'http://www.xiami.com/song/playlist/id/' + track.id.slice('xmtrack_'.length) +
|
||||
'/object_name/default/object_id/0/cat/json';
|
||||
hm.get(target_url).success(function(data) {
|
||||
var location = data.data.trackList[0].location;
|
||||
sound.url = caesar(location);
|
||||
track.img_url = data.data.trackList[0].pic;
|
||||
track.album = data.data.trackList[0].album_name;
|
||||
track.album_id = 'xmalbum_' + data.data.trackList[0].album_id;
|
||||
track.lyric_url = data.data.trackList[0].lyric_url;
|
||||
success();
|
||||
});
|
||||
}
|
||||
|
||||
return {
|
||||
success: function(fn) {
|
||||
var target_url = 'http://api.xiami.com/web?v=2.0&app_key=1&id=' + list_id +
|
||||
'&callback=jsonp122&r=collect/detail';
|
||||
hm({
|
||||
url:target_url,
|
||||
method: 'GET',
|
||||
transformResponse: undefined
|
||||
})
|
||||
.success(function(data) {
|
||||
data = data.slice('jsonp122('.length, -')'.length);
|
||||
data = JSON.parse(data);
|
||||
function xm_convert_song(song_info, artist_field_name) {
|
||||
var track = {
|
||||
'id': 'xmtrack_' + song_info.song_id,
|
||||
'title': song_info.song_name,
|
||||
'artist': song_info[artist_field_name],
|
||||
'artist_id': 'xmartist_' + song_info.artist_id,
|
||||
'album': song_info.album_name,
|
||||
'album_id': 'xmalbum_' + song_info.album_id,
|
||||
'source': 'xiami',
|
||||
'source_url': 'http://www.xiami.com/song/' + song_info.song_id,
|
||||
'img_url': song_info.album_logo,
|
||||
'url': 'xmtrack_' + song_info.song_id,
|
||||
'lyric_url': song_info.lyric_file
|
||||
};
|
||||
return track;
|
||||
}
|
||||
|
||||
var info = {
|
||||
'cover_img_url': xm_retina_url(data.data.logo),
|
||||
'title': data.data.collect_name,
|
||||
'id': 'xmplaylist_' + list_id,
|
||||
'source_url': 'http://www.xiami.com/collect/' + list_id
|
||||
};
|
||||
|
||||
var tracks = [];
|
||||
$.each(data.data.songs, function(index, item){
|
||||
var track = xm_convert_song(item, 'artist_name');
|
||||
tracks.push(track);
|
||||
var xm_search = function(url, hm, se) {
|
||||
return {
|
||||
success: function(fn) {
|
||||
var keyword = getParameterByName('keywords', url);
|
||||
var target_url = 'http://api.xiami.com/web?v=2.0&app_key=1&key=' + keyword + '&page=1&limit=50&callback=jsonp154&r=search/songs';
|
||||
hm({
|
||||
url:target_url,
|
||||
method: 'GET',
|
||||
transformResponse: undefined
|
||||
})
|
||||
.success(function(data) {
|
||||
data = data.slice('jsonp154('.length, -')'.length);
|
||||
data = JSON.parse(data);
|
||||
var tracks = [];
|
||||
$.each(data.data.songs, function(index, item){
|
||||
var track = xm_convert_song(item, 'artist_name');
|
||||
tracks.push(track);
|
||||
});
|
||||
return fn({"result":tracks});
|
||||
});
|
||||
return fn({"tracks":tracks, "info":info});
|
||||
});
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
function xm_bootstrap_track(sound, track, callback, hm, se) {
|
||||
var target_url = 'http://www.xiami.com/song/playlist/id/' + track.id.slice('xmtrack_'.length) +
|
||||
'/object_name/default/object_id/0/cat/json';
|
||||
hm.get(target_url).success(function(data) {
|
||||
var location = data.data.trackList[0].location;
|
||||
sound.url = caesar(location);
|
||||
track.img_url = data.data.trackList[0].pic;
|
||||
track.album = data.data.trackList[0].album_name;
|
||||
track.album_id = 'xmalbum_' + data.data.trackList[0].album_id;
|
||||
track.lyric_url = data.data.trackList[0].lyric_url;
|
||||
callback();
|
||||
});
|
||||
}
|
||||
|
||||
function xm_convert_song(song_info, artist_field_name) {
|
||||
var track = {
|
||||
'id': 'xmtrack_' + song_info.song_id,
|
||||
'title': song_info.song_name,
|
||||
'artist': song_info[artist_field_name],
|
||||
'artist_id': 'xmartist_' + song_info.artist_id,
|
||||
'album': song_info.album_name,
|
||||
'album_id': 'xmalbum_' + song_info.album_id,
|
||||
'source': 'xiami',
|
||||
'source_url': 'http://www.xiami.com/song/' + song_info.song_id,
|
||||
'img_url': song_info.album_logo,
|
||||
'url': 'xmtrack_' + song_info.song_id,
|
||||
'lyric_url': song_info.lyric_file
|
||||
};
|
||||
return track;
|
||||
}
|
||||
|
||||
function xm_search(url, hm, se) {
|
||||
return {
|
||||
success: function(fn) {
|
||||
var keyword = getParameterByName('keywords', url);
|
||||
var target_url = 'http://api.xiami.com/web?v=2.0&app_key=1&key=' + keyword + '&page=1&limit=50&callback=jsonp154&r=search/songs';
|
||||
hm({
|
||||
url:target_url,
|
||||
method: 'GET',
|
||||
transformResponse: undefined
|
||||
})
|
||||
.success(function(data) {
|
||||
data = data.slice('jsonp154('.length, -')'.length);
|
||||
data = JSON.parse(data);
|
||||
var tracks = [];
|
||||
$.each(data.data.songs, function(index, item){
|
||||
var track = xm_convert_song(item, 'artist_name');
|
||||
tracks.push(track);
|
||||
});
|
||||
return fn({"result":tracks});
|
||||
});
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
function xm_album(url, hm, se) {
|
||||
return {
|
||||
success: function(fn) {
|
||||
var album_id = getParameterByName('album_id', url).split('_').pop();
|
||||
var target_url = 'http://api.xiami.com/web?v=2.0&app_key=1&id=' + album_id +
|
||||
'&page=1&limit=20&callback=jsonp217&r=album/detail';
|
||||
hm({
|
||||
url:target_url,
|
||||
method: 'GET',
|
||||
transformResponse: undefined
|
||||
})
|
||||
.success(function(data) {
|
||||
data = data.slice('jsonp217('.length, -')'.length);
|
||||
data = JSON.parse(data);
|
||||
|
||||
var info = {
|
||||
'cover_img_url': xm_retina_url(data.data.album_logo),
|
||||
'title': data.data.album_name,
|
||||
'id': 'xmalbum_' + data.data.album_id,
|
||||
'source_url': 'http://www.xiami.com/album/' + data.data.album_id
|
||||
};
|
||||
|
||||
var tracks = [];
|
||||
$.each(data.data.songs, function(index, item){
|
||||
var track = xm_convert_song(item, 'singers');
|
||||
tracks.push(track);
|
||||
});
|
||||
return fn({"tracks":tracks,"info": info});
|
||||
});
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
function xm_artist(url, hm, se) {
|
||||
return {
|
||||
success: function(fn) {
|
||||
var artist_id = getParameterByName('artist_id', url).split('_').pop();
|
||||
|
||||
var target_url = 'http://api.xiami.com/web?v=2.0&app_key=1&id=' + artist_id +
|
||||
'&page=1&limit=20&_ksTS=1459931285956_216' +
|
||||
'&callback=jsonp217&r=artist/detail';
|
||||
|
||||
hm({
|
||||
url:target_url,
|
||||
method: 'GET',
|
||||
transformResponse: undefined
|
||||
})
|
||||
.success(function(data) {
|
||||
data = data.slice('jsonp217('.length, -')'.length);
|
||||
data = JSON.parse(data);
|
||||
|
||||
var info = {
|
||||
'cover_img_url': xm_retina_url(data.data.logo),
|
||||
'title': data.data.artist_name,
|
||||
'id': 'xmartist_' + artist_id,
|
||||
'source_url': 'http://www.xiami.com/artist/' + artist_id
|
||||
};
|
||||
|
||||
target_url = 'http://api.xiami.com/web?v=2.0&app_key=1&id=' + artist_id +
|
||||
'&page=1&limit=20&callback=jsonp217&r=artist/hot-songs'
|
||||
var xm_album = function(url, hm, se) {
|
||||
return {
|
||||
success: function(fn) {
|
||||
var album_id = getParameterByName('album_id', url).split('_').pop();
|
||||
var target_url = 'http://api.xiami.com/web?v=2.0&app_key=1&id=' + album_id +
|
||||
'&page=1&limit=20&callback=jsonp217&r=album/detail';
|
||||
hm({
|
||||
url:target_url,
|
||||
method: 'GET',
|
||||
@ -219,31 +167,96 @@ function xm_artist(url, hm, se) {
|
||||
data = data.slice('jsonp217('.length, -')'.length);
|
||||
data = JSON.parse(data);
|
||||
|
||||
var info = {
|
||||
'cover_img_url': xm_retina_url(data.data.album_logo),
|
||||
'title': data.data.album_name,
|
||||
'id': 'xmalbum_' + data.data.album_id,
|
||||
'source_url': 'http://www.xiami.com/album/' + data.data.album_id
|
||||
};
|
||||
|
||||
var tracks = [];
|
||||
$.each(data.data, function(index, item){
|
||||
$.each(data.data.songs, function(index, item){
|
||||
var track = xm_convert_song(item, 'singers');
|
||||
tracks.push(track);
|
||||
});
|
||||
return fn({"tracks":tracks,"info": info});
|
||||
});
|
||||
});
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
function xm_lyric(url, hm, se) {
|
||||
var track_id = getParameterByName('track_id', url).split('_').pop();
|
||||
var lyric_url = getParameterByName('lyric_url', url);
|
||||
return {
|
||||
success: function(fn) {
|
||||
hm({
|
||||
url: lyric_url,
|
||||
method: 'GET',
|
||||
transformResponse: undefined
|
||||
}).success(function(data) {
|
||||
return fn({"lyric":data});
|
||||
});
|
||||
}
|
||||
};
|
||||
}
|
||||
var xm_artist = function (url, hm, se) {
|
||||
return {
|
||||
success: function(fn) {
|
||||
var artist_id = getParameterByName('artist_id', url).split('_').pop();
|
||||
|
||||
var target_url = 'http://api.xiami.com/web?v=2.0&app_key=1&id=' + artist_id +
|
||||
'&page=1&limit=20&_ksTS=1459931285956_216' +
|
||||
'&callback=jsonp217&r=artist/detail';
|
||||
|
||||
hm({
|
||||
url:target_url,
|
||||
method: 'GET',
|
||||
transformResponse: undefined
|
||||
})
|
||||
.success(function(data) {
|
||||
data = data.slice('jsonp217('.length, -')'.length);
|
||||
data = JSON.parse(data);
|
||||
|
||||
var info = {
|
||||
'cover_img_url': xm_retina_url(data.data.logo),
|
||||
'title': data.data.artist_name,
|
||||
'id': 'xmartist_' + artist_id,
|
||||
'source_url': 'http://www.xiami.com/artist/' + artist_id
|
||||
};
|
||||
|
||||
target_url = 'http://api.xiami.com/web?v=2.0&app_key=1&id=' + artist_id +
|
||||
'&page=1&limit=20&callback=jsonp217&r=artist/hot-songs'
|
||||
hm({
|
||||
url:target_url,
|
||||
method: 'GET',
|
||||
transformResponse: undefined
|
||||
})
|
||||
.success(function(data) {
|
||||
data = data.slice('jsonp217('.length, -')'.length);
|
||||
data = JSON.parse(data);
|
||||
|
||||
var tracks = [];
|
||||
$.each(data.data, function(index, item){
|
||||
var track = xm_convert_song(item, 'singers');
|
||||
tracks.push(track);
|
||||
});
|
||||
return fn({"tracks":tracks,"info": info});
|
||||
});
|
||||
});
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
var xm_lyric = function (url, hm, se) {
|
||||
var track_id = getParameterByName('track_id', url).split('_').pop();
|
||||
var lyric_url = getParameterByName('lyric_url', url);
|
||||
return {
|
||||
success: function(fn) {
|
||||
hm({
|
||||
url: lyric_url,
|
||||
method: 'GET',
|
||||
transformResponse: undefined
|
||||
}).success(function(data) {
|
||||
return fn({"lyric":data});
|
||||
});
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
return {
|
||||
show_playlist: xm_show_playlist,
|
||||
get_playlist: xm_get_playlist,
|
||||
bootstrap_track: xm_bootstrap_track,
|
||||
search: xm_search,
|
||||
album: xm_album,
|
||||
artist: xm_artist,
|
||||
lyric: xm_lyric,
|
||||
};
|
||||
|
||||
})();
|
||||
|
Loading…
x
Reference in New Issue
Block a user