'E5E5E5', 'leftbg'=>'CCCCCC', 'lefticon'=>'333333', 'voltrack'=>'FFFFFF', 'volslider'=>'666666', 'rightbg'=>'B4B4B4', 'rightbghover'=>'999999', 'righticon'=>'333333', 'righticonhover'=>'FFFFFF', 'text'=>'333333', 'tracker'=>'DDDDDD', 'track'=>'FFFFFF', 'border'=>'CCCCCC', 'loader'=>'009900', 'skip'=>'666666', ); /** * 激活插件方法,如果激活失败,直接抛出异常 * * @access public * @return void * @throws Typecho_Plugin_Exception */ public static function activate() { Typecho_Plugin::factory('Widget_Abstract_Contents')->contentEx = array('AudioPlayer_Plugin','playerparse'); Typecho_Plugin::factory('Widget_Abstract_Contents')->excerpt = array('AudioPlayer_Plugin','textparse'); Typecho_Plugin::factory('Widget_Archive')->header = array('AudioPlayer_Plugin','html5css'); Typecho_Plugin::factory('Widget_Archive')->footer = array('AudioPlayer_Plugin','html5js'); Typecho_Plugin::factory('admin/write-post.php')->bottom = array('AudioPlayer_Plugin','apbutton'); Typecho_Plugin::factory('admin/write-page.php')->bottom = array('AudioPlayer_Plugin','apbutton'); /* 模版调用钩子 例: audioplayer('http://test.mp3'); ?> 第2个参数(可略)为播放器参数数组 */ Typecho_Plugin::factory('Widget_Archive')->callAudioplayer = array('AudioPlayer_Plugin', 'getPlayer'); Typecho_Plugin::factory('Widget_Archive')->callMiniplayer = array('AudioPlayer_Plugin', 'html5player'); } /** * 禁用插件方法,如果禁用失败,直接抛出异常 * * @static * @access public * @return void * @throws Typecho_Plugin_Exception */ public static function deactivate(){} /** * 获取插件配置面板 * * @access public * @param Typecho_Widget_Helper_Form $form 配置面板 * @return void */ public static function config(Typecho_Widget_Helper_Form $form) { $options = Helper::options(); $security = Helper::security(); //格式化默认配色 $colors = self::$colors; $colorset = array(); foreach ($colors as $key=>$color) { $colorset[$key] = '#'.$color; } $colors = Json::encode($colorset); if (isset($options->plugins['activated']['AudioPlayer'])) { $settings = $options->plugin('AudioPlayer'); $colorset = Json::decode($settings->ap_colors,true); } //输出面板效果 ?>
参数间用%s号隔开, 支持%s(自动播放)%s(循环播放)%s(曲名)%s(艺术家名)等. 示例','[mp3]','[/mp3]',',','|','autostart','loop','titles','artists'); ?>
[mp3]http://a.mp3,http://b.mp3|
titles=aaa,bbb|
artists=aa,bb|
autostart=no|
loop=
yes[/mp3]
yzmb.me
  • #
is('action=resetcolor') && isset($options->plugins['activated']['AudioPlayer'])) { $security->protect(); Helper::configPlugin('AudioPlayer',array('ap_colors'=>$colors)); Typecho_Response::getInstance()->goBack(); } //重置动作按钮 $resetcolor = new Typecho_Widget_Helper_Form_Element_Submit(); $resetcolor->value(_t('重置')); $resetcolor->input->setAttribute('id','ap_resetcolor'); $resetcolor->input->setAttribute('class','btn btn-xs'); $resetcolor->input->setAttribute('formaction',$security->getAdminUrl('options-plugin.php?config=AudioPlayer&action=resetcolor')); $form->addItem($resetcolor); $ap_fieldselector = new Typecho_Widget_Helper_Form_Element_Select('ap_fieldselector', array( 'bg'=>_t('背景'), 'leftbg'=>_t('左侧背景'), 'lefticon'=>_t('左侧图标'), 'voltrack'=>_t('音量背景'), 'volslider'=>_t('音量滑块'), 'rightbg'=>_t('右侧背景'), 'rightbghover'=>_t('右侧背景(悬停)'), 'righticon'=>_t('右侧图标'), 'righticonhover'=>_t('右侧图标(悬停)'), 'text'=>_t('文本'), 'tracker'=>_t('进度条'), 'track'=>_t('进度条(剩余)'), 'border'=>_t('进度条(边框)'), 'loader'=>_t('加载条'), 'skip'=>_t('切歌按钮') ), 'bg',_t('播放器配色'),'
Vm
HTML5: Demo Mode
02:11
R
p
'._t('注意菜单内灰色项不适用于HTML5版播放器').''); $ap_fieldselector->input->setAttribute('id','ap_fieldselector'); $form->addInput($ap_fieldselector); $ap_width = new Typecho_Widget_Helper_Form_Element_Text('ap_width', NULL,'290',_t('播放器宽度'),_t('输入像素值(如200不用带px)或百分数(如80%)')); $ap_width->addRule('required',_t('播放器宽度不能为空')); $ap_width->addRule(array(new AudioPlayer_Plugin,'widthformat'),_t('请填写整数或百分数')); $form->addInput($ap_width); $ap_initialvolume = new Typecho_Widget_Helper_Form_Element_Text('ap_initialvolume', NULL,'60',_t('初始音量大小'),_t('播放器启动时的音量起步值, 最大100, 默认60')); $ap_initialvolume->addRule('required',_t('初始音量不能为空')); $form->addInput($ap_initialvolume->addRule('isInteger',_t('请填写整数数字'))); $ap_buffer = new Typecho_Widget_Helper_Form_Element_Text('ap_buffer', NULL,'5',_t('缓冲预读时间').' HTML5',_t('单位秒(不用填写), 若播放经常卡顿可适当提高')); $ap_buffer->addRule('required',_t('缓冲时间不能为空')); $form->addInput($ap_buffer->addRule('isInteger',_t('请填写整数数字'))); $ap_animation = new Typecho_Widget_Helper_Form_Element_Checkbox('ap_animation', array(1=>_t('省去点击操作让播放器直接处于展开状态')),NULL,_t('禁用动画效果')); $form->addInput($ap_animation); $ap_encode = new Typecho_Widget_Helper_Form_Element_Checkbox('ap_encode', array(1=>_t('隐藏文件真实的url, 在源码中显示为乱码')),NULL,_t('加密mp3地址')); $form->addInput($ap_encode); $ap_behaviour = new Typecho_Widget_Helper_Form_Element_Checkbox('ap_behaviour', array(1=>_t('将文中指向mp3的链接自动替换为播放器')),NULL,_t('替换mp3链接')); $form->addInput($ap_behaviour); $ap_remaining = new Typecho_Widget_Helper_Form_Element_Checkbox('ap_remaining', array(1=>_t('显示音频的剩余倒计时而非已播放的时长')),NULL,_t('显示剩余时长').' HTML5'); $form->addInput($ap_remaining); $ap_noinfo = new Typecho_Widget_Helper_Form_Element_Checkbox('ap_noinfo', array(1=>_t('隐藏曲名/艺术家名等标签信息仅显示空白')),NULL,_t('禁用曲目信息')); $form->addInput($ap_noinfo); $ap_html5 = new Typecho_Widget_Helper_Form_Element_Checkbox('ap_html5', array(1=>_t('若浏览器不支持flash显示HTML5版播放器')),1,_t('使用缺省播放')); $form->addInput($ap_html5); //配色保存隐藏域 $ap_colors = new Typecho_Widget_Helper_Form_Element_Hidden('ap_colors',NULL,$colors,NULL); $ap_colors->input->setAttribute('id','ap_colors'); $form->addInput($ap_colors); } /** * 个人用户的配置面板 * * @access public * @param Typecho_Widget_Helper_Form $form * @return void */ public static function personalConfig(Typecho_Widget_Helper_Form $form){} /** * 内容标签替换 * * @access public * @param string $content * @return string */ public static function playerparse($content,$widget,$lastResult) { $content = empty($lastResult) ? $content : $lastResult; if ($widget instanceof Widget_Archive && !$widget->request->feed && false!==stripos($content,'[mp3]')) { $callback = array('AudioPlayer_Plugin','parseCallback'); //替换播放器标签 $content = preg_replace_callback('/\[(mp3)](.*?)\[\/\\1]/si',$callback,$content); //替换mp3链接 if (Helper::options()->plugin('AudioPlayer')->ap_behaviour) { $content = preg_replace_callback('/.*?<\/a>/si',$callback,$content); } } return $content; } /** * 摘要文本替换 * * @param string $text * @return string */ public static function textparse($text,$widget,$lastResult) { $text = empty($lastResult) ? $text : $lastResult; if ($widget instanceof Widget_Archive && false!==stripos($text,'[mp3]')) { $text = preg_replace('/\[(mp3)](.*?)\[\/\\1]/si',_t(' [音频片段: 请查看全文播放] '),$text); } return $text; } /** * 参数回调解析 * * @param array $match * @return string */ public static function parseCallback($match) { //过滤html标签 $atts = explode('|',trim(Typecho_Common::stripTags($match['2']))); $files = array_shift($atts); $pair = array(); $data = array(); foreach ($atts as $att) { $pair = explode('=',$att); $data[trim($pair['0'])] = trim($pair['1']); } return self::getPlayer(Typecho_Widget::widget('Widget_Archive'),array($files,$data,true)); } /** * 输出播放器实例 * * @access public * @param array $params 实例参数 * @return string */ public static function getPlayer($widget,array $params) { $options = Helper::options(); $settings = $options->plugin('AudioPlayer'); $playerurl = $options->pluginUrl.'/AudioPlayer/assets/'; $playerid = "audioplayer_".++self::$playerID; //处理实例参数 $source = ''; $source = isset($params['0']) && is_string($params['0']) ? $params['0'] : $source; $playerOptions = array(); $playerOptions = isset($params['1']) && is_array($params['1']) ? $params['1'] : $playerOptions; $isCall = false; $isCall = !empty($params['2']) && is_bool($params['2']) ? $params['2'] : $isCall; $source = html_entity_decode($source); $playerOptions['soundFile'] = $settings->ap_encode ? self::encodeSource($source) : $source; //缺省调用html5 $fallback = $settings->ap_html5 ? self::html5player($widget,array($source,$playerOptions,true)) : ''._t('播放此段音频需要Adobe Flash Player, 请点击%s下载最新版本%s并确认浏览器已开启JavaScipt支持','','').''; //播放器实例代码 $playerCode = ''; //不重复加载 $playerCode .= ''; $playerCode .= '
'.$fallback.'
'; $playerCode .= ''; //模版输出判断 if ($isCall) { return $playerCode; } else { echo $playerCode; } } /** * 输出html5版实例 * * @access public * @param array $params 实例参数 * @return string */ public static function html5player($widget,array $params) { $options = Helper::options(); $settings = $options->plugin('AudioPlayer'); $playerurl = $options->pluginUrl.'/AudioPlayer/assets/'; $playerid = "mp_".++self::$playerID; //处理实例参数 $source = ''; $source = isset($params['0']) && is_string($params['0']) ? $params['0'] : $source; $playerOptions = array(); $playerOptions = isset($params['1']) && is_array($params['1']) ? $params['1'] : $playerOptions; $isCall = false; $isCall = !empty($params['2']) && is_bool($params['2']) ? $params['2'] : $isCall; //处理播放参数 $autostart = isset($playerOptions['autostart']) ? $playerOptions['autostart'] : ''; $loop = isset($playerOptions['loop']) ? $playerOptions['loop'] : ''; $title = isset($playerOptions['titles']) ? $playerOptions['titles'] : ''; $artist = isset($playerOptions['artists']) ? $playerOptions['artists'] : ''; $noinfo = $settings->ap_noinfo; $param = '{autoplay:'.($autostart=='yes' ? 'true' : 'false').',loop:'.($loop=='yes' ? 'true' : 'false').($title || $noinfo ? ',id3:false' : '').'}'; $infos = self::infos($source,$title,$artist); $sources = explode(',',$source); $mp3 = trim($sources['0']); $name = $noinfo ? '' : $infos['0']; $mp3 = $settings->ap_encode ? self::encodeSource($mp3) : $mp3; $html = ''.$name.''; //输出列表模式 if (count($sources)>1) { $html = '
'.$html.'
'; foreach ($sources as $i=>$source) { $mp3 = trim($source); $name = $infos[''.$i.'']; $mp3 = $settings->ap_encode ? self::encodeSource($mp3) : $mp3; $html .= '
'.$name.'
'; } $html .= '
'; } //模版输出判断 if ($isCall) { return $html; } else { echo $html; } } /** * 构造曲目信息 * * @param string $source 文件地址 * @param string $title 曲目名称 * @param string $artist 艺术家名 * @return array */ private static function infos($source,$title,$artist) { $sources = explode(',',$source); $titles = explode(',',$title); $artists = explode(',',$artist); $song = ''; $star = ''; $con = ''; $info = array(); foreach ($sources as $i=>$file) { $song = empty($titles[''.$i.'']) ? preg_replace('/^.+[\\\\\\/]/','',$file) : trim($titles[''.$i.'']); $star = isset($artists[''.$i.'']) ? trim($artists[''.$i.'']) : ''; $con = $star ? ' - ' : ''; $info[] = $song.$con.$star; } return $info; } /** * 输出头部样式 * * @access public * @return void */ public static function html5css() { $options = Helper::options(); $settings = $options->plugin('AudioPlayer'); $playerurl = $options->pluginUrl.'/AudioPlayer/assets/'; $width = $settings->ap_width; $colorset = Json::decode($settings->ap_colors,true); $css = ''; if ($settings->ap_html5) { $css = ' '; } echo $css; } /** * 输出底部脚本 * * @access public * @return void */ public static function html5js() { $options = Helper::options(); $settings = $options->plugin('AudioPlayer'); $playerurl = $options->pluginUrl.'/AudioPlayer/assets/'; $width = $settings->ap_width; $js = ''; if ($settings->ap_html5) { $js = ' '; } echo $js; } /** * 输出flash版配置 * * @return string */ public static function getSets() { $options = Helper::options(); //加载默认参数 $ap_options = array( 'width'=>'290', 'initialvolume'=>'60', 'buffer'=>'5', 'animation'=>true, 'encode'=>false, 'remaining'=>false, 'noinfo'=>false, 'checkpolicy'=>true, 'transparentpagebg'=>true, 'rtl'=>false ); $colors = self::$colors; //读取插件设置 if (isset($options->plugins['activated']['AudioPlayer'])) { $settings = $options->plugin('AudioPlayer'); $ap_options['width'] = $settings->ap_width; $ap_options['initialvolume'] = $settings->ap_initialvolume; $ap_options['buffer'] = $settings->ap_buffer; $ap_options['animation'] = $settings->ap_animation ? false : true; $ap_options['encode'] = $settings->ap_encode ? true : false; $ap_options['remaining'] = $settings->ap_remaining ? true : false; $ap_options['noinfo'] = $settings->ap_noinfo ? true : false; //解析配色数据 $colors = Json::decode($settings->ap_colors,true); foreach ($colors as $key=>$color) { $colors[$key] = substr($color,1); } } return self::php2js($ap_options+$colors); } /** * 格式化配置参数 * * @param array $object * @return string */ private static function php2js($object) { $separator = ''; $real_separator = ','; $js_options = '{'; foreach($object as $key=>$value) { //布尔型处理 if (is_bool($value)) { $value = $value ? 'yes' : 'no'; } elseif (in_array($key,array('soundFile','titles','artists'))) { //文本型处理 if (in_array($key,array('titles','artists'))) { $value = html_entity_decode($value); } $value = rawurlencode($value); } $js_options .= $separator.$key.':"'.$value.'"'; $separator = $real_separator; } $js_options .= '}'; return $js_options; } /** * 加密音频地址 * * @param string $string * @return string */ private static function encodeSource($string) { //对应swf解码修正 $string = rawurlencode($string); $ntexto = ''; $codekey = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_-'; for ($i=0;$itheme; $cssfile = __TYPECHO_ROOT_DIR__.__TYPECHO_THEME_DIR__.'/'.$theme.'/style.css'; if (is_file($cssfile)) { preg_match_all('/:[^:,;\{\}].*?#([abcdef1234567890]{3,6})/i',file_get_contents($cssfile),$matches); return array_unique($matches['1']); } } /** * 输出编辑器按钮 * * @access public * @return void */ public static function apbutton() { ?>