dever 6 years ago
parent
commit
a37316e091

+ 1 - 1
content/database/article.php

@@ -273,7 +273,7 @@ return array
 			'update'	=> 'date',
 			'callback'	=> 'maketime',
 			'insert'	=> true,
-			'list'		=> 'date("Y-m-d H:i:s", {pdate})',
+			//'list'		=> 'date("Y-m-d H:i:s", {pdate})',
 			'auth'		=> '"{pdate}" > 0',
 		),
 

+ 1 - 1
journal/database/info.php

@@ -261,7 +261,7 @@ return array
 			'update'	=> 'date',
 			'callback'	=> 'maketime',
 			'insert'	=> true,
-			'list'		=> 'date("Y-m-d H:i:s", {pdate})',
+			//'list'		=> 'date("Y-m-d H:i:s", {pdate})',
 			'auth'		=> '"{pdate}" > 0',
 		),
 

+ 1 - 1
journal/lib/Manage.php

@@ -78,7 +78,7 @@ class Manage
 
         $database = Dever::load('manage/database');
         $type = Dever::db('journal/content')->config['gettype'];
-
+        
         if ($data) {
             foreach ($data as $k => $v) {
                 if ($v['type'] <= 2) {

+ 3 - 0
live/config/base.php

@@ -6,5 +6,8 @@ $config['base'] = array
 	(
 		1 => '七牛云',
 	),
+
+	# 对应的视频表,必须有stream_id、sdate、edate、url_m3u8、url_mp4五个字段
+	'video' => 'video/live',
 );
 return $config;

+ 4 - 0
live/database/active.php

@@ -115,6 +115,10 @@ return array
         //'delete' => false,
         //'edit' => false,
         //'insert' => false,
+        'list_button' => array
+        (
+            'list' => array('直播流列表', '"stream&search_option_active_id={id}&oper_parent=active"'),
+        ),
     ),
 
     # request 请求接口定义

+ 1 - 1
live/database/info.php

@@ -90,7 +90,7 @@ return array
             'match'     => 'is_string',
             'update'    => 'text',
             'search'    => 'fulltext',
-            'list'      => true,
+            //'list'      => true,
         ),
 
         'domain_publish'      => array

+ 16 - 3
live/database/stream.php

@@ -88,6 +88,7 @@ return array
             'option'    => $active,
             'search'    => 'select',
             'list'      => true,
+            'edit'      => true,
         ),
 
         'name'      => array
@@ -119,8 +120,8 @@ return array
         'times'      => array
         (
             'type'      => 'varchar-30',
-            'name'      => '直播时长-直接输入小时数,默认为5个小时',
-            'default'   => '5',
+            'name'      => '直播时长-直接输入小时数,默认为100天',
+            'default'   => '2400',
             'desc'      => '直播时长',
             'match'     => 'option',
             'update'    => 'text',
@@ -140,6 +141,15 @@ return array
             //'list'      => true,
         ),
 
+        'live_date'     => array
+        (
+            'type'      => 'int-11',
+            'name'      => '上次获取推流地址的时间',
+            'match'     => 'is_numeric',
+            'default'   => '',
+            'desc'      => '',
+        ),
+
         'live'      => array
         (
             'type'      => 'varchar-800',
@@ -257,7 +267,9 @@ return array
 
         'list_button' => array
         (
-            'list' => array('推流日志', '"stream_log&search_option_stream_id={id}&oper_parent=stream"'),
+            'list' => array('云推流日志', '"stream_log&search_option_stream_id={id}&oper_parent=stream"'),
+            'br1' => array('<br />'),
+            'list1' => array('IOS推流日志', '"stream_ios_log&search_option_stream_id={id}&oper_parent=stream"'),
         ),
     ),
 
@@ -272,6 +284,7 @@ return array
                 'status' => 'yes',
                 'online' => 'yes',
                 'key' => 'yes',
+                'live_id' => 'yes',
                 'state' => 1,
             ),
             'type' => 'all',

+ 175 - 0
live/database/stream_ios_log.php

