Merge pull request #11 from wonipapa/devel

Devel
This commit is contained in:
wonipapa 2017-05-19 10:53:27 +09:00 committed by GitHub
commit f2de01405e
5 changed files with 1545 additions and 125 deletions

View File

@ -1,17 +1,23 @@
# EPG2XML # EPG2XML
이 프로그램은 EPG(Electronic Program Guide)를 웹상의 여러 소스에서 가져와서 XML로 출력하는 프로그램으로 python2 및 php5 Cli에서 사용 가능하도록 제작되었다. 이 프로그램은 EPG(Electronic Program Guide)를 웹상의 여러 소스에서 가져와서 XML로 출력하는 프로그램으로 python2.7 및 php5.6.3 이상에서 사용 가능하도록 제작되었다.
기본적으로 외부의 소스를 분석하여 출력하므로 외부 소스 사이트가 변경되거나 삭제되면 문제가 발생할 수 있다.
python 3과 php 5.6.3 이하에서는 정상적인 작동을 보장하지 못한다.
또한 외부의 소스를 분석하여 EPG 정보를 가공하여 보여주는 것이므로 외부 소스 사이트가 변경되거나 삭제되면 문제가 발생할 수 있다.
## 필요 모듈 ## 필요 모듈
### EPG2XML.PY ### epg2xml.py
BeautifulSoup(bs4), lxml, requests 모듈이 추가로 필요하다. BeautifulSoup(bs4), lxml, requests 모듈이 추가로 필요하다.
설치 OS별로 모듈을 설치하기 위한 사전 설치 방법이 다를 수도 있으므로 검색해서 설치하도록 한다. 설치 OS별로 모듈을 설치하기 위한 사전 설치 방법이 다를 수도 있으므로 검색해서 설치하도록 한다.
synology의 경우 파이썬 모듈을 설치하면 easy_install beautifulsoup, easy_install lxml, easy_install requests 로 추가할 수 있다. synology의 경우 파이썬 모듈을 설치하면 easy_install beautifulsoup, easy_install lxml, easy_install requests 로 추가할 수 있다.
### EPG2XML.php ### epg2xml.php
json, dom, mbstring, openssl 모듈이 필요하다. json, dom, mbstring, openssl, curl 모듈이 필요하다. 일반적으로 PHP가 설치되어 있다면 대부분 설치되어 있는 모듈이나 설치되어 있지 않을 경우 추가로 설치해야 한다.
### epg2xml-web.php
epg2xml.php와 동일
## 설정방법 ## 설정방법
epg2xml.json 안의 항목이 설정 가능한 항목이다. epg2xml.json 안의 항목이 설정 가능한 항목이다.
@ -32,6 +38,7 @@ Channel.json 파일을 텍스트 편집기로 열어보면 각채널별 정보
삭제된 채널등으로 인해서 오류 발생시에도 Enabled:0으로 변경하면 오류 발생을 차단할 수 있다. 삭제된 채널등으로 인해서 오류 발생시에도 Enabled:0으로 변경하면 오류 발생을 차단할 수 있다.
## 옵션 소개 ## 옵션 소개
### epg2xml.py, epg2xml.php 옵션
실행시 사용가능한 인수는 --help 명령어로 확인이 가능하다 실행시 사용가능한 인수는 --help 명령어로 확인이 가능하다
epg2xml.json의 설정을 옵션의 인수를 이용하여 변경할 수 있다. epg2xml.json의 설정을 옵션의 인수를 이용하여 변경할 수 있다.
<pre> <pre>
@ -48,10 +55,15 @@ epg2xml.json의 설정을 옵션의 인수를 이용하여 변경할 수 있다.
--verbose : EPG 정보 상세하게 표기 ex) --verbose y --verbose : EPG 정보 상세하게 표기 ex) --verbose y
</pre> </pre>
### epg2xml-web.php 옵션
실행시 사용가능한 인수는 epg2xml.php?help 명령어로 확인이 가능하다
epg2xml.json의 설정을 옵션의 인수를 이용하여 변경할 수 있다.
ex : http://domain/epg2xml.php?i=ALL&l=2
## 사용방법 ## 사용방법
### tv_grab_file 사용시 (https://github.com/neo365/tvheadend-for-Korea) ### tv_grab_file 사용시 (https://github.com/nurtext/tv_grab_file_synology)
epg2xml tv_grab_file 안의 cat xmltv.xml 또는 wget 부분을 아래와 같이 변경해준다. tv_grab_file 안의 cat xmltv.xml 또는 wget 부분을 아래와 같이 변경해준다.
#### PYTHON의 경우 #### PYTHON의 경우
<pre> <pre>
@ -59,7 +71,7 @@ epg2xml tv_grab_file 안의 cat xmltv.xml 또는 wget 부분을 아래와 같이
/home/hts/epg2xml.py /home/hts/epg2xml.py
</pre> </pre>
#### PHP의 경우 #### PHP CLI의 경우
<pre> <pre>
/usr/bin/php /home/hts/epg2xml.php 또는 /usr/bin/php /home/hts/epg2xml.php 또는
/home/hts/epg2xml.php /home/hts/epg2xml.php
@ -74,12 +86,16 @@ epg2xml tv_grab_file 안의 cat xmltv.xml 또는 wget 부분을 아래와 같이
/home/hts/epg2xml.py /home/hts/epg2xml.py
</pre> </pre>
#### PHP의 경우 #### PHP CLI의 경우
<pre> <pre>
/usr/bin/php /home/hts/epg2xml.php 또는 /usr/bin/php /home/hts/epg2xml.php 또는
/home/hts/epg2xml.php /home/hts/epg2xml.php
</pre> </pre>
### PHP WEB의 경우
<pre>
http://domain/epg2xml.php 또는
http://domain/epg2xml.php?i=ALL&l=2
</pre>
## 라이센스 ## 라이센스
BSD BSD

