Update 1.2.3
This commit is contained in:
		
							parent
							
								
									31d4e9130c
								
							
						
					
					
						commit
						9238214f58
					
				@ -31,7 +31,7 @@
 | 
				
			|||||||
{ "Id": 40, "Name": "CJ오쇼핑", "KT Name": "CJ오쇼핑", "KTCh": 4, "LG Name": "CJ오쇼핑", "LGCh": 8, "SK Name": "CJ오쇼핑", "SKCh": 6, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/uBClUx6.png", "Source": "EPG", "ServiceId": "250"},
 | 
					{ "Id": 40, "Name": "CJ오쇼핑", "KT Name": "CJ오쇼핑", "KTCh": 4, "LG Name": "CJ오쇼핑", "LGCh": 8, "SK Name": "CJ오쇼핑", "SKCh": 6, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/uBClUx6.png", "Source": "EPG", "ServiceId": "250"},
 | 
				
			||||||
{ "Id": 41, "Name": "CJ오쇼핑 플러스", "KT Name": "CJ오쇼핑플러스", "KTCh": 28, "LG Name": "CJ오쇼핑+", "LGCh": 32, "SK Name": "CJ오쇼핑 플러스", "SKCh": 33, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/WlK2YDk.png", "Source": "KT", "ServiceId": "28"},
 | 
					{ "Id": 41, "Name": "CJ오쇼핑 플러스", "KT Name": "CJ오쇼핑플러스", "KTCh": 28, "LG Name": "CJ오쇼핑+", "LGCh": 32, "SK Name": "CJ오쇼핑 플러스", "SKCh": 33, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/WlK2YDk.png", "Source": "KT", "ServiceId": "28"},
 | 
				
			||||||
{ "Id": 42, "Name": "CLASSICA", "KT Name": "CLASSICA", "KTCh": 90, "LG Name": "클래시카", "LGCh": 146, "SK Name": "Classica HD", "SKCh": 235, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/FEfMS0W.png", "Source": "EPG", "ServiceId": "365"},
 | 
					{ "Id": 42, "Name": "CLASSICA", "KT Name": "CLASSICA", "KTCh": 90, "LG Name": "클래시카", "LGCh": 146, "SK Name": "Classica HD", "SKCh": 235, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/FEfMS0W.png", "Source": "EPG", "ServiceId": "365"},
 | 
				
			||||||
{ "Id": 43, "Name": "CMC가족오락TV", "KT Name": "CMC가족오락TV", "KTCh": 126, "LG Name": "", "LGCh": null, "SK Name": "CMC 가족오락TV", "SKCh": 93, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/fNuqGzR.png", "Source": "NAVER", "ServiceId": "814797"},
 | 
					{ "Id": 43, "Name": "CMC가족오락TV", "KT Name": "CMC가족오락TV", "KTCh": 126, "LG Name": "", "LGCh": null, "SK Name": "CMC 가족오락TV", "SKCh": 93, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/fNuqGzR.png", "Source": "EVERYON", "ServiceId": "1"},
 | 
				
			||||||
{ "Id": 44, "Name": "CMTV", "KT Name": "CMTV", "KTCh": 262, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/ITweLdv.png", "Source": "KT", "ServiceId": "44"},
 | 
					{ "Id": 44, "Name": "CMTV", "KT Name": "CMTV", "KTCh": 262, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/ITweLdv.png", "Source": "KT", "ServiceId": "44"},
 | 
				
			||||||
{ "Id": 45, "Name": "CNBC", "KT Name": "CNBC", "KTCh": 197, "LG Name": "CNBC", "LGCh": 118, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/Mx8ZXqk.png", "Source": "NAVER", "ServiceId": "815128"},
 | 
					{ "Id": 45, "Name": "CNBC", "KT Name": "CNBC", "KTCh": 197, "LG Name": "CNBC", "LGCh": 118, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/Mx8ZXqk.png", "Source": "NAVER", "ServiceId": "815128"},
 | 
				
			||||||
{ "Id": 46, "Name": "CNN International", "KT Name": "CNN International", "KTCh": 191, "LG Name": "CNN International", "LGCh": 117, "SK Name": "CNN International", "SKCh": 158, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/RxsYny9.png", "Source": "EPG", "ServiceId": "117"},
 | 
					{ "Id": 46, "Name": "CNN International", "KT Name": "CNN International", "KTCh": 191, "LG Name": "CNN International", "LGCh": 117, "SK Name": "CNN International", "SKCh": 158, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/RxsYny9.png", "Source": "EPG", "ServiceId": "117"},
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										13
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								README.md
									
									
									
									
									
								
							@ -34,7 +34,7 @@ default_icon_url : 채널별 아이콘이 있는 url을 설정할 수 있다. 
 | 
				
			|||||||
default_rebroadcast : 제목에 재방송 정보 출력
 | 
					default_rebroadcast : 제목에 재방송 정보 출력
 | 
				
			||||||
default_episode : 제목에 회차정보 출력
 | 
					default_episode : 제목에 회차정보 출력
 | 
				
			||||||
default_verbose : EPG 정보 상세 출력
 | 
					default_verbose : EPG 정보 상세 출력
 | 
				
			||||||
default_fetch_limit : EPG 데이터 가져오는 기간이다.
 | 
					default_fetch_limit : EPG 데이터 가져오는 기간.
 | 
				
			||||||
default_xml_filename : EPG 저장시 기본 저장 이름으로 tvheadend 서버가 쓰기가 가능한 경로로 설정해야 한다.
 | 
					default_xml_filename : EPG 저장시 기본 저장 이름으로 tvheadend 서버가 쓰기가 가능한 경로로 설정해야 한다.
 | 
				
			||||||
default_xml_socket   : External XMLTV 사용시 xmltv.sock가 있는 경로로 설정해준다.
 | 
					default_xml_socket   : External XMLTV 사용시 xmltv.sock가 있는 경로로 설정해준다.
 | 
				
			||||||
</pre>
 | 
					</pre>
 | 
				
			||||||
@ -42,10 +42,6 @@ default_xml_socket   : External XMLTV 사용시 xmltv.sock가 있는 경로로 
 | 
				
			|||||||
### Channel.json
 | 
					### Channel.json
 | 
				
			||||||
Channel.json 파일의 최신버전은 https://github.com/wonipapa/Channel.json 에서 다운받을 수 있다.  
 | 
					Channel.json 파일의 최신버전은 https://github.com/wonipapa/Channel.json 에서 다운받을 수 있다.  
 | 
				
			||||||
Channel.json 파일을 텍스트 편집기로 열어보면 각채널별 정보가 들어 있다.  
 | 
					Channel.json 파일을 텍스트 편집기로 열어보면 각채널별 정보가 들어 있다.  
 | 
				
			||||||
이중 Enabled:1로 되어 있는 부분을 Enabled:0으로 바꾸면 EPG정보를 가져오지 않는다.  
 | 
					 | 
				
			||||||
필요없는 채널정보를 가져오지 않게 하는 것으로 EPG 정보 수집시 시간을 단축할 수 있다.  
 | 
					 | 
				
			||||||
삭제된 채널등으로 인해서 오류 발생시에도 Enabled:0으로 변경하면 오류 발생을 차단할 수 있다.  
 | 
					 | 
				
			||||||
1.2.3 버전부터 Enabled 항목은 없어질 예정이다.  
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
## 옵션 소개
 | 
					## 옵션 소개
 | 
				
			||||||
### epg2xml.py, epg2xml.php 옵션
 | 
					### epg2xml.py, epg2xml.php 옵션
 | 
				
			||||||
@ -90,8 +86,8 @@ python 경로와 php의 경로는 /usr/bin에 있고, epg2xml 파일은 /home/ht
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#### PHP WEB의 경우
 | 
					#### PHP WEB의 경우
 | 
				
			||||||
<pre>
 | 
					<pre>
 | 
				
			||||||
wget -O - http://domain/epg2xml.php 또는
 | 
					wget -O - http://domain/epg2xml-web.php 또는
 | 
				
			||||||
wget -O - http://domain/epg2xml.php?i=ALL&l=2
 | 
					wget -O - http://domain/epg2xml-web.php?i=ALL&l=2
 | 
				
			||||||
</pre>
 | 
					</pre>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### XMLTV SOCKET 사용시
 | 
					### XMLTV SOCKET 사용시
 | 
				
			||||||
@ -123,7 +119,8 @@ https://github.com/wonipapa/epg2xml/wiki/FAQ
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
## 변경사항
 | 
					## 변경사항
 | 
				
			||||||
### Version 1.2.3
 | 
					### Version 1.2.3
 | 
				
			||||||
  - PHP 통합
 | 
					  - PHP 버전통합
 | 
				
			||||||
 | 
					  - PYTHON 버전 html Parser 변수 추가
 | 
				
			||||||
  - 소스 추가
 | 
					  - 소스 추가
 | 
				
			||||||
  - Channel.json Enabled 항목 제거
 | 
					  - Channel.json Enabled 항목 제거
 | 
				
			||||||
  - 에피소드 넘버 xmltv_ns 옵션 항목 추가
 | 
					  - 에피소드 넘버 xmltv_ns 옵션 항목 추가
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										128
									
								
								epg2xml-web.php
									
									
									
									
									
								
							
							
						
						
									
										128
									
								
								epg2xml-web.php
									
									
									
									
									
								
							@ -1,8 +1,8 @@
 | 
				
			|||||||
<?php
 | 
					<?php
 | 
				
			||||||
@mb_internal_encoding("UTF-8");
 | 
					@mb_internal_encoding("UTF-8");
 | 
				
			||||||
@date_default_timezone_set('Asia/Seoul');
 | 
					@date_default_timezone_set('Asia/Seoul');
 | 
				
			||||||
//error_reporting(E_ALL ^ E_NOTICE);
 | 
					error_reporting(E_ALL ^ E_NOTICE);
 | 
				
			||||||
error_reporting(E_ALL);
 | 
					
 | 
				
			||||||
@set_time_limit(0);
 | 
					@set_time_limit(0);
 | 
				
			||||||
define("VERSION", "1.2.3");
 | 
					define("VERSION", "1.2.3");
 | 
				
			||||||
$debug = False;
 | 
					$debug = False;
 | 
				
			||||||
@ -62,7 +62,6 @@ $longargs  = array(
 | 
				
			|||||||
    "episode:",
 | 
					    "episode:",
 | 
				
			||||||
    "rebroadcast:",
 | 
					    "rebroadcast:",
 | 
				
			||||||
    "verbose:",
 | 
					    "verbose:",
 | 
				
			||||||
    "xmltvns:",
 | 
					 | 
				
			||||||
    "help"
 | 
					    "help"
 | 
				
			||||||
);
 | 
					);
 | 
				
			||||||
$args = getopt($shortargs, $longargs);
 | 
					$args = getopt($shortargs, $longargs);
 | 
				
			||||||
@ -88,8 +87,6 @@ try {
 | 
				
			|||||||
            $default_verbose = $Settings['default_verbose'] ?: "n";
 | 
					            $default_verbose = $Settings['default_verbose'] ?: "n";
 | 
				
			||||||
            $default_xmltvns = $Settings['default_xmltvns'] ?: "n";
 | 
					            $default_xmltvns = $Settings['default_xmltvns'] ?: "n";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
         
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            $userISP = !empty($_GET['i']) ? $_GET['i'] : (!empty($args['i']) ? $args['i'] : "");
 | 
					            $userISP = !empty($_GET['i']) ? $_GET['i'] : (!empty($args['i']) ? $args['i'] : "");
 | 
				
			||||||
            $user_output = "";
 | 
					            $user_output = "";
 | 
				
			||||||
            $user_xml_file = "";
 | 
					            $user_xml_file = "";
 | 
				
			||||||
@ -138,7 +135,6 @@ try {
 | 
				
			|||||||
            $user_rebroadcast = empty($_GET['rebroadcast']) === False ? $_GET['rebroadcast'] : (empty($args['rebroadcast']) === False ? $args['rebroadcast'] : "");
 | 
					            $user_rebroadcast = empty($_GET['rebroadcast']) === False ? $_GET['rebroadcast'] : (empty($args['rebroadcast']) === False ? $args['rebroadcast'] : "");
 | 
				
			||||||
            $user_episode = empty($_GET['episode']) === False ? $_GET['episode'] : (empty($args['episode']) === False ? $args['episode'] : "");
 | 
					            $user_episode = empty($_GET['episode']) === False ? $_GET['episode'] : (empty($args['episode']) === False ? $args['episode'] : "");
 | 
				
			||||||
            $user_verbose = empty($_GET['verbose']) === False ? $_GET['verbose'] : (empty($args['verbose']) === False ? $args['verbose'] : "");
 | 
					            $user_verbose = empty($_GET['verbose']) === False ? $_GET['verbose'] : (empty($args['verbose']) === False ? $args['verbose'] : "");
 | 
				
			||||||
            $user_xmltvns = empty($_GET['xmltvns']) === False ? $_GET['xmltvns'] : (empty($args['xmltvns']) === False ? $args['xmltvns'] : "");
 | 
					 | 
				
			||||||
            if(!empty($userISP)) $MyISP = $userISP;
 | 
					            if(!empty($userISP)) $MyISP = $userISP;
 | 
				
			||||||
            if(!empty($user_output)) $default_output = $user_output;
 | 
					            if(!empty($user_output)) $default_output = $user_output;
 | 
				
			||||||
            if(!empty($user_xml_file)) $default_xml_file = $user_xml_file;
 | 
					            if(!empty($user_xml_file)) $default_xml_file = $user_xml_file;
 | 
				
			||||||
@ -148,7 +144,6 @@ try {
 | 
				
			|||||||
            if(!empty($user_rebroadcast)) $default_rebroadcast = $user_rebroadcast;
 | 
					            if(!empty($user_rebroadcast)) $default_rebroadcast = $user_rebroadcast;
 | 
				
			||||||
            if(!empty($user_episode)) $default_episode = $user_episode;
 | 
					            if(!empty($user_episode)) $default_episode = $user_episode;
 | 
				
			||||||
            if(!empty($user_verbose)) $default_verbose = $user_verbose;
 | 
					            if(!empty($user_verbose)) $default_verbose = $user_verbose;
 | 
				
			||||||
            if(!empty($user_xmltvns)) $default_xmltvns = $user_xmltvns;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if(empty($MyISP)) : //ISP 선택없을 시 사용법 출력
 | 
					            if(empty($MyISP)) : //ISP 선택없을 시 사용법 출력
 | 
				
			||||||
                printError("epg2xml.json 파일의 MyISP항목이 없습니다.");
 | 
					                printError("epg2xml.json 파일의 MyISP항목이 없습니다.");
 | 
				
			||||||
@ -423,6 +418,8 @@ function getEPG() {
 | 
				
			|||||||
            GetEPGFromHcn($ChannelInfo);
 | 
					            GetEPGFromHcn($ChannelInfo);
 | 
				
			||||||
        elseif($ChannelSource == 'POOQ') :
 | 
					        elseif($ChannelSource == 'POOQ') :
 | 
				
			||||||
            GetEPGFromPooq($ChannelInfo);
 | 
					            GetEPGFromPooq($ChannelInfo);
 | 
				
			||||||
 | 
					        elseif($ChannelSource == 'EVERYON') :
 | 
				
			||||||
 | 
					            GetEPGFromEveryon($ChannelInfo);
 | 
				
			||||||
        elseif($ChannelSource == 'MBC') :
 | 
					        elseif($ChannelSource == 'MBC') :
 | 
				
			||||||
            GetEPGFromMbc($ChannelInfo);
 | 
					            GetEPGFromMbc($ChannelInfo);
 | 
				
			||||||
        elseif($ChannelSource == 'MIL'):
 | 
					        elseif($ChannelSource == 'MIL'):
 | 
				
			||||||
@ -837,6 +834,11 @@ function GetEPGFromSKY($ChannelInfo) {
 | 
				
			|||||||
                            $rating = 0;
 | 
					                            $rating = 0;
 | 
				
			||||||
                            $programName = htmlspecialchars_decode($program['program_name']) ?: "";
 | 
					                            $programName = htmlspecialchars_decode($program['program_name']) ?: "";
 | 
				
			||||||
                            $subprogramName = str_replace(array('lt;', 'gt;', 'amp;'), array('<', '>', '&'),$program['program_subname']) ?: "";
 | 
					                            $subprogramName = str_replace(array('lt;', 'gt;', 'amp;'), array('<', '>', '&'),$program['program_subname']) ?: "";
 | 
				
			||||||
 | 
					                            preg_match('/(.*) \(?(\d+부)\)?/', $programName, $matches);
 | 
				
			||||||
 | 
					                            if ($matches != NULL) :
 | 
				
			||||||
 | 
					                                if(isset($matches[1])) $programName = trim($matches[1]) ?: "";
 | 
				
			||||||
 | 
					                                if(isset($matches[2])) $subprogramName = trim($matches[2]." ".$subprogramName) ?: "";
 | 
				
			||||||
 | 
					                            endif;
 | 
				
			||||||
                            $startTime = $program['starttime'];
 | 
					                            $startTime = $program['starttime'];
 | 
				
			||||||
                            $endTime = $program['endtime'];
 | 
					                            $endTime = $program['endtime'];
 | 
				
			||||||
                            $actors = trim(str_replace('...', '',$program['cast']), ', ') ?: "";
 | 
					                            $actors = trim(str_replace('...', '',$program['cast']), ', ') ?: "";
 | 
				
			||||||
@ -993,7 +995,6 @@ function GetEPGFromIscs($ChannelInfo) {
 | 
				
			|||||||
                            $rating = 0;
 | 
					                            $rating = 0;
 | 
				
			||||||
                            if(startsWith($program['Time'], '1') || startsWith($program['Time'], '2')) $istomorrow = True;
 | 
					                            if(startsWith($program['Time'], '1') || startsWith($program['Time'], '2')) $istomorrow = True;
 | 
				
			||||||
                            if(startsWith($program['Time'], '0') && $istomorrow == True) :
 | 
					                            if(startsWith($program['Time'], '0') && $istomorrow == True) :
 | 
				
			||||||
//                                $thisday = date("Ymd", strtotime($day." +1 days"));
 | 
					 | 
				
			||||||
                                $startTime = date("YmdHis", strtotime($day." +1 days"." ".$program['Time']));
 | 
					                                $startTime = date("YmdHis", strtotime($day." +1 days"." ".$program['Time']));
 | 
				
			||||||
                            else :
 | 
					                            else :
 | 
				
			||||||
                                $startTime = date("YmdHis", strtotime($day." ".$program['Time']));
 | 
					                                $startTime = date("YmdHis", strtotime($day." ".$program['Time']));
 | 
				
			||||||
@ -1025,7 +1026,6 @@ function GetEPGFromIscs($ChannelInfo) {
 | 
				
			|||||||
    endforeach;
 | 
					    endforeach;
 | 
				
			||||||
    $epginfo=  array_map("unserialize", array_unique(array_map("serialize", $epginfo)));
 | 
					    $epginfo=  array_map("unserialize", array_unique(array_map("serialize", $epginfo)));
 | 
				
			||||||
    epgzip($epginfo);
 | 
					    epgzip($epginfo);
 | 
				
			||||||
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Get EPG data from Hcn
 | 
					// Get EPG data from Hcn
 | 
				
			||||||
@ -1156,6 +1156,59 @@ function GetEPGFromPooq($ChannelInfo) {
 | 
				
			|||||||
    epgzip($epginfo);
 | 
					    epgzip($epginfo);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Get EPG data from EVERYON
 | 
				
			||||||
 | 
					function GetEPGFromEveryon($ChannelInfo) {
 | 
				
			||||||
 | 
					    $ChannelId = $ChannelInfo[0];
 | 
				
			||||||
 | 
					    $ChannelName = $ChannelInfo[1];
 | 
				
			||||||
 | 
					    $ServiceId =  $ChannelInfo[3];
 | 
				
			||||||
 | 
					    $epginfo = array();
 | 
				
			||||||
 | 
					    foreach(range(1, $GLOBALS['period']) as $k) :
 | 
				
			||||||
 | 
					        $url = "http://www.everyon.tv/mobile/schedule_ch.ptv";
 | 
				
			||||||
 | 
					        $day = date("Ymd", strtotime("+".($k - 1)." days"));
 | 
				
			||||||
 | 
					        $params = array(
 | 
				
			||||||
 | 
					            'chid' => $ServiceId,
 | 
				
			||||||
 | 
					            'date' => $day
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					        $params = http_build_query($params);
 | 
				
			||||||
 | 
					        $method = "GET";
 | 
				
			||||||
 | 
					       try {
 | 
				
			||||||
 | 
					            $response = getWeb($url, $params, $method);
 | 
				
			||||||
 | 
					            if ($response === False && $GLOBALS['debug']) :
 | 
				
			||||||
 | 
					                printError($ChannelName.HTTP_ERROR);
 | 
				
			||||||
 | 
					            else :
 | 
				
			||||||
 | 
					                $response = mb_convert_encoding($response, "HTML-ENTITIES", "UTF-8");
 | 
				
			||||||
 | 
					                $dom = new DomDocument;
 | 
				
			||||||
 | 
					                libxml_use_internal_errors(True);
 | 
				
			||||||
 | 
					                if($dom->loadHTML($response)):
 | 
				
			||||||
 | 
					                    $xpath = new DomXPath($dom);
 | 
				
			||||||
 | 
					                    $query = "//ul[@class='lt2']";
 | 
				
			||||||
 | 
					                    $rows = $xpath->query($query);
 | 
				
			||||||
 | 
					                    foreach($rows as $row) :
 | 
				
			||||||
 | 
					                        $startTime = $endTime = $programName = $subprogramName = $desc = $actors = $producers = $category = $episode = "";
 | 
				
			||||||
 | 
					                        $rebroadcast = False;
 | 
				
			||||||
 | 
					                        $rating = 0;
 | 
				
			||||||
 | 
					                        $startTime = trim($xpath->query("li[@class='pr_time']", $row)->item(0)->nodeValue) ?: "";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        $startTime = date("YmdHis", strtotime($day." ".$startTime));
 | 
				
			||||||
 | 
					                        $programName = trim($xpath->query("li[@class='pr_name']", $row)->item(0)->nodeValue) ?: "";
 | 
				
			||||||
 | 
					                        if(in_array($programName, array("편성표가 곧 등록될 예정입니다.", "편성 정보가 없습니다."))) continue;
 | 
				
			||||||
 | 
					                        $grade = trim($xpath->query("li[contains(@class,'img')]", $row)->item(0)->getAttribute('class'));
 | 
				
			||||||
 | 
					                        $rating = str_replace(array("img ","c", "all"), array("", "", "0"), $grade);
 | 
				
			||||||
 | 
					                        //ChannelId, startTime, programName, subprogramName, desc, actors, producers, category, episode, rebroadcast, rating
 | 
				
			||||||
 | 
					                        $epginfo[] = array($ChannelId, $startTime, $programName, $subprogramName, $desc, $actors, $producers, $category, $episode, $rebroadcast, $rating);
 | 
				
			||||||
 | 
					                        usleep(1000);
 | 
				
			||||||
 | 
					                    endforeach;
 | 
				
			||||||
 | 
					                else :
 | 
				
			||||||
 | 
					                    if($GLOBALS['debug']) printError($ChannelName.CONTENT_ERROR);
 | 
				
			||||||
 | 
					                endif;
 | 
				
			||||||
 | 
					            endif;
 | 
				
			||||||
 | 
					        } catch (Exception $e) {
 | 
				
			||||||
 | 
					            if($GLOBALS['debug']) printError($e->getMessage());
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    endforeach;
 | 
				
			||||||
 | 
					    epgzip($epginfo);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Get EPG data from MBC
 | 
					// Get EPG data from MBC
 | 
				
			||||||
function GetEPGFromMbc($ChannelInfo) {
 | 
					function GetEPGFromMbc($ChannelInfo) {
 | 
				
			||||||
    $ChannelId = $ChannelInfo[0];
 | 
					    $ChannelId = $ChannelInfo[0];
 | 
				
			||||||
@ -1500,22 +1553,21 @@ function GetEPGFromArirang($ChannelInfo) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
# Zip epginfo
 | 
					# Zip epginfo
 | 
				
			||||||
function epgzip($epginfo) {
 | 
					function epgzip($epginfo) {
 | 
				
			||||||
    if($epginfo == NULL) $epginfo = array();
 | 
					    $epg1 = current($epginfo);
 | 
				
			||||||
    #ChannelId, startTime, programName, subprogramName, desc, actors, producers, category, episode, rebroadcast, rating
 | 
					    array_shift($epginfo);
 | 
				
			||||||
    $zipped = array_slice(array_map(NULL, $epginfo, array_slice($epginfo,1)),0,-1);
 | 
					    foreach($epginfo as $epg2):
 | 
				
			||||||
    foreach($zipped as $epg) :
 | 
					        $ChannelId = $epg1[0] ?: "";
 | 
				
			||||||
        $ChannelId = $epg[0][0] ?: "";
 | 
					        $startTime = $epg1[1] ?: "";
 | 
				
			||||||
        $startTime = $epg[0][1] ?: "";
 | 
					        $endTime = $epg2[1] ?: "";
 | 
				
			||||||
        $endTime = $epg[1][1] ?: "";
 | 
					        $programName = $epg1[2] ?: "";
 | 
				
			||||||
        $programName = $epg[0][2] ?: "";
 | 
					        $subprogramName = $epg1[3] ?: "";
 | 
				
			||||||
        $subprogramName = $epg[0][3] ?: "";
 | 
					        $desc = $epg1[4] ?: "";
 | 
				
			||||||
        $desc = $epg[0][4] ?: "";
 | 
					        $actors = $epg1[5] ?: "";
 | 
				
			||||||
        $actors = $epg[0][5] ?: "";
 | 
					        $producers = $epg1[6] ?: "";
 | 
				
			||||||
        $producers = $epg[0][6] ?: "";
 | 
					        $category = $epg1[7] ?: "";
 | 
				
			||||||
        $category = $epg[0][7] ?: "";
 | 
					        $episode = $epg1[8] ?: "";
 | 
				
			||||||
        $episode = $epg[0][8] ?: "";
 | 
					        $rebroadcast = $rebroadcast = $epg1[9] ? True: False;
 | 
				
			||||||
        $rebroadcast = $rebroadcast = $epg[0][9] ? True: False;
 | 
					        $rating = $epg1[10] ?: 0;
 | 
				
			||||||
        $rating = $epg[0][10] ?: 0;
 | 
					 | 
				
			||||||
        $programdata = array(
 | 
					        $programdata = array(
 | 
				
			||||||
            'channelId'=> $ChannelId,
 | 
					            'channelId'=> $ChannelId,
 | 
				
			||||||
            'startTime' => $startTime,
 | 
					            'startTime' => $startTime,
 | 
				
			||||||
@ -1531,7 +1583,8 @@ function epgzip($epginfo) {
 | 
				
			|||||||
            'rating' => $rating
 | 
					            'rating' => $rating
 | 
				
			||||||
        );
 | 
					        );
 | 
				
			||||||
        writeProgram($programdata);
 | 
					        writeProgram($programdata);
 | 
				
			||||||
    endforeach;
 | 
					        $epg1 = $epg2;
 | 
				
			||||||
 | 
					    endforeach;    
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function writeProgram($programdata) {
 | 
					function writeProgram($programdata) {
 | 
				
			||||||
@ -1545,7 +1598,7 @@ function writeProgram($programdata) {
 | 
				
			|||||||
    if ($matches != NULL) :
 | 
					    if ($matches != NULL) :
 | 
				
			||||||
        if(isset($matches[1])) $programName = trim($matches[1]) ?: "";
 | 
					        if(isset($matches[1])) $programName = trim($matches[1]) ?: "";
 | 
				
			||||||
        if(isset($matches[2])) $subprogramName = trim($matches[2]." ".$subprogramName) ?: "";
 | 
					        if(isset($matches[2])) $subprogramName = trim($matches[2]." ".$subprogramName) ?: "";
 | 
				
			||||||
    endif;
 | 
					    endif;//
 | 
				
			||||||
    if($programName == NULL):
 | 
					    if($programName == NULL):
 | 
				
			||||||
        $programName = $subprogramName;
 | 
					        $programName = $subprogramName;
 | 
				
			||||||
    endif;
 | 
					    endif;
 | 
				
			||||||
@ -1567,7 +1620,7 @@ function writeProgram($programdata) {
 | 
				
			|||||||
        $rating = sprintf("%s세 이상 관람가", $programdata['rating']);
 | 
					        $rating = sprintf("%s세 이상 관람가", $programdata['rating']);
 | 
				
			||||||
    endif;
 | 
					    endif;
 | 
				
			||||||
    if($GLOBALS['addverbose'] == 'y') :
 | 
					    if($GLOBALS['addverbose'] == 'y') :
 | 
				
			||||||
        $desc = trim(htmlspecialchars($programdata['programName'], ENT_XML1));
 | 
					        $desc = $programName;
 | 
				
			||||||
        if($subprogramName)  $desc = $desc."\n부제 : ".$subprogramName;
 | 
					        if($subprogramName)  $desc = $desc."\n부제 : ".$subprogramName;
 | 
				
			||||||
        if($rebroadcast == True && $GLOBALS['addrebroadcast']  == 'y') $desc = $desc."\n방송 : 재방송";
 | 
					        if($rebroadcast == True && $GLOBALS['addrebroadcast']  == 'y') $desc = $desc."\n방송 : 재방송";
 | 
				
			||||||
        if($episode) $desc = $desc."\n회차 : ".$episode."회";
 | 
					        if($episode) $desc = $desc."\n회차 : ".$episode."회";
 | 
				
			||||||
@ -1684,27 +1737,11 @@ function startsWith($haystack, $needle) {
 | 
				
			|||||||
    return !strncmp($haystack, $needle, strlen($needle));
 | 
					    return !strncmp($haystack, $needle, strlen($needle));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function pairs($it) {
 | 
					 | 
				
			||||||
    $prev = current($it);
 | 
					 | 
				
			||||||
    array_shift($it);
 | 
					 | 
				
			||||||
    foreach($it as $v):
 | 
					 | 
				
			||||||
        yield array($prev,$v);
 | 
					 | 
				
			||||||
        $prev = $v;
 | 
					 | 
				
			||||||
    endforeach;    
 | 
					 | 
				
			||||||
    /*
 | 
					 | 
				
			||||||
    it = iter(it)
 | 
					 | 
				
			||||||
    prev = next(it)
 | 
					 | 
				
			||||||
    for v in it:
 | 
					 | 
				
			||||||
        yield prev, v
 | 
					 | 
				
			||||||
        prev = v
 | 
					 | 
				
			||||||
    */
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
//사용방법
 | 
					//사용방법
 | 
				
			||||||
$usage = <<<USAGE
 | 
					$usage = <<<USAGE
 | 
				
			||||||
usage: epg2xml.py [-h] [-i {ALL,KT,LG,SK}] [-v | -d | -o [xmltv.xml] | -s
 | 
					usage: epg2xml.py [-h] [-i {ALL,KT,LG,SK}] [-v | -d | -o [xmltv.xml] | -s
 | 
				
			||||||
                  [xmltv.sock]] [--icon http://www.example.com/icon] [-l 1-2]
 | 
					                  [xmltv.sock]] [--icon http://www.example.com/icon] [-l 1-2]
 | 
				
			||||||
                  [--rebroadcast y, n] [--episode y, n] [--verbose y, n]
 | 
					                  [--rebroadcast y, n] [--episode y, n] [--verbose y, n]
 | 
				
			||||||
                  [--xmltvns y, n]
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
USAGE;
 | 
					USAGE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -1714,7 +1751,7 @@ usage: epg2xml.php [-h] [-i {ALL,KT,LG,SK}]
 | 
				
			|||||||
                  [-v | -d | -o [xmltv.xml]
 | 
					                  [-v | -d | -o [xmltv.xml]
 | 
				
			||||||
                  | -s [xmltv.sock]] [--icon http://www.example.com/icon]
 | 
					                  | -s [xmltv.sock]] [--icon http://www.example.com/icon]
 | 
				
			||||||
                  [-l 1-2] [--rebroadcast y, n] [--episode y, n]
 | 
					                  [-l 1-2] [--rebroadcast y, n] [--episode y, n]
 | 
				
			||||||
                  [--verbose y, n] [--xmltvns y, n]
 | 
					                  [--verbose y, n]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
EPG 정보를 출력하는 방법을 선택한다
 | 
					EPG 정보를 출력하는 방법을 선택한다
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -1738,7 +1775,6 @@ optional arguments:
 | 
				
			|||||||
  --rebroadcast y, n    제목에 재방송 정보 출력
 | 
					  --rebroadcast y, n    제목에 재방송 정보 출력
 | 
				
			||||||
  --episode y, n        제목에 회차 정보 출력
 | 
					  --episode y, n        제목에 회차 정보 출력
 | 
				
			||||||
  --verbose y, n        EPG 정보 추가 출력
 | 
					  --verbose y, n        EPG 정보 추가 출력
 | 
				
			||||||
  --xmltvns y, n        회차정보 xmltv_ns 출력
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
HELP;
 | 
					HELP;
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										12
									
								
								epg2xml.json
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								epg2xml.json
									
									
									
									
									
								
							@ -4,8 +4,8 @@
 | 
				
			|||||||
    "###_COMMENT_###" : "사용하는 ISP 선택 (ALL, KT, LG, SK)",
 | 
					    "###_COMMENT_###" : "사용하는 ISP 선택 (ALL, KT, LG, SK)",
 | 
				
			||||||
    "MyISP": "ALL",
 | 
					    "MyISP": "ALL",
 | 
				
			||||||
    "###_COMMENT_###" : "### # My Channel EPG 정보 가져오는 채널 ID ###",
 | 
					    "###_COMMENT_###" : "### # My Channel EPG 정보 가져오는 채널 ID ###",
 | 
				
			||||||
    "###_COMMENT_###" : "채널 ID를 , 로 구분. , 상의 간격 유무 관계없음 ",
 | 
					    "###_COMMENT_###" : "### 채널 ID를 , 로 구분. , 상의 간격 유무 관계없음 ###",
 | 
				
			||||||
    "MyChannels" : "31,117,133,134,144,221,222,238,246,247,255,257,262,263,264,284,286,303,307,311,312,314,411,446",
 | 
					    "MyChannels" : "",
 | 
				
			||||||
    "###_COMMENT_###" : "output 셋팅은 (d, o, s) 셋중에 하나로 선택한다",
 | 
					    "###_COMMENT_###" : "output 셋팅은 (d, o, s) 셋중에 하나로 선택한다",
 | 
				
			||||||
    "###_COMMENT_###" : " d - EPG 정보 화면 출력",
 | 
					    "###_COMMENT_###" : " d - EPG 정보 화면 출력",
 | 
				
			||||||
    "###_COMMENT_###" : " o - EPG 정보 파일로 저장",
 | 
					    "###_COMMENT_###" : " o - EPG 정보 파일로 저장",
 | 
				
			||||||
@ -14,17 +14,17 @@
 | 
				
			|||||||
    "###_COMMENT_###" : "### TV channel icon url (ex : http://www.example.com/Channels) ###",
 | 
					    "###_COMMENT_###" : "### TV channel icon url (ex : http://www.example.com/Channels) ###",
 | 
				
			||||||
    "default_icon_url": "",
 | 
					    "default_icon_url": "",
 | 
				
			||||||
    "###_COMMENT_###" : "### 제목에 재방송 정보 출력 ###",
 | 
					    "###_COMMENT_###" : "### 제목에 재방송 정보 출력 ###",
 | 
				
			||||||
    "default_rebroadcast": "y",
 | 
					    "default_rebroadcast": "n",
 | 
				
			||||||
    "###_COMMENT_###" : "#### 제목에 회차정보 출력 ###",     
 | 
					    "###_COMMENT_###" : "#### 제목에 회차정보 출력 ###",     
 | 
				
			||||||
    "default_episode" : "y",
 | 
					    "default_episode" : "y",
 | 
				
			||||||
    "###_COMMENT_###" : "### EPG 정보 추가 출력 ###",
 | 
					    "###_COMMENT_###" : "### EPG 정보 추가 출력 ###",
 | 
				
			||||||
    "default_verbose" : "n",
 | 
					    "default_verbose" : "y",
 | 
				
			||||||
    "###_COMMENT_###" : "### XMLTV_NS 정보 추가 출력 ###",
 | 
					    "###_COMMENT_###" : "### XMLTV_NS 정보 추가 출력 ###",
 | 
				
			||||||
    "default_xmltvns" : "n",
 | 
					    "default_xmltvns" : "n",
 | 
				
			||||||
    "###_COMMENT_###" : "### epg 데이터 가져오는 기간으로 1에서 2까지 설정가능 ###",
 | 
					    "###_COMMENT_###" : "### epg 데이터 가져오는 기간으로 1에서 7까지 설정가능 ###",
 | 
				
			||||||
    "default_fetch_limit" : "2",
 | 
					    "default_fetch_limit" : "2",
 | 
				
			||||||
    "###_COMMENT_###" : "### epg 저장시 기본 저장 이름 (ex: /home/tvheadend/xmltv.xml) ###",
 | 
					    "###_COMMENT_###" : "### epg 저장시 기본 저장 이름 (ex: /home/tvheadend/xmltv.xml) ###",
 | 
				
			||||||
    "default_xml_file" : "/home1/wonipapa/public_html/epg2xml/xmltv.xml",
 | 
					    "default_xml_file" : "xmltv.xml",
 | 
				
			||||||
    "###_COMMENT_###" : "### # External XMLTV 사용시 기본 소켓 이름 (ex: /home/tvheadend/xmltv.sock) ###",
 | 
					    "###_COMMENT_###" : "### # External XMLTV 사용시 기본 소켓 이름 (ex: /home/tvheadend/xmltv.sock) ###",
 | 
				
			||||||
    "default_xml_socket" : "xmltv.sock",
 | 
					    "default_xml_socket" : "xmltv.sock",
 | 
				
			||||||
    "###_COMMENT_###" : ""
 | 
					    "###_COMMENT_###" : ""
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										101
									
								
								epg2xml.py
									
									
									
									
									
								
							
							
						
						
									
										101
									
								
								epg2xml.py
									
									
									
									
									
								
							@ -48,6 +48,7 @@ debug = False
 | 
				
			|||||||
today = datetime.date.today()
 | 
					today = datetime.date.today()
 | 
				
			||||||
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': '*/*'}
 | 
				
			||||||
timeout = 5
 | 
					timeout = 5
 | 
				
			||||||
 | 
					htmlparser = 'lxml'
 | 
				
			||||||
CHANNEL_ERROR = ' 존재하지 않는 채널입니다.'
 | 
					CHANNEL_ERROR = ' 존재하지 않는 채널입니다.'
 | 
				
			||||||
CONTENT_ERROR = ' EPG 정보가 없습니다.'
 | 
					CONTENT_ERROR = ' EPG 정보가 없습니다.'
 | 
				
			||||||
HTTP_ERROR = ' EPG 정보를 가져오는데 문제가 있습니다.'
 | 
					HTTP_ERROR = ' EPG 정보를 가져오는데 문제가 있습니다.'
 | 
				
			||||||
@ -55,6 +56,7 @@ SOCKET_ERROR = 'xmltv.sock 파일을 찾을 수 없습니다.'
 | 
				
			|||||||
JSON_FILE_ERROR = 'json 파일을 읽을 수 없습니다.'
 | 
					JSON_FILE_ERROR = 'json 파일을 읽을 수 없습니다.'
 | 
				
			||||||
JSON_SYNTAX_ERROR = 'json 파일 형식이 잘못되었습니다.'
 | 
					JSON_SYNTAX_ERROR = 'json 파일 형식이 잘못되었습니다.'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Get epg data
 | 
					# Get epg data
 | 
				
			||||||
def getEpg():
 | 
					def getEpg():
 | 
				
			||||||
    Channelfile = os.path.dirname(os.path.abspath(__file__)) + '/Channel.json'
 | 
					    Channelfile = os.path.dirname(os.path.abspath(__file__)) + '/Channel.json'
 | 
				
			||||||
@ -134,6 +136,8 @@ def getEpg():
 | 
				
			|||||||
            GetEPGFromHcn(ChannelInfo)
 | 
					            GetEPGFromHcn(ChannelInfo)
 | 
				
			||||||
        elif ChannelSource == 'POOQ':
 | 
					        elif ChannelSource == 'POOQ':
 | 
				
			||||||
            GetEPGFromPooq(ChannelInfo)
 | 
					            GetEPGFromPooq(ChannelInfo)
 | 
				
			||||||
 | 
					        elif ChannelSource == 'EVERYON':
 | 
				
			||||||
 | 
					            GetEPGFromEveryon(ChannelInfo)
 | 
				
			||||||
        elif ChannelSource == 'MBC':
 | 
					        elif ChannelSource == 'MBC':
 | 
				
			||||||
            GetEPGFromMbc(ChannelInfo)
 | 
					            GetEPGFromMbc(ChannelInfo)
 | 
				
			||||||
        elif ChannelSource == 'MIL':
 | 
					        elif ChannelSource == 'MIL':
 | 
				
			||||||
@ -164,7 +168,7 @@ def GetEPGFromEPG(ChannelInfo):
 | 
				
			|||||||
            pattern = '<td height="25" valign=top >(.*)<\/td>'
 | 
					            pattern = '<td height="25" valign=top >(.*)<\/td>'
 | 
				
			||||||
            data = re.sub(pattern, partial(replacement, tag='td'), data)
 | 
					            data = re.sub(pattern, partial(replacement, tag='td'), data)
 | 
				
			||||||
            strainer = SoupStrainer('table', {'style':'margin-bottom:30'})
 | 
					            strainer = SoupStrainer('table', {'style':'margin-bottom:30'})
 | 
				
			||||||
            soup = BeautifulSoup(data, 'lxml', parse_only=strainer, from_encoding='utf-8')
 | 
					            soup = BeautifulSoup(data, htmlparser, parse_only=strainer, from_encoding='utf-8')
 | 
				
			||||||
            html = soup.find_all('table', {'style':'margin-bottom:30'})
 | 
					            html = soup.find_all('table', {'style':'margin-bottom:30'})
 | 
				
			||||||
            if(html):
 | 
					            if(html):
 | 
				
			||||||
                for i in range(1,4):
 | 
					                for i in range(1,4):
 | 
				
			||||||
@ -226,7 +230,7 @@ def GetEPGFromKT(ChannelInfo):
 | 
				
			|||||||
            html_data = response.content
 | 
					            html_data = response.content
 | 
				
			||||||
            data = unicode(html_data, 'euc-kr', 'ignore').encode('utf-8', 'ignore')
 | 
					            data = unicode(html_data, 'euc-kr', 'ignore').encode('utf-8', 'ignore')
 | 
				
			||||||
            strainer = SoupStrainer('table', {'id':'pop_day'})
 | 
					            strainer = SoupStrainer('table', {'id':'pop_day'})
 | 
				
			||||||
            soup = BeautifulSoup(data, 'lxml', parse_only=strainer, from_encoding='utf-8')
 | 
					            soup = BeautifulSoup(data, htmlparser, parse_only=strainer, from_encoding='utf-8')
 | 
				
			||||||
            html = soup.find('table', {'id':'pop_day'}).tbody.find_all('tr') if soup.find('table', {'id':'pop_day'}) else ''
 | 
					            html = soup.find('table', {'id':'pop_day'}).tbody.find_all('tr') if soup.find('table', {'id':'pop_day'}) else ''
 | 
				
			||||||
            if(html):
 | 
					            if(html):
 | 
				
			||||||
                for row in html:
 | 
					                for row in html:
 | 
				
			||||||
@ -273,7 +277,7 @@ def GetEPGFromLG(ChannelInfo):
 | 
				
			|||||||
            data = unicode(html_data, 'euc-kr', 'ignore').encode('utf-8', 'ignore')
 | 
					            data = unicode(html_data, 'euc-kr', 'ignore').encode('utf-8', 'ignore')
 | 
				
			||||||
            data = data.replace('<재>', '<재>').replace(' [..','').replace(' (..', '')
 | 
					            data = data.replace('<재>', '<재>').replace(' [..','').replace(' (..', '')
 | 
				
			||||||
            strainer = SoupStrainer('table')
 | 
					            strainer = SoupStrainer('table')
 | 
				
			||||||
            soup = BeautifulSoup(data, 'lxml', parse_only=strainer, from_encoding='utf-8')
 | 
					            soup = BeautifulSoup(data, htmlparser, parse_only=strainer, from_encoding='utf-8')
 | 
				
			||||||
            html = soup.find('table').tbody.find_all('tr') if soup.find('table') else ''
 | 
					            html = soup.find('table').tbody.find_all('tr') if soup.find('table') else ''
 | 
				
			||||||
            if(html):
 | 
					            if(html):
 | 
				
			||||||
                for row in html:
 | 
					                for row in html:
 | 
				
			||||||
@ -384,7 +388,7 @@ def GetEPGFromSKB(ChannelInfo):
 | 
				
			|||||||
            data = re.sub(pattern, partial(replacement, tag='span'), data)
 | 
					            data = re.sub(pattern, partial(replacement, tag='span'), data)
 | 
				
			||||||
            #print(data)
 | 
					            #print(data)
 | 
				
			||||||
            strainer = SoupStrainer('div', {'id':'dawn'})
 | 
					            strainer = SoupStrainer('div', {'id':'dawn'})
 | 
				
			||||||
            soup = BeautifulSoup(data, 'lxml', parse_only=strainer, from_encoding='utf-8')
 | 
					            soup = BeautifulSoup(data, htmlparser, parse_only=strainer, from_encoding='utf-8')
 | 
				
			||||||
            html =  soup.find_all('li') if soup.find_all('li') else ''
 | 
					            html =  soup.find_all('li') if soup.find_all('li') else ''
 | 
				
			||||||
            if(html):
 | 
					            if(html):
 | 
				
			||||||
                for row in html:
 | 
					                for row in html:
 | 
				
			||||||
@ -575,7 +579,6 @@ def GetEPGFromHcn(ChannelInfo):
 | 
				
			|||||||
    url = 'http://m.hcn.co.kr/sch_ScheduleList.action'
 | 
					    url = 'http://m.hcn.co.kr/sch_ScheduleList.action'
 | 
				
			||||||
    for k in range(period):
 | 
					    for k in range(period):
 | 
				
			||||||
        day = today + datetime.timedelta(days=k)
 | 
					        day = today + datetime.timedelta(days=k)
 | 
				
			||||||
        params = {'method': 'ajax_00', 'pageType': 'sheetList', 'ch_id': ServiceId, 'onairdate': day}
 | 
					 | 
				
			||||||
        params = {'ch_id': ServiceId, 'onairdate': day, '_':  int(time.time()*1000)}
 | 
					        params = {'ch_id': ServiceId, 'onairdate': day, '_':  int(time.time()*1000)}
 | 
				
			||||||
        try:
 | 
					        try:
 | 
				
			||||||
            response = requests.get(url, params=params, headers=ua, timeout=timeout)
 | 
					            response = requests.get(url, params=params, headers=ua, timeout=timeout)
 | 
				
			||||||
@ -583,7 +586,7 @@ def GetEPGFromHcn(ChannelInfo):
 | 
				
			|||||||
            html_data = response.content
 | 
					            html_data = response.content
 | 
				
			||||||
            data = html_data
 | 
					            data = html_data
 | 
				
			||||||
            strainer = SoupStrainer('li')
 | 
					            strainer = SoupStrainer('li')
 | 
				
			||||||
            soup = BeautifulSoup(data, 'lxml', parse_only=strainer, from_encoding='utf-8')
 | 
					            soup = BeautifulSoup(data, htmlparser, parse_only=strainer, from_encoding='utf-8')
 | 
				
			||||||
            html =  soup.find_all('li') if soup.find_all('li') else ''
 | 
					            html =  soup.find_all('li') if soup.find_all('li') else ''
 | 
				
			||||||
            if(html) :
 | 
					            if(html) :
 | 
				
			||||||
                for row in html:
 | 
					                for row in html:
 | 
				
			||||||
@ -662,6 +665,48 @@ def GetEPGFromPooq(ChannelInfo):
 | 
				
			|||||||
        else: pass
 | 
					        else: pass
 | 
				
			||||||
    epgzip(epginfo)
 | 
					    epgzip(epginfo)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Get EPG data from EVERYON
 | 
				
			||||||
 | 
					def GetEPGFromEveryon(ChannelInfo):
 | 
				
			||||||
 | 
					    ChannelId = ChannelInfo[0]
 | 
				
			||||||
 | 
					    ChannelName = ChannelInfo[1]
 | 
				
			||||||
 | 
					    ServiceId =  ChannelInfo[3]
 | 
				
			||||||
 | 
					    epginfo = []
 | 
				
			||||||
 | 
					    url = 'http://www.everyon.tv/mobile/schedule_ch.ptv'
 | 
				
			||||||
 | 
					    for k in range(period):
 | 
				
			||||||
 | 
					        day = today + datetime.timedelta(days=k)
 | 
				
			||||||
 | 
					        params = {'chid': ServiceId, 'date': day.strftime('%Y%m%d')}
 | 
				
			||||||
 | 
					        try:
 | 
				
			||||||
 | 
					            response = requests.get(url, params=params, headers=ua, timeout=timeout)
 | 
				
			||||||
 | 
					            response.raise_for_status()
 | 
				
			||||||
 | 
					            html_data = response.content
 | 
				
			||||||
 | 
					            data = html_data
 | 
				
			||||||
 | 
					            strainer = SoupStrainer('ul')
 | 
				
			||||||
 | 
					            soup = BeautifulSoup(data, htmlparser, parse_only=strainer, from_encoding='utf-8')
 | 
				
			||||||
 | 
					            html =  soup.find_all('ul',{'class':'lt2'}) if soup.find_all('ul') else ''
 | 
				
			||||||
 | 
					            if(html) :
 | 
				
			||||||
 | 
					                for row in html:
 | 
				
			||||||
 | 
					                    startTime = endTime = programName = subprogramName = desc = actors = producers = category = episode = ''
 | 
				
			||||||
 | 
					                    rebroadcast = False
 | 
				
			||||||
 | 
					                    rating = 0
 | 
				
			||||||
 | 
					                    startTime = str(day) + ' ' + row.find('li', {'class':'pr_time'}).text.strip()
 | 
				
			||||||
 | 
					                    startTime = datetime.datetime.strptime(startTime, '%Y-%m-%d %H:%M')
 | 
				
			||||||
 | 
					                    startTime = startTime.strftime('%Y%m%d%H%M%S')
 | 
				
			||||||
 | 
					                    programName = row.find('li', {'class':'pr_name'}).text.decode('string_escape').strip()
 | 
				
			||||||
 | 
					                    grade = row.find('li', {'class':'img'})['class'][1]
 | 
				
			||||||
 | 
					                    rating = grade.replace('c','').replace('all','0')
 | 
				
			||||||
 | 
					                    #ChannelId, startTime, programName, subprogramName, desc, actors, producers, category, episode, rebroadcast, rating
 | 
				
			||||||
 | 
					                    epginfo.append([ChannelId, startTime, programName, subprogramName, desc, actors, producers, category, episode, rebroadcast, rating])
 | 
				
			||||||
 | 
					                    time.sleep(0.001)
 | 
				
			||||||
 | 
					        except ValueError:
 | 
				
			||||||
 | 
					            if(debug): printError(ChannelName + CONTENT_ERROR)
 | 
				
			||||||
 | 
					            else: pass
 | 
				
			||||||
 | 
					        except (requests.exceptions.RequestException) as e:
 | 
				
			||||||
 | 
					            if(debug): printError(ChannelName + str(e))
 | 
				
			||||||
 | 
					            else: pass
 | 
				
			||||||
 | 
					    a = epgzip(epginfo)
 | 
				
			||||||
 | 
					    for i, j in a:
 | 
				
			||||||
 | 
					        print(i[1], j[1])
 | 
				
			||||||
 | 
					        print(i[2], j[2])
 | 
				
			||||||
# Get EPG data from MBC
 | 
					# Get EPG data from MBC
 | 
				
			||||||
def GetEPGFromMbc(ChannelInfo):
 | 
					def GetEPGFromMbc(ChannelInfo):
 | 
				
			||||||
    ChannelId = ChannelInfo[0]
 | 
					    ChannelId = ChannelInfo[0]
 | 
				
			||||||
@ -814,7 +859,7 @@ def GetEPGFromKbs(ChannelInfo):
 | 
				
			|||||||
            json_data = response.text
 | 
					            json_data = response.text
 | 
				
			||||||
            try:
 | 
					            try:
 | 
				
			||||||
                data = json.loads(json_data, encoding='utf-8')
 | 
					                data = json.loads(json_data, encoding='utf-8')
 | 
				
			||||||
                soup = BeautifulSoup(data['schedule'], 'lxml')
 | 
					                soup = BeautifulSoup(data['schedule'], htmlparser)
 | 
				
			||||||
                for row in soup.find_all('li'):
 | 
					                for row in soup.find_all('li'):
 | 
				
			||||||
                    startTime = endTime = programName = subprogramName = desc = actors = producers = category = episode = ''
 | 
					                    startTime = endTime = programName = subprogramName = desc = actors = producers = category = episode = ''
 | 
				
			||||||
                    rebroadcast = False
 | 
					                    rebroadcast = False
 | 
				
			||||||
@ -857,7 +902,7 @@ def GetEPGFromArirang(ChannelInfo):
 | 
				
			|||||||
                strainer = SoupStrainer('table', {'id':'aIRSW_sat'})
 | 
					                strainer = SoupStrainer('table', {'id':'aIRSW_sat'})
 | 
				
			||||||
            elif day.weekday() == 6:
 | 
					            elif day.weekday() == 6:
 | 
				
			||||||
                strainer = SoupStrainer('table', {'id':'aIRSW_sun'})
 | 
					                strainer = SoupStrainer('table', {'id':'aIRSW_sun'})
 | 
				
			||||||
            soup = BeautifulSoup(data, 'lxml', parse_only=strainer, from_encoding='utf-8')
 | 
					            soup = BeautifulSoup(data, htmlparser, parse_only=strainer, from_encoding='utf-8')
 | 
				
			||||||
            html =  soup.find_all('tr') if soup.find_all('tr') else ''
 | 
					            html =  soup.find_all('tr') if soup.find_all('tr') else ''
 | 
				
			||||||
            if(html):
 | 
					            if(html):
 | 
				
			||||||
                for row in html:
 | 
					                for row in html:
 | 
				
			||||||
@ -895,7 +940,7 @@ def GetEPGFromArirang(ChannelInfo):
 | 
				
			|||||||
            else: pass
 | 
					            else: pass
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Zip epginfo
 | 
					# Zip epginfo
 | 
				
			||||||
def epgzip(epginfo):
 | 
					def epgzip1(epginfo):
 | 
				
			||||||
    #ChannelId, startTime, programName, subprogramName, desc, actors, producers, category, episode, rebroadcast, rating
 | 
					    #ChannelId, startTime, programName, subprogramName, desc, actors, producers, category, episode, rebroadcast, rating
 | 
				
			||||||
    for epg1, epg2 in zip(epginfo, epginfo[1:]):
 | 
					    for epg1, epg2 in zip(epginfo, epginfo[1:]):
 | 
				
			||||||
        programdata = {}
 | 
					        programdata = {}
 | 
				
			||||||
@ -914,6 +959,27 @@ def epgzip(epginfo):
 | 
				
			|||||||
        programdata = {'channelId':ChannelId, 'startTime':startTime, 'endTime':endTime, 'programName':programName, 'subprogramName':subprogramName, 'desc':desc, 'actors':actors, 'producers':producers, 'category':category, 'episode':episode, 'rebroadcast':rebroadcast, 'rating':rating}
 | 
					        programdata = {'channelId':ChannelId, 'startTime':startTime, 'endTime':endTime, 'programName':programName, 'subprogramName':subprogramName, 'desc':desc, 'actors':actors, 'producers':producers, 'category':category, 'episode':episode, 'rebroadcast':rebroadcast, 'rating':rating}
 | 
				
			||||||
        writeProgram(programdata)
 | 
					        writeProgram(programdata)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def epgzip(epginfo):
 | 
				
			||||||
 | 
					    epginfo = iter(epginfo)
 | 
				
			||||||
 | 
					    epg1 = next(epginfo)
 | 
				
			||||||
 | 
					    for epg2 in epginfo:
 | 
				
			||||||
 | 
					        programdata = {}
 | 
				
			||||||
 | 
					        ChannelId = epg1[0]
 | 
				
			||||||
 | 
					        startTime = epg1[1] if epg1[1] else ''
 | 
				
			||||||
 | 
					        endTime = epg2[1] if epg2[1] else ''
 | 
				
			||||||
 | 
					        programName = epg1[2] if epg1[2] else ''
 | 
				
			||||||
 | 
					        subprogramName = epg1[3] if epg1[3] else ''
 | 
				
			||||||
 | 
					        desc = epg1[4] if epg1[4] else ''
 | 
				
			||||||
 | 
					        actors = epg1[5] if epg1[5] else ''
 | 
				
			||||||
 | 
					        producers = epg1[6] if epg1[6] else ''
 | 
				
			||||||
 | 
					        category = epg1[7] if epg1[7] else ''
 | 
				
			||||||
 | 
					        episode = epg1[8] if epg1[8] else ''
 | 
				
			||||||
 | 
					        rebroadcast = True if epg1[9] else False
 | 
				
			||||||
 | 
					        rating = int(epg1[10]) if epg1[10] else 0
 | 
				
			||||||
 | 
					        programdata = {'channelId':ChannelId, 'startTime':startTime, 'endTime':endTime, 'programName':programName, 'subprogramName':subprogramName, 'desc':desc, 'actors':actors, 'producers':producers, 'category':category, 'episode':episode, 'rebroadcast':rebroadcast, 'rating':rating}
 | 
				
			||||||
 | 
					        writeProgram(programdata)
 | 
				
			||||||
 | 
					        epg1 = epg2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Write Program
 | 
					# Write Program
 | 
				
			||||||
def writeProgram(programdata):
 | 
					def writeProgram(programdata):
 | 
				
			||||||
    ChannelId = programdata['channelId']
 | 
					    ChannelId = programdata['channelId']
 | 
				
			||||||
@ -948,7 +1014,7 @@ def writeProgram(programdata):
 | 
				
			|||||||
    else :
 | 
					    else :
 | 
				
			||||||
        rating = '%s세 이상 관람가' % (programdata['rating'])
 | 
					        rating = '%s세 이상 관람가' % (programdata['rating'])
 | 
				
			||||||
    if addverbose == 'y':
 | 
					    if addverbose == 'y':
 | 
				
			||||||
        desc = escape(programdata['programName']).strip()
 | 
					        desc = programName
 | 
				
			||||||
        if subprogramName : desc = desc + '\n부제 : ' + subprogramName
 | 
					        if subprogramName : desc = desc + '\n부제 : ' + subprogramName
 | 
				
			||||||
        if rebroadcast == True and addrebroadcast == 'y' : desc = desc + '\n방송 : 재방송'
 | 
					        if rebroadcast == True and addrebroadcast == 'y' : desc = desc + '\n방송 : 재방송'
 | 
				
			||||||
        if episode : desc = desc + '\n회차 : ' + str(episode) + '회'
 | 
					        if episode : desc = desc + '\n회차 : ' + str(episode) + '회'
 | 
				
			||||||
@ -1006,13 +1072,6 @@ def replacement(match, tag):
 | 
				
			|||||||
    else:
 | 
					    else:
 | 
				
			||||||
        return '';
 | 
					        return '';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def pairs(it):
 | 
					 | 
				
			||||||
    it = iter(it)
 | 
					 | 
				
			||||||
    prev = next(it)
 | 
					 | 
				
			||||||
    for v in it:
 | 
					 | 
				
			||||||
        yield prev, v
 | 
					 | 
				
			||||||
        prev = v
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Settingfile = os.path.dirname(os.path.abspath(__file__)) + '/epg2xml.json'
 | 
					Settingfile = os.path.dirname(os.path.abspath(__file__)) + '/epg2xml.json'
 | 
				
			||||||
ChannelInfos = []
 | 
					ChannelInfos = []
 | 
				
			||||||
try:
 | 
					try:
 | 
				
			||||||
@ -1050,7 +1109,6 @@ argu3.add_argument('-l', '--limit', dest = 'limit', type=int, metavar = "1-7", c
 | 
				
			|||||||
argu3.add_argument('--rebroadcast', dest = 'rebroadcast', metavar = 'y, n', choices = 'yn', help = '제목에 재방송 정보 출력', default = default_rebroadcast)
 | 
					argu3.add_argument('--rebroadcast', dest = 'rebroadcast', metavar = 'y, n', choices = 'yn', help = '제목에 재방송 정보 출력', default = default_rebroadcast)
 | 
				
			||||||
argu3.add_argument('--episode', dest = 'episode', metavar = 'y, n', choices = 'yn', help = '제목에 회차 정보 출력', default = default_episode)
 | 
					argu3.add_argument('--episode', dest = 'episode', metavar = 'y, n', choices = 'yn', help = '제목에 회차 정보 출력', default = default_episode)
 | 
				
			||||||
argu3.add_argument('--verbose', dest = 'verbose', metavar = 'y, n', choices = 'yn', help = 'EPG 정보 추가 출력', default = default_verbose)
 | 
					argu3.add_argument('--verbose', dest = 'verbose', metavar = 'y, n', choices = 'yn', help = 'EPG 정보 추가 출력', default = default_verbose)
 | 
				
			||||||
argu3.add_argument('--xmltvns', dest = 'xmltvns', metavar = 'y, n', choices = 'yn', help = '회차정보 xmltv_ns 출력', default = default_xmltvns)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
args = parser.parse_args()
 | 
					args = parser.parse_args()
 | 
				
			||||||
if args.MyISP : MyISP = args.MyISP
 | 
					if args.MyISP : MyISP = args.MyISP
 | 
				
			||||||
@ -1067,7 +1125,6 @@ if args.limit : default_fetch_limit = args.limit
 | 
				
			|||||||
if args.rebroadcast : default_rebroadcast = args.rebroadcast
 | 
					if args.rebroadcast : default_rebroadcast = args.rebroadcast
 | 
				
			||||||
if args.episode : default_episode = args.episode
 | 
					if args.episode : default_episode = args.episode
 | 
				
			||||||
if args.verbose : default_verbose = args.verbose
 | 
					if args.verbose : default_verbose = args.verbose
 | 
				
			||||||
if args.xmltvns : default_xmltvns = args.xmltvns
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
if MyISP:
 | 
					if MyISP:
 | 
				
			||||||
    if not any(MyISP in s for s in ['ALL', 'KT', 'LG', 'SK']):
 | 
					    if not any(MyISP in s for s in ['ALL', 'KT', 'LG', 'SK']):
 | 
				
			||||||
@ -1163,8 +1220,4 @@ elif output == "socket" :
 | 
				
			|||||||
    else :
 | 
					    else :
 | 
				
			||||||
        printError("epg2xml.json 파일의 default_xml_socket항목이 없습니다.");
 | 
					        printError("epg2xml.json 파일의 default_xml_socket항목이 없습니다.");
 | 
				
			||||||
        sys.exit()
 | 
					        sys.exit()
 | 
				
			||||||
#getEpg()
 | 
					getEpg()
 | 
				
			||||||
it= [1,2,3,4,5]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
for cur, next in pairs(it):
 | 
					 | 
				
			||||||
    print (cur, next)
 | 
					 | 
				
			||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user