@@ -0,0 +1,175 @@
+<?php
+
+$live = function()
+{
+    $array = array();
+    $info = Dever::db('live/info')->state();
+    if($info)
+    {
+        $array += $info;
+    }
+    return $array;
+};
+
+$active = function()
+{
+    $array = array();
+    $info = Dever::db('live/active')->state();
+    if($info)
+    {
+        $array += $info;
+    }
+    return $array;
+};
+
+$stream = function()
+{
+    $array = array();
+    $info = Dever::db('live/stream')->state();
+    if($info)
+    {
+        $array += $info;
+    }
+    return $array;
+};
+
+return array
+(
+    # 表名
+    'name' => 'stream_ios_log',
+    # 显示给用户看的名称
+    'lang' => 'IOS推流日志',
+    'order' => 2,
+    'menu' => false,
+    'desc' => 'IOS推流日志是根据接口实时获取IOS端的直播推流日志,不能接收到obs端的推流日志。',
+    # 数据结构
+    'struct' => array
+    (
+    
+        'id'        => array
+        (
+            'type'      => 'int-11',
+            'name'      => 'ID',
+            'default'   => '',
+            'desc'      => '',
+            'match'     => 'is_numeric',
+            'search'    => 'order',
+            'list'        => true,
+        ),
+
+        'live_id'       => array
+        (
+            'type'      => 'int-11',
+            'name'      => '所属直播云',
+            'default'   => '1',
+            'desc'      => '所属直播云',
+            'match'     => 'is_numeric',
+            'update'    => 'select',
+            //'option'    => $live,
+            'search'    => 'select',
+            //'list'      => true,
+        ),
+
+        'active_id'       => array
+        (
+            'type'      => 'int-11',
+            'name'      => '所属活动',
+            'default'   => '1',
+            'desc'      => '所属活动',
+            'match'     => 'is_numeric',
+            'update'    => 'select',
+            //'option'    => $active,
+            'search'    => 'select',
+            //'list'      => true,
+        ),
+
+        'stream_id'       => array
+        (
+            'type'      => 'int-11',
+            'name'      => '所属直播流',
+            'default'   => '1',
+            'desc'      => '所属直播流',
+            'match'     => 'is_numeric',
+            //'update'    => 'select',
+            'option'    => $stream,
+            //'search'    => 'select',
+            'list'      => true,
+        ),
+
+        'sdate'     => array
+        (
+            'type'      => 'int-11',
+            'name'      => '开始时间',
+            'match'     => 'is_numeric',
+            'default'   => '',
+            'desc'      => '',
+            'update'    => 'date',
+            'callback'  => 'maketime',
+            'list'      => '{sdate} > 0 ? date("Y-m-d H:i:s", {sdate}) : "未开始"',
+        ),
+
+        'edate'     => array
+        (
+            'type'      => 'int-11',
+            'name'      => '结束时间',
+            'match'     => 'is_numeric',
+            'default'   => '',
+            'desc'      => '',
+            //'update'    => 'date',
+            'callback'  => 'maketime',
+            'list'      => '{edate} > 0 ? date("Y-m-d H:i:s", {edate}) : "未结束"',
+        ),
+
+        'url_m3u8'      => array
+        (
+            'type'      => 'varchar-800',
+            'name'      => '直播回放地址',
+            'default'   => '',
+            'desc'      => '直播回放地址',
+            'match'     => 'option',
+            //'update'    => 'text',
+            'list'      => true,
+        ),
+
+        'url_mp4'      => array
+        (
+            'type'      => 'varchar-800',
+            'name'      => '直播回放地址',
+            'default'   => '',
+            'desc'      => '直播回放地址',
+            'match'     => 'option',
+            //'update'    => 'text',
+            'list'      => true,
+        ),
+
+        'state'     => array
+        (
+            'type'      => 'tinyint-1',
+            'name'      => '状态',
+            'default'   => '1',
+            'desc'      => '请选择状态',
+            'match'     => 'is_numeric',
+        ),
+        
+        'cdate'     => array
+        (
+            'type'      => 'int-11',
+            'name'      => '创建时间',
+            'match'     => array('is_numeric', time()),
+            'desc'      => '',
+            # 只有insert时才生效
+            'insert'    => true,
+            //'search'  => 'date',
+            //'list'      => 'date("Y-m-d H:i:s", {cdate})',
+        ),
+    ),
+
+    'manage' => array
+    (
+        //'excel'   => true,
+        'delete' => false,
+        'edit' => false,
+        //'insert' => false,
+    ),
+
+);

+ 4 - 3
live/database/stream_log.php

@@ -38,9 +38,10 @@ return array
     # 表名
     'name' => 'stream_log',
     # 显示给用户看的名称
-    'lang' => '直播流日志',
+    'lang' => '云推流日志',
     'order' => 2,
     'menu' => false,
