APlayer-Typecho/Action.php
2017-01-28 21:23:45 +08:00

216 lines
9.1 KiB
PHP

<?php
if(!defined('__TYPECHO_ROOT_DIR__'))exit;
if (!extension_loaded('Meting'))include_once 'include/Meting.php';
class Meting_Action extends Typecho_Widget implements Widget_Interface_Do {
public function execute(){}
public function action(){
$this->on($this->request->is('do=js'))->js();
$this->on($this->request->is('do=url'))->url();
$this->on($this->request->is('do=pic'))->pic();
$this->on($this->request->is('do=lrc'))->lrc();
$this->on($this->request->is('do=parse'))->shortcode();
}
private function shortcode(){
$urls=$this->request->get('data');
$urls=explode("\n",$urls);
echo "[Meting]\n";
foreach($urls as $url){
$url=trim($url);
if($url=="")continue;
$server='音乐平台';$id='编号';$type='类型';
if(strpos($url,'163.com')!==false){
$server='netease';
if(preg_match('/playlist\?id=(\d+)/i',$url,$id))list($id,$type)=array($id[1],'playlist');
elseif(preg_match('/album\?id=(\d+)/i',$url,$id))list($id,$type)=array($id[1],'album');
elseif(preg_match('/song\?id=(\d+)/i',$url,$id))list($id,$type)=array($id[1],'song');
elseif(preg_match('/artist\?id=(\d+)/i',$url,$id))list($id,$type)=array($id[1],'artist');
}
elseif(strpos($url,'qq.com')!==false){
$server='tencent';
if(preg_match('/playlist\/([^\.]*)/i',$url,$id))list($id,$type)=array($id[1],'playlist');
elseif(preg_match('/album\/([^\.]*)/i',$url,$id))list($id,$type)=array($id[1],'album');
elseif(preg_match('/song\/([^\.]*)/i',$url,$id))list($id,$type)=array($id[1],'song');
elseif(preg_match('/singer\/([^\.]*)/i',$url,$id))list($id,$type)=array($id[1],'artist');
}
elseif(strpos($url,'xiami.com')!==false){
$server='xiami';
if(preg_match('/collect\/([^\.]*)/i',$url,$id))list($id,$type)=array($id[1],'playlist');
elseif(preg_match('/album\/([^\.]*)/i',$url,$id))list($id,$type)=array($id[1],'album');
elseif(preg_match('/song\/([^\.]*)/i',$url,$id))list($id,$type)=array($id[1],'song');
elseif(preg_match('/artist\/([^\.]*)/i',$url,$id))list($id,$type)=array($id[1],'artist');
if(!preg_match('/^\d*$/i',$id,$t)){
$data=self::curl($url);
preg_match('/'.$type.'\/(\d+)/i',$data,$id);
$id=$id[1];
}
}
elseif(strpos($url,'kugou.com')!==false){
$server='kugou';
if(preg_match('/special\/single\/(\d+)/i',$url,$id))list($id,$type)=array($id[1],'playlist');
elseif(preg_match('/album\/single\/(\d+)/i',$url,$id))list($id,$type)=array($id[1],'album');
elseif(preg_match('/singer\/home\/(\d+)/i',$url,$id))list($id,$type)=array($id[1],'artist');
}
elseif(strpos($url,'baidu.com')!==false){
$server='baidu';
if(preg_match('/songlist\/(\d+)/i',$url,$id))list($id,$type)=array($id[1],'playlist');
elseif(preg_match('/album\/(\d+)/i',$url,$id))list($id,$type)=array($id[1],'album');
elseif(preg_match('/song\/(\d+)/i',$url,$id))list($id,$type)=array($id[1],'song');
elseif(preg_match('/artist\/(\d+)/i',$url,$id))list($id,$type)=array($id[1],'artist');
}
else list($id,$type)=array($url,'search');
echo '[Music server="'.$server.'" id="'.$id.'" type="'.$type.'"/]'."\n";
}
echo "[/Meting]";
}
private function curl($url){
$curl=curl_init();
curl_setopt($curl,CURLOPT_URL,$url);
curl_setopt($curl,CURLOPT_RETURNTRANSFER,1);
curl_setopt($curl,CURLOPT_CONNECTTIMEOUT,10);
curl_setopt($curl,CURLOPT_TIMEOUT,10);
curl_setopt($curl,CURLOPT_REFERER,$url);
$result=curl_exec($curl);
curl_close($curl);
return $result;
}
private function js(){
$PID=$this->request->get('id');
$data=$this->request->get('d');
$data=json_decode(base64_decode($data),1);
$setting=$this->request->get('s');
$setting=json_decode(base64_decode($setting),1);
$music=array();
foreach($data as $vo){
$EID=md5('js/'.$vo['server'].'/'.$vo['type'].'/'.$vo['id']);
$t=self::cacheRead($EID,60*60*24*3);
if(!$t){
$API=(new Meting($vo['server']))->format(true);
$t=call_user_func_array(array($API,$vo['type']),array($vo['id']));
$t=json_decode($t,1);
self::cacheWrite($EID,$t);
}
$music=array_merge($music,$t);
}
$player=array(
'theme' => $setting['theme']?:Typecho_Widget::widget('Widget_Options')->plugin('Meting')->theme?:'red',
'preload' => $setting['preload']?:Typecho_Widget::widget('Widget_Options')->plugin('Meting')->preload?:'auto',
'autoplay' => $setting['autoplay']?:Typecho_Widget::widget('Widget_Options')->plugin('Meting')->autoplay?:'false',
'height' => $setting['height']?:Typecho_Widget::widget('Widget_Options')->plugin('Meting')->height?:'340px',
'mode' => $setting['mode']?:Typecho_Widget::widget('Widget_Options')->plugin('Meting')->mode?:'circulation',
'music' => array(),
);
foreach($music as $vo){
$URI=Typecho_Common::url('MetingAPI?site='.$vo['source'],Helper::options()->index);
$player['music'][]=array(
'title'=>$vo['name'],
'author'=>implode(' / ',$vo['artist']),
'url'=>$URI.'&do=url&id='.$vo['url_id'],
'pic'=>$URI.'&do=pic&id='.$vo['pic_id'],
'lrc'=>$URI.'&do=lrc&id='.$vo['lyric_id'],
);
}
if(sizeof($player['music'])==1)$player['music']=$player['music'][0];
$player['music']=json_encode($player['music']);
header('content-type:application/javascript');
echo"
var Meting{$PID} = new APlayer({
element: document.getElementById('MetingPlayer'+{$PID}),
autoplay: ".$player['autoplay'].",
preload: \"".$player['preload']."\",
showlrc: 3,
mutex: true,
mode: '".$player['mode']."',
theme: \"".$player['theme']."\",
music: ".$player['music'].",
listmaxheight: '".$player['height']."',
});
";
}
private function url(){
$id=$this->request->get('id');
$site=$this->request->get('site');
$rate=Typecho_Widget::widget('Widget_Options')->plugin('Meting')->bitrate;
$cachekey="url/{$site}/{$id}";
$data=self::cacheRead($cachekey,60*15);
if(!$data){
$data=(new Meting($site))->url($id,$rate);
$data=json_decode($data,1);
self::cacheWrite($cachekey,$data);
}
if(empty($data['url']))$data['url']='https://oc1pe0tot.qnssl.com/copyright.m4a';
$this->response->redirect($data['url']);
}
private function pic(){
$id=$this->request->get('id');
$site=$this->request->get('site');
$cachekey="pic/{$site}/{$id}";
$data=self::cacheRead($cachekey,60*60*24*30);
if(!$data){
$data=(new Meting($site))->pic($id,90);
$data=json_decode($data,1);
self::cacheWrite($cachekey,$data);
}
$this->response->redirect($data['url']);
}
private function lrc(){
$id=$this->request->get('id');
$site=$this->request->get('site');
$cachekey="lrc/{$site}/{$id}";
$data=self::cacheRead($cachekey,60*60*24*10);
if(!$data){
$data=(new Meting($site))->lyric($id);
$data=json_decode($data,1);
self::cacheWrite($cachekey,$data);
}
switch($site){
case 'netease':$text=$data['lrc']['lyric'];break;
case 'tencent':$text=base64_decode($data['lyric']);break;
case 'xiami':$text=$data['lyric'];break;
case 'kugou':$text=$data['lyric'];break;
case 'baidu':$text=$data['lrcContent'];break;
}
if(strlen($text)==0)$text='[00:00.00]无歌词';
echo $text;
}
private function cacheWrite($k,$v){
if(!is_array($v))return;
$db=Typecho_Db::get();
$prefix=$db->getPrefix();
$insert=$db->insert($prefix.'meting')->rows(array('id'=>sha1($k),'value'=>serialize($v),'date'=>time()));
return $db->query($insert);
}
private function cacheRead($k,$t=60*60){
$db=Typecho_Db::get();
$prefix=$db->getPrefix();
$query= $db->select('value','date')->from($prefix.'meting')->where('id=?',sha1($k));
$result = $db->fetchAll($query);
if(sizeof($result)){
if(time()-$result[0]['date']>$t){
$delete = $db->delete('value','date')->from($prefix.'meting')->where('date<?',time()-$t);
$db->query($delete);
return false;
}
return unserialize($result[0]['value']);
}
else return false;
}
}