移植ZBLOG弹幕视频播放器整合到帝国CMS

查看 13|回复 2
作者:美文苑文学网   
移植ZBLOG弹幕视频播放器整合到帝国CMS。之前是哪个网友有给我分享这个ZBLOG插件。其实我一看我察。居然也是面向过程写的代码。这不是太简单了。首先弹幕写入与读取与举报。[ol]
  • session_start();
  • if ($_SERVER['REQUEST_METHOD'] === 'POST') {  
  •     if($user['zt']=="nologin"){
  •         $responseData = array(  
  •     'code' => -3,  
  •     'danmuku' =>"您还没有登陆"
  •     );  
  •     echo json_encode($responseData);  
  •     exit;        
  •     }
  •     if (isset($_SESSION['last_submit_time'])) {  
  •     $lastSubmitTime = $_SESSION['last_submit_time'];  
  •     $currentTime = time();  
  •     $timeDifference = $currentTime - $lastSubmitTime;  
  •     if ($timeDifference  -5,  
  •     'danmuku' =>"您休息下吧"
  •     );  
  •     echo json_encode($responseData);  
  •     exit;
  •     }  
  •     }  
  •     $_SESSION['last_submit_time'] = time();
  •     $post_data = json_decode(file_get_contents('php://input'), true);
  •         $author =$username?$username:RepPostVar($post_data['author']);
  •         $color =RepPostVar($post_data['color']);
  •         $danmuid =RepPostVar($post_data['player']);
  •         $size =RepPostVar($post_data['size']);
  •         $text =RepPostVar($post_data['text']);
  •         $videotime =RepPostVar($post_data['time']);
  •         $type =RepPostVar($post_data['type']);
  •         $sql=$empire->query("insert into {$dbtbpre}danmaku_list(danmuid,type,username,userid,text,color,size,videotime,ip,time) values('$danmuid','$type','$author','$userid','$text','$color','$size','$videotime','$ip','$time');");
  •     echo json_encode(array('code' =>23,'danmuku' =>"发布成功"));  
  •     exit;  
  • }   
  • if ($_SERVER['REQUEST_METHOD'] === 'GET') {  
  •     if ($enews === 'dm') {
  •           $danmuid = RepPostVar($_GET['id']);
  •           $total=fetch_memcache0("select count(*) as total from {$dbtbpre}danmaku_list where danmuid='$danmuid'",'Memcached','danmulistall',60);
  •       $danmunum=$total[0]['total'];
  •           $value=fetch_memcache0("select id,danmuid,type,username,userid,text,color,size,videotime,ip,time from {$dbtbpre}danmaku_list where danmuid='$danmuid' order by id desc limit 550",'Memcached','danmu',60);
  •           foreach ($value as $k => $v){
  •           $data[]=array(
  •             '0'=>(float)$v['videotime'],
  •                         '1'=>$v['type'],
  •                         '2'=>$v['color'],
  •                         '3'=>$v['id'],
  •                         '4'=>$v['text'],  
  •                         '5'=>$v['ip'],
  •                         '6'=>date('m-d H:i', $v['time']),
  •                         '7'=>$v['size'],
  •                         '8'=>$v['username'],
  •                 );
  •       }        
  •           $responseData = array(  
  •       'code' => 23,  
  •        'danmuku' => $data,  
  •        'danum' =>$danmunum,  
  •            'name' =>$danmuid,
  •       );  
  •       echo json_encode($responseData);  
  •       exit;  
  •     }elseif ($enews === 'report') { // 弹幕举报  
  •             $text = RepPostVar($_GET['text']);
  •                 $cid = $_GET['cid'];
  •                 $type = RepPostVar($_GET['type']);
  •                 $danmuid = RepPostVar($_GET['title']);
  •                 $userip = $ip?$ip:RepPostVar($_GET['user']);
  •         $sql=$empire->query("insert into {$dbtbpre}danmaku_report(danmuid,username,userid,text,type,time,ip) values('$danmuid','$username','$userid','$text','$type','$time','$userip');");
  •         $responseData = array(  
  •             'code' => -3,  
  •             'danmuku' => '举报成功!感谢您为守护弹幕作出了贡献',   
  •         );
  •            echo json_encode($responseData);  
  •        exit;  
  •     } else {  
  •         echo json_encode(['code' => 0, 'danmuku' => 'Unknown action.']);  
  •         exit;  
  •     }  
  • } [/ol]复制代码看了下,还是不够完美在增加多少人观看呢?
    [ol]
  • include('config.php'); // 引入弹幕播放器参数  
  • $userid = (int)getcvar('mluserid');        // 用户ID  
  • $username = RepPostVar(getcvar('mlusername')); // 用户名  
  • $username = $username ? $username : "游客";  
  • $current_ip = egetip();  //获取IP地址
  • $online_log = ECMS_PATH.'e/m/yzplayer/count.dat'; // 保存人数的文件  
  • $timeout = (int)$yzm['online']; // 默认30秒内没动作者,认为掉线  后台可以设置
  • $users_online = array();  
  • $users_online = array();  
  • if (($fp = fopen($online_log, "r")) !== false) {  
  •     flock($fp, LOCK_SH);
  •     while (($line = fgets($fp)) !== false) {  
  •         $line = trim($line);  
  •         if (!empty($line)) {  
  •             $entry = explode(",", $line);  
  •             if (count($entry) == 4) {  
  •                 list($ip, $userid_stored, $username_stored, $timestamp) = $entry;  
  •                 $timestamp = (int)$timestamp;  
  •                 if ($timestamp > time() - $timeout) {  
  •                     $users_online[$ip] = array(  
  •                         'userid' => (int)$userid_stored,
  •                         'username' => $username_stored,  
  •                         'timestamp' => $timestamp  
  •                     );  
  •                 }  
  •             }  
  •         }  
  •     }  
  •     flock($fp, LOCK_UN);  
  •     fclose($fp);  
  • }   
  • if (!isset($users_online[$current_ip]) || $users_online[$current_ip]['timestamp']  $userid,  
  •         'username' => $username,  
  •         'timestamp' => time()  
  •     );  
  • } else {  
  •     $users_online[$current_ip]['timestamp'] = time();  
  • }   
  • $users_online_data = '';  
  • foreach ($users_online as $ip => $user) {  
  •     $users_online_data .= "{$ip},{$user['userid']},{$user['username']},{$user['timestamp']}\n";  
  • }  
  • if (($fp = fopen($online_log, "w")) !== false) {  
  • flock($fp, LOCK_EX);
  • fwrite($fp, $users_online_data);  
  • flock($fp, LOCK_UN);  
  • fclose($fp);  
  • } else {  
  • echo "无法写入: " . $online_log;  
  • } [/ol]复制代码某些骚年还是觉得少了像bilibili弹幕获取啊。其实这个更简单,因为只需要curl不存在什么逻辑问题
    [ol]
  • $cid = isset($_GET['cid']) ? $_GET['cid'] : null;
  • $av = isset($_GET['av']) ? $_GET['av'] : 0;
  • $p = isset($_GET['p']) ? $_GET['p'] : 1;
  • preg_match("/^[0-9]+$/", $av) ?: $av = 0;
  • preg_match("/^[0-9]+$/", $p) ?: $p = 1;
  • preg_match("/^[0-9]+$/", $cid) ?: $cid = 0;
  • if ($cid > 0 or ($cid > 0 and $av > 0)) {
  •     $xml = curl_get('https://api.bilibili.com/x/v1/dm/list.so?oid=' . $cid);
  •     echo xml_json($xml);
  • } elseif ($av > 0 and $cid  3) {
  •         $r = hexdec(substr($color, 0, 2));
  •         $g = hexdec(substr($color, 2, 2));
  •         $b = hexdec(substr($color, 4, 2));
  •         $rgb = 'rgb(' . $r . ',' . $g . ',' . $b . ')';
  •     } else {
  •         $color = $hexColor;
  •         $r = substr($color, 0, 1) . substr($color, 0, 1);
  •         $g = substr($color, 1, 1) . substr($color, 1, 1);
  •         $b = substr($color, 2, 1) . substr($color, 2, 1);
  •         $rgb = array(
  •             'r' => hexdec($r),
  •             'g' => hexdec($g),
  •             'b' => hexdec($b)
  •         );
  •     }
  •     return $rgb;
  • }
  • function xml_json($xml){
  •     $xml = simplexml_load_string($xml); //将文件转换成 对象
  •     $xmljson = json_encode($xml);
  •     $danmuku = json_decode($xmljson, true);
  •     foreach ($danmuku['d'] as $k => $v) {
  •         foreach ($xml->d[$k]->attributes() as $_v) {
  •             $danmuku['d'][$k] = [$v];
  •             $danmuku['d'][$k][] = explode(",", (string) $_v);
  •         }
  •     }
  •     $danmuku = $danmuku['d'];
  •     $json = ['code' => 23];
  •     foreach ($danmuku as $k => $v) {
  •         $json['danmuku'][$k][] = (float) $v[1][0];  //弹幕出现时间(s)
  •         if ($v[1][1] 复制代码
    总结,面向过程的写法更容易理解逻辑。对于小白相对比所有的函数封装到一个类更容易移植。

    弹幕, 帝国

  • 奥术大师   
    大佬牛啊 不能让帖子沉了
    美文苑文学网
    OP
      

    漏了,小编顺便写个创建弹幕表与弹幕投诉的表
    [ol]
  • DROP TABLE IF EXISTS `[!db.pre!]danmaku_list`;
  • CREATE TABLE `[!db.pre!]danmaku_list` (
  •   `id` int(10) NOT NULL AUTO_INCREMENT COMMENT 'id',
  •   `danmuid` varchar(128) NOT NULL COMMENT '弹幕池id',
  •   `username` varchar(35) NOT NULL COMMENT '用户名',
  •   `userid` int(11) NOT NULL COMMENT '用户id',
  •   `type` varchar(128) NOT NULL COMMENT '弹幕类型',
  •   `text` varchar(128) NOT NULL COMMENT '弹幕内容',
  •   `color` varchar(128) NOT NULL COMMENT '弹幕颜色',
  •   `size` varchar(128) NOT NULL COMMENT '弹幕大小',
  •   `videotime` float(24,3) NOT NULL COMMENT '时间点',
  •   `ip` varchar(36) NOT NULL COMMENT '用户ip',
  •   `time` int(11) NOT NULL COMMENT '发送时间',
  •   PRIMARY KEY (`id`),
  •   KEY `danmuid` (`danmuid`)
  • ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
  • DROP TABLE IF EXISTS `[!db.pre!]danmaku_report`;
  • CREATE TABLE `[!db.pre!]danmaku_report` (
  •   `id` int(10) NOT NULL AUTO_INCREMENT COMMENT 'id',
  •   `danmuid` varchar(128) NOT NULL COMMENT '弹幕池id',
  •   `username` varchar(35) NOT NULL COMMENT '用户名',
  •   `userid` int(11) NOT NULL COMMENT '用户id',
  •   `text` varchar(128) NOT NULL COMMENT '举报内容',
  •   `type` varchar(128) NOT NULL COMMENT '举报类型',
  •   `time` int(11) NOT NULL COMMENT '举报时间',
  •   `ip` varchar(36) NOT NULL COMMENT '发送弹幕的IP地址',
  •   PRIMARY KEY (`id`),
  •   KEY `danmuid` (`danmuid`)
  • ) ENGINE=MyISAM DEFAULT CHARSET=utf8;[/ol]复制代码数据表设计不合理的请自行研究。小编也只是按照常规化的数据表设计索引至于字段类型也没有深入研究。比如:在存储长度固定的数据并且更新操作较多时,char 效率可能更高;在存储长度不固定的数据并且插入操作较多、空间利用要求高时,varchar 效率更有优势。
  • 您需要登录后才可以回帖 登录 | 立即注册

    返回顶部