+    'desc' => '云推流日志是定时获取七牛云上的直播推流日志,可以用来查看obs直播和ios直播的推流日志',
     # 数据结构
     'struct' => array
     (
@@ -127,7 +128,7 @@ return array
             'desc'      => '直播回放地址',
             'match'     => 'option',
             //'update'    => 'text',
-            'list'      => true,
+            //'list'      => true,
         ),
 
         'url_mp4'      => array
@@ -138,7 +139,7 @@ return array
             'desc'      => '直播回放地址',
             'match'     => 'option',
             //'update'    => 'text',
-            'list'      => true,
+            //'list'      => true,
         ),
 
         'state'     => array

+ 28 - 1
live/lib/Cron.php

@@ -10,7 +10,12 @@ class Cron
 
     }
 
-    # 定时获取 所有流的状态
+    public function getUrl_api()
+    {
+
+    }
+
+    # 定时获取 所有流的状态 获取推流地址、拉流地址、推流历史等
     public function getStream()
     {
         $data = Dever::db('live/stream')->state();
@@ -24,4 +29,26 @@ class Cron
 
         return 'yes';
     }
+
+    # 定时获取 所有的直播视频的回放地址
+    public function getUrl()
+    {
+        $table = Dever::config('base', 'live')->video;
+        $data = Dever::db($table)->state();
+
+        if ($data) {
+            $time = time();
+            foreach ($data as $k => $v) {
+                if ($v['stream_id'] > 0 && !$v['url_m3u8'] && $v['sdate'] > 0 && $v['edate'] > 0 && $time >= $v['edate']) {
+                    $info = Dever::db('live/stream')->one($v['stream_id']);
+                    $config = Dever::db('live/info')->one($info['live_id']);
+                    $method = $this->method($config);
+                    $handle = new Handle();
+                    $handle->createUrlOne($v, $table, $method, $config, $info);
+                }
+            }
+        }
+
+        return 'yes';
+    }
 }

+ 96 - 33
live/lib/Handle.php

@@ -44,13 +44,13 @@ class Handle
 
         Dever::db('live/stream')->update($info_update);
 
-        Dever::db('live/stream_log')->update(array('edate' => time(), 'where_id' => $log_id));
+        Dever::db('live/stream_ios_log')->update(array('edate' => time(), 'where_id' => $log_id));
 
         return true;
     }
 
-    # 建立直播日志
-    public function saveLog($id, $log_id = false, $table = false)
+    # 建立ios直播日志
+    public function saveIosLog($id, $log_id = false, $table = false)
     {
         $info = Dever::db('live/stream')->one($id);
 
@@ -60,42 +60,53 @@ class Handle
             $data['stream_id'] = $id;
             $data['live_id'] = $info['live_id'];
             $data['active_id'] = $info['active_id'];
-            $id = Dever::db('live/stream_log')->insert($data);
+            $id = Dever::db('live/stream_ios_log')->insert($data);
         } else {
 
             $config = Dever::db('live/info')->one($info['live_id']);
-            $log = Dever::db('live/stream_log')->one($log_id);
+            $log = Dever::db('live/stream_ios_log')->one($log_id);
             $method = $this->method($config);
             $log['sdate'] = intval($log['sdate']);
             $log['edate'] = intval($log['edate']);
-            $data['url_m3u8'] = $config['host'] . $method->save($info['key'],$log['sdate'], $log['edate']);
-            $data['url_mp4'] = $config['host'] . $method->save($info['key'], $log['sdate'], $log['edate'], 'mp4');
+            $data['url_m3u8'] = $config['host'] . $method->save($info['key'],0, $log['edate']);
+            $data['url_mp4'] = $config['host'] . $method->save($info['key'], 0, $log['edate'], 'mp4');
             $data['where_id'] = $log_id;
-            Dever::db('live/stream_log')->update($data);
+            Dever::db('live/stream_ios_log')->update($data);
             $id = $log_id;
 
             if ($table) {
-                $data = Dever::db($table)->state(array('stream_id' => $info['id']));
-                if ($data) {
-                    foreach ($data as $k => $v) {
-                        if (!$v['url_m3u8'] && $v['sdate'] > 0 && $v['edate'] > 0) {
-
-                            $v['sdate'] = intval($v['sdate']);
-                            $v['edate'] = intval($v['edate']);
-
-                            $url_m3u8 = $config['host'] . $method->save($info['key'],$v['sdate'], $v['edate']);
-                            $url_mp4 = $config['host'] . $method->save($info['key'], $v['sdate'], $v['edate'], 'mp4');
-
-                            Dever::db($table)->update(array('where_id' => $v['id'], 'url_m3u8' => $url_m3u8, 'url_mp4' => $url_mp4));
-                        }
-                    }
-                }
+                $this->createUrl($table, $method, $config, $info);
             }
         }
         
         return $id;
     }
 
