diff --git a/epg2xml.php b/epg2xml.php new file mode 100644 index 0000000..d6ea211 --- /dev/null +++ b/epg2xml.php @@ -0,0 +1,565 @@ +#!/usr/bin/env php +getMessage()); + exit; + } + endif; + } + catch(Exception $e) { + printError($e->getMessage()); + exit; + } + + printf("\n"); + printf("\n\n"); + + printf("\n", VERSION); + + foreach ($Channeldatas as $Channeldata) : #Get Channel & Print Channel info + if($Channeldata['Enabled'] == 1) : + $ChannelId = $Channeldata['Id']; + $ChannelName = $Channeldata['Name']; + $ChannelSource = $Channeldata['Source']; + $ChannelServiceId = $Channeldata['ServiceId']; + $ChannelISPName = "[".$Channeldata[$MyISP.'Ch']."]".$Channeldata[$MyISP." Name"]; + $ChannelIconUrl = $Channeldata['Icon_url']; + + if($Channeldata[$MyISP.'Ch'] != Null): + $ChannelInfos[] = array($ChannelId, $ChannelName, $ChannelSource, $ChannelServiceId); + printf(" \n", $ChannelId); + printf(" %s\n", $ChannelName); + printf(" %s\n", $ChannelISPName); + if($IconUrl) : + printf(" \n", $IconUrl, $ChannelId); + else : + printf(" \n", $ChannelIconUrl); + endif; + printf(" \n"); + endif; + endif; + endforeach; + + # Print Program Information + foreach ($ChannelInfos as $ChannelInfo) : + $ChannelId = $ChannelInfo[0]; + $ChannelName = $ChannelInfo[1]; + $ChannelSource = $ChannelInfo[2]; + $ChannelServiceId = $ChannelInfo[3]; + if($GLOBALS['debug']) printLog($ChannelName.' 채널 EPG 데이터를 가져오고 있습니다'); + if($ChannelSource == 'EPG') : + //GetEPGFromEPG($ChannelInfo); + elseif($ChannelSource == 'KT') : + GetEPGFromKT($ChannelInfo); + elseif($ChannelSource == 'LG') : + GetEPGFromLG($ChannelInfo); + elseif($ChannelSource == 'SK') : + //GetEPGFromSK($ChannelInfo); + elseif($ChannelSource == 'SKY') : + GetEPGFromSKY(ChannelInfo); + elseif($ChannelSource == 'NAVER') : + GetEPGFromNaver(ChannelInfo); + endif; + endforeach; + print("\n"); +} +function GetEPGFromEPG($ChannelInfo) { + $ChannelId = $ChannelInfo[0]; + $ChannelName = $ChannelInfo[1]; + $ServiceId = $ChannelInfo[3]; + $epginfo = array(); + $options = array( + 'http' => array( + 'method' => 'GET', + 'user-agent' => $GLOBALS['ua'] + )); + $context = stream_context_create($options); + + foreach(range(1, $GLOBALS['period']) as $k) : + $url = "http://www.epg.co.kr/epg-cgi/extern/cnm_guide_type_v070530.cgi"; + $day = date("Ymd", strtotime("+".($k - 1)." days")); + $params = array( + 'beforegroup' => '100', + 'checkchannel' => $ServiceId, + 'select_group' => '100', + 'start_date' => $day + ); + + $params = http_build_query($params); + $url = $url."?".$params; + try { + $response = @file_get_contents($url, False, $context); + if ($response === False) : + throw new Exception ($ChannelName.HTTP_ERROR); + else : + $response = str_replace("charset=euc-kr", "charset=utf-8", $response); + $dom = new DomDocument; + libxml_use_internal_errors(true); + $dom->loadHTML(mb_convert_encoding($response, 'UTF-8', 'EUC-KR')); + $xpath = new DomXPath($dom); + for($i = 2; $i < 5; $i++) : + $thisday = $day; + $query = "//table[contains(@style,'margin-bottom:30')][".$i."]//td[contains(@colspan,'2')]/following::td[1]/table[1]//td[2]"; + $programs = $xpath->query($query); + foreach($programs as $program) : + $hour = $xpath->query("parent::*/parent::*/parent::*/parent::*/td[1]", $program)->item(0); + $hour = str_replace("시", "", trim($hour->nodeValue)); + $minute = $xpath->query("preceding-sibling::td[1]", $program)->item(0); + $hour = $hour.":".str_replace(array("[", "]"), array("",""), trim($minute->nodeValue)); + switch ($i) : + case 2 : + $hour = $hour." AM"; + break; + case 3 : + $hour = $hour." PM"; + break; + case 4 : + if($hour > 5 ) : + $hour = $hour." PM"; + else : + $hour = $hour." AM"; + $thisday = date("Ymd", strtotime("+1 days")); + endif; + break; + endswitch; + $startTime = date("YmdHis", strtotime($thisday." ".$hour)); + preg_match('/?(.*)?(.*?)\s*(<(.*)>)?\s*(\(재\))?\s*(\(([\d,]+)회\))?()?\s*<\/td>/', trim($dom->saveHTML($program)), $matches); + //var_dump($matches); + if ($matches != NULL) : + $image = $matches[8] ? $matches[8] : ""; + preg_match('/.*schedule_([\d,]+)?.*/', $image, $grade); + if($grade != NULL) : + $rating = $grade[1]; + else : + $rating = 0; + endif; + endif; + #programName, startTime, rating, subprogramName, rebroadcast, episode + $epginfo[] = array(trim($matches[2]), $startTime, $rating, trim($matches[4]), $matches[5], $matches[7]); + endforeach; + endfor; + $zipped = array_slice(array_map(NULL, $epginfo, array_slice($epginfo,1)),0,-1); + foreach($zipped as $epg) : + $programName = $epg[0][0] ?: ""; + $subprogramName = $epg[0][3] ?: ""; + $startTime = $epg[0][1] ?: ""; + $endTime = $epg[1][1] ?: ""; + $desc = ""; + $actors = ""; + $producers = ""; + $category = ""; + $rebroadcast = $epg[0][4] ? True : False; + $episode = $epg[0][5] ?: ""; + $rating = $epg[0][2] ?: 0; + $programdata = array( + '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); + endforeach; + endif; + } catch (Exception $e) { + printError($e->getMessage()); + } + endforeach; +} +function GetEPGFromKT($ChannelInfo) { + $ChannelId = $ChannelInfo[0]; + $ChannelName = $ChannelInfo[1]; + $ServiceId = $ChannelInfo[3]; + $epginfo = array(); + $options = array( + 'http' => array( + 'method' => 'GET', + 'user-agent' => $GLOBALS['ua'] + )); + $context = stream_context_create($options); +} +function GetEPGFromLG($ChannelInfo) { +} + +function GetEPGFromSK($ChannelInfo) { + $ChannelId = $ChannelInfo[0]; + $ChannelName = $ChannelInfo[1]; + $ServiceId = $ChannelInfo[3]; + $today = date("Ymd"); + $lastday = date("Ymd", strtotime("+".($GLOBALS['period'] - 1)." days")); + $options = array( + 'http' => array( + 'method' => 'GET', + 'user-agent' => $GLOBALS['ua'] + )); + $context = stream_context_create($options); + $url = "http://m.btvplus.co.kr/Common/Inc/IFGetData.asp"; + $params = array( + 'variable' => 'IF_LIVECHART_DETAIL', + 'pcode' => '|^|start_time='.$today.'00|^|end_time='.$lastday.'24|^|svc_id='.$ServiceId + ); + $params = http_build_query($params); + $url = $url."?".$params; + try { + $response = @file_get_contents($url, False, $context); + if ($response === False) : + throw new Exception ($ChannelName.HTTP_ERROR); + else : + try { + $data = json_decode($response, TRUE); + if(json_last_error() != JSON_ERROR_NONE) throw new Exception(JSON_SYNTAX_ERROR); + if($data['channel'] == NULL) : + printError($ChannelName.CHANNEL_ERROR); + else : + $programs = $data['channel']['programs']; + foreach ($programs as $program) : + $programName = ""; + $subprogramName = ""; + $episode = ""; + $rebroadcast = False; + preg_match('/^(.*?)(?:\s*[\(<]([\d,회]+)[\)>])?(?:\s*<([^<]*?)>)?(\((재)\))?$/', str_replace('...', '>', $program['programName']), $matches); + if ($matches != NULL) : + $programName = trim($matches[1]) ?: ""; + $subprogramName = trim($matches[3]) ?: ""; + $episode = str_replace("회", "", $matches[2]) ?: ""; + $rebroadcast = $matches[5] ? True : False; + endif; + $startTime = date("YmdHis",$program['startTime']/1000); + $endTime = date("YmdHis",$program['endTime']/1000); + if ($GLOBALS['verbose'] == 'y') : + $desc = $program['synopsis'] ?: ""; + $actors =trim(str_replace('...','',$program['actorName']), ', ') ?: "";//.replace('...','').strip(', ') if program['actorName'] else '' + $producers = trim(str_replace('...','',$program['directorName']), ', ') ?: "";// if program['directorName'] else '' + else : + $desc = ""; + $actors = ""; + $producers = ""; + endif; + if ($program['mainGenreName'] != NULL) : + $category = $program['mainGenreName']; + else: + $category = ''; + endif; + $rating = $program['ratingCd'] ?: 0; + $programdata = array( + '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); + endforeach; + endif; + } + catch(Exception $e) { + printError($e->getMessage()); + } + endif; + } catch (Exception $e) { + printError($e->getMessage()); + } +} +function GetEPGFromSKY($ChannelInfo) { +} +function GetEPGFromNaver($ChannelInfo) { +} +function writeProgram($programdata) { + $ChannelId = $programdata['channelId']; + $startTime = $programdata['startTime']; + $endTime = $programdata['endTime']; + $programName = $programdata['programName']; + $subprogramName = $programdata['subprogramName']; + $actors = $programdata['actors']; + $producers = $programdata['producers']; + $category = $programdata['category']; + $episode = $programdata['episode']; + $rebroadcast = $programdata['rebroadcast']; + if($GLOBALS['addepisode'] == 'y') $programName = $programName." (".$episode."회)"; + if($rebroadcast == True && $GLOBALS['addrebroadcast'] == 'y') $programName = $programName." (재)"; + if($programdata['rating'] == 0) : + $rating = "전체 관람가"; + else : + $rating = sprintf("%s세 이상 관람가", $programdata['rating']); + endif; + if($GLOBALS['verbose'] == 'y') : + $desc = $programdata['programName']; + if($subprogramName) $desc = $desc."\n부제 : ".$subprogramName; + if($episode) $desc = $desc."\n회차 : (".$episode."회)"; + if($category) $desc = $desc."\n장르 : ".$category; + if($actors) $desc = $desc."\n출연 : ".$actors; + if($producers) $desc = $desc."\n제작 : ".$producers; + $desc = $desc."\n등급 : ".$rating; + else: + $desc = ""; + endif; + if($programdata['desc']) $desc = $desc."\n".$programdata['desc']; + $contentTypeDict = array( + '교양' => 'Arts / Culture (without music)', + '만화' => 'Cartoons / Puppets', + '교육' => 'Education / Science / Factual topics', + '취미' => 'Leisure hobbies', + '드라마' => 'Movie / Drama', + '영화' => 'Movie / Drama', + '음악' => 'Music / Ballet / Dance', + '뉴스' => 'News / Current affairs', + '다큐' => 'Documentary', + '시사/다큐' => 'Documentary', + '연예' => 'Show / Game show', + '스포츠' => 'Sports', + '홈쇼핑' => 'Advertisement / Shopping' + ); + $contentType = ""; + foreach($contentTypeDict as $key => $value) : + if(!(strpos($category, $key) === false)) : + $contentType = $value; + endif; + endforeach; + printf(" \n", $startTime, $endTime, $ChannelId); + printf(" %s\n", $programName); + if($subprogramName) : + printf(" %s\n", $subprogramName); + endif; + if($GLOBALS['verbose']=='y') : + printf(" %s\n", $desc); + if($actors || $producers): + printf(" \n"); + if($actors) : + foreach(split(',', $actors) as $actor): + if($actor) printf(" %s\n", $actor); + endforeach; + endif; + if($producers) : + foreach(split(',', $producers) as $producer): + if($producer) printf(" %s\n", $producer); + endforeach; + endif; + printf(" \n"); + endif; + endif; + if($category) printf(" %s\n", $category); + if($contentType) printf(" %s\n", $contentType); + if($episode) printf(" %s\n", $episode); + if($rebroadcast) printf(" \n"); + if($rating) : + printf(" \n"); + printf(" %s\n", $rating); + printf(" \n"); + endif; + printf(" \n"); +} +function printLog($args) { + fwrite(STDERR, $args."\n"); +} +function printError($args) { + fwrite(STDERR, "Error : ".$args."\n"); +} +set_error_handler (function ($errno, $errstr, $errfile, $errline) { + throw new ErrorException ($errstr, 0, $errno, $errfile, $errline); +}); +?>