1312
epg2xml-web.php Normal file

File diff suppressed because it is too large Load Diff

View File

@ -1,9 +1,9 @@
#!/usr/bin/env php #!/usr/bin/env php
<?php <?php
error_reporting(0);
@date_default_timezone_set('Asia/Seoul'); @date_default_timezone_set('Asia/Seoul');
error_reporting(E_ALL ^ E_NOTICE);
define("VERSION", "1.1.8"); if (PHP_SAPI != "cli") header("Content-Type: application/xml; charset=utf-8");
define("VERSION", "1.1.9");
$debug = False; $debug = False;
$ua = "User-Agent: 'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36', accept: '*/*'"; $ua = "User-Agent: 'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36', accept: '*/*'";
@ -16,6 +16,32 @@ define("SOCKET_ERROR", "소켓 파일을 찾을 수 없습니다.");
define("JSON_FILE_ERROR", "json 파일이 없습니다."); define("JSON_FILE_ERROR", "json 파일이 없습니다.");
define("JSON_SYNTAX_ERROR", "json 파일 형식이 잘못되었습니다."); define("JSON_SYNTAX_ERROR", "json 파일 형식이 잘못되었습니다.");
if(version_compare(PHP_VERSION, '5.6.3','<')) :
printError("PHP 버전은 5.6.3 이상이어야 합니다.");
printError("현재 PHP 버전은 ".PHP_VERSION." 입니다.");
exit;
endif;
if (!extension_loaded('json')) :
printError("json 모듈이 설치되지 않았습니다.");
exit;
endif;
if (!extension_loaded('dom')) :
printError("dom 모듈이 설치되지 않았습니다.");
exit;
endif;
if (!extension_loaded('mbstring')) :
printError("mbstring 모듈이 설치되지 않았습니다.");
exit;
endif;
if (!extension_loaded('openssl')) :
printError("openssl 모듈이 설치되지 않았습니다.");
exit;
endif;
if (!extension_loaded('curl')) :
printError("curl 모듈이 설치되지 않았습니다.");
exit;
endif;
//사용방법 //사용방법
$usage = <<<USAGE $usage = <<<USAGE
usage: epg2xml.php [-h] -i {ALL, KT,LG,SK} usage: epg2xml.php [-h] -i {ALL, KT,LG,SK}
@ -25,7 +51,7 @@ USAGE;
//도움말 //도움말
$help = <<<HELP $help = <<<HELP
usage: epg2xml.py [-h] -i {ALL, KT,LG,SK} usage: epg2xml.php [-h] -i {ALL, KT,LG,SK}
(-v | -d | -o [xmltv.xml] | -s [xmltv.sock]) [-l 1-7] (-v | -d | -o [xmltv.xml] | -s [xmltv.sock]) [-l 1-7]
[--icon http://www.example.com/icon] [--verbose y, n] [--icon http://www.example.com/icon] [--verbose y, n]
EPG 정보를 출력하는 방법을 선택한다 EPG 정보를 출력하는 방법을 선택한다
@ -69,10 +95,10 @@ $longargs = array(
); );
$args = getopt($shortargs, $longargs); $args = getopt($shortargs, $longargs);
if($args['h'] === False || $args['help'] === False)://도움말 출력 if((isset($args['h']) && $args['h'] === False) || (isset($args['help']) && $args['help'] === False))://도움말 출력
printf($help); printf($help);
exit; exit;
elseif($args['v'] === False || $args['version'] === False)://버전 정보 출력 elseif((isset($args['v']) && $args['v'] === False) || (isset($args['version']) && $args['version'] === False))://버전 정보 출력
printf("epg2xml.php version : %s\n", VERSION); printf("epg2xml.php version : %s\n", VERSION);
exit; exit;
else : else :
@ -97,15 +123,15 @@ else :
$default_verbose = $Settings['default_verbose']; $default_verbose = $Settings['default_verbose'];
if(!empty($args['i'])) $MyISP = $args['i']; if(!empty($args['i'])) $MyISP = $args['i'];
if($args['d'] === False || $args['display'] === False ) : if((isset($args['d']) && $args['d'] === False) || (isset($args['display']) && $args['display'] === False) ) :
if($args['o'] || $args['outfile'] || $args['s'] || $args['socket']) : if(isset($args['o']) || isset($args['outfile']) || isset($args['s']) || isset($args['socket'])) :
printf($usage); printf($usage);
printf("epg2xml.php: error: one of the arguments -v/--version -d/--display -o/--outfile -s/--socket is required\n"); printf("epg2xml.php: error: one of the arguments -v/--version -d/--display -o/--outfile -s/--socket is required\n");
exit; exit;
endif; endif;
$default_output = "d"; $default_output = "d";
elseif(empty($args['o']) === False || empty($args['outfile']) === False) : elseif(empty($args['o']) === False || empty($args['outfile']) === False) :
if($args['d'] === False || $args['display'] === False || $args['s'] || $args['socket']) : if((isset($args['d']) && $args['d'] === False) || (isset($args['display']) && $args['display'] === False) || isset($args['s']) || isset($args['socket'])) :
print($usage); print($usage);
print("epg2xml.php: error: one of the arguments -v/--version -d/--display -o/--outfile -s/--socket is required\n"); print("epg2xml.php: error: one of the arguments -v/--version -d/--display -o/--outfile -s/--socket is required\n");
exit; exit;
@ -113,7 +139,7 @@ else :
$default_output = "o"; $default_output = "o";
$default_xml_file = $args['o'] ?: $args['outfile']; $default_xml_file = $args['o'] ?: $args['outfile'];
elseif(empty($args['s']) === False || empty($args['socket']) === False) : elseif(empty($args['s']) === False || empty($args['socket']) === False) :
if($args['d'] === False || $args['display'] === False || $args['o'] || $args['outfile']) : if((isset($args['d']) && $args['d'] === False) || (isset($args['display']) && $args['display'] === False) || isset($args['o']) || isset($args['outfile'])) :
print($usage); print($usage);
print("epg2xml.php: error: one of the arguments -v/--version -d/--display -o/--outfile -s/--socket is required\n"); print("epg2xml.php: error: one of the arguments -v/--version -d/--display -o/--outfile -s/--socket is required\n");
exit; exit;
@ -217,7 +243,7 @@ else :
printError($e->getMessage()); printError($e->getMessage());
exit; exit;
} }
endif; endif;
if($output == "display") : if($output == "display") :
$fp = fopen('php://output', 'w+'); $fp = fopen('php://output', 'w+');
@ -275,6 +301,7 @@ function getEPG() {
$fp = $GLOBALS['fp']; $fp = $GLOBALS['fp'];
$MyISP = $GLOBALS['MyISP']; $MyISP = $GLOBALS['MyISP'];
$Channelfile = __DIR__."/Channel.json"; $Channelfile = __DIR__."/Channel.json";
$IconUrl = "";
try { try {
$f = @file_get_contents($Channelfile); $f = @file_get_contents($Channelfile);
if($f === False) : if($f === False) :
@ -376,13 +403,6 @@ function GetEPGFromEPG($ChannelInfo) {
$ChannelName = $ChannelInfo[1]; $ChannelName = $ChannelInfo[1];
$ServiceId = $ChannelInfo[3]; $ServiceId = $ChannelInfo[3];
$epginfo = array(); $epginfo = array();
$options = array(
'http' => array(
'method' => 'GET',
'header'=> $GLOBALS['ua']
));
$context = stream_context_create($options);
$epginfo = array();
foreach(range(1, $GLOBALS['period']) as $k) : foreach(range(1, $GLOBALS['period']) as $k) :
$url = "http://www.epg.co.kr/epg-cgi/extern/cnm_guide_type_v070530.cgi"; $url = "http://www.epg.co.kr/epg-cgi/extern/cnm_guide_type_v070530.cgi";
$day = date("Ymd", strtotime("+".($k - 1)." days")); $day = date("Ymd", strtotime("+".($k - 1)." days"));
@ -395,7 +415,7 @@ function GetEPGFromEPG($ChannelInfo) {
$params = http_build_query($params); $params = http_build_query($params);
$url = $url."?".$params; $url = $url."?".$params;
try { try {
$response = @file_get_contents($url, False, $context); $response = getWeb($url);
if ($response === False && $GLOBALS['debug']) : if ($response === False && $GLOBALS['debug']) :
printError($ChannelName.HTTP_ERROR); printError($ChannelName.HTTP_ERROR);
else : else :
@ -430,18 +450,25 @@ function GetEPGFromEPG($ChannelInfo) {
break; break;
endswitch; endswitch;
$startTime = date("YmdHis", strtotime($thisday." ".$hour)); $startTime = date("YmdHis", strtotime($thisday." ".$hour));
$programName = "";
$subprogramName = "";
$rating = 0;
$episode = "";
$rebroadcast = False;
preg_match('/<td height="25" valign="top">?(.*<a.*?">)?(.*?)\s*(&lt;(.*)&gt;)?\s*(\(재\))?\s*(\(([\d,]+)회\))?(<img.*?)?(<\/a>)?\s*<\/td>/', trim($dom->saveHTML($program)), $matches); preg_match('/<td height="25" valign="top">?(.*<a.*?">)?(.*?)\s*(&lt;(.*)&gt;)?\s*(\(재\))?\s*(\(([\d,]+)회\))?(<img.*?)?(<\/a>)?\s*<\/td>/', trim($dom->saveHTML($program)), $matches);
if ($matches != NULL) : if ($matches != NULL) :
if(isset($matches[2])) $programName = trim($matches[2]) ?: "";
if(isset($matches[4])) $subprogramName = trim($matches[4]) ?: "";
if(isset($matches[5])) $rebroadcast = $matches[5] ? True : False;
if(isset($matches[7])) $episode = $matches[7] ?: "";
if(isset($matches[8])) :
$image = $matches[8] ? $matches[8] : ""; $image = $matches[8] ? $matches[8] : "";
preg_match('/.*schedule_([\d,]+)?.*/', $image, $grade); preg_match('/.*schedule_([\d,]+)?.*/', $image, $grade);
if($grade != NULL) : if($grade != NULL) $rating = $grade[1];
$rating = $grade[1];
else :
$rating = 0;
endif; endif;
endif; endif;
//programName, startTime, rating, subprogramName, rebroadcast, episode //programName, startTime, rating, subprogramName, rebroadcast, episode
$epginfo[] = array(trim($matches[2]), $startTime, $rating, trim($matches[4]), $matches[5], $matches[7]); $epginfo[] = array($programName, $startTime, $rating, $subprogramName, $rebroadcast, $episode );
endforeach; endforeach;
endfor; endfor;
endif; endif;
@ -459,7 +486,7 @@ function GetEPGFromEPG($ChannelInfo) {
$actors = ""; $actors = "";
$producers = ""; $producers = "";
$category = ""; $category = "";
$rebroadcast = $epg[0][4] ? True : False; $rebroadcast = $epg[0][4];
$episode = $epg[0][5] ?: ""; $episode = $epg[0][5] ?: "";
$rating = $epg[0][2] ?: 0; $rating = $epg[0][2] ?: 0;
$programdata = array( $programdata = array(
@ -486,13 +513,6 @@ function GetEPGFromKT($ChannelInfo) {
$ChannelName = $ChannelInfo[1]; $ChannelName = $ChannelInfo[1];
$ServiceId = $ChannelInfo[3]; $ServiceId = $ChannelInfo[3];
$epginfo = array(); $epginfo = array();
$options = array(
'http' => array(
'method' => 'GET',
'header'=> $GLOBALS['ua']
));
$context = stream_context_create($options);
$epginfo = array();
foreach(range(1, $GLOBALS['period']) as $k) : foreach(range(1, $GLOBALS['period']) as $k) :
$url = "http://tv.olleh.com/renewal_sub/liveTv/pop_schedule_week.asp"; $url = "http://tv.olleh.com/renewal_sub/liveTv/pop_schedule_week.asp";
$day = date("Ymd", strtotime("+".($k - 1)." days")); $day = date("Ymd", strtotime("+".($k - 1)." days"));
@ -506,7 +526,7 @@ function GetEPGFromKT($ChannelInfo) {
$params = http_build_query($params); $params = http_build_query($params);
$url = $url."?".$params; $url = $url."?".$params;
try { try {
$response = @file_get_contents($url, False, $context); $response = getWeb($url);
if ($response === False && $GLOBALS['debug']) : if ($response === False && $GLOBALS['debug']) :
printError($ChannelName.HTTP_ERROR); printError($ChannelName.HTTP_ERROR);
else : else :
@ -534,9 +554,9 @@ function GetEPGFromKT($ChannelInfo) {
$programName = ""; $programName = "";
$subprogramName = ""; $subprogramName = "";
preg_match('/^(.*?)( <(.*)>)?$/', $epg[0][0], $matches); preg_match('/^(.*?)( <(.*)>)?$/', $epg[0][0], $matches);
if($matches) : if ($matches != NULL) :
$programName = $matches[1] ?: ""; if(isset($matches[1])) $programName = $matches[1] ?: "";
$subprogramName = $matches[3] ?: ""; if(isset($matches[3])) $subprogramName = $matches[3] ?: "";
endif; endif;
$startTime = $epg[0][1] ?: ""; $startTime = $epg[0][1] ?: "";
$endTime = $epg[1][1] ?: ""; $endTime = $epg[1][1] ?: "";
@ -571,13 +591,6 @@ function GetEPGFromLG($ChannelInfo) {
$ChannelName = $ChannelInfo[1]; $ChannelName = $ChannelInfo[1];
$ServiceId = $ChannelInfo[3]; $ServiceId = $ChannelInfo[3];
$epginfo = array(); $epginfo = array();
$options = array(
'http' => array(
'method' => 'GET',
'header'=> $GLOBALS['ua']
));
$context = stream_context_create($options);
$epginfo = array();
foreach(range(1, $GLOBALS['period']) as $k) : foreach(range(1, $GLOBALS['period']) as $k) :
$url = "http://www.uplus.co.kr/css/chgi/chgi/RetrieveTvSchedule.hpi"; $url = "http://www.uplus.co.kr/css/chgi/chgi/RetrieveTvSchedule.hpi";
$day = date("Ymd", strtotime("+".($k - 1)." days")); $day = date("Ymd", strtotime("+".($k - 1)." days"));
@ -588,7 +601,7 @@ function GetEPGFromLG($ChannelInfo) {
$params = http_build_query($params); $params = http_build_query($params);
$url = $url."?".$params; $url = $url."?".$params;
try { try {
$response = @file_get_contents($url, False, $context); $response = getWeb($url);
if ($response === False && $GLOBALS['debug']) : if ($response === False && $GLOBALS['debug']) :
printError($ChannelName.HTTP_ERROR); printError($ChannelName.HTTP_ERROR);
else : else :
@ -618,16 +631,23 @@ function GetEPGFromLG($ChannelInfo) {
$zipped = array_slice(array_map(NULL, $epginfo, array_slice($epginfo,1)),0,-1); $zipped = array_slice(array_map(NULL, $epginfo, array_slice($epginfo,1)),0,-1);
foreach($zipped as $epg) : foreach($zipped as $epg) :
preg_match('/(<재>?)?(.*?)(\[(.*)\])?\s?(\(([\d,]+)회\))?$/', $epg[0][0], $matches); preg_match('/(<재>?)?(.*?)(\[(.*)\])?\s?(\(([\d,]+)회\))?$/', $epg[0][0], $matches);
$programName = trim($matches[2]) ?: ""; $programName = "";
$subprogramName = trim($matches[4]) ?: ""; $subprogramName = "";
$episode = "";
$rebroadcast = False;
if ($matches != NULL) :
if(isset($matches[2])) $programName = trim($matches[2]) ?: "";
if(isset($matches[4])) $subprogramName = trim($matches[4]) ?: "";
if(isset($matches[6])) $episode = trim($matches[6]) ?: "";
if(isset($matches[1])) $rebroadcast = trim($matches[1]) ? True: False;
endif;
$startTime = $epg[0][1] ?: ""; $startTime = $epg[0][1] ?: "";
$endTime = $epg[1][1] ?: ""; $endTime = $epg[1][1] ?: "";
$desc = ""; $desc = "";
$actors = ""; $actors = "";
$producers = ""; $producers = "";
$category = $epg[0][3] ?: ""; $category = $epg[0][3] ?: "";
$rebroadcast = trim($matches[1]) ? True: False;
$episode = trim($matches[6]) ?: "";
$rating = $epg[0][2] ?: 0; $rating = $epg[0][2] ?: 0;
$programdata = array( $programdata = array(
'channelId'=> $ChannelId, 'channelId'=> $ChannelId,
@ -654,12 +674,6 @@ function GetEPGFromSK($ChannelInfo) {
$ServiceId = $ChannelInfo[3]; $ServiceId = $ChannelInfo[3];
$today = date("Ymd"); $today = date("Ymd");
$lastday = date("Ymd", strtotime("+".($GLOBALS['period'] - 1)." days")); $lastday = date("Ymd", strtotime("+".($GLOBALS['period'] - 1)." days"));
$options = array(
'http' => array(
'method' => 'GET',
'header'=> $GLOBALS['ua']
));
$context = stream_context_create($options);
$url = "http://m.btvplus.co.kr/Common/Inc/IFGetData.asp"; $url = "http://m.btvplus.co.kr/Common/Inc/IFGetData.asp";
$params = array( $params = array(
'variable' => 'IF_LIVECHART_DETAIL', 'variable' => 'IF_LIVECHART_DETAIL',
@ -668,7 +682,7 @@ function GetEPGFromSK($ChannelInfo) {
$params = http_build_query($params); $params = http_build_query($params);
$url = $url."?".$params; $url = $url."?".$params;
try { try {
$response = @file_get_contents($url, False, $context); $response = getWeb($url);
if ($response === False && $GLOBALS['debug']) : if ($response === False && $GLOBALS['debug']) :
printError($ChannelName.HTTP_ERROR); printError($ChannelName.HTTP_ERROR);
else : else :
@ -688,10 +702,10 @@ function GetEPGFromSK($ChannelInfo) {
$rebroadcast = False; $rebroadcast = False;
preg_match('/^(.*?)(?:\s*[\(<]([\d,회]+)[\)>])?(?:\s*<([^<]*?)>)?(\((재)\))?$/', str_replace('...', '>', $program['programName']), $matches); preg_match('/^(.*?)(?:\s*[\(<]([\d,회]+)[\)>])?(?:\s*<([^<]*?)>)?(\((재)\))?$/', str_replace('...', '>', $program['programName']), $matches);
if ($matches != NULL) : if ($matches != NULL) :
$programName = trim($matches[1]) ?: ""; if(isset($matches[1])) $programName = trim($matches[1]) ?: "";
$subprogramName = trim($matches[3]) ?: ""; if(isset($matches[3])) $subprogramName = trim($matches[3]) ?: "";
$episode = str_replace("", "", $matches[2]) ?: ""; if(isset($matches[2])) $episode = str_replace("", "", $matches[2]) ?: "";
$rebroadcast = $matches[5] ? True : False; if(isset($matches[5])) $rebroadcast = $matches[5] ? True : False;
endif; endif;
$startTime = date("YmdHis",$program['startTime']/1000); $startTime = date("YmdHis",$program['startTime']/1000);
$endTime = date("YmdHis",$program['endTime']/1000); $endTime = date("YmdHis",$program['endTime']/1000);
@ -735,12 +749,6 @@ function GetEPGFromSKY($ChannelInfo) {
$ChannelId = $ChannelInfo[0]; $ChannelId = $ChannelInfo[0];
$ChannelName = $ChannelInfo[1]; $ChannelName = $ChannelInfo[1];
$ServiceId = $ChannelInfo[3]; $ServiceId = $ChannelInfo[3];
$options = array(
'http' => array(
'method' => 'POST',
'header'=> $GLOBALS['ua']
));
$context = stream_context_create($options);
foreach(range(1, $GLOBALS['period']) as $k) : foreach(range(1, $GLOBALS['period']) as $k) :
$url = "http://www.skylife.co.kr/channel/epg/channelScheduleListJson.do"; $url = "http://www.skylife.co.kr/channel/epg/channelScheduleListJson.do";
$day = date("Y-m-d", strtotime("+".($k - 1)." days")); $day = date("Y-m-d", strtotime("+".($k - 1)." days"));
@ -753,7 +761,7 @@ function GetEPGFromSKY($ChannelInfo) {
$params = http_build_query($params); $params = http_build_query($params);
$url = $url."?".$params; $url = $url."?".$params;
try { try {
$response = @file_get_contents($url, False, $context); $response = getWeb($url);
if ($response === False && $GLOBALS['debug']) : if ($response === False && $GLOBALS['debug']) :
printError($ChannelName.HTTP_ERROR); printError($ChannelName.HTTP_ERROR);
else : else :
@ -815,12 +823,6 @@ function GetEPGFromNaver($ChannelInfo) {
$ChannelId = $ChannelInfo[0]; $ChannelId = $ChannelInfo[0];
$ChannelName = $ChannelInfo[1]; $ChannelName = $ChannelInfo[1];
$ServiceId = $ChannelInfo[3]; $ServiceId = $ChannelInfo[3];
$options = array(
'http' => array(
'method' => 'GET',
'header'=> $GLOBALS['ua']
));
$context = stream_context_create($options);
$epginfo = array(); $epginfo = array();
$totaldate = array(); $totaldate = array();
foreach(range(1, $GLOBALS['period']) as $k) : foreach(range(1, $GLOBALS['period']) as $k) :
@ -845,7 +847,7 @@ function GetEPGFromNaver($ChannelInfo) {
$params = http_build_query($params); $params = http_build_query($params);
$url = $url."?".$params; $url = $url."?".$params;
try { try {
$response = @file_get_contents($url, False, $context); $response = getWeb($url);
if ($response === False && $GLOBALS['debug']) : if ($response === False && $GLOBALS['debug']) :
printError($ChannelName.HTTP_ERROR); printError($ChannelName.HTTP_ERROR);
else : else :
@ -928,12 +930,6 @@ function GetEPGFromMbc($ChannelInfo) {
$ChannelId = $ChannelInfo[0]; $ChannelId = $ChannelInfo[0];
$ChannelName = $ChannelInfo[1]; $ChannelName = $ChannelInfo[1];
$ServiceId = $ChannelInfo[3]; $ServiceId = $ChannelInfo[3];
$options = array(
'http' => array(
'method' => 'GET',
'header'=> $GLOBALS['ua']
));
$context = stream_context_create($options);
$dayofweek = array('일', '월', '화', '수', '목', '금', '토'); $dayofweek = array('일', '월', '화', '수', '목', '금', '토');
foreach(range(1, $GLOBALS['period']) as $k) : foreach(range(1, $GLOBALS['period']) as $k) :
$url = "http://miniunit.imbc.com/Schedule"; $url = "http://miniunit.imbc.com/Schedule";
@ -944,7 +940,7 @@ function GetEPGFromMbc($ChannelInfo) {
$params = http_build_query($params); $params = http_build_query($params);
$url = $url."?".$params; $url = $url."?".$params;
try { try {
$response = @file_get_contents($url, False, $context); $response = getWeb($url);
if ($response === False && $GLOBALS['debug']) : if ($response === False && $GLOBALS['debug']) :
printError($ChannelName.HTTP_ERROR); printError($ChannelName.HTTP_ERROR);
else : else :
@ -1009,12 +1005,6 @@ function GetEPGFromMil($ChannelInfo) {
$ChannelId = $ChannelInfo[0]; $ChannelId = $ChannelInfo[0];
$ChannelName = $ChannelInfo[1]; $ChannelName = $ChannelInfo[1];
$ServiceId = $ChannelInfo[3]; $ServiceId = $ChannelInfo[3];
$options = array(
'http' => array(
'method' => 'GET',
'header'=> $GLOBALS['ua']
));
$context = stream_context_create($options);
foreach(range(1, $GLOBALS['period']) as $k) : foreach(range(1, $GLOBALS['period']) as $k) :
$url = "http://radio.dema.mil.kr/web/fm/quick/ajaxTimetableList.do"; $url = "http://radio.dema.mil.kr/web/fm/quick/ajaxTimetableList.do";
$day = date("Y-m-d", strtotime("+".($k - 1)." days")); $day = date("Y-m-d", strtotime("+".($k - 1)." days"));
@ -1024,7 +1014,7 @@ function GetEPGFromMil($ChannelInfo) {
$params = http_build_query($params); $params = http_build_query($params);
$url = $url."?".$params; $url = $url."?".$params;
try { try {
$response = @file_get_contents($url, False, $context); $response = getWeb($url);
if ($response === False && $GLOBALS['debug']) : if ($response === False && $GLOBALS['debug']) :
printError($ChannelName.HTTP_ERROR); printError($ChannelName.HTTP_ERROR);
else : else :
@ -1088,12 +1078,6 @@ function GetEPGFromIfm($ChannelInfo) {
$ChannelId = $ChannelInfo[0]; $ChannelId = $ChannelInfo[0];
$ChannelName = $ChannelInfo[1]; $ChannelName = $ChannelInfo[1];
$ServiceId = $ChannelInfo[3]; $ServiceId = $ChannelInfo[3];
$options = array(
'http' => array(
'method' => 'GET',
'header'=> $GLOBALS['ua']
));
$context = stream_context_create($options);
$dayofweek = array('1', '2', '3', '4', '5', '6', '7'); $dayofweek = array('1', '2', '3', '4', '5', '6', '7');
foreach(range(1, $GLOBALS['period']) as $k) : foreach(range(1, $GLOBALS['period']) as $k) :
$url = "http://mapp.itvfm.co.kr/hyb/front/selectHybPgmList.do"; $url = "http://mapp.itvfm.co.kr/hyb/front/selectHybPgmList.do";
@ -1105,7 +1089,7 @@ function GetEPGFromIfm($ChannelInfo) {
$params = http_build_query($params); $params = http_build_query($params);
$url = $url."?".$params; $url = $url."?".$params;
try { try {
$response = @file_get_contents($url, False, $context); $response = getWeb($url);
if ($response === False && $GLOBALS['debug']) : if ($response === False && $GLOBALS['debug']) :
printError($ChannelName.HTTP_ERROR); printError($ChannelName.HTTP_ERROR);
else : else :
@ -1164,12 +1148,6 @@ function GetEPGFromKbs($ChannelInfo) {
$ChannelId = $ChannelInfo[0]; $ChannelId = $ChannelInfo[0];
$ChannelName = $ChannelInfo[1]; $ChannelName = $ChannelInfo[1];
$ServiceId = $ChannelInfo[3]; $ServiceId = $ChannelInfo[3];
$options = array(
'http' => array(
'method' => 'GET',
'header'=> $GLOBALS['ua']
));
$context = stream_context_create($options);
$epginfo = array(); $epginfo = array();
foreach(range(1, $GLOBALS['period']) as $k) : foreach(range(1, $GLOBALS['period']) as $k) :
$url = "http://world.kbs.co.kr/include/wink/_ajax_schedule.php"; $url = "http://world.kbs.co.kr/include/wink/_ajax_schedule.php";
@ -1180,7 +1158,7 @@ function GetEPGFromKbs($ChannelInfo) {
$params = http_build_query($params); $params = http_build_query($params);
$url = $url."?".$params; $url = $url."?".$params;
try { try {
$response = @file_get_contents($url, False, $context); $response = getWeb($url);
if ($response === False && $GLOBALS['debug']) : if ($response === False && $GLOBALS['debug']) :
printError($ChannelName.HTTP_ERROR); printError($ChannelName.HTTP_ERROR);
else : else :
@ -1334,10 +1312,21 @@ function writeProgram($programdata) {
endif; endif;
fprintf($fp, " </programme>\n"); fprintf($fp, " </programme>\n");
} }
function printLog($args) { function getWeb($url) {
fwrite(STDERR, $args."\n"); $ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_USERAGENT, $GLOBALS['ua']);
$response = curl_exec($ch);
curl_close($ch);
return $response;
} }
function printError($args) { function printLog($string) {
fwrite(STDERR, "Error : ".$args."\n"); fwrite(STDERR, $string."\n");
}
function printError($string) {
fwrite(STDERR, "Error : ".$string."\n");
} }
?> ?>

View File

@ -2,24 +2,44 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from __future__ import print_function from __future__ import print_function
import imp
import os import os
import sys import sys
import requests
import json import json
import locale import locale
import datetime import datetime
from bs4 import BeautifulSoup, SoupStrainer
import codecs import codecs
import socket import socket
import re import re
from xml.sax.saxutils import escape, unescape from xml.sax.saxutils import escape, unescape
import argparse import argparse
import pprint import pprint
try:
imp.find_module('bs4')
from bs4 import BeautifulSoup, SoupStrainer
except ImportError:
print("Error : ", "BeautifulSoup 모듈이 설치되지 않았습니다.", file=sys.stderr)
sys.exit()
try:
imp.find_module('lxml')
except ImportError:
print("Error : ", "lxml 모듈이 설치되지 않았습니다.", file=sys.stderr)
sys.exit()
try:
imp.find_module('requests')
import requests
except ImportError:
print("Error : ", "requests 모듈이 설치되지 않았습니다.", file=sys.stderr)
sys.exit()
reload(sys) reload(sys)
sys.setdefaultencoding('utf-8') sys.setdefaultencoding('utf-8')
__version__ = '1.1.8' __version__ = '1.1.9'
if not sys.version_info[:2] == (2, 7):
print("Error : ", "python 2.7 버전이 필요합니다.", file=sys.stderr)
sys.exit()
# Set variable # Set variable
debug = False debug = False

View File

@ -1,15 +1,98 @@
1. 버전 1. 버전
1.1.8 1.1.9
2. 소개 2. 소개
이 프로그램은 EPG(Electronic Program Guide)를 웹상의 여러 소스에서 가져와서 XML로 출력하는 프로그램으로 python2 및 php5 Cli에서 사용 가능하도록 제작되었다. 이 프로그램은 EPG(Electronic Program Guide)를 웹상의 여러 소스에서 가져와서 XML로 출력하는 프로그램으로 python2 및 php5이상 Cli에서 사용 가능하도록 제작되었다.
기본적으로 외부의 소스를 분석하여 출력하므로 외부 소스 사이트가 변경되거나 삭제되면 문제가 발생할 수 있다. 기본적으로 외부의 소스를 분석하여 출력하므로 외부 소스 사이트가 변경되거나 삭제되면 문제가 발생할 수 있다.
4. 변경사항
Version 1.1.9
- 언어 버전 사항 체크
- 필요 모듈 사항 체크
- 버그 수정
- php 버전 웹 버전 추가
- php 버전 file_get_contents를 curl 사용으로 수정
Version 1.1.8
- KBS 함수 추가
- 채널 변경 사항 반영
- 스카이라이프 url 변경
- EPG 누락 데이터 수정
Version 1.1.7
- PHP 7.0 지원
- 채널 변경 사항 반영
- 라디오 채널 추가
Version 1.1.6
- iptv 선택 항목에 ALL 추가
- 에피소드 넘버 출력 수정
- 시작 시간 에러 출력 수정
- 타이틀 출력 수정
- 서브타이틀 추출 수정
- 데이터 중복 출력 문제 수정
- php 버전이 5.6.3 이전일 때 DOM access 관련 에러 수정
Version 1.1.5
- inline 변수 재추가
Version 1.1.4
- epg2xml.json 파일 도입
- inline 변수 삭제
- PHP 버전 추가
- 버그 수정
Version 1.1.3
- 제목에 회차정보, 재방송 정보 추가시 오류 수정
Version 1.1.2
- 재방송정보, 회차정보 옵션 추가
Version 1.1.1
- sk 카테고리 오류 수정
Version 1.1.0
- 채널 아이콘 추가
- 오류 메시지 통합
Version 1.0.9
- 소켓파일이 없을 때 오류 추가
- 채널 변경 사항 반영
Version 1.0.8
- 정지 시간 추가
- 오류 출력 구문 디버그시만 출력으로 변경
- 채널 소스 변경
Version 1.0.7
- urllib2를 requests로 변경
- User Agent 변경
- 오류 처리 추가
- 채널 변경 사항 반영
- 채널 소스 변경
- 지역 지상파 채널 추가
Version 1.0.6
- urllib를 urllib2로 변경
- User Agent 추가
- 채널 변경 사항 반영
Version 1.0.5
- epg.co.kr의 epg 정보 못가져오는 것 수정
Version 1.0.4
- KODI에서 사용가능하도록 수정
- 제목에서 서브타이틀 및 회차 분리
- 서브타이틀 추가
- 출연, 제작진 개인별로 분리
Version 1.0.3
- Channel.json 파일 오류 수정
- LG를 소스로 하는 EPG 정보 기간 오류 수정
Version 1.0.2
- ISP별 분리된 채널통합
- 개별 채널별 EPG 정보 수집가능하도록 Enabled 추가
- getMyChannel 함수 삭제
- 채널 변경 사항 반영
- KT TRU TV 채널 삭제
- ISP 선택 설정 추가
- EPG 정보 가져오는 기간 설정 추가
- 채널 아이콘 설정 URL 설정 추가
- tvheadend 전용 카테고리 추가
Version 1.0.1
- EPG 소스 변경
- 등록된 채널 정보만 EPG 정보 가져오도록 설정
- IPTV별 개인화
Version 1.0.0
- first release
3. 변경사항
- KBS 함수 추가 - KBS 함수 추가
- Channel.json 소스 변경 - Channel.json 소스 변경
-스카이라이프 url 변경 -스카이라이프 url 변경
- EPG 누락 데이터 수정 - EPG 누락 데이터 수정
4. 저작권 5. 저작권
- BSD - BSD