+    # 生成回放地址
+    public function createUrl($table, $method, $config, $info)
+    {
+        $data = Dever::db($table)->state(array('stream_id' => $info['id']));
+        if ($data) {
+            foreach ($data as $k => $v) {
+                $this->createUrlOne($v, $table, $method, $config, $info);
+            }
+        }
+    }
+
+    public function createUrlOne($data, $table, $method, $config, $info)
+    {
+        if (!$data['url_m3u8'] && $data['sdate'] > 0 && $data['edate'] > 0) {
+
+            $data['sdate'] = intval($data['sdate']);
+            $data['edate'] = intval($data['edate']);
+
+            $url_m3u8 = $config['host'] . $method->save($info['key'],$data['sdate'], $data['edate']);
+            $url_mp4 = $config['host'] . $method->save($info['key'], $data['sdate'], $data['edate'], 'mp4');
+
+            Dever::db($table)->update(array('where_id' => $data['id'], 'url_m3u8' => $url_m3u8, 'url_mp4' => $url_mp4));
+        }
+    }
+
     # 开始直播
     public function startLive($id)
     {
@@ -140,9 +151,19 @@ class Handle
             $stream = $method->getInfo($info['key']);
         }
 
-        $rtmp = $method->getRtmp($info['key'], $info['times'] * 3600);
+        # 根据上次得到推流地址的时间计算下次应该得到的地址
+        if (!$info['live_date']) {
+            $info['live_date'] = 0;
+        }
+        $time = time();
+        $num = $info['times'];
+        if ($time - $info['live_date'] > $num) {
+            $rtmp = $method->getRtmp($info['key'], $info['times'] * 3600);
+        }
 
-        $url = $method->getPlay($info['key']);
+        if (!$info['url_rtmp']) {
+            $url = $method->getPlay($info['key']);
+        }
 
         $status = array();
         $history = array();
@@ -160,16 +181,39 @@ class Handle
         }
 
         $data['where_id'] = $info['id'];
-        $data['live'] = $rtmp;
-        $data['url_rtmp'] = $url['rtmp'];
-        $data['url_hls'] = $url['hls'];
-        $data['url_hdl'] = $url['hdl'];
-        $data['url_pic'] = $url['pic'];
+        if (isset($rtmp) && $rtmp) {
+            $data['live'] = $rtmp;
+            $data['live_date'] = $time;
+        }
+        
+        if (isset($url) && isset($url['rtmp']) && $url['rtmp']) {
+            $data['url_rtmp'] = $url['rtmp'];
+            $data['url_hls'] = $url['hls'];
+            $data['url_hdl'] = $url['hdl'];
+            $data['url_pic'] = $url['pic'];
+        }
 
         $live = Dever::json_decode($info['info']);
-        $live['info'] = $stream;
-        $live['live'] = $status;
-        $live['hitory'] = $history;
+
+        # 直播信息
+        if ($stream) {
+            $live['info'] = $stream;
+        }
+        
+        # 直播状态
+        if ($status) {
+            $live['live'] = $status;
+        }
+
+        # 直播历史
+        if ($history) {
+            $live['history'] = $history;
+            if (isset($history['items']) && $history['items']) {
+                foreach ($history['items'] as $k => $v) {
+                    $this->saveLog($info['id'], $v['start'], $v['end']);
+                }
+            }
+        }
 
         if ($status) {
             $data['status'] = 2;
@@ -183,4 +227,23 @@ class Handle
 
         return $data;
     }
+
+    # 建立直播日志
+    public function saveLog($id, $sdate, $edate)
+    {
+        $info = Dever::db('live/stream')->one($id);
+
+        $data['sdate'] = $sdate;
+        $data['edate'] = $edate;
+        $data['stream_id'] = $id;
+        $data['live_id'] = $info['live_id'];
+        $data['active_id'] = $info['active_id'];
+        $log = Dever::db('live/stream_log')->one($data);
+
+        if (!$log) {
+            $id = Dever::db('live/stream_log')->insert($data);
+        }
+        
+        return $id;
+    }
 }

+ 7 - 3
live/lib/Manage.php

@@ -32,6 +32,7 @@ class Manage
             $data['name'] = $name;
             $data['active_id'] = $active_id;
             $data['live_id'] = $live_id;
+            $data['times'] = 1;
             $id = Dever::db('live/stream')->insert($data);
         } else {
             $id = $info['id'];
@@ -82,6 +83,7 @@ class Manage
         $table['标清地址'] = $info['url_hls'];
         $table['普清地址'] = $info['url_hdl'];
         $table['截图地址'] = $info['url_pic'];
+        $table['直播时长'] = $info['times'] . '小时';
         return Dever::table($table);
     }
 
@@ -110,14 +112,16 @@ class Manage
                 $table['视频帧率'] = $data['live']['fps']['video'];
                 $table['数据帧率'] = $data['live']['fps']['data'];
 
-            } 
-            if (isset($data['history']) && $data['history']) {
+            }
+            /*
+            if (isset($data['history']) && $data['history'] && isset($data['history']['items']) && $data['history']['items']) {
                 $history = array();
-                foreach ($data['history'] as $k => $v) {
+                foreach ($data['history']['items'] as $k => $v) {
                     $history['第' . ($k+1) . '次直播'] = date('Y-m-d H:i:s', $v['start']) . '~' . date('Y-m-d H:i:s', $v['end']);
                 }
                 $table['直播历史'] = Dever::table($history);
             }
+            */
         }
         
         return Dever::table($table);

+ 4 - 3
live/src/Api.php

@@ -25,7 +25,7 @@ class Api
 
         if ($data) {
             foreach ($data as $k => $v) {
-                $data[$k]['stream'] = Dever::db('live/stream')->getAll();
+                $data[$k]['stream'] = Dever::db('live/stream')->getAll(array('live_id' => $v['id']));
                 if ($data[$k]['stream']) {
                 	foreach ($data[$k]['stream'] as $k1 => $v1) {
                 		if (!$v1['url_rtmp']) {
@@ -52,7 +52,7 @@ class Api
         $handle->startLive($id);
 
         # 建立一个推流日志
-        $log_id = $handle->saveLog($id);
+        $log_id = $handle->saveIosLog($id);
 
         return array('id' => $id, 'log_id' => $log_id);
     }
@@ -90,7 +90,8 @@ class Api
         	Dever::alert('错误的id');
         }
         $handle = new Handle();
-        $handle->saveLog($id, $log_id, 'video/live');
+        $table = Dever::config('base', 'live')->video;
+        $handle->saveIosLog($id, $log_id, $table);
 
         # 获取这个流对应的直播信息
         

+ 1 - 0
tag/database/info.php

@@ -120,6 +120,7 @@ return array
 				'cate_id' => 'yes',
 				'name' => array('yes', 'like'),
 				'id' => 'yes',
+				'state' => 1,
 			),
 			'type' => 'all',
 			'order' => array('reorder' => 'desc', 'id' => 'desc'),

+ 9 - 4
tag/lib/Core.php

@@ -16,15 +16,20 @@ class Core
         if ($tag && $id > 0 && $source_table) {
             $tag = explode(',', $tag);
             foreach ($tag as $k => $v) {
-                if (!$v) {
+                if (!$v || $v == 'null') {
                     unset($tag[$k]);
                     continue;
                 }
                 $info = Dever::db('tag/info')->one($v);
                 if (!$info) {
-                    $insert['name'] = $v;
-                    $tag_id = Dever::db('tag/info')->insert($insert);
-                    $tag[$k] = $tag_id;
+                    if ($v) {
+                        $insert['name'] = $v;
+                        $tag_id = Dever::db('tag/info')->insert($insert);
+                        $tag[$k] = $tag_id;
+                    } else {
+                        unset($tag[$k]);
+                        continue;
+                    }
                 } else {
                     $tag_id = $v;
                 }

+ 1 - 1
video/database/live.php

@@ -299,7 +299,7 @@ return array
 			'update'	=> 'date',
 			'callback'	=> 'maketime',
 			'insert'	=> true,
-			'list'		=> 'date("Y-m-d H:i:s", {pdate})',
+			//'list'		=> 'date("Y-m-d H:i:s", {pdate})',
 			'auth'		=> '"{pdate}" > 0',
 		),
 

+ 1 - 1
video/database/vod.php

@@ -256,7 +256,7 @@ return array
 			'update'	=> 'date',
 			'callback'	=> 'maketime',
 			'insert'	=> true,
-			'list'		=> 'date("Y-m-d H:i:s", {pdate})',
+			//'list'		=> 'date("Y-m-d H:i:s", {pdate})',
 			'auth'		=> '"{pdate}" > 0',
 		),