From 4f12b7789fa3b5ad1460c65c9e2b2ce7a3f7e4e1 Mon Sep 17 00:00:00 2001 From: wonipapa Date: Thu, 13 Jul 2017 17:50:00 +0900 Subject: [PATCH 01/41] =?UTF-8?q?=EC=98=A4=ED=83=80=20=EC=88=98=EC=A0=95,?= =?UTF-8?q?=20SK=20=EB=82=B4=EC=99=B8=EA=B2=BD=EC=A0=9CTV=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Channel.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Channel.json b/Channel.json index 30df99a..209e394 100644 --- a/Channel.json +++ b/Channel.json @@ -59,7 +59,7 @@ {"Id":72,"Name":"FISHING TV","KT Name":"FISHING TV","KTCh":119,"LG Name":"FSTV","LGCh":65,"SK Name":"FISHING TV","SKCh":244,"Icon_url":"http://i.imgur.com/Go4FdK1.png","Source":"SKY","ServiceId":254,"Enabled":0}, {"Id":73,"Name":"푸드TV","KT Name":"푸드TV","KTCh":78,"LG Name":"푸드TV","LGCh":83,"SK Name":"Food TV","SKCh":213,"Icon_url":"http://i.imgur.com/F9Rb9SA.png","Source":"SKY","ServiceId":556,"Enabled":0}, {"Id":74,"Name":"FOX","KT Name":"FOX","KTCh":107,"LG Name":"FOX채널","LGCh":44,"SK Name":"FOX","SKCh":101,"Icon_url":"http://i.imgur.com/8usDWOC.png","Source":"SKY","ServiceId":706,"Enabled":0}, -{"Id":75,"Name":"Fox life","KT Name":"","KTCh":null,"LG Name":"","LGCh":null,"SK Name":"Fox life","SKCh":216,"Icon_url":"http://i.imgur.com/CqVujLk.png","Source":"NAVR","ServiceId":814754,"Enabled":0}, +{"Id":75,"Name":"Fox life","KT Name":"","KTCh":null,"LG Name":"","LGCh":null,"SK Name":"Fox life","SKCh":216,"Icon_url":"http://i.imgur.com/CqVujLk.png","Source":"NAVER","ServiceId":814754,"Enabled":0}, {"Id":76,"Name":"Fox News","KT Name":"Fox News","KTCh":195,"LG Name":"","LGCh":null,"SK Name":"","SKCh":null,"Icon_url":"http://i.imgur.com/9rGThzD.png","Source":"NAVER","ServiceId":815413,"Enabled":0}, {"Id":78,"Name":"FTV","KT Name":"FTV","KTCh":118,"LG Name":"FTV","LGCh":64,"SK Name":"FTV","SKCh":243,"Icon_url":"http://i.imgur.com/eI9wGgS.png","Source":"SKY","ServiceId":969,"Enabled":0}, {"Id":79,"Name":"FUN TV","KT Name":"FUN TV","KTCh":71,"LG Name":"","LGCh":null,"SK Name":"FUN TV","SKCh":91,"Icon_url":"http://i.imgur.com/6V8X43L.png","Source":"KT","ServiceId":71,"Enabled":0}, @@ -178,7 +178,7 @@ {"Id":221,"Name":"가요TV","KT Name":"가요TV","KTCh":93,"LG Name":"가요TV","LGCh":102,"SK Name":"","SKCh":null,"Icon_url":"http://i.imgur.com/6ncOOSg.png","Source":"NAVER","ServiceId":814829,"Enabled":0}, {"Id":222,"Name":"국방TV","KT Name":"국방TV","KTCh":260,"LG Name":"국방TV","LGCh":174,"SK Name":"국방TV","SKCh":282,"Icon_url":"http://i.imgur.com/yyXkYzJ.png","Source":"SKY","ServiceId":698,"Enabled":0}, {"Id":223,"Name":"국회방송","KT Name":"국회방송","KTCh":65,"LG Name":"국회방송","LGCh":172,"SK Name":"국회방송","SKCh":291,"Icon_url":"http://i.imgur.com/l1OEn7O.png","Source":"LG","ServiceId":717,"Enabled":0}, -{"Id":225,"Name":"내외경제TV","KT Name":"내외경제TV","KTCh":285,"LG Name":"","LGCh":null,"SK Name":"","SKCh":null,"Icon_url":"http://i.imgur.com/cQHPmCw.png","Source":"KT","ServiceId":285,"Enabled":0}, +{"Id":225,"Name":"내외경제TV","KT Name":"내외경제TV","KTCh":285,"LG Name":"","LGCh":null,"SK Name":"내외경제TV","SKCh":164,"Icon_url":"http://i.imgur.com/cQHPmCw.png","Source":"KT","ServiceId":285,"Enabled":0}, {"Id":226,"Name":"다문화티브이","KT Name":"다문화티브이","KTCh":283,"LG Name":"","LGCh":null,"SK Name":"","SKCh":null,"Icon_url":"http://i.imgur.com/nZK3lCC.png","Source":"KT","ServiceId":283,"Enabled":0}, {"Id":228,"Name":"대교 어린이TV","KT Name":"대교 어린이TV","KTCh":141,"LG Name":"어린이TV","LGCh":156,"SK Name":"어린이TV","SKCh":191,"Icon_url":"http://i.imgur.com/CETWIE6.png","Source":"SKY","ServiceId":17,"Enabled":0}, {"Id":229,"Name":"동아TV","KT Name":"동아TV","KTCh":82,"LG Name":"동아TV","LGCh":84,"SK Name":"동아TV","SKCh":218,"Icon_url":"http://i.imgur.com/AlmV8jS.png","Source":"SKY","ServiceId":247,"Enabled":0}, From 03da7697910ee231b32566f28eab577c0e5127bc Mon Sep 17 00:00:00 2001 From: wonipapa Date: Thu, 13 Jul 2017 18:04:32 +0900 Subject: [PATCH 02/41] =?UTF-8?q?SK=20=EB=82=B4=EC=99=B8=EA=B2=BD=EC=A0=9C?= =?UTF-8?q?=20TV=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 채널정보.xlsx | Bin 82875 -> 82913 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/채널정보.xlsx b/채널정보.xlsx index dc68b491fb8f786c8f208a9e79141544f9377dc3..59668e16a7478ddfb7fb11dfec24e2dd4f9c1e1d 100644 GIT binary patch delta 48210 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

gaTJFJv=u|v)UWEZ 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 delta 48220 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 From 2abd8db3448bd2cde225cef98428063d4fe3b747 Mon Sep 17 00:00:00 2001 From: wonipapa Date: Thu, 13 Jul 2017 18:04:59 +0900 Subject: [PATCH 03/41] =?UTF-8?q?SKB=20=ED=95=A8=EC=88=98=20=EC=86=8D?= =?UTF-8?q?=EB=8F=84=20=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- epg2xml.py | 44 +++++++++++++++++++++++--------------------- 1 file changed, 23 insertions(+), 21 deletions(-) diff --git a/epg2xml.py b/epg2xml.py index a64f377..0b67e00 100644 --- a/epg2xml.py +++ b/epg2xml.py @@ -35,7 +35,7 @@ except ImportError: reload(sys) sys.setdefaultencoding('utf-8') -__version__ = '1.2.1' +__version__ = '1.2.2' if not sys.version_info[:2] == (2, 7): print("Error : ", "python 2.7 버전이 필요합니다.", file=sys.stderr) @@ -364,36 +364,38 @@ def GetEPGFromSKB(ChannelInfo): ChannelName = ChannelInfo[1] ServiceId = ChannelInfo[3] url = 'http://www.skbroadband.com/content/realtime/Channel_List.do' + url = 'http://m.skbroadband.com/content/realtime/Channel_List.do' + #?key_depth1=5100&key_depth2=430&key_depth3=20170715' epginfo = [] for k in range(period): day = today + datetime.timedelta(days=k) - params = {'key_depth2': ServiceId, 'key_depth3': day.strftime('%Y%m%d'), 'tab_gubun':'lst'} + params = {'key_depth2': ServiceId, 'key_depth3': day.strftime('%Y%m%d')} try: - response = requests.post(url, data=params, headers=ua, timeout=timeout) + response = requests.get(url, params=params, headers=ua, timeout=timeout) response.raise_for_status() html_data = response.content data = unicode(html_data, 'euc-kr', 'ignore').encode('utf-8', 'ignore') - strainer = SoupStrainer('tr', {'class':day.strftime('%Y%m%d')}) + strainer = SoupStrainer('div', {'id':'dawn'}) soup = BeautifulSoup(data, 'lxml', parse_only=strainer, from_encoding='utf-8') - html = soup.find_all('tr') if soup.find_all('tr') else '' + html = soup.find_all('li') if soup.find_all('li') else '' if(html): for row in html: - startTime = str(day) + ' ' + row.find('th').text - for cell in [row.find_all('td')]: - pattern = "^(.*?)(\(([\d,]+)회\))?(<(.*)>)?(\((재)\))?$" - matches = re.match(pattern, cell[0].text.decode('string_escape')) - if not(matches is None) : - programName = matches.group(1) if matches.group(1) else '' - subprogramName = matches.group(5) if matches.group(5) else '' - rebroadcast = True if matches.group(7) else False - episode = matches.group(3) if matches.group(3) else '' - rating = re.match('.*\s*([\d,]+)\s*.*', cell[1].text.decode('string_escape')) - if not(rating is None) : - rating = int(rating.group(1)) - else : - rating = 0 + startTime = str(day) + ' ' + row.find('span', {'class':'time'}).text + cell = row.find('span', {'class':None}).text.decode('string_escape').strip() + pattern = "^(.*?)(\(([\d,]+)회\))?(<(.*)>)?(\((재)\))?$" + matches = re.match(pattern, cell) + if not(matches is None) : + programName = matches.group(1) if matches.group(1) else '' + subprogramName = matches.group(5) if matches.group(5) else '' + rebroadcast = True if matches.group(7) else False + episode = matches.group(3) if matches.group(3) else '' + rating = row.find('span', {'class':re.compile('^watch.*$')}) + if not(rating is None) : + rating = int(rating.text.decode('string_escape').replace('세','').strip()) + else : + rating = 0 #programName, startTime, rating, subprogramName, rebroadcast, episode - epginfo.append([programName, startTime, rating, subprogramName, rebroadcast, episode]) + epginfo.append([programName, startTime, rating, subprogramName, rebroadcast, episode]) else: if(debug): printError(ChannelName + CONTENT_ERROR) else: pass @@ -530,7 +532,7 @@ def GetEPGFromMbc(ChannelInfo): for k in range(period): day = today + datetime.timedelta(days=k) try: - response = requests.get(url, params=params, headers=ua) + response = requests.get(url, params=params, headers=ua, timeout=timeout) response.raise_for_status() json_data = response.text try: From a90df8be49f5ee5b72ae27095746b095a0157d1b Mon Sep 17 00:00:00 2001 From: wonipapa Date: Tue, 25 Jul 2017 12:34:19 +0900 Subject: [PATCH 04/41] Update README.md --- README.md | 92 ++++++++++++++++++++++++++++--------------------------- 1 file changed, 47 insertions(+), 45 deletions(-) diff --git a/README.md b/README.md index 498e37d..f813c11 100644 --- a/README.md +++ b/README.md @@ -1,23 +1,21 @@ # EPG2XML -이 프로그램은 EPG(Electronic Program Guide)를 웹상의 여러 소스에서 가져와서 XML로 출력하는 프로그램으로 python2.7 및 php5.4.45 이상에서 사용 가능하도록 제작되었다. - -python3과 php 5.4.45 이하에서는 정상적인 작동을 보장하지 못한다. - -또한 외부의 소스를 분석하여 EPG 정보를 가공하여 보여주는 것이므로 외부 소스 사이트가 변경되거나 삭제되면 문제가 발생할 수 있다. +이 프로그램은 EPG(Electronic Program Guide)를 웹상의 여러 소스에서 가져와서 XML로 출력하는 프로그램으로 python2.7 및 php5.4.45 이상에서 사용 가능하도록 제작되었다. +python3과 php 5.4.45 이하에서는 정상적인 작동을 보장하지 못한다. +또한 외부의 소스를 분석하여 EPG 정보를 가공하여 보여주는 것이므로 외부 소스 사이트가 변경되거나 삭제되면 문제가 발생할 수 있다. ## 필요 모듈 ### epg2xml.py -BeautifulSoup(bs4), lxml, requests 모듈이 추가로 필요하다. -설치 OS별로 모듈을 설치하기 위한 사전 설치 방법이 다를 수도 있으므로 검색해서 설치하도록 한다. -pip install beautifulsoup4, pip install lxml, pip install requests 로 추가할 수 있다. -* easy_install로 설치시 모듈이 인식되지 않는 경우가 있으므로 pip로 설치하기를 권한다. +BeautifulSoup(bs4), lxml, requests 모듈이 추가로 필요하다. +설치 OS별로 모듈을 설치하기 위한 사전 설치 방법이 다를 수도 있으므로 검색해서 설치하도록 한다. +pip install beautifulsoup4, pip install lxml, pip install requests 로 추가할 수 있다. +* easy_install로 설치시 모듈이 인식되지 않는 경우가 있으므로 pip로 설치하기를 권한다. ### epg2xml.php json, dom, mbstring, openssl, curl 모듈이 필요하다. 일반적으로 PHP가 설치되어 있다면 대부분 설치되어 있는 모듈이나 설치되어 있지 않을 경우 추가로 설치해야 한다. ### epg2xml-web.php -epg2xml.php와 동일 +epg2xml.php와 동일하다. ## 설정방법 ### epg2xml.json @@ -34,15 +32,16 @@ default_xml_socket : External XMLTV 사용시 xmltv.sock가 있는 경로로 ### Channel.json -Channel.json 파일을 텍스트 편집기로 열어보면 각채널별 정보가 들어 있다. -이중 Enabled:1로 되어 있는 부분을 Enabled:0으로 바꾸면 EPG정보를 가져오지 않는다. -필요없는 채널정보를 가져오지 않게 하는 것으로 EPG 정보 수집시 시간을 단축할 수 있다. -삭제된 채널등으로 인해서 오류 발생시에도 Enabled:0으로 변경하면 오류 발생을 차단할 수 있다. +Channel.json 파일의 최신버전 https://github.com/wonipapa/Channel.json 에서 다운받을 수 있다. +Channel.json 파일을 텍스트 편집기로 열어보면 각채널별 정보가 들어 있다. +이중 Enabled:1로 되어 있는 부분을 Enabled:0으로 바꾸면 EPG정보를 가져오지 않는다. +필요없는 채널정보를 가져오지 않게 하는 것으로 EPG 정보 수집시 시간을 단축할 수 있다. +삭제된 채널등으로 인해서 오류 발생시에도 Enabled:0으로 변경하면 오류 발생을 차단할 수 있다. ## 옵션 소개 ### epg2xml.py, epg2xml.php 옵션 -실행시 사용가능한 인수는 --help 명령어로 확인이 가능하다 -epg2xml.json의 설정을 옵션의 인수를 이용하여 변경할 수 있다. +실행시 사용가능한 인수는 --help 명령어로 확인이 가능하다. +epg2xml.json의 설정을 옵션의 인수를 이용하여 변경할 수 있다.

 -h --help : 도움말 출력
 --version : 버전을 보여준다.
@@ -58,14 +57,15 @@ epg2xml.json의 설정을 옵션의 인수를 이용하여 변경할 수 있다.
 
### epg2xml-web.php 옵션 -실행시 사용가능한 인수는 epg2xml.php?help 명령어로 확인이 가능하다 -epg2xml.json의 설정을 옵션의 인수를 이용하여 변경할 수 있다. +실행시 사용가능한 인수는 epg2xml.php?help 명령어로 확인이 가능하다. +epg2xml.json의 설정을 옵션의 인수를 이용하여 변경할 수 있다. ex : http://domain/epg2xml.php?i=ALL&l=2 ## 사용방법 ### tv_grab_file 사용시 (https://github.com/nurtext/tv_grab_file_synology) -tv_grab_file 안의 cat xmltv.xml 또는 wget 부분을 아래와 같이 변경해준다. +tv_grab_file 안의 cat xmltv.xml 또는 wget 부분을 아래와 같이 변경해준다. +python 경로와 php의 경로는 /usr/bin에 있고, epg2xml 파일은 /home/hts에 있는 것으로 가정했다. #### PYTHON의 경우
@@ -81,8 +81,8 @@ tv_grab_file 안의 cat xmltv.xml 또는 wget 부분을 아래와 같이 변경
 
 #### PHP WEB의 경우
 
-http://domain/epg2xml.php 또는
-http://domain/epg2xml.php?i=ALL&l=2
+wget -O - http://domain/epg2xml.php 또는
+wget -O - http://domain/epg2xml.php?i=ALL&l=2
 
### XMLTV SOCKET 사용시 @@ -100,6 +100,9 @@ http://domain/epg2xml.php?i=ALL&l=2 /home/hts/epg2xml.php
+#### PHP WEB의 경우 +php web 버전은 xmltv.sock을 지원하지 않는다. + ## 라이센스 BSD @@ -110,7 +113,7 @@ https://github.com/wonipapa/epg2xml/wiki https://github.com/wonipapa/epg2xml/wiki/FAQ ## 변경사항 - ### Version 1.2.1 +### Version 1.2.1 - SKB 함수 추가 - 가져오는 날짜 최대 2일로 변경 - 타이틀이 1부, 2부 등 을 포함할 때 1부, 2부를 서브타이틀로 이동 @@ -119,26 +122,26 @@ https://github.com/wonipapa/epg2xml/wiki/FAQ - Channel 소스 변경 - GCN 채널 삭제 - readme.txt Readme.md로 통합 - ### Version 1.2.0 +### Version 1.2.0 - 커넥션 관련 에러 예외 처리 추가 - 채널 소스 변경 - Channel.json release date 추가 - ### Version 1.1.9 +### Version 1.1.9 - 언어 버전 사항 체크 - 필요 모듈 사항 체크 - 버그 수정 - php 버전 웹 버전 추가 - php 버전 file_get_contents를 curl 사용으로 수정 - ### Version 1.1.8 +### Version 1.1.8 - KBS 함수 추가 - 채널 변경 사항 반영 - 스카이라이프 url 변경 - EPG 누락 데이터 수정 - ### Version 1.1.7 +### Version 1.1.7 - PHP 7.0 지원 - 채널 변경 사항 반영 - 라디오 채널 추가 - ### Version 1.1.6 +### Version 1.1.6 - iptv 선택 항목에 ALL 추가 - 에피소드 넘버 출력 수정 - 시작 시간 에러 출력 수정 @@ -146,51 +149,51 @@ https://github.com/wonipapa/epg2xml/wiki/FAQ - 서브타이틀 추출 수정 - 데이터 중복 출력 문제 수정 - php 버전이 5.6.3 이전일 때 DOM access 관련 에러 수정 - ### Version 1.1.5 +### Version 1.1.5 - inline 변수 재추가 - ### Version 1.1.4 +### Version 1.1.4 - epg2xml.json 파일 도입 - inline 변수 삭제 - PHP 버전 추가 - 버그 수정 - ### Version 1.1.3 +### Version 1.1.3 - 제목에 회차정보, 재방송 정보 추가시 오류 수정 - ### Version 1.1.2 +### Version 1.1.2 - 재방송정보, 회차정보 옵션 추가 - ### Version 1.1.1 +### Version 1.1.1 - sk 카테고리 오류 수정 - ### Version 1.1.0 +### Version 1.1.0 - 채널 아이콘 추가 - 오류 메시지 통합 - ### Version 1.0.9 +### Version 1.0.9 - 소켓파일이 없을 때 오류 추가 - 채널 변경 사항 반영 - ### Version 1.0.8 +### Version 1.0.8 - 정지 시간 추가 - 오류 출력 구문 디버그시만 출력으로 변경 - 채널 소스 변경 - ### Version 1.0.7 +### Version 1.0.7 - urllib2를 requests로 변경 - User Agent 변경 - 오류 처리 추가 - 채널 변경 사항 반영 - 채널 소스 변경 - 지역 지상파 채널 추가 - ### Version 1.0.6 +### Version 1.0.6 - urllib를 urllib2로 변경 - User Agent 추가 - 채널 변경 사항 반영 - ### Version 1.0.5 +### Version 1.0.5 - epg.co.kr의 epg 정보 못가져오는 것 수정 - ### Version 1.0.4 +### Version 1.0.4 - KODI에서 사용가능하도록 수정 - 제목에서 서브타이틀 및 회차 분리 - 서브타이틀 추가 - 출연, 제작진 개인별로 분리 - ### Version 1.0.3 +### Version 1.0.3 - Channel.json 파일 오류 수정 - LG를 소스로 하는 EPG 정보 기간 오류 수정 - ### Version 1.0.2 +### Version 1.0.2 - ISP별 분리된 채널통합 - 개별 채널별 EPG 정보 수집가능하도록 Enabled 추가 - getMyChannel 함수 삭제 @@ -200,14 +203,13 @@ https://github.com/wonipapa/epg2xml/wiki/FAQ - EPG 정보 가져오는 기간 설정 추가 - 채널 아이콘 설정 URL 설정 추가 - tvheadend 전용 카테고리 추가 - ### Version 1.0.1 +### Version 1.0.1 - EPG 소스 변경 - 등록된 채널 정보만 EPG 정보 가져오도록 설정 - IPTV별 개인화 - ### Version 1.0.0 +### Version 1.0.0 - first release - KBS 함수 추가 - Channel.json 소스 변경 - 스카이라이프 url 변경 - - EPG 누락 데이터 수정 - + - EPG 누락 데이터 수정 \ No newline at end of file From 0fd141f7277a5b2e59da2ab0d198faeb96170273 Mon Sep 17 00:00:00 2001 From: wonipapa Date: Thu, 17 Aug 2017 14:56:29 +0900 Subject: [PATCH 05/41] add Hcn function --- epg2xml.py | 136 ++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 98 insertions(+), 38 deletions(-) diff --git a/epg2xml.py b/epg2xml.py index 0b67e00..dc23a57 100644 --- a/epg2xml.py +++ b/epg2xml.py @@ -1,9 +1,9 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- - +#pooq, iscs +#https://wapie.pooq.co.kr/v1/epgs30/C2301/?deviceTypeId=pc&marketTypeId=generic&apiAccessCredential=EEBE901F80B3A4C4E5322D58110BE95C&drm=WC&country=KOR&offset=0&limit=1000&startTime=2017%2F07%2F18+11%3A49&credential=none&endTime=2017%2F07%2F18+23%3A59 from __future__ import print_function import imp - import os import sys import json @@ -45,7 +45,7 @@ if not sys.version_info[:2] == (2, 7): debug = False 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': '*/*'} -timeout = 3 +timeout = 5 CHANNEL_ERROR = ' 존재하지 않는 채널입니다.' CONTENT_ERROR = ' EPG 정보가 없습니다.' HTTP_ERROR = ' EPG 정보를 가져오는데 문제가 있습니다.' @@ -59,7 +59,7 @@ def getEpg(): ChannelInfos = [] try: with open(Channelfile) as f: # Read Channel Information file - Channeldatas = json.load(f) + Channeldatajson = json.load(f) except EnvironmentError: printError("Channel." + JSON_FILE_ERROR) sys.exit() @@ -69,9 +69,14 @@ def getEpg(): print('') print('\n') print('') +# My Channel 정의 + MyChannelInfo = [] + if MyChannels : + for MyChannel in MyChannels.split(','): + MyChannelInfo.append(int(MyChannel.strip())) - for Channeldata in Channeldatas: #Get Channel & Print Channel info - if Channeldata['Enabled'] == 1: + for Channeldata in Channeldatajson: #Get Channel & Print Channel info + if Channeldata['Enabled'] == 1 or Channeldata['Id'] in MyChannelInfo: ChannelId = Channeldata['Id'] ChannelName = escape(Channeldata['Name']) ChannelSource = Channeldata['Source'] @@ -100,6 +105,7 @@ def getEpg(): else : print(' ' % (ChannelIconUrl)) print(' ') + # Print Program Information for ChannelInfo in ChannelInfos: ChannelId = ChannelInfo[0] @@ -109,28 +115,30 @@ def getEpg(): if(debug) : printLog(ChannelName + ' 채널 EPG 데이터를 가져오고 있습니다') if ChannelSource == 'EPG': GetEPGFromEPG(ChannelInfo) - elif ChannelSource == 'KT': - GetEPGFromKT(ChannelInfo) - elif ChannelSource == 'LG': - GetEPGFromLG(ChannelInfo) - elif ChannelSource == 'SK': - GetEPGFromSK(ChannelInfo) - elif ChannelSource == 'SKB': - GetEPGFromSKB(ChannelInfo) - elif ChannelSource == 'SKY': - GetEPGFromSKY(ChannelInfo) - elif ChannelSource == 'NAVER': - GetEPGFromNaver(ChannelInfo) - elif ChannelSource == 'TBROAD': - GetEPGFromTbroad(ChannelInfo) - elif ChannelSource == 'ISCS': - GetEPGFromIscs(ChannelInfo) - elif ChannelSource == 'MBC': - GetEPGFromMbc(ChannelInfo) - elif ChannelSource == 'MIL': - GetEPGFromMil(ChannelInfo) - elif ChannelSource == 'IFM': - GetEPGFromIfm(ChannelInfo) + #elif ChannelSource == 'KT': + # GetEPGFromKT(ChannelInfo) + #elif ChannelSource == 'LG': + # GetEPGFromLG(ChannelInfo) + #elif ChannelSource == 'SK': + # GetEPGFromSK(ChannelInfo) + #elif ChannelSource == 'SKB': + # GetEPGFromSKB(ChannelInfo) + #elif ChannelSource == 'SKY': + # GetEPGFromSKY(ChannelInfo) + #elif ChannelSource == 'NAVER': + # GetEPGFromNaver(ChannelInfo) + #elif ChannelSource == 'TBROAD': + # GetEPGFromTbroad(ChannelInfo) + #elif ChannelSource == 'ISCS': + # GetEPGFromIscs(ChannelInfo) + elif ChannelSource == 'HCN': + GetEPGFromHcn(ChannelInfo) + #elif ChannelSource == 'MBC': + # GetEPGFromMbc(ChannelInfo) + #elif ChannelSource == 'MIL': + # GetEPGFromMil(ChannelInfo) + #elif ChannelSource == 'IFM': + # GetEPGFromIfm(ChannelInfo) elif ChannelSource == 'KBS': GetEPGFromKbs(ChannelInfo) print('') @@ -140,11 +148,11 @@ def GetEPGFromEPG(ChannelInfo): ChannelId = ChannelInfo[0] ChannelName = ChannelInfo[1] ServiceId = ChannelInfo[3] - url = 'http://www.epg.co.kr/epg-cgi/extern/cnm_guide_type_v070530.cgi' + url = 'http://211.43.210.10:88/epg-cgi/extern/cnm_guide_type_v070530.php' epginfo = [] for k in range(period): day = today + datetime.timedelta(days=k) - params = {'beforegroup':'100', 'checkchannel':ServiceId, 'select_group':'100', 'start_date':day.strftime('%Y%m%d')} + params = {'beforegroup':'100', 'checkchannel[]':ServiceId, 'select_group':'100', 'start_date':day.strftime('%Y%m%d')} try: response = requests.post(url, data=params, headers=ua, timeout=3) response.raise_for_status() @@ -363,9 +371,7 @@ def GetEPGFromSKB(ChannelInfo): ChannelId = ChannelInfo[0] ChannelName = ChannelInfo[1] ServiceId = ChannelInfo[3] - url = 'http://www.skbroadband.com/content/realtime/Channel_List.do' url = 'http://m.skbroadband.com/content/realtime/Channel_List.do' - #?key_depth1=5100&key_depth2=430&key_depth3=20170715' epginfo = [] for k in range(period): day = today + datetime.timedelta(days=k) @@ -510,17 +516,69 @@ def GetEPGFromNaver(ChannelInfo): if(debug): printError(ChannelName + str(e)) else: pass -# Get EPG data from Tbroad -def GetEPGFromTbroad(ChannelInfo): - url='https://www.tbroad.com/chplan/selectRealTimeListForNormal.tb' - pass - # Get EPG data from Iscs def GetEPGFromIscs(ChannelInfo): url='http://service.iscs.co.kr/sub/channel_view.asp' params = {'chan_idx':'242', 'source_id':'203', 'Chan_Date':'2017-04-18'} pass +# Get EPG data from HCN +def GetEPGFromHcn(ChannelInfo): + ChannelId = ChannelInfo[0] + ChannelName = ChannelInfo[1] + ServiceId = ChannelInfo[3] + epginfo = [] + url = 'https://www.hcn.co.kr/ur/bs/ch/channelInfo.hcn' + for k in range(period): + day = today + datetime.timedelta(days=k) + params = {'method': 'ajax_00', 'pageType': 'sheetList', 'ch_id': ServiceId, 'onairdate': day} + try: + response = requests.get(url, params=params, headers=ua, timeout=timeout) + response.raise_for_status() + html_data = response.content + data = unicode(html_data, 'euc-kr', 'ignore').encode('utf-8', 'ignore') + strainer = SoupStrainer('tr', {'class':''}) + soup = BeautifulSoup(data, 'lxml', parse_only=strainer, from_encoding='utf-8') + html = soup.find_all('tr') if soup.find_all('tr') else '' + if(html): + for row in html: + startTime = str(day) + ' ' + row.find('td', {'class':'f'}).text + programName = row.find('td', {'class':'left'}).text.decode('string_escape').strip() + rating = 0 + rebroadcast = False + for image in row.find_all('img', {'class':'vM'}, alt=True): + rebroad = re.match('(재방송)',image['alt'].decode('string_escape').strip()) + if not (rebroad is None): rebroadcast = True + grade = re.match('([\d,]+)',image['alt']) + if not (grade is None): rating = int(grade.group(1)) + #programName, startTime, rating, rebroadcast + epginfo.append([programName, startTime, rating, rebroadcast]) + for epg1, epg2 in zip(epginfo, epginfo[1:]): + programName = unescape(epg1[0]) if epg1[0] else '' + subprogramName = '' + startTime = datetime.datetime.strptime(epg1[1], '%Y-%m-%d %H:%M') + startTime = startTime.strftime('%Y%m%d%H%M%S') + endTime = datetime.datetime.strptime(epg2[1], '%Y-%m-%d %H:%M') + endTime = endTime.strftime('%Y%m%d%H%M%S') + desc = '' + actors = '' + producers = '' + category = '' + episode = '' + rebroadcast = epg1[3] + rating = epg1[2] + 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) + else: + if(debug): printError(ChannelName + CONTENT_ERROR) + else: pass + except (requests.exceptions.RequestException) as e: + if(debug): printError(ChannelName + str(e)) + else: pass + +# Get EPG data from POOQ +def GetEPGFromPooq(ChannelInfo): + pass # Get EPG data from MBC def GetEPGFromMbc(ChannelInfo): ChannelId = ChannelInfo[0] @@ -717,6 +775,8 @@ def GetEPGFromKbs(ChannelInfo): 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) + + # Write Program def writeProgram(programdata): ChannelId = programdata['channelId'] @@ -799,6 +859,7 @@ try: with open(Settingfile) as f: # Read Channel Information file Settings = json.load(f) MyISP = Settings['MyISP'] if 'MyISP' in Settings else '' + MyChannels = Settings['MyChannels'] if 'MyChannels' in Settings else '' default_output = Settings['output'] if 'output' in Settings else '' default_xml_file = Settings['default_xml_file'] if 'default_xml_file' in Settings else 'xmltv.xml' default_xml_socket = Settings['default_xml_socket'] if 'default_xml_socket' in Settings else 'xmltv.sock' @@ -807,7 +868,6 @@ try: default_rebroadcast = Settings['default_rebroadcast'] if 'default_rebroadcast' in Settings else '' default_episode = Settings['default_episode'] if 'default_episode' in Settings else '' default_verbose = Settings['default_verbose'] if 'default_verbose' in Settings else '' - except EnvironmentError: printError("epg2xml." + JSON_FILE_ERROR) sys.exit() From 94cc14910360a4be7630f9658752562640fc18c1 Mon Sep 17 00:00:00 2001 From: wonipapa Date: Thu, 17 Aug 2017 16:57:15 +0900 Subject: [PATCH 06/41] add ISCS function --- epg2xml.py | 72 +++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 63 insertions(+), 9 deletions(-) diff --git a/epg2xml.py b/epg2xml.py index dc23a57..a558b89 100644 --- a/epg2xml.py +++ b/epg2xml.py @@ -1,7 +1,5 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- -#pooq, iscs -#https://wapie.pooq.co.kr/v1/epgs30/C2301/?deviceTypeId=pc&marketTypeId=generic&apiAccessCredential=EEBE901F80B3A4C4E5322D58110BE95C&drm=WC&country=KOR&offset=0&limit=1000&startTime=2017%2F07%2F18+11%3A49&credential=none&endTime=2017%2F07%2F18+23%3A59 from __future__ import print_function import imp import os @@ -131,8 +129,10 @@ def getEpg(): # GetEPGFromTbroad(ChannelInfo) #elif ChannelSource == 'ISCS': # GetEPGFromIscs(ChannelInfo) - elif ChannelSource == 'HCN': - GetEPGFromHcn(ChannelInfo) + #elif ChannelSource == 'HCN': + # GetEPGFromHcn(ChannelInfo) + elif ChannelSource == 'POOQ': + GetEPGFromPooq(ChannelInfo) #elif ChannelSource == 'MBC': # GetEPGFromMbc(ChannelInfo) #elif ChannelSource == 'MIL': @@ -154,7 +154,7 @@ def GetEPGFromEPG(ChannelInfo): day = today + datetime.timedelta(days=k) params = {'beforegroup':'100', 'checkchannel[]':ServiceId, 'select_group':'100', 'start_date':day.strftime('%Y%m%d')} try: - response = requests.post(url, data=params, headers=ua, timeout=3) + response = requests.post(url, data=params, headers=ua, timeout=timeout) response.raise_for_status() html_data = response.content data = unicode(html_data, 'euc-kr', 'ignore').encode('utf-8', 'ignore') @@ -491,6 +491,7 @@ def GetEPGFromNaver(ChannelInfo): for i, date in enumerate(data['displayDates']): for j in range(0,24): for program in data['schedules'][j][i]: + #programName, startTime, episode, rebroadcast, rating epginfo.append([program['title'], date['date'] + ' ' + program['startTime'], program['episode'].replace('회',''), program['isRerun'], program['grade']]) for epg1, epg2 in zip(epginfo, epginfo[1:]): programName = unescape(epg1[0]) if epg1[0] else '' @@ -516,11 +517,61 @@ def GetEPGFromNaver(ChannelInfo): if(debug): printError(ChannelName + str(e)) else: pass -# Get EPG data from Iscs +# Get EPG data from ISCS def GetEPGFromIscs(ChannelInfo): - url='http://service.iscs.co.kr/sub/channel_view.asp' - params = {'chan_idx':'242', 'source_id':'203', 'Chan_Date':'2017-04-18'} - pass + ChannelId = ChannelInfo[0] + ChannelName = ChannelInfo[1] + ServiceId = ChannelInfo[3] + epginfo = [] + url='https://www.iscs.co.kr/service/sub/ajax_channel_view.asp' + for k in range(period): + day = today + datetime.timedelta(days=k) + params = {'s_idx': ServiceId, 'C_date': day} + response = requests.post(url, data=params, headers=ua, timeout=timeout) + response.raise_for_status() + json_data = response.text + try: + data = json.loads(json_data, encoding='utf-8') + strainer = SoupStrainer('tbody') + soup = BeautifulSoup(data['html'], 'lxml', parse_only=strainer) + html = soup.find_all('tr') if soup.find_all('tr') else '' + if(html) : + for row in html: + startTime = str(day) + ' ' + row.find('td', {'class':'time'}).text + programName = row.find('td', {'class':'name'}).text.decode('string_escape').strip() + rating = row.find('span', {'class':'year'}).text.decode('string_escape').strip() + if rating == '전체관람' : rating = 0 + else : rating = rating.replace('세이상', ' ') + pattern = '^(.*?)(?:\(([\d,]+)회\))?(?:\((재)\))?$' + matches = re.match(pattern, programName) + if not(matches is None) : + programName = matches.group(1) if matches.group(1) else '' + rebroadcast = True if matches.group(3) else False + episode = matches.group(2) if matches.group(2) else '' + #programName, startTime, rating, rebroadcast, episode + epginfo.append([programName, startTime, rating, rebroadcast, episode]) + for epg1, epg2 in zip(epginfo, epginfo[1:]): + programName = unescape(epg1[0]) if epg1[0] else '' + subprogramName = '' + startTime = datetime.datetime.strptime(epg1[1], '%Y-%m-%d %H:%M') + startTime = startTime.strftime('%Y%m%d%H%M%S') + endTime = datetime.datetime.strptime(epg2[1], '%Y-%m-%d %H:%M') + endTime = endTime.strftime('%Y%m%d%H%M%S') + desc = '' + actors = '' + producers = '' + category = '' + episode = epg1[4] + rebroadcast = epg1[3] + rating = epg1[2] + 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) + except ValueError: + if(debug): printError(ChannelName + CONTENT_ERROR) + else: pass + except (requests.RequestException) as e: + if(debug): printError(ChannelName + str(e)) + else: pass # Get EPG data from HCN def GetEPGFromHcn(ChannelInfo): @@ -578,6 +629,9 @@ def GetEPGFromHcn(ChannelInfo): # Get EPG data from POOQ def GetEPGFromPooq(ChannelInfo): +#pooq +#https://wapie.pooq.co.kr/v1/epgs30/C2301/?deviceTypeId=pc&marketTypeId=generic&apiAccessCredential=EEBE901F80B3A4C4E5322D58110BE95C&drm=WC&country=KOR&offset=0&limit=1000&startTime=2017%2F07%2F18+11%3A49&credential=none&endTime=2017%2F07%2F18+23%3A59 + pass # Get EPG data from MBC def GetEPGFromMbc(ChannelInfo): From 11b0bea1d98d8d71676e279d2d1e1cbab5c2fd0b Mon Sep 17 00:00:00 2001 From: wonipapa Date: Fri, 18 Aug 2017 16:38:16 +0900 Subject: [PATCH 07/41] =?UTF-8?q?iscs,=20hcn,=20pooq=20=ED=95=A8=EC=88=98?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80=20=ED=95=A8=EC=88=98=20=EC=B5=9C=EC=A0=81?= =?UTF-8?q?=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- epg2xml.py | 406 +++++++++++++++++++++++++---------------------------- 1 file changed, 188 insertions(+), 218 deletions(-) diff --git a/epg2xml.py b/epg2xml.py index a558b89..4c12bab 100644 --- a/epg2xml.py +++ b/epg2xml.py @@ -113,32 +113,30 @@ def getEpg(): if(debug) : printLog(ChannelName + ' 채널 EPG 데이터를 가져오고 있습니다') if ChannelSource == 'EPG': GetEPGFromEPG(ChannelInfo) - #elif ChannelSource == 'KT': - # GetEPGFromKT(ChannelInfo) - #elif ChannelSource == 'LG': - # GetEPGFromLG(ChannelInfo) - #elif ChannelSource == 'SK': - # GetEPGFromSK(ChannelInfo) - #elif ChannelSource == 'SKB': - # GetEPGFromSKB(ChannelInfo) - #elif ChannelSource == 'SKY': - # GetEPGFromSKY(ChannelInfo) - #elif ChannelSource == 'NAVER': - # GetEPGFromNaver(ChannelInfo) - #elif ChannelSource == 'TBROAD': - # GetEPGFromTbroad(ChannelInfo) - #elif ChannelSource == 'ISCS': - # GetEPGFromIscs(ChannelInfo) - #elif ChannelSource == 'HCN': - # GetEPGFromHcn(ChannelInfo) + elif ChannelSource == 'KT': + GetEPGFromKT(ChannelInfo) + elif ChannelSource == 'LG': + GetEPGFromLG(ChannelInfo) + elif ChannelSource == 'SK': + GetEPGFromSK(ChannelInfo) + elif ChannelSource == 'SKB': + GetEPGFromSKB(ChannelInfo) + elif ChannelSource == 'SKY': + GetEPGFromSKY(ChannelInfo) + elif ChannelSource == 'NAVER': + GetEPGFromNaver(ChannelInfo) + elif ChannelSource == 'ISCS': + GetEPGFromIscs(ChannelInfo) + elif ChannelSource == 'HCN': + GetEPGFromHcn(ChannelInfo) elif ChannelSource == 'POOQ': GetEPGFromPooq(ChannelInfo) - #elif ChannelSource == 'MBC': - # GetEPGFromMbc(ChannelInfo) - #elif ChannelSource == 'MIL': - # GetEPGFromMil(ChannelInfo) - #elif ChannelSource == 'IFM': - # GetEPGFromIfm(ChannelInfo) + elif ChannelSource == 'MBC': + GetEPGFromMbc(ChannelInfo) + elif ChannelSource == 'MIL': + GetEPGFromMil(ChannelInfo) + elif ChannelSource == 'IFM': + GetEPGFromIfm(ChannelInfo) elif ChannelSource == 'KBS': GetEPGFromKbs(ChannelInfo) print('') @@ -150,6 +148,9 @@ def GetEPGFromEPG(ChannelInfo): ServiceId = ChannelInfo[3] url = 'http://211.43.210.10:88/epg-cgi/extern/cnm_guide_type_v070530.php' epginfo = [] + startTime = endTime = programName = subprogramName = desc = actors = producers = category = episode = '' + rebroadcast = False + rating = 0 for k in range(period): day = today + datetime.timedelta(days=k) params = {'beforegroup':'100', 'checkchannel[]':ServiceId, 'select_group':'100', 'start_date':day.strftime('%Y%m%d')} @@ -173,38 +174,26 @@ def GetEPGFromEPG(ChannelInfo): hour = 'AM ' + str(hour) thisday = day + datetime.timedelta(days=1) for celldata in cell.parent.find_all('tr'): - pattern = ".*\[(.*)\]<\/td>\s.*\">(.*?)\s*(<(.*)>)?\s*(\(재\))?\s*(\(([\d,]+)회\))?()?\s*<\/td><\/tr>" + pattern = ".*\[(.*)\]<\/td>\s.*\">(.*?)\s*(<(.*)>)?\s*(\(재\))?\s*(\(([\d,]+)회\)?)?()?\s*<\/td><\/tr>" matches = re.match(pattern, str(celldata)) if not (matches is None): minute = matches.group(1) if matches.group(1) else '' - startTime = str(thisday) + ' ' + hour + ':' + minute + startTime = str(thisday) + ' ' + hour + ':' + minute[-2:] startTime = datetime.datetime.strptime(startTime, '%Y-%m-%d %p %I:%M') startTime = startTime.strftime('%Y%m%d%H%M%S') image = matches.group(8) if matches.group(8) else '' grade = re.match('.*schedule_([\d,]+)?.*',image) if not (grade is None): rating = int(grade.group(1)) - else : rating = 0 programName = matches.group(2).strip() if matches.group(2) else '' subprogramName = matches.group(4).strip() if matches.group(4) else '' - #programName, startTime, rating, subprogramName, rebroadcast, episode - epginfo.append([programName, startTime, rating, subprogramName, matches.group(5), matches.group(7)]) + rebroadcast = True if matches.group(5) else False; + episode = matches.group(7) if matches.group(7) else '' + #ChannelId, startTime, programName, subprogramName, desc, actors, producers, category, episode, rebroadcast, rating + epginfo.append([ChannelId, startTime, programName, subprogramName, desc, actors, producers, category, episode, rebroadcast, rating]) except (requests.exceptions.RequestException) as e: if(debug): printError(ChannelName + str(e)) else: pass - for epg1, epg2 in zip(epginfo, epginfo[1:]): - programName = epg1[0] if epg1[0] else '' - subprogramName = epg1[3] if epg1[3] else '' - startTime = epg1[1] if epg1[1] else '' - endTime = epg2[1] if epg2[1] else '' - desc = '' - actors = '' - producers = '' - category = '' - rebroadcast = True if epg1[4] else False - episode = epg1[5] if epg1[5] else '' - rating = int(epg1[2]) if epg1[2] 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) + epgzip(epginfo) # Get EPG data from KT def GetEPGFromKT(ChannelInfo): @@ -213,6 +202,9 @@ def GetEPGFromKT(ChannelInfo): ServiceId = ChannelInfo[3] url = 'http://tv.olleh.com/renewal_sub/liveTv/pop_schedule_week.asp' epginfo = [] + startTime = endTime = programName = subprogramName = desc = actors = producers = category = episode = '' + rebroadcast = False + rating = 0 for k in range(period): day = today + datetime.timedelta(days=k) params = {'ch_name':'', 'ch_no':ServiceId, 'nowdate':day.strftime('%Y%m%d'), 'seldatie':day.strftime('%Y%m%d'), 'tab_no':'1'} @@ -227,36 +219,26 @@ def GetEPGFromKT(ChannelInfo): if(html): for row in html: for cell in [row.find_all('td')]: - epginfo.append([cell[1].text, str(day) + ' ' + cell[0].text, cell[4].text, cell[2].text]) + startTime = str(day) + ' ' + cell[0].text + startTime = datetime.datetime.strptime(startTime, '%Y-%m-%d %H:%M') + startTime = startTime.strftime('%Y%m%d%H%M%S') + pattern = '^(.*?)( <(.*)>)?$' + matches = re.match(pattern, cell[1].text.decode('string_escape')) + if not (matches is None): + programName = matches.group(1) if matches.group(1) else '' + subprogramName = matches.group(3) if matches.group(3) else '' + category = cell[4].text + matches = re.match('(\d+)', cell[2].text) + if not(matches is None): rating = int(matches.group()) + #ChannelId, startTime, programName, subprogramName, desc, actors, producers, category, episode, rebroadcast, rating + epginfo.append([ChannelId, startTime, programName, subprogramName, desc, actors, producers, category, episode, rebroadcast, rating]) + epgzip(epginfo) else: if(debug): printError(ChannelName + CONTENT_ERROR) else: pass except (requests.exceptions.RequestException) as e: if(debug): printError(ChannelName + str(e)) else: pass - for epg1, epg2 in zip(epginfo, epginfo[1:]): - programName = '' - subprogrmaName = '' - pattern = '^(.*?)( <(.*)>)?$' - matches = re.match(pattern, epg1[0].decode('string_escape')) - if not (matches is None): - programName = matches.group(1) if matches.group(1) else '' - subprogramName = matches.group(3) if matches.group(3) else '' - startTime = datetime.datetime.strptime(epg1[1], '%Y-%m-%d %H:%M') - startTime = startTime.strftime('%Y%m%d%H%M%S') - endTime = datetime.datetime.strptime(epg2[1], '%Y-%m-%d %H:%M') - endTime = endTime.strftime('%Y%m%d%H%M%S') - category = epg1[2] - desc = '' - actors = '' - producers = '' - episode = '' - rebroadcast = False - rating = 0 - matches = re.match('(\d+)', epg1[3]) - if not(matches is None): rating = int(matches.group()) - 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) # Get EPG data from LG def GetEPGFromLG(ChannelInfo): @@ -265,6 +247,9 @@ def GetEPGFromLG(ChannelInfo): ServiceId = ChannelInfo[3] url = 'http://www.uplus.co.kr/css/chgi/chgi/RetrieveTvSchedule.hpi' epginfo = [] + startTime = endTime = programName = subprogramName = desc = actors = producers = category = episode = '' + rebroadcast = False + rating = 0 for k in range(period): day = today + datetime.timedelta(days=k) params = {'chnlCd': ServiceId, 'evntCmpYmd': day.strftime('%Y%m%d')} @@ -280,44 +265,37 @@ def GetEPGFromLG(ChannelInfo): if(html): for row in html: for cell in [row.find_all('td')]: + startTime = str(day) + ' ' + cell[0].text + startTime = datetime.datetime.strptime(startTime, '%Y-%m-%d %H:%M') + startTime = startTime.strftime('%Y%m%d%H%M%S') rating = 0 if cell[1].find('span', {'class': 'tag cte_all'}).text.strip()=="All" else int(cell[1].find('span', {'class': 'tag cte_all'}).text.strip()) cell[1].find('span', {'class': 'tagGroup'}).decompose() - epginfo.append([cell[1].text.strip(), str(day) + ' ' + cell[0].text, cell[2].text.strip(), rating]) + pattern = '(<재>?)?(.*?)(\[(.*)\])?\s?(\(([\d,]+)회\))?$' + matches = re.match(pattern, cell[1].text.strip().decode('string_escape')) + if not (matches is None): + programName = matches.group(2).strip() if matches.group(2) else '' + subprogramName = matches.group(4).strip() if matches.group(4) else '' + episode = matches.group(6) if matches.group(6) else '' + rebroadcast = True if matches.group(1) else False + category = cell[2].text.strip() + #ChannelId, startTime, programName, subprogramName, desc, actors, producers, category, episode, rebroadcast, rating + epginfo.append([ChannelId, startTime, programName, subprogramName, desc, actors, producers, category, episode, rebroadcast, rating]) + epgzip(epginfo) else: if(debug): printError(ChannelName + CONTENT_ERROR) else: pass except (requests.exceptions.RequestException) as e: if(debug): printError(ChannelName + str(e)) else: pass - for epg1, epg2 in zip(epginfo, epginfo[1:]): - programName = '' - subprogramName = '' - episode = '' - pattern = '(<재>?)?(.*?)(\[(.*)\])?\s?(\(([\d,]+)회\))?$' - matches = re.match(pattern, epg1[0].decode('string_escape')) - rebroadcast = False - if not (matches is None): - programName = matches.group(2) if matches.group(2) else '' - subprogramName = matches.group(4) if matches.group(4) else '' - rebroadcast = True if matches.group(1) else False - episode = matches.group(6) if matches.group(6) else '' - startTime = datetime.datetime.strptime(epg1[1], '%Y-%m-%d %H:%M') - startTime = startTime.strftime('%Y%m%d%H%M%S') - endTime = datetime.datetime.strptime(epg2[1], '%Y-%m-%d %H:%M') - endTime = endTime.strftime('%Y%m%d%H%M%S') - category = epg1[2] - desc = '' - actors = '' - producers = '' - rating = epg1[3] - 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) # Get EPG data from SK def GetEPGFromSK(ChannelInfo): ChannelId = ChannelInfo[0] ChannelName = ChannelInfo[1] ServiceId = ChannelInfo[3] + startTime = endTime = programName = subprogramName = desc = actors = producers = category = episode = '' + rebroadcast = False + rating = 0 lastday = today + datetime.timedelta(days=period-1) url = 'http://m.btvplus.co.kr/Common/Inc/IFGetData.asp' params = {'variable': 'IF_LIVECHART_DETAIL', 'pcode':'|^|start_time=' + today.strftime('%Y%m%d') + '00|^|end_time='+ lastday.strftime('%Y%m%d') + '24|^|svc_id=' + str(ServiceId)} @@ -333,10 +311,6 @@ def GetEPGFromSK(ChannelInfo): else : programs = data['channel']['programs'] for program in programs: - programName = '' - subprogramName = '' - episode = '' - rebroadcast = False pattern = '^(.*?)(?:\s*[\(<]([\d,회]+)[\)>])?(?:\s*<([^<]*?)>)?(\((재)\))?$' matches = re.match(pattern, program['programName'].replace('...', '>').encode('utf-8')) if not (matches is None): @@ -354,8 +328,6 @@ def GetEPGFromSK(ChannelInfo): producers = program['directorName'].replace('...','').strip(', ') if program['directorName'] else '' if not (program['mainGenreName'] is None) : category = program['mainGenreName'] - else: - category = '' rating = int(program['ratingCd']) if program['programName'] 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) @@ -371,6 +343,9 @@ def GetEPGFromSKB(ChannelInfo): ChannelId = ChannelInfo[0] ChannelName = ChannelInfo[1] ServiceId = ChannelInfo[3] + startTime = endTime = programName = subprogramName = desc = actors = producers = category = episode = '' + rebroadcast = False + rating = 0 url = 'http://m.skbroadband.com/content/realtime/Channel_List.do' epginfo = [] for k in range(period): @@ -398,38 +373,24 @@ def GetEPGFromSKB(ChannelInfo): rating = row.find('span', {'class':re.compile('^watch.*$')}) if not(rating is None) : rating = int(rating.text.decode('string_escape').replace('세','').strip()) - else : - rating = 0 - #programName, startTime, rating, subprogramName, rebroadcast, episode - epginfo.append([programName, startTime, rating, subprogramName, rebroadcast, episode]) + #ChannelId, startTime, programName, subprogramName, desc, actors, producers, category, episode, rebroadcast, rating + epginfo.append([ChannelId, startTime, programName, subprogramName, desc, actors, producers, category, episode, rebroadcast, rating]) + epgzip(epginfo) else: if(debug): printError(ChannelName + CONTENT_ERROR) else: pass except (requests.exceptions.RequestException) as e: if(debug): printError(ChannelName + str(e)) else: pass - for epg1, epg2 in zip(epginfo, epginfo[1:]): - programName = epg1[0] if epg1[0] else '' - subprogramName = epg1[3] if epg1[3] else '' - episode = epg1[5] if epg1[5] else '' - rebroadcast = epg1[4] if epg1[4] else False - startTime = datetime.datetime.strptime(epg1[1], '%Y-%m-%d %H:%M') - startTime = startTime.strftime('%Y%m%d%H%M%S') - endTime = datetime.datetime.strptime(epg2[1], '%Y-%m-%d %H:%M') - endTime = endTime.strftime('%Y%m%d%H%M%S') - category = '' - desc = '' - actors = '' - producers = '' - rating = epg1[2] if epg1[2] 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) # Get EPG data from SKY def GetEPGFromSKY(ChannelInfo): ChannelId = ChannelInfo[0] ChannelName = ChannelInfo[1] ServiceId = ChannelInfo[3] + startTime = endTime = programName = subprogramName = desc = actors = producers = category = episode = '' + rebroadcast = False + rating = 0 url = 'http://www.skylife.co.kr/channel/epg/channelScheduleListJson.do' for k in range(period): day = today + datetime.timedelta(days=k) @@ -476,6 +437,9 @@ def GetEPGFromNaver(ChannelInfo): ChannelName = ChannelInfo[1] ServiceId = ChannelInfo[3] epginfo = [] + startTime = endTime = programName = subprogramName = desc = actors = producers = category = episode = '' + rebroadcast = False + rating = 0 totaldate = [] url = 'https://search.naver.com/p/csearch/content/batchrender_ssl.nhn' for k in range(period): @@ -491,25 +455,16 @@ def GetEPGFromNaver(ChannelInfo): for i, date in enumerate(data['displayDates']): for j in range(0,24): for program in data['schedules'][j][i]: - #programName, startTime, episode, rebroadcast, rating - epginfo.append([program['title'], date['date'] + ' ' + program['startTime'], program['episode'].replace('회',''), program['isRerun'], program['grade']]) - for epg1, epg2 in zip(epginfo, epginfo[1:]): - programName = unescape(epg1[0]) if epg1[0] else '' - subprogramName = '' - startTime = datetime.datetime.strptime(epg1[1], '%Y%m%d %H:%M') - startTime = startTime.strftime('%Y%m%d%H%M%S') - endTime = datetime.datetime.strptime(epg2[1], '%Y%m%d %H:%M') - endTime = endTime.strftime('%Y%m%d%H%M%S') - desc = '' - actors = '' - producers = '' - category = '' - episode = epg1[2] if epg1[2] else '' - if episode : episode = int(episode) - rebroadcast = epg1[3] - rating = epg1[4] - 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) + programName = unescape(program['title']) + startTime = date['date'] + ' ' + program['startTime'] + startTime = datetime.datetime.strptime(startTime, '%Y%m%d %H:%M') + startTime = startTime.strftime('%Y%m%d%H%M%S') + episode = program['episode'].replace('회','') + rebroadcast = program['isRerun'] + rating = program['grade'] + #ChannelId, startTime, programName, subprogramName, desc, actors, producers, category, episode, rebroadcast, rating + epginfo.append([ChannelId, startTime, programName, subprogramName, desc, actors, producers, category, episode, rebroadcast, rating]) + epgzip(epginfo) except ValueError: if(debug): printError(ChannelName + CONTENT_ERROR) else: pass @@ -523,6 +478,9 @@ def GetEPGFromIscs(ChannelInfo): ChannelName = ChannelInfo[1] ServiceId = ChannelInfo[3] epginfo = [] + startTime = endTime = programName = subprogramName = desc = actors = producers = category = episode = '' + rebroadcast = False + rating = 0 url='https://www.iscs.co.kr/service/sub/ajax_channel_view.asp' for k in range(period): day = today + datetime.timedelta(days=k) @@ -546,26 +504,12 @@ def GetEPGFromIscs(ChannelInfo): matches = re.match(pattern, programName) if not(matches is None) : programName = matches.group(1) if matches.group(1) else '' - rebroadcast = True if matches.group(3) else False episode = matches.group(2) if matches.group(2) else '' - #programName, startTime, rating, rebroadcast, episode - epginfo.append([programName, startTime, rating, rebroadcast, episode]) - for epg1, epg2 in zip(epginfo, epginfo[1:]): - programName = unescape(epg1[0]) if epg1[0] else '' - subprogramName = '' - startTime = datetime.datetime.strptime(epg1[1], '%Y-%m-%d %H:%M') - startTime = startTime.strftime('%Y%m%d%H%M%S') - endTime = datetime.datetime.strptime(epg2[1], '%Y-%m-%d %H:%M') - endTime = endTime.strftime('%Y%m%d%H%M%S') - desc = '' - actors = '' - producers = '' - category = '' - episode = epg1[4] - rebroadcast = epg1[3] - rating = epg1[2] - 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) + rebroadcast = True if matches.group(3) else False + + #ChannelId, startTime, programName, subprogramName, desc, actors, producers, category, episode, rebroadcast, rating + epginfo.append([ChannelId, startTime, programName, subprogramName, desc, actors, producers, category, episode, rebroadcast, rating]) + epgzip(epginfo) except ValueError: if(debug): printError(ChannelName + CONTENT_ERROR) else: pass @@ -579,6 +523,9 @@ def GetEPGFromHcn(ChannelInfo): ChannelName = ChannelInfo[1] ServiceId = ChannelInfo[3] epginfo = [] + startTime = endTime = programName = subprogramName = desc = actors = producers = category = episode = '' + rebroadcast = False + rating = 0 url = 'https://www.hcn.co.kr/ur/bs/ch/channelInfo.hcn' for k in range(period): day = today + datetime.timedelta(days=k) @@ -594,6 +541,8 @@ def GetEPGFromHcn(ChannelInfo): if(html): for row in html: startTime = str(day) + ' ' + row.find('td', {'class':'f'}).text + startTime = datetime.datetime.strptime(startTime, '%Y-%m-%d %H:%M') + startTime = startTime.strftime('%Y%m%d%H%M%S') programName = row.find('td', {'class':'left'}).text.decode('string_escape').strip() rating = 0 rebroadcast = False @@ -602,24 +551,9 @@ def GetEPGFromHcn(ChannelInfo): if not (rebroad is None): rebroadcast = True grade = re.match('([\d,]+)',image['alt']) if not (grade is None): rating = int(grade.group(1)) - #programName, startTime, rating, rebroadcast - epginfo.append([programName, startTime, rating, rebroadcast]) - for epg1, epg2 in zip(epginfo, epginfo[1:]): - programName = unescape(epg1[0]) if epg1[0] else '' - subprogramName = '' - startTime = datetime.datetime.strptime(epg1[1], '%Y-%m-%d %H:%M') - startTime = startTime.strftime('%Y%m%d%H%M%S') - endTime = datetime.datetime.strptime(epg2[1], '%Y-%m-%d %H:%M') - endTime = endTime.strftime('%Y%m%d%H%M%S') - desc = '' - actors = '' - producers = '' - category = '' - episode = '' - rebroadcast = epg1[3] - rating = epg1[2] - 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) + #ChannelId, startTime, programName, subprogramName, desc, actors, producers, category, episode, rebroadcast, rating + epginfo.append([ChannelId, startTime, programName, subprogramName, desc, actors, producers, category, episode, rebroadcast, rating]) + epgzip(epginfo) else: if(debug): printError(ChannelName + CONTENT_ERROR) else: pass @@ -629,15 +563,61 @@ def GetEPGFromHcn(ChannelInfo): # Get EPG data from POOQ def GetEPGFromPooq(ChannelInfo): -#pooq -#https://wapie.pooq.co.kr/v1/epgs30/C2301/?deviceTypeId=pc&marketTypeId=generic&apiAccessCredential=EEBE901F80B3A4C4E5322D58110BE95C&drm=WC&country=KOR&offset=0&limit=1000&startTime=2017%2F07%2F18+11%3A49&credential=none&endTime=2017%2F07%2F18+23%3A59 + ChannelId = ChannelInfo[0] + ChannelName = ChannelInfo[1] + ServiceId = ChannelInfo[3] + startTime = endTime = programName = subprogramName = desc = actors = producers = category = episode = '' + rebroadcast = False + rating = 0 + url = 'https://wapie.pooq.co.kr/v1/epgs30/C' + str(ServiceId) + '/' + lastday = today + datetime.timedelta(days=period-1) + params = {'deviceTypeId': 'pc', 'marketTypeId': 'generic', 'apiAccessCredential': 'EEBE901F80B3A4C4E5322D58110BE95C', 'offset': '0', 'limit': '1000', 'startTime': today.strftime('%Y/%m/%d') + ' 00:00', 'endTime': lastday.strftime('%Y/%m/%d') + ' 00:00'} + date_list = [(today + datetime.timedelta(days=x)).strftime('%Y-%m-%d') for x in range(0, period)] + try: + response = requests.get(url, params=params, headers=ua, timeout=timeout) + response.raise_for_status() + json_data = response.text + try: + data = json.loads(json_data, encoding='utf-8') + if (data['result']['count'] == 0) : + if(debug): printError(ChannelName + CONTENT_ERROR) + else: pass + else : + programs = data['result']['list'] + for program in programs: + if program['startDate'] in date_list : + startTime = program['startDate'] + ' ' + program['startTime'] + startTime = datetime.datetime.strptime(startTime, '%Y-%m-%d %H:%M') + startTime = startTime.strftime('%Y%m%d%H%M%S') + endTime = program['startDate'] + ' ' + program['endTime'] + endTime = datetime.datetime.strptime(endTime, '%Y-%m-%d %H:%M') + endTime = endTime.strftime('%Y%m%d%H%M%S') + pattern = '^(.*?)(?:([\d,]+)회)?(?:\((재)\))?$' + matches = re.match(pattern, program['programTitle'].encode('utf-8')) + if not(matches is None) : + programName = matches.group(1) if matches.group(1) else '' + episode = matches.group(2) if matches.group(2) else '' + rebroadcast = True if matches.group(3) else False + actors = program['programStaring'].strip(',').strip() if program['programStaring'] else '' + desc = program['programSummary'].strip() if program['programSummary'] else '' + rating = int(program['age']) + 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) + except ValueError: + if(debug): printError(ChannelName + CONTENT_ERROR) + else: pass + except (requests.exceptions.RequestException) as e: + if(debug): printError(ChannelName + str(e)) + else: pass - pass # Get EPG data from MBC def GetEPGFromMbc(ChannelInfo): ChannelId = ChannelInfo[0] ChannelName = ChannelInfo[1] ServiceId = ChannelInfo[3] + startTime = endTime = programName = subprogramName = desc = actors = producers = category = episode = '' + rebroadcast = False + rating = 0 dayofweek = ['월', '화', '수', '목', '금', '토', '일'] url = 'http://miniunit.imbc.com/Schedule' params = {'rtype': 'json'} @@ -651,25 +631,17 @@ def GetEPGFromMbc(ChannelInfo): data = json.loads(json_data, encoding='utf-8') for program in data['Programs']: if program['Channel'] == "CHAM" and program['LiveDays'] == dayofweek[day.weekday()]: - programName = '' - rebroadcast = True pattern = '^(.*?)(\(재\))?$' matches = re.match(pattern, unescape(program['ProgramTitle'].encode('utf-8', 'ignore'))) if not(matches is None): programName = matches.group(1) rebroadcast = True if matches.group(2) else False - subprogramName = '' startTime = str(day) + ' ' + program['StartTime'] startTime = datetime.datetime.strptime(startTime, '%Y-%m-%d %H%M') endTime = startTime + datetime.timedelta(minutes=int(program['RunningTime'])) startTime = startTime.strftime('%Y%m%d%H%M%S') endTime = endTime.strftime('%Y%m%d%H%M%S') - desc = '' - actors = '' - producers = '' category = '음악' - episode = '' - rating = 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) except ValueError: @@ -684,6 +656,9 @@ def GetEPGFromMil(ChannelInfo): ChannelId = ChannelInfo[0] ChannelName = ChannelInfo[1] ServiceId = ChannelInfo[3] + startTime = endTime = programName = subprogramName = desc = actors = producers = category = episode = '' + rebroadcast = False + rating = 0 url = 'http://radio.dema.mil.kr/web/fm/quick/ajaxTimetableList.do' for k in range(period): day = today + datetime.timedelta(days=k) @@ -695,8 +670,6 @@ def GetEPGFromMil(ChannelInfo): try: data = json.loads(json_data, encoding='utf-8') for program in data['resultList']: - programName = '' - rebroadcast = False pattern = '^(.*?)(\(재\))?$' matches = re.match(pattern, unescape(program['program_title'].encode('utf-8', 'ignore'))) if not(matches is None): @@ -715,12 +688,8 @@ def GetEPGFromMil(ChannelInfo): endTime = datetime.datetime.strptime(endTime, '%Y-%m-%d %H%M') endTime = endTime + datetime.timedelta(hours=1) endTime = endTime.strftime('%Y%m%d%H%M%S') - desc = '' actors = unescape(program['movie_actor']) producers = unescape(program['movie_director']) - category = '' - episode = '' - rating = 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) except ValueError: @@ -735,6 +704,9 @@ def GetEPGFromIfm(ChannelInfo): ChannelId = ChannelInfo[0] ChannelName = ChannelInfo[1] ServiceId = ChannelInfo[3] + startTime = endTime = programName = subprogramName = desc = actors = producers = category = episode = '' + rebroadcast = False + rating = 0 dayofweek = ['1', '2', '3', '4', '5', '6', '7'] url = 'http://mapp.itvfm.co.kr/hyb/front/selectHybPgmList.do' for k in range(period): @@ -748,7 +720,6 @@ def GetEPGFromIfm(ChannelInfo): data = json.loads(json_data, encoding='utf-8') for program in data['hybMusicInfoList']: programName = unescape(program['pgmTitle']) - subprogramName = '' startTime = str(day) + ' ' + program['pgmStime'] startTime = datetime.datetime.strptime(startTime, '%Y-%m-%d %H:%M') startTime = startTime.strftime('%Y%m%d%H%M%S') @@ -761,13 +732,8 @@ def GetEPGFromIfm(ChannelInfo): endTime = datetime.datetime.strptime(endTime, '%Y-%m-%d %H:%M') endTime = endTime + datetime.timedelta(hours=1) endTime = endTime.strftime('%Y%m%d%H%M%S') - desc = '' actors = program['pgmDj'] producers = program['pgmPd'] - category = '' - episode = '' - rebroadcast = False - rating = 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) except ValueError: @@ -782,9 +748,12 @@ def GetEPGFromKbs(ChannelInfo): ChannelId = ChannelInfo[0] ChannelName = ChannelInfo[1] ServiceId = ChannelInfo[3] + epginfo = [] + startTime = endTime = programName = subprogramName = desc = actors = producers = category = episode = '' + rebroadcast = False + rating = 0 url = 'http://world.kbs.co.kr/include/wink/_ajax_schedule.php' params = {'channel':'wink_11'} - epginfo = [] for k in range(period): day = today + datetime.timedelta(days=k) try: @@ -795,42 +764,42 @@ def GetEPGFromKbs(ChannelInfo): data = json.loads(json_data, encoding='utf-8') soup = BeautifulSoup(data['schedule'], 'lxml') for row in soup.find_all('li'): - programName = '' - startTime = '' pattern = '([0-2][0-9]:[0-5][0-9])[0-2][0-9]:[0-5][0-9]\[(.*)\] Broadcast' matches = re.match(pattern, unescape(row.text.encode('utf-8', 'ignore'))) if not(matches is None): programName = unescape(matches.group(2)) startTime = str(day) + ' ' + matches.group(1) - #programName, startTime - epginfo.append([programName, startTime]) + startTime = datetime.datetime.strptime(startTime, '%Y-%m-%d %H:%M') + startTime = startTime.strftime('%Y%m%d%H%M%S') + #ChannelId, startTime, programName, subprogramName, desc, actors, producers, category, episode, rebroadcast, rating + epginfo.append([ChannelId, startTime, programName, subprogramName, desc, actors, producers, category, episode, rebroadcast, rating]) + epgzip(epginfo) except ValueError: if(debug): printError(ChannelName + CONTENT_ERROR) else: pass except (requests.exceptions.RequestException) as e: if(debug): printError(ChannelName + str(e)) else: pass + +# Zip epginfo +def epgzip(epginfo): + #ChannelId, startTime, programName, subprogramName, desc, actors, producers, category, episode, rebroadcast, rating for epg1, epg2 in zip(epginfo, epginfo[1:]): - programName = epg1[0] - subprogramName = '' - startTime = epg1[1] - startTime = datetime.datetime.strptime(startTime, '%Y-%m-%d %H:%M') - startTime = startTime.strftime('%Y%m%d%H%M%S') - endTime = epg2[1] - endTime = datetime.datetime.strptime(endTime, '%Y-%m-%d %H:%M') - endTime = endTime.strftime('%Y%m%d%H%M%S') - desc = '' - actors = '' - producers = '' - category = '' - episode = '' - rebroadcast = False - rating = 0 + 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) - - # Write Program def writeProgram(programdata): ChannelId = programdata['channelId'] @@ -861,6 +830,7 @@ def writeProgram(programdata): if addverbose == 'y': desc = escape(programdata['programName']) if subprogramName : desc = desc + '\n부제 : ' + subprogramName + if rebroadcast == True and addrebroadcast == 'y' : desc = desc + '\n방송 : 재방송' if episode : desc = desc + '\n회차 : ' + str(episode) + '회' if category : desc = desc + '\n장르 : ' + category if actors : desc = desc + '\n출연 : ' + actors From 11af8b489a825b6704caca07e65452e5268c5518 Mon Sep 17 00:00:00 2001 From: wonipapa Date: Fri, 18 Aug 2017 18:27:23 +0900 Subject: [PATCH 08/41] =?UTF-8?q?ariran,=20iscs,=20hcn,=20pooq=20=ED=95=A8?= =?UTF-8?q?=EC=88=98=20=EC=B6=94=EA=B0=80,=20=ED=95=A8=EC=88=98=20?= =?UTF-8?q?=EC=B5=9C=EC=A0=81=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- epg2xml.py | 159 ++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 108 insertions(+), 51 deletions(-) diff --git a/epg2xml.py b/epg2xml.py index 4c12bab..4c72af0 100644 --- a/epg2xml.py +++ b/epg2xml.py @@ -121,8 +121,8 @@ def getEpg(): GetEPGFromSK(ChannelInfo) elif ChannelSource == 'SKB': GetEPGFromSKB(ChannelInfo) - elif ChannelSource == 'SKY': - GetEPGFromSKY(ChannelInfo) + #elif ChannelSource == 'SKY': + # GetEPGFromSKY(ChannelInfo) elif ChannelSource == 'NAVER': GetEPGFromNaver(ChannelInfo) elif ChannelSource == 'ISCS': @@ -139,6 +139,8 @@ def getEpg(): GetEPGFromIfm(ChannelInfo) elif ChannelSource == 'KBS': GetEPGFromKbs(ChannelInfo) + elif ChannelSource == 'ARIRANG': + GetEPGFromArirang(ChannelInfo) print('') # Get EPG data from epg.co.kr @@ -146,11 +148,9 @@ def GetEPGFromEPG(ChannelInfo): ChannelId = ChannelInfo[0] ChannelName = ChannelInfo[1] ServiceId = ChannelInfo[3] - url = 'http://211.43.210.10:88/epg-cgi/extern/cnm_guide_type_v070530.php' epginfo = [] - startTime = endTime = programName = subprogramName = desc = actors = producers = category = episode = '' - rebroadcast = False - rating = 0 + url = 'http://211.43.210.10:88/epg-cgi/extern/cnm_guide_type_v070530.php' + for k in range(period): day = today + datetime.timedelta(days=k) params = {'beforegroup':'100', 'checkchannel[]':ServiceId, 'select_group':'100', 'start_date':day.strftime('%Y%m%d')} @@ -174,6 +174,9 @@ def GetEPGFromEPG(ChannelInfo): hour = 'AM ' + str(hour) thisday = day + datetime.timedelta(days=1) for celldata in cell.parent.find_all('tr'): + startTime = endTime = programName = subprogramName = desc = actors = producers = category = episode = '' + rebroadcast = False + rating = 0 pattern = ".*\[(.*)\]<\/td>\s.*\">(.*?)\s*(<(.*)>)?\s*(\(재\))?\s*(\(([\d,]+)회\)?)?()?\s*<\/td><\/tr>" matches = re.match(pattern, str(celldata)) if not (matches is None): @@ -190,21 +193,18 @@ def GetEPGFromEPG(ChannelInfo): episode = matches.group(7) if matches.group(7) else '' #ChannelId, startTime, programName, subprogramName, desc, actors, producers, category, episode, rebroadcast, rating epginfo.append([ChannelId, startTime, programName, subprogramName, desc, actors, producers, category, episode, rebroadcast, rating]) + epgzip(epginfo) except (requests.exceptions.RequestException) as e: if(debug): printError(ChannelName + str(e)) else: pass - epgzip(epginfo) # Get EPG data from KT def GetEPGFromKT(ChannelInfo): ChannelId = ChannelInfo[0] ChannelName = ChannelInfo[1] ServiceId = ChannelInfo[3] - url = 'http://tv.olleh.com/renewal_sub/liveTv/pop_schedule_week.asp' epginfo = [] - startTime = endTime = programName = subprogramName = desc = actors = producers = category = episode = '' - rebroadcast = False - rating = 0 + url = 'http://tv.olleh.com/renewal_sub/liveTv/pop_schedule_week.asp' for k in range(period): day = today + datetime.timedelta(days=k) params = {'ch_name':'', 'ch_no':ServiceId, 'nowdate':day.strftime('%Y%m%d'), 'seldatie':day.strftime('%Y%m%d'), 'tab_no':'1'} @@ -219,6 +219,9 @@ def GetEPGFromKT(ChannelInfo): if(html): for row in html: for cell in [row.find_all('td')]: + startTime = endTime = programName = subprogramName = desc = actors = producers = category = episode = '' + rebroadcast = False + rating = 0 startTime = str(day) + ' ' + cell[0].text startTime = datetime.datetime.strptime(startTime, '%Y-%m-%d %H:%M') startTime = startTime.strftime('%Y%m%d%H%M%S') @@ -245,11 +248,8 @@ def GetEPGFromLG(ChannelInfo): ChannelId = ChannelInfo[0] ChannelName = ChannelInfo[1] ServiceId = ChannelInfo[3] - url = 'http://www.uplus.co.kr/css/chgi/chgi/RetrieveTvSchedule.hpi' epginfo = [] - startTime = endTime = programName = subprogramName = desc = actors = producers = category = episode = '' - rebroadcast = False - rating = 0 + url = 'http://www.uplus.co.kr/css/chgi/chgi/RetrieveTvSchedule.hpi' for k in range(period): day = today + datetime.timedelta(days=k) params = {'chnlCd': ServiceId, 'evntCmpYmd': day.strftime('%Y%m%d')} @@ -265,6 +265,9 @@ def GetEPGFromLG(ChannelInfo): if(html): for row in html: for cell in [row.find_all('td')]: + startTime = endTime = programName = subprogramName = desc = actors = producers = category = episode = '' + rebroadcast = False + rating = 0 startTime = str(day) + ' ' + cell[0].text startTime = datetime.datetime.strptime(startTime, '%Y-%m-%d %H:%M') startTime = startTime.strftime('%Y%m%d%H%M%S') @@ -293,9 +296,6 @@ def GetEPGFromSK(ChannelInfo): ChannelId = ChannelInfo[0] ChannelName = ChannelInfo[1] ServiceId = ChannelInfo[3] - startTime = endTime = programName = subprogramName = desc = actors = producers = category = episode = '' - rebroadcast = False - rating = 0 lastday = today + datetime.timedelta(days=period-1) url = 'http://m.btvplus.co.kr/Common/Inc/IFGetData.asp' params = {'variable': 'IF_LIVECHART_DETAIL', 'pcode':'|^|start_time=' + today.strftime('%Y%m%d') + '00|^|end_time='+ lastday.strftime('%Y%m%d') + '24|^|svc_id=' + str(ServiceId)} @@ -311,6 +311,9 @@ def GetEPGFromSK(ChannelInfo): else : programs = data['channel']['programs'] for program in programs: + startTime = endTime = programName = subprogramName = desc = actors = producers = category = episode = '' + rebroadcast = False + rating = 0 pattern = '^(.*?)(?:\s*[\(<]([\d,회]+)[\)>])?(?:\s*<([^<]*?)>)?(\((재)\))?$' matches = re.match(pattern, program['programName'].replace('...', '>').encode('utf-8')) if not (matches is None): @@ -343,9 +346,6 @@ def GetEPGFromSKB(ChannelInfo): ChannelId = ChannelInfo[0] ChannelName = ChannelInfo[1] ServiceId = ChannelInfo[3] - startTime = endTime = programName = subprogramName = desc = actors = producers = category = episode = '' - rebroadcast = False - rating = 0 url = 'http://m.skbroadband.com/content/realtime/Channel_List.do' epginfo = [] for k in range(period): @@ -361,6 +361,9 @@ def GetEPGFromSKB(ChannelInfo): html = soup.find_all('li') if soup.find_all('li') 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('span', {'class':'time'}).text cell = row.find('span', {'class':None}).text.decode('string_escape').strip() pattern = "^(.*?)(\(([\d,]+)회\))?(<(.*)>)?(\((재)\))?$" @@ -388,9 +391,6 @@ def GetEPGFromSKY(ChannelInfo): ChannelId = ChannelInfo[0] ChannelName = ChannelInfo[1] ServiceId = ChannelInfo[3] - startTime = endTime = programName = subprogramName = desc = actors = producers = category = episode = '' - rebroadcast = False - rating = 0 url = 'http://www.skylife.co.kr/channel/epg/channelScheduleListJson.do' for k in range(period): day = today + datetime.timedelta(days=k) @@ -407,6 +407,9 @@ def GetEPGFromSKY(ChannelInfo): else : programs = data['scheduleListIn'] for program in programs : + startTime = endTime = programName = subprogramName = desc = actors = producers = category = episode = '' + rebroadcast = False + rating = 0 programName = unescape(program['program_name']).replace('lt;','<').replace('gt;','>').replace('amp;','&') if program['program_name'] else '' subprogramName = unescape(program['program_subname']).replace('lt;','<').replace('gt;','>').replace('amp;','&') if program['program_subname'] else '' startTime = program['starttime'] @@ -437,9 +440,6 @@ def GetEPGFromNaver(ChannelInfo): ChannelName = ChannelInfo[1] ServiceId = ChannelInfo[3] epginfo = [] - startTime = endTime = programName = subprogramName = desc = actors = producers = category = episode = '' - rebroadcast = False - rating = 0 totaldate = [] url = 'https://search.naver.com/p/csearch/content/batchrender_ssl.nhn' for k in range(period): @@ -455,6 +455,9 @@ def GetEPGFromNaver(ChannelInfo): for i, date in enumerate(data['displayDates']): for j in range(0,24): for program in data['schedules'][j][i]: + startTime = endTime = programName = subprogramName = desc = actors = producers = category = episode = '' + rebroadcast = False + rating = 0 programName = unescape(program['title']) startTime = date['date'] + ' ' + program['startTime'] startTime = datetime.datetime.strptime(startTime, '%Y%m%d %H:%M') @@ -478,9 +481,6 @@ def GetEPGFromIscs(ChannelInfo): ChannelName = ChannelInfo[1] ServiceId = ChannelInfo[3] epginfo = [] - startTime = endTime = programName = subprogramName = desc = actors = producers = category = episode = '' - rebroadcast = False - rating = 0 url='https://www.iscs.co.kr/service/sub/ajax_channel_view.asp' for k in range(period): day = today + datetime.timedelta(days=k) @@ -495,6 +495,9 @@ def GetEPGFromIscs(ChannelInfo): html = soup.find_all('tr') if soup.find_all('tr') 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('td', {'class':'time'}).text programName = row.find('td', {'class':'name'}).text.decode('string_escape').strip() rating = row.find('span', {'class':'year'}).text.decode('string_escape').strip() @@ -506,7 +509,6 @@ def GetEPGFromIscs(ChannelInfo): programName = matches.group(1) if matches.group(1) else '' episode = matches.group(2) if matches.group(2) else '' rebroadcast = True if matches.group(3) else False - #ChannelId, startTime, programName, subprogramName, desc, actors, producers, category, episode, rebroadcast, rating epginfo.append([ChannelId, startTime, programName, subprogramName, desc, actors, producers, category, episode, rebroadcast, rating]) epgzip(epginfo) @@ -523,9 +525,6 @@ def GetEPGFromHcn(ChannelInfo): ChannelName = ChannelInfo[1] ServiceId = ChannelInfo[3] epginfo = [] - startTime = endTime = programName = subprogramName = desc = actors = producers = category = episode = '' - rebroadcast = False - rating = 0 url = 'https://www.hcn.co.kr/ur/bs/ch/channelInfo.hcn' for k in range(period): day = today + datetime.timedelta(days=k) @@ -540,12 +539,13 @@ def GetEPGFromHcn(ChannelInfo): html = soup.find_all('tr') if soup.find_all('tr') 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('td', {'class':'f'}).text startTime = datetime.datetime.strptime(startTime, '%Y-%m-%d %H:%M') startTime = startTime.strftime('%Y%m%d%H%M%S') programName = row.find('td', {'class':'left'}).text.decode('string_escape').strip() - rating = 0 - rebroadcast = False for image in row.find_all('img', {'class':'vM'}, alt=True): rebroad = re.match('(재방송)',image['alt'].decode('string_escape').strip()) if not (rebroad is None): rebroadcast = True @@ -566,9 +566,6 @@ def GetEPGFromPooq(ChannelInfo): ChannelId = ChannelInfo[0] ChannelName = ChannelInfo[1] ServiceId = ChannelInfo[3] - startTime = endTime = programName = subprogramName = desc = actors = producers = category = episode = '' - rebroadcast = False - rating = 0 url = 'https://wapie.pooq.co.kr/v1/epgs30/C' + str(ServiceId) + '/' lastday = today + datetime.timedelta(days=period-1) params = {'deviceTypeId': 'pc', 'marketTypeId': 'generic', 'apiAccessCredential': 'EEBE901F80B3A4C4E5322D58110BE95C', 'offset': '0', 'limit': '1000', 'startTime': today.strftime('%Y/%m/%d') + ' 00:00', 'endTime': lastday.strftime('%Y/%m/%d') + ' 00:00'} @@ -585,6 +582,9 @@ def GetEPGFromPooq(ChannelInfo): else : programs = data['result']['list'] for program in programs: + startTime = endTime = programName = subprogramName = desc = actors = producers = category = episode = '' + rebroadcast = False + rating = 0 if program['startDate'] in date_list : startTime = program['startDate'] + ' ' + program['startTime'] startTime = datetime.datetime.strptime(startTime, '%Y-%m-%d %H:%M') @@ -615,9 +615,6 @@ def GetEPGFromMbc(ChannelInfo): ChannelId = ChannelInfo[0] ChannelName = ChannelInfo[1] ServiceId = ChannelInfo[3] - startTime = endTime = programName = subprogramName = desc = actors = producers = category = episode = '' - rebroadcast = False - rating = 0 dayofweek = ['월', '화', '수', '목', '금', '토', '일'] url = 'http://miniunit.imbc.com/Schedule' params = {'rtype': 'json'} @@ -630,6 +627,9 @@ def GetEPGFromMbc(ChannelInfo): try: data = json.loads(json_data, encoding='utf-8') for program in data['Programs']: + startTime = endTime = programName = subprogramName = desc = actors = producers = category = episode = '' + rebroadcast = False + rating = 0 if program['Channel'] == "CHAM" and program['LiveDays'] == dayofweek[day.weekday()]: pattern = '^(.*?)(\(재\))?$' matches = re.match(pattern, unescape(program['ProgramTitle'].encode('utf-8', 'ignore'))) @@ -656,9 +656,6 @@ def GetEPGFromMil(ChannelInfo): ChannelId = ChannelInfo[0] ChannelName = ChannelInfo[1] ServiceId = ChannelInfo[3] - startTime = endTime = programName = subprogramName = desc = actors = producers = category = episode = '' - rebroadcast = False - rating = 0 url = 'http://radio.dema.mil.kr/web/fm/quick/ajaxTimetableList.do' for k in range(period): day = today + datetime.timedelta(days=k) @@ -670,6 +667,9 @@ def GetEPGFromMil(ChannelInfo): try: data = json.loads(json_data, encoding='utf-8') for program in data['resultList']: + startTime = endTime = programName = subprogramName = desc = actors = producers = category = episode = '' + rebroadcast = False + rating = 0 pattern = '^(.*?)(\(재\))?$' matches = re.match(pattern, unescape(program['program_title'].encode('utf-8', 'ignore'))) if not(matches is None): @@ -704,9 +704,6 @@ def GetEPGFromIfm(ChannelInfo): ChannelId = ChannelInfo[0] ChannelName = ChannelInfo[1] ServiceId = ChannelInfo[3] - startTime = endTime = programName = subprogramName = desc = actors = producers = category = episode = '' - rebroadcast = False - rating = 0 dayofweek = ['1', '2', '3', '4', '5', '6', '7'] url = 'http://mapp.itvfm.co.kr/hyb/front/selectHybPgmList.do' for k in range(period): @@ -719,6 +716,9 @@ def GetEPGFromIfm(ChannelInfo): try: data = json.loads(json_data, encoding='utf-8') for program in data['hybMusicInfoList']: + startTime = endTime = programName = subprogramName = desc = actors = producers = category = episode = '' + rebroadcast = False + rating = 0 programName = unescape(program['pgmTitle']) startTime = str(day) + ' ' + program['pgmStime'] startTime = datetime.datetime.strptime(startTime, '%Y-%m-%d %H:%M') @@ -749,9 +749,6 @@ def GetEPGFromKbs(ChannelInfo): ChannelName = ChannelInfo[1] ServiceId = ChannelInfo[3] epginfo = [] - startTime = endTime = programName = subprogramName = desc = actors = producers = category = episode = '' - rebroadcast = False - rating = 0 url = 'http://world.kbs.co.kr/include/wink/_ajax_schedule.php' params = {'channel':'wink_11'} for k in range(period): @@ -764,6 +761,9 @@ def GetEPGFromKbs(ChannelInfo): data = json.loads(json_data, encoding='utf-8') soup = BeautifulSoup(data['schedule'], 'lxml') for row in soup.find_all('li'): + startTime = endTime = programName = subprogramName = desc = actors = producers = category = episode = '' + rebroadcast = False + rating = 0 pattern = '([0-2][0-9]:[0-5][0-9])[0-2][0-9]:[0-5][0-9]\[(.*)\] Broadcast' matches = re.match(pattern, unescape(row.text.encode('utf-8', 'ignore'))) if not(matches is None): @@ -781,6 +781,63 @@ def GetEPGFromKbs(ChannelInfo): if(debug): printError(ChannelName + str(e)) else: pass +# Get EPG data from ARIRANG +def GetEPGFromArirang(ChannelInfo): + ChannelId = ChannelInfo[0] + ChannelName = ChannelInfo[1] + ServiceId = ChannelInfo[3] + epginfo = [] + url = 'http://www.arirang.com/Radio/Radio_Index.asp' + for k in range(period): + day = today + datetime.timedelta(days=k) + params = {} + try: + response = requests.get(url, params=params, headers=ua, timeout=timeout) + response.raise_for_status() + data = response.content + #data = html_data.encode('utf-8', 'ignore') + if day.weekday() < 5 : + strainer = SoupStrainer('table', {'id':'aIRSW_week'}) + elif day.weekday() == 5: + strainer = SoupStrainer('table', {'id':'aIRSW_sat'}) + elif day.weekday() == 6: + strainer = SoupStrainer('table', {'id':'aIRSW_sun'}) + soup = BeautifulSoup(data, 'lxml', parse_only=strainer, from_encoding='utf-8') + html = soup.find_all('tr') if soup.find_all('tr') else '' + if(html): + for row in html: + startTime = endTime = programName = subprogramName = desc = actors = producers = category = episode = '' + rebroadcast = False + rating = 0 + for i, minute in enumerate(row.find('th').text.split('~')): + if i == 0: + startTime = str(day) + ' ' + minute + elif i == 1: + endTime = str(day) + ' ' + minute + startTime = datetime.datetime.strptime(startTime, '%Y-%m-%d %H:%M') + startTime = startTime.strftime('%Y%m%d%H%M%S') + try: + endTime = datetime.datetime.strptime(endTime, '%Y-%m-%d %H:%M') + endTime = endTime.strftime('%Y%m%d%H%M%S') + except ValueError: + endTime = endTime.replace(' 24', ' 23') + endTime = datetime.datetime.strptime(endTime, '%Y-%m-%d %H:%M') + endTime = endTime + datetime.timedelta(hours=1) + endTime = endTime.strftime('%Y%m%d%H%M%S') + pattern = '^(.*?)(?:\((Re)\))?$' + matches = re.match(pattern, unescape(row.find('td').text.decode('string_escape').strip().encode('utf-8', 'ignore'))) + if not(matches is None): + programName = unescape(matches.group(1)) + rebroadcast = True if matches.group(2) else False + 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) + else: + if(debug): printError(ChannelName + CONTENT_ERROR) + else: pass + except (requests.exceptions.RequestException) as e: + if(debug): printError(ChannelName + str(e)) + else: pass + # Zip epginfo def epgzip(epginfo): #ChannelId, startTime, programName, subprogramName, desc, actors, producers, category, episode, rebroadcast, rating From ab2eb06d9bba27e0e49fa12fe7547f2b398df70b Mon Sep 17 00:00:00 2001 From: wonipapa Date: Tue, 22 Aug 2017 10:52:29 +0900 Subject: [PATCH 09/41] 20170822 --- 채널정보.xlsx | Bin 82913 -> 94167 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/채널정보.xlsx b/채널정보.xlsx index 59668e16a7478ddfb7fb11dfec24e2dd4f9c1e1d..d1169d633c4a5e2afcf7bb92e2545e2d38a54c6d 100644 GIT binary patch delta 86927 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
~51) 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 N1wxt`xDE*Ue*o-1oUZ@? delta 75598 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
 MyISP : 사용하는 ISP를 넣는다 .(ALL, KT, LG, SK가 사용가능하다)
+MyChannels : EPG 정보를 가져오고자 하는 채널 ID를 넣는다. ("1, 2, 3, 4" 또는 "1,2,3,4"
 default_icon_url : 채널별 아이콘이 있는 url을 설정할 수 있다. 아이콘의 이름은 json 파일에 있는 Id.png로 기본설정되어 있다.
 default_rebroadcast : 제목에 재방송 정보 출력
 default_episode : 제목에 회차정보 출력
@@ -32,11 +33,12 @@ default_xml_socket   : External XMLTV 사용시 xmltv.sock가 있는 경로로 
 
### Channel.json -Channel.json 파일의 최신버전 https://github.com/wonipapa/Channel.json 에서 다운받을 수 있다. +Channel.json 파일의 최신버전은 https://github.com/wonipapa/Channel.json 에서 다운받을 수 있다. Channel.json 파일을 텍스트 편집기로 열어보면 각채널별 정보가 들어 있다. 이중 Enabled:1로 되어 있는 부분을 Enabled:0으로 바꾸면 EPG정보를 가져오지 않는다. 필요없는 채널정보를 가져오지 않게 하는 것으로 EPG 정보 수집시 시간을 단축할 수 있다. 삭제된 채널등으로 인해서 오류 발생시에도 Enabled:0으로 변경하면 오류 발생을 차단할 수 있다. +1.2.3 버전부터 Enabled 항목은 없어질 예정이다. ## 옵션 소개 ### epg2xml.py, epg2xml.php 옵션 From dff75b9a4e35a7eb0ecc731eeced3468ad11eee0 Mon Sep 17 00:00:00 2001 From: wonipapa Date: Fri, 1 Sep 2017 15:55:27 +0900 Subject: [PATCH 23/41] Update Channel.json --- Channel.json | 346 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 346 insertions(+) create mode 100644 Channel.json diff --git a/Channel.json b/Channel.json new file mode 100644 index 0000000..0a9c8de --- /dev/null +++ b/Channel.json @@ -0,0 +1,346 @@ +[ +{ "Id": 1, "Name": "9colors", "KT Name": "9colors", "KTCh": 163, "LG Name": "나인컬러스", "LGCh": 178, "SK Name": "9colors", "SKCh": 220, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/tRhzBgK.png", "Source": "SK", "ServiceId": "285", "Enabled": 0 }, +{ "Id": 2, "Name": "애니박스", "KT Name": "애니박스", "KTCh": 135, "LG Name": "애니박스", "LGCh": 148, "SK Name": "애니박스", "SKCh": 179, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/ipM9AXe.png", "Source": "SKY", "ServiceId": "84", "Enabled": 0 }, +{ "Id": 3, "Name": "Animal Planet", "KT Name": "Animal Planet", "KTCh": 179, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/ae70Di1.png", "Source": "SKY", "ServiceId": "182", "Enabled": 0 }, +{ "Id": 4, "Name": "ANIMAX", "KT Name": "ANIMAX", "KTCh": 133, "LG Name": "애니맥스", "LGCh": 167, "SK Name": "Animax", "SKCh": 173, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/2Gfqhuj.png", "Source": "SKY", "ServiceId": "725", "Enabled": 0 }, +{ "Id": 5, "Name": "애니원", "KT Name": "애니원", "KTCh": 134, "LG Name": "애니원", "LGCh": 153, "SK Name": "애니원", "SKCh": 174, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/sIp2MZ3.png", "Source": "SKY", "ServiceId": "56", "Enabled": 0 }, +{ "Id": 6, "Name": "예술 TV아르떼", "KT Name": "예술 TV아르떼", "KTCh": 91, "LG Name": "예술TV 아르떼", "LGCh": 139, "SK Name": "Arte TV", "SKCh": 234, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/zReu7df.png", "Source": "SK", "ServiceId": "421", "Enabled": 0 }, +{ "Id": 7, "Name": "Asia UHD", "KT Name": "Asia UHD", "KTCh": 109, "LG Name": "", "LGCh": null, "SK Name": "Asia UHD", "SKCh": 72, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/1u80OGN.png", "Source": "SKY", "ServiceId": "655", "Enabled": 0 }, +{ "Id": 8, "Name": "AsiaN", "KT Name": "AsiaN", "KTCh": 111, "LG Name": "아시아N", "LGCh": 88, "SK Name": "Asia N", "SKCh": 106, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/gleMSFq.png", "Source": "SK", "ServiceId": "177", "Enabled": 0 }, +{ "Id": 9, "Name": "Australia Plus", "KT Name": "Australia Plus", "KTCh": 258, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/6k9j2Hj.png", "Source": "NAVER", "ServiceId": "815391", "Enabled": 0 }, +{ "Id": 10, "Name": "AXN", "KT Name": "AXN", "KTCh": 113, "LG Name": "AXN", "LGCh": 45, "SK Name": "AXN", "SKCh": 102, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/QrAXBEm.png", "Source": "LG", "ServiceId": "744", "Enabled": 0 }, +{ "Id": 11, "Name": "B Shopping", "KT Name": "B Shopping", "KTCh": 30, "LG Name": "B쇼핑", "LGCh": 28, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/HiCKxpt.png", "Source": "LG", "ServiceId": "738", "Enabled": 0 }, +{ "Id": 14, "Name": "Baby TV", "KT Name": "Baby TV", "KTCh": 146, "LG Name": "", "LGCh": null, "SK Name": "Baby TV", "SKCh": 195, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/mU7QuTz.png", "Source": "KT", "ServiceId": "146", "Enabled": 0 }, +{ "Id": 15, "Name": "BBC Earth", "KT Name": "BBC Earth", "KTCh": 172, "LG Name": "BBC Earth", "LGCh": 130, "SK Name": "BBC earth", "SKCh": 265, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/SJZjuqO.png", "Source": "EPG", "ServiceId": "904", "Enabled": 0 }, +{ "Id": 18, "Name": "BBC WN", "KT Name": "BBC WN", "KTCh": 192, "LG Name": "BBC World News", "LGCh": 126, "SK Name": "BBC World News", "SKCh": 160, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/IwJBNd4.png", "Source": "EPG", "ServiceId": "260", "Enabled": 0 }, +{ "Id": 19, "Name": "BBS불교방송", "KT Name": "BBS불교방송", "KTCh": 232, "LG Name": "BBS", "LGCh": 186, "SK Name": "BBS 불교방송", "SKCh": 306, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/B34jpmo.png", "Source": "HCN", "ServiceId": "903", "Enabled": 0 }, +{ "Id": 20, "Name": "빌리어즈티비", "KT Name": "빌리어즈티비", "KTCh": 116, "LG Name": "빌리어즈TV", "LGCh": 63, "SK Name": "Billiards TV", "SKCh": 130, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/f0OW8wX.png", "Source": "EPG", "ServiceId": "615", "Enabled": 0 }, +{ "Id": 21, "Name": "Bloomberg", "KT Name": "Bloomberg", "KTCh": 196, "LG Name": "", "LGCh": null, "SK Name": "Bloomberg TV", "SKCh": 162, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/WWNLhh3.png", "Source": "SK", "ServiceId": "775", "Enabled": 0 }, +{ "Id": 23, "Name": "BTN불교TV", "KT Name": "BTN불교TV", "KTCh": 233, "LG Name": "BTN", "LGCh": 185, "SK Name": "BTN 불교TV", "SKCh": 305, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/XU4pwpC.png", "Source": "HCN", "ServiceId": "52", "Enabled": 0 }, +{ "Id": 24, "Name": "C channel", "KT Name": "C Channel", "KTCh": 235, "LG Name": "C채널", "LGCh": 182, "SK Name": "C채널", "SKCh": 304, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/SFouN1c.png", "Source": "HCN", "ServiceId": "907", "Enabled": 0 }, +{ "Id": 26, "Name": "C TIME", "KT Name": "C TIME", "KTCh": 69, "LG Name": "C타임", "LGCh": 86, "SK Name": "C TIME", "SKCh": 86, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/2FwWidb.png", "Source": "LG", "ServiceId": "775", "Enabled": 0 }, +{ "Id": 27, "Name": "Cbeebies", "KT Name": "Cbeebies", "KTCh": 152, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/4bIQeie.png", "Source": "NAVER", "ServiceId": "814991", "Enabled": 0 }, +{ "Id": 28, "Name": "CBS", "KT Name": "CBS", "KTCh": 238, "LG Name": "CBS", "LGCh": 181, "SK Name": "CBS", "SKCh": 300, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/yBNo2mS.png", "Source": "HCN", "ServiceId": "156", "Enabled": 0 }, +{ "Id": 31, "Name": "CCTV4", "KT Name": "CCTV4", "KTCh": 280, "LG Name": "CCTV4", "LGCh": 120, "SK Name": "CCTV4", "SKCh": 277, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/ACwvhcc.png", "Source": "ISCS", "ServiceId": "1467", "Enabled": 0 }, +{ "Id": 32, "Name": "CGNTV", "KT Name": "CGNTV", "KTCh": 237, "LG Name": "CGNTV", "LGCh": 183, "SK Name": "CGNTV", "SKCh": 302, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/9fNvKEX.png", "Source": "NAVER", "ServiceId": "815106", "Enabled": 0 }, +{ "Id": 34, "Name": "Channel [V]", "KT Name": "Channel [V]", "KTCh": 89, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/t1PNA6v.png", "Source": "KT", "ServiceId": "89", "Enabled": 0 }, +{ "Id": 35, "Name": "채널 J", "KT Name": "채널 J", "KTCh": 108, "LG Name": "채널J", "LGCh": 145, "SK Name": "채널J", "SKCh": 103, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/V9jGCZm.png", "Source": "LG", "ServiceId": "656", "Enabled": 0 }, +{ "Id": 36, "Name": "Channel News Asia", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "Channel News Asia", "SKCh": 163, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/hahdOp1.png", "Source": "SKB", "ServiceId": "777", "Enabled": 0 }, +{ "Id": 38, "Name": "cineF", "KT Name": "", "KTCh": null, "LG Name": "시네프", "LGCh": 42, "SK Name": "Cinef", "SKCh": 58, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/TfhQXIv.png", "Source": "SKB", "ServiceId": "193", "Enabled": 0 }, +{ "Id": 39, "Name": "UXN", "KT Name": "UXN", "KTCh": 101, "LG Name": "UXN", "LGCh": 2, "SK Name": "UXN", "SKCh": 70, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/5rRW0R3.png", "Source": "SKY", "ServiceId": "624", "Enabled": 0 }, +{ "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", "Enabled": 0 }, +{ "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", "Enabled": 0 }, +{ "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", "Enabled": 0 }, +{ "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", "Enabled": 0 }, +{ "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", "Enabled": 0 }, +{ "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", "Enabled": 0 }, +{ "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", "Enabled": 0 }, +{ "Id": 47, "Name": "CNN US", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "CNN US", "SKCh": 159, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/EL6i9mA.png", "Source": "SK", "ServiceId": "782", "Enabled": 0 }, +{ "Id": 48, "Name": "CNTV", "KT Name": "CNTV", "KTCh": 68, "LG Name": "CNTV", "LGCh": 85, "SK Name": "CNTV", "SKCh": 43, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/lCGq3v1.png", "Source": "NAVER", "ServiceId": "814709", "Enabled": 0 }, +{ "Id": 49, "Name": "CTS기독교TV", "KT Name": "CTS기독교TV", "KTCh": 236, "LG Name": "CTS", "LGCh": 180, "SK Name": "CTS", "SKCh": 301, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/lW9nvaB.png", "Source": "HCN", "ServiceId": "42", "Enabled": 0 }, +{ "Id": 50, "Name": "CUBE TV", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "CUBE TV", "SKCh": 89, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/xvEjFJa.png", "Source": "NAVER", "ServiceId": "1725243", "Enabled": 0 }, +{ "Id": 51, "Name": "디스커버리채널", "KT Name": "디스커버리채널", "KTCh": 177, "LG Name": "", "LGCh": null, "SK Name": "Discovery Channel", "SKCh": 261, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/1SgSI0P.png", "Source": "SKB", "ServiceId": "437", "Enabled": 0 }, +{ "Id": 52, "Name": "Dog TV", "KT Name": "Dog TV", "KTCh": 201, "LG Name": "DOG TV", "LGCh": 89, "SK Name": "DOG TV", "SKCh": 79, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/4Xqehq9.png", "Source": "SKB", "ServiceId": "255", "Enabled": 0 }, +{ "Id": 53, "Name": "Dream Works Channel", "KT Name": "Dream Works Channel", "KTCh": 131, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/ETfF49T.png", "Source": "KT", "ServiceId": "131", "Enabled": 0 }, +{ "Id": 54, "Name": "DW-TV Asia+", "KT Name": "DW-TV Asia+", "KTCh": 257, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/b0yhwNu.png", "Source": "NAVER", "ServiceId": "815529", "Enabled": 0 }, +{ "Id": 55, "Name": "E채널", "KT Name": "E채널", "KTCh": 48, "LG Name": "E 채널", "LGCh": 104, "SK Name": "E채널", "SKCh": 83, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/0WmEGB4.png", "Source": "EPG", "ServiceId": "108", "Enabled": 0 }, +{ "Id": 56, "Name": "EBS English", "KT Name": "EBS English", "KTCh": 156, "LG Name": "EBS English", "LGCh": 162, "SK Name": "EBS English", "SKCh": 202, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/Rx4mgpm.png", "Source": "LG", "ServiceId": "801", "Enabled": 0 }, +{ "Id": 57, "Name": "EBS u", "KT Name": "EBS u", "KTCh": 145, "LG Name": "EBS u", "LGCh": 168, "SK Name": "EBSu", "SKCh": 194, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/RIgVjvP.png", "Source": "NAVER", "ServiceId": "815547", "Enabled": 0 }, +{ "Id": 58, "Name": "EBS PLUS1", "KT Name": "EBS PLUS1", "KTCh": 157, "LG Name": "EBS+1", "LGCh": 163, "SK Name": "EBS +1", "SKCh": 203, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/WGlWiWy.png", "Source": "LG", "ServiceId": "714", "Enabled": 0 }, +{ "Id": 59, "Name": "EBS PLUS2", "KT Name": "EBS PLUS2", "KTCh": 158, "LG Name": "EBS+2", "LGCh": 164, "SK Name": "EBS +2", "SKCh": 204, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/QPq2wcg.png", "Source": "LG", "ServiceId": "715", "Enabled": 0 }, +{ "Id": 60, "Name": "EBS", "KT Name": "EBS", "KTCh": 13, "LG Name": "EBS1", "LGCh": 14, "SK Name": "EBS", "SKCh": 13, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/WViFruZ.png", "Source": "SKY", "ServiceId": "798", "Enabled": 0 }, +{ "Id": 61, "Name": "EBS2", "KT Name": "EBS2", "KTCh": 95, "LG Name": "EBS2", "LGCh": 95, "SK Name": "EBS2", "SKCh": 95, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/RIrBF4D.png", "Source": "POOQ", "ServiceId": "E02", "Enabled": 0 }, +{ "Id": 62, "Name": "Edge TV", "KT Name": "Edge TV", "KTCh": 79, "LG Name": "엣지TV", "LGCh": 68, "SK Name": "EDGE TV", "SKCh": 44, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/gsnjG4A.png", "Source": "HCN", "ServiceId": "104", "Enabled": 0 }, +{ "Id": 63, "Name": "edu TV", "KT Name": "edu TV", "KTCh": 159, "LG Name": "에듀TV", "LGCh": 165, "SK Name": "edu TV", "SKCh": 205, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/ZsMKNGe.png", "Source": "LG", "ServiceId": "810", "Enabled": 0 }, +{ "Id": 67, "Name": "Euro News", "KT Name": "Euro News", "KTCh": 193, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/6jswCZM.png", "Source": "NAVER", "ServiceId": "814935", "Enabled": 0 }, +{ "Id": 68, "Name": "Euro sport", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "Eurosport", "SKCh": 134, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/7hVKz6n.png", "Source": "SKB", "ServiceId": "120", "Enabled": 0 }, +{ "Id": 70, "Name": "Extreme Fun", "KT Name": "Extreme Fun", "KTCh": 173, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/yDg1RC6.png", "Source": "KT", "ServiceId": "173", "Enabled": 0 }, +{ "Id": 71, "Name": "Fashion N", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "Fashion N", "SKCh": 211, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/qPBnZpV.png", "Source": "SKB", "ServiceId": "274", "Enabled": 0 }, +{ "Id": 72, "Name": "FISHING TV", "KT Name": "FISHING TV", "KTCh": 119, "LG Name": "피싱TV", "LGCh": 65, "SK Name": "FISHING TV", "SKCh": 244, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/Go4FdK1.png", "Source": "SK", "ServiceId": "273", "Enabled": 0 }, +{ "Id": 73, "Name": "푸드TV", "KT Name": "푸드TV", "KTCh": 78, "LG Name": "푸드TV", "LGCh": 83, "SK Name": "Food TV", "SKCh": 213, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/F9Rb9SA.png", "Source": "HCN", "ServiceId": "753", "Enabled": 0 }, +{ "Id": 74, "Name": "FOX", "KT Name": "FOX", "KTCh": 107, "LG Name": "FOX채널", "LGCh": 44, "SK Name": "FOX", "SKCh": 101, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/8usDWOC.png", "Source": "LG", "ServiceId": "654", "Enabled": 0 }, +{ "Id": 75, "Name": "Fox life", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "Fox life", "SKCh": 216, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/CqVujLk.png", "Source": "SKB", "ServiceId": "280", "Enabled": 0 }, +{ "Id": 76, "Name": "Fox News", "KT Name": "Fox News", "KTCh": 195, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/9rGThzD.png", "Source": "NAVER", "ServiceId": "815413", "Enabled": 0 }, +{ "Id": 78, "Name": "FTV", "KT Name": "FTV", "KTCh": 118, "LG Name": "FTV", "LGCh": 64, "SK Name": "FTV", "SKCh": 243, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/eI9wGgS.png", "Source": "HCN", "ServiceId": "262", "Enabled": 0 }, +{ "Id": 79, "Name": "FUN TV", "KT Name": "FUN TV", "KTCh": 71, "LG Name": "", "LGCh": null, "SK Name": "FUN TV", "SKCh": 91, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/6V8X43L.png", "Source": "KT", "ServiceId": "71", "Enabled": 0 }, +{ "Id": 80, "Name": "FX", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "FX", "SKCh": 90, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/DAnUsTS.png", "Source": "SKY", "ServiceId": "818", "Enabled": 0 }, +{ "Id": 82, "Name": "GMTV", "KT Name": "GMTV", "KTCh": 88, "LG Name": "GMTV", "LGCh": 101, "SK Name": "GMTV", "SKCh": 232, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/WPF3G5V.png", "Source": "NAVER", "ServiceId": "814815", "Enabled": 0 }, +{ "Id": 83, "Name": "Good TV", "KT Name": "Good TV", "KTCh": 234, "LG Name": "", "LGCh": null, "SK Name": "Good TV", "SKCh": 303, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/fFN1YJb.png", "Source": "HCN", "ServiceId": "293", "Enabled": 0 }, +{ "Id": 84, "Name": "GS MY SHOP", "KT Name": "GS MY SHOP", "KTCh": 38, "LG Name": "GS마이샵", "LGCh": 30, "SK Name": "GS MY SHOP", "SKCh": 29, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/0Y0pRW4.png", "Source": "SK", "ServiceId": "343", "Enabled": 0 }, +{ "Id": 85, "Name": "GS SHOP", "KT Name": "GS SHOP", "KTCh": 8, "LG Name": "GS샵", "LGCh": 6, "SK Name": "GS SHOP", "SKCh": 12, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/tz88mYd.png", "Source": "HCN", "ServiceId": "45", "Enabled": 0 }, +{ "Id": 86, "Name": "GTV", "KT Name": "GTV", "KTCh": 73, "LG Name": "GTV", "LGCh": 136, "SK Name": "Gtv", "SKCh": 217, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/1qXSXRa.png", "Source": "HCN", "ServiceId": "35", "Enabled": 0 }, +{ "Id": 87, "Name": "히어로액션", "KT Name": "히어로액션", "KTCh": 112, "LG Name": "히어로액션", "LGCh": 110, "SK Name": "히어로액션", "SKCh": 107, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/yBChQVh.png", "Source": "NAVER", "ServiceId": "814760", "Enabled": 0 }, +{ "Id": 89, "Name": "하이라이트TV", "KT Name": "하이라이트TV", "KTCh": 74, "LG Name": "하이라이트TV", "LGCh": 91, "SK Name": "Highlight TV", "SKCh": 42, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/V9CQ4A6.png", "Source": "LG", "ServiceId": "701", "Enabled": 0 }, +{ "Id": 90, "Name": "History HD", "KT Name": "History HD", "KTCh": 169, "LG Name": "히스토리 HD", "LGCh": 132, "SK Name": "History HD", "SKCh": 264, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/SSkop4X.png", "Source": "NAVER", "ServiceId": "815148", "Enabled": 0 }, +{ "Id": 91, "Name": "HQ+", "KT Name": "HQ+", "KTCh": 253, "LG Name": "", "LGCh": null, "SK Name": "HQ+", "SKCh": 47, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/GTANuZS.png", "Source": "NAVER", "ServiceId": "3566359", "Enabled": 0 }, +{ "Id": 92, "Name": "아이넷TV", "KT Name": "아이넷TV", "KTCh": 92, "LG Name": "아이넷TV", "LGCh": 106, "SK Name": "아이넷 TV", "SKCh": 233, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/JYQpemw.png", "Source": "SKB", "ServiceId": "261", "Enabled": 0 }, +{ "Id": 93, "Name": "IB SPORTS", "KT Name": "IB SPORTS", "KTCh": 53, "LG Name": "IB스포츠", "LGCh": 62, "SK Name": "IB Sports", "SKCh": 129, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/wOOQEC1.png", "Source": "SKY", "ServiceId": "515", "Enabled": 0 }, +{ "Id": 94, "Name": "i-Concerts", "KT Name": "", "KTCh": null, "LG Name": "아이콘서트", "LGCh": 108, "SK Name": "i-Concerts", "SKCh": 236, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/oUUZQdi.png", "Source": "LG", "ServiceId": "661", "Enabled": 0 }, +{ "Id": 95, "Name": "JEI EnglishTV", "KT Name": "JEI EnglishTV", "KTCh": 154, "LG Name": "JEI EnglishTV", "LGCh": 160, "SK Name": "JEI 재능 English", "SKCh": 200, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/R1oJmLo.png", "Source": "SKY", "ServiceId": "289", "Enabled": 0 }, +{ "Id": 96, "Name": "JEI 재능TV", "KT Name": "JEI 재능TV", "KTCh": 142, "LG Name": "JEI재능TV", "LGCh": 159, "SK Name": "JEI 재능TV", "SKCh": 192, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/NoNRdSt.png", "Source": "SKY", "ServiceId": "23", "Enabled": 0 }, +{ "Id": 97, "Name": "JTBC", "KT Name": "JTBC", "KTCh": 15, "LG Name": "JTBC", "LGCh": 15, "SK Name": "JTBC", "SKCh": 15, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/YOYosLG.png", "Source": "POOQ", "ServiceId": "C2301", "Enabled": 0 }, +{ "Id": 98, "Name": "JTBC Golf", "KT Name": "JTBC Golf", "KTCh": 56, "LG Name": "JTBC골프", "LGCh": 54, "SK Name": "JTBC GOLF", "SKCh": 132, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/Bnw7O5U.png", "Source": "SKY", "ServiceId": "974", "Enabled": 0 }, +{ "Id": 99, "Name": "JTBC2", "KT Name": "JTBC2", "KTCh": 39, "LG Name": "JTBC2", "LGCh": 94, "SK Name": "jtbc2", "SKCh": 82, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/WtXDuFU.png", "Source": "POOQ", "ServiceId": "C2303", "Enabled": 0 }, +{ "Id": 100, "Name": "JTBC3", "KT Name": "JTBC3", "KTCh": 62, "LG Name": "JTBC3 FOX스포츠", "LGCh": 50, "SK Name": "JTBC3 FOXSPORTS", "SKCh": 126, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/KvGwEc1.png", "Source": "POOQ", "ServiceId": "C2304", "Enabled": 0 }, +{ "Id": 101, "Name": "K STAR", "KT Name": "K STAR", "KTCh": 87, "LG Name": "K스타", "LGCh": 105, "SK Name": "K star", "SKCh": 88, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/MYtePna.png", "Source": "LG", "ServiceId": "662", "Enabled": 0 }, +{ "Id": 103, "Name": "KBS DRAMA", "KT Name": "KBS Drama", "KTCh": 35, "LG Name": "KBS드라마", "LGCh": 31, "SK Name": "KBS 드라마", "SKCh": 30, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/CrLMIEQ.png", "Source": "SKY", "ServiceId": "910", "Enabled": 0 }, +{ "Id": 104, "Name": "KBS JOY", "KT Name": "KBS Joy", "KTCh": 41, "LG Name": "KBS조이", "LGCh": 3, "SK Name": "KBS joy", "SKCh": 80, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/D1o9by9.png", "Source": "POOQ", "ServiceId": "K04", "Enabled": 0 }, +{ "Id": 105, "Name": "KBS kids", "KT Name": "KBS Kids", "KTCh": 144, "LG Name": "KBS키즈", "LGCh": 169, "SK Name": "KBS KIDS", "SKCh": 190, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/Jcfjs9E.png", "Source": "SKY", "ServiceId": "596", "Enabled": 0 }, +{ "Id": 106, "Name": "KBSN Life", "KT Name": "KBSN Life", "KTCh": 281, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/5Ni1YIT.png", "Source": "POOQ", "ServiceId": "K05", "Enabled": 0 }, +{ "Id": 107, "Name": "KBS N Sports", "KT Name": "KBS N Sports", "KTCh": 59, "LG Name": "KBSN스포츠", "LGCh": 59, "SK Name": "KBSN 스포츠", "SKCh": 121, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/xspD7UE.png", "Source": "LG", "ServiceId": "618", "Enabled": 0 }, +{ "Id": 108, "Name": "KBS W", "KT Name": "KBS W", "KTCh": 83, "LG Name": "KBS W", "LGCh": 77, "SK Name": "KBS W", "SKCh": 214, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/sVqBczs.png", "Source": "POOQ", "ServiceId": "K09", "Enabled": 0 }, +{ "Id": 110, "Name": "KBS1", "KT Name": "KBS1", "KTCh": 9, "LG Name": "KBS1", "LGCh": 9, "SK Name": "KBS1", "SKCh": 9, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/e31o5gw.png", "Source": "SKY", "ServiceId": "796", "Enabled": 0 }, +{ "Id": 111, "Name": "KBS2", "KT Name": "KBS2", "KTCh": 7, "LG Name": "KBS2", "LGCh": 7, "SK Name": "KBS2", "SKCh": 7, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/XgibZbD.png", "Source": "SKY", "ServiceId": "795", "Enabled": 0 }, +{ "Id": 112, "Name": "키즈톡톡", "KT Name": "", "KTCh": null, "LG Name": "키즈톡톡", "LGCh": 158, "SK Name": "키즈톡톡 플러스", "SKCh": 189, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/0loInJO.png", "Source": "LG", "ServiceId": "805", "Enabled": 0 }, +{ "Id": 115, "Name": "KIDS-TV", "KT Name": "KIDS-TV", "KTCh": 149, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/AVCSEdn.png", "Source": "NAVER", "ServiceId": "814999", "Enabled": 0 }, +{ "Id": 116, "Name": "K-NET TV", "KT Name": "K-NET TV", "KTCh": 230, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/GelnqjB.png", "Source": "KT", "ServiceId": "230", "Enabled": 0 }, +{ "Id": 117, "Name": "KTV", "KT Name": "KTV", "KTCh": 64, "LG Name": "KTV", "LGCh": 171, "SK Name": "KTV", "SKCh": 290, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/yUk2RhO.png", "Source": "ISCS", "ServiceId": "1327", "Enabled": 0 }, +{ "Id": 118, "Name": "K-바둑", "KT Name": "K-바둑", "KTCh": 121, "LG Name": "K-바둑", "LGCh": 107, "SK Name": "K-바둑", "SKCh": 241, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/EAk5ySy.png", "Source": "HCN", "ServiceId": "162", "Enabled": 0 }, +{ "Id": 119, "Name": "K쇼핑", "KT Name": "K쇼핑", "KTCh": 20, "LG Name": "", "LGCh": null, "SK Name": "K쇼핑", "SKCh": 25, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/6ORm0Rz.png", "Source": "SK", "ServiceId": "333", "Enabled": 0 }, +{ "Id": 121, "Name": "Mnet", "KT Name": "Mnet", "KTCh": 27, "LG Name": "엠넷", "LGCh": 22, "SK Name": "M.net", "SKCh": 27, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/putHm2b.png", "Source": "SKY", "ServiceId": "273", "Enabled": 0 }, +{ "Id": 122, "Name": "MBC", "KT Name": "MBC", "KTCh": 11, "LG Name": "MBC", "LGCh": 11, "SK Name": "MBC", "SKCh": 11, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/duig32i.png", "Source": "SKY", "ServiceId": "797", "Enabled": 0 }, +{ "Id": 123, "Name": "MBC Every1", "KT Name": "MBC Every1", "KTCh": 3, "LG Name": "MBC에브리원", "LGCh": 29, "SK Name": "MBC Every1", "SKCh": 28, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/oOnpFes.png", "Source": "POOQ", "ServiceId": "M03", "Enabled": 0 }, +{ "Id": 124, "Name": "MBC MUSIC", "KT Name": "MBC MUSIC", "KTCh": 97, "LG Name": "MBC뮤직", "LGCh": 99, "SK Name": "MBC Music", "SKCh": 231, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/6g56RDx.png", "Source": "POOQ", "ServiceId": "M06", "Enabled": 0 }, +{ "Id": 125, "Name": "MBC NET", "KT Name": "MBC NET", "KTCh": 164, "LG Name": "MBCNET", "LGCh": 140, "SK Name": "MBC NET", "SKCh": 274, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/lxDOgY8.png", "Source": "SKY", "ServiceId": "537", "Enabled": 0 }, +{ "Id": 126, "Name": "MBC SPORTS+", "KT Name": "MBC SPORT+", "KTCh": 60, "LG Name": "MBC스포츠+", "LGCh": 60, "SK Name": "MBC Sports+", "SKCh": 123, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/Su21uj3.png", "Source": "SKY", "ServiceId": "911", "Enabled": 0 }, +{ "Id": 127, "Name": "MBC SPORTS+2", "KT Name": "MBC SPORTS+2", "KTCh": 61, "LG Name": "MBC스포츠+2", "LGCh": 61, "SK Name": "MBC SPORTS+2", "SKCh": 124, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/frAuUS3.png", "Source": "SKY", "ServiceId": "96", "Enabled": 0 }, +{ "Id": 128, "Name": "MBC Dramanet", "KT Name": "MBC Dramanet", "KTCh": 75, "LG Name": "MBC드라마넷", "LGCh": 35, "SK Name": "MBC 드라마", "SKCh": 32, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/VBMFcZ3.png", "Source": "POOQ", "ServiceId": "M02", "Enabled": 0 }, +{ "Id": 129, "Name": "MBN", "KT Name": "MBN", "KTCh": 16, "LG Name": "MBN", "LGCh": 16, "SK Name": "MBN", "SKCh": 16, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/p0mvIJN.png", "Source": "POOQ", "ServiceId": "C2401", "Enabled": 0 }, +{ "Id": 130, "Name": "MBN Plus", "KT Name": "MBN Plus", "KTCh": 99, "LG Name": "MBN+", "LGCh": 116, "SK Name": "MBN 플러스", "SKCh": 98, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/yMZiUUp.png", "Source": "NAVER", "ServiceId": "5286722", "Enabled": 0 }, +{ "Id": 133, "Name": "마운틴TV", "KT Name": "마운틴TV", "KTCh": 117, "LG Name": "마운틴TV", "LGCh": 69, "SK Name": "Mountain TV", "SKCh": 247, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/4nLYnVC.png", "Source": "ISCS", "ServiceId": "713", "Enabled": 0 }, +{ "Id": 134, "Name": "mplex", "KT Name": "mplex", "KTCh": 103, "LG Name": "엠플렉스", "LGCh": 46, "SK Name": "Mplex", "SKCh": 57, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/dOOBYJm.png", "Source": "ISCS", "ServiceId": "1487", "Enabled": 0 }, +{ "Id": 135, "Name": "머니투데이방송", "KT Name": "머니투데이방송", "KTCh": 181, "LG Name": "MTN", "LGCh": 122, "SK Name": "MTN", "SKCh": 152, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/joWd14j.png", "Source": "EPG", "ServiceId": "132", "Enabled": 0 }, +{ "Id": 136, "Name": "NatGeo People", "KT Name": "NatGeo People", "KTCh": 171, "LG Name": "", "LGCh": null, "SK Name": "Natgeo People", "SKCh": 263, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/2ghKPUg.png", "Source": "NAVER", "ServiceId": "814946", "Enabled": 0 }, +{ "Id": 137, "Name": "NatGeo Wild", "KT Name": "NatGeo Wild", "KTCh": 170, "LG Name": "냇지오 와일드", "LGCh": 134, "SK Name": "Natgeo Wild HD", "SKCh": 266, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/M4nh0Rk.png", "Source": "SKY", "ServiceId": "166", "Enabled": 0 }, +{ "Id": 138, "Name": "NGC", "KT Name": "NGC", "KTCh": 168, "LG Name": "내셔널지오그래픽", "LGCh": 131, "SK Name": "NGC", "SKCh": 260, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/mqTSPMN.png", "Source": "SKY", "ServiceId": "972", "Enabled": 0 }, +{ "Id": 139, "Name": "NHK WP", "KT Name": "NHK WP", "KTCh": 199, "LG Name": "NHK World Premium", "LGCh": 143, "SK Name": "NHK World Premium", "SKCh": 278, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/ZSHeMzp.png", "Source": "NAVER", "ServiceId": "815432", "Enabled": 0 }, +{ "Id": 141, "Name": "니켈로디언", "KT Name": "니켈로디언", "KTCh": 136, "LG Name": "니켈로디언", "LGCh": 154, "SK Name": "Nickelodeon", "SKCh": 176, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/6pWpFCX.png", "Source": "SKY", "ServiceId": "685", "Enabled": 0 }, +{ "Id": 142, "Name": "놀티비", "KT Name": "놀티비", "KTCh": 128, "LG Name": "놀TV", "LGCh": 92, "SK Name": "Noll TV", "SKCh": 248, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/IK9h4rw.png", "Source": "HCN", "ServiceId": "923", "Enabled": 0 }, +{ "Id": 143, "Name": "NS Shop+", "KT Name": "NS Shop+", "KTCh": 42, "LG Name": "", "LGCh": null, "SK Name": "NS Shop+", "SKCh": 41, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/ipGXgEK.png", "Source": "SK", "ServiceId": "341", "Enabled": 0 }, +{ "Id": 144, "Name": "NS홈쇼핑", "KT Name": "NS홈쇼핑", "KTCh": 12, "LG Name": "NS홈쇼핑", "LGCh": 13, "SK Name": "NS홈쇼핑", "SKCh": 14, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/UD1yoj1.png", "Source": "ISCS", "ServiceId": "12", "Enabled": 0 }, +{ "Id": 147, "Name": "O tvN", "KT Name": "O tvn", "KTCh": 45, "LG Name": "O tvN", "LGCh": 71, "SK Name": "O tvN", "SKCh": 34, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/0SMl3O5.png", "Source": "SKY", "ServiceId": "555", "Enabled": 0 }, +{ "Id": 148, "Name": "올리브", "KT Name": "올리브", "KTCh": 34, "LG Name": "올리브", "LGCh": 82, "SK Name": "올리브", "SKCh": 84, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/5kF0Ypt.png", "Source": "EPG", "ServiceId": "15", "Enabled": 0 }, +{ "Id": 149, "Name": "OBS", "KT Name": "OBS", "KTCh": 26, "LG Name": "OBS", "LGCh": 26, "SK Name": "OBS", "SKCh": 20, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/DJHN8M6.png", "Source": "SKY", "ServiceId": "935", "Enabled": 0 }, +{ "Id": 150, "Name": "HD OBS W", "KT Name": "HD OBS W", "KTCh": 81, "LG Name": "OBS W", "LGCh": 137, "SK Name": "OBSW", "SKCh": 219, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/uZkbU7b.png", "Source": "LG", "ServiceId": "648", "Enabled": 0 }, +{ "Id": 151, "Name": "OCN", "KT Name": "OCN", "KTCh": 21, "LG Name": "OCN", "LGCh": 38, "SK Name": "OCN", "SKCh": 54, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/IXh6dwo.png", "Source": "SKY", "ServiceId": "847", "Enabled": 0 }, +{ "Id": 153, "Name": "OGN", "KT Name": "OGN", "KTCh": 123, "LG Name": "OGN", "LGCh": 96, "SK Name": "OGN", "SKCh": 136, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/tLtSTaq.png", "Source": "SKY", "ServiceId": "55", "Enabled": 0 }, +{ "Id": 154, "Name": "온스타일", "KT Name": "온스타일", "KTCh": 77, "LG Name": "온스타일", "LGCh": 73, "SK Name": "On style", "SKCh": 210, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/9brMDfR.png", "Source": "HCN", "ServiceId": "414", "Enabled": 0 }, +{ "Id": 156, "Name": "ONT", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "ONT", "SKCh": 245, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/2lu0ZBu.png", "Source": "SK", "ServiceId": "256", "Enabled": 0 }, +{ "Id": 157, "Name": "OUN", "KT Name": "OUN", "KTCh": 160, "LG Name": "OUN", "LGCh": 170, "SK Name": "OUN", "SKCh": 292, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/VimbcIH.png", "Source": "EPG", "ServiceId": "47", "Enabled": 0 }, +{ "Id": 158, "Name": "Outdoor", "KT Name": "", "KTCh": null, "LG Name": "아웃도어 채널", "LGCh": 135, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/4M65Rrv.png", "Source": "LG", "ServiceId": "710", "Enabled": 0 }, +{ "Id": 159, "Name": "Playboy TV", "KT Name": "Playboy TV", "KTCh": 206, "LG Name": "플레이보이", "LGCh": 190, "SK Name": "플레이보이TV", "SKCh": 320, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/NglRqcV.png", "Source": "EPG", "ServiceId": "146", "Enabled": 0 }, +{ "Id": 160, "Name": "리얼TV", "KT Name": "리얼TV", "KTCh": 127, "LG Name": "", "LGCh": null, "SK Name": "리얼TV", "SKCh": 267, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/PYnXtlb.png", "Source": "SK", "ServiceId": "440", "Enabled": 0 }, +{ "Id": 164, "Name": "SBS", "KT Name": "SBS", "KTCh": 5, "LG Name": "SBS", "LGCh": 5, "SK Name": "SBS", "SKCh": 5, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/K2ztoDT.png", "Source": "SKY", "ServiceId": "794", "Enabled": 0 }, +{ "Id": 165, "Name": "SBS CNBC", "KT Name": "SBS CNBC", "KTCh": 25, "LG Name": "SBS CNBC", "LGCh": 27, "SK Name": "SBS CNBC", "SKCh": 26, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/SfDs4qN.png", "Source": "POOQ", "ServiceId": "S06", "Enabled": 0 }, +{ "Id": 166, "Name": "SBS funE", "KT Name": "SBS funE", "KTCh": 43, "LG Name": "SBS퍼니", "LGCh": 75, "SK Name": "SBS fun E", "SKCh": 81, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/D1EYJmr.png", "Source": "POOQ", "ServiceId": "S04", "Enabled": 0 }, +{ "Id": 167, "Name": "SBSGOLF", "KT Name": "SBSGOLF", "KTCh": 57, "LG Name": "SBS골프", "LGCh": 53, "SK Name": "SBS GOLF", "SKCh": 131, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/HdS0GNV.png", "Source": "SKY", "ServiceId": "769", "Enabled": 0 }, +{ "Id": 168, "Name": "SBS MTV", "KT Name": "SBS MTV", "KTCh": 96, "LG Name": "SBS MTV", "LGCh": 100, "SK Name": "SBS MTV", "SKCh": 230, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/OeSJ9Ik.png", "Source": "POOQ", "ServiceId": "S03", "Enabled": 0 }, +{ "Id": 169, "Name": "SBS Sports", "KT Name": "SBS Sports", "KTCh": 58, "LG Name": "SBS스포츠", "LGCh": 58, "SK Name": "SBS Sports", "SKCh": 122, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/j1vHAu6.png", "Source": "POOQ", "ServiceId": "S02", "Enabled": 0 }, +{ "Id": 170, "Name": "SBS Plus", "KT Name": "SBS Plus", "KTCh": 37, "LG Name": "SBS플러스", "LGCh": 33, "SK Name": "SBS 플러스", "SKCh": 2, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/asfyrTm.png", "Source": "POOQ", "ServiceId": "S03", "Enabled": 0 }, +{ "Id": 171, "Name": "스크린", "KT Name": "스크린", "KTCh": 106, "LG Name": "스크린", "LGCh": 41, "SK Name": "Screen", "SKCh": 56, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/lTK9VD4.png", "Source": "SKB", "ServiceId": "192", "Enabled": 0 }, +{ "Id": 172, "Name": "SkyA&C", "KT Name": "SkyA&C", "KTCh": 80, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/cljag6U.png", "Source": "SKY", "ServiceId": "514", "Enabled": 0 }, +{ "Id": 173, "Name": "SkyDrama", "KT Name": "SkyDrama", "KTCh": 31, "LG Name": "스카이드라마", "LGCh": 79, "SK Name": "sky Drama", "SKCh": 40, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/e9BTUAb.png", "Source": "SKY", "ServiceId": "783", "Enabled": 0 }, +{ "Id": 174, "Name": "SkyENT", "KT Name": "SkyENT", "KTCh": 50, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/ALqDHH6.png", "Source": "SKY", "ServiceId": "970", "Enabled": 0 }, +{ "Id": 175, "Name": "Sky힐링", "KT Name": "Sky힐링", "KTCh": 167, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/64SK0o9.png", "Source": "SKY", "ServiceId": "40", "Enabled": 0 }, +{ "Id": 176, "Name": "SkyICT", "KT Name": "SkyICT", "KTCh": 165, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/luZjU1e.png", "Source": "SKY", "ServiceId": "568", "Enabled": 0 }, +{ "Id": 177, "Name": "SkyPetPark", "KT Name": "SkyPetPark", "KTCh": 49, "LG Name": "", "LGCh": null, "SK Name": "Sky Petpark", "SKCh": 94, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/RDUfvRG.png", "Source": "SKY", "ServiceId": "513", "Enabled": 0 }, +{ "Id": 178, "Name": "SkySports", "KT Name": "SkySports", "KTCh": 54, "LG Name": "스카이스포츠", "LGCh": 57, "SK Name": "sky Sports", "SKCh": 125, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/QHV9bdA.png", "Source": "SKY", "ServiceId": "447", "Enabled": 0 }, +{ "Id": 179, "Name": "SkyTravel", "KT Name": "SkyTravel", "KTCh": 100, "LG Name": "스카이트래블", "LGCh": 66, "SK Name": "sky Travel", "SKCh": 246, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/fAJgmna.png", "Source": "SKY", "ServiceId": "934", "Enabled": 0 }, +{ "Id": 181, "Name": "Sky UHD", "KT Name": "Sky UHD", "KTCh": 174, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/BNxE2zT.png", "Source": "SKY", "ServiceId": "500", "Enabled": 0 }, +{ "Id": 182, "Name": "Smile TV", "KT Name": "Smile TV", "KTCh": 84, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/alk8plD.png", "Source": "KT", "ServiceId": "84", "Enabled": 0 }, +{ "Id": 183, "Name": "SPOTV", "KT Name": "SPOTV", "KTCh": 51, "LG Name": "스포티비", "LGCh": 56, "SK Name": "SPOTV", "SKCh": 120, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/cIpIf6b.png", "Source": "SKY", "ServiceId": "109", "Enabled": 0 }, +{ "Id": 184, "Name": "SPOTV Games", "KT Name": "SPOTV Games", "KTCh": 124, "LG Name": "스포티비 게임즈", "LGCh": 109, "SK Name": "SPOTV GAMES", "SKCh": 137, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/5IMfa6N.png", "Source": "NAVER", "ServiceId": "1876333", "Enabled": 0 }, +{ "Id": 185, "Name": "SPOTV+", "KT Name": "SPOTV+", "KTCh": 125, "LG Name": "스포티비+", "LGCh": 51, "SK Name": "SPOTV+", "SKCh": 127, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/81Fshnn.png", "Source": "SKY", "ServiceId": "713", "Enabled": 0 }, +{ "Id": 186, "Name": "SPOTV2", "KT Name": "SPOTV2", "KTCh": 52, "LG Name": "스포티비2", "LGCh": 52, "SK Name": "SPOTV2", "SKCh": 128, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/GNicmGY.png", "Source": "NAVER", "ServiceId": "5286701", "Enabled": 0 }, +{ "Id": 192, "Name": "Star Sports", "KT Name": "Star Sports", "KTCh": 63, "LG Name": "", "LGCh": null, "SK Name": "Star Sports", "SKCh": 135, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/8ndGr4n.png", "Source": "EPG", "ServiceId": "122", "Enabled": 0 }, +{ "Id": 193, "Name": "STB상생방송", "KT Name": "STB상생방송", "KTCh": 261, "LG Name": "상생방송", "LGCh": 187, "SK Name": "STB 상생방송", "SKCh": 308, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/Z3Xknso.png", "Source": "HCN", "ServiceId": "779", "Enabled": 0 }, +{ "Id": 194, "Name": "STN", "KT Name": "STN", "KTCh": 267, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/ZJi3NQy.png", "Source": "KT", "ServiceId": "267", "Enabled": 0 }, +{ "Id": 196, "Name": "슈퍼액션", "KT Name": "슈퍼액션", "KTCh": 32, "LG Name": "수퍼액션", "LGCh": 40, "SK Name": "SUPER ACTION", "SKCh": 55, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/D9PzDBr.png", "Source": "SKY", "ServiceId": "129", "Enabled": 0 }, +{ "Id": 197, "Name": "tag TV", "KT Name": "tag TV", "KTCh": 94, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/Mmc89FS.png", "Source": "KT", "ServiceId": "94", "Enabled": 0 }, +{ "Id": 198, "Name": "tbsTV", "KT Name": "tbsTV", "KTCh": 214, "LG Name": "tbsTV", "LGCh": 176, "SK Name": "tbsTV", "SKCh": 272, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/o3MWHfb.png", "Source": "SK", "ServiceId": "420", "Enabled": 0 }, +{ "Id": 199, "Name": "텔레노벨라", "KT Name": "텔레노벨라", "KTCh": 114, "LG Name": "텔레노벨라", "LGCh": 81, "SK Name": "텔레노벨라", "SKCh": 109, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/Ea3Vu8Z.png", "Source": "LG", "ServiceId": "700", "Enabled": 0 }, +{ "Id": 200, "Name": "The Golf Channel", "KT Name": "The Golf Channel", "KTCh": 55, "LG Name": "더 골프채널 코리아", "LGCh": 55, "SK Name": "Golf Channel Korea", "SKCh": 133, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/3VlCrJ7.png", "Source": "SK", "ServiceId": "135", "Enabled": 0 }, +{ "Id": 201, "Name": "THE MOVIE", "KT Name": "THE MOVIE", "KTCh": 104, "LG Name": "더 무비", "LGCh": 47, "SK Name": "The Movie", "SKCh": 59, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/6vzmEfd.png", "Source": "HCN", "ServiceId": "165", "Enabled": 0 }, +{ "Id": 202, "Name": "Tooniverse", "KT Name": "Tooniverse", "KTCh": 132, "LG Name": "투니버스", "LGCh": 152, "SK Name": "Tooniverse", "SKCh": 170, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/VUqSOjx.png", "Source": "SKY", "ServiceId": "526", "Enabled": 0 }, +{ "Id": 203, "Name": "TRENDY", "KT Name": "TRENDY", "KTCh": 251, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/NP2KTGN.png", "Source": "KT", "ServiceId": "251", "Enabled": 0 }, +{ "Id": 205, "Name": "TV5MONDE", "KT Name": "TV5MONDE", "KTCh": 198, "LG Name": "", "LGCh": null, "SK Name": "TV5Monde", "SKCh": 279, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/NogUKpP.png", "Source": "HCN", "ServiceId": "612", "Enabled": 0 }, +{ "Id": 207, "Name": "tvN", "KT Name": "tvN", "KTCh": 17, "LG Name": "tvN", "LGCh": 17, "SK Name": "tvN", "SKCh": 17, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/OJ9A8fZ.png", "Source": "SKY", "ServiceId": "60", "Enabled": 0 }, +{ "Id": 208, "Name": "TV조선", "KT Name": "TV조선", "KTCh": 19, "LG Name": "TV조선", "LGCh": 19, "SK Name": "TV조선", "SKCh": 19, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/ShJ5joR.png", "Source": "POOQ", "ServiceId": "C2601", "Enabled": 0 }, +{ "Id": 212, "Name": "viki", "KT Name": "viki", "KTCh": 204, "LG Name": "비키", "LGCh": 192, "SK Name": "Viki", "SKCh": 322, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/ZVD51K9.png", "Source": "EPG", "ServiceId": "86", "Enabled": 0 }, +{ "Id": 213, "Name": "W 쇼핑", "KT Name": "W 쇼핑", "KTCh": 40, "LG Name": "", "LGCh": null, "SK Name": "W쇼핑", "SKCh": 37, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/Cged9ve.png", "Source": "SK", "ServiceId": "342", "Enabled": 0 }, +{ "Id": 215, "Name": "WBS원음방송", "KT Name": "원음방송", "KTCh": 284, "LG Name": "원음방송", "LGCh": 188, "SK Name": "원음방송", "SKCh": 309, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/mKWQE7z.png", "Source": "EPG", "ServiceId": "644", "Enabled": 0 }, +{ "Id": 216, "Name": "XTM", "KT Name": "XTM", "KTCh": 76, "LG Name": "XTM", "LGCh": 72, "SK Name": "XTM", "SKCh": 85, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/hGwA39y.png", "Source": "EPG", "ServiceId": "388", "Enabled": 0 }, +{ "Id": 218, "Name": "YTN", "KT Name": "YTN", "KTCh": 24, "LG Name": "YTN", "LGCh": 24, "SK Name": "YTN", "SKCh": 24, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/ByeeX5e.png", "Source": "POOQ", "ServiceId": "C2101", "Enabled": 0 }, +{ "Id": 219, "Name": "YTN 사이언스", "KT Name": "YTN 사이언스", "KTCh": 175, "LG Name": "사이언스TV", "LGCh": 25, "SK Name": "YTN 사이언스", "SKCh": 262, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/gwDHYGf.png", "Source": "SKB", "ServiceId": "422", "Enabled": 0 }, +{ "Id": 220, "Name": "YTN life", "KT Name": "YTN life", "KTCh": 190, "LG Name": "YTN 라이프", "LGCh": 125, "SK Name": "YTN 라이프", "SKCh": 157, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/f66yRT9.png", "Source": "SK", "ServiceId": "632", "Enabled": 0 }, +{ "Id": 221, "Name": "가요TV", "KT Name": "가요TV", "KTCh": 93, "LG Name": "가요TV", "LGCh": 102, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/6ncOOSg.png", "Source": "ISCS", "ServiceId": "356", "Enabled": 0 }, +{ "Id": 222, "Name": "국방TV", "KT Name": "국방TV", "KTCh": 260, "LG Name": "국방TV", "LGCh": 174, "SK Name": "국방TV", "SKCh": 282, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/yyXkYzJ.png", "Source": "ISCS", "ServiceId": "114", "Enabled": 0 }, +{ "Id": 223, "Name": "국회방송", "KT Name": "국회방송", "KTCh": 65, "LG Name": "국회방송", "LGCh": 172, "SK Name": "국회방송", "SKCh": 291, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/l1OEn7O.png", "Source": "LG", "ServiceId": "717", "Enabled": 0 }, +{ "Id": 225, "Name": "내외경제TV", "KT Name": "내외경제TV", "KTCh": 285, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/cQHPmCw.png", "Source": "KT", "ServiceId": "285", "Enabled": 0 }, +{ "Id": 226, "Name": "다문화티브이", "KT Name": "다문화티브이", "KTCh": 283, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/nZK3lCC.png", "Source": "KT", "ServiceId": "283", "Enabled": 0 }, +{ "Id": 228, "Name": "대교 어린이TV", "KT Name": "대교 어린이TV", "KTCh": 141, "LG Name": "어린이TV", "LGCh": 156, "SK Name": "어린이TV", "SKCh": 191, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/CETWIE6.png", "Source": "SKY", "ServiceId": "17", "Enabled": 0 }, +{ "Id": 229, "Name": "동아TV", "KT Name": "동아TV", "KTCh": 82, "LG Name": "동아TV", "LGCh": 84, "SK Name": "동아TV", "SKCh": 218, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/AlmV8jS.png", "Source": "HCN", "ServiceId": "247", "Enabled": 0 }, +{ "Id": 230, "Name": "드라마H", "KT Name": "드라마H", "KTCh": 70, "LG Name": "", "LGCh": null, "SK Name": "드라마H", "SKCh": 46, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/xT7pVuI.png", "Source": "SKY", "ServiceId": "287", "Enabled": 0 }, +{ "Id": 231, "Name": "드라마큐브", "KT Name": "드라마큐브", "KTCh": 46, "LG Name": "", "LGCh": null, "SK Name": "드라마큐브", "SKCh": 36, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/4ESaIH6.png", "Source": "HCN", "ServiceId": "499", "Enabled": 0 }, +{ "Id": 232, "Name": "드라맥스", "KT Name": "드라맥스", "KTCh": 47, "LG Name": "", "LGCh": null, "SK Name": "드라맥스", "SKCh": 38, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/jcguamX.png", "Source": "NAVER", "ServiceId": "814782", "Enabled": 0 }, +{ "Id": 233, "Name": "디원", "KT Name": "디원", "KTCh": 115, "LG Name": "디원", "LGCh": 90, "SK Name": "디원", "SKCh": 45, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/8nE7mmk.png", "Source": "LG", "ServiceId": "666", "Enabled": 0 }, +{ "Id": 234, "Name": "디즈니주니어", "KT Name": "디즈니주니어", "KTCh": 151, "LG Name": "디즈니 주니어", "LGCh": 151, "SK Name": "디즈니주니어", "SKCh": 172, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/EGiEKhj.png", "Source": "SKY", "ServiceId": "504", "Enabled": 0 }, +{ "Id": 235, "Name": "Disney Channel", "KT Name": "Disney Channel", "KTCh": 130, "LG Name": "디즈니 채널", "LGCh": 150, "SK Name": "디즈니채널", "SKCh": 171, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/qZdqeZo.png", "Source": "SKY", "ServiceId": "503", "Enabled": 0 }, +{ "Id": 237, "Name": "롯데원티비", "KT Name": "롯데원티비", "KTCh": 44, "LG Name": "롯데 OneTV", "LGCh": 21, "SK Name": "롯데OneTV", "SKCh": 39, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/vri0qlq.png", "Source": "EPG", "ServiceId": "548", "Enabled": 0 }, +{ "Id": 238, "Name": "롯데홈쇼핑", "KT Name": "롯데홈쇼핑", "KTCh": 6, "LG Name": "롯데홈쇼핑", "LGCh": 12, "SK Name": "롯데홈쇼핑", "SKCh": 10, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/2bCfj0y.png", "Source": "ISCS", "ServiceId": "3", "Enabled": 0 }, +{ "Id": 239, "Name": "리빙TV", "KT Name": "리빙TV", "KTCh": 276, "LG Name": "", "LGCh": null, "SK Name": "리빙TV", "SKCh": 251, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/0jGCpfx.png", "Source": "EPG", "ServiceId": "28", "Enabled": 0 }, +{ "Id": 240, "Name": "마이펫TV", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "마이펫TV", "SKCh": 92, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/Oy7qjnW.png", "Source": "SK", "ServiceId": "258", "Enabled": 0 }, +{ "Id": 241, "Name": "매일경제TV", "KT Name": "매일경제TV", "KTCh": 182, "LG Name": "매일경제TV", "LGCh": 112, "SK Name": "매일경제TV", "SKCh": 153, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/a4PwnPm.png", "Source": "EPG", "ServiceId": "594", "Enabled": 0 }, +{ "Id": 244, "Name": "미드나잇", "KT Name": "미드나잇", "KTCh": 205, "LG Name": "미드나잇", "LGCh": 191, "SK Name": "미드나잇", "SKCh": 321, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/zLJHU3J.png", "Source": "EPG", "ServiceId": "169", "Enabled": 0 }, +{ "Id": 245, "Name": "바둑TV", "KT Name": "바둑TV", "KTCh": 120, "LG Name": "바둑TV", "LGCh": 97, "SK Name": "바둑TV", "SKCh": 240, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/jbRu8T2.png", "Source": "EPG", "ServiceId": "46", "Enabled": 0 }, +{ "Id": 246, "Name": "법률방송", "KT Name": "법률방송", "KTCh": 213, "LG Name": "", "LGCh": null, "SK Name": "법률방송", "SKCh": 280, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/WJaHOAP.png", "Source": "ISCS", "ServiceId": "149", "Enabled": 0 }, +{ "Id": 247, "Name": "복지TV", "KT Name": "복지TV", "KTCh": 219, "LG Name": "복지TV", "LGCh": 173, "SK Name": "복지TV", "SKCh": 293, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/cTV0rnb.png", "Source": "ISCS", "ServiceId": "344", "Enabled": 0 }, +{ "Id": 249, "Name": "부동산토마토", "KT Name": "부동산토마토", "KTCh": 188, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/ePLp200.png", "Source": "KT", "ServiceId": "188", "Enabled": 0 }, +{ "Id": 250, "Name": "부메랑", "KT Name": "부메랑", "KTCh": 139, "LG Name": "부메랑", "LGCh": 166, "SK Name": "부메랑", "SKCh": 175, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/GSPRJqf.png", "Source": "NAVER", "ServiceId": "815072", "Enabled": 0 }, +{ "Id": 251, "Name": "브레인TV", "KT Name": "브레인TV", "KTCh": 122, "LG Name": "브레인TV", "LGCh": 98, "SK Name": "브레인TV", "SKCh": 242, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/1422kP1.png", "Source": "EPG", "ServiceId": "488", "Enabled": 0 }, +{ "Id": 253, "Name": "사회안전방송", "KT Name": "사회안전방송", "KTCh": 278, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/EEfrqCW.png", "Source": "NAVER", "ServiceId": "815484", "Enabled": 0 }, +{ "Id": 254, "Name": "생활체육TV", "KT Name": "생활체육TV", "KTCh": 282, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/gefY5Bw.png", "Source": "NAVER", "ServiceId": "814883", "Enabled": 0 }, +{ "Id": 255, "Name": "서울경제TV", "KT Name": "서울경제TV", "KTCh": 184, "LG Name": "서울경제TV", "LGCh": 124, "SK Name": "서울경제TV", "SKCh": 156, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/LBzj77k.png", "Source": "ISCS", "ServiceId": "24", "Enabled": 0 }, +{ "Id": 256, "Name": "소비자TV", "KT Name": "소비자TV", "KTCh": 265, "LG Name": "소비자TV", "LGCh": 177, "SK Name": "소비자TV", "SKCh": 275, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/971hUD2.png", "Source": "SKB", "ServiceId": "442", "Enabled": 0 }, +{ "Id": 257, "Name": "소상공인방송", "KT Name": "소상공인방송", "KTCh": 255, "LG Name": "소상공인방송", "LGCh": 175, "SK Name": "소상공인방송", "SKCh": 271, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/3k1D4LA.png", "Source": "ISCS", "ServiceId": "1395", "Enabled": 0 }, +{ "Id": 258, "Name": "쇼핑엔T", "KT Name": "쇼핑엔티", "KTCh": 33, "LG Name": "쇼핑엔티", "LGCh": 76, "SK Name": "쇼핑엔티", "SKCh": 35, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/Q7FHxYB.png", "Source": "SK", "ServiceId": "336", "Enabled": 0 }, +{ "Id": 260, "Name": "신세계쇼핑", "KT Name": "신세계쇼핑", "KTCh": 2, "LG Name": "신세계쇼핑", "LGCh": 74, "SK Name": "신세계쇼핑", "SKCh": 22, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/ZhYaqpt.png", "Source": "SK", "ServiceId": "339", "Enabled": 0 }, +{ "Id": 262, "Name": "실버아이TV", "KT Name": "실버아이TV", "KTCh": 266, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/xm1O8eQ.png", "Source": "ISCS", "ServiceId": "357", "Enabled": 0 }, +{ "Id": 263, "Name": "아리랑 TV", "KT Name": "아리랑 TV", "KTCh": 200, "LG Name": "아리랑TV", "LGCh": 141, "SK Name": "아리랑TV", "SKCh": 270, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/nFWWIFP.png", "Source": "ISCS", "ServiceId": "17", "Enabled": 0 }, +{ "Id": 264, "Name": "아시아경제TV", "KT Name": "아시아경제TV", "KTCh": 186, "LG Name": "아시아경제TV", "LGCh": 113, "SK Name": "아시아경제TV", "SKCh": 154, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/2D6WoS8.png", "Source": "ISCS", "ServiceId": "1348", "Enabled": 0 }, +{ "Id": 265, "Name": "아임쇼핑", "KT Name": "아임쇼핑", "KTCh": 22, "LG Name": "아임쇼핑", "LGCh": 20, "SK Name": "아임쇼핑", "SKCh": 3, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/E3pJ5Jz.png", "Source": "SK", "ServiceId": "332", "Enabled": 0 }, +{ "Id": 266, "Name": "애니플러스", "KT Name": "애니플러스", "KTCh": 138, "LG Name": "애니플러스", "LGCh": 149, "SK Name": "애니플러스", "SKCh": 178, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/7RKoOZq.png", "Source": "SKY", "ServiceId": "348", "Enabled": 0 }, +{ "Id": 268, "Name": "연합뉴스TV", "KT Name": "연합뉴스TV", "KTCh": 23, "LG Name": "연합뉴스TV", "LGCh": 23, "SK Name": "연합뉴스TV", "SKCh": 23, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/KlTCP8V.png", "Source": "POOQ", "ServiceId": "Y01", "Enabled": 0 }, +{ "Id": 271, "Name": "육아방송", "KT Name": "육아방송", "KTCh": 217, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/UEIB4ZG.png", "Source": "EPG", "ServiceId": "252", "Enabled": 0 }, +{ "Id": 272, "Name": "이데일리TV", "KT Name": "이데일리TV", "KTCh": 183, "LG Name": "이데일리TV", "LGCh": 123, "SK Name": "이데일리TV", "SKCh": 155, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/W90Hw2p.png", "Source": "LG", "ServiceId": "631", "Enabled": 0 }, +{ "Id": 273, "Name": "이벤트TV", "KT Name": "이벤트TV", "KTCh": 263, "LG Name": "이벤트TV", "LGCh": 103, "SK Name": "이벤트TV", "SKCh": 238, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/1Eeyijd.png", "Source": "SKB", "ServiceId": "262", "Enabled": 0 }, +{ "Id": 275, "Name": "인디필름", "KT Name": "인디필름", "KTCh": 277, "LG Name": "", "LGCh": null, "SK Name": "인디필름", "SKCh": 61, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/iA5UIJ9.png", "Source": "SKB", "ServiceId": "441", "Enabled": 0 }, +{ "Id": 277, "Name": "정철영어 TV", "KT Name": "정철영어 TV", "KTCh": 155, "LG Name": "정철영어TV", "LGCh": 161, "SK Name": "정철영어TV", "SKCh": 201, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/lumUZz3.png", "Source": "LG", "ServiceId": "772", "Enabled": 0 }, +{ "Id": 278, "Name": "중화TV", "KT Name": "중화TV", "KTCh": 110, "LG Name": "중화TV", "LGCh": 87, "SK Name": "중화TV", "SKCh": 104, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/Nal18s5.png", "Source": "SKB", "ServiceId": "186", "Enabled": 0 }, +{ "Id": 279, "Name": "JJC지방자치TV", "KT Name": "JJC지방자치TV", "KTCh": 279, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/AuXr9jA.png", "Source": "NAVER", "ServiceId": "3244879", "Enabled": 0 }, +{ "Id": 280, "Name": "채널 Ching", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "채널 Ching", "SKCh": 105, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/tRqGKcS.png", "Source": "HCN", "ServiceId": "780", "Enabled": 0 }, +{ "Id": 281, "Name": "채널A", "KT Name": "채널A", "KTCh": 18, "LG Name": "채널A", "LGCh": 18, "SK Name": "채널A", "SKCh": 18, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/xti35f5.png", "Source": "POOQ", "ServiceId": "C2501", "Enabled": 0 }, +{ "Id": 282, "Name": "채널A 플러스", "KT Name": "채널A 플러스", "KTCh": 98, "LG Name": "채널A+", "LGCh": 115, "SK Name": "채널A 플러스", "SKCh": 97, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/rRisTh8.png", "Source": "SKB", "ServiceId": "891", "Enabled": 0 }, +{ "Id": 283, "Name": "채널CGV", "KT Name": "채널CGV", "KTCh": 29, "LG Name": "채널CGV", "LGCh": 39, "SK Name": "Ch CGV", "SKCh": 53, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/fwjRwkx.png", "Source": "SKY", "ServiceId": "163", "Enabled": 0 }, +{ "Id": 284, "Name": "채널i", "KT Name": "채널i", "KTCh": 250, "LG Name": "", "LGCh": null, "SK Name": "채널i", "SKCh": 281, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/X7lXvtw.png", "Source": "ISCS", "ServiceId": "1397", "Enabled": 0 }, +{ "Id": 285, "Name": "채널뷰", "KT Name": "채널뷰", "KTCh": 176, "LG Name": "", "LGCh": null, "SK Name": "채널View", "SKCh": 212, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/lvtWgFL.png", "Source": "SKY", "ServiceId": "918", "Enabled": 0 }, +{ "Id": 286, "Name": "채널차이나", "KT Name": "채널차이나", "KTCh": 102, "LG Name": "채널차이나", "LGCh": 80, "SK Name": "채널차이나", "SKCh": 108, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/jEyoLS1.png", "Source": "ISCS", "ServiceId": "1066", "Enabled": 0 }, +{ "Id": 287, "Name": "채널해피독", "KT Name": "채널해피독", "KTCh": 203, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/ly649tS.png", "Source": "NAVER", "ServiceId": "2296260", "Enabled": 0 }, +{ "Id": 289, "Name": "카툰네트워크", "KT Name": "카툰네트워크", "KTCh": 137, "LG Name": "카툰네트워크", "LGCh": 155, "SK Name": "카툰네트워크", "SKCh": 177, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/cJZHPjr.png", "Source": "SKY", "ServiceId": "358", "Enabled": 0 }, +{ "Id": 290, "Name": "캐치온1", "KT Name": "캐치온1", "KTCh": 66, "LG Name": "캐치온1", "LGCh": 48, "SK Name": "CATCH ON 1", "SKCh": 51, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/qK9KkRd.png", "Source": "EPG", "ServiceId": "31", "Enabled": 0 }, +{ "Id": 291, "Name": "캐치온2", "KT Name": "캐치온2", "KTCh": 67, "LG Name": "캐치온2", "LGCh": 49, "SK Name": "CATCH ON 2", "SKCh": 52, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/sLc2req.png", "Source": "EPG", "ServiceId": "161", "Enabled": 0 }, +{ "Id": 292, "Name": "브릿지TV", "KT Name": "브릿지TV", "KTCh": 270, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/KATTup7.png", "Source": "KT", "ServiceId": "207", "Enabled": 0 }, +{ "Id": 293, "Name": "코미디TV", "KT Name": "코미디TV", "KTCh": 85, "LG Name": "", "LGCh": null, "SK Name": "코미디TV", "SKCh": 87, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/DHbUoDm.png", "Source": "SKY", "ServiceId": "100", "Enabled": 0 }, +{ "Id": 294, "Name": "쿠키건강TV", "KT Name": "쿠키건강TV", "KTCh": 220, "LG Name": "쿠키건강TV", "LGCh": 144, "SK Name": "쿠키건강TV", "SKCh": 269, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/4gl92D1.png", "Source": "EPG", "ServiceId": "735", "Enabled": 0 }, +{ "Id": 296, "Name": "키즈원", "KT Name": "키즈원", "KTCh": 148, "LG Name": "키즈원", "LGCh": 157, "SK Name": "KIDS1", "SKCh": 193, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/f8T1Sw4.png", "Source": "NAVER", "ServiceId": "815020", "Enabled": 0 }, +{ "Id": 297, "Name": "토마토TV", "KT Name": "토마토TV", "KTCh": 185, "LG Name": "토마토TV", "LGCh": 111, "SK Name": "토마토TV", "SKCh": 150, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/dVWy3Ex.png", "Source": "SK", "ServiceId": "620", "Enabled": 0 }, +{ "Id": 299, "Name": "펜트하우스tv", "KT Name": "펜트하우스tv", "KTCh": 208, "LG Name": "", "LGCh": null, "SK Name": "펜트하우스TV", "SKCh": 324, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/03U2Ges.png", "Source": "EPG", "ServiceId": "599", "Enabled": 0 }, +{ "Id": 301, "Name": "가톨릭평화방송", "KT Name": "가톨릭평화방송", "KTCh": 231, "LG Name": "가톨릭평화방송", "LGCh": 184, "SK Name": "가톨릭평화방송", "SKCh": 307, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/G5fTCL3.png", "Source": "HCN", "ServiceId": "33", "Enabled": 0 }, +{ "Id": 302, "Name": "폴라리스TV", "KT Name": "폴라리스TV", "KTCh": 129, "LG Name": "폴라리스 TV", "LGCh": 67, "SK Name": "폴라리스TV", "SKCh": 249, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/aghufJ7.png", "Source": "SK", "ServiceId": "252", "Enabled": 0 }, +{ "Id": 303, "Name": "한국경제TV", "KT Name": "한국경제TV", "KTCh": 180, "LG Name": "한국경제TV", "LGCh": 121, "SK Name": "한국경제TV", "SKCh": 151, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/ChnD0FT.png", "Source": "ISCS", "ServiceId": "197", "Enabled": 0 }, +{ "Id": 305, "Name": "한국승마방송", "KT Name": "한국승마방송", "KTCh": 259, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/VZdQLwj.png", "Source": "NAVER", "ServiceId": "814904", "Enabled": 0 }, +{ "Id": 307, "Name": "한국직업방송", "KT Name": "한국직업방송", "KTCh": 252, "LG Name": "", "LGCh": null, "SK Name": "한국직업방송", "SKCh": 273, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/WUvf0If.png", "Source": "ISCS", "ServiceId": "1325", "Enabled": 0 }, +{ "Id": 309, "Name": "허니TV", "KT Name": "허니TV", "KTCh": 207, "LG Name": "허니TV", "LGCh": 193, "SK Name": "허니TV", "SKCh": 323, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/KczRCLW.png", "Source": "EPG", "ServiceId": "112", "Enabled": 0 }, +{ "Id": 311, "Name": "헬스메디tv", "KT Name": "헬스메디tv", "KTCh": 271, "LG Name": "헬스메디TV", "LGCh": 138, "SK Name": "헬스메디TV", "SKCh": 268, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/vsxRuFh.png", "Source": "ISCS", "ServiceId": "1419", "Enabled": 0 }, +{ "Id": 312, "Name": "현대홈쇼핑", "KT Name": "현대홈쇼핑", "KTCh": 10, "LG Name": "현대홈쇼핑", "LGCh": 10, "SK Name": "현대홈쇼핑", "SKCh": 8, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/87fdrA5.png", "Source": "ISCS", "ServiceId": "8", "Enabled": 0 }, +{ "Id": 313, "Name": "현대홈쇼핑+샵", "KT Name": "현대홈쇼핑+샵", "KTCh": 36, "LG Name": "현대홈쇼핑+샵", "LGCh": 34, "SK Name": "현대홈쇼핑+Shop", "SKCh": 31, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/COo8Bcm.png", "Source": "SK", "ServiceId": "337", "Enabled": 0 }, +{ "Id": 314, "Name": "홈&쇼핑", "KT Name": "홈&쇼핑", "KTCh": 14, "LG Name": "홈앤쇼핑", "LGCh": 4, "SK Name": "홈&쇼핑", "SKCh": 4, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/nLxw0LW.png", "Source": "ISCS", "ServiceId": "1028", "Enabled": 0 }, +{ "Id": 315, "Name": "환경TV", "KT Name": "환경TV", "KTCh": 166, "LG Name": "", "LGCh": null, "SK Name": "환경TV", "SKCh": 276, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/eITOr2Y.png", "Source": "HCN", "ServiceId": "29", "Enabled": 0 }, +{ "Id": 316, "Name": "Life N", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "Life N", "SKCh": 215, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/qNde2j7.png", "Source": "SKB", "ServiceId": "277", "Enabled": 0 }, +{ "Id": 317, "Name": "Discovery HD", "KT Name": "", "KTCh": null, "LG Name": "디스커버리 아시아", "LGCh": 133, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/bH9BY7E.png", "Source": "SKY", "ServiceId": "929", "Enabled": 0 }, +{ "Id": 318, "Name": "Celestial Movies", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "Celestial Movies", "SKCh": 62, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/xDXM13Q.png", "Source": "SKB", "ServiceId": "877", "Enabled": 0 }, +{ "Id": 319, "Name": "UHD Dream TV", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "UHD Dream TV", "SKCh": 71, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/aLG2rKa.png", "Source": "SKY", "ServiceId": "689", "Enabled": 0 }, +{ "Id": 320, "Name": "UMAX", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "UMAX", "SKCh": 73, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/EgVuybQ.png", "Source": "SKB", "ServiceId": "69", "Enabled": 0 }, +{ "Id": 321, "Name": "NHK World TV", "KT Name": "", "KTCh": null, "LG Name": "NHK World TV", "LGCh": 142, "SK Name": "NHK World TV", "SKCh": 221, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/pCuIQsT.png", "Source": "LG", "ServiceId": "669", "Enabled": 0 }, +{ "Id": 362, "Name": "CJB 청주방송", "KT Name": "CJB 청주방송", "KTCh": 5, "LG Name": "CJB 청주방송", "LGCh": 5, "SK Name": "CJB 청주방송", "SKCh": 5, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/J6zQfQu.png", "Source": "NAVER", "ServiceId": "814684", "Enabled": 0 }, +{ "Id": 363, "Name": "G1 강원민방", "KT Name": "G1 강원민방", "KTCh": 5, "LG Name": "G1 강원민방", "LGCh": 5, "SK Name": "G1 강원민방", "SKCh": 5, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/aYqGo9x.png", "Source": "NAVER", "ServiceId": "814614", "Enabled": 0 }, +{ "Id": 364, "Name": "JIBS 제주방송", "KT Name": "JIBS 제주방송", "KTCh": 5, "LG Name": "JIBS 제주방송", "LGCh": 5, "SK Name": "JIBS 제주방송", "SKCh": 5, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/7YZ1lkJ.png", "Source": "NAVER", "ServiceId": "814703", "Enabled": 0 }, +{ "Id": 365, "Name": "JTV 전주방송", "KT Name": "JTV 전주방송", "KTCh": 5, "LG Name": "JTV 전주방송", "LGCh": 5, "SK Name": "JTV 전주방송", "SKCh": 5, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/XFKcvaN.png", "Source": "NAVER", "ServiceId": "814661", "Enabled": 0 }, +{ "Id": 366, "Name": "KBC 광주방송", "KT Name": "KBC 광주방송", "KTCh": 5, "LG Name": "KBC 광주방송", "LGCh": 5, "SK Name": "KBC 광주방송", "SKCh": 5, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/3M5UOIH.png", "Source": "NAVER", "ServiceId": "814652", "Enabled": 0 }, +{ "Id": 367, "Name": "KNN 부산경남방송", "KT Name": "KNN 부산경남방송", "KTCh": 5, "LG Name": "KNN 부산경남방송", "LGCh": 5, "SK Name": "KNN 부산경남방송", "SKCh": 5, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/RcViTam.png", "Source": "NAVER", "ServiceId": "814628", "Enabled": 0 }, +{ "Id": 369, "Name": "TBC 대구방송", "KT Name": "TBC 대구방송", "KTCh": 5, "LG Name": "TBC 대구방송", "LGCh": 5, "SK Name": "TBC 대구방송", "SKCh": 5, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/wmF5z8V.png", "Source": "NAVER", "ServiceId": "814639", "Enabled": 0 }, +{ "Id": 370, "Name": "TJB 대전방송", "KT Name": "TJB 대전방송", "KTCh": 5, "LG Name": "TJB 대전방송", "LGCh": 5, "SK Name": "TJB 대전방송", "SKCh": 5, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/9JAy4Bu.png", "Source": "NAVER", "ServiceId": "814671", "Enabled": 0 }, +{ "Id": 371, "Name": "UBC 울산방송", "KT Name": "UBC 울산방송", "KTCh": 5, "LG Name": "UBC 울산방송", "LGCh": 5, "SK Name": "UBC 울산방송", "SKCh": 5, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/qbBR1k5.png", "Source": "NAVER", "ServiceId": "814694", "Enabled": 0 }, +{ "Id": 372, "Name": "강릉 KBS1", "KT Name": "강릉 KBS1", "KTCh": 9, "LG Name": "강릉 KBS1", "LGCh": 9, "SK Name": "강릉 KBS1", "SKCh": 9, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/e31o5gw.png", "Source": "NAVER", "ServiceId": "814602", "Enabled": 0 }, +{ "Id": 373, "Name": "강릉 MBC", "KT Name": "강릉 MBC", "KTCh": 11, "LG Name": "강릉 MBC", "LGCh": 11, "SK Name": "강릉 MBC", "SKCh": 11, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/duig32i.png", "Source": "NAVER", "ServiceId": "814606", "Enabled": 0 }, +{ "Id": 374, "Name": "경인 KBS1", "KT Name": "경인 KBS1", "KTCh": 9, "LG Name": "경인 KBS1", "LGCh": 9, "SK Name": "경인 KBS1", "SKCh": 9, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/e31o5gw.png", "Source": "NAVER", "ServiceId": "814597", "Enabled": 0 }, +{ "Id": 375, "Name": "광주 KBS1", "KT Name": "광주 KBS1", "KTCh": 9, "LG Name": "광주 KBS1", "LGCh": 9, "SK Name": "광주 KBS1", "SKCh": 9, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/e31o5gw.png", "Source": "NAVER", "ServiceId": "814642", "Enabled": 0 }, +{ "Id": 376, "Name": "광주 MBC", "KT Name": "광주 MBC", "KTCh": 11, "LG Name": "광주 MBC", "LGCh": 11, "SK Name": "광주 MBC", "SKCh": 11, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/duig32i.png", "Source": "NAVER", "ServiceId": "814644", "Enabled": 0 }, +{ "Id": 377, "Name": "대구 KBS1", "KT Name": "대구 KBS1", "KTCh": 9, "LG Name": "대구 KBS1", "LGCh": 9, "SK Name": "대구 KBS1", "SKCh": 9, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/e31o5gw.png", "Source": "NAVER", "ServiceId": "814630", "Enabled": 0 }, +{ "Id": 378, "Name": "대구 MBC", "KT Name": "대구 MBC", "KTCh": 11, "LG Name": "대구 MBC", "LGCh": 11, "SK Name": "대구 MBC", "SKCh": 11, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/duig32i.png", "Source": "NAVER", "ServiceId": "814633", "Enabled": 0 }, +{ "Id": 379, "Name": "대전 KBS1", "KT Name": "대전 KBS1", "KTCh": 9, "LG Name": "대전 KBS1", "LGCh": 9, "SK Name": "대전 KBS1", "SKCh": 9, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/e31o5gw.png", "Source": "NAVER", "ServiceId": "814665", "Enabled": 0 }, +{ "Id": 380, "Name": "대전 MBC", "KT Name": "대전 MBC", "KTCh": 11, "LG Name": "대전 MBC", "LGCh": 11, "SK Name": "대전 MBC", "SKCh": 11, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/duig32i.png", "Source": "NAVER", "ServiceId": "814668", "Enabled": 0 }, +{ "Id": 381, "Name": "목포 KBS1", "KT Name": "목포 KBS1", "KTCh": 9, "LG Name": "목포 KBS1", "LGCh": 9, "SK Name": "목포 KBS1", "SKCh": 9, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/e31o5gw.png", "Source": "LG", "ServiceId": "523", "Enabled": 0 }, +{ "Id": 382, "Name": "목포 MBC", "KT Name": "목포 MBC", "KTCh": 11, "LG Name": "목포 MBC", "LGCh": 11, "SK Name": "목포 MBC", "SKCh": 11, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/duig32i.png", "Source": "NAVER", "ServiceId": "814646", "Enabled": 0 }, +{ "Id": 383, "Name": "부산 KBS1", "KT Name": "부산 KBS1", "KTCh": 9, "LG Name": "부산 KBS1", "LGCh": 9, "SK Name": "부산 KBS1", "SKCh": 9, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/e31o5gw.png", "Source": "NAVER", "ServiceId": "814617", "Enabled": 0 }, +{ "Id": 384, "Name": "부산 MBC", "KT Name": "부산 MBC", "KTCh": 11, "LG Name": "부산 MBC", "LGCh": 11, "SK Name": "부산 MBC", "SKCh": 11, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/duig32i.png", "Source": "NAVER", "ServiceId": "814621", "Enabled": 0 }, +{ "Id": 385, "Name": "삼척 MBC", "KT Name": "삼척 MBC", "KTCh": 11, "LG Name": "삼척 MBC", "LGCh": 11, "SK Name": "삼척 MBC", "SKCh": 11, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/duig32i.png", "Source": "NAVER", "ServiceId": "814608", "Enabled": 0 }, +{ "Id": 386, "Name": "순천 KBS1", "KT Name": "순천 KBS1", "KTCh": 9, "LG Name": "순천 KBS1", "LGCh": 9, "SK Name": "순천 KBS1", "SKCh": 9, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/e31o5gw.png", "Source": "LG", "ServiceId": "522", "Enabled": 0 }, +{ "Id": 387, "Name": "안동 KBS1", "KT Name": "안동 KBS1", "KTCh": 9, "LG Name": "안동 KBS1", "LGCh": 9, "SK Name": "안동 KBS1", "SKCh": 9, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/e31o5gw.png", "Source": "LG", "ServiceId": "517", "Enabled": 0 }, +{ "Id": 388, "Name": "안동 MBC", "KT Name": "안동 MBC", "KTCh": 11, "LG Name": "안동 MBC", "LGCh": 11, "SK Name": "안동 MBC", "SKCh": 11, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/duig32i.png", "Source": "NAVER", "ServiceId": "814635", "Enabled": 0 }, +{ "Id": 389, "Name": "여수 MBC", "KT Name": "여수 MBC", "KTCh": 11, "LG Name": "여수 MBC", "LGCh": 11, "SK Name": "여수 MBC", "SKCh": 11, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/duig32i.png", "Source": "NAVER", "ServiceId": "814649", "Enabled": 0 }, +{ "Id": 390, "Name": "울산 KBS1", "KT Name": "울산 KBS1", "KTCh": 9, "LG Name": "울산 KBS1", "LGCh": 9, "SK Name": "울산 KBS1", "SKCh": 9, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/e31o5gw.png", "Source": "NAVER", "ServiceId": "814687", "Enabled": 0 }, +{ "Id": 391, "Name": "울산 MBC", "KT Name": "울산 MBC", "KTCh": 11, "LG Name": "울산 MBC", "LGCh": 11, "SK Name": "울산 MBC", "SKCh": 11, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/duig32i.png", "Source": "NAVER", "ServiceId": "814691", "Enabled": 0 }, +{ "Id": 392, "Name": "원주 KBS1", "KT Name": "원주 KBS1", "KTCh": 9, "LG Name": "원주 KBS1", "LGCh": 9, "SK Name": "원주 KBS1", "SKCh": 9, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/e31o5gw.png", "Source": "LG", "ServiceId": "531", "Enabled": 0 }, +{ "Id": 393, "Name": "원주 MBC", "KT Name": "원주 MBC", "KTCh": 11, "LG Name": "원주 MBC", "LGCh": 11, "SK Name": "원주 MBC", "SKCh": 11, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/duig32i.png", "Source": "NAVER", "ServiceId": "814610", "Enabled": 0 }, +{ "Id": 394, "Name": "전주 KBS1", "KT Name": "전주 KBS1", "KTCh": 9, "LG Name": "전주 KBS1", "LGCh": 9, "SK Name": "전주 KBS1", "SKCh": 9, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/e31o5gw.png", "Source": "NAVER", "ServiceId": "814655", "Enabled": 0 }, +{ "Id": 395, "Name": "전주 MBC", "KT Name": "전주 MBC", "KTCh": 11, "LG Name": "전주 MBC", "LGCh": 11, "SK Name": "전주 MBC", "SKCh": 11, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/duig32i.png", "Source": "NAVER", "ServiceId": "814658", "Enabled": 0 }, +{ "Id": 396, "Name": "제주 KBS1", "KT Name": "제주 KBS1", "KTCh": 9, "LG Name": "제주 KBS1", "LGCh": 9, "SK Name": "제주 KBS1", "SKCh": 9, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/e31o5gw.png", "Source": "NAVER", "ServiceId": "814697", "Enabled": 0 }, +{ "Id": 397, "Name": "제주 MBC", "KT Name": "제주 MBC", "KTCh": 11, "LG Name": "제주 MBC", "LGCh": 11, "SK Name": "제주 MBC", "SKCh": 11, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/duig32i.png", "Source": "NAVER", "ServiceId": "814700", "Enabled": 0 }, +{ "Id": 398, "Name": "진주 KBS1", "KT Name": "진주 KBS1", "KTCh": 9, "LG Name": "진주 KBS1", "LGCh": 9, "SK Name": "진주 KBS1", "SKCh": 9, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/e31o5gw.png", "Source": "LG", "ServiceId": "529", "Enabled": 0 }, +{ "Id": 399, "Name": "진주 MBC", "KT Name": "진주 MBC", "KTCh": 11, "LG Name": "진주 MBC", "LGCh": 11, "SK Name": "진주 MBC", "SKCh": 11, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/duig32i.png", "Source": "NAVER", "ServiceId": "814624", "Enabled": 0 }, +{ "Id": 400, "Name": "창원 KBS1", "KT Name": "창원 KBS1", "KTCh": 9, "LG Name": "창원 KBS1", "LGCh": 9, "SK Name": "창원 KBS1", "SKCh": 9, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/e31o5gw.png", "Source": "NAVER", "ServiceId": "814619", "Enabled": 0 }, +{ "Id": 401, "Name": "청주 KBS1", "KT Name": "청주 KBS1", "KTCh": 9, "LG Name": "청주 KBS1", "LGCh": 9, "SK Name": "청주 KBS1", "SKCh": 9, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/e31o5gw.png", "Source": "NAVER", "ServiceId": "814675", "Enabled": 0 }, +{ "Id": 402, "Name": "청주 MBC", "KT Name": "청주 MBC", "KTCh": 11, "LG Name": "청주 MBC", "LGCh": 11, "SK Name": "청주 MBC", "SKCh": 11, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/duig32i.png", "Source": "NAVER", "ServiceId": "814678", "Enabled": 0 }, +{ "Id": 403, "Name": "춘천 KBS1", "KT Name": "춘천 KBS1", "KTCh": 9, "LG Name": "춘천 KBS1", "LGCh": 9, "SK Name": "춘천 KBS1", "SKCh": 9, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/e31o5gw.png", "Source": "NAVER", "ServiceId": "814604", "Enabled": 0 }, +{ "Id": 404, "Name": "춘천 MBC", "KT Name": "춘천 MBC", "KTCh": 11, "LG Name": "춘천 MBC", "LGCh": 11, "SK Name": "춘천 MBC", "SKCh": 11, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/duig32i.png", "Source": "NAVER", "ServiceId": "814612", "Enabled": 0 }, +{ "Id": 405, "Name": "충주 KBS1", "KT Name": "충주 KBS1", "KTCh": 9, "LG Name": "충주 KBS1", "LGCh": 9, "SK Name": "충주 KBS1", "SKCh": 9, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/e31o5gw.png", "Source": "LG", "ServiceId": "513", "Enabled": 0 }, +{ "Id": 406, "Name": "충주 MBC", "KT Name": "충주 MBC", "KTCh": 11, "LG Name": "충주 MBC", "LGCh": 11, "SK Name": "충주 MBC", "SKCh": 11, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/duig32i.png", "Source": "LG", "ServiceId": "538", "Enabled": 0 }, +{ "Id": 407, "Name": "포항 KBS1", "KT Name": "포항 KBS1", "KTCh": 9, "LG Name": "포항 KBS1", "LGCh": 9, "SK Name": "포항 KBS1", "SKCh": 9, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/e31o5gw.png", "Source": "LG", "ServiceId": "518", "Enabled": 0 }, +{ "Id": 408, "Name": "포항 MBC", "KT Name": "포항 MBC", "KTCh": 11, "LG Name": "포항 MBC", "LGCh": 11, "SK Name": "포항 MBC", "SKCh": 11, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/duig32i.png", "Source": "NAVER", "ServiceId": "814637", "Enabled": 0 }, +{ "Id": 409, "Name": "DIA TV", "KT Name": "DIA TV", "KTCh": 72, "LG Name": "다이아TV", "LGCh": 93, "SK Name": "DIA TV", "SKCh": 96, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/BH3DnrW.png", "Source": "LG", "ServiceId": "690", "Enabled": 0 }, +{ "Id": 410, "Name": "메디컬TV", "KT Name": "메디컬TV", "KTCh": 254, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/S73ArUy.png", "Source": "KT", "ServiceId": "254", "Enabled": 0 }, +{ "Id": 411, "Name": "CGTN", "KT Name": "CGTN", "KTCh": 194, "LG Name": "CGTN", "LGCh": 119, "SK Name": "CGTN", "SKCh": 161, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/rhZf4Zx.png", "Source": "ISCS", "ServiceId": "86", "Enabled": 0 }, +{ "Id": 412, "Name": "C Music TV", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "C Music TV", "SKCh": 237, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/hV270KM.png", "Source": "SKB", "ServiceId": "672", "Enabled": 0 }, +{ "Id": 413, "Name": "Tvis", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "Tvis", "SKCh": 250, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/7jq2VMs.png", "Source": "SKB", "ServiceId": "260", "Enabled": 0 }, +{ "Id": 414, "Name": "SPOTV ON", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "SPOTV ON", "SKCh": 118, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/Y3eYOc2.png", "Source": "SKB", "ServiceId": "136", "Enabled": 0 }, +{ "Id": 415, "Name": "SPOTV ON2", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "SPOTV ON2", "SKCh": 119, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/jbdurz4.png", "Source": "SKB", "ServiceId": "137", "Enabled": 0 }, +{ "Id": 416, "Name": "한국선거방송", "KT Name": "한국선거방송", "KTCh": 273, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/ZSdcknl.png", "Source": "KT", "ServiceId": "273", "Enabled": 0 }, +{ "Id": 417, "Name": "EBS 교육방송", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "EBS 교육방송", "RadioCh": 901, "Icon_url": "http://i.imgur.com/eEsZJop.png", "Source": "NAVER", "ServiceId": "815452", "Enabled": 0 }, +{ "Id": 418, "Name": "KBS 1 라디오", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "KBS 1 라디오", "RadioCh": 902, "Icon_url": "http://i.imgur.com/ikJ7QQn.png", "Source": "NAVER", "ServiceId": "815455", "Enabled": 0 }, +{ "Id": 419, "Name": "KBS 2 라디오", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "KBS 2 라디오", "RadioCh": 903, "Icon_url": "http://i.imgur.com/qTrmNld.png", "Source": "NAVER", "ServiceId": "815458", "Enabled": 0 }, +{ "Id": 420, "Name": "KBS 3 라디오", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "KBS 3 라디오", "RadioCh": 904, "Icon_url": "http://i.imgur.com/3tHl7QR.png", "Source": "NAVER", "ServiceId": "815460", "Enabled": 0 }, +{ "Id": 421, "Name": "KBS ClassicFM", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "KBS ClassicFM", "RadioCh": 905, "Icon_url": "http://i.imgur.com/Z46a05G.png", "Source": "NAVER", "ServiceId": "815454", "Enabled": 0 }, +{ "Id": 422, "Name": "KBS CoolFM", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "KBS CoolFM", "RadioCh": 906, "Icon_url": "http://i.imgur.com/0SQrpHZ.png", "Source": "NAVER", "ServiceId": "815457", "Enabled": 0 }, +{ "Id": 423, "Name": "KBS WorldRaido", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "KBS WorldRaido", "RadioCh": 907, "Icon_url": "http://i.imgur.com/ns1k6LN.png", "Source": "KBS", "ServiceId": "1", "Enabled": 0 }, +{ "Id": 424, "Name": "KBS 한민족방송", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "KBS 한민족방송", "RadioCh": 908, "Icon_url": "http://i.imgur.com/S5YVPyx.png", "Source": "NAVER", "ServiceId": "815461", "Enabled": 0 }, +{ "Id": 425, "Name": "MBC 표준FM", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "MBC 표준FM", "RadioCh": 909, "Icon_url": "http://i.imgur.com/E9OMdnO.png", "Source": "NAVER", "ServiceId": "815464", "Enabled": 0 }, +{ "Id": 426, "Name": "MBC FM4U", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "MBC FM4U", "RadioCh": 910, "Icon_url": "http://i.imgur.com/csdszZD.png", "Source": "NAVER", "ServiceId": "815463", "Enabled": 0 }, +{ "Id": 427, "Name": "MBC Channel M", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "MBC Channel M", "RadioCh": 911, "Icon_url": "http://i.imgur.com/jlKGpWs.png", "Source": "MBC", "ServiceId": "1", "Enabled": 0 }, +{ "Id": 428, "Name": "SBS 파워 FM", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "SBS 파워 FM", "RadioCh": 912, "Icon_url": "http://i.imgur.com/7qcJ4bm.png", "Source": "NAVER", "ServiceId": "815467", "Enabled": 0 }, +{ "Id": 429, "Name": "SBS 러브 FM", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "SBS 러브 FM", "RadioCh": 913, "Icon_url": "http://i.imgur.com/XHHHUZ1.png", "Source": "NAVER", "ServiceId": "815465", "Enabled": 0 }, +{ "Id": 430, "Name": "국악방송", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "국악방송", "RadioCh": 914, "Icon_url": "http://i.imgur.com/qpbhUhF.png", "Source": "NAVER", "ServiceId": "2891853", "Enabled": 0 }, +{ "Id": 431, "Name": "극동방송", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "극동방송", "RadioCh": 915, "Icon_url": "http://i.imgur.com/PlqBFtV.png", "Source": "NAVER", "ServiceId": "2074616", "Enabled": 0 }, +{ "Id": 432, "Name": "BBS 불교방송", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "BBS 불교방송", "RadioCh": 916, "Icon_url": "http://i.imgur.com/B34jpmo.png", "Source": "NAVER", "ServiceId": "815448", "Enabled": 0 }, +{ "Id": 433, "Name": "CBS 표준FM", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "CBS 표준FM", "RadioCh": 917, "Icon_url": "http://i.imgur.com/yBNo2mS.png", "Source": "NAVER", "ServiceId": "815451", "Enabled": 0 }, +{ "Id": 434, "Name": "CBS 음악FM", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "CBS 음악FM", "RadioCh": 918, "Icon_url": "http://i.imgur.com/yBNo2mS.png", "Source": "NAVER", "ServiceId": "815449", "Enabled": 0 }, +{ "Id": 435, "Name": "KFM 경기방송", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "KFM 경기방송", "RadioCh": 919, "Icon_url": "http://i.imgur.com/8hSikAY.png", "Source": "NAVER", "ServiceId": "1974893", "Enabled": 0 }, +{ "Id": 436, "Name": "PBC 평화방송", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "PBC 평화방송", "RadioCh": 920, "Icon_url": "http://i.imgur.com/G5fTCL3.png", "Source": "NAVER", "ServiceId": "1974894", "Enabled": 0 }, +{ "Id": 437, "Name": "TBS 교통방송", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "TBS 교통방송", "RadioCh": 921, "Icon_url": "http://i.imgur.com/9RxxTSi.png", "Source": "NAVER", "ServiceId": "815468", "Enabled": 0 }, +{ "Id": 438, "Name": "YTN NEWS FM", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "YTN NEWS FM", "RadioCh": 922, "Icon_url": "http://i.imgur.com/dSC3YPR.png", "Source": "NAVER", "ServiceId": "2074615", "Enabled": 0 }, +{ "Id": 439, "Name": "원음방송", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "원음방송", "RadioCh": 923, "Icon_url": "http://i.imgur.com/mKWQE7z.png", "Source": "NAVER", "ServiceId": "5534687", "Enabled": 0 }, +{ "Id": 440, "Name": "국방FM", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "국방FM", "RadioCh": 924, "Icon_url": "http://i.imgur.com/zjvlIIp.png", "Source": "MIL", "ServiceId": "1", "Enabled": 0 }, +{ "Id": 441, "Name": "경인방송", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "경인방송", "RadioCh": 925, "Icon_url": "http://i.imgur.com/zBTPTRe.png", "Source": "IFM", "ServiceId": "1", "Enabled": 0 }, +{ "Id": 442, "Name": "AMC", "KT Name": "AMC", "KTCh": 221, "LG Name": "", "LGCh": null, "SK Name": "AMC", "SKCh": 100, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/cJ1B77S.png", "Source": "SKB", "ServiceId": "199", "Enabled": 0 }, +{ "Id": 443, "Name": "TVA", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/tg99cob.png", "Source": "HCN", "ServiceId": "781", "Enabled": 0 }, +{ "Id": 444, "Name": "채널W", "KT Name": "채널 W", "KTCh": 226, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/mtiKEkU.png", "Source": "POOQ", "ServiceId": "C3901", "Enabled": 0 }, +{ "Id": 445, "Name": "INSIGHT TV", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "INSIGHT TV", "SKCh": 74, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/eFTXeGV.png", "Source": "SKB", "ServiceId": "890", "Enabled": 0 }, +{ "Id": 446, "Name": "인도어스포츠", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "인도어스포츠", "SKCh": 139, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/cb58LLs.png", "Source": "ISCS", "ServiceId": "576", "Enabled": 0 }, +{ "Id": 447, "Name": "시니어TV", "KT Name": "시니어TV", "KTCh": 264, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/XaObZ8I.png", "Source": "KT", "ServiceId": "264", "Enabled": 0 }, +{ "Id": 449, "Name": "아리랑 라디오", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/GLY8HCN.png", "Source": "ARIRANG", "ServiceId": "1", "Enabled": 0 }, +{ "Id": 450, "Name": "HGTV", "KT Name": "HGTV", "KTCh": 223, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/PR4w3i2.png", "Source": "KT", "ServiceId": "223", "Enabled": 0 }, +{ "Id": 451, "Name": "다빈치러닝", "KT Name": "다빈치러닝", "KTCh": 224, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/mB9BL31.png", "Source": "KT", "ServiceId": "224", "Enabled": 0 }, +{ "Id": 452, "Name": "E! Entertainment", "KT Name": "E! 엔터", "KTCh": 225, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/VqIgfE9.png", "Source": "KT", "ServiceId": "225", "Enabled": 0 }, +{ "Id": 453, "Name": "다큐원", "KT Name": "다큐원", "KTCh": 269, "LG Name": "", "LGCh": null, "SK Name": "다큐원", "SKCh": 283, "Radio Name": "아리랑 라디오", "RadioCh": 926, "Icon_url": "http://i.imgur.com/1EZs0Tn.png", "Source": "SK", "ServiceId": "257", "Enabled": 0 }, +{ "Id": 454, "Name": "Discovery Science", "KT Name": "DSC Science", "KTCh": 222, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/3UfATJL.png", "Source": "KT", "ServiceId": "222", "Enabled": 0 } +] \ No newline at end of file From 6c36100d14e67767c384f23077a580125cec2fd4 Mon Sep 17 00:00:00 2001 From: wonipapa Date: Fri, 1 Sep 2017 15:56:25 +0900 Subject: [PATCH 24/41] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6f9fb8b..599e8f4 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ epg2xml.php와 동일하다. epg2xml.json 안의 항목이 설정 가능한 항목이다.
 MyISP : 사용하는 ISP를 넣는다 .(ALL, KT, LG, SK가 사용가능하다)
-MyChannels : EPG 정보를 가져오고자 하는 채널 ID를 넣는다. ("1, 2, 3, 4" 또는 "1,2,3,4"
+MyChannels : EPG 정보를 가져오고자 하는 채널 ID를 넣는다. ("1, 2, 3, 4" 또는 "1,2,3,4")
 default_icon_url : 채널별 아이콘이 있는 url을 설정할 수 있다. 아이콘의 이름은 json 파일에 있는 Id.png로 기본설정되어 있다.
 default_rebroadcast : 제목에 재방송 정보 출력
 default_episode : 제목에 회차정보 출력

From 5e45d38876f3e11a59e1e4c9e773518a4f0f74a2 Mon Sep 17 00:00:00 2001
From: wonipapa 
Date: Fri, 1 Sep 2017 16:26:09 +0900
Subject: [PATCH 25/41] =?UTF-8?q?POOQ=ED=95=A8=EC=88=98=EA=B9=8C=EC=A7=80?=
 =?UTF-8?q?=20=EC=B2=B4=ED=81=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 epg2xml.php |  6 +++---
 epg2xml.py  | 11 ++++++-----
 2 files changed, 9 insertions(+), 8 deletions(-)

diff --git a/epg2xml.php b/epg2xml.php
index eda5157..9c6149f 100644
--- a/epg2xml.php
+++ b/epg2xml.php
@@ -1104,7 +1104,7 @@ function GetEPGFromPooq($ChannelInfo) {
                             $endTime = $program['startDate']." ".$program['endTime'];
                             $endTime = date("YmdHis", strtotime($endTime));
                             $pattern = '/^(.*?)(?:([\d,]+)회)?(?:\((재)\))?$/';
-                            $programName = $program['programTitle'];
+                            $programName = str_replace("\r\n", "", $program['programTitle']);
                             preg_match($pattern, $programName, $matches);
                             if($matches !== NULL) :
                                 if(isset($matches[1])) $programName = trim($matches[1]) ?: "";
@@ -1546,8 +1546,8 @@ function writeProgram($programdata) {
         if($rebroadcast == True && $GLOBALS['addrebroadcast']  == 'y') $desc = $desc."\n방송 : 재방송";
         if($episode) $desc = $desc."\n회차 : ".$episode."회";
         if($category) $desc = $desc."\n장르 : ".$category;
-        if($actors) $desc = $desc."\n출연 : ".$actors;
-        if($producers) $desc = $desc."\n제작 : ".$producers;
+        if($actors) $desc = $desc."\n출연 : ".trim($actors);
+        if($producers) $desc = $desc."\n제작 : ".trim($producers);
         $desc = $desc."\n등급 : ".$rating;
     else:
         $desc = "";
diff --git a/epg2xml.py b/epg2xml.py
index 2d74c40..67e3b7b 100644
--- a/epg2xml.py
+++ b/epg2xml.py
@@ -627,11 +627,12 @@ def GetEPGFromPooq(ChannelInfo):
                         endTime = program['startDate'] + ' ' + program['endTime']
                         endTime = datetime.datetime.strptime(endTime, '%Y-%m-%d %H:%M')
                         endTime = endTime.strftime('%Y%m%d%H%M%S')
+                        programName = program['programTitle'].replace("\r\n", "").encode('utf-8');
                         pattern = '^(.*?)(?:([\d,]+)회)?(?:\((재)\))?$'
-                        matches = re.match(pattern, program['programTitle'].encode('utf-8'))
+                        matches = re.match(pattern, programName)
                         if not(matches is None) :
-                            programName = matches.group(1) if matches.group(1) else ''
-                            episode = matches.group(2) if matches.group(2) else ''
+                            programName = matches.group(1).strip() if matches.group(1) else ''
+                            episode = matches.group(2).strip() if matches.group(2) else ''
                             rebroadcast = True if matches.group(3) else False
                         actors = program['programStaring'].strip(',').strip() if program['programStaring'] else ''
                         desc = program['programSummary'].strip() if program['programSummary'] else ''
@@ -922,8 +923,8 @@ def writeProgram(programdata):
         if rebroadcast == True and addrebroadcast == 'y' : desc = desc + '\n방송 : 재방송'
         if episode : desc = desc + '\n회차 : ' + str(episode) + '회'
         if category : desc = desc + '\n장르 : ' + category
-        if actors : desc = desc + '\n출연 : ' + actors
-        if producers : desc = desc + '\n제작 : ' + producers
+        if actors : desc = desc + '\n출연 : ' + actors.strip()
+        if producers : desc = desc + '\n제작 : ' + producers.strip()
         desc = desc + '\n등급 : ' + rating
     else:
         desc =''

From ea2c5c10574fb59691d5950f0f9ceb0ab0fb8930 Mon Sep 17 00:00:00 2001
From: wonipapa 
Date: Fri, 1 Sep 2017 16:33:18 +0900
Subject: [PATCH 26/41] =?UTF-8?q?AIRANG=20=ED=95=A8=EC=88=98=EA=B9=8C?=
 =?UTF-8?q?=EC=A7=80=20=EC=B2=B4=ED=81=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 epg2xml.php | 2 +-
 epg2xml.py  | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/epg2xml.php b/epg2xml.php
index 9c6149f..bde7925 100644
--- a/epg2xml.php
+++ b/epg2xml.php
@@ -1395,7 +1395,6 @@ function GetEPGFromKbs($ChannelInfo) {
                             //ChannelId, startTime, programName, subprogramName, desc, actors, producers, category, episode, rebroadcast, rating
                          $epginfo[] = array($ChannelId, $startTime, $programName, $subprogramName, $desc, $actors, $producers, $category, $episode, $rebroadcast, $rating);
                         endforeach;
-                        epgzip($epginfo);
                     endif;
                 } catch(Exception $e) {
                     if($GLOBALS['debug']) printError($e->getMessage());
@@ -1405,6 +1404,7 @@ function GetEPGFromKbs($ChannelInfo) {
             if($GLOBALS['debug']) printError($e->getMessage());
         }
     endforeach;
+    epgzip($epginfo);
 }
 
 function GetEPGFromArirang($ChannelInfo) {
diff --git a/epg2xml.py b/epg2xml.py
index 67e3b7b..e099875 100644
--- a/epg2xml.py
+++ b/epg2xml.py
@@ -809,13 +809,13 @@ def GetEPGFromKbs(ChannelInfo):
                         startTime = startTime.strftime('%Y%m%d%H%M%S')
                     #ChannelId, startTime, programName, subprogramName, desc, actors, producers, category, episode, rebroadcast, rating
                     epginfo.append([ChannelId, startTime, programName, subprogramName, desc, actors, producers, category, episode, rebroadcast, rating])
-                epgzip(epginfo)
             except ValueError:
                  if(debug): printError(ChannelName + CONTENT_ERROR)
                  else: pass
         except (requests.exceptions.RequestException) as e:
             if(debug): printError(ChannelName + str(e))
             else: pass
+    epgzip(epginfo)
 
 # Get EPG data from ARIRANG
 def GetEPGFromArirang(ChannelInfo):

From c6796297cc2379c5278e7e5f4b43ae509f133767 Mon Sep 17 00:00:00 2001
From: wonipapa 
Date: Fri, 1 Sep 2017 16:58:55 +0900
Subject: [PATCH 27/41] Update 1.2.2

---
 epg2xml-web.php | 874 +++++++++++++++++++++++++++++-------------------
 epg2xml.json    |   8 +-
 epg2xml.php     |   7 +-
 epg2xml.py      |   1 -
 4 files changed, 546 insertions(+), 344 deletions(-)

diff --git a/epg2xml-web.php b/epg2xml-web.php
index 7e4e514..5715447 100644
--- a/epg2xml-web.php
+++ b/epg2xml-web.php
@@ -1,10 +1,11 @@
  2 ? 2 : $period;
-                    else :
+                       else :
                         printError("default_fetch_limit는 1, 2, 3, 4, 5, 6, 7만 가능합니다.");
                         exit;
                     endif;
@@ -280,18 +281,18 @@ endif;
 function getEPG() {
     $fp = $GLOBALS['fp'];
     $MyISP = $GLOBALS['MyISP'];
+    $MyChannels = $GLOBALS['MyChannels'];
     $Channelfile = __DIR__."/Channel.json";
     $IconUrl = "";
     $ChannelInfos = array();
-
     try {
         $f = @file_get_contents($Channelfile);
         if($f === False) :
-            printError("Channel.".JSON_FILE_ERROR);
+            printError("Channel.json.".JSON_FILE_ERROR);
             exit;
         else :
             try {
-                $Channeldatas = json_decode($f, TRUE);
+                $Channeldatajson = json_decode($f, TRUE);
                 if(json_last_error() != JSON_ERROR_NONE) throw new Exception("Channel.".JSON_SYNTAX_ERROR);
             }
             catch(Exception $e) {
@@ -304,13 +305,19 @@ function getEPG() {
         printError($e->getMessage());
         exit;
     }
+//My Channel 정의
+    $MyChannelInfo = array();
+    if($MyChannels) :
+        $MyChannelInfo = array_map('trim',explode(',', $MyChannels));
+    endif;
+
     header("Content-Type: application/xml; charset=utf-8");
     fprintf($fp, "\n");
     fprintf($fp, "\n\n");
     fprintf($fp, "\n", VERSION);
- 
-    foreach ($Channeldatas as $Channeldata) : #Get Channel & Print Channel info
-        if($Channeldata['Enabled'] == 1) :
+
+    foreach ($Channeldatajson as $Channeldata) : //Get Channel & Print Channel info
+        if($Channeldata['Enabled'] == 1 ||  in_array($Channeldata['Id'], $MyChannelInfo)) :
             $ChannelId = $Channeldata['Id'];
             $ChannelName = htmlspecialchars($Channeldata['Name'], ENT_XML1);
             $ChannelSource = $Channeldata['Source'];
@@ -365,10 +372,12 @@ function getEPG() {
             GetEPGFromSKY($ChannelInfo);
         elseif($ChannelSource == 'NAVER') :
             GetEPGFromNaver($ChannelInfo);
-        elseif($ChannelSource == 'TBROAD') :
-            GetEPGFromTbroad($ChannelInfo);
         elseif($ChannelSource == 'ISCS') :
             GetEPGFromIscs($ChannelInfo);
+        elseif($ChannelSource == 'HCN') :
+            GetEPGFromHcn($ChannelInfo);
+        elseif($ChannelSource == 'POOQ') :
+            GetEPGFromPooq($ChannelInfo);
         elseif($ChannelSource == 'MBC') :
             GetEPGFromMbc($ChannelInfo);
         elseif($ChannelSource == 'MIL'):
@@ -377,6 +386,8 @@ function getEPG() {
             GetEPGFromIfm($ChannelInfo);
         elseif($ChannelSource == 'KBS'):
             GetEPGFromKbs($ChannelInfo);
+        elseif($ChannelSource == 'ARIRANG'):
+            GetEPGFromArirang($ChannelInfo);
         endif;
     endforeach;
     fprintf($fp, "\n");
@@ -389,11 +400,11 @@ function GetEPGFromEPG($ChannelInfo) {
     $ServiceId =  $ChannelInfo[3];
     $epginfo = array();
     foreach(range(1, $GLOBALS['period']) as $k) :
-        $url = "http://www.epg.co.kr/epg-cgi/extern/cnm_guide_type_v070530.cgi";
+        $url = "http://211.43.210.10:88/epg-cgi/extern/cnm_guide_type_v070530.php";
         $day = date("Ymd", strtotime("+".($k - 1)." days"));
         $params = array(
             'beforegroup' => '100',
-            'checkchannel' => $ServiceId,
+            'checkchannel[]' => $ServiceId,
             'select_group' => '100',
             'start_date' => $day
         );
@@ -405,91 +416,72 @@ function GetEPGFromEPG($ChannelInfo) {
                 printError($ChannelName.HTTP_ERROR);
             else :
                 $response = str_replace("charset=euc-kr", "charset=utf-8", $response);
+                $response = mb_convert_encoding($response, "UTF-8", "EUC-KR");
+                $pattern = '/(.*)<\/td>/';
+                $response = preg_replace_callback($pattern, function($matches) { return ''.htmlspecialchars($matches[1], ENT_NOQUOTES).'';}, $response);
+                $response = str_replace(array('</b>', '</a>', '<img', 'valign=top>','align=absmiddle>'), array('', '', '','>'), $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 < 12) :
-                                    $hour = $hour." PM";
-                                elseif($hour <5 || $hour == 12) :
+                libxml_use_internal_errors(True);
+                if($dom->loadHTML($response)):
+                    $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) :
+                            $startTime = $endTime = $programName = $subprogramName = $desc = $actors = $producers = $category = $episode = "";
+                            $rebroadcast = False;
+                            $rating = 0;
+                            $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);
+                            $minute = str_replace(array("[", "]"), array("",""), trim($minute->nodeValue));
+                            $minute = substr($minute, -2);
+                            $hour = $hour.":".$minute;
+                            switch ($i) :
+                                case 2 :
                                     $hour = $hour." AM";
-                                    $thisday = date("Ymd", strtotime($day." +1 days"));
-                                endif;
-                                break;
-                        endswitch;
-                        $startTime = date("YmdHis", strtotime($thisday." ".$hour));
-                        $programName = "";
-                        $subprogramName = "";
-                        $rating = 0;
-                        $episode = "";
-                        $rebroadcast = False;                        
-                        preg_match('/?(.*)?(.*?)\s*(<(.*)>)?\s*(\(재\))?\s*(\(([\d,]+)회\))?()?\s*<\/td>/', trim($dom->saveHTML($program)), $matches);
-                        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] : "";
-                                preg_match('/.*schedule_([\d,]+)?.*/', $image, $grade);
-                                if($grade != NULL) $rating = $grade[1];
+                                    break;
+                                case 3 :
+                                    $hour = $hour." PM";
+                                    break;
+                                case 4 :
+                                    if($hour > 5 && $hour < 12) :
+                                        $hour = $hour." PM";
+                                    elseif($hour <5 || $hour == 12) :
+                                        $hour = $hour." AM";
+                                        $thisday = date("Ymd", strtotime($day." +1 days"));
+                                    endif;
+                                    break;
+                            endswitch;
+                            $startTime = date("YmdHis", strtotime($thisday." ".$hour));
+                            $pattern = '/^(.*?)\s*(?:<(.*)>)?\s*(?:\((재)\))?\s*(?:\(([\d,]+)회\)?)?$/';
+                            $programName = trim($program->nodeValue);
+                             preg_match($pattern, $programName, $matches);
+                            if ($matches != NULL) :
+                                if(isset($matches[1])) $programName = trim($matches[1]) ?: "";
+                                if(isset($matches[2])) $subprogramName = trim($matches[2]) ?: "";
+                                if(isset($matches[3])) $rebroadcast = $matches[3] ? True : False;
+                                if(isset($matches[4])) $episode = $matches[4] ?: "";
                             endif;
-                        endif;
-                            //programName, startTime, rating, subprogramName, rebroadcast, episode
-                            $epginfo[] = array($programName, $startTime, $rating, $subprogramName, $rebroadcast, $episode );
-                    endforeach;
-                endfor;
+                            $images = $program->getElementsByTagName('img');
+                            foreach($images as $image):
+                                preg_match('/.*schedule_([\d,]+)?.*/', $image->getAttribute('src'), $grade);
+                                if($grade != NULL) $rating = $grade[1];
+                            endforeach;
+                            //ChannelId, startTime, programName, subprogramName, desc, actors, producers, category, episode, rebroadcast, rating
+                            $epginfo[] = array($ChannelId, $startTime, $programName, $subprogramName, $desc, $actors, $producers, $category, $episode, $rebroadcast, $rating);
+                        endforeach;
+                    endfor;
+                 else:
+                    if($GLOBALS['debug']) printError($ChannelName.CONTENT_ERROR);
+                endif;
             endif;
         } catch (Exception $e) {
             if($GLOBALS['debug']) printError($e->getMessage());
         }
     endforeach;
-    $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];
-        $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;
+    epgzip($epginfo);
 }
 
 // Get EPG data from KT
@@ -516,58 +508,41 @@ function GetEPGFromKT($ChannelInfo) {
                 printError($ChannelName.HTTP_ERROR);
             else :
                 $response = str_replace("charset=euc-kr", "charset=utf-8", $response);
+                $response = mb_convert_encoding($response, "UTF-8", "EUC-KR");
                 $dom = new DomDocument;
-                libxml_use_internal_errors(true);
-                $dom->loadHTML(mb_convert_encoding($response, "UTF-8", "EUC-KR"));
-                $xpath = new DomXPath($dom);
-                $query = "//table[@id='pop_day']/tbody/tr";
-                $rows = $xpath->query($query);
-                foreach($rows as $row) :
-                    $cells = $row->getElementsByTagName('td');
-                    #programName, startTime, rating, category
-                    $startTime = date("YmdHis", strtotime($day." ".trim($cells->item(0)->nodeValue)));
-                    $rating = str_replace("all", 0, str_replace("세 이상", "", trim($cells->item(2)->nodeValue)));
-                    $epginfo[]= array(trim($cells->item(1)->nodeValue), $startTime, $rating, trim($cells->item(4)->nodeValue));
-                endforeach;
+                libxml_use_internal_errors(True);
+                if($dom->loadHTML($response)):
+                    $xpath = new DomXPath($dom);
+                    $query = "//table[@id='pop_day']/tbody/tr";
+                    $rows = $xpath->query($query);
+                    foreach($rows as $row) :
+                        $startTime = $endTime = $programName = $subprogramName = $desc = $actors = $producers = $category = $episode = "";
+                        $rebroadcast = False;
+                        $rating = 0;
+                        $cells = $row->getElementsByTagName('td');
+                        //programName, startTime, rating, category
+                        $startTime = date("YmdHis", strtotime($day." ".trim($cells->item(0)->nodeValue)));
+                        $pattern = '/^(.*?)( <(.*)>)?$/';
+                        $programName = trim($cells->item(1)->nodeValue);
+                        preg_match($pattern, $programName, $matches);
+                        if ($matches != NULL) :
+                           if(isset($matches[1])) $programName = $matches[1] ?: "";
+                           if(isset($matches[3])) $subprogramName = $matches[3] ?: "";
+                        endif;
+                        $category = trim($cells->item(4)->nodeValue);
+                        $rating = str_replace("all", 0, str_replace("세 이상", "", trim($cells->item(2)->nodeValue)));
+                        //ChannelId, startTime, programName, subprogramName, desc, actors, producers, category, episode, rebroadcast, rating
+                        $epginfo[] = array($ChannelId, $startTime, $programName, $subprogramName, $desc, $actors, $producers, $category, $episode, $rebroadcast, $rating);
+                    endforeach;
+                else :
+                    if($GLOBALS['debug']) printError($ChannelName.CONTENT_ERROR);
+                endif;
             endif;
         } catch (Exception $e) {
             if($GLOBALS['debug']) printError($e->getMessage());
         }
     endforeach;
-    $zipped = array_slice(array_map(NULL, $epginfo, array_slice($epginfo,1)),0,-1);
-    foreach($zipped as $epg) :
-        $programName = "";
-        $subprogramName = "";
-        preg_match('/^(.*?)( <(.*)>)?$/', $epg[0][0], $matches);
-        if ($matches != NULL) :
-           if(isset($matches[1])) $programName = $matches[1] ?: "";
-           if(isset($matches[3])) $subprogramName = $matches[3] ?: "";
-        endif;
-        $startTime = $epg[0][1] ?: "";
-        $endTime = $epg[1][1] ?: "";
-        $desc = "";
-        $actors = "";
-        $producers = "";
-        $category = $epg[0][3] ?: "";
-        $rebroadcast = False;
-        $episode = "";
-        $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;
+    epgzip($epginfo);
 }
 
 // Get EPG data from LG
@@ -591,65 +566,44 @@ function GetEPGFromLG($ChannelInfo) {
                 printError($ChannelName.HTTP_ERROR);
             else :
                 $response = ''.$response;
-                $dom = new DomDocument;
-                libxml_use_internal_errors(true);
                 $response = mb_convert_encoding($response, "UTF-8", "EUC-KR");
                 $response = str_replace(array('<재>', ' [..', ' (..'), array('<재>', '', ''), $response);
-                $dom->loadHTML($response);
-                $xpath = new DomXPath($dom);
-                $query = "//div[@class='tblType list']/table/tbody/tr";
-                $rows = $xpath->query($query);
-                foreach($rows as $row) :
-                    $cells = $row->getElementsByTagName('td');
-                    $programName = trim($cells->item(1)->childNodes->item(0)->nodeValue);
-                    $startTime = date("YmdHis", strtotime($day." ".trim($cells->item(0)->nodeValue)));
-                    $spans = $cells->item(1)->getElementsByTagName('span');
-                    $rating = trim($spans->item(1)->nodeValue)=="All" ? 0 : trim($spans->item(1)->nodeValue);
-                    //programName, startTime, rating, category
-                    $epginfo[]= array($programName, $startTime, $rating, trim($cells->item(2)->nodeValue));
-                endforeach;
+                $dom = new DomDocument;
+                libxml_use_internal_errors(True);
+                if($dom->loadHTML($response)):
+                    $xpath = new DomXPath($dom);
+                    $query = "//div[@class='tblType list']/table/tbody/tr";
+                    $rows = $xpath->query($query);
+                    foreach($rows as $row) :
+                        $startTime = $endTime = $programName = $subprogramName = $desc = $actors = $producers = $category = $episode = "";
+                        $rebroadcast = False;
+                        $rating = 0;
+                        $cells = $row->getElementsByTagName('td');
+                        $startTime = date("YmdHis", strtotime($day." ".trim($cells->item(0)->nodeValue)));
+                        $programName = trim($cells->item(1)->childNodes->item(0)->nodeValue);
+                        $pattern = '/(<재>)?\s?(?:\[.*?\])?(.*?)(?:\[(.*)\])?\s?(?:\(([\d,]+)회\))?$/';
+                        preg_match($pattern, $programName, $matches);
+                        if ($matches != NULL) :
+                            if(isset($matches[2])) $programName = trim($matches[2]) ?: "";
+                            if(isset($matches[3])) $subprogramName = trim($matches[3]) ?: "";
+                            if(isset($matches[4])) $episode = trim($matches[4]) ?: "";
+                            if(isset($matches[1])) $rebroadcast = trim($matches[1]) ? True: False;
+                        endif;
+                        $category = trim($cells->item(2)->nodeValue);
+                        $spans = $cells->item(1)->getElementsByTagName('span');
+                        $rating = trim($spans->item(1)->nodeValue)=="All" ? 0 : trim($spans->item(1)->nodeValue);
+                        //ChannelId, startTime, programName, subprogramName, desc, actors, producers, category, episode, rebroadcast, rating
+                        $epginfo[] = array($ChannelId, $startTime, $programName, $subprogramName, $desc, $actors, $producers, $category, $episode, $rebroadcast, $rating);
+                    endforeach;
+                else :
+                    if($GLOBALS['debug']) printError($ChannelName.CONTENT_ERROR);
+                endif;
             endif;
         } catch (Exception $e) {
             if($GLOBALS['debug']) printError($e->getMessage());
         }
     endforeach;
-    $zipped = array_slice(array_map(NULL, $epginfo, array_slice($epginfo,1)),0,-1);
-    foreach($zipped as $epg) :
-        preg_match('/(<재>?)?(.*?)(\[(.*)\])?\s?(\(([\d,]+)회\))?$/', $epg[0][0], $matches);
-        $programName = "";
-        $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] ?: "";
-        $endTime = $epg[1][1] ?: "";
-        $desc = "";
-        $actors = "";
-        $producers = "";
-        $category = $epg[0][3] ?: "";
-
-        $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;
+    epgzip($epginfo);
 }
 
 // Get EPG data from SK
@@ -681,11 +635,11 @@ function GetEPGFromSK($ChannelInfo) {
                 else :
                     $programs = $data['channel']['programs'];
                     foreach ($programs as $program) :
-                        $programName = "";
-                        $subprogramName = "";
-                        $episode = "";
+                        $startTime = $endTime = $programName = $subprogramName = $desc = $actors = $producers = $category = $episode = "";
                         $rebroadcast = False;
-                        preg_match('/^(.*?)(?:\s*[\(<]([\d,회]+)[\)>])?(?:\s*<([^<]*?)>)?(\((재)\))?$/', str_replace('...', '>', $program['programName']), $matches);
+                        $rating = 0;
+                        $pattern = '/^(.*?)(?:\s*[\(<]([\d,회]+)[\)>])?(?:\s*<([^<]*?)>)?(\((재)\))?$/';
+                        preg_match($pattern, str_replace('...', '>', $program['programName']), $matches);
                         if ($matches != NULL) :
                             if(isset($matches[1])) $programName = trim($matches[1]) ?: "";
                             if(isset($matches[3])) $subprogramName = trim($matches[3]) ?: "";
@@ -736,12 +690,11 @@ function GetEPGFromSKB($ChannelInfo) {
     $ServiceId =  $ChannelInfo[3];
     $epginfo = array();
     foreach(range(1, $GLOBALS['period']) as $k) :
-        $url = "http://www.skbroadband.com/content/realtime/Channel_List.do";
+        $url = "http://m.skbroadband.com/content/realtime/Channel_List.do";
         $day = date("Ymd", strtotime("+".($k - 1)." days"));
         $params = array(
             'key_depth2' => $ServiceId,
-            'key_depth3' => $day,
-            'tab_gubun'  => 'lst'
+            'key_depth3' => $day
         );
         $params = http_build_query($params);
         $method = "POST";
@@ -751,64 +704,51 @@ function GetEPGFromSKB($ChannelInfo) {
                 printError($ChannelName.HTTP_ERROR);
             else :
                 $response = str_replace('charset="euc-kr"', 'charset="utf-8"', $response);
+                $response = mb_convert_encoding($response, "UTF-8", "EUC-KR");
+                $response = preg_replace('//is', '', $response);
+                $response = preg_replace('/<\/span>/is', '', $response);
+                $pattern = '/(.*)<\/span>/';
+                $response = preg_replace_callback($pattern, function($matches) { return ''.htmlspecialchars($matches[1], ENT_NOQUOTES).'';}, $response);
                 $dom = new DomDocument;
                 libxml_use_internal_errors(True);
-                $response = mb_convert_encoding($response, "UTF-8", "EUC-KR");
-                $dom->loadHTML($response);
-                $xpath = new DomXPath($dom);
-                $query = "//tr[@class='".$day."']";
-                $rows = $xpath->query($query);
-                foreach($rows as $row) :
-                    $cells = $row->getElementsByTagName('td');
-                    $pattern = '/^(.*?)(\(([\d,]+)회\))?(<(.*)>)?(\((재)\))?$/';
-                    preg_match($pattern, trim($cells->item(0)->nodeValue), $matches);
-                    if ($matches != NULL) :
-                        if(isset($matches[1])) $programName = trim($matches[1]) ?: "";
-                        if(isset($matches[5])) $subprogramName = trim($matches[5]) ?: "";
-                        if(isset($matches[3])) $episode = $matches[3] ?: "";
-                        if(isset($matches[7])) $rebroadcast = $matches[7] ? True : False;
-                    endif;
-                    preg_match('/.*\s*([\d,]+)\s*.*/', $cells->item(1)->nodeValue, $rating);
-                    $startTime = $row->getElementsByTagName('th')->item(0)->nodeValue;
-                    $startTime = date("YmdHis", strtotime($day." ".$startTime));
-                    $rating = $rating[1];
-                    //programName, startTime, rating, subprogramName, rebroadcast, episode
-                    $epginfo[]= array($programName, $startTime, $rating, $subprogramName, $rebroadcast, $episode);
-                endforeach;
+                if($dom->loadHTML($response)):
+                    $xpath = new DomXPath($dom);
+                    $query = "//span[@class='caption' or @class='explan' or @class='fullHD' or @class='UHD' or @class='nowon']";
+                    $spans = $xpath->query($query);
+                    foreach($spans as $span) :
+                        $span->parentNode->removeChild( $span);
+                    endforeach;
+                    $query = "//div[@id='dawn']/ul/li";
+                    $rows = $xpath->query($query);
+                    foreach($rows as $row) :
+                        $startTime = $endTime = $programName = $subprogramName = $desc = $actors = $producers = $category = $episode = "";
+                        $rebroadcast = False;
+                        $rating = 0;
+                        $cells = $row->getElementsByTagName('span');
+                        $startTime = $cells->item(0)->nodeValue ?: "";
+                        $startTime = date("YmdHis", strtotime($day." ".$startTime));
+                        $programName = trim($cells->item(2)->nodeValue) ?: "";
+                        $pattern = '/^(.*?)(\(([\d,]+)회\))?(<(.*)>)?(\((재)\))?$/';
+                        preg_match($pattern, $programName, $matches);
+                        if ($matches != NULL) :
+                            if(isset($matches[1])) $programName = trim($matches[1]) ?: "";
+                            if(isset($matches[5])) $subprogramName = trim($matches[5]) ?: "";
+                            if(isset($matches[3])) $episode = $matches[3] ?: "";
+                            if(isset($matches[7])) $rebroadcast = $matches[7] ? True : False;
+                        endif;
+                        if($cells->length > 3) $rating = str_replace('세', '', $cells->item(3)->nodeValue)  ?: 0;
+                        //ChannelId, startTime, programName, subprogramName, desc, actors, producers, category, episode, rebroadcast, rating
+                        $epginfo[] = array($ChannelId, $startTime, $programName, $subprogramName, $desc, $actors, $producers, $category, $episode, $rebroadcast, $rating);
+                    endforeach;
+                else :
+                    if($GLOBALS['debug']) printError($ChannelName.CONTENT_ERROR);
+                endif;
             endif;
         } catch (Exception $e) {
             if($GLOBALS['debug']) printError($e->getMessage());
         }
     endforeach;
-    $zipped = array_slice(array_map(NULL, $epginfo, array_slice($epginfo,1)),0,-1);
-    foreach($zipped as $epg) :
-        $programName = trim($epg[0][0]) ?: "";
-        $subprogramName = trim($epg[0][3]) ?: "";
-        $episode = $epg[0][5] ?: "";
-        $rebroadcast = $epg[0][4] ? True: False;
-        $startTime = $epg[0][1] ?: "";
-        $endTime = $epg[1][1] ?: "";
-        $desc = "";
-        $actors = "";
-        $producers = "";
-        $category = "";
-        $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;
+    epgzip($epginfo);
 }
 
 // Get EPG data from SKY
@@ -842,6 +782,9 @@ function GetEPGFromSKY($ChannelInfo) {
                     else :
                         $programs = $data['scheduleListIn'];
                         foreach($programs as $program) :
+                            $startTime = $endTime = $programName = $subprogramName = $desc = $actors = $producers = $category = $episode = "";
+                            $rebroadcast = False;
+                            $rating = 0;
                             $programName = htmlspecialchars_decode($program['program_name']) ?: "";
                             $subprogramName = str_replace(array('lt;', 'gt;', 'amp;'), array('<', '>', '&'),$program['program_subname']) ?: "";
                             $startTime = $program['starttime'];
@@ -851,8 +794,12 @@ function GetEPGFromSKY($ChannelInfo) {
                             $description = str_replace(array('lt;', 'gt;', 'amp;'), array('<', '>', '&'),$program['description']) ?: "";
                             $summary = str_replace(array('lt;', 'gt;', 'amp;'), array('<', '>', '&'),$program['summary']) ?: "";
                             $desc = $description ?: "";
-                            if($summary) :
-                                $desc = $desc."\n".$summary;
+                            if($desc) :
+                                if($summary):
+                                    $desc = $desc."\n".$summary;
+                                endif;
+                            else :
+                                $desc = $summary;
                             endif;
                             $category = $program['program_category1'];
                             $episode = $program['episode_id'] ?: "";
@@ -932,41 +879,19 @@ function GetEPGFromNaver($ChannelInfo) {
                     for($i = 0; $i < count($data['displayDates']); $i++) :
                         for($j = 0; $j < 24; $j++) :
                             foreach($data['schedules'][$j][$i] as $program) :
-                                //programName, startTime, episode, rebroadcast, rating
+                                $startTime = $endTime = $programName = $subprogramName = $desc = $actors = $producers = $category = $episode = "";
+                                $rebroadcast = False;
+                                $rating = 0;
                                 $startTime = date("YmdHis", strtotime($data['displayDates'][$i]['date']." ".$program['startTime']));
-                                $epginfo[] = array($program['title'], $startTime, str_replace("회","", $program['episode']), $program['isRerun'], $program['grade']);
+                                $programName = htmlspecialchars_decode(trim($program['title']), ENT_XML1);
+                                $episode = str_replace("회","", $program['episode']);
+                                $rebroadcast = $program['isRerun'] ? True : False;
+                                $rating = $program['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);
                             endforeach;
                         endfor;
                     endfor;
-                    $zipped = array_slice(array_map(NULL, $epginfo, array_slice($epginfo,1)),0,-1);
-                    foreach($zipped as $epg) :
-                        $programName = htmlspecialchars_decode($epg[0][0], ENT_XML1) ?: "";
-                        $subprogramName = "";
-                        $startTime = $epg[0][1] ?: "";
-                        $endTime = $epg[1][1] ?: "";
-                        $desc = "";
-                        $actors = "";
-                        $producers = "";
-                        $category = "";
-                        $rebroadcast = $epg[0][3] ? True: False;
-                        $episode = $epg[0][2] ?: "";
-                        $rating = $epg[0][4] ?: 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) {
                 if($GLOBALS['debug']) printError($e->getMessage());
@@ -975,21 +900,223 @@ function GetEPGFromNaver($ChannelInfo) {
     } catch (Exception $e) {
         if($GLOBALS['debug']) printError($e->getMessage());
     }
-}
-
-// Get EPG data from Tbroad
-function GetEPGFromTbroad($ChannelInfo) {
-    $url='https://www.tbroad.com/chplan/selectRealTimeListForNormal.tb';
+    epgzip($epginfo);
 }
 
 // Get EPG data from Iscs
 function GetEPGFromIscs($ChannelInfo) {
-    $url='http://service.iscs.co.kr/sub/channel_view.asp';
+    $ChannelId = $ChannelInfo[0];
+    $ChannelName = $ChannelInfo[1];
+    $ServiceId =  $ChannelInfo[3];
+    $epginfo = array();
+    foreach(range(1, $GLOBALS['period']) as $k) :
+        $url = "https://www.iscs.co.kr/service/sub/ajax_channel_view.asp";
+        $day = date("Y-m-d", strtotime("+".($k - 1)." days"));
+        $params = array(
+            's_idx' => $ServiceId,
+            'C_date' => $day
+        );
+        $params = http_build_query($params);
+        $method = "POST";
+        try {
+            $response = getWeb($url, $params, $method);
+            if ($response === False && $GLOBALS['debug']) :
+                printError($ChannelName.HTTP_ERROR);
+            else :
+                try {
+                    $data = json_decode($response, TRUE);
+                    if(json_last_error() != JSON_ERROR_NONE) throw new Exception(JSON_SYNTAX_ERROR);
+                    if(count($data['html']) == 0) :
+                        if($GLOBALS['debug']) :
+                            printError($ChannelName.CHANNEL_ERROR);
+                        endif;
+                    else :
+                        $response = $data['html'];
+                        $response = mb_convert_encoding($response, "HTML-ENTITIES", "UTF-8");
+                        $pattern = '/(.*)<\/td>/';
+                        $response = preg_replace_callback($pattern, function($matches) { return ''.htmlspecialchars($matches[1]).'';}, $response);
+                        $dom = new DomDocument;
+                        libxml_use_internal_errors(True);
+                        if($dom->loadHTML($response)):
+                            $xpath = new DomXPath($dom);
+                            $query = "//div[@class='pp_tbl']/table/tbody/tr";
+                            $rows = $xpath->query($query);
+                            foreach($rows as $row) :
+                                $startTime = $endTime = $programName = $subprogramName = $desc = $actors = $producers = $category = $episode = "";
+                                $rebroadcast = False;
+                                $rating = 0;
+                                $cells = $row->getElementsByTagName('td');
+                                $startTime = $cells->item(0)->nodeValue ?: "";
+                                $startTime = date("YmdHis", strtotime($day." ".$startTime));
+                                $programName = trim($cells->item(1)->nodeValue) ?: "";
+                                $pattern = '/^(.*?)(?:\(([\d,]+)회\))?(?:\((재)\))?$/';
+                                preg_match($pattern, $programName, $matches);
+                                if ($matches != NULL) :
+                                    if(isset($matches[1])) $programName = trim($matches[1]) ?: "";
+                                    if(isset($matches[2])) $episode = $matches[2] ?: "";
+                                    if(isset($matches[3])) $rebroadcast = $matches[3] ? True : False;
+                                endif;
+                                $rating = $cells->item(2)->nodeValue=='전체관람' ? 0 : str_replace('세이상', '', $cells->item(2)->nodeValue);
+                                //ChannelId, startTime, programName, subprogramName, desc, actors, producers, category, episode, rebroadcast, rating
+                                $epginfo[] = array($ChannelId, $startTime, $programName, $subprogramName, $desc, $actors, $producers, $category, $episode, $rebroadcast, $rating);
+                            endforeach;
+                        else :
+                            if($GLOBALS['debug']) printError($ChannelName.CONTENT_ERROR);
+                        endif;
+                    endif;
+                } catch(Exception $e) {
+                    if($GLOBALS['debug']) printError($e->getMessage());
+                }
+            endif;
+        } catch (Exception $e) {
+            if($GLOBALS['debug']) printError($e->getMessage());
+        }
+    endforeach;
+    epgzip($epginfo);
+}
+
+// Get EPG data from Hcn
+function GetEPGFromHcn($ChannelInfo) {
+    $ChannelId = $ChannelInfo[0];
+    $ChannelName = $ChannelInfo[1];
+    $ServiceId =  $ChannelInfo[3];
+    $epginfo = array();
+    foreach(range(1, $GLOBALS['period']) as $k) :
+        $url = "https://www.hcn.co.kr/ur/bs/ch/channelInfo.hcn";
+        $day = date("Y-m-d", strtotime("+".($k - 1)." days"));
+        $params = array(
+            'method' => 'ajax_00', 
+            'pageType' => 'sheetList',
+            'ch_id' => $ServiceId,
+            'onairdate' => $day
+        );
+        $params = http_build_query($params);
+        $method = "POST";
+       try {
+            $response = getWeb($url, $params, $method);
+            if ($response === False && $GLOBALS['debug']) :
+                printError($ChannelName.HTTP_ERROR);
+            else :
+                $response = mb_convert_encoding($response, "HTML-ENTITIES", "EUC-KR");
+                $dom = new DomDocument;
+                libxml_use_internal_errors(True);
+                if($dom->loadHTML($response)):
+                    $xpath = new DomXPath($dom);
+                    $query = "//tr[@class='']";
+                    $rows = $xpath->query($query);
+                    foreach($rows as $row) :
+                        $startTime = $endTime = $programName = $subprogramName = $desc = $actors = $producers = $category = $episode = "";
+                        $rebroadcast = False;
+                        $rating = 0;
+                        $cells = $row->getElementsByTagName('td');
+                        $startTime = $cells->item(0)->nodeValue ?: "";
+                        $startTime = date("YmdHis", strtotime($day." ".$startTime));
+                        $programName = trim($cells->item(1)->nodeValue) ?: "";
+                        $category = trim($cells->item(2)->nodeValue) ?: "";
+                        $category = preg_replace('/\(.*\)/', '', $category);
+                        $images = $row->getElementsByTagName('img');
+                        foreach($images as $image):
+                            preg_match('/re\.png/', $image->getAttribute('src'), $rebroad);
+                            if($rebroad != NULL) $rebroadcast = True;
+                            preg_match('/.*plus([\d,]+)\.png/', $image->getAttribute('src'), $grade);
+                            if($grade != NULL) $rating = $grade[1];
+                        endforeach;
+                        //ChannelId, startTime, programName, subprogramName, desc, actors, producers, category, episode, rebroadcast, rating
+                        $epginfo[] = array($ChannelId, $startTime, $programName, $subprogramName, $desc, $actors, $producers, $category, $episode, $rebroadcast, $rating);
+                    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 POOQ
+function GetEPGFromPooq($ChannelInfo) {
+    $ChannelId = $ChannelInfo[0];
+    $ChannelName = $ChannelInfo[1];
+    $ServiceId =  $ChannelInfo[3];
+    $today = date("Ymd");
+    $lastday = date("Ymd", strtotime("+".($GLOBALS['period'] - 1)." days"));
+    $url = "https://wapie.pooq.co.kr/v1/epgs30/".$ServiceId."/";
     $params = array(
-        'chan_idx'=>'242',
-        'source_id'=>'203',
-        'Chan_Date'=>'2017-04-18'
+        'deviceTypeId'=> 'pc',
+        'marketTypeId'=> 'generic',
+        'apiAccessCredential'=> 'EEBE901F80B3A4C4E5322D58110BE95C',
+        'offset'=> '0',
+        'limit'=> '1000',
+        'startTime'=>  date("Y/m/d", strtotime($today)).' 00:00',
+        'endTime'=>  date("Y/m/d", strtotime($lastday)).' 00:00'
     );
+    foreach(range(1, $GLOBALS['period']) as $k) :
+        $day = date("Y-m-d", strtotime("+".($k - 1)." days"));
+        $date_list[] = $day;
+    endforeach;
+    $params = http_build_query($params);
+    $method = "GET";
+    try {
+        $response = getWeb($url, $params, $method);
+        if ($response === False && $GLOBALS['debug']) :
+            printError($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['result']['count'] == 0) :
+                    if($GLOBALS['debug']) : 
+                        printError($ChannelName.CHANNEL_ERROR);
+                    endif;
+                else :
+                    $programs = $data['result']['list'];
+                    foreach ($programs as $program) :
+                        $startTime = $endTime = $programName = $subprogramName = $desc = $actors = $producers = $category = $episode = "";
+                        $rebroadcast = False;
+                        $rating = 0;
+                        if(in_array($program['startDate'] , $date_list)) :
+                            $startTime = $program['startDate']." ".$program['startTime'];
+                            $startTime = date("YmdHis", strtotime($startTime));
+                            $endTime = $program['startDate']." ".$program['endTime'];
+                            $endTime = date("YmdHis", strtotime($endTime));
+                            $pattern = '/^(.*?)(?:([\d,]+)회)?(?:\((재)\))?$/';
+                            $programName = str_replace("\r\n", "", $program['programTitle']);
+                            preg_match($pattern, $programName, $matches);
+                            if($matches !== NULL) :
+                                if(isset($matches[1])) $programName = trim($matches[1]) ?: "";
+                                if(isset($matches[2])) $episode = trim($matches[2]) ?: "";
+                                if(isset($matches[3])) $rebroadcast = $matches[3] ? True : False;
+                            endif;
+                            if($program['programStaring']) $actors = trim($program['programStaring'], ',');
+                            if($program['programSummary']) $desc = trim($program['programSummary']);
+                            $rating = $program['age'];
+                            $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);
+                        endif;
+                    endforeach;
+                endif;
+            } catch(Exception $e) {
+                if($GLOBALS['debug']) printError($e->getMessage());
+            }
+        endif;
+    } catch (Exception $e) {
+        if($GLOBALS['debug']) printError($e->getMessage());
+    }
 }
 
 // Get EPG data from MBC
@@ -1022,23 +1149,19 @@ function GetEPGFromMbc($ChannelInfo) {
                         $programs = $data['Programs'];
                         foreach($programs as $program) :
                             if($program['Channel'] == "CHAM" && $program['LiveDays'] == $dayofweek[date("w", strtotime($day))]) :
-                                $programName = "";
+                                $startTime = $endTime = $programName = $subprogramName = $desc = $actors = $producers = $category = $episode = "";
                                 $rebroadcast = False;
-                                preg_match('/^(.*?)(\(재\))?$/', htmlspecialchars_decode($program['ProgramTitle']), $matches);
+                                $rating = 0;
+                                $pattern = '/^(.*?)(\(재\))?$/';
+                                preg_match($pattern, htmlspecialchars_decode($program['ProgramTitle']), $matches);
                                 if ($matches != NULL) :
                                     $programName = $matches[1];
-                                    $rebroadcast = $matches[2] ? True : False;
+                                    if(isset($matches[2])) $rebroadcast = $matches[2] ? True : False;
                                 endif;
-                                $subprogramName =  "";
                                 $startTime = $day." ".$program['StartTime'];
                                 $startTime = date("YmdHis", strtotime($startTime));
                                 $endTime = date("YmdHis", strtotime("+".$program['RunningTime']." minutes", strtotime($startTime)));
-                                $desc = "";
-                                $actors =  "";
-                                $producers =  "";
                                 $category = "음악";
-                                $episode = "";
-                                $rating = 0;
                                 $programdata = array(
                                     'channelId'=> $ChannelId,
                                     'startTime' => $startTime,
@@ -1095,24 +1218,22 @@ function GetEPGFromMil($ChannelInfo) {
                     else :
                         $programs = $data['resultList'];
                         foreach($programs as $program) :
-                            $programName = "";
+                            $startTime = $endTime = $programName = $subprogramName = $desc = $actors = $producers = $category = $episode = "";
                             $rebroadcast = False;
-                            preg_match('/^(.*?)(\(재\))?$/', htmlspecialchars_decode($program['program_title']), $matches);
+                            $rating = 0;
+                            $pattern = '/^(.*?)(\(재\))?$/';
+                            preg_match($pattern, htmlspecialchars_decode($program['program_title']), $matches);
                             if ($matches != NULL) :
                                 $programName = $matches[1];
-                                $rebroadcast = $matches[2] ? True : False;
+                                if(isset($matches[2])) $rebroadcast = $matches[2] ? True : False;
                             endif;
                             $subprogramName =  htmlspecialchars_decode($program['program_subtitle']);
                             $startTime = $day." ".$program['program_time'];
                             $startTime = date("YmdHis", strtotime($startTime));
                             $endTime = $day." ".$program['program_end_time'];
                             $endTime = date("YmdHis", strtotime($endTime));
-                            $desc = "";
                             $actors =  htmlspecialchars_decode($program['movie_actor']);
                             $producers =  htmlspecialchars_decode($program['movie_director']);
-                            $category = "";
-                            $episode = "";
-                            $rating = 0;
                             $programdata = array(
                                 'channelId'=> $ChannelId,
                                 'startTime' => $startTime,
@@ -1170,19 +1291,16 @@ function GetEPGFromIfm($ChannelInfo) {
                     else :
                         $programs = $data['hybMusicInfoList'];
                         foreach($programs as $program) :
+                            $startTime = $endTime = $programName = $subprogramName = $desc = $actors = $producers = $category = $episode = "";
+                            $rebroadcast = False;
+                            $rating = 0;
                             $programName = htmlspecialchars_decode($program['pgmTitle']) ?: "";
-                            $subprogramName = "";
                             $startTime = $day." ".$program['pgmStime'];
                             $startTime = date("YmdHis", strtotime($startTime));
                             $endTime = $day." ".$program['pgmEtime'];
                             $endTime = date("YmdHis", strtotime($endTime));
-                            $desc = "";
                             $actors =  htmlspecialchars_decode($program['pgmDj']);
                             $producers =  htmlspecialchars_decode($program['pgmPd']);
-                            $category = "";
-                            $episode = "";
-                            $rebroadcast = False;
-                            $rating = 0;
                             $programdata = array(
                                 'channelId'=> $ChannelId,
                                 'startTime' => $startTime,
@@ -1238,18 +1356,22 @@ function GetEPGFromKbs($ChannelInfo) {
                         endif;
                     else :
                         $dom = new DomDocument;
-                        libxml_use_internal_errors(true);
+                        libxml_use_internal_errors(True);
                         $dom->loadHTML($data['schedule']);
                         $xpath = new DomXPath($dom);
                         $query = "//li";
                         $rows = $xpath->query($query);
                         foreach($rows as $row) :
+                            $startTime = $endTime = $programName = $subprogramName = $desc = $actors = $producers = $category = $episode = "";
+                            $rebroadcast = False;
+                            $rating = 0;
                             $cells = $row->getElementsByTagName('span');
+                            $startTime = $day." ".trim($cells->item(0)->childNodes->item(0)->nodeValue);
+                            $startTime = date("YmdHis", strtotime($startTime));
                             $programName = trim($cells->item(2)->childNodes->item(0)->nodeValue);
                             $programName = str_replace(array("[","]", " Broadcast"), array("", "", ""), $programName);
-                            $startTime = $day." ".trim($cells->item(0)->childNodes->item(0)->nodeValue);
-                            //programName, startTime, rating, category
-                            $epginfo[]= array($programName, $startTime);
+                            //ChannelId, startTime, programName, subprogramName, desc, actors, producers, category, episode, rebroadcast, rating
+                         $epginfo[] = array($ChannelId, $startTime, $programName, $subprogramName, $desc, $actors, $producers, $category, $episode, $rebroadcast, $rating);
                         endforeach;
                     endif;
                 } catch(Exception $e) {
@@ -1260,21 +1382,99 @@ function GetEPGFromKbs($ChannelInfo) {
             if($GLOBALS['debug']) printError($e->getMessage());
         }
     endforeach;
+    epgzip($epginfo);
+}
+
+function GetEPGFromArirang($ChannelInfo) {
+    $ChannelId = $ChannelInfo[0];
+    $ChannelName = $ChannelInfo[1];
+    $ServiceId =  $ChannelInfo[3];
+    $epginfo = array();
+    foreach(range(1, $GLOBALS['period']) as $k) :
+        $url = "http://www.arirang.com/Radio/Radio_Index.asp";
+        $day = date("Y-m-d", strtotime("+".($k - 1)." days"));
+        $params = array();
+        $params = http_build_query($params);
+        $method = "GET";
+       try {
+            $response = getWeb($url, $params, $method);
+            if ($response === False && $GLOBALS['debug']) :
+                printError($ChannelName.HTTP_ERROR);
+            else :
+                $dom = new DomDocument;
+                libxml_use_internal_errors(True);
+                //echo $response;
+
+                $response = mb_convert_encoding($response, "HTML-ENTITIES", "EUC-KR");
+                if($dom->loadHTML($response)):
+                    $xpath = new DomXPath($dom);
+                    $dayofweek = date("w", strtotime($day));
+                    if($dayofweek == 0):
+                        $query = "//table[@id='aIRSW_sun']/tr";
+                    elseif($dayofweek == 6):
+                        $query = "//table[@id='aIRSW_sat']/tr";
+                    else :
+                        $query = "//table[@id='aIRSW_week']/tr";
+                    endif;
+                    $rows = $xpath->query($query);
+                    foreach($rows as $row) :
+                        $startTime = $endTime = $programName = $subprogramName = $desc = $actors = $producers = $category = $episode = "";
+                        $rebroadcast = False;
+                        $rating = 0;
+                        $time = $row->getElementsByTagName('th');
+                        $times = explode('~', trim($time->item(0)->nodeValue));
+                        $startTime = date("YmdHis", strtotime($day." ".$times[0]));
+                        $endTime = date("YmdHis", strtotime($day." ".$times[1]));
+                        $program = $row->getElementsByTagName('td');
+                        $pattern = '/^(.*?)(?:\((Re)\))?$/';
+                        preg_match($pattern, trim($program->item(0)->nodeValue), $matches);
+                        if ($matches != NULL) :
+                            $programName = $matches[1];
+                            if(isset($matches[2])) $rebroadcast = $matches[2] ? True : False;
+                        endif;
+                        $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;
+                else :
+                    if($GLOBALS['debug']) printError($ChannelName.CONTENT_ERROR);
+                endif;
+            endif;
+        } catch (Exception $e) {
+            if($GLOBALS['debug']) printError($e->getMessage());
+        }
+    endforeach;
+}
+
+# Zip epginfo
+function epgzip($epginfo) {
+    #ChannelId, startTime, programName, subprogramName, desc, actors, producers, category, episode, rebroadcast, rating
     $zipped = array_slice(array_map(NULL, $epginfo, array_slice($epginfo,1)),0,-1);
     foreach($zipped as $epg) :
-        $programName = $epg[0][0] ?: "";
-        $subprogramName = "";
+        $ChannelId = $epg[0][0] ?: "";
         $startTime = $epg[0][1] ?: "";
-        $startTime = date("YmdHis", strtotime($startTime));
         $endTime = $epg[1][1] ?: "";
-        $endTime = date("YmdHis", strtotime($endTime));
-        $desc = "";
-        $actors = "";
-        $producers = "";
-        $category = "";
-        $rebroadcast = False;
-        $episode = "";
-        $rating = 0;
+        $programName = $epg[0][2] ?: "";
+        $subprogramName = $epg[0][3] ?: "";
+        $desc = $epg[0][4] ?: "";
+        $actors = $epg[0][5] ?: "";
+        $producers = $epg[0][6] ?: "";
+        $category = $epg[0][7] ?: "";
+        $episode = $epg[0][8] ?: "";
+        $rebroadcast = $rebroadcast = $epg[0][9] ? True: False;
+        $rating = $epg[0][10] ?: 0;
         $programdata = array(
             'channelId'=> $ChannelId,
             'startTime' => $startTime,
@@ -1292,7 +1492,6 @@ function GetEPGFromKbs($ChannelInfo) {
         writeProgram($programdata);
     endforeach;
 }
-
 function writeProgram($programdata) {
     $fp = $GLOBALS['fp'];
     $ChannelId = $programdata['channelId'];
@@ -1307,7 +1506,8 @@ function writeProgram($programdata) {
     endif;
     if($programName == NULL):
         $programName = $subprogramName;
-    endif;    $actors = htmlspecialchars($programdata['actors'], ENT_XML1);
+    endif;
+    $actors = htmlspecialchars($programdata['actors'], ENT_XML1);
     $producers = htmlspecialchars($programdata['producers'], ENT_XML1);
     $category = htmlspecialchars($programdata['category'], ENT_XML1);
     $episode = $programdata['episode'];
@@ -1320,17 +1520,19 @@ function writeProgram($programdata) {
         $rating = sprintf("%s세 이상 관람가", $programdata['rating']);
     endif;
     if($GLOBALS['addverbose'] == 'y') :
-        $desc = htmlspecialchars($programdata['programName'], ENT_XML1);
+        $desc = trim(htmlspecialchars($programdata['programName'], ENT_XML1));
         if($subprogramName)  $desc = $desc."\n부제 : ".$subprogramName;
+        if($rebroadcast == True && $GLOBALS['addrebroadcast']  == 'y') $desc = $desc."\n방송 : 재방송";
         if($episode) $desc = $desc."\n회차 : ".$episode."회";
         if($category) $desc = $desc."\n장르 : ".$category;
-        if($actors) $desc = $desc."\n출연 : ".$actors;
-        if($producers) $desc = $desc."\n제작 : ".$producers;
+        if($actors) $desc = $desc."\n출연 : ".trim($actors);
+        if($producers) $desc = $desc."\n제작 : ".trim($producers);
         $desc = $desc."\n등급 : ".$rating;
     else:
         $desc = "";
     endif;
     if($programdata['desc']) $desc = $desc."\n".htmlspecialchars($programdata['desc'], ENT_XML1);
+    $desc = preg_replace('/ +/', ' ', $desc);
     $contentTypeDict = array(
         '교양' => 'Arts / Culture (without music)',
         '만화' => 'Cartoons / Puppets',
@@ -1395,20 +1597,22 @@ function getWeb($url, $params, $method) {
         curl_setopt ($ch, CURLOPT_POSTFIELDS, $params);
     endif;
     curl_setopt($ch, CURLOPT_URL, $url);
-    curl_setopt($ch, CURLOPT_RETURNTRANSFER,True);
-    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 3);
+    curl_setopt($ch, CURLOPT_RETURNTRANSFER, True);
+    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $GLOBALS['timeout']);
     curl_setopt($ch, CURLOPT_HEADER, False);
-    curl_setopt($ch, CURLOPT_FAILONERROR,True);
+    curl_setopt($ch, CURLOPT_FAILONERROR, True);
     curl_setopt($ch, CURLOPT_USERAGENT, $GLOBALS['ua']);
     $response = curl_exec($ch);
     if(curl_error($ch) && $GLOBALS['debug']) printError($url." ".curl_error($ch));
     curl_close($ch);
     return $response;
 }
+
 function printLog($string) {
     header("Content-Type: text/plain; charset=utf-8");
     print($string."\n");
 }
+
 function printError($string) {
     header("Content-Type: text/plain; charset=utf-8");
     print("Error : ".$string."\n");
diff --git a/epg2xml.json b/epg2xml.json
index 6792673..750a546 100644
--- a/epg2xml.json
+++ b/epg2xml.json
@@ -3,9 +3,9 @@
     "###_COMMENT_###" : "epg 정보를 가져오는 설정 파일",
     "###_COMMENT_###" : "사용하는 ISP 선택 (ALL, KT, LG, SK)",
     "MyISP": "ALL",
-    "###_COMMENT_###" : "### # My Channel Enabled:1 로 하고자 하는 채널 ID ###",
+    "###_COMMENT_###" : "### # My Channel EPG 정보 가져오는 2017-09-01채널 ID ###",
     "###_COMMENT_###" : "1, 2, 3, 4",
-     "MyChannels" : "60, 110, 111, 122, 164",
+    "MyChannels" : "60, 110, 111, 122, 164",
     "###_COMMENT_###" : "output 셋팅은 (d, o, s) 셋중에 하나로 선택한다",
     "###_COMMENT_###" : " d - EPG 정보 화면 출력",
     "###_COMMENT_###" : " o - EPG 정보 파일로 저정",
@@ -15,12 +15,12 @@
     "default_icon_url": "",
     "###_COMMENT_###" : "### 제목에 재방송 정보 출력 ###",
     "default_rebroadcast": "y",
-    "###_COMMENT_###" : "#### 제목에 회차정보 출력 ###",
+    "###_COMMENT_###" : "#### 제목에 회차정보 출력 ###",     
     "default_episode" : "y",
     "###_COMMENT_###" : "### EPG 정보 추가 출력 ###",
     "default_verbose" : "y",
     "###_COMMENT_###" : "### epg 데이터 가져오는 기간으로 1에서 2까지 설정가능 ###",
-    "default_fetch_limit" : "2",
+    "default_fetch_limit" : "7",
     "###_COMMENT_###" : "### epg 저장시 기본 저장 이름 (ex: /home/tvheadend/xmltv.xml) ###",
     "default_xml_file" : "xmltv.xml",
     "###_COMMENT_###" : "### # External XMLTV 사용시 기본 소켓 이름 (ex: /home/tvheadend/xmltv.sock) ###",
diff --git a/epg2xml.php b/epg2xml.php
index bde7925..7a4a689 100644
--- a/epg2xml.php
+++ b/epg2xml.php
@@ -1,8 +1,7 @@
 #!/usr/bin/env php
  2 ? 2 : $period;
                         
                     else :
                         printError("default_fetch_limit는 1, 2, 3, 4, 5, 6, 7만 가능합니다.");
@@ -379,7 +377,6 @@ function getEPG() {
         $ChannelSource =  $ChannelInfo[2];
         $ChannelServiceId =  $ChannelInfo[3];
         if($GLOBALS['debug']) printLog($ChannelName.' 채널 EPG 데이터를 가져오고 있습니다');
-        
         if($ChannelSource == 'EPG') :
             GetEPGFromEPG($ChannelInfo);
         elseif($ChannelSource == 'KT') :
@@ -1479,6 +1476,7 @@ function GetEPGFromArirang($ChannelInfo) {
         }
     endforeach;
 }
+
 # Zip epginfo
 function epgzip($epginfo) {
     #ChannelId, startTime, programName, subprogramName, desc, actors, producers, category, episode, rebroadcast, rating
@@ -1632,6 +1630,7 @@ function getWeb($url, $params, $method) {
 function printLog($string) {
     fwrite(STDERR, $string."\n");
 }
+
 function printError($string) {
     fwrite(STDERR, "Error : ".$string."\n");
 }
diff --git a/epg2xml.py b/epg2xml.py
index e099875..b1a005b 100644
--- a/epg2xml.py
+++ b/epg2xml.py
@@ -1091,7 +1091,6 @@ if default_fetch_limit :
         sys.exit()
     else :
         period = int(default_fetch_limit)
-        #if period > 2 : period = 2
 else :
     printError("epg2xml.json 파일의 default_fetch_limit항목이 없습니다.");
     sys.exit()

From 1d9fa83714c80479d6395f6f400e26af6a4e1c43 Mon Sep 17 00:00:00 2001
From: wonipapa 
Date: Fri, 1 Sep 2017 17:01:03 +0900
Subject: [PATCH 28/41] Update 1.2.2

---
 epg2xml.json | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/epg2xml.json b/epg2xml.json
index 750a546..edabc63 100644
--- a/epg2xml.json
+++ b/epg2xml.json
@@ -3,7 +3,7 @@
     "###_COMMENT_###" : "epg 정보를 가져오는 설정 파일",
     "###_COMMENT_###" : "사용하는 ISP 선택 (ALL, KT, LG, SK)",
     "MyISP": "ALL",
-    "###_COMMENT_###" : "### # My Channel EPG 정보 가져오는 2017-09-01채널 ID ###",
+    "###_COMMENT_###" : "### # My Channel EPG 정보 가져오는 채널 ID ###",
     "###_COMMENT_###" : "1, 2, 3, 4",
     "MyChannels" : "60, 110, 111, 122, 164",
     "###_COMMENT_###" : "output 셋팅은 (d, o, s) 셋중에 하나로 선택한다",
@@ -19,8 +19,8 @@
     "default_episode" : "y",
     "###_COMMENT_###" : "### EPG 정보 추가 출력 ###",
     "default_verbose" : "y",
-    "###_COMMENT_###" : "### epg 데이터 가져오는 기간으로 1에서 2까지 설정가능 ###",
-    "default_fetch_limit" : "7",
+    "###_COMMENT_###" : "### epg 데이터 가져오는 기간으로 1에서 7까지 설정가능 ###",
+    "default_fetch_limit" : "2",
     "###_COMMENT_###" : "### epg 저장시 기본 저장 이름 (ex: /home/tvheadend/xmltv.xml) ###",
     "default_xml_file" : "xmltv.xml",
     "###_COMMENT_###" : "### # External XMLTV 사용시 기본 소켓 이름 (ex: /home/tvheadend/xmltv.sock) ###",

From 5f55eb458f89197a4d3950021d0cd68573ac915f Mon Sep 17 00:00:00 2001
From: wonipapa 
Date: Fri, 1 Sep 2017 17:49:18 +0900
Subject: [PATCH 29/41] =?UTF-8?q?ISCS=20=ED=95=A8=EC=88=98=20=EB=B2=84?=
 =?UTF-8?q?=EA=B7=B8=20=EC=88=98=EC=A0=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 epg2xml-web.php | 2 +-
 epg2xml.php     | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/epg2xml-web.php b/epg2xml-web.php
index 5715447..661faa0 100644
--- a/epg2xml-web.php
+++ b/epg2xml-web.php
@@ -932,9 +932,9 @@ function GetEPGFromIscs($ChannelInfo) {
                         endif;
                     else :
                         $response = $data['html'];
-                        $response = mb_convert_encoding($response, "HTML-ENTITIES", "UTF-8");
                         $pattern = '/(.*)<\/td>/';
                         $response = preg_replace_callback($pattern, function($matches) { return ''.htmlspecialchars($matches[1]).'';}, $response);
+                        $response = mb_convert_encoding($response, "HTML-ENTITIES", "UTF-8");
                         $dom = new DomDocument;
                         libxml_use_internal_errors(True);
                         if($dom->loadHTML($response)):
diff --git a/epg2xml.php b/epg2xml.php
index 7a4a689..0e37cab 100644
--- a/epg2xml.php
+++ b/epg2xml.php
@@ -951,9 +951,9 @@ function GetEPGFromIscs($ChannelInfo) {
                         endif;
                     else :
                         $response = $data['html'];
-                        $response = mb_convert_encoding($response, "HTML-ENTITIES", "UTF-8");
                         $pattern = '/(.*)<\/td>/';
                         $response = preg_replace_callback($pattern, function($matches) { return ''.htmlspecialchars($matches[1]).'';}, $response);
+                        $response = mb_convert_encoding($response, "HTML-ENTITIES", "UTF-8");
                         $dom = new DomDocument;
                         libxml_use_internal_errors(True);
                         if($dom->loadHTML($response)):

From 3fda74d7d0b7ee384c48fabe5365e7141c01e966 Mon Sep 17 00:00:00 2001
From: wonipapa 
Date: Fri, 1 Sep 2017 17:58:57 +0900
Subject: [PATCH 30/41] Update epg2xml.json

---
 epg2xml.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/epg2xml.json b/epg2xml.json
index edabc63..6a93651 100644
--- a/epg2xml.json
+++ b/epg2xml.json
@@ -4,7 +4,7 @@
     "###_COMMENT_###" : "사용하는 ISP 선택 (ALL, KT, LG, SK)",
     "MyISP": "ALL",
     "###_COMMENT_###" : "### # My Channel EPG 정보 가져오는 채널 ID ###",
-    "###_COMMENT_###" : "1, 2, 3, 4",
+    "###_COMMENT_###" : "60, 110, 111, 122, 164",
     "MyChannels" : "60, 110, 111, 122, 164",
     "###_COMMENT_###" : "output 셋팅은 (d, o, s) 셋중에 하나로 선택한다",
     "###_COMMENT_###" : " d - EPG 정보 화면 출력",

From d287cdefd773cc7cc570ec9cdfa6a9dbfc2790bb Mon Sep 17 00:00:00 2001
From: wonipapa 
Date: Fri, 1 Sep 2017 18:26:31 +0900
Subject: [PATCH 31/41] Update 1.2.2

---
 README.md       | 2 +-
 epg2xml-web.php | 6 +++++-
 epg2xml.php     | 6 +++++-
 epg2xml.py      | 9 ++++++---
 4 files changed, 17 insertions(+), 6 deletions(-)

diff --git a/README.md b/README.md
index 599e8f4..24b5b88 100644
--- a/README.md
+++ b/README.md
@@ -118,7 +118,7 @@ https://github.com/wonipapa/epg2xml/wiki/FAQ
 ### Version 1.2.2
   - My Channel 추가
   - 소스 추가
-  - Channel.json 분리로 삭제
+  - 에피소드 넘버 xmltv_ns 추가
 ### Version 1.2.1
   - SKB 함수 추가
   - 가져오는 날짜 최대 2일로 변경
diff --git a/epg2xml-web.php b/epg2xml-web.php
index 661faa0..cb8e76c 100644
--- a/epg2xml-web.php
+++ b/epg2xml-web.php
@@ -1511,6 +1511,9 @@ function writeProgram($programdata) {
     $producers = htmlspecialchars($programdata['producers'], ENT_XML1);
     $category = htmlspecialchars($programdata['category'], ENT_XML1);
     $episode = $programdata['episode'];
+    $episode_ns = (int)$episode - 1;
+    $episode_ns = '0' . '.' . $episode_ns . '.' . '0' . '/' . '0';
+    $episode_on = $episode;
     $rebroadcast = $programdata['rebroadcast'];
     if($episode && $GLOBALS['addepisode'] == 'y') $programName = $programName." (".$episode."회)";
     if($rebroadcast == True && $GLOBALS['addrebroadcast'] == 'y') $programName = $programName." (재)";
@@ -1579,7 +1582,8 @@ function writeProgram($programdata) {
     endif;
     if($category) fprintf($fp, "    %s\n", $category);
     if($contentType) fprintf($fp, "    %s\n", $contentType);
-    if($episode) fprintf($fp, "    %s\n", $episode);
+    if($episode) fprintf($fp, "    %s\n", $episode_ns);
+    if($episode) fprintf($fp, "    %s\n", $episode_on);
     if($rebroadcast) fprintf($fp, "    \n");
     if($rating) :
         fprintf($fp, "    \n");
diff --git a/epg2xml.php b/epg2xml.php
index 0e37cab..7d77995 100644
--- a/epg2xml.php
+++ b/epg2xml.php
@@ -1530,6 +1530,9 @@ function writeProgram($programdata) {
     $producers = htmlspecialchars($programdata['producers'], ENT_XML1);
     $category = htmlspecialchars($programdata['category'], ENT_XML1);
     $episode = $programdata['episode'];
+    $episode_ns = (int)$episode - 1;
+    $episode_ns = '0' . '.' . $episode_ns . '.' . '0' . '/' . '0';
+    $episode_on = $episode;
     $rebroadcast = $programdata['rebroadcast'];
     if($episode && $GLOBALS['addepisode'] == 'y') $programName = $programName." (".$episode."회)";
     if($rebroadcast == True && $GLOBALS['addrebroadcast'] == 'y') $programName = $programName." (재)";
@@ -1598,7 +1601,8 @@ function writeProgram($programdata) {
     endif;
     if($category) fprintf($fp, "    %s\n", $category);
     if($contentType) fprintf($fp, "    %s\n", $contentType);
-    if($episode) fprintf($fp, "    %s\n", $episode);
+    if($episode) fprintf($fp, "    %s\n", $episode_ns);
+    if($episode) fprintf($fp, "    %s\n", $episode_on);
     if($rebroadcast) fprintf($fp, "    \n");
     if($rating) :
         fprintf($fp, "    \n");
diff --git a/epg2xml.py b/epg2xml.py
index b1a005b..0322b39 100644
--- a/epg2xml.py
+++ b/epg2xml.py
@@ -910,6 +910,10 @@ def writeProgram(programdata):
     producers = escape(programdata['producers'])
     category = escape(programdata['category'])
     episode = programdata['episode']
+    if episode :
+        episode_ns = episode - 1
+        episode_ns = '0'+ '.' +  str(episode_ns) + '.' + '0' + '/' + '0'
+    episode_on = episode
     rebroadcast = programdata['rebroadcast']
     if episode and addepisode  == 'y': programName = programName + ' ('+ str(episode) + '회)'
     if rebroadcast  == True and addrebroadcast == 'y' : programName = programName + ' (재)'
@@ -950,12 +954,11 @@ def writeProgram(programdata):
                 for producer in producers.split(','):
                     if producer.strip(): print('      %s' % (producer).strip())
             print('    ')
-
     if category: print('    %s' % (category))
     if contentType: print('    %s' % (contentType))
-    if episode: print('    %s' % (episode))
+    if episode: print('    %s' % (episode_ns))
+    if episode: print('    %s' % (episode_on))
     if rebroadcast: print('    ')
-
     if rating:
         print('    ')
         print('      %s' % (rating))

From 20f1b1672f1a73a0cdcd906fc435d60ba83b8a22 Mon Sep 17 00:00:00 2001
From: wonipapa 
Date: Fri, 1 Sep 2017 18:29:09 +0900
Subject: [PATCH 32/41] update 1.2.2

---
 epg2xml-web.php | 8 +++++---
 epg2xml.php     | 8 +++++---
 epg2xml.py      | 2 +-
 3 files changed, 11 insertions(+), 7 deletions(-)

diff --git a/epg2xml-web.php b/epg2xml-web.php
index cb8e76c..585fa4f 100644
--- a/epg2xml-web.php
+++ b/epg2xml-web.php
@@ -1511,9 +1511,11 @@ function writeProgram($programdata) {
     $producers = htmlspecialchars($programdata['producers'], ENT_XML1);
     $category = htmlspecialchars($programdata['category'], ENT_XML1);
     $episode = $programdata['episode'];
-    $episode_ns = (int)$episode - 1;
-    $episode_ns = '0' . '.' . $episode_ns . '.' . '0' . '/' . '0';
-    $episode_on = $episode;
+    if($episode) :
+        $episode_ns = (int)$episode - 1;
+        $episode_ns = '0' . '.' . $episode_ns . '.' . '0' . '/' . '0';
+        $episode_on = $episode;
+    endif;
     $rebroadcast = $programdata['rebroadcast'];
     if($episode && $GLOBALS['addepisode'] == 'y') $programName = $programName." (".$episode."회)";
     if($rebroadcast == True && $GLOBALS['addrebroadcast'] == 'y') $programName = $programName." (재)";
diff --git a/epg2xml.php b/epg2xml.php
index 7d77995..aa45f70 100644
--- a/epg2xml.php
+++ b/epg2xml.php
@@ -1530,9 +1530,11 @@ function writeProgram($programdata) {
     $producers = htmlspecialchars($programdata['producers'], ENT_XML1);
     $category = htmlspecialchars($programdata['category'], ENT_XML1);
     $episode = $programdata['episode'];
-    $episode_ns = (int)$episode - 1;
-    $episode_ns = '0' . '.' . $episode_ns . '.' . '0' . '/' . '0';
-    $episode_on = $episode;
+    if($episode) :
+        $episode_ns = (int)$episode - 1;
+        $episode_ns = '0' . '.' . $episode_ns . '.' . '0' . '/' . '0';
+        $episode_on = $episode;
+    endif;
     $rebroadcast = $programdata['rebroadcast'];
     if($episode && $GLOBALS['addepisode'] == 'y') $programName = $programName." (".$episode."회)";
     if($rebroadcast == True && $GLOBALS['addrebroadcast'] == 'y') $programName = $programName." (재)";
diff --git a/epg2xml.py b/epg2xml.py
index 0322b39..c94f4ec 100644
--- a/epg2xml.py
+++ b/epg2xml.py
@@ -913,7 +913,7 @@ def writeProgram(programdata):
     if episode :
         episode_ns = episode - 1
         episode_ns = '0'+ '.' +  str(episode_ns) + '.' + '0' + '/' + '0'
-    episode_on = episode
+        episode_on = episode
     rebroadcast = programdata['rebroadcast']
     if episode and addepisode  == 'y': programName = programName + ' ('+ str(episode) + '회)'
     if rebroadcast  == True and addrebroadcast == 'y' : programName = programName + ' (재)'

From 4398f9d9a6c576712f17025b525346a1bc60eba6 Mon Sep 17 00:00:00 2001
From: wonipapa 
Date: Fri, 1 Sep 2017 18:35:25 +0900
Subject: [PATCH 33/41] update 1.2.2

---
 epg2xml.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/epg2xml.py b/epg2xml.py
index c94f4ec..5af24ce 100644
--- a/epg2xml.py
+++ b/epg2xml.py
@@ -911,7 +911,7 @@ def writeProgram(programdata):
     category = escape(programdata['category'])
     episode = programdata['episode']
     if episode :
-        episode_ns = episode - 1
+        episode_ns = int(episode) - 1
         episode_ns = '0'+ '.' +  str(episode_ns) + '.' + '0' + '/' + '0'
         episode_on = episode
     rebroadcast = programdata['rebroadcast']

From 6b8200aa2b90ee425f69b956c600245d2877a29f Mon Sep 17 00:00:00 2001
From: wonipapa 
Date: Tue, 5 Sep 2017 11:25:39 +0900
Subject: [PATCH 34/41] =?UTF-8?q?=EB=B0=B0=EC=97=B4=20=ED=95=A8=EC=88=98?=
 =?UTF-8?q?=20=EC=88=98=EC=A0=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 epg2xml.py | 109 +++++++++++++++++++++++++++++++++++++++--------------
 1 file changed, 80 insertions(+), 29 deletions(-)

diff --git a/epg2xml.py b/epg2xml.py
index 5af24ce..55df001 100644
--- a/epg2xml.py
+++ b/epg2xml.py
@@ -14,6 +14,7 @@ from xml.sax.saxutils import escape, unescape
 import argparse
 import pprint
 from functools import partial
+import time
 
 try:
     imp.find_module('bs4')
@@ -203,11 +204,13 @@ def GetEPGFromEPG(ChannelInfo):
                                 episode = matches.group(7) if matches.group(7) else ''
                             #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.01)
             else:
                 if(debug): printError(ChannelName + CONTENT_ERROR)
                 else: pass
         except (requests.exceptions.RequestException) as e:
             if(debug): printError(ChannelName + str(e))
+        time.sleep(0.01)
     epgzip(epginfo)
 
 # Get EPG data from KT
@@ -247,12 +250,14 @@ def GetEPGFromKT(ChannelInfo):
                         if not(matches is None): rating = int(matches.group())
                         #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.01)
             else:
                 if(debug): printError(ChannelName + CONTENT_ERROR)
                 else: pass
         except (requests.exceptions.RequestException) as e:
             if(debug): printError(ChannelName + str(e))
             else: pass
+        time.sleep(0.01)
     epgzip(epginfo)
 
 # Get EPG data from LG
@@ -295,12 +300,14 @@ def GetEPGFromLG(ChannelInfo):
                         category =  cell[2].text.strip()
                         #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.01)
             else:
                 if(debug): printError(ChannelName + CONTENT_ERROR)
                 else: pass
         except (requests.exceptions.RequestException) as e:
             if(debug): printError(ChannelName + str(e))
             else: pass
+        time.sleep(0.01)
     epgzip(epginfo)
 
 # Get EPG data from SK
@@ -346,6 +353,7 @@ def GetEPGFromSK(ChannelInfo):
                     rating = int(program['ratingCd']) if program['programName'] 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)
+                    time.sleep(0.01)
         except ValueError:
             if(debug): printError(ChannelName + CONTENT_ERROR)
             else: pass
@@ -403,12 +411,14 @@ def GetEPGFromSKB(ChannelInfo):
                         rating = int(rating.text.decode('string_escape').replace('세','').strip())
                     #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.01)
             else:
                 if(debug): printError(ChannelName + CONTENT_ERROR)
                 else: pass
         except (requests.exceptions.RequestException) as e:
             if(debug): printError(ChannelName + str(e))
-            else: pass        
+            else: pass
+        time.sleep(0.01)
     epgzip(epginfo)
 
 # Get EPG data from SKY
@@ -455,6 +465,7 @@ def GetEPGFromSKY(ChannelInfo):
                         rating = int(program['grade']) if program['grade'] 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)
+                        time.sleep(0.01)
             except ValueError:
                 if(debug): printError(ChannelName + CONTENT_ERROR)
                 else: pass
@@ -495,6 +506,7 @@ def GetEPGFromNaver(ChannelInfo):
                         rating = program['grade']
                          #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.01)
         except ValueError:
              if(debug): printError(ChannelName + CONTENT_ERROR)
              else: pass
@@ -528,7 +540,7 @@ def GetEPGFromIscs(ChannelInfo):
                     startTime = endTime = programName = subprogramName = desc = actors = producers = category = episode = ''
                     rebroadcast = False
                     rating = 0
-                    startTime = str(day) + ' ' + row.find('td', {'class':'time'}).text
+                    startTime = str(day) + ' ' + row.find('td', {'class':'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('td', {'class':'title'}).text.decode('string_escape').strip()
@@ -543,13 +555,14 @@ def GetEPGFromIscs(ChannelInfo):
                         rebroadcast = True if matches.group(3) else False
                     #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.01)
         except ValueError:
             if(debug): printError(ChannelName + CONTENT_ERROR)
             else: pass
         except (requests.RequestException) as e:
             if(debug): printError(ChannelName + str(e))
             else: pass
+        time.sleep(0.01)
     epgzip(epginfo)
 
 # Get EPG data from HCN
@@ -558,7 +571,8 @@ def GetEPGFromHcn(ChannelInfo):
     ChannelName = ChannelInfo[1]
     ServiceId =  ChannelInfo[3]
     epginfo = []
-    url = 'https://www.hcn.co.kr/ur/bs/ch/channelInfo.hcn'
+    html = []
+    url = 'http://www.hcn.co.kr/ur/bs/ch/channelInfo.hcn'
     for k in range(period):
         day = today + datetime.timedelta(days=k)
         params = {'method': 'ajax_00', 'pageType': 'sheetList', 'ch_id': ServiceId, 'onairdate': day}
@@ -569,32 +583,36 @@ def GetEPGFromHcn(ChannelInfo):
             data = unicode(html_data, 'euc-kr', 'ignore').encode('utf-8', 'ignore')
             strainer = SoupStrainer('tr', {'class':''})
             soup = BeautifulSoup(data, 'lxml', parse_only=strainer, from_encoding='utf-8')
-            html =  soup.find_all('tr') if soup.find_all('tr') 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('td', {'class':'f'}).text
-                    startTime = datetime.datetime.strptime(startTime, '%Y-%m-%d %H:%M')
-                    startTime = startTime.strftime('%Y%m%d%H%M%S')
-                    programName = row.find('td', {'class':'left'}).text.decode('string_escape').strip()
-                    category = row.find('td', {'class':'l'}).text.decode('string_escape').strip()
-                    category = re.sub('\(.*\)', '', category)
-                    for image in row.find_all('img', {'class':'vM'}, alt=True):
-                        rebroad = re.match('(재방송)',image['alt'].decode('string_escape').strip())
-                        if not (rebroad is None): rebroadcast = True
-                        grade = re.match('([\d,]+)',image['alt'])
-                        if not (grade is None): rating = int(grade.group(1))
-                    #ChannelId, startTime, programName, subprogramName, desc, actors, producers, category, episode, rebroadcast, rating
-                    epginfo.append([ChannelId, startTime, programName, subprogramName, desc, actors, producers, category, episode, rebroadcast, rating])
-            else:
-                if(debug): printError(ChannelName + CONTENT_ERROR)
-                else: pass
+            for td in soup.findAll('td', {'class': 'f'}):
+                td.insert(0, str(day) + ' ')
+            html =  html + soup.find_all('tr') if soup.find_all('tr') else ''
         except (requests.exceptions.RequestException) as e:
             if(debug): printError(ChannelName + str(e))
-            else: pass        
-    epgzip(epginfo)
+            else: pass
+    if(html):
+        for cur, next in pairs(html):
+            startTime = endTime = programName = subprogramName = desc = actors = producers = category = episode = ''
+            rebroadcast = False
+            rating = 0
+            startTime = cur.find('td', {'class':'f'}).text.strip()
+            startTime = datetime.datetime.strptime(startTime, '%Y-%m-%d %H:%M')
+            startTime = startTime.strftime('%Y%m%d%H%M%S')
+            endTime = next.find('td', {'class':'f'}).text.strip()
+            endTime = datetime.datetime.strptime(endTime, '%Y-%m-%d %H:%M')
+            endTime = endTime.strftime('%Y%m%d%H%M%S')
+            programName = cur.find('td', {'class':'left'}).text.decode('string_escape').strip()
+            category = cur.find('td', {'class':'l'}).text.decode('string_escape').strip()
+            category = re.sub('\(.*\)', '', category)
+            for image in cur.find_all('img', {'class':'vM'}, alt=True):
+                rebroad = re.match('(재방송)',image['alt'].decode('string_escape').strip())
+                if not (rebroad is None): rebroadcast = True
+                grade = re.match('([\d,]+)',image['alt'])
+                if not (grade is None): rating = int(grade.group(1))
+            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)
+    else:
+        if(debug): printError(ChannelName + CONTENT_ERROR)
+        else: pass
 
 # Get EPG data from POOQ
 def GetEPGFromPooq(ChannelInfo):
@@ -639,6 +657,7 @@ def GetEPGFromPooq(ChannelInfo):
                         rating = int(program['age'])
                         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)
+                        time.sleep(0.01)
         except ValueError:
             if(debug): printError(ChannelName + CONTENT_ERROR)
             else: pass
@@ -680,12 +699,14 @@ def GetEPGFromMbc(ChannelInfo):
                         category = '음악'
                         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)
+                        time.sleep(0.01)
             except ValueError:
                  if(debug): printError(ChannelName + CONTENT_ERROR)
                  else: pass
         except (requests.exceptions.RequestException) as e:
             if(debug): printError(ChannelName + str(e))
             else: pass
+        time.sleep(0.01)
 
 # Get EPG data from MIL
 def GetEPGFromMil(ChannelInfo):
@@ -728,12 +749,14 @@ def GetEPGFromMil(ChannelInfo):
                     producers =  unescape(program['movie_director'])
                     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)
+                    time.sleep(0.01)
             except ValueError:
                  if(debug): printError(ChannelName + CONTENT_ERROR)
                  else: pass
         except (requests.exceptions.RequestException) as e:
             if(debug): printError(ChannelName + str(e))
             else: pass
+        time.sleep(0.01)
 
 # Get EPG data from IFM
 def GetEPGFromIfm(ChannelInfo):
@@ -772,12 +795,14 @@ def GetEPGFromIfm(ChannelInfo):
                     producers = program['pgmPd']
                     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)
+                    time.sleep(0.01)
             except ValueError:
                  if(debug): printError(ChannelName + CONTENT_ERROR)
                  else: pass
         except (requests.exceptions.RequestException) as e:
             if(debug): printError(ChannelName + str(e))
             else: pass
+        time.sleep(0.01)
 
 # Get EPG data from KBS
 def GetEPGFromKbs(ChannelInfo):
@@ -809,12 +834,14 @@ def GetEPGFromKbs(ChannelInfo):
                         startTime = startTime.strftime('%Y%m%d%H%M%S')
                     #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.01)
             except ValueError:
                  if(debug): printError(ChannelName + CONTENT_ERROR)
                  else: pass
         except (requests.exceptions.RequestException) as e:
             if(debug): printError(ChannelName + str(e))
             else: pass
+        time.sleep(0.01)
     epgzip(epginfo)
 
 # Get EPG data from ARIRANG
@@ -866,17 +893,20 @@ def GetEPGFromArirang(ChannelInfo):
                         rebroadcast = True if matches.group(2) else False
                     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)
+                    time.sleep(0.01)
             else:
                 if(debug): printError(ChannelName + CONTENT_ERROR)
                 else: pass
         except (requests.exceptions.RequestException) as e:
             if(debug): printError(ChannelName + str(e))
-            else: pass  
+            else: pass
+        time.sleep(0.01)
 
 # Zip epginfo
 def epgzip(epginfo):
     #ChannelId, startTime, programName, subprogramName, desc, actors, producers, category, episode, rebroadcast, rating
     for epg1, epg2 in zip(epginfo, epginfo[1:]):
+        programdata = {}
         ChannelId = epg1[0]
         startTime = epg1[1] if epg1[1] else ''
         endTime = epg2[1] if epg2[1] else ''
@@ -980,6 +1010,13 @@ def replacement(match, tag):
     else:
         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'
 ChannelInfos = []
 try:
@@ -1119,3 +1156,17 @@ elif output == "socket" :
         sys.exit()
 getEpg()
 
+
+
+#a = [0, 1,2,3,4,5]
+#it = iter(a)
+
+#print(next(it))
+#print(next(it))
+#for i in it :
+#    print(i)
+
+
+#import itertools as it
+#for prev, cur in pairs(it.cycle([1,2,3,4])):
+#    print( cur , prev )
\ No newline at end of file

From ec3ce6f12723c96d2844145113506a5e8c3dbaa1 Mon Sep 17 00:00:00 2001
From: wonipapa 
Date: Wed, 6 Sep 2017 14:22:02 +0900
Subject: [PATCH 35/41] =?UTF-8?q?HCN,=20ISCS=20=ED=95=A8=EC=88=98=20?=
 =?UTF-8?q?=EC=88=98=EC=A0=95,=20=EC=9B=B9=ED=8E=98=EC=9D=B4=EC=A7=80=20?=
 =?UTF-8?q?=ED=8C=A8=EC=B9=98=EC=8B=9C=20=EC=8B=9C=EA=B0=84=20=EA=B0=84?=
 =?UTF-8?q?=EA=B2=A9=20=EC=B6=94=EA=B0=80?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 epg2xml.php | 115 +++++++++++++++++++++------------------
 epg2xml.py  | 153 +++++++++++++++++++++-------------------------------
 2 files changed, 124 insertions(+), 144 deletions(-)

diff --git a/epg2xml.php b/epg2xml.php
index aa45f70..af9eaba 100644
--- a/epg2xml.php
+++ b/epg2xml.php
@@ -490,6 +490,7 @@ function GetEPGFromEPG($ChannelInfo) {
                             endforeach;
                             //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;
                     endfor;
                  else:
@@ -552,6 +553,7 @@ function GetEPGFromKT($ChannelInfo) {
                         $rating = str_replace("all", 0, str_replace("세 이상", "", trim($cells->item(2)->nodeValue)));
                         //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);
@@ -613,6 +615,7 @@ function GetEPGFromLG($ChannelInfo) {
                         $rating = trim($spans->item(1)->nodeValue)=="All" ? 0 : trim($spans->item(1)->nodeValue);
                         //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);
@@ -691,6 +694,7 @@ function GetEPGFromSK($ChannelInfo) {
                             'rating' => $rating
                         );
                         writeProgram($programdata);
+                        usleep(1000);
                     endforeach;
                 endif;
             } catch(Exception $e) {
@@ -758,6 +762,7 @@ function GetEPGFromSKB($ChannelInfo) {
                         if($cells->length > 3) $rating = str_replace('세', '', $cells->item(3)->nodeValue)  ?: 0;
                         //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);
@@ -838,7 +843,8 @@ function GetEPGFromSKY($ChannelInfo) {
                                 'rebroadcast' => $rebroadcast,
                                 'rating' => $rating
                             );
-                           writeProgram($programdata);
+                            writeProgram($programdata);
+                            usleep(1000);
                         endforeach;
                     endif;
                 } catch(Exception $e) {
@@ -908,6 +914,7 @@ function GetEPGFromNaver($ChannelInfo) {
                                 $rating = $program['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;
                         endfor;
                     endfor;
@@ -929,11 +936,12 @@ function GetEPGFromIscs($ChannelInfo) {
     $ServiceId =  $ChannelInfo[3];
     $epginfo = array();
     foreach(range(1, $GLOBALS['period']) as $k) :
-        $url = "https://www.iscs.co.kr/service/sub/ajax_channel_view.asp";
+        $url = "http://m.iscs.co.kr/sub/02/data.asp";
         $day = date("Y-m-d", strtotime("+".($k - 1)." days"));
         $params = array(
-            's_idx' => $ServiceId,
-            'C_date' => $day
+            'Exec_Mode' => 'view',
+            'Source_Id' => $ServiceId,
+            'Ch_Day' => $day
         );
         $params = http_build_query($params);
         $method = "POST";
@@ -945,43 +953,33 @@ function GetEPGFromIscs($ChannelInfo) {
                 try {
                     $data = json_decode($response, TRUE);
                     if(json_last_error() != JSON_ERROR_NONE) throw new Exception(JSON_SYNTAX_ERROR);
-                    if(count($data['html']) == 0) :
+                    if(count($data['total']) == 0) :
                         if($GLOBALS['debug']) :
                             printError($ChannelName.CHANNEL_ERROR);
                         endif;
                     else :
-                        $response = $data['html'];
-                        $pattern = '/(.*)<\/td>/';
-                        $response = preg_replace_callback($pattern, function($matches) { return ''.htmlspecialchars($matches[1]).'';}, $response);
-                        $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 = "//div[@class='pp_tbl']/table/tbody/tr";
-                            $rows = $xpath->query($query);
-                            foreach($rows as $row) :
-                                $startTime = $endTime = $programName = $subprogramName = $desc = $actors = $producers = $category = $episode = "";
-                                $rebroadcast = False;
+                        $programs = $data['list'];
+                        foreach($programs as $program) :
+                            $startTime = $endTime = $programName = $subprogramName = $desc = $actors = $producers = $category = $episode = "";
+                            $rebroadcast = False;
+                            $rating = 0;
+                            $startTime = date("YmdHis", strtotime($day." ".$program['Time']));
+                            $pattern = '/^(.*?)(?:\(([\d,]+)회\))?(?:\((재)\))?$/';
+                            preg_match($pattern, trim($program['Pg_Name']), $matches);
+                            if ($matches != NULL) :
+                                if(isset($matches[1])) $programName = trim($matches[1]) ?: "";
+                                if(isset($matches[2])) $episode = $matches[2] ?: "";
+                                if(isset($matches[3])) $rebroadcast = $matches[3] ? True : False;
+                            endif;
+                            if($program['Rating'] == '모든연령'):
                                 $rating = 0;
-                                $cells = $row->getElementsByTagName('td');
-                                $startTime = $cells->item(0)->nodeValue ?: "";
-                                $startTime = date("YmdHis", strtotime($day." ".$startTime));
-                                $programName = trim($cells->item(1)->nodeValue) ?: "";
-                                $pattern = '/^(.*?)(?:\(([\d,]+)회\))?(?:\((재)\))?$/';
-                                preg_match($pattern, $programName, $matches);
-                                if ($matches != NULL) :
-                                    if(isset($matches[1])) $programName = trim($matches[1]) ?: "";
-                                    if(isset($matches[2])) $episode = $matches[2] ?: "";
-                                    if(isset($matches[3])) $rebroadcast = $matches[3] ? True : False;
-                                endif;
-                                $rating = $cells->item(2)->nodeValue=='전체관람' ? 0 : str_replace('세이상', '', $cells->item(2)->nodeValue);
-                                //ChannelId, startTime, programName, subprogramName, desc, actors, producers, category, episode, rebroadcast, rating
-                                $epginfo[] = array($ChannelId, $startTime, $programName, $subprogramName, $desc, $actors, $producers, $category, $episode, $rebroadcast, $rating);
-                            endforeach;
-                        else :
-                            if($GLOBALS['debug']) printError($ChannelName.CONTENT_ERROR);
-                        endif;
+                            else:
+                                $rating = str_replace("세이상","", $program['Rating']);
+                            endif;
+                            //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;
                     endif;
                 } catch(Exception $e) {
                     if($GLOBALS['debug']) printError($e->getMessage());
@@ -1001,38 +999,36 @@ function GetEPGFromHcn($ChannelInfo) {
     $ServiceId =  $ChannelInfo[3];
     $epginfo = array();
     foreach(range(1, $GLOBALS['period']) as $k) :
-        $url = "https://www.hcn.co.kr/ur/bs/ch/channelInfo.hcn";
+        $url = "http://m.hcn.co.kr/sch_ScheduleList.action";
         $day = date("Y-m-d", strtotime("+".($k - 1)." days"));
         $params = array(
-            'method' => 'ajax_00', 
-            'pageType' => 'sheetList',
             'ch_id' => $ServiceId,
-            'onairdate' => $day
+            'onairdate' => $day,
+            '_' => _microtime()
         );
         $params = http_build_query($params);
-        $method = "POST";
+        $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", "EUC-KR");
+                $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 = "//tr[@class='']";
+                    $query = "//li";
                     $rows = $xpath->query($query);
                     foreach($rows as $row) :
                         $startTime = $endTime = $programName = $subprogramName = $desc = $actors = $producers = $category = $episode = "";
                         $rebroadcast = False;
                         $rating = 0;
-                        $cells = $row->getElementsByTagName('td');
-                        $startTime = $cells->item(0)->nodeValue ?: "";
+                        $startTime = trim($xpath->query("span[@class='progTime']", $row)->item(0)->nodeValue) ?: "";
                         $startTime = date("YmdHis", strtotime($day." ".$startTime));
-                        $programName = trim($cells->item(1)->nodeValue) ?: "";
-                        $category = trim($cells->item(2)->nodeValue) ?: "";
-                        $category = preg_replace('/\(.*\)/', '', $category);
+                        $programName = trim($xpath->query("span[@class='progTitle']", $row)->item(0)->nodeValue) ?: "";
+                        //$category = trim($cells->item(2)->nodeValue) ?: "";
+                        //$category = preg_replace('/\(.*\)/', '', $category);
                         $images = $row->getElementsByTagName('img');
                         foreach($images as $image):
                             preg_match('/re\.png/', $image->getAttribute('src'), $rebroad);
@@ -1042,6 +1038,7 @@ function GetEPGFromHcn($ChannelInfo) {
                         endforeach;
                         //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);
@@ -1126,6 +1123,7 @@ function GetEPGFromPooq($ChannelInfo) {
                                 'rating' => $rating
                             );
                             writeProgram($programdata);
+                            usleep(1000);
                         endif;
                     endforeach;
                 endif;
@@ -1196,6 +1194,7 @@ function GetEPGFromMbc($ChannelInfo) {
                                     'rating' => $rating
                                 );
                                 writeProgram($programdata);
+                                usleep(1000);
                             endif;
                         endforeach;
                     endif;
@@ -1267,7 +1266,8 @@ function GetEPGFromMil($ChannelInfo) {
                                 'rebroadcast' => $rebroadcast,
                                 'rating' => $rating
                             );
-                           writeProgram($programdata);
+                            writeProgram($programdata);
+                            usleep(1000);
                         endforeach;
                     endif;
                 } catch(Exception $e) {
@@ -1334,7 +1334,8 @@ function GetEPGFromIfm($ChannelInfo) {
                                 'rebroadcast' => $rebroadcast,
                                 'rating' => $rating
                             );
-                           writeProgram($programdata);
+                            writeProgram($programdata);
+                            usleep(1000);
                         endforeach;
                     endif;
                 } catch(Exception $e) {
@@ -1390,7 +1391,8 @@ function GetEPGFromKbs($ChannelInfo) {
                             $programName = trim($cells->item(2)->childNodes->item(0)->nodeValue);
                             $programName = str_replace(array("[","]", " Broadcast"), array("", "", ""), $programName);
                             //ChannelId, startTime, programName, subprogramName, desc, actors, producers, category, episode, rebroadcast, rating
-                         $epginfo[] = array($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;
                     endif;
                 } catch(Exception $e) {
@@ -1465,7 +1467,8 @@ function GetEPGFromArirang($ChannelInfo) {
                             'rebroadcast' => $rebroadcast,
                             'rating' => $rating
                         );
-                       writeProgram($programdata);
+                        writeProgram($programdata);
+                        usleep(1000);
                     endforeach;
                 else :
                     if($GLOBALS['debug']) printError($ChannelName.CONTENT_ERROR);
@@ -1640,4 +1643,10 @@ function printLog($string) {
 function printError($string) {
     fwrite(STDERR, "Error : ".$string."\n");
 }
-?>
\ No newline at end of file
+
+function _microtime()
+{
+    list($usec, $sec) = explode(" ", microtime());
+    return ($sec.(int)($usec*1000));
+}
+?>
diff --git a/epg2xml.py b/epg2xml.py
index 55df001..020ea62 100644
--- a/epg2xml.py
+++ b/epg2xml.py
@@ -204,13 +204,12 @@ def GetEPGFromEPG(ChannelInfo):
                                 episode = matches.group(7) if matches.group(7) else ''
                             #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.01)
+                            time.sleep(0.001)
             else:
                 if(debug): printError(ChannelName + CONTENT_ERROR)
                 else: pass
         except (requests.exceptions.RequestException) as e:
             if(debug): printError(ChannelName + str(e))
-        time.sleep(0.01)
     epgzip(epginfo)
 
 # Get EPG data from KT
@@ -250,14 +249,13 @@ def GetEPGFromKT(ChannelInfo):
                         if not(matches is None): rating = int(matches.group())
                         #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.01)
+                        time.sleep(0.001)
             else:
                 if(debug): printError(ChannelName + CONTENT_ERROR)
                 else: pass
         except (requests.exceptions.RequestException) as e:
             if(debug): printError(ChannelName + str(e))
             else: pass
-        time.sleep(0.01)
     epgzip(epginfo)
 
 # Get EPG data from LG
@@ -300,14 +298,13 @@ def GetEPGFromLG(ChannelInfo):
                         category =  cell[2].text.strip()
                         #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.01)
+                        time.sleep(0.001)
             else:
                 if(debug): printError(ChannelName + CONTENT_ERROR)
                 else: pass
         except (requests.exceptions.RequestException) as e:
             if(debug): printError(ChannelName + str(e))
             else: pass
-        time.sleep(0.01)
     epgzip(epginfo)
 
 # Get EPG data from SK
@@ -333,8 +330,9 @@ def GetEPGFromSK(ChannelInfo):
                     startTime = endTime = programName = subprogramName = desc = actors = producers = category = episode = ''
                     rebroadcast = False
                     rating = 0
+                    programName = program['programName'].replace('...', '>').encode('utf-8')
                     pattern = '^(.*?)(?:\s*[\(<]([\d,회]+)[\)>])?(?:\s*<([^<]*?)>)?(\((재)\))?$'
-                    matches = re.match(pattern, program['programName'].replace('...', '>').encode('utf-8'))
+                    matches = re.match(pattern, programName)
                     if not (matches is None):
                         programName = matches.group(1).strip() if matches.group(1) else ''
                         subprogramName = matches.group(3).strip() if matches.group(3) else ''
@@ -353,7 +351,7 @@ def GetEPGFromSK(ChannelInfo):
                     rating = int(program['ratingCd']) if program['programName'] 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)
-                    time.sleep(0.01)
+                    time.sleep(0.001)
         except ValueError:
             if(debug): printError(ChannelName + CONTENT_ERROR)
             else: pass
@@ -411,14 +409,13 @@ def GetEPGFromSKB(ChannelInfo):
                         rating = int(rating.text.decode('string_escape').replace('세','').strip())
                     #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.01)
+                    time.sleep(0.001)
             else:
                 if(debug): printError(ChannelName + CONTENT_ERROR)
                 else: pass
         except (requests.exceptions.RequestException) as e:
             if(debug): printError(ChannelName + str(e))
             else: pass
-        time.sleep(0.01)
     epgzip(epginfo)
 
 # Get EPG data from SKY
@@ -465,7 +462,7 @@ def GetEPGFromSKY(ChannelInfo):
                         rating = int(program['grade']) if program['grade'] 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)
-                        time.sleep(0.01)
+                        time.sleep(0.001)
             except ValueError:
                 if(debug): printError(ChannelName + CONTENT_ERROR)
                 else: pass
@@ -506,7 +503,7 @@ def GetEPGFromNaver(ChannelInfo):
                         rating = program['grade']
                          #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.01)
+                        time.sleep(0.001)
         except ValueError:
              if(debug): printError(ChannelName + CONTENT_ERROR)
              else: pass
@@ -521,48 +518,43 @@ def GetEPGFromIscs(ChannelInfo):
     ChannelName = ChannelInfo[1]
     ServiceId =  ChannelInfo[3]
     epginfo = []
-    url='http://www.iscs.co.kr/service/sub/ajax_channel_view.asp'
+    url='http://m.iscs.co.kr/sub/02/data.asp'
     for k in range(period):
         day = today + datetime.timedelta(days=k)
-        params = {'s_idx': ServiceId, 'C_date': day}
+        params = {'Exec_Mode': 'view', 'Source_Id': ServiceId, 'Ch_Day': day}
         response = requests.post(url, data=params, headers=ua, timeout=timeout)
         response.raise_for_status()
         json_data = response.text
         try:
             data = json.loads(json_data, encoding='utf-8')
-            pattern = '(.*)<\/td>'
-            data['html'] = re.sub(pattern, partial(replacement, tag='td'), data['html'])
-            strainer = SoupStrainer('tbody')
-            soup = BeautifulSoup(data['html'], 'lxml', parse_only=strainer)
-            html =  soup.find_all('tr') if soup.find_all('tr') else ''
-            if(html) :
-                for row in html:
+            if(data['total'] > 0 ):
+                programs = data['list']
+                for program in programs:
                     startTime = endTime = programName = subprogramName = desc = actors = producers = category = episode = ''
                     rebroadcast = False
                     rating = 0
-                    startTime = str(day) + ' ' + row.find('td', {'class':'time'}).text.strip()
+                    startTime = str(day) + ' ' + program['Time']
                     startTime = datetime.datetime.strptime(startTime, '%Y-%m-%d %H:%M')
                     startTime = startTime.strftime('%Y%m%d%H%M%S')
-                    programName = row.find('td', {'class':'title'}).text.decode('string_escape').strip()
-                    rating = row.find('span', {'class':'year'}).text.decode('string_escape').strip()
-                    if rating == '전체관람' : rating = 0
-                    else : rating = rating.replace('세이상', ' ')
-                    pattern = '^(.*?)(?:\(([\d,]+)회\))?(?:\((재)\))?$'
-                    matches = re.match(pattern, programName)
+                    pattern = '^(.*?)(?:\(([\d,]+)회\))?(?:\((재)\))?$';
+                    matches = re.match(pattern, program['Pg_Name'].decode('string_escape').strip())
                     if not(matches is None) :
                         programName = matches.group(1) if matches.group(1) else ''
                         episode = matches.group(2) if matches.group(2) else ''
                         rebroadcast = True if matches.group(3) else False
+                    if program['Rating'].decode('string_escape').strip() == '모든연령':
+                        rating = 0
+                    else:
+                        rating = program['Rating'].replace('세이상','')
                     #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.01)
+                    time.sleep(0.001)
         except ValueError:
             if(debug): printError(ChannelName + CONTENT_ERROR)
             else: pass
         except (requests.RequestException) as e:
             if(debug): printError(ChannelName + str(e))
             else: pass
-        time.sleep(0.01)
     epgzip(epginfo)
 
 # Get EPG data from HCN
@@ -571,48 +563,43 @@ def GetEPGFromHcn(ChannelInfo):
     ChannelName = ChannelInfo[1]
     ServiceId =  ChannelInfo[3]
     epginfo = []
-    html = []
-    url = 'http://www.hcn.co.kr/ur/bs/ch/channelInfo.hcn'
+    url = 'http://m.hcn.co.kr/sch_ScheduleList.action'
     for k in range(period):
         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)}
         try:
             response = requests.get(url, params=params, headers=ua, timeout=timeout)
             response.raise_for_status()
             html_data = response.content
-            data = unicode(html_data, 'euc-kr', 'ignore').encode('utf-8', 'ignore')
-            strainer = SoupStrainer('tr', {'class':''})
+            data = html_data
+            strainer = SoupStrainer('li')
             soup = BeautifulSoup(data, 'lxml', parse_only=strainer, from_encoding='utf-8')
-            for td in soup.findAll('td', {'class': 'f'}):
-                td.insert(0, str(day) + ' ')
-            html =  html + soup.find_all('tr') if soup.find_all('tr') else ''
+            html =  soup.find_all('li') if soup.find_all('li') 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('span', {'class':'progTime'}).text.strip()
+                    startTime = datetime.datetime.strptime(startTime, '%Y-%m-%d %H:%M')
+                    startTime = startTime.strftime('%Y%m%d%H%M%S')
+                    programName = row.find('span', {'class':'progTitle'}).text.decode('string_escape').strip()
+                    for image in row.find_all('img', {'class':'vM'}, alt=True):
+                        rebroad = re.match('(재방송)',image['alt'].decode('string_escape').strip())
+                        if not (rebroad is None): rebroadcast = True
+                        grade = re.match('([\d,]+)',image['alt'])
+                        if not (grade is None): rating = int(grade.group(1))
+                    #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
-    if(html):
-        for cur, next in pairs(html):
-            startTime = endTime = programName = subprogramName = desc = actors = producers = category = episode = ''
-            rebroadcast = False
-            rating = 0
-            startTime = cur.find('td', {'class':'f'}).text.strip()
-            startTime = datetime.datetime.strptime(startTime, '%Y-%m-%d %H:%M')
-            startTime = startTime.strftime('%Y%m%d%H%M%S')
-            endTime = next.find('td', {'class':'f'}).text.strip()
-            endTime = datetime.datetime.strptime(endTime, '%Y-%m-%d %H:%M')
-            endTime = endTime.strftime('%Y%m%d%H%M%S')
-            programName = cur.find('td', {'class':'left'}).text.decode('string_escape').strip()
-            category = cur.find('td', {'class':'l'}).text.decode('string_escape').strip()
-            category = re.sub('\(.*\)', '', category)
-            for image in cur.find_all('img', {'class':'vM'}, alt=True):
-                rebroad = re.match('(재방송)',image['alt'].decode('string_escape').strip())
-                if not (rebroad is None): rebroadcast = True
-                grade = re.match('([\d,]+)',image['alt'])
-                if not (grade is None): rating = int(grade.group(1))
-            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)
-    else:
-        if(debug): printError(ChannelName + CONTENT_ERROR)
-        else: pass
+    epgzip(epginfo)  
 
 # Get EPG data from POOQ
 def GetEPGFromPooq(ChannelInfo):
@@ -657,7 +644,7 @@ def GetEPGFromPooq(ChannelInfo):
                         rating = int(program['age'])
                         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)
-                        time.sleep(0.01)
+                        time.sleep(0.001)
         except ValueError:
             if(debug): printError(ChannelName + CONTENT_ERROR)
             else: pass
@@ -699,14 +686,13 @@ def GetEPGFromMbc(ChannelInfo):
                         category = '음악'
                         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)
-                        time.sleep(0.01)
+                    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
-        time.sleep(0.01)
 
 # Get EPG data from MIL
 def GetEPGFromMil(ChannelInfo):
@@ -749,14 +735,13 @@ def GetEPGFromMil(ChannelInfo):
                     producers =  unescape(program['movie_director'])
                     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)
-                    time.sleep(0.01)
+                    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
-        time.sleep(0.01)
 
 # Get EPG data from IFM
 def GetEPGFromIfm(ChannelInfo):
@@ -795,14 +780,13 @@ def GetEPGFromIfm(ChannelInfo):
                     producers = program['pgmPd']
                     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)
-                    time.sleep(0.01)
+                    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
-        time.sleep(0.01)
 
 # Get EPG data from KBS
 def GetEPGFromKbs(ChannelInfo):
@@ -834,14 +818,13 @@ def GetEPGFromKbs(ChannelInfo):
                         startTime = startTime.strftime('%Y%m%d%H%M%S')
                     #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.01)
+                    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
-        time.sleep(0.01)
     epgzip(epginfo)
 
 # Get EPG data from ARIRANG
@@ -893,14 +876,13 @@ def GetEPGFromArirang(ChannelInfo):
                         rebroadcast = True if matches.group(2) else False
                     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)
-                    time.sleep(0.01)
+                    time.sleep(0.001)
             else:
                 if(debug): printError(ChannelName + CONTENT_ERROR)
                 else: pass
         except (requests.exceptions.RequestException) as e:
             if(debug): printError(ChannelName + str(e))
             else: pass
-        time.sleep(0.01)
 
 # Zip epginfo
 def epgzip(epginfo):
@@ -940,9 +922,13 @@ def writeProgram(programdata):
     producers = escape(programdata['producers'])
     category = escape(programdata['category'])
     episode = programdata['episode']
-    if episode :
-        episode_ns = int(episode) - 1
-        episode_ns = '0'+ '.' +  str(episode_ns) + '.' + '0' + '/' + '0'
+    if episode:
+        try:
+            episode_ns = int(episode) - 1
+            episode_ns = '0'+ '.' +  str(episode_ns) + '.' + '0' + '/' + '0'
+        except ValueError as ex:
+            episode_ns = int(episode.split(',', 1)[0]) - 1
+            episode_ns = '0'+ '.' +  str(episode_ns) + '.' + '0' + '/' + '0'
         episode_on = episode
     rebroadcast = programdata['rebroadcast']
     if episode and addepisode  == 'y': programName = programName + ' ('+ str(episode) + '회)'
@@ -1154,19 +1140,4 @@ elif output == "socket" :
     else :
         printError("epg2xml.json 파일의 default_xml_socket항목이 없습니다.");
         sys.exit()
-getEpg()
-
-
-
-#a = [0, 1,2,3,4,5]
-#it = iter(a)
-
-#print(next(it))
-#print(next(it))
-#for i in it :
-#    print(i)
-
-
-#import itertools as it
-#for prev, cur in pairs(it.cycle([1,2,3,4])):
-#    print( cur , prev )
\ No newline at end of file
+getEpg()
\ No newline at end of file

From 89f9c4f8391d0e1807543d2fd311945ce3457ea4 Mon Sep 17 00:00:00 2001
From: wonipapa 
Date: Wed, 6 Sep 2017 14:22:43 +0900
Subject: [PATCH 36/41] =?UTF-8?q?=EA=B3=B5=EC=A3=BC=ED=8C=8C=205=EA=B0=9C?=
 =?UTF-8?q?=20=EC=B1=84=EB=84=90=20MyChannels=EC=97=90=20=EC=B6=94?=
 =?UTF-8?q?=EA=B0=80?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 epg2xml.json | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/epg2xml.json b/epg2xml.json
index 6a93651..bf3c3d9 100644
--- a/epg2xml.json
+++ b/epg2xml.json
@@ -20,9 +20,9 @@
     "###_COMMENT_###" : "### EPG 정보 추가 출력 ###",
     "default_verbose" : "y",
     "###_COMMENT_###" : "### epg 데이터 가져오는 기간으로 1에서 7까지 설정가능 ###",
-    "default_fetch_limit" : "2",
+    "default_fetch_limit" : "7",
     "###_COMMENT_###" : "### epg 저장시 기본 저장 이름 (ex: /home/tvheadend/xmltv.xml) ###",
-    "default_xml_file" : "xmltv.xml",
+    "default_xml_file" : "/home1/wonipapa/public_html/epg2xml/xmltv.xml",
     "###_COMMENT_###" : "### # External XMLTV 사용시 기본 소켓 이름 (ex: /home/tvheadend/xmltv.sock) ###",
     "default_xml_socket" : "xmltv.sock",
     "###_COMMENT_###" : ""

From 92eb54eafdaaf8f7cd2cc610260ca41d1037bb36 Mon Sep 17 00:00:00 2001
From: wonipapa 
Date: Wed, 6 Sep 2017 14:36:32 +0900
Subject: [PATCH 37/41] =?UTF-8?q?HCN,=20ISCS=20=ED=95=A8=EC=88=98=20?=
 =?UTF-8?q?=EC=88=98=EC=A0=95,=20=EC=9B=B9=ED=8E=98=EC=9D=B4=EC=A7=80=20?=
 =?UTF-8?q?=ED=8C=A8=EC=B9=98=EC=8B=9C=20=EC=8B=9C=EA=B0=84=20=EA=B0=84?=
 =?UTF-8?q?=EA=B2=A9=20=EC=B6=94=EA=B0=80?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 epg2xml-web.php | 115 ++++++++++++++++++++++++++----------------------
 epg2xml.php     |   5 ++-
 2 files changed, 66 insertions(+), 54 deletions(-)

diff --git a/epg2xml-web.php b/epg2xml-web.php
index 585fa4f..037821a 100644
--- a/epg2xml-web.php
+++ b/epg2xml-web.php
@@ -1,6 +1,7 @@
 item(2)->nodeValue)));
                         //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);
@@ -594,6 +597,7 @@ function GetEPGFromLG($ChannelInfo) {
                         $rating = trim($spans->item(1)->nodeValue)=="All" ? 0 : trim($spans->item(1)->nodeValue);
                         //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);
@@ -672,6 +676,7 @@ function GetEPGFromSK($ChannelInfo) {
                             'rating' => $rating
                         );
                         writeProgram($programdata);
+                        usleep(1000);
                     endforeach;
                 endif;
             } catch(Exception $e) {
@@ -739,6 +744,7 @@ function GetEPGFromSKB($ChannelInfo) {
                         if($cells->length > 3) $rating = str_replace('세', '', $cells->item(3)->nodeValue)  ?: 0;
                         //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);
@@ -819,7 +825,8 @@ function GetEPGFromSKY($ChannelInfo) {
                                 'rebroadcast' => $rebroadcast,
                                 'rating' => $rating
                             );
-                           writeProgram($programdata);
+                            writeProgram($programdata);
+                            usleep(1000);
                         endforeach;
                     endif;
                 } catch(Exception $e) {
@@ -889,6 +896,7 @@ function GetEPGFromNaver($ChannelInfo) {
                                 $rating = $program['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;
                         endfor;
                     endfor;
@@ -910,11 +918,12 @@ function GetEPGFromIscs($ChannelInfo) {
     $ServiceId =  $ChannelInfo[3];
     $epginfo = array();
     foreach(range(1, $GLOBALS['period']) as $k) :
-        $url = "https://www.iscs.co.kr/service/sub/ajax_channel_view.asp";
+        $url = "http://m.iscs.co.kr/sub/02/data.asp";
         $day = date("Y-m-d", strtotime("+".($k - 1)." days"));
         $params = array(
-            's_idx' => $ServiceId,
-            'C_date' => $day
+            'Exec_Mode' => 'view',
+            'Source_Id' => $ServiceId,
+            'Ch_Day' => $day
         );
         $params = http_build_query($params);
         $method = "POST";
@@ -926,43 +935,33 @@ function GetEPGFromIscs($ChannelInfo) {
                 try {
                     $data = json_decode($response, TRUE);
                     if(json_last_error() != JSON_ERROR_NONE) throw new Exception(JSON_SYNTAX_ERROR);
-                    if(count($data['html']) == 0) :
+                    if(count($data['total']) == 0) :
                         if($GLOBALS['debug']) :
                             printError($ChannelName.CHANNEL_ERROR);
                         endif;
                     else :
-                        $response = $data['html'];
-                        $pattern = '/(.*)<\/td>/';
-                        $response = preg_replace_callback($pattern, function($matches) { return ''.htmlspecialchars($matches[1]).'';}, $response);
-                        $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 = "//div[@class='pp_tbl']/table/tbody/tr";
-                            $rows = $xpath->query($query);
-                            foreach($rows as $row) :
-                                $startTime = $endTime = $programName = $subprogramName = $desc = $actors = $producers = $category = $episode = "";
-                                $rebroadcast = False;
+                        $programs = $data['list'];
+                        foreach($programs as $program) :
+                            $startTime = $endTime = $programName = $subprogramName = $desc = $actors = $producers = $category = $episode = "";
+                            $rebroadcast = False;
+                            $rating = 0;
+                            $startTime = date("YmdHis", strtotime($day." ".$program['Time']));
+                            $pattern = '/^(.*?)(?:\(([\d,]+)회\))?(?:\((재)\))?$/';
+                            preg_match($pattern, trim($program['Pg_Name']), $matches);
+                            if ($matches != NULL) :
+                                if(isset($matches[1])) $programName = trim($matches[1]) ?: "";
+                                if(isset($matches[2])) $episode = $matches[2] ?: "";
+                                if(isset($matches[3])) $rebroadcast = $matches[3] ? True : False;
+                            endif;
+                            if($program['Rating'] == '모든연령'):
                                 $rating = 0;
-                                $cells = $row->getElementsByTagName('td');
-                                $startTime = $cells->item(0)->nodeValue ?: "";
-                                $startTime = date("YmdHis", strtotime($day." ".$startTime));
-                                $programName = trim($cells->item(1)->nodeValue) ?: "";
-                                $pattern = '/^(.*?)(?:\(([\d,]+)회\))?(?:\((재)\))?$/';
-                                preg_match($pattern, $programName, $matches);
-                                if ($matches != NULL) :
-                                    if(isset($matches[1])) $programName = trim($matches[1]) ?: "";
-                                    if(isset($matches[2])) $episode = $matches[2] ?: "";
-                                    if(isset($matches[3])) $rebroadcast = $matches[3] ? True : False;
-                                endif;
-                                $rating = $cells->item(2)->nodeValue=='전체관람' ? 0 : str_replace('세이상', '', $cells->item(2)->nodeValue);
-                                //ChannelId, startTime, programName, subprogramName, desc, actors, producers, category, episode, rebroadcast, rating
-                                $epginfo[] = array($ChannelId, $startTime, $programName, $subprogramName, $desc, $actors, $producers, $category, $episode, $rebroadcast, $rating);
-                            endforeach;
-                        else :
-                            if($GLOBALS['debug']) printError($ChannelName.CONTENT_ERROR);
-                        endif;
+                            else:
+                                $rating = str_replace("세이상","", $program['Rating']);
+                            endif;
+                            //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;
                     endif;
                 } catch(Exception $e) {
                     if($GLOBALS['debug']) printError($e->getMessage());
@@ -982,38 +981,36 @@ function GetEPGFromHcn($ChannelInfo) {
     $ServiceId =  $ChannelInfo[3];
     $epginfo = array();
     foreach(range(1, $GLOBALS['period']) as $k) :
-        $url = "https://www.hcn.co.kr/ur/bs/ch/channelInfo.hcn";
+        $url = "http://m.hcn.co.kr/sch_ScheduleList.action";
         $day = date("Y-m-d", strtotime("+".($k - 1)." days"));
         $params = array(
-            'method' => 'ajax_00', 
-            'pageType' => 'sheetList',
             'ch_id' => $ServiceId,
-            'onairdate' => $day
+            'onairdate' => $day,
+            '_' => _microtime()
         );
         $params = http_build_query($params);
-        $method = "POST";
+        $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", "EUC-KR");
+                $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 = "//tr[@class='']";
+                    $query = "//li";
                     $rows = $xpath->query($query);
                     foreach($rows as $row) :
                         $startTime = $endTime = $programName = $subprogramName = $desc = $actors = $producers = $category = $episode = "";
                         $rebroadcast = False;
                         $rating = 0;
-                        $cells = $row->getElementsByTagName('td');
-                        $startTime = $cells->item(0)->nodeValue ?: "";
+                        $startTime = trim($xpath->query("span[@class='progTime']", $row)->item(0)->nodeValue) ?: "";
                         $startTime = date("YmdHis", strtotime($day." ".$startTime));
-                        $programName = trim($cells->item(1)->nodeValue) ?: "";
-                        $category = trim($cells->item(2)->nodeValue) ?: "";
-                        $category = preg_replace('/\(.*\)/', '', $category);
+                        $programName = trim($xpath->query("span[@class='progTitle']", $row)->item(0)->nodeValue) ?: "";
+                        //$category = trim($cells->item(2)->nodeValue) ?: "";
+                        //$category = preg_replace('/\(.*\)/', '', $category);
                         $images = $row->getElementsByTagName('img');
                         foreach($images as $image):
                             preg_match('/re\.png/', $image->getAttribute('src'), $rebroad);
@@ -1023,6 +1020,7 @@ function GetEPGFromHcn($ChannelInfo) {
                         endforeach;
                         //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);
@@ -1107,6 +1105,7 @@ function GetEPGFromPooq($ChannelInfo) {
                                 'rating' => $rating
                             );
                             writeProgram($programdata);
+                            usleep(1000);
                         endif;
                     endforeach;
                 endif;
@@ -1177,6 +1176,7 @@ function GetEPGFromMbc($ChannelInfo) {
                                     'rating' => $rating
                                 );
                                 writeProgram($programdata);
+                                usleep(1000);
                             endif;
                         endforeach;
                     endif;
@@ -1248,7 +1248,8 @@ function GetEPGFromMil($ChannelInfo) {
                                 'rebroadcast' => $rebroadcast,
                                 'rating' => $rating
                             );
-                           writeProgram($programdata);
+                            writeProgram($programdata);
+                            usleep(1000);
                         endforeach;
                     endif;
                 } catch(Exception $e) {
@@ -1315,7 +1316,8 @@ function GetEPGFromIfm($ChannelInfo) {
                                 'rebroadcast' => $rebroadcast,
                                 'rating' => $rating
                             );
-                           writeProgram($programdata);
+                            writeProgram($programdata);
+                            usleep(1000);
                         endforeach;
                     endif;
                 } catch(Exception $e) {
@@ -1371,7 +1373,8 @@ function GetEPGFromKbs($ChannelInfo) {
                             $programName = trim($cells->item(2)->childNodes->item(0)->nodeValue);
                             $programName = str_replace(array("[","]", " Broadcast"), array("", "", ""), $programName);
                             //ChannelId, startTime, programName, subprogramName, desc, actors, producers, category, episode, rebroadcast, rating
-                         $epginfo[] = array($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;
                     endif;
                 } catch(Exception $e) {
@@ -1446,7 +1449,8 @@ function GetEPGFromArirang($ChannelInfo) {
                             'rebroadcast' => $rebroadcast,
                             'rating' => $rating
                         );
-                       writeProgram($programdata);
+                        writeProgram($programdata);
+                        usleep(1000);
                     endforeach;
                 else :
                     if($GLOBALS['debug']) printError($ChannelName.CONTENT_ERROR);
@@ -1492,6 +1496,7 @@ function epgzip($epginfo) {
         writeProgram($programdata);
     endforeach;
 }
+
 function writeProgram($programdata) {
     $fp = $GLOBALS['fp'];
     $ChannelId = $programdata['channelId'];
@@ -1594,6 +1599,7 @@ function writeProgram($programdata) {
     endif;
     fprintf($fp, "  \n");
 }
+
 function getWeb($url, $params, $method) {
     $ch = curl_init();
     if($method == "GET"):
@@ -1623,4 +1629,9 @@ function printError($string) {
     header("Content-Type: text/plain; charset=utf-8");
     print("Error : ".$string."\n");
 }
+
+function _microtime() {
+    list($usec, $sec) = explode(" ", microtime());
+    return ($sec.(int)($usec*1000));
+}
 ?>
diff --git a/epg2xml.php b/epg2xml.php
index af9eaba..51bf96c 100644
--- a/epg2xml.php
+++ b/epg2xml.php
@@ -1514,6 +1514,7 @@ function epgzip($epginfo) {
         writeProgram($programdata);
     endforeach;
 }
+
 function writeProgram($programdata) {
     $fp = $GLOBALS['fp'];
     $ChannelId = $programdata['channelId'];
@@ -1616,6 +1617,7 @@ function writeProgram($programdata) {
     endif;
     fprintf($fp, "  \n");
 }
+
 function getWeb($url, $params, $method) {
     $ch = curl_init();
     if($method == "GET"):
@@ -1644,8 +1646,7 @@ function printError($string) {
     fwrite(STDERR, "Error : ".$string."\n");
 }
 
-function _microtime()
-{
+function _microtime() {
     list($usec, $sec) = explode(" ", microtime());
     return ($sec.(int)($usec*1000));
 }

From 05678de70da7db80f83a4395d6b5cb428bd8fb87 Mon Sep 17 00:00:00 2001
From: wonipapa 
Date: Wed, 6 Sep 2017 15:06:10 +0900
Subject: [PATCH 38/41] =?UTF-8?q?php=20=EA=B3=B5=ED=86=B5=EB=B6=80?=
 =?UTF-8?q?=EB=B6=84=20=EB=B6=84=EB=A6=AC,=20=EA=B8=B0=EA=B0=84=20?=
 =?UTF-8?q?=EC=84=A4=EC=A0=95=20=EC=88=98=EC=A0=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 epg2xml-web.php | 1358 +----------------------------------------------
 epg2xml.php     | 1356 +---------------------------------------------
 epg2xml.py      |    1 +
 3 files changed, 5 insertions(+), 2710 deletions(-)

diff --git a/epg2xml-web.php b/epg2xml-web.php
index 037821a..aaef3bf 100644
--- a/epg2xml-web.php
+++ b/epg2xml-web.php
@@ -1,4 +1,5 @@
  2 ? 2 : $period;
                        else :
                         printError("default_fetch_limit는 1, 2, 3, 4, 5, 6, 7만 가능합니다.");
                         exit;
@@ -278,1360 +280,4 @@ elseif($output == "socket") :
         exit;
     endif;
 endif;
-
-function getEPG() {
-    $fp = $GLOBALS['fp'];
-    $MyISP = $GLOBALS['MyISP'];
-    $MyChannels = $GLOBALS['MyChannels'];
-    $Channelfile = __DIR__."/Channel.json";
-    $IconUrl = "";
-    $ChannelInfos = array();
-    try {
-        $f = @file_get_contents($Channelfile);
-        if($f === False) :
-            printError("Channel.json.".JSON_FILE_ERROR);
-            exit;
-        else :
-            try {
-                $Channeldatajson = json_decode($f, TRUE);
-                if(json_last_error() != JSON_ERROR_NONE) throw new Exception("Channel.".JSON_SYNTAX_ERROR);
-            }
-            catch(Exception $e) {
-                printError($e->getMessage());
-                exit;
-            }
-        endif;
-    }
-    catch(Exception $e) {
-        printError($e->getMessage());
-        exit;
-    }
-//My Channel 정의
-    $MyChannelInfo = array();
-    if($MyChannels) :
-        $MyChannelInfo = array_map('trim',explode(',', $MyChannels));
-    endif;
-
-    header("Content-Type: application/xml; charset=utf-8");
-    fprintf($fp, "\n");
-    fprintf($fp, "\n\n");
-    fprintf($fp, "\n", VERSION);
-
-    foreach ($Channeldatajson as $Channeldata) : //Get Channel & Print Channel info
-        if($Channeldata['Enabled'] == 1 ||  in_array($Channeldata['Id'], $MyChannelInfo)) :
-            $ChannelId = $Channeldata['Id'];
-            $ChannelName = htmlspecialchars($Channeldata['Name'], ENT_XML1);
-            $ChannelSource = $Channeldata['Source'];
-            $ChannelServiceId = $Channeldata['ServiceId'];
-            $ChannelIconUrl = htmlspecialchars($Channeldata['Icon_url'], ENT_XML1);            
-            if($MyISP != "ALL" && $Channeldata[$MyISP.'Ch'] != Null):
-                $ChannelInfos[] = array($ChannelId,  $ChannelName, $ChannelSource, $ChannelServiceId);
-                $Channelnumber = $Channeldata[$MyISP.'Ch'];
-                $ChannelISPName = htmlspecialchars($Channeldata[$MyISP." Name"], ENT_XML1);
-                fprintf($fp, "  \n", $ChannelId);
-                fprintf($fp, "    %s\n", $ChannelName);
-                fprintf($fp, "    %s\n", $ChannelISPName);
-                fprintf($fp, "    %s\n", $Channelnumber);
-                fprintf($fp, "    %s\n", $Channelnumber." ".$ChannelISPName);
-                if($IconUrl) :
-                    fprintf($fp, "    \n", $IconUrl, $ChannelId);
-                else :
-                    fprintf($fp, "    \n", $ChannelIconUrl);
-                endif;
-                fprintf($fp, "  \n");
-            elseif($MyISP == "ALL"):
-                $ChannelInfos[] = array($ChannelId,  $ChannelName, $ChannelSource, $ChannelServiceId);
-                fprintf($fp, "  \n", $ChannelId);
-                fprintf($fp, "    %s\n", $ChannelName);
-                if($IconUrl) :
-                    fprintf($fp, "    \n", $IconUrl, $ChannelId);
-                else :
-                    fprintf($fp, "    \n", $ChannelIconUrl);
-                endif;
-                fprintf($fp, "  \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 == 'SKB') :
-            GetEPGFromSKB($ChannelInfo);
-        elseif($ChannelSource == 'SKY') :
-            GetEPGFromSKY($ChannelInfo);
-        elseif($ChannelSource == 'NAVER') :
-            GetEPGFromNaver($ChannelInfo);
-        elseif($ChannelSource == 'ISCS') :
-            GetEPGFromIscs($ChannelInfo);
-        elseif($ChannelSource == 'HCN') :
-            GetEPGFromHcn($ChannelInfo);
-        elseif($ChannelSource == 'POOQ') :
-            GetEPGFromPooq($ChannelInfo);
-        elseif($ChannelSource == 'MBC') :
-            GetEPGFromMbc($ChannelInfo);
-        elseif($ChannelSource == 'MIL'):
-            GetEPGFromMil($ChannelInfo);
-        elseif($ChannelSource == 'IFM'):
-            GetEPGFromIfm($ChannelInfo);
-        elseif($ChannelSource == 'KBS'):
-            GetEPGFromKbs($ChannelInfo);
-        elseif($ChannelSource == 'ARIRANG'):
-            GetEPGFromArirang($ChannelInfo);
-        endif;
-    endforeach;
-    fprintf($fp, "\n");
-}
-
-// Get EPG data from epg.co.kr
-function GetEPGFromEPG($ChannelInfo) {
-    $ChannelId = $ChannelInfo[0];
-    $ChannelName = $ChannelInfo[1];
-    $ServiceId =  $ChannelInfo[3];
-    $epginfo = array();
-    foreach(range(1, $GLOBALS['period']) as $k) :
-        $url = "http://211.43.210.10:88/epg-cgi/extern/cnm_guide_type_v070530.php";
-        $day = date("Ymd", strtotime("+".($k - 1)." days"));
-        $params = array(
-            'beforegroup' => '100',
-            'checkchannel[]' => $ServiceId,
-            'select_group' => '100',
-            'start_date' => $day
-        );
-        $params = http_build_query($params);
-        $method = "POST";
-        try {
-            $response = getWeb($url, $params, $method);
-            if ($response === False && $GLOBALS['debug']) :
-                printError($ChannelName.HTTP_ERROR);
-            else :
-                $response = str_replace("charset=euc-kr", "charset=utf-8", $response);
-                $response = mb_convert_encoding($response, "UTF-8", "EUC-KR");
-                $pattern = '/(.*)<\/td>/';
-                $response = preg_replace_callback($pattern, function($matches) { return ''.htmlspecialchars($matches[1], ENT_NOQUOTES).'';}, $response);
-                $response = str_replace(array('</b>', '</a>', '<img', 'valign=top>','align=absmiddle>'), array('', '', '','>'), $response);
-                $dom = new DomDocument;
-                libxml_use_internal_errors(True);
-                if($dom->loadHTML($response)):
-                    $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) :
-                            $startTime = $endTime = $programName = $subprogramName = $desc = $actors = $producers = $category = $episode = "";
-                            $rebroadcast = False;
-                            $rating = 0;
-                            $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);
-                            $minute = str_replace(array("[", "]"), array("",""), trim($minute->nodeValue));
-                            $minute = substr($minute, -2);
-                            $hour = $hour.":".$minute;
-                            switch ($i) :
-                                case 2 :
-                                    $hour = $hour." AM";
-                                    break;
-                                case 3 :
-                                    $hour = $hour." PM";
-                                    break;
-                                case 4 :
-                                    if($hour > 5 && $hour < 12) :
-                                        $hour = $hour." PM";
-                                    elseif($hour <5 || $hour == 12) :
-                                        $hour = $hour." AM";
-                                        $thisday = date("Ymd", strtotime($day." +1 days"));
-                                    endif;
-                                    break;
-                            endswitch;
-                            $startTime = date("YmdHis", strtotime($thisday." ".$hour));
-                            $pattern = '/^(.*?)\s*(?:<(.*)>)?\s*(?:\((재)\))?\s*(?:\(([\d,]+)회\)?)?$/';
-                            $programName = trim($program->nodeValue);
-                             preg_match($pattern, $programName, $matches);
-                            if ($matches != NULL) :
-                                if(isset($matches[1])) $programName = trim($matches[1]) ?: "";
-                                if(isset($matches[2])) $subprogramName = trim($matches[2]) ?: "";
-                                if(isset($matches[3])) $rebroadcast = $matches[3] ? True : False;
-                                if(isset($matches[4])) $episode = $matches[4] ?: "";
-                            endif;
-                            $images = $program->getElementsByTagName('img');
-                            foreach($images as $image):
-                                preg_match('/.*schedule_([\d,]+)?.*/', $image->getAttribute('src'), $grade);
-                                if($grade != NULL) $rating = $grade[1];
-                            endforeach;
-                            //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;
-                    endfor;
-                 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 KT
-function GetEPGFromKT($ChannelInfo) {
-    $ChannelId = $ChannelInfo[0];
-    $ChannelName = $ChannelInfo[1];
-    $ServiceId =  $ChannelInfo[3];
-    $epginfo = array();
-    foreach(range(1, $GLOBALS['period']) as $k) :
-        $url = "http://tv.olleh.com/renewal_sub/liveTv/pop_schedule_week.asp";
-        $day = date("Ymd", strtotime("+".($k - 1)." days"));
-        $params = array(
-            'ch_name' => '',
-            'ch_no' => $ServiceId,
-            'nowdate'=> $day,
-            'seldatie' => $day,
-            'tab_no' => '1'
-        );
-        $params = http_build_query($params);
-        $method = "GET";
-        try {
-            $response = getWeb($url, $params, $method);
-            if ($response === False && $GLOBALS['debug']) :
-                printError($ChannelName.HTTP_ERROR);
-            else :
-                $response = str_replace("charset=euc-kr", "charset=utf-8", $response);
-                $response = mb_convert_encoding($response, "UTF-8", "EUC-KR");
-                $dom = new DomDocument;
-                libxml_use_internal_errors(True);
-                if($dom->loadHTML($response)):
-                    $xpath = new DomXPath($dom);
-                    $query = "//table[@id='pop_day']/tbody/tr";
-                    $rows = $xpath->query($query);
-                    foreach($rows as $row) :
-                        $startTime = $endTime = $programName = $subprogramName = $desc = $actors = $producers = $category = $episode = "";
-                        $rebroadcast = False;
-                        $rating = 0;
-                        $cells = $row->getElementsByTagName('td');
-                        //programName, startTime, rating, category
-                        $startTime = date("YmdHis", strtotime($day." ".trim($cells->item(0)->nodeValue)));
-                        $pattern = '/^(.*?)( <(.*)>)?$/';
-                        $programName = trim($cells->item(1)->nodeValue);
-                        preg_match($pattern, $programName, $matches);
-                        if ($matches != NULL) :
-                           if(isset($matches[1])) $programName = $matches[1] ?: "";
-                           if(isset($matches[3])) $subprogramName = $matches[3] ?: "";
-                        endif;
-                        $category = trim($cells->item(4)->nodeValue);
-                        $rating = str_replace("all", 0, str_replace("세 이상", "", trim($cells->item(2)->nodeValue)));
-                        //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 LG
-function GetEPGFromLG($ChannelInfo) {
-    $ChannelId = $ChannelInfo[0];
-    $ChannelName = $ChannelInfo[1];
-    $ServiceId =  $ChannelInfo[3];
-    $epginfo = array();
-    foreach(range(1, $GLOBALS['period']) as $k) :
-        $url = "http://www.uplus.co.kr/css/chgi/chgi/RetrieveTvSchedule.hpi";
-        $day = date("Ymd", strtotime("+".($k - 1)." days"));
-        $params = array(
-            'chnlCd' => $ServiceId,
-            'evntCmpYmd' =>  $day
-        );
-        $params = http_build_query($params);
-        $method = "POST";
-        try {
-            $response = getWeb($url, $params, $method);
-            if ($response === False && $GLOBALS['debug']) :
-                printError($ChannelName.HTTP_ERROR);
-            else :
-                $response = ''.$response;
-                $response = mb_convert_encoding($response, "UTF-8", "EUC-KR");
-                $response = str_replace(array('<재>', ' [..', ' (..'), array('<재>', '', ''), $response);
-                $dom = new DomDocument;
-                libxml_use_internal_errors(True);
-                if($dom->loadHTML($response)):
-                    $xpath = new DomXPath($dom);
-                    $query = "//div[@class='tblType list']/table/tbody/tr";
-                    $rows = $xpath->query($query);
-                    foreach($rows as $row) :
-                        $startTime = $endTime = $programName = $subprogramName = $desc = $actors = $producers = $category = $episode = "";
-                        $rebroadcast = False;
-                        $rating = 0;
-                        $cells = $row->getElementsByTagName('td');
-                        $startTime = date("YmdHis", strtotime($day." ".trim($cells->item(0)->nodeValue)));
-                        $programName = trim($cells->item(1)->childNodes->item(0)->nodeValue);
-                        $pattern = '/(<재>)?\s?(?:\[.*?\])?(.*?)(?:\[(.*)\])?\s?(?:\(([\d,]+)회\))?$/';
-                        preg_match($pattern, $programName, $matches);
-                        if ($matches != NULL) :
-                            if(isset($matches[2])) $programName = trim($matches[2]) ?: "";
-                            if(isset($matches[3])) $subprogramName = trim($matches[3]) ?: "";
-                            if(isset($matches[4])) $episode = trim($matches[4]) ?: "";
-                            if(isset($matches[1])) $rebroadcast = trim($matches[1]) ? True: False;
-                        endif;
-                        $category = trim($cells->item(2)->nodeValue);
-                        $spans = $cells->item(1)->getElementsByTagName('span');
-                        $rating = trim($spans->item(1)->nodeValue)=="All" ? 0 : trim($spans->item(1)->nodeValue);
-                        //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 SK
-function GetEPGFromSK($ChannelInfo) {
-    $ChannelId = $ChannelInfo[0];
-    $ChannelName = $ChannelInfo[1];
-    $ServiceId =  $ChannelInfo[3];
-    $today = date("Ymd");
-    $lastday = date("Ymd", strtotime("+".($GLOBALS['period'] - 1)." days"));
-    $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);
-    $method = "POST";
-    try {
-        $response = getWeb($url, $params, $method);
-        if ($response === False && $GLOBALS['debug']) :
-            printError($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) :
-                    if($GLOBALS['debug']) : 
-                        printError($ChannelName.CHANNEL_ERROR);
-                    endif;
-                else :
-                    $programs = $data['channel']['programs'];
-                    foreach ($programs as $program) :
-                        $startTime = $endTime = $programName = $subprogramName = $desc = $actors = $producers = $category = $episode = "";
-                        $rebroadcast = False;
-                        $rating = 0;
-                        $pattern = '/^(.*?)(?:\s*[\(<]([\d,회]+)[\)>])?(?:\s*<([^<]*?)>)?(\((재)\))?$/';
-                        preg_match($pattern, str_replace('...', '>', $program['programName']), $matches);
-                        if ($matches != NULL) :
-                            if(isset($matches[1])) $programName = trim($matches[1]) ?: "";
-                            if(isset($matches[3])) $subprogramName = trim($matches[3]) ?: "";
-                            if(isset($matches[2])) $episode = str_replace("회", "", $matches[2]) ?: "";
-                            if(isset($matches[5])) $rebroadcast = $matches[5] ? True : False;
-                        endif;
-                        $startTime = date("YmdHis",$program['startTime']/1000);
-                        $endTime = date("YmdHis",$program['endTime']/1000);
-                        $desc = $program['synopsis'] ?: "";
-                        $actors =trim(str_replace('...','',$program['actorName']), ', ') ?: "";
-                        $producers = trim(str_replace('...','',$program['directorName']), ', ') ?: "";
-                        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);
-                        usleep(1000);
-                    endforeach;
-                endif;
-            } catch(Exception $e) {
-                if($GLOBALS['debug']) printError($e->getMessage());
-            }
-        endif;
-    } catch (Exception $e) {
-        if($GLOBALS['debug']) printError($e->getMessage());
-    }
-}
-
-// Get EPG data from SKB
-function GetEPGFromSKB($ChannelInfo) {
-    $ChannelId = $ChannelInfo[0];
-    $ChannelName = $ChannelInfo[1];
-    $ServiceId =  $ChannelInfo[3];
-    $epginfo = array();
-    foreach(range(1, $GLOBALS['period']) as $k) :
-        $url = "http://m.skbroadband.com/content/realtime/Channel_List.do";
-        $day = date("Ymd", strtotime("+".($k - 1)." days"));
-        $params = array(
-            'key_depth2' => $ServiceId,
-            'key_depth3' => $day
-        );
-        $params = http_build_query($params);
-        $method = "POST";
-        try {
-            $response = getWeb($url, $params, $method);
-            if ($response === False && $GLOBALS['debug']) :
-                printError($ChannelName.HTTP_ERROR);
-            else :
-                $response = str_replace('charset="euc-kr"', 'charset="utf-8"', $response);
-                $response = mb_convert_encoding($response, "UTF-8", "EUC-KR");
-                $response = preg_replace('//is', '', $response);
-                $response = preg_replace('/<\/span>/is', '', $response);
-                $pattern = '/(.*)<\/span>/';
-                $response = preg_replace_callback($pattern, function($matches) { return ''.htmlspecialchars($matches[1], ENT_NOQUOTES).'';}, $response);
-                $dom = new DomDocument;
-                libxml_use_internal_errors(True);
-                if($dom->loadHTML($response)):
-                    $xpath = new DomXPath($dom);
-                    $query = "//span[@class='caption' or @class='explan' or @class='fullHD' or @class='UHD' or @class='nowon']";
-                    $spans = $xpath->query($query);
-                    foreach($spans as $span) :
-                        $span->parentNode->removeChild( $span);
-                    endforeach;
-                    $query = "//div[@id='dawn']/ul/li";
-                    $rows = $xpath->query($query);
-                    foreach($rows as $row) :
-                        $startTime = $endTime = $programName = $subprogramName = $desc = $actors = $producers = $category = $episode = "";
-                        $rebroadcast = False;
-                        $rating = 0;
-                        $cells = $row->getElementsByTagName('span');
-                        $startTime = $cells->item(0)->nodeValue ?: "";
-                        $startTime = date("YmdHis", strtotime($day." ".$startTime));
-                        $programName = trim($cells->item(2)->nodeValue) ?: "";
-                        $pattern = '/^(.*?)(\(([\d,]+)회\))?(<(.*)>)?(\((재)\))?$/';
-                        preg_match($pattern, $programName, $matches);
-                        if ($matches != NULL) :
-                            if(isset($matches[1])) $programName = trim($matches[1]) ?: "";
-                            if(isset($matches[5])) $subprogramName = trim($matches[5]) ?: "";
-                            if(isset($matches[3])) $episode = $matches[3] ?: "";
-                            if(isset($matches[7])) $rebroadcast = $matches[7] ? True : False;
-                        endif;
-                        if($cells->length > 3) $rating = str_replace('세', '', $cells->item(3)->nodeValue)  ?: 0;
-                        //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 SKY
-function GetEPGFromSKY($ChannelInfo) {
-    $ChannelId = $ChannelInfo[0];
-    $ChannelName = $ChannelInfo[1];
-    $ServiceId =  $ChannelInfo[3];
-    foreach(range(1, $GLOBALS['period']) as $k) :
-        $url = "http://www.skylife.co.kr/channel/epg/channelScheduleListJson.do";
-        $day = date("Y-m-d", strtotime("+".($k - 1)." days"));
-        $params = array(
-            'area' => 'in',
-            'inFd_channel_id' => $ServiceId,
-            'inairdate' => $day,
-            'indate_type' => 'now'
-        );
-        $params = http_build_query($params);
-        $method = "POST";
-        try {
-            $response = getWeb($url, $params, $method);
-            if ($response === False && $GLOBALS['debug']) :
-                printError($ChannelName.HTTP_ERROR);
-            else :
-                try {
-                    $data = json_decode($response, TRUE);
-                    if(json_last_error() != JSON_ERROR_NONE) throw new Exception(JSON_SYNTAX_ERROR);
-                    if(count($data['scheduleListIn']) == 0) :
-                        if($GLOBALS['debug']) :
-                            printError($ChannelName.CHANNEL_ERROR);
-                        endif;
-                    else :
-                        $programs = $data['scheduleListIn'];
-                        foreach($programs as $program) :
-                            $startTime = $endTime = $programName = $subprogramName = $desc = $actors = $producers = $category = $episode = "";
-                            $rebroadcast = False;
-                            $rating = 0;
-                            $programName = htmlspecialchars_decode($program['program_name']) ?: "";
-                            $subprogramName = str_replace(array('lt;', 'gt;', 'amp;'), array('<', '>', '&'),$program['program_subname']) ?: "";
-                            $startTime = $program['starttime'];
-                            $endTime = $program['endtime'];
-                            $actors = trim(str_replace('...', '',$program['cast']), ', ') ?: "";
-                            $producers = trim(str_replace('...', '',$program['dirt']), ', ') ?: "";
-                            $description = str_replace(array('lt;', 'gt;', 'amp;'), array('<', '>', '&'),$program['description']) ?: "";
-                            $summary = str_replace(array('lt;', 'gt;', 'amp;'), array('<', '>', '&'),$program['summary']) ?: "";
-                            $desc = $description ?: "";
-                            if($desc) :
-                                if($summary):
-                                    $desc = $desc."\n".$summary;
-                                endif;
-                            else :
-                                $desc = $summary;
-                            endif;
-                            $category = $program['program_category1'];
-                            $episode = $program['episode_id'] ?: "";
-                            $rebroadcast = $program['rebroad']== "Y" ? True : False;
-                            $rating = $program['grade'] ?: 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);
-                            usleep(1000);
-                        endforeach;
-                    endif;
-                } catch(Exception $e) {
-                    if($GLOBALS['debug']) printError($e->getMessage());
-                }
-            endif;
-        } catch (Exception $e) {
-            if($GLOBALS['debug']) printError($e->getMessage());
-        }
-    endforeach;
-}
-
-// Get EPG data from Naver
-function GetEPGFromNaver($ChannelInfo) {
-    $ChannelId = $ChannelInfo[0];
-    $ChannelName = $ChannelInfo[1];
-    $ServiceId =  $ChannelInfo[3];
-    $epginfo = array();
-    $totaldate = array();
-    foreach(range(1, $GLOBALS['period']) as $k) :
-        $url = "https://search.naver.com/p/csearch/content/batchrender_ssl.nhn";
-        $day = date("Ymd", strtotime("+".($k - 1)." days"));
-        $totaldate[] = $day;
-    endforeach;
-    $params = array(
-        '_callback' => 'epg',
-        'fileKey' => 'single_schedule_channel_day',
-        'pkid' => '66',
-        'u1' => 'single_schedule_channel_day',
-        'u2' => join(",", $totaldate),
-        'u3' => $day,
-        'u4' => $GLOBALS['period'],
-        'u5' => $ServiceId,
-        'u6' => 1,
-        'u7' => $ChannelName."편성표", 
-        'u8' => $ChannelName."편성표",
-        'where' => 'nexearch'
-    );
-    $params = http_build_query($params);
-    $method = "GET";
-    try {
-        $response = getWeb($url, $params, $method);
-        if ($response === False && $GLOBALS['debug']) :
-            printError($ChannelName.HTTP_ERROR);
-        else :
-            try {
-                $response = str_replace('epg( ', '', $response );
-                $response = substr($response, 0, strlen($response)-2);
-                $response = preg_replace("/\/\*.*?\*\//","",$response);
-                $data = json_decode($response, TRUE);
-                if(json_last_error() != JSON_ERROR_NONE) throw new Exception(JSON_SYNTAX_ERROR);
-                 if($data['displayDates'][0]['count'] == 0) :
-                    if($GLOBALS['debug']) : 
-                        printError($ChannelName.CHANNEL_ERROR);
-                    endif;
-                else :
-                    for($i = 0; $i < count($data['displayDates']); $i++) :
-                        for($j = 0; $j < 24; $j++) :
-                            foreach($data['schedules'][$j][$i] as $program) :
-                                $startTime = $endTime = $programName = $subprogramName = $desc = $actors = $producers = $category = $episode = "";
-                                $rebroadcast = False;
-                                $rating = 0;
-                                $startTime = date("YmdHis", strtotime($data['displayDates'][$i]['date']." ".$program['startTime']));
-                                $programName = htmlspecialchars_decode(trim($program['title']), ENT_XML1);
-                                $episode = str_replace("회","", $program['episode']);
-                                $rebroadcast = $program['isRerun'] ? True : False;
-                                $rating = $program['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;
-                        endfor;
-                    endfor;
-                endif;
-             } catch(Exception $e) {
-                if($GLOBALS['debug']) printError($e->getMessage());
-            }
-        endif;
-    } catch (Exception $e) {
-        if($GLOBALS['debug']) printError($e->getMessage());
-    }
-    epgzip($epginfo);
-}
-
-// Get EPG data from Iscs
-function GetEPGFromIscs($ChannelInfo) {
-    $ChannelId = $ChannelInfo[0];
-    $ChannelName = $ChannelInfo[1];
-    $ServiceId =  $ChannelInfo[3];
-    $epginfo = array();
-    foreach(range(1, $GLOBALS['period']) as $k) :
-        $url = "http://m.iscs.co.kr/sub/02/data.asp";
-        $day = date("Y-m-d", strtotime("+".($k - 1)." days"));
-        $params = array(
-            'Exec_Mode' => 'view',
-            'Source_Id' => $ServiceId,
-            'Ch_Day' => $day
-        );
-        $params = http_build_query($params);
-        $method = "POST";
-        try {
-            $response = getWeb($url, $params, $method);
-            if ($response === False && $GLOBALS['debug']) :
-                printError($ChannelName.HTTP_ERROR);
-            else :
-                try {
-                    $data = json_decode($response, TRUE);
-                    if(json_last_error() != JSON_ERROR_NONE) throw new Exception(JSON_SYNTAX_ERROR);
-                    if(count($data['total']) == 0) :
-                        if($GLOBALS['debug']) :
-                            printError($ChannelName.CHANNEL_ERROR);
-                        endif;
-                    else :
-                        $programs = $data['list'];
-                        foreach($programs as $program) :
-                            $startTime = $endTime = $programName = $subprogramName = $desc = $actors = $producers = $category = $episode = "";
-                            $rebroadcast = False;
-                            $rating = 0;
-                            $startTime = date("YmdHis", strtotime($day." ".$program['Time']));
-                            $pattern = '/^(.*?)(?:\(([\d,]+)회\))?(?:\((재)\))?$/';
-                            preg_match($pattern, trim($program['Pg_Name']), $matches);
-                            if ($matches != NULL) :
-                                if(isset($matches[1])) $programName = trim($matches[1]) ?: "";
-                                if(isset($matches[2])) $episode = $matches[2] ?: "";
-                                if(isset($matches[3])) $rebroadcast = $matches[3] ? True : False;
-                            endif;
-                            if($program['Rating'] == '모든연령'):
-                                $rating = 0;
-                            else:
-                                $rating = str_replace("세이상","", $program['Rating']);
-                            endif;
-                            //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;
-                    endif;
-                } catch(Exception $e) {
-                    if($GLOBALS['debug']) printError($e->getMessage());
-                }
-            endif;
-        } catch (Exception $e) {
-            if($GLOBALS['debug']) printError($e->getMessage());
-        }
-    endforeach;
-    epgzip($epginfo);
-}
-
-// Get EPG data from Hcn
-function GetEPGFromHcn($ChannelInfo) {
-    $ChannelId = $ChannelInfo[0];
-    $ChannelName = $ChannelInfo[1];
-    $ServiceId =  $ChannelInfo[3];
-    $epginfo = array();
-    foreach(range(1, $GLOBALS['period']) as $k) :
-        $url = "http://m.hcn.co.kr/sch_ScheduleList.action";
-        $day = date("Y-m-d", strtotime("+".($k - 1)." days"));
-        $params = array(
-            'ch_id' => $ServiceId,
-            'onairdate' => $day,
-            '_' => _microtime()
-        );
-        $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 = "//li";
-                    $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("span[@class='progTime']", $row)->item(0)->nodeValue) ?: "";
-                        $startTime = date("YmdHis", strtotime($day." ".$startTime));
-                        $programName = trim($xpath->query("span[@class='progTitle']", $row)->item(0)->nodeValue) ?: "";
-                        //$category = trim($cells->item(2)->nodeValue) ?: "";
-                        //$category = preg_replace('/\(.*\)/', '', $category);
-                        $images = $row->getElementsByTagName('img');
-                        foreach($images as $image):
-                            preg_match('/re\.png/', $image->getAttribute('src'), $rebroad);
-                            if($rebroad != NULL) $rebroadcast = True;
-                            preg_match('/.*plus([\d,]+)\.png/', $image->getAttribute('src'), $grade);
-                            if($grade != NULL) $rating = $grade[1];
-                        endforeach;
-                        //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 POOQ
-function GetEPGFromPooq($ChannelInfo) {
-    $ChannelId = $ChannelInfo[0];
-    $ChannelName = $ChannelInfo[1];
-    $ServiceId =  $ChannelInfo[3];
-    $today = date("Ymd");
-    $lastday = date("Ymd", strtotime("+".($GLOBALS['period'] - 1)." days"));
-    $url = "https://wapie.pooq.co.kr/v1/epgs30/".$ServiceId."/";
-    $params = array(
-        'deviceTypeId'=> 'pc',
-        'marketTypeId'=> 'generic',
-        'apiAccessCredential'=> 'EEBE901F80B3A4C4E5322D58110BE95C',
-        'offset'=> '0',
-        'limit'=> '1000',
-        'startTime'=>  date("Y/m/d", strtotime($today)).' 00:00',
-        'endTime'=>  date("Y/m/d", strtotime($lastday)).' 00:00'
-    );
-    foreach(range(1, $GLOBALS['period']) as $k) :
-        $day = date("Y-m-d", strtotime("+".($k - 1)." days"));
-        $date_list[] = $day;
-    endforeach;
-    $params = http_build_query($params);
-    $method = "GET";
-    try {
-        $response = getWeb($url, $params, $method);
-        if ($response === False && $GLOBALS['debug']) :
-            printError($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['result']['count'] == 0) :
-                    if($GLOBALS['debug']) : 
-                        printError($ChannelName.CHANNEL_ERROR);
-                    endif;
-                else :
-                    $programs = $data['result']['list'];
-                    foreach ($programs as $program) :
-                        $startTime = $endTime = $programName = $subprogramName = $desc = $actors = $producers = $category = $episode = "";
-                        $rebroadcast = False;
-                        $rating = 0;
-                        if(in_array($program['startDate'] , $date_list)) :
-                            $startTime = $program['startDate']." ".$program['startTime'];
-                            $startTime = date("YmdHis", strtotime($startTime));
-                            $endTime = $program['startDate']." ".$program['endTime'];
-                            $endTime = date("YmdHis", strtotime($endTime));
-                            $pattern = '/^(.*?)(?:([\d,]+)회)?(?:\((재)\))?$/';
-                            $programName = str_replace("\r\n", "", $program['programTitle']);
-                            preg_match($pattern, $programName, $matches);
-                            if($matches !== NULL) :
-                                if(isset($matches[1])) $programName = trim($matches[1]) ?: "";
-                                if(isset($matches[2])) $episode = trim($matches[2]) ?: "";
-                                if(isset($matches[3])) $rebroadcast = $matches[3] ? True : False;
-                            endif;
-                            if($program['programStaring']) $actors = trim($program['programStaring'], ',');
-                            if($program['programSummary']) $desc = trim($program['programSummary']);
-                            $rating = $program['age'];
-                            $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);
-                            usleep(1000);
-                        endif;
-                    endforeach;
-                endif;
-            } catch(Exception $e) {
-                if($GLOBALS['debug']) printError($e->getMessage());
-            }
-        endif;
-    } catch (Exception $e) {
-        if($GLOBALS['debug']) printError($e->getMessage());
-    }
-}
-
-// Get EPG data from MBC
-function GetEPGFromMbc($ChannelInfo) {
-    $ChannelId = $ChannelInfo[0];
-    $ChannelName = $ChannelInfo[1];
-    $ServiceId =  $ChannelInfo[3];
-    $dayofweek = array('일', '월', '화', '수', '목', '금', '토');
-    foreach(range(1, $GLOBALS['period']) as $k) :
-        $url = "http://miniunit.imbc.com/Schedule";
-        $day = date("Y-m-d", strtotime("+".($k - 1)." days"));
-        $params = array(
-            'rtype' => 'json'
-        );
-        $params = http_build_query($params);
-        $method = "GET";
-        try {
-            $response = getWeb($url, $params, $method);
-            if ($response === False && $GLOBALS['debug']) :
-                printError($ChannelName.HTTP_ERROR);
-            else :
-                try {
-                    $data = json_decode($response, TRUE);
-                    if(json_last_error() != JSON_ERROR_NONE) throw new Exception(JSON_SYNTAX_ERROR);
-                    if(count($data['Programs']) == 0) :
-                        if($GLOBALS['debug']) : 
-                            printError($ChannelName.CHANNEL_ERROR);
-                        endif;
-                    else :
-                        $programs = $data['Programs'];
-                        foreach($programs as $program) :
-                            if($program['Channel'] == "CHAM" && $program['LiveDays'] == $dayofweek[date("w", strtotime($day))]) :
-                                $startTime = $endTime = $programName = $subprogramName = $desc = $actors = $producers = $category = $episode = "";
-                                $rebroadcast = False;
-                                $rating = 0;
-                                $pattern = '/^(.*?)(\(재\))?$/';
-                                preg_match($pattern, htmlspecialchars_decode($program['ProgramTitle']), $matches);
-                                if ($matches != NULL) :
-                                    $programName = $matches[1];
-                                    if(isset($matches[2])) $rebroadcast = $matches[2] ? True : False;
-                                endif;
-                                $startTime = $day." ".$program['StartTime'];
-                                $startTime = date("YmdHis", strtotime($startTime));
-                                $endTime = date("YmdHis", strtotime("+".$program['RunningTime']." minutes", strtotime($startTime)));
-                                $category = "음악";
-                                $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);
-                                usleep(1000);
-                            endif;
-                        endforeach;
-                    endif;
-                } catch(Exception $e) {
-                    if($GLOBALS['debug']) printError($e->getMessage());
-                }
-            endif;
-        } catch (Exception $e) {
-            if($GLOBALS['debug']) printError($e->getMessage());
-        }
-    endforeach;
-}
-
-// Get EPG data from MIL
-function GetEPGFromMil($ChannelInfo) {
-    $ChannelId = $ChannelInfo[0];
-    $ChannelName = $ChannelInfo[1];
-    $ServiceId =  $ChannelInfo[3];
-    foreach(range(1, $GLOBALS['period']) as $k) :
-        $url = "http://radio.dema.mil.kr/web/fm/quick/ajaxTimetableList.do";
-        $day = date("Y-m-d", strtotime("+".($k - 1)." days"));
-        $params = array(
-            'program_date' => date("Ymd", strtotime($day))
-        );
-        $params = http_build_query($params);
-        $method = "GET";
-        try {
-            $response = getWeb($url, $params, $method);
-            if ($response === False && $GLOBALS['debug']) :
-                printError($ChannelName.HTTP_ERROR);
-            else :
-                try {
-                    $data = json_decode($response, TRUE);
-                    if(json_last_error() != JSON_ERROR_NONE) throw new Exception(JSON_SYNTAX_ERROR);
-                    if(count($data['resultList']) == 0) :
-                        if($GLOBALS['debug']) : 
-                            printError($ChannelName.CHANNEL_ERROR);
-                        endif;
-                    else :
-                        $programs = $data['resultList'];
-                        foreach($programs as $program) :
-                            $startTime = $endTime = $programName = $subprogramName = $desc = $actors = $producers = $category = $episode = "";
-                            $rebroadcast = False;
-                            $rating = 0;
-                            $pattern = '/^(.*?)(\(재\))?$/';
-                            preg_match($pattern, htmlspecialchars_decode($program['program_title']), $matches);
-                            if ($matches != NULL) :
-                                $programName = $matches[1];
-                                if(isset($matches[2])) $rebroadcast = $matches[2] ? True : False;
-                            endif;
-                            $subprogramName =  htmlspecialchars_decode($program['program_subtitle']);
-                            $startTime = $day." ".$program['program_time'];
-                            $startTime = date("YmdHis", strtotime($startTime));
-                            $endTime = $day." ".$program['program_end_time'];
-                            $endTime = date("YmdHis", strtotime($endTime));
-                            $actors =  htmlspecialchars_decode($program['movie_actor']);
-                            $producers =  htmlspecialchars_decode($program['movie_director']);
-                            $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);
-                            usleep(1000);
-                        endforeach;
-                    endif;
-                } catch(Exception $e) {
-                    if($GLOBALS['debug']) printError($e->getMessage());
-                }
-            endif;
-        } catch (Exception $e) {
-            if($GLOBALS['debug']) printError($e->getMessage());
-        }
-    endforeach;
-}
-
-// Get EPG data from IFM
-function GetEPGFromIfm($ChannelInfo) {
-    $ChannelId = $ChannelInfo[0];
-    $ChannelName = $ChannelInfo[1];
-    $ServiceId =  $ChannelInfo[3];
-    $dayofweek = array('1', '2', '3', '4', '5', '6', '7');
-    foreach(range(1, $GLOBALS['period']) as $k) :
-        $url = "http://mapp.itvfm.co.kr/hyb/front/selectHybPgmList.do";
-        $day = date("Y-m-d", strtotime("+".($k - 1)." days"));
-        $params = array(
-            'outDay' => $dayofweek[(date("w", strtotime($day)+1))%7],
-            'viewDt' => $day
-        );
-        $params = http_build_query($params);
-        $method = "GET";
-        try {
-            $response = getWeb($url, $params, $method);
-            if ($response === False && $GLOBALS['debug']) :
-                printError($ChannelName.HTTP_ERROR);
-            else :
-                try {
-                    $data = json_decode($response, TRUE);
-                    if(json_last_error() != JSON_ERROR_NONE) throw new Exception(JSON_SYNTAX_ERROR);
-                    if(count($data['hybMusicInfoList']) == 0) :
-                        if($GLOBALS['debug']) : 
-                            printError($ChannelName.CHANNEL_ERROR);
-                        endif;
-                    else :
-                        $programs = $data['hybMusicInfoList'];
-                        foreach($programs as $program) :
-                            $startTime = $endTime = $programName = $subprogramName = $desc = $actors = $producers = $category = $episode = "";
-                            $rebroadcast = False;
-                            $rating = 0;
-                            $programName = htmlspecialchars_decode($program['pgmTitle']) ?: "";
-                            $startTime = $day." ".$program['pgmStime'];
-                            $startTime = date("YmdHis", strtotime($startTime));
-                            $endTime = $day." ".$program['pgmEtime'];
-                            $endTime = date("YmdHis", strtotime($endTime));
-                            $actors =  htmlspecialchars_decode($program['pgmDj']);
-                            $producers =  htmlspecialchars_decode($program['pgmPd']);
-                            $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);
-                            usleep(1000);
-                        endforeach;
-                    endif;
-                } catch(Exception $e) {
-                    if($GLOBALS['debug']) printError($e->getMessage());
-                }
-            endif;
-        } catch (Exception $e) {
-            if($GLOBALS['debug']) printError($e->getMessage());
-        }
-    endforeach;
-}
-
-// Get EPG data from KBS
-function GetEPGFromKbs($ChannelInfo) {
-    $ChannelId = $ChannelInfo[0];
-    $ChannelName = $ChannelInfo[1];
-    $ServiceId =  $ChannelInfo[3];
-    $epginfo = array();
-    foreach(range(1, $GLOBALS['period']) as $k) :
-        $url = "http://world.kbs.co.kr/include/wink/_ajax_schedule.php";
-        $day = date("Y-m-d", strtotime("+".($k - 1)." days"));
-        $params = array(
-            'channel'=>'wink_11'
-        );
-        $params = http_build_query($params);
-        $method = "GET";
-        try {
-             $response = getWeb($url, $params, $method);
-            if ($response === False && $GLOBALS['debug']) :
-                printError($ChannelName.HTTP_ERROR);
-            else :
-                try {
-                    $data = json_decode($response, TRUE);
-                    if(json_last_error() != JSON_ERROR_NONE) throw new Exception(JSON_SYNTAX_ERROR);
-                    if(count($data['schedule']) == 0) :
-                        if($GLOBALS['debug']) : 
-                            printError($ChannelName.CHANNEL_ERROR);
-                        endif;
-                    else :
-                        $dom = new DomDocument;
-                        libxml_use_internal_errors(True);
-                        $dom->loadHTML($data['schedule']);
-                        $xpath = new DomXPath($dom);
-                        $query = "//li";
-                        $rows = $xpath->query($query);
-                        foreach($rows as $row) :
-                            $startTime = $endTime = $programName = $subprogramName = $desc = $actors = $producers = $category = $episode = "";
-                            $rebroadcast = False;
-                            $rating = 0;
-                            $cells = $row->getElementsByTagName('span');
-                            $startTime = $day." ".trim($cells->item(0)->childNodes->item(0)->nodeValue);
-                            $startTime = date("YmdHis", strtotime($startTime));
-                            $programName = trim($cells->item(2)->childNodes->item(0)->nodeValue);
-                            $programName = str_replace(array("[","]", " Broadcast"), array("", "", ""), $programName);
-                            //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;
-                    endif;
-                } catch(Exception $e) {
-                    if($GLOBALS['debug']) printError($e->getMessage());
-                }
-            endif;
-        } catch (Exception $e) {
-            if($GLOBALS['debug']) printError($e->getMessage());
-        }
-    endforeach;
-    epgzip($epginfo);
-}
-
-function GetEPGFromArirang($ChannelInfo) {
-    $ChannelId = $ChannelInfo[0];
-    $ChannelName = $ChannelInfo[1];
-    $ServiceId =  $ChannelInfo[3];
-    $epginfo = array();
-    foreach(range(1, $GLOBALS['period']) as $k) :
-        $url = "http://www.arirang.com/Radio/Radio_Index.asp";
-        $day = date("Y-m-d", strtotime("+".($k - 1)." days"));
-        $params = array();
-        $params = http_build_query($params);
-        $method = "GET";
-       try {
-            $response = getWeb($url, $params, $method);
-            if ($response === False && $GLOBALS['debug']) :
-                printError($ChannelName.HTTP_ERROR);
-            else :
-                $dom = new DomDocument;
-                libxml_use_internal_errors(True);
-                //echo $response;
-
-                $response = mb_convert_encoding($response, "HTML-ENTITIES", "EUC-KR");
-                if($dom->loadHTML($response)):
-                    $xpath = new DomXPath($dom);
-                    $dayofweek = date("w", strtotime($day));
-                    if($dayofweek == 0):
-                        $query = "//table[@id='aIRSW_sun']/tr";
-                    elseif($dayofweek == 6):
-                        $query = "//table[@id='aIRSW_sat']/tr";
-                    else :
-                        $query = "//table[@id='aIRSW_week']/tr";
-                    endif;
-                    $rows = $xpath->query($query);
-                    foreach($rows as $row) :
-                        $startTime = $endTime = $programName = $subprogramName = $desc = $actors = $producers = $category = $episode = "";
-                        $rebroadcast = False;
-                        $rating = 0;
-                        $time = $row->getElementsByTagName('th');
-                        $times = explode('~', trim($time->item(0)->nodeValue));
-                        $startTime = date("YmdHis", strtotime($day." ".$times[0]));
-                        $endTime = date("YmdHis", strtotime($day." ".$times[1]));
-                        $program = $row->getElementsByTagName('td');
-                        $pattern = '/^(.*?)(?:\((Re)\))?$/';
-                        preg_match($pattern, trim($program->item(0)->nodeValue), $matches);
-                        if ($matches != NULL) :
-                            $programName = $matches[1];
-                            if(isset($matches[2])) $rebroadcast = $matches[2] ? True : False;
-                        endif;
-                        $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);
-                        usleep(1000);
-                    endforeach;
-                else :
-                    if($GLOBALS['debug']) printError($ChannelName.CONTENT_ERROR);
-                endif;
-            endif;
-        } catch (Exception $e) {
-            if($GLOBALS['debug']) printError($e->getMessage());
-        }
-    endforeach;
-}
-
-# Zip epginfo
-function epgzip($epginfo) {
-    #ChannelId, startTime, programName, subprogramName, desc, actors, producers, category, episode, rebroadcast, rating
-    $zipped = array_slice(array_map(NULL, $epginfo, array_slice($epginfo,1)),0,-1);
-    foreach($zipped as $epg) :
-        $ChannelId = $epg[0][0] ?: "";
-        $startTime = $epg[0][1] ?: "";
-        $endTime = $epg[1][1] ?: "";
-        $programName = $epg[0][2] ?: "";
-        $subprogramName = $epg[0][3] ?: "";
-        $desc = $epg[0][4] ?: "";
-        $actors = $epg[0][5] ?: "";
-        $producers = $epg[0][6] ?: "";
-        $category = $epg[0][7] ?: "";
-        $episode = $epg[0][8] ?: "";
-        $rebroadcast = $rebroadcast = $epg[0][9] ? True: False;
-        $rating = $epg[0][10] ?: 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;
-}
-
-function writeProgram($programdata) {
-    $fp = $GLOBALS['fp'];
-    $ChannelId = $programdata['channelId'];
-    $startTime = $programdata['startTime'];
-    $endTime = $programdata['endTime'];
-    $programName = trim(htmlspecialchars($programdata['programName'], ENT_XML1));
-    $subprogramName = trim(htmlspecialchars($programdata['subprogramName'], ENT_XML1));
-    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;
-    if($programName == NULL):
-        $programName = $subprogramName;
-    endif;
-    $actors = htmlspecialchars($programdata['actors'], ENT_XML1);
-    $producers = htmlspecialchars($programdata['producers'], ENT_XML1);
-    $category = htmlspecialchars($programdata['category'], ENT_XML1);
-    $episode = $programdata['episode'];
-    if($episode) :
-        $episode_ns = (int)$episode - 1;
-        $episode_ns = '0' . '.' . $episode_ns . '.' . '0' . '/' . '0';
-        $episode_on = $episode;
-    endif;
-    $rebroadcast = $programdata['rebroadcast'];
-    if($episode && $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['addverbose'] == 'y') :
-        $desc = trim(htmlspecialchars($programdata['programName'], ENT_XML1));
-        if($subprogramName)  $desc = $desc."\n부제 : ".$subprogramName;
-        if($rebroadcast == True && $GLOBALS['addrebroadcast']  == 'y') $desc = $desc."\n방송 : 재방송";
-        if($episode) $desc = $desc."\n회차 : ".$episode."회";
-        if($category) $desc = $desc."\n장르 : ".$category;
-        if($actors) $desc = $desc."\n출연 : ".trim($actors);
-        if($producers) $desc = $desc."\n제작 : ".trim($producers);
-        $desc = $desc."\n등급 : ".$rating;
-    else:
-        $desc = "";
-    endif;
-    if($programdata['desc']) $desc = $desc."\n".htmlspecialchars($programdata['desc'], ENT_XML1);
-    $desc = preg_replace('/ +/', ' ', $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',
-        '시사/다큐' => 'Documentary',
-        '연예' => 'Show / Game show',
-        '스포츠' => 'Sports',
-        '홈쇼핑' => 'Advertisement / Shopping'
-       );
-    $contentType = "";
-    foreach($contentTypeDict as $key => $value) :
-        if(!(strpos($category, $key) === False)) :
-            $contentType = $value;
-        endif;
-    endforeach;
-    fprintf($fp, "  \n", $startTime, $endTime, $ChannelId);
-    fprintf($fp, "    %s\n", $programName);
-    if($subprogramName) :
-        fprintf($fp, "    %s\n", $subprogramName);
-    endif;
-    if($GLOBALS['addverbose']=='y') :
-        fprintf($fp, "    %s\n", $desc);
-        if($actors || $producers):
-            fprintf($fp, "    \n");
-            if($actors) :
-                foreach(explode(',', $actors) as $actor):
-                    if(trim($actor)) fprintf($fp, "      %s\n", trim($actor));
-                endforeach;
-            endif;
-            if($producers) :
-                foreach(explode(',', $producers) as $producer):
-                    if(trim($producer)) fprintf($fp, "      %s\n", trim($producer));
-                endforeach;
-            endif;
-            fprintf($fp, "    \n");
-        endif;
-    endif;
-    if($category) fprintf($fp, "    %s\n", $category);
-    if($contentType) fprintf($fp, "    %s\n", $contentType);
-    if($episode) fprintf($fp, "    %s\n", $episode_ns);
-    if($episode) fprintf($fp, "    %s\n", $episode_on);
-    if($rebroadcast) fprintf($fp, "    \n");
-    if($rating) :
-        fprintf($fp, "    \n");
-        fprintf($fp, "      %s\n", $rating);
-        fprintf($fp, "    \n");
-    endif;
-    fprintf($fp, "  \n");
-}
-
-function getWeb($url, $params, $method) {
-    $ch = curl_init();
-    if($method == "GET"):
-        $url = $url."?".$params;
-    elseif($method == "POST"):
-        curl_setopt ($ch, CURLOPT_POST, True);
-        curl_setopt ($ch, CURLOPT_POSTFIELDS, $params);
-    endif;
-    curl_setopt($ch, CURLOPT_URL, $url);
-    curl_setopt($ch, CURLOPT_RETURNTRANSFER, True);
-    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $GLOBALS['timeout']);
-    curl_setopt($ch, CURLOPT_HEADER, False);
-    curl_setopt($ch, CURLOPT_FAILONERROR, True);
-    curl_setopt($ch, CURLOPT_USERAGENT, $GLOBALS['ua']);
-    $response = curl_exec($ch);
-    if(curl_error($ch) && $GLOBALS['debug']) printError($url." ".curl_error($ch));
-    curl_close($ch);
-    return $response;
-}
-
-function printLog($string) {
-    header("Content-Type: text/plain; charset=utf-8");
-    print($string."\n");
-}
-
-function printError($string) {
-    header("Content-Type: text/plain; charset=utf-8");
-    print("Error : ".$string."\n");
-}
-
-function _microtime() {
-    list($usec, $sec) = explode(" ", microtime());
-    return ($sec.(int)($usec*1000));
-}
 ?>
diff --git a/epg2xml.php b/epg2xml.php
index 51bf96c..e6edadb 100644
--- a/epg2xml.php
+++ b/epg2xml.php
@@ -1,5 +1,6 @@
 #!/usr/bin/env php
  2 ? 2 : $period;
                     else :
                         printError("default_fetch_limit는 1, 2, 3, 4, 5, 6, 7만 가능합니다.");
                         exit;
@@ -297,1357 +298,4 @@ elseif($output == "socket") :
         exit;
     endif;
 endif;
-
-function getEPG() {
-    $fp = $GLOBALS['fp'];
-    $MyISP = $GLOBALS['MyISP'];
-    $MyChannels = $GLOBALS['MyChannels'];
-    $Channelfile = __DIR__."/Channel.json";
-    $IconUrl = "";
-    $ChannelInfos = array();
-    try {
-        $f = @file_get_contents($Channelfile);
-        if($f === False) :
-            printError("Channel.json.".JSON_FILE_ERROR);
-            exit;
-        else :
-            try {
-                $Channeldatajson = json_decode($f, TRUE);
-                if(json_last_error() != JSON_ERROR_NONE) throw new Exception("Channel.".JSON_SYNTAX_ERROR);
-            }
-            catch(Exception $e) {
-                printError($e->getMessage());
-                exit;
-            }
-        endif;
-    }
-    catch(Exception $e) {
-        printError($e->getMessage());
-        exit;
-    }
-//My Channel 정의
-    $MyChannelInfo = array();
-    if($MyChannels) :
-        $MyChannelInfo = array_map('trim',explode(',', $MyChannels));
-    endif;
-
-    fprintf($fp, "\n");
-    fprintf($fp, "\n\n");
-    fprintf($fp, "\n", VERSION);
- 
-    foreach ($Channeldatajson as $Channeldata) : //Get Channel & Print Channel info
-        if($Channeldata['Enabled'] == 1 ||  in_array($Channeldata['Id'], $MyChannelInfo)) :
-            $ChannelId = $Channeldata['Id'];
-            $ChannelName = htmlspecialchars($Channeldata['Name'], ENT_XML1);
-            $ChannelSource = $Channeldata['Source'];
-            $ChannelServiceId = $Channeldata['ServiceId'];
-            $ChannelIconUrl = htmlspecialchars($Channeldata['Icon_url'], ENT_XML1);            
-            if($MyISP != "ALL" && $Channeldata[$MyISP.'Ch'] != Null):
-                $ChannelInfos[] = array($ChannelId,  $ChannelName, $ChannelSource, $ChannelServiceId);
-                $Channelnumber = $Channeldata[$MyISP.'Ch'];
-                $ChannelISPName = htmlspecialchars($Channeldata[$MyISP." Name"], ENT_XML1);
-                fprintf($fp, "  \n", $ChannelId);
-                fprintf($fp, "    %s\n", $ChannelName);
-                fprintf($fp, "    %s\n", $ChannelISPName);
-                fprintf($fp, "    %s\n", $Channelnumber);
-                fprintf($fp, "    %s\n", $Channelnumber." ".$ChannelISPName);
-                if($IconUrl) :
-                    fprintf($fp, "    \n", $IconUrl, $ChannelId);
-                else :
-                    fprintf($fp, "    \n", $ChannelIconUrl);
-                endif;
-                fprintf($fp, "  \n");
-            elseif($MyISP == "ALL"):
-                $ChannelInfos[] = array($ChannelId,  $ChannelName, $ChannelSource, $ChannelServiceId);
-                fprintf($fp, "  \n", $ChannelId);
-                fprintf($fp, "    %s\n", $ChannelName);
-                if($IconUrl) :
-                    fprintf($fp, "    \n", $IconUrl, $ChannelId);
-                else :
-                    fprintf($fp, "    \n", $ChannelIconUrl);
-                endif;
-                fprintf($fp, "  \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 == 'SKB') :
-            GetEPGFromSKB($ChannelInfo);
-        elseif($ChannelSource == 'SKY') :
-            GetEPGFromSKY($ChannelInfo);
-        elseif($ChannelSource == 'NAVER') :
-            GetEPGFromNaver($ChannelInfo);
-        elseif($ChannelSource == 'ISCS') :
-            GetEPGFromIscs($ChannelInfo);
-        elseif($ChannelSource == 'HCN') :
-            GetEPGFromHcn($ChannelInfo);
-        elseif($ChannelSource == 'POOQ') :
-            GetEPGFromPooq($ChannelInfo);
-        elseif($ChannelSource == 'MBC') :
-            GetEPGFromMbc($ChannelInfo);
-        elseif($ChannelSource == 'MIL'):
-            GetEPGFromMil($ChannelInfo);
-        elseif($ChannelSource == 'IFM'):
-            GetEPGFromIfm($ChannelInfo);
-        elseif($ChannelSource == 'KBS'):
-            GetEPGFromKbs($ChannelInfo);
-        elseif($ChannelSource == 'ARIRANG'):
-            GetEPGFromArirang($ChannelInfo);
-        endif;
-    endforeach;
-    fprintf($fp, "\n");
-}
-
-// Get EPG data from epg.co.kr
-function GetEPGFromEPG($ChannelInfo) {
-    $ChannelId = $ChannelInfo[0];
-    $ChannelName = $ChannelInfo[1];
-    $ServiceId =  $ChannelInfo[3];
-    $epginfo = array();
-    foreach(range(1, $GLOBALS['period']) as $k) :
-        $url = "http://211.43.210.10:88/epg-cgi/extern/cnm_guide_type_v070530.php";
-        $day = date("Ymd", strtotime("+".($k - 1)." days"));
-        $params = array(
-            'beforegroup' => '100',
-            'checkchannel[]' => $ServiceId,
-            'select_group' => '100',
-            'start_date' => $day
-        );
-        $params = http_build_query($params);
-        $method = "POST";
-        try {
-            $response = getWeb($url, $params, $method);
-            if ($response === False && $GLOBALS['debug']) :
-                printError($ChannelName.HTTP_ERROR);
-            else :
-                $response = str_replace("charset=euc-kr", "charset=utf-8", $response);
-                $response = mb_convert_encoding($response, "UTF-8", "EUC-KR");
-                $pattern = '/(.*)<\/td>/';
-                $response = preg_replace_callback($pattern, function($matches) { return ''.htmlspecialchars($matches[1], ENT_NOQUOTES).'';}, $response);
-                $response = str_replace(array('</b>', '</a>', '<img', 'valign=top>','align=absmiddle>'), array('', '', '','>'), $response);
-                $dom = new DomDocument;
-                libxml_use_internal_errors(True);
-                if($dom->loadHTML($response)):
-                    $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) :
-                            $startTime = $endTime = $programName = $subprogramName = $desc = $actors = $producers = $category = $episode = "";
-                            $rebroadcast = False;
-                            $rating = 0;
-                            $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);
-                            $minute = str_replace(array("[", "]"), array("",""), trim($minute->nodeValue));
-                            $minute = substr($minute, -2);
-                            $hour = $hour.":".$minute;
-                            switch ($i) :
-                                case 2 :
-                                    $hour = $hour." AM";
-                                    break;
-                                case 3 :
-                                    $hour = $hour." PM";
-                                    break;
-                                case 4 :
-                                    if($hour > 5 && $hour < 12) :
-                                        $hour = $hour." PM";
-                                    elseif($hour <5 || $hour == 12) :
-                                        $hour = $hour." AM";
-                                        $thisday = date("Ymd", strtotime($day." +1 days"));
-                                    endif;
-                                    break;
-                            endswitch;
-                            $startTime = date("YmdHis", strtotime($thisday." ".$hour));
-                            $pattern = '/^(.*?)\s*(?:<(.*)>)?\s*(?:\((재)\))?\s*(?:\(([\d,]+)회\)?)?$/';
-                            $programName = trim($program->nodeValue);
-                             preg_match($pattern, $programName, $matches);
-                            if ($matches != NULL) :
-                                if(isset($matches[1])) $programName = trim($matches[1]) ?: "";
-                                if(isset($matches[2])) $subprogramName = trim($matches[2]) ?: "";
-                                if(isset($matches[3])) $rebroadcast = $matches[3] ? True : False;
-                                if(isset($matches[4])) $episode = $matches[4] ?: "";
-                            endif;
-                            $images = $program->getElementsByTagName('img');
-                            foreach($images as $image):
-                                preg_match('/.*schedule_([\d,]+)?.*/', $image->getAttribute('src'), $grade);
-                                if($grade != NULL) $rating = $grade[1];
-                            endforeach;
-                            //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;
-                    endfor;
-                 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 KT
-function GetEPGFromKT($ChannelInfo) {
-    $ChannelId = $ChannelInfo[0];
-    $ChannelName = $ChannelInfo[1];
-    $ServiceId =  $ChannelInfo[3];
-    $epginfo = array();
-    foreach(range(1, $GLOBALS['period']) as $k) :
-        $url = "http://tv.olleh.com/renewal_sub/liveTv/pop_schedule_week.asp";
-        $day = date("Ymd", strtotime("+".($k - 1)." days"));
-        $params = array(
-            'ch_name' => '',
-            'ch_no' => $ServiceId,
-            'nowdate'=> $day,
-            'seldatie' => $day,
-            'tab_no' => '1'
-        );
-        $params = http_build_query($params);
-        $method = "GET";
-        try {
-            $response = getWeb($url, $params, $method);
-            if ($response === False && $GLOBALS['debug']) :
-                printError($ChannelName.HTTP_ERROR);
-            else :
-                $response = str_replace("charset=euc-kr", "charset=utf-8", $response);
-                $response = mb_convert_encoding($response, "UTF-8", "EUC-KR");
-                $dom = new DomDocument;
-                libxml_use_internal_errors(True);
-                if($dom->loadHTML($response)):
-                    $xpath = new DomXPath($dom);
-                    $query = "//table[@id='pop_day']/tbody/tr";
-                    $rows = $xpath->query($query);
-                    foreach($rows as $row) :
-                        $startTime = $endTime = $programName = $subprogramName = $desc = $actors = $producers = $category = $episode = "";
-                        $rebroadcast = False;
-                        $rating = 0;
-                        $cells = $row->getElementsByTagName('td');
-                        //programName, startTime, rating, category
-                        $startTime = date("YmdHis", strtotime($day." ".trim($cells->item(0)->nodeValue)));
-                        $pattern = '/^(.*?)( <(.*)>)?$/';
-                        $programName = trim($cells->item(1)->nodeValue);
-                        preg_match($pattern, $programName, $matches);
-                        if ($matches != NULL) :
-                           if(isset($matches[1])) $programName = $matches[1] ?: "";
-                           if(isset($matches[3])) $subprogramName = $matches[3] ?: "";
-                        endif;
-                        $category = trim($cells->item(4)->nodeValue);
-                        $rating = str_replace("all", 0, str_replace("세 이상", "", trim($cells->item(2)->nodeValue)));
-                        //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 LG
-function GetEPGFromLG($ChannelInfo) {
-    $ChannelId = $ChannelInfo[0];
-    $ChannelName = $ChannelInfo[1];
-    $ServiceId =  $ChannelInfo[3];
-    $epginfo = array();
-    foreach(range(1, $GLOBALS['period']) as $k) :
-        $url = "http://www.uplus.co.kr/css/chgi/chgi/RetrieveTvSchedule.hpi";
-        $day = date("Ymd", strtotime("+".($k - 1)." days"));
-        $params = array(
-            'chnlCd' => $ServiceId,
-            'evntCmpYmd' =>  $day
-        );
-        $params = http_build_query($params);
-        $method = "POST";
-        try {
-            $response = getWeb($url, $params, $method);
-            if ($response === False && $GLOBALS['debug']) :
-                printError($ChannelName.HTTP_ERROR);
-            else :
-                $response = ''.$response;
-                $response = mb_convert_encoding($response, "UTF-8", "EUC-KR");
-                $response = str_replace(array('<재>', ' [..', ' (..'), array('<재>', '', ''), $response);
-                $dom = new DomDocument;
-                libxml_use_internal_errors(True);
-                if($dom->loadHTML($response)):
-                    $xpath = new DomXPath($dom);
-                    $query = "//div[@class='tblType list']/table/tbody/tr";
-                    $rows = $xpath->query($query);
-                    foreach($rows as $row) :
-                        $startTime = $endTime = $programName = $subprogramName = $desc = $actors = $producers = $category = $episode = "";
-                        $rebroadcast = False;
-                        $rating = 0;
-                        $cells = $row->getElementsByTagName('td');
-                        $startTime = date("YmdHis", strtotime($day." ".trim($cells->item(0)->nodeValue)));
-                        $programName = trim($cells->item(1)->childNodes->item(0)->nodeValue);
-                        $pattern = '/(<재>)?\s?(?:\[.*?\])?(.*?)(?:\[(.*)\])?\s?(?:\(([\d,]+)회\))?$/';
-                        preg_match($pattern, $programName, $matches);
-                        if ($matches != NULL) :
-                            if(isset($matches[2])) $programName = trim($matches[2]) ?: "";
-                            if(isset($matches[3])) $subprogramName = trim($matches[3]) ?: "";
-                            if(isset($matches[4])) $episode = trim($matches[4]) ?: "";
-                            if(isset($matches[1])) $rebroadcast = trim($matches[1]) ? True: False;
-                        endif;
-                        $category = trim($cells->item(2)->nodeValue);
-                        $spans = $cells->item(1)->getElementsByTagName('span');
-                        $rating = trim($spans->item(1)->nodeValue)=="All" ? 0 : trim($spans->item(1)->nodeValue);
-                        //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 SK
-function GetEPGFromSK($ChannelInfo) {
-    $ChannelId = $ChannelInfo[0];
-    $ChannelName = $ChannelInfo[1];
-    $ServiceId =  $ChannelInfo[3];
-    $today = date("Ymd");
-    $lastday = date("Ymd", strtotime("+".($GLOBALS['period'] - 1)." days"));
-    $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);
-    $method = "POST";
-    try {
-        $response = getWeb($url, $params, $method);
-        if ($response === False && $GLOBALS['debug']) :
-            printError($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) :
-                    if($GLOBALS['debug']) : 
-                        printError($ChannelName.CHANNEL_ERROR);
-                    endif;
-                else :
-                    $programs = $data['channel']['programs'];
-                    foreach ($programs as $program) :
-                        $startTime = $endTime = $programName = $subprogramName = $desc = $actors = $producers = $category = $episode = "";
-                        $rebroadcast = False;
-                        $rating = 0;
-                        $pattern = '/^(.*?)(?:\s*[\(<]([\d,회]+)[\)>])?(?:\s*<([^<]*?)>)?(\((재)\))?$/';
-                        preg_match($pattern, str_replace('...', '>', $program['programName']), $matches);
-                        if ($matches != NULL) :
-                            if(isset($matches[1])) $programName = trim($matches[1]) ?: "";
-                            if(isset($matches[3])) $subprogramName = trim($matches[3]) ?: "";
-                            if(isset($matches[2])) $episode = str_replace("회", "", $matches[2]) ?: "";
-                            if(isset($matches[5])) $rebroadcast = $matches[5] ? True : False;
-                        endif;
-                        $startTime = date("YmdHis",$program['startTime']/1000);
-                        $endTime = date("YmdHis",$program['endTime']/1000);
-                        $desc = $program['synopsis'] ?: "";
-                        $actors =trim(str_replace('...','',$program['actorName']), ', ') ?: "";
-                        $producers = trim(str_replace('...','',$program['directorName']), ', ') ?: "";
-                        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);
-                        usleep(1000);
-                    endforeach;
-                endif;
-            } catch(Exception $e) {
-                if($GLOBALS['debug']) printError($e->getMessage());
-            }
-        endif;
-    } catch (Exception $e) {
-        if($GLOBALS['debug']) printError($e->getMessage());
-    }
-}
-
-// Get EPG data from SKB
-function GetEPGFromSKB($ChannelInfo) {
-    $ChannelId = $ChannelInfo[0];
-    $ChannelName = $ChannelInfo[1];
-    $ServiceId =  $ChannelInfo[3];
-    $epginfo = array();
-    foreach(range(1, $GLOBALS['period']) as $k) :
-        $url = "http://m.skbroadband.com/content/realtime/Channel_List.do";
-        $day = date("Ymd", strtotime("+".($k - 1)." days"));
-        $params = array(
-            'key_depth2' => $ServiceId,
-            'key_depth3' => $day
-        );
-        $params = http_build_query($params);
-        $method = "POST";
-        try {
-            $response = getWeb($url, $params, $method);
-            if ($response === False && $GLOBALS['debug']) :
-                printError($ChannelName.HTTP_ERROR);
-            else :
-                $response = str_replace('charset="euc-kr"', 'charset="utf-8"', $response);
-                $response = mb_convert_encoding($response, "UTF-8", "EUC-KR");
-                $response = preg_replace('//is', '', $response);
-                $response = preg_replace('/<\/span>/is', '', $response);
-                $pattern = '/(.*)<\/span>/';
-                $response = preg_replace_callback($pattern, function($matches) { return ''.htmlspecialchars($matches[1], ENT_NOQUOTES).'';}, $response);
-                $dom = new DomDocument;
-                libxml_use_internal_errors(True);
-                if($dom->loadHTML($response)):
-                    $xpath = new DomXPath($dom);
-                    $query = "//span[@class='caption' or @class='explan' or @class='fullHD' or @class='UHD' or @class='nowon']";
-                    $spans = $xpath->query($query);
-                    foreach($spans as $span) :
-                        $span->parentNode->removeChild( $span);
-                    endforeach;
-                    $query = "//div[@id='dawn']/ul/li";
-                    $rows = $xpath->query($query);
-                    foreach($rows as $row) :
-                        $startTime = $endTime = $programName = $subprogramName = $desc = $actors = $producers = $category = $episode = "";
-                        $rebroadcast = False;
-                        $rating = 0;
-                        $cells = $row->getElementsByTagName('span');
-                        $startTime = $cells->item(0)->nodeValue ?: "";
-                        $startTime = date("YmdHis", strtotime($day." ".$startTime));
-                        $programName = trim($cells->item(2)->nodeValue) ?: "";
-                        $pattern = '/^(.*?)(\(([\d,]+)회\))?(<(.*)>)?(\((재)\))?$/';
-                        preg_match($pattern, $programName, $matches);
-                        if ($matches != NULL) :
-                            if(isset($matches[1])) $programName = trim($matches[1]) ?: "";
-                            if(isset($matches[5])) $subprogramName = trim($matches[5]) ?: "";
-                            if(isset($matches[3])) $episode = $matches[3] ?: "";
-                            if(isset($matches[7])) $rebroadcast = $matches[7] ? True : False;
-                        endif;
-                        if($cells->length > 3) $rating = str_replace('세', '', $cells->item(3)->nodeValue)  ?: 0;
-                        //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 SKY
-function GetEPGFromSKY($ChannelInfo) {
-    $ChannelId = $ChannelInfo[0];
-    $ChannelName = $ChannelInfo[1];
-    $ServiceId =  $ChannelInfo[3];
-    foreach(range(1, $GLOBALS['period']) as $k) :
-        $url = "http://www.skylife.co.kr/channel/epg/channelScheduleListJson.do";
-        $day = date("Y-m-d", strtotime("+".($k - 1)." days"));
-        $params = array(
-            'area' => 'in',
-            'inFd_channel_id' => $ServiceId,
-            'inairdate' => $day,
-            'indate_type' => 'now'
-        );
-        $params = http_build_query($params);
-        $method = "POST";
-        try {
-            $response = getWeb($url, $params, $method);
-            if ($response === False && $GLOBALS['debug']) :
-                printError($ChannelName.HTTP_ERROR);
-            else :
-                try {
-                    $data = json_decode($response, TRUE);
-                    if(json_last_error() != JSON_ERROR_NONE) throw new Exception(JSON_SYNTAX_ERROR);
-                    if(count($data['scheduleListIn']) == 0) :
-                        if($GLOBALS['debug']) :
-                            printError($ChannelName.CHANNEL_ERROR);
-                        endif;
-                    else :
-                        $programs = $data['scheduleListIn'];
-                        foreach($programs as $program) :
-                            $startTime = $endTime = $programName = $subprogramName = $desc = $actors = $producers = $category = $episode = "";
-                            $rebroadcast = False;
-                            $rating = 0;
-                            $programName = htmlspecialchars_decode($program['program_name']) ?: "";
-                            $subprogramName = str_replace(array('lt;', 'gt;', 'amp;'), array('<', '>', '&'),$program['program_subname']) ?: "";
-                            $startTime = $program['starttime'];
-                            $endTime = $program['endtime'];
-                            $actors = trim(str_replace('...', '',$program['cast']), ', ') ?: "";
-                            $producers = trim(str_replace('...', '',$program['dirt']), ', ') ?: "";
-                            $description = str_replace(array('lt;', 'gt;', 'amp;'), array('<', '>', '&'),$program['description']) ?: "";
-                            $summary = str_replace(array('lt;', 'gt;', 'amp;'), array('<', '>', '&'),$program['summary']) ?: "";
-                            $desc = $description ?: "";
-                            if($desc) :
-                                if($summary):
-                                    $desc = $desc."\n".$summary;
-                                endif;
-                            else :
-                                $desc = $summary;
-                            endif;
-                            $category = $program['program_category1'];
-                            $episode = $program['episode_id'] ?: "";
-                            $rebroadcast = $program['rebroad']== "Y" ? True : False;
-                            $rating = $program['grade'] ?: 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);
-                            usleep(1000);
-                        endforeach;
-                    endif;
-                } catch(Exception $e) {
-                    if($GLOBALS['debug']) printError($e->getMessage());
-                }
-            endif;
-        } catch (Exception $e) {
-            if($GLOBALS['debug']) printError($e->getMessage());
-        }
-    endforeach;
-}
-
-// Get EPG data from Naver
-function GetEPGFromNaver($ChannelInfo) {
-    $ChannelId = $ChannelInfo[0];
-    $ChannelName = $ChannelInfo[1];
-    $ServiceId =  $ChannelInfo[3];
-    $epginfo = array();
-    $totaldate = array();
-    foreach(range(1, $GLOBALS['period']) as $k) :
-        $url = "https://search.naver.com/p/csearch/content/batchrender_ssl.nhn";
-        $day = date("Ymd", strtotime("+".($k - 1)." days"));
-        $totaldate[] = $day;
-    endforeach;
-    $params = array(
-        '_callback' => 'epg',
-        'fileKey' => 'single_schedule_channel_day',
-        'pkid' => '66',
-        'u1' => 'single_schedule_channel_day',
-        'u2' => join(",", $totaldate),
-        'u3' => $day,
-        'u4' => $GLOBALS['period'],
-        'u5' => $ServiceId,
-        'u6' => 1,
-        'u7' => $ChannelName."편성표", 
-        'u8' => $ChannelName."편성표",
-        'where' => 'nexearch'
-    );
-    $params = http_build_query($params);
-    $method = "GET";
-    try {
-        $response = getWeb($url, $params, $method);
-        if ($response === False && $GLOBALS['debug']) :
-            printError($ChannelName.HTTP_ERROR);
-        else :
-            try {
-                $response = str_replace('epg( ', '', $response );
-                $response = substr($response, 0, strlen($response)-2);
-                $response = preg_replace("/\/\*.*?\*\//","",$response);
-                $data = json_decode($response, TRUE);
-                if(json_last_error() != JSON_ERROR_NONE) throw new Exception(JSON_SYNTAX_ERROR);
-                 if($data['displayDates'][0]['count'] == 0) :
-                    if($GLOBALS['debug']) : 
-                        printError($ChannelName.CHANNEL_ERROR);
-                    endif;
-                else :
-                    for($i = 0; $i < count($data['displayDates']); $i++) :
-                        for($j = 0; $j < 24; $j++) :
-                            foreach($data['schedules'][$j][$i] as $program) :
-                                $startTime = $endTime = $programName = $subprogramName = $desc = $actors = $producers = $category = $episode = "";
-                                $rebroadcast = False;
-                                $rating = 0;
-                                $startTime = date("YmdHis", strtotime($data['displayDates'][$i]['date']." ".$program['startTime']));
-                                $programName = htmlspecialchars_decode(trim($program['title']), ENT_XML1);
-                                $episode = str_replace("회","", $program['episode']);
-                                $rebroadcast = $program['isRerun'] ? True : False;
-                                $rating = $program['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;
-                        endfor;
-                    endfor;
-                endif;
-             } catch(Exception $e) {
-                if($GLOBALS['debug']) printError($e->getMessage());
-            }
-        endif;
-    } catch (Exception $e) {
-        if($GLOBALS['debug']) printError($e->getMessage());
-    }
-    epgzip($epginfo);
-}
-
-// Get EPG data from Iscs
-function GetEPGFromIscs($ChannelInfo) {
-    $ChannelId = $ChannelInfo[0];
-    $ChannelName = $ChannelInfo[1];
-    $ServiceId =  $ChannelInfo[3];
-    $epginfo = array();
-    foreach(range(1, $GLOBALS['period']) as $k) :
-        $url = "http://m.iscs.co.kr/sub/02/data.asp";
-        $day = date("Y-m-d", strtotime("+".($k - 1)." days"));
-        $params = array(
-            'Exec_Mode' => 'view',
-            'Source_Id' => $ServiceId,
-            'Ch_Day' => $day
-        );
-        $params = http_build_query($params);
-        $method = "POST";
-        try {
-            $response = getWeb($url, $params, $method);
-            if ($response === False && $GLOBALS['debug']) :
-                printError($ChannelName.HTTP_ERROR);
-            else :
-                try {
-                    $data = json_decode($response, TRUE);
-                    if(json_last_error() != JSON_ERROR_NONE) throw new Exception(JSON_SYNTAX_ERROR);
-                    if(count($data['total']) == 0) :
-                        if($GLOBALS['debug']) :
-                            printError($ChannelName.CHANNEL_ERROR);
-                        endif;
-                    else :
-                        $programs = $data['list'];
-                        foreach($programs as $program) :
-                            $startTime = $endTime = $programName = $subprogramName = $desc = $actors = $producers = $category = $episode = "";
-                            $rebroadcast = False;
-                            $rating = 0;
-                            $startTime = date("YmdHis", strtotime($day." ".$program['Time']));
-                            $pattern = '/^(.*?)(?:\(([\d,]+)회\))?(?:\((재)\))?$/';
-                            preg_match($pattern, trim($program['Pg_Name']), $matches);
-                            if ($matches != NULL) :
-                                if(isset($matches[1])) $programName = trim($matches[1]) ?: "";
-                                if(isset($matches[2])) $episode = $matches[2] ?: "";
-                                if(isset($matches[3])) $rebroadcast = $matches[3] ? True : False;
-                            endif;
-                            if($program['Rating'] == '모든연령'):
-                                $rating = 0;
-                            else:
-                                $rating = str_replace("세이상","", $program['Rating']);
-                            endif;
-                            //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;
-                    endif;
-                } catch(Exception $e) {
-                    if($GLOBALS['debug']) printError($e->getMessage());
-                }
-            endif;
-        } catch (Exception $e) {
-            if($GLOBALS['debug']) printError($e->getMessage());
-        }
-    endforeach;
-    epgzip($epginfo);
-}
-
-// Get EPG data from Hcn
-function GetEPGFromHcn($ChannelInfo) {
-    $ChannelId = $ChannelInfo[0];
-    $ChannelName = $ChannelInfo[1];
-    $ServiceId =  $ChannelInfo[3];
-    $epginfo = array();
-    foreach(range(1, $GLOBALS['period']) as $k) :
-        $url = "http://m.hcn.co.kr/sch_ScheduleList.action";
-        $day = date("Y-m-d", strtotime("+".($k - 1)." days"));
-        $params = array(
-            'ch_id' => $ServiceId,
-            'onairdate' => $day,
-            '_' => _microtime()
-        );
-        $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 = "//li";
-                    $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("span[@class='progTime']", $row)->item(0)->nodeValue) ?: "";
-                        $startTime = date("YmdHis", strtotime($day." ".$startTime));
-                        $programName = trim($xpath->query("span[@class='progTitle']", $row)->item(0)->nodeValue) ?: "";
-                        //$category = trim($cells->item(2)->nodeValue) ?: "";
-                        //$category = preg_replace('/\(.*\)/', '', $category);
-                        $images = $row->getElementsByTagName('img');
-                        foreach($images as $image):
-                            preg_match('/re\.png/', $image->getAttribute('src'), $rebroad);
-                            if($rebroad != NULL) $rebroadcast = True;
-                            preg_match('/.*plus([\d,]+)\.png/', $image->getAttribute('src'), $grade);
-                            if($grade != NULL) $rating = $grade[1];
-                        endforeach;
-                        //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 POOQ
-function GetEPGFromPooq($ChannelInfo) {
-    $ChannelId = $ChannelInfo[0];
-    $ChannelName = $ChannelInfo[1];
-    $ServiceId =  $ChannelInfo[3];
-    $today = date("Ymd");
-    $lastday = date("Ymd", strtotime("+".($GLOBALS['period'] - 1)." days"));
-    $url = "https://wapie.pooq.co.kr/v1/epgs30/".$ServiceId."/";
-    $params = array(
-        'deviceTypeId'=> 'pc',
-        'marketTypeId'=> 'generic',
-        'apiAccessCredential'=> 'EEBE901F80B3A4C4E5322D58110BE95C',
-        'offset'=> '0',
-        'limit'=> '1000',
-        'startTime'=>  date("Y/m/d", strtotime($today)).' 00:00',
-        'endTime'=>  date("Y/m/d", strtotime($lastday)).' 00:00'
-    );
-    foreach(range(1, $GLOBALS['period']) as $k) :
-        $day = date("Y-m-d", strtotime("+".($k - 1)." days"));
-        $date_list[] = $day;
-    endforeach;
-    $params = http_build_query($params);
-    $method = "GET";
-    try {
-        $response = getWeb($url, $params, $method);
-        if ($response === False && $GLOBALS['debug']) :
-            printError($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['result']['count'] == 0) :
-                    if($GLOBALS['debug']) : 
-                        printError($ChannelName.CHANNEL_ERROR);
-                    endif;
-                else :
-                    $programs = $data['result']['list'];
-                    foreach ($programs as $program) :
-                        $startTime = $endTime = $programName = $subprogramName = $desc = $actors = $producers = $category = $episode = "";
-                        $rebroadcast = False;
-                        $rating = 0;
-                        if(in_array($program['startDate'] , $date_list)) :
-                            $startTime = $program['startDate']." ".$program['startTime'];
-                            $startTime = date("YmdHis", strtotime($startTime));
-                            $endTime = $program['startDate']." ".$program['endTime'];
-                            $endTime = date("YmdHis", strtotime($endTime));
-                            $pattern = '/^(.*?)(?:([\d,]+)회)?(?:\((재)\))?$/';
-                            $programName = str_replace("\r\n", "", $program['programTitle']);
-                            preg_match($pattern, $programName, $matches);
-                            if($matches !== NULL) :
-                                if(isset($matches[1])) $programName = trim($matches[1]) ?: "";
-                                if(isset($matches[2])) $episode = trim($matches[2]) ?: "";
-                                if(isset($matches[3])) $rebroadcast = $matches[3] ? True : False;
-                            endif;
-                            if($program['programStaring']) $actors = trim($program['programStaring'], ',');
-                            if($program['programSummary']) $desc = trim($program['programSummary']);
-                            $rating = $program['age'];
-                            $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);
-                            usleep(1000);
-                        endif;
-                    endforeach;
-                endif;
-            } catch(Exception $e) {
-                if($GLOBALS['debug']) printError($e->getMessage());
-            }
-        endif;
-    } catch (Exception $e) {
-        if($GLOBALS['debug']) printError($e->getMessage());
-    }
-}
-
-// Get EPG data from MBC
-function GetEPGFromMbc($ChannelInfo) {
-    $ChannelId = $ChannelInfo[0];
-    $ChannelName = $ChannelInfo[1];
-    $ServiceId =  $ChannelInfo[3];
-    $dayofweek = array('일', '월', '화', '수', '목', '금', '토');
-    foreach(range(1, $GLOBALS['period']) as $k) :
-        $url = "http://miniunit.imbc.com/Schedule";
-        $day = date("Y-m-d", strtotime("+".($k - 1)." days"));
-        $params = array(
-            'rtype' => 'json'
-        );
-        $params = http_build_query($params);
-        $method = "GET";
-        try {
-            $response = getWeb($url, $params, $method);
-            if ($response === False && $GLOBALS['debug']) :
-                printError($ChannelName.HTTP_ERROR);
-            else :
-                try {
-                    $data = json_decode($response, TRUE);
-                    if(json_last_error() != JSON_ERROR_NONE) throw new Exception(JSON_SYNTAX_ERROR);
-                    if(count($data['Programs']) == 0) :
-                        if($GLOBALS['debug']) : 
-                            printError($ChannelName.CHANNEL_ERROR);
-                        endif;
-                    else :
-                        $programs = $data['Programs'];
-                        foreach($programs as $program) :
-                            if($program['Channel'] == "CHAM" && $program['LiveDays'] == $dayofweek[date("w", strtotime($day))]) :
-                                $startTime = $endTime = $programName = $subprogramName = $desc = $actors = $producers = $category = $episode = "";
-                                $rebroadcast = False;
-                                $rating = 0;
-                                $pattern = '/^(.*?)(\(재\))?$/';
-                                preg_match($pattern, htmlspecialchars_decode($program['ProgramTitle']), $matches);
-                                if ($matches != NULL) :
-                                    $programName = $matches[1];
-                                    if(isset($matches[2])) $rebroadcast = $matches[2] ? True : False;
-                                endif;
-                                $startTime = $day." ".$program['StartTime'];
-                                $startTime = date("YmdHis", strtotime($startTime));
-                                $endTime = date("YmdHis", strtotime("+".$program['RunningTime']." minutes", strtotime($startTime)));
-                                $category = "음악";
-                                $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);
-                                usleep(1000);
-                            endif;
-                        endforeach;
-                    endif;
-                } catch(Exception $e) {
-                    if($GLOBALS['debug']) printError($e->getMessage());
-                }
-            endif;
-        } catch (Exception $e) {
-            if($GLOBALS['debug']) printError($e->getMessage());
-        }
-    endforeach;
-}
-
-// Get EPG data from MIL
-function GetEPGFromMil($ChannelInfo) {
-    $ChannelId = $ChannelInfo[0];
-    $ChannelName = $ChannelInfo[1];
-    $ServiceId =  $ChannelInfo[3];
-    foreach(range(1, $GLOBALS['period']) as $k) :
-        $url = "http://radio.dema.mil.kr/web/fm/quick/ajaxTimetableList.do";
-        $day = date("Y-m-d", strtotime("+".($k - 1)." days"));
-        $params = array(
-            'program_date' => date("Ymd", strtotime($day))
-        );
-        $params = http_build_query($params);
-        $method = "GET";
-        try {
-            $response = getWeb($url, $params, $method);
-            if ($response === False && $GLOBALS['debug']) :
-                printError($ChannelName.HTTP_ERROR);
-            else :
-                try {
-                    $data = json_decode($response, TRUE);
-                    if(json_last_error() != JSON_ERROR_NONE) throw new Exception(JSON_SYNTAX_ERROR);
-                    if(count($data['resultList']) == 0) :
-                        if($GLOBALS['debug']) : 
-                            printError($ChannelName.CHANNEL_ERROR);
-                        endif;
-                    else :
-                        $programs = $data['resultList'];
-                        foreach($programs as $program) :
-                            $startTime = $endTime = $programName = $subprogramName = $desc = $actors = $producers = $category = $episode = "";
-                            $rebroadcast = False;
-                            $rating = 0;
-                            $pattern = '/^(.*?)(\(재\))?$/';
-                            preg_match($pattern, htmlspecialchars_decode($program['program_title']), $matches);
-                            if ($matches != NULL) :
-                                $programName = $matches[1];
-                                if(isset($matches[2])) $rebroadcast = $matches[2] ? True : False;
-                            endif;
-                            $subprogramName =  htmlspecialchars_decode($program['program_subtitle']);
-                            $startTime = $day." ".$program['program_time'];
-                            $startTime = date("YmdHis", strtotime($startTime));
-                            $endTime = $day." ".$program['program_end_time'];
-                            $endTime = date("YmdHis", strtotime($endTime));
-                            $actors =  htmlspecialchars_decode($program['movie_actor']);
-                            $producers =  htmlspecialchars_decode($program['movie_director']);
-                            $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);
-                            usleep(1000);
-                        endforeach;
-                    endif;
-                } catch(Exception $e) {
-                    if($GLOBALS['debug']) printError($e->getMessage());
-                }
-            endif;
-        } catch (Exception $e) {
-            if($GLOBALS['debug']) printError($e->getMessage());
-        }
-    endforeach;
-}
-
-// Get EPG data from IFM
-function GetEPGFromIfm($ChannelInfo) {
-    $ChannelId = $ChannelInfo[0];
-    $ChannelName = $ChannelInfo[1];
-    $ServiceId =  $ChannelInfo[3];
-    $dayofweek = array('1', '2', '3', '4', '5', '6', '7');
-    foreach(range(1, $GLOBALS['period']) as $k) :
-        $url = "http://mapp.itvfm.co.kr/hyb/front/selectHybPgmList.do";
-        $day = date("Y-m-d", strtotime("+".($k - 1)." days"));
-        $params = array(
-            'outDay' => $dayofweek[(date("w", strtotime($day)+1))%7],
-            'viewDt' => $day
-        );
-        $params = http_build_query($params);
-        $method = "GET";
-        try {
-            $response = getWeb($url, $params, $method);
-            if ($response === False && $GLOBALS['debug']) :
-                printError($ChannelName.HTTP_ERROR);
-            else :
-                try {
-                    $data = json_decode($response, TRUE);
-                    if(json_last_error() != JSON_ERROR_NONE) throw new Exception(JSON_SYNTAX_ERROR);
-                    if(count($data['hybMusicInfoList']) == 0) :
-                        if($GLOBALS['debug']) : 
-                            printError($ChannelName.CHANNEL_ERROR);
-                        endif;
-                    else :
-                        $programs = $data['hybMusicInfoList'];
-                        foreach($programs as $program) :
-                            $startTime = $endTime = $programName = $subprogramName = $desc = $actors = $producers = $category = $episode = "";
-                            $rebroadcast = False;
-                            $rating = 0;
-                            $programName = htmlspecialchars_decode($program['pgmTitle']) ?: "";
-                            $startTime = $day." ".$program['pgmStime'];
-                            $startTime = date("YmdHis", strtotime($startTime));
-                            $endTime = $day." ".$program['pgmEtime'];
-                            $endTime = date("YmdHis", strtotime($endTime));
-                            $actors =  htmlspecialchars_decode($program['pgmDj']);
-                            $producers =  htmlspecialchars_decode($program['pgmPd']);
-                            $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);
-                            usleep(1000);
-                        endforeach;
-                    endif;
-                } catch(Exception $e) {
-                    if($GLOBALS['debug']) printError($e->getMessage());
-                }
-            endif;
-        } catch (Exception $e) {
-            if($GLOBALS['debug']) printError($e->getMessage());
-        }
-    endforeach;
-}
-
-// Get EPG data from KBS
-function GetEPGFromKbs($ChannelInfo) {
-    $ChannelId = $ChannelInfo[0];
-    $ChannelName = $ChannelInfo[1];
-    $ServiceId =  $ChannelInfo[3];
-    $epginfo = array();
-    foreach(range(1, $GLOBALS['period']) as $k) :
-        $url = "http://world.kbs.co.kr/include/wink/_ajax_schedule.php";
-        $day = date("Y-m-d", strtotime("+".($k - 1)." days"));
-        $params = array(
-            'channel'=>'wink_11'
-        );
-        $params = http_build_query($params);
-        $method = "GET";
-        try {
-             $response = getWeb($url, $params, $method);
-            if ($response === False && $GLOBALS['debug']) :
-                printError($ChannelName.HTTP_ERROR);
-            else :
-                try {
-                    $data = json_decode($response, TRUE);
-                    if(json_last_error() != JSON_ERROR_NONE) throw new Exception(JSON_SYNTAX_ERROR);
-                    if(count($data['schedule']) == 0) :
-                        if($GLOBALS['debug']) : 
-                            printError($ChannelName.CHANNEL_ERROR);
-                        endif;
-                    else :
-                        $dom = new DomDocument;
-                        libxml_use_internal_errors(True);
-                        $dom->loadHTML($data['schedule']);
-                        $xpath = new DomXPath($dom);
-                        $query = "//li";
-                        $rows = $xpath->query($query);
-                        foreach($rows as $row) :
-                            $startTime = $endTime = $programName = $subprogramName = $desc = $actors = $producers = $category = $episode = "";
-                            $rebroadcast = False;
-                            $rating = 0;
-                            $cells = $row->getElementsByTagName('span');
-                            $startTime = $day." ".trim($cells->item(0)->childNodes->item(0)->nodeValue);
-                            $startTime = date("YmdHis", strtotime($startTime));
-                            $programName = trim($cells->item(2)->childNodes->item(0)->nodeValue);
-                            $programName = str_replace(array("[","]", " Broadcast"), array("", "", ""), $programName);
-                            //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;
-                    endif;
-                } catch(Exception $e) {
-                    if($GLOBALS['debug']) printError($e->getMessage());
-                }
-            endif;
-        } catch (Exception $e) {
-            if($GLOBALS['debug']) printError($e->getMessage());
-        }
-    endforeach;
-    epgzip($epginfo);
-}
-
-function GetEPGFromArirang($ChannelInfo) {
-    $ChannelId = $ChannelInfo[0];
-    $ChannelName = $ChannelInfo[1];
-    $ServiceId =  $ChannelInfo[3];
-    $epginfo = array();
-    foreach(range(1, $GLOBALS['period']) as $k) :
-        $url = "http://www.arirang.com/Radio/Radio_Index.asp";
-        $day = date("Y-m-d", strtotime("+".($k - 1)." days"));
-        $params = array();
-        $params = http_build_query($params);
-        $method = "GET";
-       try {
-            $response = getWeb($url, $params, $method);
-            if ($response === False && $GLOBALS['debug']) :
-                printError($ChannelName.HTTP_ERROR);
-            else :
-                $dom = new DomDocument;
-                libxml_use_internal_errors(True);
-                //echo $response;
-
-                $response = mb_convert_encoding($response, "HTML-ENTITIES", "EUC-KR");
-                if($dom->loadHTML($response)):
-                    $xpath = new DomXPath($dom);
-                    $dayofweek = date("w", strtotime($day));
-                    if($dayofweek == 0):
-                        $query = "//table[@id='aIRSW_sun']/tr";
-                    elseif($dayofweek == 6):
-                        $query = "//table[@id='aIRSW_sat']/tr";
-                    else :
-                        $query = "//table[@id='aIRSW_week']/tr";
-                    endif;
-                    $rows = $xpath->query($query);
-                    foreach($rows as $row) :
-                        $startTime = $endTime = $programName = $subprogramName = $desc = $actors = $producers = $category = $episode = "";
-                        $rebroadcast = False;
-                        $rating = 0;
-                        $time = $row->getElementsByTagName('th');
-                        $times = explode('~', trim($time->item(0)->nodeValue));
-                        $startTime = date("YmdHis", strtotime($day." ".$times[0]));
-                        $endTime = date("YmdHis", strtotime($day." ".$times[1]));
-                        $program = $row->getElementsByTagName('td');
-                        $pattern = '/^(.*?)(?:\((Re)\))?$/';
-                        preg_match($pattern, trim($program->item(0)->nodeValue), $matches);
-                        if ($matches != NULL) :
-                            $programName = $matches[1];
-                            if(isset($matches[2])) $rebroadcast = $matches[2] ? True : False;
-                        endif;
-                        $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);
-                        usleep(1000);
-                    endforeach;
-                else :
-                    if($GLOBALS['debug']) printError($ChannelName.CONTENT_ERROR);
-                endif;
-            endif;
-        } catch (Exception $e) {
-            if($GLOBALS['debug']) printError($e->getMessage());
-        }
-    endforeach;
-}
-
-# Zip epginfo
-function epgzip($epginfo) {
-    #ChannelId, startTime, programName, subprogramName, desc, actors, producers, category, episode, rebroadcast, rating
-    $zipped = array_slice(array_map(NULL, $epginfo, array_slice($epginfo,1)),0,-1);
-    foreach($zipped as $epg) :
-        $ChannelId = $epg[0][0] ?: "";
-        $startTime = $epg[0][1] ?: "";
-        $endTime = $epg[1][1] ?: "";
-        $programName = $epg[0][2] ?: "";
-        $subprogramName = $epg[0][3] ?: "";
-        $desc = $epg[0][4] ?: "";
-        $actors = $epg[0][5] ?: "";
-        $producers = $epg[0][6] ?: "";
-        $category = $epg[0][7] ?: "";
-        $episode = $epg[0][8] ?: "";
-        $rebroadcast = $rebroadcast = $epg[0][9] ? True: False;
-        $rating = $epg[0][10] ?: 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;
-}
-
-function writeProgram($programdata) {
-    $fp = $GLOBALS['fp'];
-    $ChannelId = $programdata['channelId'];
-    $startTime = $programdata['startTime'];
-    $endTime = $programdata['endTime'];
-    $programName = trim(htmlspecialchars($programdata['programName'], ENT_XML1));
-    $subprogramName = trim(htmlspecialchars($programdata['subprogramName'], ENT_XML1));
-    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;
-    if($programName == NULL):
-        $programName = $subprogramName;
-    endif;
-    $actors = htmlspecialchars($programdata['actors'], ENT_XML1);
-    $producers = htmlspecialchars($programdata['producers'], ENT_XML1);
-    $category = htmlspecialchars($programdata['category'], ENT_XML1);
-    $episode = $programdata['episode'];
-    if($episode) :
-        $episode_ns = (int)$episode - 1;
-        $episode_ns = '0' . '.' . $episode_ns . '.' . '0' . '/' . '0';
-        $episode_on = $episode;
-    endif;
-    $rebroadcast = $programdata['rebroadcast'];
-    if($episode && $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['addverbose'] == 'y') :
-        $desc = trim(htmlspecialchars($programdata['programName'], ENT_XML1));
-        if($subprogramName)  $desc = $desc."\n부제 : ".$subprogramName;
-        if($rebroadcast == True && $GLOBALS['addrebroadcast']  == 'y') $desc = $desc."\n방송 : 재방송";
-        if($episode) $desc = $desc."\n회차 : ".$episode."회";
-        if($category) $desc = $desc."\n장르 : ".$category;
-        if($actors) $desc = $desc."\n출연 : ".trim($actors);
-        if($producers) $desc = $desc."\n제작 : ".trim($producers);
-        $desc = $desc."\n등급 : ".$rating;
-    else:
-        $desc = "";
-    endif;
-    if($programdata['desc']) $desc = $desc."\n".htmlspecialchars($programdata['desc'], ENT_XML1);
-    $desc = preg_replace('/ +/', ' ', $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',
-        '시사/다큐' => 'Documentary',
-        '연예' => 'Show / Game show',
-        '스포츠' => 'Sports',
-        '홈쇼핑' => 'Advertisement / Shopping'
-       );
-    $contentType = "";
-    foreach($contentTypeDict as $key => $value) :
-        if(!(strpos($category, $key) === False)) :
-            $contentType = $value;
-        endif;
-    endforeach;
-    fprintf($fp, "  \n", $startTime, $endTime, $ChannelId);
-    fprintf($fp, "    %s\n", $programName);
-    if($subprogramName) :
-        fprintf($fp, "    %s\n", $subprogramName);
-    endif;
-    if($GLOBALS['addverbose']=='y') :
-        fprintf($fp, "    %s\n", $desc);
-        if($actors || $producers):
-            fprintf($fp, "    \n");
-            if($actors) :
-                foreach(explode(',', $actors) as $actor):
-                    if(trim($actor)) fprintf($fp, "      %s\n", trim($actor));
-                endforeach;
-            endif;
-            if($producers) :
-                foreach(explode(',', $producers) as $producer):
-                    if(trim($producer)) fprintf($fp, "      %s\n", trim($producer));
-                endforeach;
-            endif;
-            fprintf($fp, "    \n");
-        endif;
-    endif;
-    if($category) fprintf($fp, "    %s\n", $category);
-    if($contentType) fprintf($fp, "    %s\n", $contentType);
-    if($episode) fprintf($fp, "    %s\n", $episode_ns);
-    if($episode) fprintf($fp, "    %s\n", $episode_on);
-    if($rebroadcast) fprintf($fp, "    \n");
-    if($rating) :
-        fprintf($fp, "    \n");
-        fprintf($fp, "      %s\n", $rating);
-        fprintf($fp, "    \n");
-    endif;
-    fprintf($fp, "  \n");
-}
-
-function getWeb($url, $params, $method) {
-    $ch = curl_init();
-    if($method == "GET"):
-        $url = $url."?".$params;
-    elseif($method == "POST"):
-        curl_setopt ($ch, CURLOPT_POST, True);
-        curl_setopt ($ch, CURLOPT_POSTFIELDS, $params);
-    endif;
-    curl_setopt($ch, CURLOPT_URL, $url);
-    curl_setopt($ch, CURLOPT_RETURNTRANSFER, True);
-    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $GLOBALS['timeout']);
-    curl_setopt($ch, CURLOPT_HEADER, False);
-    curl_setopt($ch, CURLOPT_FAILONERROR, True);
-    curl_setopt($ch, CURLOPT_USERAGENT, $GLOBALS['ua']);
-    $response = curl_exec($ch);
-    if(curl_error($ch) && $GLOBALS['debug']) printError($url." ".curl_error($ch));
-    curl_close($ch);
-    return $response;
-}
-
-function printLog($string) {
-    fwrite(STDERR, $string."\n");
-}
-
-function printError($string) {
-    fwrite(STDERR, "Error : ".$string."\n");
-}
-
-function _microtime() {
-    list($usec, $sec) = explode(" ", microtime());
-    return ($sec.(int)($usec*1000));
-}
 ?>
diff --git a/epg2xml.py b/epg2xml.py
index 020ea62..ba0f109 100644
--- a/epg2xml.py
+++ b/epg2xml.py
@@ -1117,6 +1117,7 @@ if default_fetch_limit :
         sys.exit()
     else :
         period = int(default_fetch_limit)
+        if period > 2 : period = 2
 else :
     printError("epg2xml.json 파일의 default_fetch_limit항목이 없습니다.");
     sys.exit()

From 5d1f755b86b59833b81ce77b849d8e2aa2f458a9 Mon Sep 17 00:00:00 2001
From: wonipapa 
Date: Wed, 6 Sep 2017 15:06:38 +0900
Subject: [PATCH 39/41] =?UTF-8?q?PHP=20=EA=B3=B5=ED=86=B5=20=ED=95=A8?=
 =?UTF-8?q?=EC=88=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 epg2xml-function.php | 1364 ++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 1364 insertions(+)
 create mode 100644 epg2xml-function.php

diff --git a/epg2xml-function.php b/epg2xml-function.php
new file mode 100644
index 0000000..bc364c7
--- /dev/null
+++ b/epg2xml-function.php
@@ -0,0 +1,1364 @@
+getMessage());
+                exit;
+            }
+        endif;
+    }
+    catch(Exception $e) {
+        printError($e->getMessage());
+        exit;
+    }
+//My Channel 정의
+    $MyChannelInfo = array();
+    if($MyChannels) :
+        $MyChannelInfo = array_map('trim',explode(',', $MyChannels));
+    endif;
+
+    fprintf($fp, "\n");
+    fprintf($fp, "\n\n");
+    fprintf($fp, "\n", VERSION);
+ 
+    foreach ($Channeldatajson as $Channeldata) : //Get Channel & Print Channel info
+        if($Channeldata['Enabled'] == 1 ||  in_array($Channeldata['Id'], $MyChannelInfo)) :
+            $ChannelId = $Channeldata['Id'];
+            $ChannelName = htmlspecialchars($Channeldata['Name'], ENT_XML1);
+            $ChannelSource = $Channeldata['Source'];
+            $ChannelServiceId = $Channeldata['ServiceId'];
+            $ChannelIconUrl = htmlspecialchars($Channeldata['Icon_url'], ENT_XML1);            
+            if($MyISP != "ALL" && $Channeldata[$MyISP.'Ch'] != Null):
+                $ChannelInfos[] = array($ChannelId,  $ChannelName, $ChannelSource, $ChannelServiceId);
+                $Channelnumber = $Channeldata[$MyISP.'Ch'];
+                $ChannelISPName = htmlspecialchars($Channeldata[$MyISP." Name"], ENT_XML1);
+                fprintf($fp, "  \n", $ChannelId);
+                fprintf($fp, "    %s\n", $ChannelName);
+                fprintf($fp, "    %s\n", $ChannelISPName);
+                fprintf($fp, "    %s\n", $Channelnumber);
+                fprintf($fp, "    %s\n", $Channelnumber." ".$ChannelISPName);
+                if($IconUrl) :
+                    fprintf($fp, "    \n", $IconUrl, $ChannelId);
+                else :
+                    fprintf($fp, "    \n", $ChannelIconUrl);
+                endif;
+                fprintf($fp, "  \n");
+            elseif($MyISP == "ALL"):
+                $ChannelInfos[] = array($ChannelId,  $ChannelName, $ChannelSource, $ChannelServiceId);
+                fprintf($fp, "  \n", $ChannelId);
+                fprintf($fp, "    %s\n", $ChannelName);
+                if($IconUrl) :
+                    fprintf($fp, "    \n", $IconUrl, $ChannelId);
+                else :
+                    fprintf($fp, "    \n", $ChannelIconUrl);
+                endif;
+                fprintf($fp, "  \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 == 'SKB') :
+            GetEPGFromSKB($ChannelInfo);
+        elseif($ChannelSource == 'SKY') :
+            GetEPGFromSKY($ChannelInfo);
+        elseif($ChannelSource == 'NAVER') :
+            GetEPGFromNaver($ChannelInfo);
+        elseif($ChannelSource == 'ISCS') :
+            GetEPGFromIscs($ChannelInfo);
+        elseif($ChannelSource == 'HCN') :
+            GetEPGFromHcn($ChannelInfo);
+        elseif($ChannelSource == 'POOQ') :
+            GetEPGFromPooq($ChannelInfo);
+        elseif($ChannelSource == 'MBC') :
+            GetEPGFromMbc($ChannelInfo);
+        elseif($ChannelSource == 'MIL'):
+            GetEPGFromMil($ChannelInfo);
+        elseif($ChannelSource == 'IFM'):
+            GetEPGFromIfm($ChannelInfo);
+        elseif($ChannelSource == 'KBS'):
+            GetEPGFromKbs($ChannelInfo);
+        elseif($ChannelSource == 'ARIRANG'):
+            GetEPGFromArirang($ChannelInfo);
+        endif;
+    endforeach;
+    fprintf($fp, "\n");
+}
+
+// Get EPG data from epg.co.kr
+function GetEPGFromEPG($ChannelInfo) {
+    $ChannelId = $ChannelInfo[0];
+    $ChannelName = $ChannelInfo[1];
+    $ServiceId =  $ChannelInfo[3];
+    $epginfo = array();
+    foreach(range(1, $GLOBALS['period']) as $k) :
+        $url = "http://211.43.210.10:88/epg-cgi/extern/cnm_guide_type_v070530.php";
+        $day = date("Ymd", strtotime("+".($k - 1)." days"));
+        $params = array(
+            'beforegroup' => '100',
+            'checkchannel[]' => $ServiceId,
+            'select_group' => '100',
+            'start_date' => $day
+        );
+        $params = http_build_query($params);
+        $method = "POST";
+        try {
+            $response = getWeb($url, $params, $method);
+            if ($response === False && $GLOBALS['debug']) :
+                printError($ChannelName.HTTP_ERROR);
+            else :
+                $response = str_replace("charset=euc-kr", "charset=utf-8", $response);
+                $response = mb_convert_encoding($response, "UTF-8", "EUC-KR");
+                $pattern = '/(.*)<\/td>/';
+                $response = preg_replace_callback($pattern, function($matches) { return ''.htmlspecialchars($matches[1], ENT_NOQUOTES).'';}, $response);
+                $response = str_replace(array('</b>', '</a>', '<img', 'valign=top>','align=absmiddle>'), array('', '', '','>'), $response);
+                $dom = new DomDocument;
+                libxml_use_internal_errors(True);
+                if($dom->loadHTML($response)):
+                    $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) :
+                            $startTime = $endTime = $programName = $subprogramName = $desc = $actors = $producers = $category = $episode = "";
+                            $rebroadcast = False;
+                            $rating = 0;
+                            $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);
+                            $minute = str_replace(array("[", "]"), array("",""), trim($minute->nodeValue));
+                            $minute = substr($minute, -2);
+                            $hour = $hour.":".$minute;
+                            switch ($i) :
+                                case 2 :
+                                    $hour = $hour." AM";
+                                    break;
+                                case 3 :
+                                    $hour = $hour." PM";
+                                    break;
+                                case 4 :
+                                    if($hour > 5 && $hour < 12) :
+                                        $hour = $hour." PM";
+                                    elseif($hour <5 || $hour == 12) :
+                                        $hour = $hour." AM";
+                                        $thisday = date("Ymd", strtotime($day." +1 days"));
+                                    endif;
+                                    break;
+                            endswitch;
+                            $startTime = date("YmdHis", strtotime($thisday." ".$hour));
+                            $pattern = '/^(.*?)\s*(?:<(.*)>)?\s*(?:\((재)\))?\s*(?:\(([\d,]+)회\)?)?$/';
+                            $programName = trim($program->nodeValue);
+                             preg_match($pattern, $programName, $matches);
+                            if ($matches != NULL) :
+                                if(isset($matches[1])) $programName = trim($matches[1]) ?: "";
+                                if(isset($matches[2])) $subprogramName = trim($matches[2]) ?: "";
+                                if(isset($matches[3])) $rebroadcast = $matches[3] ? True : False;
+                                if(isset($matches[4])) $episode = $matches[4] ?: "";
+                            endif;
+                            $images = $program->getElementsByTagName('img');
+                            foreach($images as $image):
+                                preg_match('/.*schedule_([\d,]+)?.*/', $image->getAttribute('src'), $grade);
+                                if($grade != NULL) $rating = $grade[1];
+                            endforeach;
+                            //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;
+                    endfor;
+                 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 KT
+function GetEPGFromKT($ChannelInfo) {
+    $ChannelId = $ChannelInfo[0];
+    $ChannelName = $ChannelInfo[1];
+    $ServiceId =  $ChannelInfo[3];
+    $epginfo = array();
+    foreach(range(1, $GLOBALS['period']) as $k) :
+        $url = "http://tv.olleh.com/renewal_sub/liveTv/pop_schedule_week.asp";
+        $day = date("Ymd", strtotime("+".($k - 1)." days"));
+        $params = array(
+            'ch_name' => '',
+            'ch_no' => $ServiceId,
+            'nowdate'=> $day,
+            'seldatie' => $day,
+            'tab_no' => '1'
+        );
+        $params = http_build_query($params);
+        $method = "GET";
+        try {
+            $response = getWeb($url, $params, $method);
+            if ($response === False && $GLOBALS['debug']) :
+                printError($ChannelName.HTTP_ERROR);
+            else :
+                $response = str_replace("charset=euc-kr", "charset=utf-8", $response);
+                $response = mb_convert_encoding($response, "UTF-8", "EUC-KR");
+                $dom = new DomDocument;
+                libxml_use_internal_errors(True);
+                if($dom->loadHTML($response)):
+                    $xpath = new DomXPath($dom);
+                    $query = "//table[@id='pop_day']/tbody/tr";
+                    $rows = $xpath->query($query);
+                    foreach($rows as $row) :
+                        $startTime = $endTime = $programName = $subprogramName = $desc = $actors = $producers = $category = $episode = "";
+                        $rebroadcast = False;
+                        $rating = 0;
+                        $cells = $row->getElementsByTagName('td');
+                        //programName, startTime, rating, category
+                        $startTime = date("YmdHis", strtotime($day." ".trim($cells->item(0)->nodeValue)));
+                        $pattern = '/^(.*?)( <(.*)>)?$/';
+                        $programName = trim($cells->item(1)->nodeValue);
+                        preg_match($pattern, $programName, $matches);
+                        if ($matches != NULL) :
+                           if(isset($matches[1])) $programName = $matches[1] ?: "";
+                           if(isset($matches[3])) $subprogramName = $matches[3] ?: "";
+                        endif;
+                        $category = trim($cells->item(4)->nodeValue);
+                        $rating = str_replace("all", 0, str_replace("세 이상", "", trim($cells->item(2)->nodeValue)));
+                        //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 LG
+function GetEPGFromLG($ChannelInfo) {
+    $ChannelId = $ChannelInfo[0];
+    $ChannelName = $ChannelInfo[1];
+    $ServiceId =  $ChannelInfo[3];
+    $epginfo = array();
+    foreach(range(1, $GLOBALS['period']) as $k) :
+        $url = "http://www.uplus.co.kr/css/chgi/chgi/RetrieveTvSchedule.hpi";
+        $day = date("Ymd", strtotime("+".($k - 1)." days"));
+        $params = array(
+            'chnlCd' => $ServiceId,
+            'evntCmpYmd' =>  $day
+        );
+        $params = http_build_query($params);
+        $method = "POST";
+        try {
+            $response = getWeb($url, $params, $method);
+            if ($response === False && $GLOBALS['debug']) :
+                printError($ChannelName.HTTP_ERROR);
+            else :
+                $response = ''.$response;
+                $response = mb_convert_encoding($response, "UTF-8", "EUC-KR");
+                $response = str_replace(array('<재>', ' [..', ' (..'), array('<재>', '', ''), $response);
+                $dom = new DomDocument;
+                libxml_use_internal_errors(True);
+                if($dom->loadHTML($response)):
+                    $xpath = new DomXPath($dom);
+                    $query = "//div[@class='tblType list']/table/tbody/tr";
+                    $rows = $xpath->query($query);
+                    foreach($rows as $row) :
+                        $startTime = $endTime = $programName = $subprogramName = $desc = $actors = $producers = $category = $episode = "";
+                        $rebroadcast = False;
+                        $rating = 0;
+                        $cells = $row->getElementsByTagName('td');
+                        $startTime = date("YmdHis", strtotime($day." ".trim($cells->item(0)->nodeValue)));
+                        $programName = trim($cells->item(1)->childNodes->item(0)->nodeValue);
+                        $pattern = '/(<재>)?\s?(?:\[.*?\])?(.*?)(?:\[(.*)\])?\s?(?:\(([\d,]+)회\))?$/';
+                        preg_match($pattern, $programName, $matches);
+                        if ($matches != NULL) :
+                            if(isset($matches[2])) $programName = trim($matches[2]) ?: "";
+                            if(isset($matches[3])) $subprogramName = trim($matches[3]) ?: "";
+                            if(isset($matches[4])) $episode = trim($matches[4]) ?: "";
+                            if(isset($matches[1])) $rebroadcast = trim($matches[1]) ? True: False;
+                        endif;
+                        $category = trim($cells->item(2)->nodeValue);
+                        $spans = $cells->item(1)->getElementsByTagName('span');
+                        $rating = trim($spans->item(1)->nodeValue)=="All" ? 0 : trim($spans->item(1)->nodeValue);
+                        //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 SK
+function GetEPGFromSK($ChannelInfo) {
+    $ChannelId = $ChannelInfo[0];
+    $ChannelName = $ChannelInfo[1];
+    $ServiceId =  $ChannelInfo[3];
+    $today = date("Ymd");
+    $lastday = date("Ymd", strtotime("+".($GLOBALS['period'] - 1)." days"));
+    $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);
+    $method = "POST";
+    try {
+        $response = getWeb($url, $params, $method);
+        if ($response === False && $GLOBALS['debug']) :
+            printError($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) :
+                    if($GLOBALS['debug']) : 
+                        printError($ChannelName.CHANNEL_ERROR);
+                    endif;
+                else :
+                    $programs = $data['channel']['programs'];
+                    foreach ($programs as $program) :
+                        $startTime = $endTime = $programName = $subprogramName = $desc = $actors = $producers = $category = $episode = "";
+                        $rebroadcast = False;
+                        $rating = 0;
+                        $pattern = '/^(.*?)(?:\s*[\(<]([\d,회]+)[\)>])?(?:\s*<([^<]*?)>)?(\((재)\))?$/';
+                        preg_match($pattern, str_replace('...', '>', $program['programName']), $matches);
+                        if ($matches != NULL) :
+                            if(isset($matches[1])) $programName = trim($matches[1]) ?: "";
+                            if(isset($matches[3])) $subprogramName = trim($matches[3]) ?: "";
+                            if(isset($matches[2])) $episode = str_replace("회", "", $matches[2]) ?: "";
+                            if(isset($matches[5])) $rebroadcast = $matches[5] ? True : False;
+                        endif;
+                        $startTime = date("YmdHis",$program['startTime']/1000);
+                        $endTime = date("YmdHis",$program['endTime']/1000);
+                        $desc = $program['synopsis'] ?: "";
+                        $actors =trim(str_replace('...','',$program['actorName']), ', ') ?: "";
+                        $producers = trim(str_replace('...','',$program['directorName']), ', ') ?: "";
+                        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);
+                        usleep(1000);
+                    endforeach;
+                endif;
+            } catch(Exception $e) {
+                if($GLOBALS['debug']) printError($e->getMessage());
+            }
+        endif;
+    } catch (Exception $e) {
+        if($GLOBALS['debug']) printError($e->getMessage());
+    }
+}
+
+// Get EPG data from SKB
+function GetEPGFromSKB($ChannelInfo) {
+    $ChannelId = $ChannelInfo[0];
+    $ChannelName = $ChannelInfo[1];
+    $ServiceId =  $ChannelInfo[3];
+    $epginfo = array();
+    foreach(range(1, $GLOBALS['period']) as $k) :
+        $url = "http://m.skbroadband.com/content/realtime/Channel_List.do";
+        $day = date("Ymd", strtotime("+".($k - 1)." days"));
+        $params = array(
+            'key_depth2' => $ServiceId,
+            'key_depth3' => $day
+        );
+        $params = http_build_query($params);
+        $method = "POST";
+        try {
+            $response = getWeb($url, $params, $method);
+            if ($response === False && $GLOBALS['debug']) :
+                printError($ChannelName.HTTP_ERROR);
+            else :
+                $response = str_replace('charset="euc-kr"', 'charset="utf-8"', $response);
+                $response = mb_convert_encoding($response, "UTF-8", "EUC-KR");
+                $response = preg_replace('//is', '', $response);
+                $response = preg_replace('/<\/span>/is', '', $response);
+                $pattern = '/(.*)<\/span>/';
+                $response = preg_replace_callback($pattern, function($matches) { return ''.htmlspecialchars($matches[1], ENT_NOQUOTES).'';}, $response);
+                $dom = new DomDocument;
+                libxml_use_internal_errors(True);
+                if($dom->loadHTML($response)):
+                    $xpath = new DomXPath($dom);
+                    $query = "//span[@class='caption' or @class='explan' or @class='fullHD' or @class='UHD' or @class='nowon']";
+                    $spans = $xpath->query($query);
+                    foreach($spans as $span) :
+                        $span->parentNode->removeChild( $span);
+                    endforeach;
+                    $query = "//div[@id='dawn']/ul/li";
+                    $rows = $xpath->query($query);
+                    foreach($rows as $row) :
+                        $startTime = $endTime = $programName = $subprogramName = $desc = $actors = $producers = $category = $episode = "";
+                        $rebroadcast = False;
+                        $rating = 0;
+                        $cells = $row->getElementsByTagName('span');
+                        $startTime = $cells->item(0)->nodeValue ?: "";
+                        $startTime = date("YmdHis", strtotime($day." ".$startTime));
+                        $programName = trim($cells->item(2)->nodeValue) ?: "";
+                        $pattern = '/^(.*?)(\(([\d,]+)회\))?(<(.*)>)?(\((재)\))?$/';
+                        preg_match($pattern, $programName, $matches);
+                        if ($matches != NULL) :
+                            if(isset($matches[1])) $programName = trim($matches[1]) ?: "";
+                            if(isset($matches[5])) $subprogramName = trim($matches[5]) ?: "";
+                            if(isset($matches[3])) $episode = $matches[3] ?: "";
+                            if(isset($matches[7])) $rebroadcast = $matches[7] ? True : False;
+                        endif;
+                        if($cells->length > 3) $rating = str_replace('세', '', $cells->item(3)->nodeValue)  ?: 0;
+                        //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 SKY
+function GetEPGFromSKY($ChannelInfo) {
+    $ChannelId = $ChannelInfo[0];
+    $ChannelName = $ChannelInfo[1];
+    $ServiceId =  $ChannelInfo[3];
+    foreach(range(1, $GLOBALS['period']) as $k) :
+        $url = "http://www.skylife.co.kr/channel/epg/channelScheduleListJson.do";
+        $day = date("Y-m-d", strtotime("+".($k - 1)." days"));
+        $params = array(
+            'area' => 'in',
+            'inFd_channel_id' => $ServiceId,
+            'inairdate' => $day,
+            'indate_type' => 'now'
+        );
+        $params = http_build_query($params);
+        $method = "POST";
+        try {
+            $response = getWeb($url, $params, $method);
+            if ($response === False && $GLOBALS['debug']) :
+                printError($ChannelName.HTTP_ERROR);
+            else :
+                try {
+                    $data = json_decode($response, TRUE);
+                    if(json_last_error() != JSON_ERROR_NONE) throw new Exception(JSON_SYNTAX_ERROR);
+                    if(count($data['scheduleListIn']) == 0) :
+                        if($GLOBALS['debug']) :
+                            printError($ChannelName.CHANNEL_ERROR);
+                        endif;
+                    else :
+                        $programs = $data['scheduleListIn'];
+                        foreach($programs as $program) :
+                            $startTime = $endTime = $programName = $subprogramName = $desc = $actors = $producers = $category = $episode = "";
+                            $rebroadcast = False;
+                            $rating = 0;
+                            $programName = htmlspecialchars_decode($program['program_name']) ?: "";
+                            $subprogramName = str_replace(array('lt;', 'gt;', 'amp;'), array('<', '>', '&'),$program['program_subname']) ?: "";
+                            $startTime = $program['starttime'];
+                            $endTime = $program['endtime'];
+                            $actors = trim(str_replace('...', '',$program['cast']), ', ') ?: "";
+                            $producers = trim(str_replace('...', '',$program['dirt']), ', ') ?: "";
+                            $description = str_replace(array('lt;', 'gt;', 'amp;'), array('<', '>', '&'),$program['description']) ?: "";
+                            $summary = str_replace(array('lt;', 'gt;', 'amp;'), array('<', '>', '&'),$program['summary']) ?: "";
+                            $desc = $description ?: "";
+                            if($desc) :
+                                if($summary):
+                                    $desc = $desc."\n".$summary;
+                                endif;
+                            else :
+                                $desc = $summary;
+                            endif;
+                            $category = $program['program_category1'];
+                            $episode = $program['episode_id'] ?: "";
+                            $rebroadcast = $program['rebroad']== "Y" ? True : False;
+                            $rating = $program['grade'] ?: 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);
+                            usleep(1000);
+                        endforeach;
+                    endif;
+                } catch(Exception $e) {
+                    if($GLOBALS['debug']) printError($e->getMessage());
+                }
+            endif;
+        } catch (Exception $e) {
+            if($GLOBALS['debug']) printError($e->getMessage());
+        }
+    endforeach;
+}
+
+// Get EPG data from Naver
+function GetEPGFromNaver($ChannelInfo) {
+    $ChannelId = $ChannelInfo[0];
+    $ChannelName = $ChannelInfo[1];
+    $ServiceId =  $ChannelInfo[3];
+    $epginfo = array();
+    $totaldate = array();
+    foreach(range(1, $GLOBALS['period']) as $k) :
+        $url = "https://search.naver.com/p/csearch/content/batchrender_ssl.nhn";
+        $day = date("Ymd", strtotime("+".($k - 1)." days"));
+        $totaldate[] = $day;
+    endforeach;
+    $params = array(
+        '_callback' => 'epg',
+        'fileKey' => 'single_schedule_channel_day',
+        'pkid' => '66',
+        'u1' => 'single_schedule_channel_day',
+        'u2' => join(",", $totaldate),
+        'u3' => $day,
+        'u4' => $GLOBALS['period'],
+        'u5' => $ServiceId,
+        'u6' => 1,
+        'u7' => $ChannelName."편성표", 
+        'u8' => $ChannelName."편성표",
+        'where' => 'nexearch'
+    );
+    $params = http_build_query($params);
+    $method = "GET";
+    try {
+        $response = getWeb($url, $params, $method);
+        if ($response === False && $GLOBALS['debug']) :
+            printError($ChannelName.HTTP_ERROR);
+        else :
+            try {
+                $response = str_replace('epg( ', '', $response );
+                $response = substr($response, 0, strlen($response)-2);
+                $response = preg_replace("/\/\*.*?\*\//","",$response);
+                $data = json_decode($response, TRUE);
+                if(json_last_error() != JSON_ERROR_NONE) throw new Exception(JSON_SYNTAX_ERROR);
+                 if($data['displayDates'][0]['count'] == 0) :
+                    if($GLOBALS['debug']) : 
+                        printError($ChannelName.CHANNEL_ERROR);
+                    endif;
+                else :
+                    for($i = 0; $i < count($data['displayDates']); $i++) :
+                        for($j = 0; $j < 24; $j++) :
+                            foreach($data['schedules'][$j][$i] as $program) :
+                                $startTime = $endTime = $programName = $subprogramName = $desc = $actors = $producers = $category = $episode = "";
+                                $rebroadcast = False;
+                                $rating = 0;
+                                $startTime = date("YmdHis", strtotime($data['displayDates'][$i]['date']." ".$program['startTime']));
+                                $programName = htmlspecialchars_decode(trim($program['title']), ENT_XML1);
+                                $episode = str_replace("회","", $program['episode']);
+                                $rebroadcast = $program['isRerun'] ? True : False;
+                                $rating = $program['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;
+                        endfor;
+                    endfor;
+                endif;
+             } catch(Exception $e) {
+                if($GLOBALS['debug']) printError($e->getMessage());
+            }
+        endif;
+    } catch (Exception $e) {
+        if($GLOBALS['debug']) printError($e->getMessage());
+    }
+    epgzip($epginfo);
+}
+
+// Get EPG data from Iscs
+function GetEPGFromIscs($ChannelInfo) {
+    $ChannelId = $ChannelInfo[0];
+    $ChannelName = $ChannelInfo[1];
+    $ServiceId =  $ChannelInfo[3];
+    $epginfo = array();
+    foreach(range(1, $GLOBALS['period']) as $k) :
+        $url = "http://m.iscs.co.kr/sub/02/data.asp";
+        $day = date("Y-m-d", strtotime("+".($k - 1)." days"));
+        $params = array(
+            'Exec_Mode' => 'view',
+            'Source_Id' => $ServiceId,
+            'Ch_Day' => $day
+        );
+        $params = http_build_query($params);
+        $method = "POST";
+        try {
+            $response = getWeb($url, $params, $method);
+            if ($response === False && $GLOBALS['debug']) :
+                printError($ChannelName.HTTP_ERROR);
+            else :
+                try {
+                    $data = json_decode($response, TRUE);
+                    if(json_last_error() != JSON_ERROR_NONE) throw new Exception(JSON_SYNTAX_ERROR);
+                    if(count($data['total']) == 0) :
+                        if($GLOBALS['debug']) :
+                            printError($ChannelName.CHANNEL_ERROR);
+                        endif;
+                    else :
+                        $programs = $data['list'];
+                        foreach($programs as $program) :
+                            $startTime = $endTime = $programName = $subprogramName = $desc = $actors = $producers = $category = $episode = "";
+                            $rebroadcast = False;
+                            $rating = 0;
+                            $startTime = date("YmdHis", strtotime($day." ".$program['Time']));
+                            $pattern = '/^(.*?)(?:\(([\d,]+)회\))?(?:\((재)\))?$/';
+                            preg_match($pattern, trim($program['Pg_Name']), $matches);
+                            if ($matches != NULL) :
+                                if(isset($matches[1])) $programName = trim($matches[1]) ?: "";
+                                if(isset($matches[2])) $episode = $matches[2] ?: "";
+                                if(isset($matches[3])) $rebroadcast = $matches[3] ? True : False;
+                            endif;
+                            if($program['Rating'] == '모든연령'):
+                                $rating = 0;
+                            else:
+                                $rating = str_replace("세이상","", $program['Rating']);
+                            endif;
+                            //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;
+                    endif;
+                } catch(Exception $e) {
+                    if($GLOBALS['debug']) printError($e->getMessage());
+                }
+            endif;
+        } catch (Exception $e) {
+            if($GLOBALS['debug']) printError($e->getMessage());
+        }
+    endforeach;
+    epgzip($epginfo);
+}
+
+// Get EPG data from Hcn
+function GetEPGFromHcn($ChannelInfo) {
+    $ChannelId = $ChannelInfo[0];
+    $ChannelName = $ChannelInfo[1];
+    $ServiceId =  $ChannelInfo[3];
+    $epginfo = array();
+    foreach(range(1, $GLOBALS['period']) as $k) :
+        $url = "http://m.hcn.co.kr/sch_ScheduleList.action";
+        $day = date("Y-m-d", strtotime("+".($k - 1)." days"));
+        $params = array(
+            'ch_id' => $ServiceId,
+            'onairdate' => $day,
+            '_' => _microtime()
+        );
+        $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 = "//li";
+                    $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("span[@class='progTime']", $row)->item(0)->nodeValue) ?: "";
+                        $startTime = date("YmdHis", strtotime($day." ".$startTime));
+                        $programName = trim($xpath->query("span[@class='progTitle']", $row)->item(0)->nodeValue) ?: "";
+                        //$category = trim($cells->item(2)->nodeValue) ?: "";
+                        //$category = preg_replace('/\(.*\)/', '', $category);
+                        $images = $row->getElementsByTagName('img');
+                        foreach($images as $image):
+                            preg_match('/re\.png/', $image->getAttribute('src'), $rebroad);
+                            if($rebroad != NULL) $rebroadcast = True;
+                            preg_match('/.*plus([\d,]+)\.png/', $image->getAttribute('src'), $grade);
+                            if($grade != NULL) $rating = $grade[1];
+                        endforeach;
+                        //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 POOQ
+function GetEPGFromPooq($ChannelInfo) {
+    $ChannelId = $ChannelInfo[0];
+    $ChannelName = $ChannelInfo[1];
+    $ServiceId =  $ChannelInfo[3];
+    $today = date("Ymd");
+    $lastday = date("Ymd", strtotime("+".($GLOBALS['period'] - 1)." days"));
+    $url = "https://wapie.pooq.co.kr/v1/epgs30/".$ServiceId."/";
+    $params = array(
+        'deviceTypeId'=> 'pc',
+        'marketTypeId'=> 'generic',
+        'apiAccessCredential'=> 'EEBE901F80B3A4C4E5322D58110BE95C',
+        'offset'=> '0',
+        'limit'=> '1000',
+        'startTime'=>  date("Y/m/d", strtotime($today)).' 00:00',
+        'endTime'=>  date("Y/m/d", strtotime($lastday)).' 00:00'
+    );
+    foreach(range(1, $GLOBALS['period']) as $k) :
+        $day = date("Y-m-d", strtotime("+".($k - 1)." days"));
+        $date_list[] = $day;
+    endforeach;
+    $params = http_build_query($params);
+    $method = "GET";
+    try {
+        $response = getWeb($url, $params, $method);
+        if ($response === False && $GLOBALS['debug']) :
+            printError($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['result']['count'] == 0) :
+                    if($GLOBALS['debug']) : 
+                        printError($ChannelName.CHANNEL_ERROR);
+                    endif;
+                else :
+                    $programs = $data['result']['list'];
+                    foreach ($programs as $program) :
+                        $startTime = $endTime = $programName = $subprogramName = $desc = $actors = $producers = $category = $episode = "";
+                        $rebroadcast = False;
+                        $rating = 0;
+                        if(in_array($program['startDate'] , $date_list)) :
+                            $startTime = $program['startDate']." ".$program['startTime'];
+                            $startTime = date("YmdHis", strtotime($startTime));
+                            $endTime = $program['startDate']." ".$program['endTime'];
+                            $endTime = date("YmdHis", strtotime($endTime));
+                            $pattern = '/^(.*?)(?:([\d,]+)회)?(?:\((재)\))?$/';
+                            $programName = str_replace("\r\n", "", $program['programTitle']);
+                            preg_match($pattern, $programName, $matches);
+                            if($matches !== NULL) :
+                                if(isset($matches[1])) $programName = trim($matches[1]) ?: "";
+                                if(isset($matches[2])) $episode = trim($matches[2]) ?: "";
+                                if(isset($matches[3])) $rebroadcast = $matches[3] ? True : False;
+                            endif;
+                            if($program['programStaring']) $actors = trim($program['programStaring'], ',');
+                            if($program['programSummary']) $desc = trim($program['programSummary']);
+                            $rating = $program['age'];
+                            $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);
+                            usleep(1000);
+                        endif;
+                    endforeach;
+                endif;
+            } catch(Exception $e) {
+                if($GLOBALS['debug']) printError($e->getMessage());
+            }
+        endif;
+    } catch (Exception $e) {
+        if($GLOBALS['debug']) printError($e->getMessage());
+    }
+}
+
+// Get EPG data from MBC
+function GetEPGFromMbc($ChannelInfo) {
+    $ChannelId = $ChannelInfo[0];
+    $ChannelName = $ChannelInfo[1];
+    $ServiceId =  $ChannelInfo[3];
+    $dayofweek = array('일', '월', '화', '수', '목', '금', '토');
+    foreach(range(1, $GLOBALS['period']) as $k) :
+        $url = "http://miniunit.imbc.com/Schedule";
+        $day = date("Y-m-d", strtotime("+".($k - 1)." days"));
+        $params = array(
+            'rtype' => 'json'
+        );
+        $params = http_build_query($params);
+        $method = "GET";
+        try {
+            $response = getWeb($url, $params, $method);
+            if ($response === False && $GLOBALS['debug']) :
+                printError($ChannelName.HTTP_ERROR);
+            else :
+                try {
+                    $data = json_decode($response, TRUE);
+                    if(json_last_error() != JSON_ERROR_NONE) throw new Exception(JSON_SYNTAX_ERROR);
+                    if(count($data['Programs']) == 0) :
+                        if($GLOBALS['debug']) : 
+                            printError($ChannelName.CHANNEL_ERROR);
+                        endif;
+                    else :
+                        $programs = $data['Programs'];
+                        foreach($programs as $program) :
+                            if($program['Channel'] == "CHAM" && $program['LiveDays'] == $dayofweek[date("w", strtotime($day))]) :
+                                $startTime = $endTime = $programName = $subprogramName = $desc = $actors = $producers = $category = $episode = "";
+                                $rebroadcast = False;
+                                $rating = 0;
+                                $pattern = '/^(.*?)(\(재\))?$/';
+                                preg_match($pattern, htmlspecialchars_decode($program['ProgramTitle']), $matches);
+                                if ($matches != NULL) :
+                                    $programName = $matches[1];
+                                    if(isset($matches[2])) $rebroadcast = $matches[2] ? True : False;
+                                endif;
+                                $startTime = $day." ".$program['StartTime'];
+                                $startTime = date("YmdHis", strtotime($startTime));
+                                $endTime = date("YmdHis", strtotime("+".$program['RunningTime']." minutes", strtotime($startTime)));
+                                $category = "음악";
+                                $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);
+                                usleep(1000);
+                            endif;
+                        endforeach;
+                    endif;
+                } catch(Exception $e) {
+                    if($GLOBALS['debug']) printError($e->getMessage());
+                }
+            endif;
+        } catch (Exception $e) {
+            if($GLOBALS['debug']) printError($e->getMessage());
+        }
+    endforeach;
+}
+
+// Get EPG data from MIL
+function GetEPGFromMil($ChannelInfo) {
+    $ChannelId = $ChannelInfo[0];
+    $ChannelName = $ChannelInfo[1];
+    $ServiceId =  $ChannelInfo[3];
+    foreach(range(1, $GLOBALS['period']) as $k) :
+        $url = "http://radio.dema.mil.kr/web/fm/quick/ajaxTimetableList.do";
+        $day = date("Y-m-d", strtotime("+".($k - 1)." days"));
+        $params = array(
+            'program_date' => date("Ymd", strtotime($day))
+        );
+        $params = http_build_query($params);
+        $method = "GET";
+        try {
+            $response = getWeb($url, $params, $method);
+            if ($response === False && $GLOBALS['debug']) :
+                printError($ChannelName.HTTP_ERROR);
+            else :
+                try {
+                    $data = json_decode($response, TRUE);
+                    if(json_last_error() != JSON_ERROR_NONE) throw new Exception(JSON_SYNTAX_ERROR);
+                    if(count($data['resultList']) == 0) :
+                        if($GLOBALS['debug']) : 
+                            printError($ChannelName.CHANNEL_ERROR);
+                        endif;
+                    else :
+                        $programs = $data['resultList'];
+                        foreach($programs as $program) :
+                            $startTime = $endTime = $programName = $subprogramName = $desc = $actors = $producers = $category = $episode = "";
+                            $rebroadcast = False;
+                            $rating = 0;
+                            $pattern = '/^(.*?)(\(재\))?$/';
+                            preg_match($pattern, htmlspecialchars_decode($program['program_title']), $matches);
+                            if ($matches != NULL) :
+                                $programName = $matches[1];
+                                if(isset($matches[2])) $rebroadcast = $matches[2] ? True : False;
+                            endif;
+                            $subprogramName =  htmlspecialchars_decode($program['program_subtitle']);
+                            $startTime = $day." ".$program['program_time'];
+                            $startTime = date("YmdHis", strtotime($startTime));
+                            $endTime = $day." ".$program['program_end_time'];
+                            $endTime = date("YmdHis", strtotime($endTime));
+                            $actors =  htmlspecialchars_decode($program['movie_actor']);
+                            $producers =  htmlspecialchars_decode($program['movie_director']);
+                            $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);
+                            usleep(1000);
+                        endforeach;
+                    endif;
+                } catch(Exception $e) {
+                    if($GLOBALS['debug']) printError($e->getMessage());
+                }
+            endif;
+        } catch (Exception $e) {
+            if($GLOBALS['debug']) printError($e->getMessage());
+        }
+    endforeach;
+}
+
+// Get EPG data from IFM
+function GetEPGFromIfm($ChannelInfo) {
+    $ChannelId = $ChannelInfo[0];
+    $ChannelName = $ChannelInfo[1];
+    $ServiceId =  $ChannelInfo[3];
+    $dayofweek = array('1', '2', '3', '4', '5', '6', '7');
+    foreach(range(1, $GLOBALS['period']) as $k) :
+        $url = "http://mapp.itvfm.co.kr/hyb/front/selectHybPgmList.do";
+        $day = date("Y-m-d", strtotime("+".($k - 1)." days"));
+        $params = array(
+            'outDay' => $dayofweek[(date("w", strtotime($day)+1))%7],
+            'viewDt' => $day
+        );
+        $params = http_build_query($params);
+        $method = "GET";
+        try {
+            $response = getWeb($url, $params, $method);
+            if ($response === False && $GLOBALS['debug']) :
+                printError($ChannelName.HTTP_ERROR);
+            else :
+                try {
+                    $data = json_decode($response, TRUE);
+                    if(json_last_error() != JSON_ERROR_NONE) throw new Exception(JSON_SYNTAX_ERROR);
+                    if(count($data['hybMusicInfoList']) == 0) :
+                        if($GLOBALS['debug']) : 
+                            printError($ChannelName.CHANNEL_ERROR);
+                        endif;
+                    else :
+                        $programs = $data['hybMusicInfoList'];
+                        foreach($programs as $program) :
+                            $startTime = $endTime = $programName = $subprogramName = $desc = $actors = $producers = $category = $episode = "";
+                            $rebroadcast = False;
+                            $rating = 0;
+                            $programName = htmlspecialchars_decode($program['pgmTitle']) ?: "";
+                            $startTime = $day." ".$program['pgmStime'];
+                            $startTime = date("YmdHis", strtotime($startTime));
+                            $endTime = $day." ".$program['pgmEtime'];
+                            $endTime = date("YmdHis", strtotime($endTime));
+                            $actors =  htmlspecialchars_decode($program['pgmDj']);
+                            $producers =  htmlspecialchars_decode($program['pgmPd']);
+                            $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);
+                            usleep(1000);
+                        endforeach;
+                    endif;
+                } catch(Exception $e) {
+                    if($GLOBALS['debug']) printError($e->getMessage());
+                }
+            endif;
+        } catch (Exception $e) {
+            if($GLOBALS['debug']) printError($e->getMessage());
+        }
+    endforeach;
+}
+
+// Get EPG data from KBS
+function GetEPGFromKbs($ChannelInfo) {
+    $ChannelId = $ChannelInfo[0];
+    $ChannelName = $ChannelInfo[1];
+    $ServiceId =  $ChannelInfo[3];
+    $epginfo = array();
+    foreach(range(1, $GLOBALS['period']) as $k) :
+        $url = "http://world.kbs.co.kr/include/wink/_ajax_schedule.php";
+        $day = date("Y-m-d", strtotime("+".($k - 1)." days"));
+        $params = array(
+            'channel'=>'wink_11'
+        );
+        $params = http_build_query($params);
+        $method = "GET";
+        try {
+             $response = getWeb($url, $params, $method);
+            if ($response === False && $GLOBALS['debug']) :
+                printError($ChannelName.HTTP_ERROR);
+            else :
+                try {
+                    $data = json_decode($response, TRUE);
+                    if(json_last_error() != JSON_ERROR_NONE) throw new Exception(JSON_SYNTAX_ERROR);
+                    if(count($data['schedule']) == 0) :
+                        if($GLOBALS['debug']) : 
+                            printError($ChannelName.CHANNEL_ERROR);
+                        endif;
+                    else :
+                        $dom = new DomDocument;
+                        libxml_use_internal_errors(True);
+                        $dom->loadHTML($data['schedule']);
+                        $xpath = new DomXPath($dom);
+                        $query = "//li";
+                        $rows = $xpath->query($query);
+                        foreach($rows as $row) :
+                            $startTime = $endTime = $programName = $subprogramName = $desc = $actors = $producers = $category = $episode = "";
+                            $rebroadcast = False;
+                            $rating = 0;
+                            $cells = $row->getElementsByTagName('span');
+                            $startTime = $day." ".trim($cells->item(0)->childNodes->item(0)->nodeValue);
+                            $startTime = date("YmdHis", strtotime($startTime));
+                            $programName = trim($cells->item(2)->childNodes->item(0)->nodeValue);
+                            $programName = str_replace(array("[","]", " Broadcast"), array("", "", ""), $programName);
+                            //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;
+                    endif;
+                } catch(Exception $e) {
+                    if($GLOBALS['debug']) printError($e->getMessage());
+                }
+            endif;
+        } catch (Exception $e) {
+            if($GLOBALS['debug']) printError($e->getMessage());
+        }
+    endforeach;
+    epgzip($epginfo);
+}
+
+function GetEPGFromArirang($ChannelInfo) {
+    $ChannelId = $ChannelInfo[0];
+    $ChannelName = $ChannelInfo[1];
+    $ServiceId =  $ChannelInfo[3];
+    $epginfo = array();
+    foreach(range(1, $GLOBALS['period']) as $k) :
+        $url = "http://www.arirang.com/Radio/Radio_Index.asp";
+        $day = date("Y-m-d", strtotime("+".($k - 1)." days"));
+        $params = array();
+        $params = http_build_query($params);
+        $method = "GET";
+       try {
+            $response = getWeb($url, $params, $method);
+            if ($response === False && $GLOBALS['debug']) :
+                printError($ChannelName.HTTP_ERROR);
+            else :
+                $dom = new DomDocument;
+                libxml_use_internal_errors(True);
+                //echo $response;
+
+                $response = mb_convert_encoding($response, "HTML-ENTITIES", "EUC-KR");
+                if($dom->loadHTML($response)):
+                    $xpath = new DomXPath($dom);
+                    $dayofweek = date("w", strtotime($day));
+                    if($dayofweek == 0):
+                        $query = "//table[@id='aIRSW_sun']/tr";
+                    elseif($dayofweek == 6):
+                        $query = "//table[@id='aIRSW_sat']/tr";
+                    else :
+                        $query = "//table[@id='aIRSW_week']/tr";
+                    endif;
+                    $rows = $xpath->query($query);
+                    foreach($rows as $row) :
+                        $startTime = $endTime = $programName = $subprogramName = $desc = $actors = $producers = $category = $episode = "";
+                        $rebroadcast = False;
+                        $rating = 0;
+                        $time = $row->getElementsByTagName('th');
+                        $times = explode('~', trim($time->item(0)->nodeValue));
+                        $startTime = date("YmdHis", strtotime($day." ".$times[0]));
+                        $endTime = date("YmdHis", strtotime($day." ".$times[1]));
+                        $program = $row->getElementsByTagName('td');
+                        $pattern = '/^(.*?)(?:\((Re)\))?$/';
+                        preg_match($pattern, trim($program->item(0)->nodeValue), $matches);
+                        if ($matches != NULL) :
+                            $programName = $matches[1];
+                            if(isset($matches[2])) $rebroadcast = $matches[2] ? True : False;
+                        endif;
+                        $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);
+                        usleep(1000);
+                    endforeach;
+                else :
+                    if($GLOBALS['debug']) printError($ChannelName.CONTENT_ERROR);
+                endif;
+            endif;
+        } catch (Exception $e) {
+            if($GLOBALS['debug']) printError($e->getMessage());
+        }
+    endforeach;
+}
+
+# Zip epginfo
+function epgzip($epginfo) {
+    #ChannelId, startTime, programName, subprogramName, desc, actors, producers, category, episode, rebroadcast, rating
+    $zipped = array_slice(array_map(NULL, $epginfo, array_slice($epginfo,1)),0,-1);
+    foreach($zipped as $epg) :
+        $ChannelId = $epg[0][0] ?: "";
+        $startTime = $epg[0][1] ?: "";
+        $endTime = $epg[1][1] ?: "";
+        $programName = $epg[0][2] ?: "";
+        $subprogramName = $epg[0][3] ?: "";
+        $desc = $epg[0][4] ?: "";
+        $actors = $epg[0][5] ?: "";
+        $producers = $epg[0][6] ?: "";
+        $category = $epg[0][7] ?: "";
+        $episode = $epg[0][8] ?: "";
+        $rebroadcast = $rebroadcast = $epg[0][9] ? True: False;
+        $rating = $epg[0][10] ?: 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;
+}
+
+function writeProgram($programdata) {
+    $fp = $GLOBALS['fp'];
+    $ChannelId = $programdata['channelId'];
+    $startTime = $programdata['startTime'];
+    $endTime = $programdata['endTime'];
+    $programName = trim(htmlspecialchars($programdata['programName'], ENT_XML1));
+    $subprogramName = trim(htmlspecialchars($programdata['subprogramName'], ENT_XML1));
+    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;
+    if($programName == NULL):
+        $programName = $subprogramName;
+    endif;
+    $actors = htmlspecialchars($programdata['actors'], ENT_XML1);
+    $producers = htmlspecialchars($programdata['producers'], ENT_XML1);
+    $category = htmlspecialchars($programdata['category'], ENT_XML1);
+    $episode = $programdata['episode'];
+    if($episode) :
+        $episode_ns = (int)$episode - 1;
+        $episode_ns = '0' . '.' . $episode_ns . '.' . '0' . '/' . '0';
+        $episode_on = $episode;
+    endif;
+    $rebroadcast = $programdata['rebroadcast'];
+    if($episode && $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['addverbose'] == 'y') :
+        $desc = trim(htmlspecialchars($programdata['programName'], ENT_XML1));
+        if($subprogramName)  $desc = $desc."\n부제 : ".$subprogramName;
+        if($rebroadcast == True && $GLOBALS['addrebroadcast']  == 'y') $desc = $desc."\n방송 : 재방송";
+        if($episode) $desc = $desc."\n회차 : ".$episode."회";
+        if($category) $desc = $desc."\n장르 : ".$category;
+        if($actors) $desc = $desc."\n출연 : ".trim($actors);
+        if($producers) $desc = $desc."\n제작 : ".trim($producers);
+        $desc = $desc."\n등급 : ".$rating;
+    else:
+        $desc = "";
+    endif;
+    if($programdata['desc']) $desc = $desc."\n".htmlspecialchars($programdata['desc'], ENT_XML1);
+    $desc = preg_replace('/ +/', ' ', $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',
+        '시사/다큐' => 'Documentary',
+        '연예' => 'Show / Game show',
+        '스포츠' => 'Sports',
+        '홈쇼핑' => 'Advertisement / Shopping'
+       );
+    $contentType = "";
+    foreach($contentTypeDict as $key => $value) :
+        if(!(strpos($category, $key) === False)) :
+            $contentType = $value;
+        endif;
+    endforeach;
+    fprintf($fp, "  \n", $startTime, $endTime, $ChannelId);
+    fprintf($fp, "    %s\n", $programName);
+    if($subprogramName) :
+        fprintf($fp, "    %s\n", $subprogramName);
+    endif;
+    if($GLOBALS['addverbose']=='y') :
+        fprintf($fp, "    %s\n", $desc);
+        if($actors || $producers):
+            fprintf($fp, "    \n");
+            if($actors) :
+                foreach(explode(',', $actors) as $actor):
+                    if(trim($actor)) fprintf($fp, "      %s\n", trim($actor));
+                endforeach;
+            endif;
+            if($producers) :
+                foreach(explode(',', $producers) as $producer):
+                    if(trim($producer)) fprintf($fp, "      %s\n", trim($producer));
+                endforeach;
+            endif;
+            fprintf($fp, "    \n");
+        endif;
+    endif;
+    if($category) fprintf($fp, "    %s\n", $category);
+    if($contentType) fprintf($fp, "    %s\n", $contentType);
+    if($episode) fprintf($fp, "    %s\n", $episode_ns);
+    if($episode) fprintf($fp, "    %s\n", $episode_on);
+    if($rebroadcast) fprintf($fp, "    \n");
+    if($rating) :
+        fprintf($fp, "    \n");
+        fprintf($fp, "      %s\n", $rating);
+        fprintf($fp, "    \n");
+    endif;
+    fprintf($fp, "  \n");
+}
+
+function getWeb($url, $params, $method) {
+    $ch = curl_init();
+    if($method == "GET"):
+        $url = $url."?".$params;
+    elseif($method == "POST"):
+        curl_setopt ($ch, CURLOPT_POST, True);
+        curl_setopt ($ch, CURLOPT_POSTFIELDS, $params);
+    endif;
+    curl_setopt($ch, CURLOPT_URL, $url);
+    curl_setopt($ch, CURLOPT_RETURNTRANSFER, True);
+    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $GLOBALS['timeout']);
+    curl_setopt($ch, CURLOPT_HEADER, False);
+    curl_setopt($ch, CURLOPT_FAILONERROR, True);
+    curl_setopt($ch, CURLOPT_USERAGENT, $GLOBALS['ua']);
+    $response = curl_exec($ch);
+    if(curl_error($ch) && $GLOBALS['debug']) printError($url." ".curl_error($ch));
+    curl_close($ch);
+    return $response;
+}
+
+function printLog($string) {
+    if(php_sapi_name() == "cli"):
+        fwrite(STDERR, $string."\n");
+    else:
+        header("Content-Type: text/plain; charset=utf-8");
+        print($string."\n");
+    endif;
+}
+
+function printError($string) {
+    if(php_sapi_name() == "cli"):
+        fwrite(STDERR, "Error : ".$string."\n");
+    else:
+        header("Content-Type: text/plain; charset=utf-8");
+        print("Error : ".$string."\n");
+    endif;
+}
+
+function _microtime() {
+    list($usec, $sec) = explode(" ", microtime());
+    return ($sec.(int)($usec*1000));
+}
+?>

From 015f6044b776d5d7ca1eaf800fe6ca46f286dff5 Mon Sep 17 00:00:00 2001
From: wonipapa 
Date: Wed, 6 Sep 2017 15:17:55 +0900
Subject: [PATCH 40/41] Update README.md

---
 README.md | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/README.md b/README.md
index 24b5b88..26d06d4 100644
--- a/README.md
+++ b/README.md
@@ -23,6 +23,7 @@ epg2xml.json 안의 항목이 설정 가능한 항목이다.
 
 MyISP : 사용하는 ISP를 넣는다 .(ALL, KT, LG, SK가 사용가능하다)
 MyChannels : EPG 정보를 가져오고자 하는 채널 ID를 넣는다. ("1, 2, 3, 4" 또는 "1,2,3,4")
+output : EPG 정보 출력방향 (d: 화면 출력, o: 파일 출력, s:소켓출력)
 default_icon_url : 채널별 아이콘이 있는 url을 설정할 수 있다. 아이콘의 이름은 json 파일에 있는 Id.png로 기본설정되어 있다.
 default_rebroadcast : 제목에 재방송 정보 출력
 default_episode : 제목에 회차정보 출력
@@ -66,9 +67,9 @@ ex : http://domain/epg2xml.php?i=ALL&l=2
 ## 사용방법
 
 ### tv_grab_file 사용시 (https://github.com/nurtext/tv_grab_file_synology)
-tv_grab_file 안의 cat xmltv.xml 또는 wget 부분을 아래와 같이 변경해준다.  
+tv_grab_file 안의 cat xmltv.xml 또는 wget 이 있는 부분을 아래와 같이 변경해준다.  
 python 경로와 php의 경로는 /usr/bin에 있고, epg2xml 파일은 /home/hts에 있는 것으로 가정했다.  
-
+이 경우 epg2xml.json의 output을 d로 해야 한다.
 #### PYTHON의 경우
 
 /usr/bin/python /home/hts/epg2xml.py 또는
@@ -106,7 +107,7 @@ wget -O - http://domain/epg2xml.php?i=ALL&l=2
 php web 버전은 xmltv.sock을 지원하지 않는다.
 
 ## 라이센스
-BSD
+BSD 3-clause "New" or "Revised" License
 
 ## WIKI
 https://github.com/wonipapa/epg2xml/wiki
@@ -119,6 +120,7 @@ https://github.com/wonipapa/epg2xml/wiki/FAQ
   - My Channel 추가
   - 소스 추가
   - 에피소드 넘버 xmltv_ns 추가
+  - PHP 공용함수 분리
 ### Version 1.2.1
   - SKB 함수 추가
   - 가져오는 날짜 최대 2일로 변경

From 11840d2603a2d858d201b86fe7c86d082a5f0f5c Mon Sep 17 00:00:00 2001
From: wonipapa 
Date: Wed, 6 Sep 2017 15:20:05 +0900
Subject: [PATCH 41/41] =?UTF-8?q?=EC=98=A4=EC=9E=90=20=EC=88=98=EC=A0=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 epg2xml.json | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/epg2xml.json b/epg2xml.json
index bf3c3d9..e7e7460 100644
--- a/epg2xml.json
+++ b/epg2xml.json
@@ -4,11 +4,11 @@
     "###_COMMENT_###" : "사용하는 ISP 선택 (ALL, KT, LG, SK)",
     "MyISP": "ALL",
     "###_COMMENT_###" : "### # My Channel EPG 정보 가져오는 채널 ID ###",
-    "###_COMMENT_###" : "60, 110, 111, 122, 164",
+    "###_COMMENT_###" : "채널 ID를 , 로 구분. , 상의 간격 유무 관계없음 ",
     "MyChannels" : "60, 110, 111, 122, 164",
     "###_COMMENT_###" : "output 셋팅은 (d, o, s) 셋중에 하나로 선택한다",
     "###_COMMENT_###" : " d - EPG 정보 화면 출력",
-    "###_COMMENT_###" : " o - EPG 정보 파일로 저정",
+    "###_COMMENT_###" : " o - EPG 정보 파일로 저장",
     "###_COMMENT_###" : " s - EPG 정보 소켓으로 출력",
     "output": "d",
     "###_COMMENT_###" : "### TV channel icon url (ex : http://www.example.com/Channels) ###",

@( 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 From 1be045cf437bfdc48421a981460dc22bf23bbb8b Mon Sep 17 00:00:00 2001 From: wonipapa Date: Tue, 22 Aug 2017 10:53:09 +0900 Subject: [PATCH 10/41] =?UTF-8?q?MyChannels=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- epg2xml.json | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/epg2xml.json b/epg2xml.json index 0f94945..6792673 100644 --- a/epg2xml.json +++ b/epg2xml.json @@ -2,7 +2,10 @@ "###_COMMENT_###" : "", "###_COMMENT_###" : "epg 정보를 가져오는 설정 파일", "###_COMMENT_###" : "사용하는 ISP 선택 (ALL, KT, LG, SK)", - "MyISP": "KT", + "MyISP": "ALL", + "###_COMMENT_###" : "### # My Channel Enabled:1 로 하고자 하는 채널 ID ###", + "###_COMMENT_###" : "1, 2, 3, 4", + "MyChannels" : "60, 110, 111, 122, 164", "###_COMMENT_###" : "output 셋팅은 (d, o, s) 셋중에 하나로 선택한다", "###_COMMENT_###" : " d - EPG 정보 화면 출력", "###_COMMENT_###" : " o - EPG 정보 파일로 저정", @@ -13,10 +16,10 @@ "###_COMMENT_###" : "### 제목에 재방송 정보 출력 ###", "default_rebroadcast": "y", "###_COMMENT_###" : "#### 제목에 회차정보 출력 ###", - "default_episode" : "n", + "default_episode" : "y", "###_COMMENT_###" : "### EPG 정보 추가 출력 ###", - "default_verbose" : "n", - "###_COMMENT_###" : "### epg 데이터 가져오는 기간으로 1에서 7까지 설정가능 ###", + "default_verbose" : "y", + "###_COMMENT_###" : "### epg 데이터 가져오는 기간으로 1에서 2까지 설정가능 ###", "default_fetch_limit" : "2", "###_COMMENT_###" : "### epg 저장시 기본 저장 이름 (ex: /home/tvheadend/xmltv.xml) ###", "default_xml_file" : "xmltv.xml", From d5ea1f7263105337151b20a90cdfb1c097c6a911 Mon Sep 17 00:00:00 2001 From: wonipapa Date: Tue, 22 Aug 2017 10:53:56 +0900 Subject: [PATCH 11/41] 20170822 --- Channel.json | 686 ++++++++++++++++++++++++++------------------------- 1 file changed, 344 insertions(+), 342 deletions(-) diff --git a/Channel.json b/Channel.json index 209e394..d6577d7 100644 --- a/Channel.json +++ b/Channel.json @@ -1,344 +1,346 @@ [ -{"Id":1,"Name":"9colors","KT Name":"9colors","KTCh":163,"LG Name":"9 colors","LGCh":178,"SK Name":"9colors","SKCh":220,"Icon_url":"http://i.imgur.com/tRhzBgK.png","Source":"SKY","ServiceId":99,"Enabled":0}, -{"Id":2,"Name":"애니박스","KT Name":"애니박스","KTCh":135,"LG Name":"애니박스","LGCh":148,"SK Name":"애니박스","SKCh":179,"Icon_url":"http://i.imgur.com/ipM9AXe.png","Source":"SKY","ServiceId":84,"Enabled":0}, -{"Id":3,"Name":"Animal Planet","KT Name":"Animal Planet","KTCh":179,"LG Name":"","LGCh":null,"SK Name":"","SKCh":null,"Icon_url":"http://i.imgur.com/ae70Di1.png","Source":"SKY","ServiceId":182,"Enabled":0}, -{"Id":4,"Name":"ANIMAX","KT Name":"ANIMAX","KTCh":133,"LG Name":"ANIMAX","LGCh":167,"SK Name":"Animax","SKCh":173,"Icon_url":"http://i.imgur.com/2Gfqhuj.png","Source":"SKY","ServiceId":725,"Enabled":0}, -{"Id":5,"Name":"애니원","KT Name":"애니원","KTCh":134,"LG Name":"애니원","LGCh":153,"SK Name":"애니원","SKCh":174,"Icon_url":"http://i.imgur.com/sIp2MZ3.png","Source":"SKY","ServiceId":56,"Enabled":0}, -{"Id":6,"Name":"예술 TV아르떼","KT Name":"예술 TV아르떼","KTCh":91,"LG Name":"예술TV Arte","LGCh":139,"SK Name":"Arte TV","SKCh":234,"Icon_url":"http://i.imgur.com/zReu7df.png","Source":"SKY","ServiceId":928,"Enabled":0}, -{"Id":7,"Name":"Asia UHD","KT Name":"Asia UHD","KTCh":109,"LG Name":"","LGCh":null,"SK Name":"Asia UHD","SKCh":72,"Icon_url":"http://i.imgur.com/1u80OGN.png","Source":"SKY","ServiceId":655,"Enabled":0}, -{"Id":8,"Name":"AsiaN","KT Name":"AsiaN","KTCh":111,"LG Name":"AsiaN","LGCh":88,"SK Name":"Asia N","SKCh":106,"Icon_url":"http://i.imgur.com/gleMSFq.png","Source":"SKY","ServiceId":976,"Enabled":0}, -{"Id":9,"Name":"Australia Plus","KT Name":"Australia Plus","KTCh":258,"LG Name":"","LGCh":null,"SK Name":"","SKCh":null,"Icon_url":"http://i.imgur.com/6k9j2Hj.png","Source":"NAVER","ServiceId":815391,"Enabled":0}, -{"Id":10,"Name":"AXN","KT Name":"AXN","KTCh":113,"LG Name":"AXN","LGCh":45,"SK Name":"AXN","SKCh":102,"Icon_url":"http://i.imgur.com/QrAXBEm.png","Source":"SKY","ServiceId":679,"Enabled":0}, -{"Id":11,"Name":"B Shopping","KT Name":"B Shopping","KTCh":30,"LG Name":"Btv 쇼핑","LGCh":28,"SK Name":"","SKCh":null,"Icon_url":"http://i.imgur.com/HiCKxpt.png","Source":"LG","ServiceId":738,"Enabled":0}, -{"Id":14,"Name":"Baby TV","KT Name":"Baby TV","KTCh":146,"LG Name":"","LGCh":null,"SK Name":"Baby TV","SKCh":195,"Icon_url":"http://i.imgur.com/mU7QuTz.png","Source":"NAVER","ServiceId":815505,"Enabled":0}, -{"Id":15,"Name":"BBC Earth","KT Name":"BBC Earth","KTCh":172,"LG Name":"BBC Earth","LGCh":130,"SK Name":"BBC earth","SKCh":265,"Icon_url":"http://i.imgur.com/SJZjuqO.png","Source":"SKY","ServiceId":904,"Enabled":0}, -{"Id":18,"Name":"BBC WN","KT Name":"BBC WN","KTCh":192,"LG Name":"BBC World News","LGCh":126,"SK Name":"BBC World News","SKCh":160,"Icon_url":"http://i.imgur.com/IwJBNd4.png","Source":"SKY","ServiceId":506,"Enabled":0}, -{"Id":19,"Name":"BBS불교방송","KT Name":"BBS불교방송","KTCh":232,"LG Name":"BBS불교방송","LGCh":186,"SK Name":"BBS 불교방송","SKCh":306,"Icon_url":"http://i.imgur.com/B34jpmo.png","Source":"NAVER","ServiceId":815103,"Enabled":0}, -{"Id":20,"Name":"빌리어즈티비","KT Name":"빌리어즈티비","KTCh":116,"LG Name":"Billiards TV","LGCh":63,"SK Name":"Billiards TV","SKCh":130,"Icon_url":"http://i.imgur.com/f0OW8wX.png","Source":"SKY","ServiceId":615,"Enabled":0}, -{"Id":21,"Name":"Bloomberg","KT Name":"Bloomberg","KTCh":196,"LG Name":"","LGCh":null,"SK Name":"Bloomberg TV","SKCh":162,"Icon_url":"http://i.imgur.com/WWNLhh3.png","Source":"NAVER","ServiceId":815398,"Enabled":0}, -{"Id":23,"Name":"BTN불교TV","KT Name":"BTN불교TV","KTCh":233,"LG Name":"BTN불교TV","LGCh":185,"SK Name":"BTN 불교TV","SKCh":305,"Icon_url":"http://i.imgur.com/XU4pwpC.png","Source":"NAVER","ServiceId":815112,"Enabled":0}, -{"Id":24,"Name":"C channel","KT Name":"C Channel","KTCh":235,"LG Name":"C Channel","LGCh":182,"SK Name":"C채널","SKCh":304,"Icon_url":"http://i.imgur.com/SFouN1c.png","Source":"NAVER","ServiceId":815109,"Enabled":0}, -{"Id":26,"Name":"C TIME","KT Name":"C TIME","KTCh":69,"LG Name":"C´TIME","LGCh":86,"SK Name":"C TIME","SKCh":86,"Icon_url":"http://i.imgur.com/2FwWidb.png","Source":"SKY","ServiceId":174,"Enabled":0}, -{"Id":27,"Name":"Cbeebies","KT Name":"Cbeebies","KTCh":152,"LG Name":"","LGCh":null,"SK Name":"","SKCh":null,"Icon_url":"http://i.imgur.com/4bIQeie.png","Source":"NAVER","ServiceId":814991,"Enabled":0}, -{"Id":28,"Name":"CBS","KT Name":"CBS","KTCh":238,"LG Name":"CBS","LGCh":181,"SK Name":"CBS","SKCh":300,"Icon_url":"http://i.imgur.com/yBNo2mS.png","Source":"SKY","ServiceId":156,"Enabled":0}, -{"Id":31,"Name":"CCTV4","KT Name":"CCTV4","KTCh":280,"LG Name":"CCTV4","LGCh":120,"SK Name":"CCTV4","SKCh":277,"Icon_url":"http://i.imgur.com/ACwvhcc.png","Source":"SKY","ServiceId":159,"Enabled":0}, -{"Id":32,"Name":"CGNTV","KT Name":"CGNTV","KTCh":237,"LG Name":"CGNTV","LGCh":183,"SK Name":"CGNTV","SKCh":302,"Icon_url":"http://i.imgur.com/9fNvKEX.png","Source":"NAVER","ServiceId":815106,"Enabled":0}, -{"Id":34,"Name":"Channel [V]","KT Name":"Channel [V]","KTCh":89,"LG Name":"","LGCh":null,"SK Name":"","SKCh":null,"Icon_url":"http://i.imgur.com/t1PNA6v.png","Source":"KT","ServiceId":89,"Enabled":0}, -{"Id":35,"Name":"채널 J","KT Name":"채널 J","KTCh":108,"LG Name":"채널J","LGCh":145,"SK Name":"채널J","SKCh":103,"Icon_url":"http://i.imgur.com/V9jGCZm.png","Source":"SKY","ServiceId":973,"Enabled":0}, -{"Id":36,"Name":"Channel News Asia","KT Name":"","KTCh":null,"LG Name":"","LGCh":null,"SK Name":"Channel News Asia","SKCh":163,"Icon_url":"http://i.imgur.com/hahdOp1.png","Source":"SKB","ServiceId":777,"Enabled":0}, -{"Id":38,"Name":"cineF","KT Name":"","KTCh":null,"LG Name":"cineF","LGCh":42,"SK Name":"Cinef","SKCh":58,"Icon_url":"http://i.imgur.com/TfhQXIv.png","Source":"NAVER","ServiceId":814729,"Enabled":0}, -{"Id":39,"Name":"UXN","KT Name":"UXN","KTCh":101,"LG Name":"UXN","LGCh":2,"SK Name":"UXN","SKCh":70,"Icon_url":"http://i.imgur.com/5rRW0R3.png","Source":"SKY","ServiceId":624,"Enabled":0}, -{"Id":40,"Name":"CJ오쇼핑","KT Name":"CJ오쇼핑","KTCh":4,"LG Name":"CJ오쇼핑","LGCh":8,"SK Name":"CJ오쇼핑","SKCh":6,"Icon_url":"http://i.imgur.com/uBClUx6.png","Source":"NAVER","ServiceId":815096,"Enabled":0}, -{"Id":41,"Name":"CJ오쇼핑 플러스","KT Name":"CJ오쇼핑플러스","KTCh":28,"LG Name":"CJ오쇼핑 플러스","LGCh":32,"SK Name":"CJ오쇼핑 플러스","SKCh":33,"Icon_url":"http://i.imgur.com/WlK2YDk.png","Source":"KT","ServiceId":28,"Enabled":0}, -{"Id":42,"Name":"CLASSICA","KT Name":"CLASSICA","KTCh":90,"LG Name":"Classica","LGCh":146,"SK Name":"Classica HD","SKCh":235,"Icon_url":"http://i.imgur.com/FEfMS0W.png","Source":"SKY","ServiceId":365,"Enabled":0}, -{"Id":43,"Name":"CMC가족오락TV","KT Name":"CMC가족오락TV","KTCh":126,"LG Name":"","LGCh":null,"SK Name":"CMC 가족오락TV","SKCh":93,"Icon_url":"http://i.imgur.com/fNuqGzR.png","Source":"NAVER","ServiceId":814797,"Enabled":0}, -{"Id":44,"Name":"CMTV","KT Name":"CMTV","KTCh":262,"LG Name":"","LGCh":null,"SK Name":"","SKCh":null,"Icon_url":"http://i.imgur.com/ITweLdv.png","Source":"NAVER","ServiceId":2843917,"Enabled":0}, -{"Id":45,"Name":"CNBC","KT Name":"CNBC","KTCh":197,"LG Name":"CNBC","LGCh":118,"SK Name":"","SKCh":null,"Icon_url":"http://i.imgur.com/Mx8ZXqk.png","Source":"NAVER","ServiceId":815128,"Enabled":0}, -{"Id":46,"Name":"CNN International","KT Name":"CNN International","KTCh":191,"LG Name":"CNN International","LGCh":117,"SK Name":"CNN International","SKCh":158,"Icon_url":"http://i.imgur.com/RxsYny9.png","Source":"SKY","ServiceId":117,"Enabled":0}, -{"Id":47,"Name":"CNN US","KT Name":"","KTCh":null,"LG Name":"","LGCh":null,"SK Name":"CNN US","SKCh":159,"Icon_url":"http://i.imgur.com/EL6i9mA.png","Source":"SKY","ServiceId":527,"Enabled":0}, -{"Id":48,"Name":"CNTV","KT Name":"CNTV","KTCh":68,"LG Name":"CNTV","LGCh":85,"SK Name":"CNTV","SKCh":43,"Icon_url":"http://i.imgur.com/lCGq3v1.png","Source":"NAVER","ServiceId":814709,"Enabled":0}, -{"Id":49,"Name":"CTS기독교TV","KT Name":"CTS기독교TV","KTCh":236,"LG Name":"CTS기독교TV","LGCh":180,"SK Name":"CTS","SKCh":301,"Icon_url":"http://i.imgur.com/lW9nvaB.png","Source":"NAVER","ServiceId":815110,"Enabled":0}, -{"Id":50,"Name":"CUBE TV","KT Name":"","KTCh":null,"LG Name":"","LGCh":null,"SK Name":"CUBE TV","SKCh":89,"Icon_url":"http://i.imgur.com/xvEjFJa.png","Source":"NAVER","ServiceId":1725243,"Enabled":0}, -{"Id":51,"Name":"디스커버리채널","KT Name":"디스커버리채널","KTCh":177,"LG Name":"","LGCh":null,"SK Name":"Discovery Channel","SKCh":261,"Icon_url":"http://i.imgur.com/1SgSI0P.png","Source":"NAVER","ServiceId":815292,"Enabled":0}, -{"Id":52,"Name":"Dog TV","KT Name":"Dog TV","KTCh":201,"LG Name":"DOG TV","LGCh":89,"SK Name":"DOG TV","SKCh":79,"Icon_url":"http://i.imgur.com/4Xqehq9.png","Source":"NAVER","ServiceId":2020583,"Enabled":0}, -{"Id":53,"Name":"Dream Works Channel","KT Name":"Dream Works Channel","KTCh":131,"LG Name":"","LGCh":null,"SK Name":"","SKCh":null,"Icon_url":"http://i.imgur.com/ETfF49T.png","Source":"KT","ServiceId":131,"Enabled":0}, -{"Id":54,"Name":"DW-TV Asia+","KT Name":"DW-TV Asia+","KTCh":257,"LG Name":"","LGCh":null,"SK Name":"","SKCh":null,"Icon_url":"http://i.imgur.com/b0yhwNu.png","Source":"NAVER","ServiceId":815529,"Enabled":0}, -{"Id":55,"Name":"E채널","KT Name":"E채널","KTCh":48,"LG Name":"E channel","LGCh":104,"SK Name":"E채널","SKCh":83,"Icon_url":"http://i.imgur.com/0WmEGB4.png","Source":"SKY","ServiceId":108,"Enabled":0}, -{"Id":56,"Name":"EBS English","KT Name":"EBS English","KTCh":156,"LG Name":"EBS English","LGCh":162,"SK Name":"EBS English","SKCh":202,"Icon_url":"http://i.imgur.com/Rx4mgpm.png","Source":"SKY","ServiceId":777,"Enabled":0}, -{"Id":57,"Name":"EBS u","KT Name":"EBS u","KTCh":145,"LG Name":"EBS u","LGCh":168,"SK Name":"EBSu","SKCh":194,"Icon_url":"http://i.imgur.com/RIgVjvP.png","Source":"NAVER","ServiceId":815547,"Enabled":0}, -{"Id":58,"Name":"EBS PLUS1","KT Name":"EBS PLUS1","KTCh":157,"LG Name":"EBS Plus1","LGCh":163,"SK Name":"EBS +1","SKCh":203,"Icon_url":"http://i.imgur.com/WGlWiWy.png","Source":"SKY","ServiceId":113,"Enabled":0}, -{"Id":59,"Name":"EBS PLUS2","KT Name":"EBS PLUS2","KTCh":158,"LG Name":"EBS Plus2","LGCh":164,"SK Name":"EBS +2","SKCh":204,"Icon_url":"http://i.imgur.com/QPq2wcg.png","Source":"SKY","ServiceId":114,"Enabled":0}, -{"Id":60,"Name":"EBS","KT Name":"EBS","KTCh":13,"LG Name":"EBS1","LGCh":14,"SK Name":"EBS","SKCh":13,"Icon_url":"http://i.imgur.com/WViFruZ.png","Source":"SKY","ServiceId":798,"Enabled":1}, -{"Id":61,"Name":"EBS2","KT Name":"EBS2","KTCh":95,"LG Name":"EBS2","LGCh":95,"SK Name":"EBS2","SKCh":95,"Icon_url":"http://i.imgur.com/RIrBF4D.png","Source":"NAVER","ServiceId":2438226,"Enabled":0}, -{"Id":62,"Name":"Edge TV","KT Name":"Edge TV","KTCh":79,"LG Name":"EDGE TV","LGCh":68,"SK Name":"EDGE TV","SKCh":44,"Icon_url":"http://i.imgur.com/gsnjG4A.png","Source":"SKY","ServiceId":104,"Enabled":0}, -{"Id":63,"Name":"edu TV","KT Name":"edu TV","KTCh":159,"LG Name":"eduTV","LGCh":165,"SK Name":"edu TV","SKCh":205,"Icon_url":"http://i.imgur.com/ZsMKNGe.png","Source":"LG","ServiceId":810,"Enabled":0}, -{"Id":67,"Name":"Euro News","KT Name":"Euro News","KTCh":193,"LG Name":"","LGCh":null,"SK Name":"","SKCh":null,"Icon_url":"http://i.imgur.com/6jswCZM.png","Source":"NAVER","ServiceId":814935,"Enabled":0}, -{"Id":68,"Name":"Euro sport","KT Name":"","KTCh":null,"LG Name":"","LGCh":null,"SK Name":"Eurosport","SKCh":134,"Icon_url":"http://i.imgur.com/7hVKz6n.png","Source":"SKY","ServiceId":578,"Enabled":0}, -{"Id":70,"Name":"Extreme Fun","KT Name":"Extreme Fun","KTCh":173,"LG Name":"","LGCh":null,"SK Name":"","SKCh":null,"Icon_url":"http://i.imgur.com/yDg1RC6.png","Source":"KT","ServiceId":173,"Enabled":0}, -{"Id":71,"Name":"Fashion N","KT Name":"","KTCh":null,"LG Name":"","LGCh":null,"SK Name":"Fashion N","SKCh":211,"Icon_url":"http://i.imgur.com/qPBnZpV.png","Source":"NAVER","ServiceId":815026,"Enabled":0}, -{"Id":72,"Name":"FISHING TV","KT Name":"FISHING TV","KTCh":119,"LG Name":"FSTV","LGCh":65,"SK Name":"FISHING TV","SKCh":244,"Icon_url":"http://i.imgur.com/Go4FdK1.png","Source":"SKY","ServiceId":254,"Enabled":0}, -{"Id":73,"Name":"푸드TV","KT Name":"푸드TV","KTCh":78,"LG Name":"푸드TV","LGCh":83,"SK Name":"Food TV","SKCh":213,"Icon_url":"http://i.imgur.com/F9Rb9SA.png","Source":"SKY","ServiceId":556,"Enabled":0}, -{"Id":74,"Name":"FOX","KT Name":"FOX","KTCh":107,"LG Name":"FOX채널","LGCh":44,"SK Name":"FOX","SKCh":101,"Icon_url":"http://i.imgur.com/8usDWOC.png","Source":"SKY","ServiceId":706,"Enabled":0}, -{"Id":75,"Name":"Fox life","KT Name":"","KTCh":null,"LG Name":"","LGCh":null,"SK Name":"Fox life","SKCh":216,"Icon_url":"http://i.imgur.com/CqVujLk.png","Source":"NAVER","ServiceId":814754,"Enabled":0}, -{"Id":76,"Name":"Fox News","KT Name":"Fox News","KTCh":195,"LG Name":"","LGCh":null,"SK Name":"","SKCh":null,"Icon_url":"http://i.imgur.com/9rGThzD.png","Source":"NAVER","ServiceId":815413,"Enabled":0}, -{"Id":78,"Name":"FTV","KT Name":"FTV","KTCh":118,"LG Name":"FTV","LGCh":64,"SK Name":"FTV","SKCh":243,"Icon_url":"http://i.imgur.com/eI9wGgS.png","Source":"SKY","ServiceId":969,"Enabled":0}, -{"Id":79,"Name":"FUN TV","KT Name":"FUN TV","KTCh":71,"LG Name":"","LGCh":null,"SK Name":"FUN TV","SKCh":91,"Icon_url":"http://i.imgur.com/6V8X43L.png","Source":"KT","ServiceId":71,"Enabled":0}, -{"Id":80,"Name":"FX","KT Name":"","KTCh":null,"LG Name":"","LGCh":null,"SK Name":"FX","SKCh":90,"Icon_url":"http://i.imgur.com/DAnUsTS.png","Source":"SKY","ServiceId":818,"Enabled":0}, -{"Id":82,"Name":"GMTV","KT Name":"GMTV","KTCh":88,"LG Name":"GMTV","LGCh":101,"SK Name":"GMTV","SKCh":232,"Icon_url":"http://i.imgur.com/WPF3G5V.png","Source":"NAVER","ServiceId":814815,"Enabled":0}, -{"Id":83,"Name":"Good TV","KT Name":"Good TV","KTCh":234,"LG Name":"","LGCh":null,"SK Name":"Good TV","SKCh":303,"Icon_url":"http://i.imgur.com/fFN1YJb.png","Source":"NAVER","ServiceId":815108,"Enabled":0}, -{"Id":84,"Name":"GS MY SHOP","KT Name":"GS MY SHOP","KTCh":38,"LG Name":"GS마이샵","LGCh":30,"SK Name":"GS MY SHOP","SKCh":29,"Icon_url":"http://i.imgur.com/0Y0pRW4.png","Source":"SK","ServiceId":343,"Enabled":0}, -{"Id":85,"Name":"GS SHOP","KT Name":"GS SHOP","KTCh":8,"LG Name":"GSSHOP","LGCh":6,"SK Name":"GS SHOP","SKCh":12,"Icon_url":"http://i.imgur.com/tz88mYd.png","Source":"NAVER","ServiceId":815362,"Enabled":0}, -{"Id":86,"Name":"GTV","KT Name":"GTV","KTCh":73,"LG Name":"GTV","LGCh":136,"SK Name":"Gtv","SKCh":217,"Icon_url":"http://i.imgur.com/1qXSXRa.png","Source":"SKY","ServiceId":35,"Enabled":0}, -{"Id":87,"Name":"히어로액션","KT Name":"히어로액션","KTCh":112,"LG Name":"Hero Action","LGCh":110,"SK Name":"히어로액션","SKCh":107,"Icon_url":"http://i.imgur.com/yBChQVh.png","Source":"NAVER","ServiceId":814760,"Enabled":0}, -{"Id":89,"Name":"하이라이트TV","KT Name":"하이라이트TV","KTCh":74,"LG Name":"하이라이트TV","LGCh":91,"SK Name":"Highlight TV","SKCh":42,"Icon_url":"http://i.imgur.com/V9CQ4A6.png","Source":"SKY","ServiceId":379,"Enabled":0}, -{"Id":90,"Name":"History HD","KT Name":"History HD","KTCh":169,"LG Name":"History HD","LGCh":132,"SK Name":"History HD","SKCh":264,"Icon_url":"http://i.imgur.com/SSkop4X.png","Source":"SKY","ServiceId":900,"Enabled":0}, -{"Id":91,"Name":"HQ+","KT Name":"HQ+","KTCh":253,"LG Name":"","LGCh":null,"SK Name":"HQ+","SKCh":47,"Icon_url":"http://i.imgur.com/GTANuZS.png","Source":"NAVER","ServiceId":3566359,"Enabled":0}, -{"Id":92,"Name":"아이넷TV","KT Name":"아이넷TV","KTCh":92,"LG Name":"아이넷TV","LGCh":106,"SK Name":"아이넷 TV","SKCh":233,"Icon_url":"http://i.imgur.com/JYQpemw.png","Source":"SKY","ServiceId":57,"Enabled":0}, -{"Id":93,"Name":"IB SPORTS","KT Name":"IB SPORTS","KTCh":53,"LG Name":"IB SPORTS","LGCh":62,"SK Name":"IB Sports","SKCh":129,"Icon_url":"http://i.imgur.com/wOOQEC1.png","Source":"SKY","ServiceId":515,"Enabled":0}, -{"Id":94,"Name":"i-Concerts","KT Name":"","KTCh":null,"LG Name":"i-Concerts","LGCh":108,"SK Name":"i-Concerts","SKCh":236,"Icon_url":"http://i.imgur.com/oUUZQdi.png","Source":"LG","ServiceId":661,"Enabled":0}, -{"Id":95,"Name":"JEI EnglishTV","KT Name":"JEI EnglishTV","KTCh":154,"LG Name":"JEI EnglishTV","LGCh":160,"SK Name":"JEI 재능 English","SKCh":200,"Icon_url":"http://i.imgur.com/R1oJmLo.png","Source":"SKY","ServiceId":289,"Enabled":0}, -{"Id":96,"Name":"JEI 재능TV","KT Name":"JEI 재능TV","KTCh":142,"LG Name":"JEI재능TV","LGCh":159,"SK Name":"JEI 재능TV","SKCh":192,"Icon_url":"http://i.imgur.com/NoNRdSt.png","Source":"SKY","ServiceId":23,"Enabled":0}, -{"Id":97,"Name":"JTBC","KT Name":"JTBC","KTCh":15,"LG Name":"JTBC","LGCh":15,"SK Name":"JTBC","SKCh":15,"Icon_url":"http://i.imgur.com/YOYosLG.png","Source":"SKY","ServiceId":563,"Enabled":0}, -{"Id":98,"Name":"JTBC Golf","KT Name":"JTBC Golf","KTCh":56,"LG Name":"JTBC Golf","LGCh":54,"SK Name":"JTBC GOLF","SKCh":132,"Icon_url":"http://i.imgur.com/Bnw7O5U.png","Source":"SKY","ServiceId":974,"Enabled":0}, -{"Id":99,"Name":"JTBC2","KT Name":"JTBC2","KTCh":39,"LG Name":"JTBC2","LGCh":94,"SK Name":"jtbc2","SKCh":82,"Icon_url":"http://i.imgur.com/WtXDuFU.png","Source":"SKY","ServiceId":62,"Enabled":0}, -{"Id":100,"Name":"JTBC3","KT Name":"JTBC3","KTCh":62,"LG Name":"JTBC3 FOX","LGCh":50,"SK Name":"JTBC3 FOXSPORTS","SKCh":126,"Icon_url":"http://i.imgur.com/KvGwEc1.png","Source":"SKY","ServiceId":407,"Enabled":0}, -{"Id":101,"Name":"K STAR","KT Name":"K STAR","KTCh":87,"LG Name":"K STAR","LGCh":105,"SK Name":"K star","SKCh":88,"Icon_url":"http://i.imgur.com/MYtePna.png","Source":"SKY","ServiceId":85,"Enabled":0}, -{"Id":103,"Name":"KBS DRAMA","KT Name":"KBS Drama","KTCh":35,"LG Name":"KBS DRAMA","LGCh":31,"SK Name":"KBS 드라마","SKCh":30,"Icon_url":"http://i.imgur.com/CrLMIEQ.png","Source":"SKY","ServiceId":910,"Enabled":0}, -{"Id":104,"Name":"KBS JOY","KT Name":"KBS Joy","KTCh":41,"LG Name":"KBS JOY","LGCh":3,"SK Name":"KBS joy","SKCh":80,"Icon_url":"http://i.imgur.com/D1o9by9.png","Source":"SKY","ServiceId":968,"Enabled":0}, -{"Id":105,"Name":"KBS kids","KT Name":"KBS Kids","KTCh":144,"LG Name":"KBS Kids","LGCh":169,"SK Name":"KBS KIDS","SKCh":190,"Icon_url":"http://i.imgur.com/Jcfjs9E.png","Source":"SKY","ServiceId":596,"Enabled":0}, -{"Id":106,"Name":"KBSN Life","KT Name":"KBSN Life","KTCh":281,"LG Name":"","LGCh":null,"SK Name":"","SKCh":null,"Icon_url":"http://i.imgur.com/5Ni1YIT.png","Source":"SKY","ServiceId":291,"Enabled":0}, -{"Id":107,"Name":"KBS N Sports","KT Name":"KBS N Sports","KTCh":59,"LG Name":"KBSN SPORTS","LGCh":59,"SK Name":"KBSN 스포츠","SKCh":121,"Icon_url":"http://i.imgur.com/xspD7UE.png","Source":"SKY","ServiceId":550,"Enabled":0}, -{"Id":108,"Name":"KBS W","KT Name":"KBS W","KTCh":83,"LG Name":"KBS W","LGCh":77,"SK Name":"KBS W","SKCh":214,"Icon_url":"http://i.imgur.com/sVqBczs.png","Source":"SKY","ServiceId":509,"Enabled":0}, -{"Id":110,"Name":"KBS1","KT Name":"KBS1","KTCh":9,"LG Name":"KBS1","LGCh":9,"SK Name":"KBS1","SKCh":9,"Icon_url":"http://i.imgur.com/e31o5gw.png","Source":"SKY","ServiceId":796,"Enabled":1}, -{"Id":111,"Name":"KBS2","KT Name":"KBS2","KTCh":7,"LG Name":"KBS2","LGCh":7,"SK Name":"KBS2","SKCh":7,"Icon_url":"http://i.imgur.com/XgibZbD.png","Source":"SKY","ServiceId":795,"Enabled":1}, -{"Id":112,"Name":"키즈톡톡","KT Name":"","KTCh":null,"LG Name":"키즈톡톡","LGCh":158,"SK Name":"키즈톡톡 플러스","SKCh":189,"Icon_url":"http://i.imgur.com/0loInJO.png","Source":"LG","ServiceId":805,"Enabled":0}, -{"Id":115,"Name":"KIDS-TV","KT Name":"KIDS-TV","KTCh":149,"LG Name":"","LGCh":null,"SK Name":"","SKCh":null,"Icon_url":"http://i.imgur.com/AVCSEdn.png","Source":"NAVER","ServiceId":814999,"Enabled":0}, -{"Id":116,"Name":"K-NET TV","KT Name":"K-NET TV","KTCh":230,"LG Name":"","LGCh":null,"SK Name":"","SKCh":null,"Icon_url":"http://i.imgur.com/GelnqjB.png","Source":"KT","ServiceId":230,"Enabled":0}, -{"Id":117,"Name":"KTV","KT Name":"KTV","KTCh":64,"LG Name":"KTV","LGCh":171,"SK Name":"KTV","SKCh":290,"Icon_url":"http://i.imgur.com/yUk2RhO.png","Source":"NAVER","ServiceId":815090,"Enabled":0}, -{"Id":118,"Name":"K-바둑","KT Name":"K-바둑","KTCh":121,"LG Name":"K-바둑","LGCh":107,"SK Name":"K-바둑","SKCh":241,"Icon_url":"http://i.imgur.com/EAk5ySy.png","Source":"SKY","ServiceId":170,"Enabled":0}, -{"Id":119,"Name":"K쇼핑","KT Name":"K쇼핑","KTCh":20,"LG Name":"","LGCh":null,"SK Name":"K쇼핑","SKCh":25,"Icon_url":"http://i.imgur.com/6ORm0Rz.png","Source":"SK","ServiceId":333,"Enabled":0}, -{"Id":121,"Name":"Mnet","KT Name":"Mnet","KTCh":27,"LG Name":"M.net","LGCh":22,"SK Name":"M.net","SKCh":27,"Icon_url":"http://i.imgur.com/putHm2b.png","Source":"SKY","ServiceId":273,"Enabled":0}, -{"Id":122,"Name":"MBC","KT Name":"MBC","KTCh":11,"LG Name":"MBC","LGCh":11,"SK Name":"MBC","SKCh":11,"Icon_url":"http://i.imgur.com/duig32i.png","Source":"SKY","ServiceId":797,"Enabled":1}, -{"Id":123,"Name":"MBC Every1","KT Name":"MBC Every1","KTCh":3,"LG Name":"MBC에브리원","LGCh":29,"SK Name":"MBC Every1","SKCh":28,"Icon_url":"http://i.imgur.com/oOnpFes.png","Source":"SKY","ServiceId":58,"Enabled":0}, -{"Id":124,"Name":"MBC MUSIC","KT Name":"MBC MUSIC","KTCh":97,"LG Name":"MBC뮤직","LGCh":99,"SK Name":"MBC Music","SKCh":231,"Icon_url":"http://i.imgur.com/6g56RDx.png","Source":"SKY","ServiceId":126,"Enabled":0}, -{"Id":125,"Name":"MBC NET","KT Name":"MBC NET","KTCh":164,"LG Name":"MBCNET","LGCh":140,"SK Name":"MBC NET","SKCh":274,"Icon_url":"http://i.imgur.com/lxDOgY8.png","Source":"SKY","ServiceId":537,"Enabled":0}, -{"Id":126,"Name":"MBC SPORTS+","KT Name":"MBC SPORT+","KTCh":60,"LG Name":"MBC스포츠플러스","LGCh":60,"SK Name":"MBC Sports+","SKCh":123,"Icon_url":"http://i.imgur.com/Su21uj3.png","Source":"SKY","ServiceId":911,"Enabled":0}, -{"Id":127,"Name":"MBC SPORTS+2","KT Name":"MBC SPORTS+2","KTCh":61,"LG Name":"MBC스포츠플러스2","LGCh":61,"SK Name":"MBC SPORTS+2","SKCh":124,"Icon_url":"http://i.imgur.com/frAuUS3.png","Source":"SKY","ServiceId":96,"Enabled":0}, -{"Id":128,"Name":"MBC Dramanet","KT Name":"MBC Dramanet","KTCh":75,"LG Name":"MBC드라마넷","LGCh":35,"SK Name":"MBC 드라마","SKCh":32,"Icon_url":"http://i.imgur.com/VBMFcZ3.png","Source":"SKY","ServiceId":857,"Enabled":0}, -{"Id":129,"Name":"MBN","KT Name":"MBN","KTCh":16,"LG Name":"MBN","LGCh":16,"SK Name":"MBN","SKCh":16,"Icon_url":"http://i.imgur.com/p0mvIJN.png","Source":"SKY","ServiceId":562,"Enabled":0}, -{"Id":130,"Name":"MBN Plus","KT Name":"MBN Plus","KTCh":99,"LG Name":"MBN플러스","LGCh":116,"SK Name":"MBN 플러스","SKCh":98,"Icon_url":"http://i.imgur.com/yMZiUUp.png","Source":"NAVER","ServiceId":5286722,"Enabled":0}, -{"Id":133,"Name":"마운틴TV","KT Name":"마운틴TV","KTCh":117,"LG Name":"마운틴TV","LGCh":69,"SK Name":"Mountain TV","SKCh":247,"Icon_url":"http://i.imgur.com/4nLYnVC.png","Source":"NAVER","ServiceId":814889,"Enabled":0}, -{"Id":134,"Name":"mplex","KT Name":"mplex","KTCh":103,"LG Name":"Mplex","LGCh":46,"SK Name":"Mplex","SKCh":57,"Icon_url":"http://i.imgur.com/dOOBYJm.png","Source":"NAVER","ServiceId":814712,"Enabled":0}, -{"Id":135,"Name":"머니투데이방송","KT Name":"머니투데이방송","KTCh":181,"LG Name":"MTN","LGCh":122,"SK Name":"MTN","SKCh":152,"Icon_url":"http://i.imgur.com/joWd14j.png","Source":"NAVER","ServiceId":814906,"Enabled":0}, -{"Id":136,"Name":"NatGeo People","KT Name":"NatGeo People","KTCh":171,"LG Name":"","LGCh":null,"SK Name":"Natgeo People","SKCh":263,"Icon_url":"http://i.imgur.com/2ghKPUg.png","Source":"NAVER","ServiceId":814946,"Enabled":0}, -{"Id":137,"Name":"NatGeo Wild","KT Name":"NatGeo Wild","KTCh":170,"LG Name":"NatGeo Wild","LGCh":134,"SK Name":"Natgeo Wild HD","SKCh":266,"Icon_url":"http://i.imgur.com/M4nh0Rk.png","Source":"SKY","ServiceId":63,"Enabled":0}, -{"Id":138,"Name":"NGC","KT Name":"NGC","KTCh":168,"LG Name":"내셔널지오그래픽","LGCh":131,"SK Name":"NGC","SKCh":260,"Icon_url":"http://i.imgur.com/mqTSPMN.png","Source":"SKY","ServiceId":972,"Enabled":0}, -{"Id":139,"Name":"NHK WP","KT Name":"NHK WP","KTCh":199,"LG Name":"NHK World Premium","LGCh":143,"SK Name":"NHK World Premium","SKCh":278,"Icon_url":"http://i.imgur.com/ZSHeMzp.png","Source":"NAVER","ServiceId":815432,"Enabled":0}, -{"Id":141,"Name":"니켈로디언","KT Name":"니켈로디언","KTCh":136,"LG Name":"니켈로디언","LGCh":154,"SK Name":"Nickelodeon","SKCh":176,"Icon_url":"http://i.imgur.com/6pWpFCX.png","Source":"SKY","ServiceId":685,"Enabled":0}, -{"Id":142,"Name":"놀티비","KT Name":"놀티비","KTCh":128,"LG Name":"NOLL TV","LGCh":92,"SK Name":"Noll TV","SKCh":248,"Icon_url":"http://i.imgur.com/IK9h4rw.png","Source":"SKY","ServiceId":923,"Enabled":0}, -{"Id":143,"Name":"NS Shop+","KT Name":"NS Shop+","KTCh":42,"LG Name":"","LGCh":null,"SK Name":"NS Shop+","SKCh":41,"Icon_url":"http://i.imgur.com/ipGXgEK.png","Source":"SK","ServiceId":341,"Enabled":0}, -{"Id":144,"Name":"NS홈쇼핑","KT Name":"NS홈쇼핑","KTCh":12,"LG Name":"NS홈쇼핑","LGCh":13,"SK Name":"NS홈쇼핑","SKCh":14,"Icon_url":"http://i.imgur.com/UD1yoj1.png","Source":"NAVER","ServiceId":815363,"Enabled":0}, -{"Id":147,"Name":"O tvN","KT Name":"O tvn","KTCh":45,"LG Name":"O tvN","LGCh":71,"SK Name":"O tvN","SKCh":34,"Icon_url":"http://i.imgur.com/0SMl3O5.png","Source":"SKY","ServiceId":555,"Enabled":0}, -{"Id":148,"Name":"올리브","KT Name":"올리브","KTCh":34,"LG Name":"O´live","LGCh":82,"SK Name":"올리브","SKCh":84,"Icon_url":"http://i.imgur.com/5kF0Ypt.png","Source":"SKY","ServiceId":272,"Enabled":0}, -{"Id":149,"Name":"OBS","KT Name":"OBS","KTCh":26,"LG Name":"OBS","LGCh":26,"SK Name":"OBS","SKCh":20,"Icon_url":"http://i.imgur.com/DJHN8M6.png","Source":"SKY","ServiceId":935,"Enabled":0}, -{"Id":150,"Name":"HD OBS W","KT Name":"HD OBS W","KTCh":81,"LG Name":"OBS W","LGCh":137,"SK Name":"OBSW","SKCh":219,"Icon_url":"http://i.imgur.com/uZkbU7b.png","Source":"SKY","ServiceId":128,"Enabled":0}, -{"Id":151,"Name":"OCN","KT Name":"OCN","KTCh":21,"LG Name":"OCN","LGCh":38,"SK Name":"OCN","SKCh":54,"Icon_url":"http://i.imgur.com/IXh6dwo.png","Source":"SKY","ServiceId":847,"Enabled":0}, -{"Id":153,"Name":"OGN","KT Name":"OGN","KTCh":123,"LG Name":"OGN","LGCh":96,"SK Name":"OGN","SKCh":136,"Icon_url":"http://i.imgur.com/tLtSTaq.png","Source":"SKY","ServiceId":55,"Enabled":0}, -{"Id":154,"Name":"온스타일","KT Name":"온스타일","KTCh":77,"LG Name":"On Style","LGCh":73,"SK Name":"On style","SKCh":210,"Icon_url":"http://i.imgur.com/9brMDfR.png","Source":"SKY","ServiceId":553,"Enabled":0}, -{"Id":156,"Name":"ONT","KT Name":"","KTCh":null,"LG Name":"","LGCh":null,"SK Name":"ONT","SKCh":245,"Icon_url":"http://i.imgur.com/2lu0ZBu.png","Source":"NAVER","ServiceId":815483,"Enabled":0}, -{"Id":157,"Name":"OUN","KT Name":"OUN","KTCh":160,"LG Name":"OUN","LGCh":170,"SK Name":"OUN","SKCh":292,"Icon_url":"http://i.imgur.com/VimbcIH.png","Source":"SKY","ServiceId":47,"Enabled":0}, -{"Id":158,"Name":"Outdoor","KT Name":"","KTCh":null,"LG Name":"아웃도어 채널","LGCh":135,"SK Name":"","SKCh":null,"Icon_url":"http://i.imgur.com/4M65Rrv.png","Source":"SKY","ServiceId":544,"Enabled":0}, -{"Id":159,"Name":"Playboy TV","KT Name":"Playboy TV","KTCh":206,"LG Name":"플레이보이TV","LGCh":190,"SK Name":"플레이보이TV","SKCh":320,"Icon_url":"http://i.imgur.com/NglRqcV.png","Source":"SKY","ServiceId":558,"Enabled":0}, -{"Id":160,"Name":"리얼TV","KT Name":"리얼TV","KTCh":127,"LG Name":"","LGCh":null,"SK Name":"리얼TV","SKCh":267,"Icon_url":"http://i.imgur.com/PYnXtlb.png","Source":"NAVER","ServiceId":814952,"Enabled":0}, -{"Id":164,"Name":"SBS","KT Name":"SBS","KTCh":5,"LG Name":"SBS","LGCh":5,"SK Name":"SBS","SKCh":5,"Icon_url":"http://i.imgur.com/K2ztoDT.png","Source":"SKY","ServiceId":794,"Enabled":1}, -{"Id":165,"Name":"SBS CNBC","KT Name":"SBS CNBC","KTCh":25,"LG Name":"SBS CNBC","LGCh":27,"SK Name":"SBS CNBC","SKCh":26,"Icon_url":"http://i.imgur.com/SfDs4qN.png","Source":"SKY","ServiceId":622,"Enabled":0}, -{"Id":166,"Name":"SBS funE","KT Name":"SBS funE","KTCh":43,"LG Name":"SBS funE","LGCh":75,"SK Name":"SBS fun E","SKCh":81,"Icon_url":"http://i.imgur.com/D1EYJmr.png","Source":"SKY","ServiceId":858,"Enabled":0}, -{"Id":167,"Name":"SBSGOLF","KT Name":"SBSGOLF","KTCh":57,"LG Name":"SBS GOLF","LGCh":53,"SK Name":"SBS GOLF","SKCh":131,"Icon_url":"http://i.imgur.com/HdS0GNV.png","Source":"SKY","ServiceId":769,"Enabled":0}, -{"Id":168,"Name":"SBS MTV","KT Name":"SBS MTV","KTCh":96,"LG Name":"SBS MTV","LGCh":100,"SK Name":"SBS MTV","SKCh":230,"Icon_url":"http://i.imgur.com/OeSJ9Ik.png","Source":"SKY","ServiceId":130,"Enabled":0}, -{"Id":169,"Name":"SBS Sports","KT Name":"SBS Sports","KTCh":58,"LG Name":"SBS Sports","LGCh":58,"SK Name":"SBS Sports","SKCh":122,"Icon_url":"http://i.imgur.com/j1vHAu6.png","Source":"SKY","ServiceId":977,"Enabled":0}, -{"Id":170,"Name":"SBS Plus","KT Name":"SBS Plus","KTCh":37,"LG Name":"SBS 플러스","LGCh":33,"SK Name":"SBS 플러스","SKCh":2,"Icon_url":"http://i.imgur.com/asfyrTm.png","Source":"SKY","ServiceId":767,"Enabled":0}, -{"Id":171,"Name":"스크린","KT Name":"스크린","KTCh":106,"LG Name":"SCREEN","LGCh":41,"SK Name":"Screen","SKCh":56,"Icon_url":"http://i.imgur.com/lTK9VD4.png","Source":"SKY","ServiceId":916,"Enabled":0}, -{"Id":172,"Name":"SkyA&C","KT Name":"SkyA&C","KTCh":80,"LG Name":"","LGCh":null,"SK Name":"","SKCh":null,"Icon_url":"http://i.imgur.com/cljag6U.png","Source":"SKY","ServiceId":514,"Enabled":0}, -{"Id":173,"Name":"SkyDrama","KT Name":"SkyDrama","KTCh":31,"LG Name":"스카이드라마","LGCh":79,"SK Name":"sky Drama","SKCh":40,"Icon_url":"http://i.imgur.com/e9BTUAb.png","Source":"SKY","ServiceId":783,"Enabled":0}, -{"Id":174,"Name":"SkyENT","KT Name":"SkyENT","KTCh":50,"LG Name":"","LGCh":null,"SK Name":"","SKCh":null,"Icon_url":"http://i.imgur.com/ALqDHH6.png","Source":"SKY","ServiceId":970,"Enabled":0}, -{"Id":175,"Name":"Sky힐링","KT Name":"Sky힐링","KTCh":167,"LG Name":"","LGCh":null,"SK Name":"","SKCh":null,"Icon_url":"http://i.imgur.com/64SK0o9.png","Source":"SKY","ServiceId":40,"Enabled":0}, -{"Id":176,"Name":"SkyICT","KT Name":"SkyICT","KTCh":165,"LG Name":"","LGCh":null,"SK Name":"","SKCh":null,"Icon_url":"http://i.imgur.com/luZjU1e.png","Source":"SKY","ServiceId":568,"Enabled":0}, -{"Id":177,"Name":"SkyPetPark","KT Name":"SkyPetPark","KTCh":49,"LG Name":"","LGCh":null,"SK Name":"Sky Petpark","SKCh":94,"Icon_url":"http://i.imgur.com/RDUfvRG.png","Source":"SKY","ServiceId":513,"Enabled":0}, -{"Id":178,"Name":"SkySports","KT Name":"SkySports","KTCh":54,"LG Name":"스카이스포츠","LGCh":57,"SK Name":"sky Sports","SKCh":125,"Icon_url":"http://i.imgur.com/QHV9bdA.png","Source":"SKY","ServiceId":447,"Enabled":0}, -{"Id":179,"Name":"SkyTravel","KT Name":"SkyTravel","KTCh":100,"LG Name":"스카이트래블","LGCh":66,"SK Name":"sky Travel","SKCh":246,"Icon_url":"http://i.imgur.com/fAJgmna.png","Source":"SKY","ServiceId":934,"Enabled":0}, -{"Id":181,"Name":"Sky UHD","KT Name":"Sky UHD","KTCh":174,"LG Name":"","LGCh":null,"SK Name":"","SKCh":null,"Icon_url":"http://i.imgur.com/BNxE2zT.png","Source":"SKY","ServiceId":500,"Enabled":0}, -{"Id":182,"Name":"Smile TV","KT Name":"Smile TV","KTCh":84,"LG Name":"","LGCh":null,"SK Name":"","SKCh":null,"Icon_url":"http://i.imgur.com/alk8plD.png","Source":"NAVER","ServiceId":814939,"Enabled":0}, -{"Id":183,"Name":"SPOTV","KT Name":"SPOTV","KTCh":51,"LG Name":"SPOTV","LGCh":56,"SK Name":"SPOTV","SKCh":120,"Icon_url":"http://i.imgur.com/cIpIf6b.png","Source":"SKY","ServiceId":109,"Enabled":0}, -{"Id":184,"Name":"SPOTV Games","KT Name":"SPOTV Games","KTCh":124,"LG Name":"SPOTV GAMES","LGCh":109,"SK Name":"SPOTV GAMES","SKCh":137,"Icon_url":"http://i.imgur.com/5IMfa6N.png","Source":"NAVER","ServiceId":1876333,"Enabled":0}, -{"Id":185,"Name":"SPOTV+","KT Name":"SPOTV+","KTCh":125,"LG Name":"SPOTV PLUS","LGCh":51,"SK Name":"SPOTV+","SKCh":127,"Icon_url":"http://i.imgur.com/81Fshnn.png","Source":"SKY","ServiceId":713,"Enabled":0}, -{"Id":186,"Name":"SPOTV2","KT Name":"SPOTV2","KTCh":52,"LG Name":"SPOTV2","LGCh":52,"SK Name":"SPOTV2","SKCh":128,"Icon_url":"http://i.imgur.com/GNicmGY.png","Source":"NAVER","ServiceId":5286701,"Enabled":0}, -{"Id":191,"Name":"Star Chinese Channel","KT Name":"Star Chinese Channel","KTCh":178,"LG Name":"","LGCh":null,"SK Name":"","SKCh":null,"Icon_url":"http://i.imgur.com/Af0Atf2.png","Source":"KT","ServiceId":178,"Enabled":0}, -{"Id":192,"Name":"Star Sports","KT Name":"Star Sports","KTCh":63,"LG Name":"","LGCh":null,"SK Name":"Star Sports","SKCh":135,"Icon_url":"http://i.imgur.com/8ndGr4n.png","Source":"SKY","ServiceId":122,"Enabled":0}, -{"Id":193,"Name":"STB상생방송","KT Name":"STB상생방송","KTCh":261,"LG Name":"상생방송","LGCh":187,"SK Name":"STB 상생방송","SKCh":308,"Icon_url":"http://i.imgur.com/Z3Xknso.png","Source":"LG","ServiceId":779,"Enabled":0}, -{"Id":194,"Name":"STN","KT Name":"STN","KTCh":267,"LG Name":"","LGCh":null,"SK Name":"","SKCh":null,"Icon_url":"http://i.imgur.com/ZJi3NQy.png","Source":"KT","ServiceId":267,"Enabled":0}, -{"Id":195,"Name":"선댄스 채널","KT Name":"선댄스 채널","KTCh":105,"LG Name":"Sundance Channel","LGCh":43,"SK Name":"Sundance CH","SKCh":60,"Icon_url":"http://i.imgur.com/Kf9hZQN.png","Source":"LG","ServiceId":659,"Enabled":0}, -{"Id":196,"Name":"슈퍼액션","KT Name":"슈퍼액션","KTCh":32,"LG Name":"Super Action","LGCh":40,"SK Name":"SUPER ACTION","SKCh":55,"Icon_url":"http://i.imgur.com/D9PzDBr.png","Source":"SKY","ServiceId":129,"Enabled":0}, -{"Id":197,"Name":"tag TV","KT Name":"tag TV","KTCh":94,"LG Name":"","LGCh":null,"SK Name":"","SKCh":null,"Icon_url":"http://i.imgur.com/Mmc89FS.png","Source":"KT","ServiceId":94,"Enabled":0}, -{"Id":198,"Name":"tbsTV","KT Name":"tbsTV","KTCh":214,"LG Name":"tbsTV","LGCh":176,"SK Name":"tbsTV","SKCh":272,"Icon_url":"http://i.imgur.com/o3MWHfb.png","Source":"NAVER","ServiceId":815503,"Enabled":0}, -{"Id":199,"Name":"텔레노벨라","KT Name":"텔레노벨라","KTCh":114,"LG Name":"텔레노벨라","LGCh":81,"SK Name":"텔레노벨라","SKCh":109,"Icon_url":"http://i.imgur.com/Ea3Vu8Z.png","Source":"SKY","ServiceId":61,"Enabled":0}, -{"Id":200,"Name":"The Golf Channel","KT Name":"The Golf Channel","KTCh":55,"LG Name":"더 골프채널 코리아","LGCh":55,"SK Name":"Golf Channel Korea","SKCh":133,"Icon_url":"http://i.imgur.com/3VlCrJ7.png","Source":"SK","ServiceId":135,"Enabled":0}, -{"Id":201,"Name":"THE MOVIE","KT Name":"THE MOVIE","KTCh":104,"LG Name":"THE MOVIE","LGCh":47,"SK Name":"The Movie","SKCh":59,"Icon_url":"http://i.imgur.com/6vzmEfd.png","Source":"NAVER","ServiceId":3913619,"Enabled":0}, -{"Id":202,"Name":"Tooniverse","KT Name":"Tooniverse","KTCh":132,"LG Name":"투니버스","LGCh":152,"SK Name":"Tooniverse","SKCh":170,"Icon_url":"http://i.imgur.com/VUqSOjx.png","Source":"SKY","ServiceId":526,"Enabled":0}, -{"Id":203,"Name":"TRENDY","KT Name":"TRENDY","KTCh":251,"LG Name":"","LGCh":null,"SK Name":"","SKCh":null,"Icon_url":"http://i.imgur.com/NP2KTGN.png","Source":"NAVER","ServiceId":815040,"Enabled":0}, -{"Id":205,"Name":"TV5MONDE","KT Name":"TV5MONDE","KTCh":198,"LG Name":"","LGCh":null,"SK Name":"TV5Monde","SKCh":279,"Icon_url":"http://i.imgur.com/NogUKpP.png","Source":"NAVER","ServiceId":815171,"Enabled":0}, -{"Id":207,"Name":"tvN","KT Name":"tvN","KTCh":17,"LG Name":"tvN","LGCh":17,"SK Name":"tvN","SKCh":17,"Icon_url":"http://i.imgur.com/OJ9A8fZ.png","Source":"SKY","ServiceId":60,"Enabled":0}, -{"Id":208,"Name":"TV조선","KT Name":"TV조선","KTCh":19,"LG Name":"TV조선","LGCh":19,"SK Name":"TV조선","SKCh":19,"Icon_url":"http://i.imgur.com/ShJ5joR.png","Source":"SKY","ServiceId":549,"Enabled":0}, -{"Id":212,"Name":"viki","KT Name":"viki","KTCh":204,"LG Name":"VIKI","LGCh":192,"SK Name":"Viki","SKCh":322,"Icon_url":"http://i.imgur.com/ZVD51K9.png","Source":"SKY","ServiceId":86,"Enabled":0}, -{"Id":213,"Name":"W 쇼핑","KT Name":"W 쇼핑","KTCh":40,"LG Name":"","LGCh":null,"SK Name":"W쇼핑","SKCh":37,"Icon_url":"http://i.imgur.com/Cged9ve.png","Source":"SK","ServiceId":342,"Enabled":0}, -{"Id":215,"Name":"WBS원음방송","KT Name":"원음방송","KTCh":284,"LG Name":"WBS원음방송","LGCh":188,"SK Name":"원음방송","SKCh":309,"Icon_url":"http://i.imgur.com/mKWQE7z.png","Source":"SKY","ServiceId":644,"Enabled":0}, -{"Id":216,"Name":"XTM","KT Name":"XTM","KTCh":76,"LG Name":"XTM","LGCh":72,"SK Name":"XTM","SKCh":85,"Icon_url":"http://i.imgur.com/hGwA39y.png","Source":"SKY","ServiceId":282,"Enabled":0}, -{"Id":218,"Name":"YTN","KT Name":"YTN","KTCh":24,"LG Name":"YTN","LGCh":24,"SK Name":"YTN","SKCh":24,"Icon_url":"http://i.imgur.com/ByeeX5e.png","Source":"SKY","ServiceId":551,"Enabled":0}, -{"Id":219,"Name":"YTN 사이언스","KT Name":"YTN 사이언스","KTCh":175,"LG Name":"사이언스TV","LGCh":25,"SK Name":"YTN 사이언스","SKCh":262,"Icon_url":"http://i.imgur.com/gwDHYGf.png","Source":"SKY","ServiceId":792,"Enabled":0}, -{"Id":220,"Name":"YTN life","KT Name":"YTN life","KTCh":190,"LG Name":"YTN life","LGCh":125,"SK Name":"YTN 라이프","SKCh":157,"Icon_url":"http://i.imgur.com/f66yRT9.png","Source":"SKY","ServiceId":502,"Enabled":0}, -{"Id":221,"Name":"가요TV","KT Name":"가요TV","KTCh":93,"LG Name":"가요TV","LGCh":102,"SK Name":"","SKCh":null,"Icon_url":"http://i.imgur.com/6ncOOSg.png","Source":"NAVER","ServiceId":814829,"Enabled":0}, -{"Id":222,"Name":"국방TV","KT Name":"국방TV","KTCh":260,"LG Name":"국방TV","LGCh":174,"SK Name":"국방TV","SKCh":282,"Icon_url":"http://i.imgur.com/yyXkYzJ.png","Source":"SKY","ServiceId":698,"Enabled":0}, -{"Id":223,"Name":"국회방송","KT Name":"국회방송","KTCh":65,"LG Name":"국회방송","LGCh":172,"SK Name":"국회방송","SKCh":291,"Icon_url":"http://i.imgur.com/l1OEn7O.png","Source":"LG","ServiceId":717,"Enabled":0}, -{"Id":225,"Name":"내외경제TV","KT Name":"내외경제TV","KTCh":285,"LG Name":"","LGCh":null,"SK Name":"내외경제TV","SKCh":164,"Icon_url":"http://i.imgur.com/cQHPmCw.png","Source":"KT","ServiceId":285,"Enabled":0}, -{"Id":226,"Name":"다문화티브이","KT Name":"다문화티브이","KTCh":283,"LG Name":"","LGCh":null,"SK Name":"","SKCh":null,"Icon_url":"http://i.imgur.com/nZK3lCC.png","Source":"KT","ServiceId":283,"Enabled":0}, -{"Id":228,"Name":"대교 어린이TV","KT Name":"대교 어린이TV","KTCh":141,"LG Name":"어린이TV","LGCh":156,"SK Name":"어린이TV","SKCh":191,"Icon_url":"http://i.imgur.com/CETWIE6.png","Source":"SKY","ServiceId":17,"Enabled":0}, -{"Id":229,"Name":"동아TV","KT Name":"동아TV","KTCh":82,"LG Name":"동아TV","LGCh":84,"SK Name":"동아TV","SKCh":218,"Icon_url":"http://i.imgur.com/AlmV8jS.png","Source":"SKY","ServiceId":247,"Enabled":0}, -{"Id":230,"Name":"드라마H","KT Name":"드라마H","KTCh":70,"LG Name":"","LGCh":null,"SK Name":"드라마H","SKCh":46,"Icon_url":"http://i.imgur.com/xT7pVuI.png","Source":"SKY","ServiceId":287,"Enabled":0}, -{"Id":231,"Name":"드라마큐브","KT Name":"드라마큐브","KTCh":46,"LG Name":"","LGCh":null,"SK Name":"드라마큐브","SKCh":36,"Icon_url":"http://i.imgur.com/4ESaIH6.png","Source":"NAVER","ServiceId":815502,"Enabled":0}, -{"Id":232,"Name":"드라맥스","KT Name":"드라맥스","KTCh":47,"LG Name":"","LGCh":null,"SK Name":"드라맥스","SKCh":38,"Icon_url":"http://i.imgur.com/jcguamX.png","Source":"NAVER","ServiceId":814782,"Enabled":0}, -{"Id":233,"Name":"디원","KT Name":"디원","KTCh":115,"LG Name":"D1","LGCh":90,"SK Name":"디원","SKCh":45,"Icon_url":"http://i.imgur.com/8nE7mmk.png","Source":"SKY","ServiceId":693,"Enabled":0}, -{"Id":234,"Name":"디즈니주니어","KT Name":"디즈니주니어","KTCh":151,"LG Name":"디즈니 주니어","LGCh":151,"SK Name":"디즈니주니어","SKCh":172,"Icon_url":"http://i.imgur.com/EGiEKhj.png","Source":"SKY","ServiceId":504,"Enabled":0}, -{"Id":235,"Name":"Disney Channel","KT Name":"Disney Channel","KTCh":130,"LG Name":"디즈니 채널","LGCh":150,"SK Name":"디즈니채널","SKCh":171,"Icon_url":"http://i.imgur.com/qZdqeZo.png","Source":"SKY","ServiceId":503,"Enabled":0}, -{"Id":237,"Name":"롯데원티비","KT Name":"롯데원티비","KTCh":44,"LG Name":"롯데 OneTV","LGCh":21,"SK Name":"","SKCh":null,"Icon_url":"http://i.imgur.com/vri0qlq.png","Source":"SKY","ServiceId":548,"Enabled":0}, -{"Id":238,"Name":"롯데홈쇼핑","KT Name":"롯데홈쇼핑","KTCh":6,"LG Name":"롯데홈쇼핑","LGCh":12,"SK Name":"롯데홈쇼핑","SKCh":10,"Icon_url":"http://i.imgur.com/2bCfj0y.png","Source":"NAVER","ServiceId":815365,"Enabled":0}, -{"Id":239,"Name":"리빙TV","KT Name":"리빙TV","KTCh":276,"LG Name":"","LGCh":null,"SK Name":"리빙TV","SKCh":251,"Icon_url":"http://i.imgur.com/0jGCpfx.png","Source":"SKY","ServiceId":28,"Enabled":0}, -{"Id":240,"Name":"마이펫TV","KT Name":"","KTCh":null,"LG Name":"","LGCh":null,"SK Name":"마이펫TV","SKCh":92,"Icon_url":"http://i.imgur.com/Oy7qjnW.png","Source":"SK","ServiceId":258,"Enabled":0}, -{"Id":241,"Name":"매일경제TV","KT Name":"매일경제TV","KTCh":182,"LG Name":"매일경제TV","LGCh":112,"SK Name":"매일경제TV","SKCh":153,"Icon_url":"http://i.imgur.com/a4PwnPm.png","Source":"SKY","ServiceId":594,"Enabled":0}, -{"Id":244,"Name":"미드나잇","KT Name":"미드나잇","KTCh":205,"LG Name":"미드나잇","LGCh":191,"SK Name":"미드나잇","SKCh":321,"Icon_url":"http://i.imgur.com/zLJHU3J.png","Source":"KT","ServiceId":205,"Enabled":0}, -{"Id":245,"Name":"바둑TV","KT Name":"바둑TV","KTCh":120,"LG Name":"바둑TV","LGCh":97,"SK Name":"바둑TV","SKCh":240,"Icon_url":"http://i.imgur.com/jbRu8T2.png","Source":"SKY","ServiceId":164,"Enabled":0}, -{"Id":246,"Name":"법률방송","KT Name":"법률방송","KTCh":213,"LG Name":"","LGCh":null,"SK Name":"법률방송","SKCh":280,"Icon_url":"http://i.imgur.com/WJaHOAP.png","Source":"NAVER","ServiceId":815085,"Enabled":0}, -{"Id":247,"Name":"복지TV","KT Name":"복지TV","KTCh":219,"LG Name":"복지TV","LGCh":173,"SK Name":"복지TV","SKCh":293,"Icon_url":"http://i.imgur.com/cTV0rnb.png","Source":"NAVER","ServiceId":815349,"Enabled":0}, -{"Id":248,"Name":"부동산TV","KT Name":"","KTCh":null,"LG Name":"부동산TV","LGCh":114,"SK Name":"","SKCh":null,"Icon_url":"http://i.imgur.com/O9e2qns.png","Source":"NAVER","ServiceId":814908,"Enabled":0}, -{"Id":249,"Name":"부동산토마토","KT Name":"부동산토마토","KTCh":188,"LG Name":"","LGCh":null,"SK Name":"","SKCh":null,"Icon_url":"http://i.imgur.com/ePLp200.png","Source":"KT","ServiceId":188,"Enabled":0}, -{"Id":250,"Name":"부메랑","KT Name":"부메랑","KTCh":139,"LG Name":"부메랑","LGCh":166,"SK Name":"부메랑","SKCh":175,"Icon_url":"http://i.imgur.com/GSPRJqf.png","Source":"NAVER","ServiceId":815072,"Enabled":0}, -{"Id":251,"Name":"브레인TV","KT Name":"브레인TV","KTCh":122,"LG Name":"브레인TV","LGCh":98,"SK Name":"브레인TV","SKCh":242,"Icon_url":"http://i.imgur.com/1422kP1.png","Source":"SKY","ServiceId":488,"Enabled":0}, -{"Id":253,"Name":"사회안전방송","KT Name":"사회안전방송","KTCh":278,"LG Name":"","LGCh":null,"SK Name":"","SKCh":null,"Icon_url":"http://i.imgur.com/EEfrqCW.png","Source":"NAVER","ServiceId":815484,"Enabled":0}, -{"Id":254,"Name":"생활체육TV","KT Name":"생활체육TV","KTCh":282,"LG Name":"","LGCh":null,"SK Name":"","SKCh":null,"Icon_url":"http://i.imgur.com/gefY5Bw.png","Source":"NAVER","ServiceId":814883,"Enabled":0}, -{"Id":255,"Name":"서울경제TV","KT Name":"서울경제TV","KTCh":184,"LG Name":"서울경제TV","LGCh":124,"SK Name":"서울경제TV","SKCh":156,"Icon_url":"http://i.imgur.com/LBzj77k.png","Source":"SKY","ServiceId":157,"Enabled":0}, -{"Id":256,"Name":"소비자TV","KT Name":"소비자TV","KTCh":265,"LG Name":"소비자TV","LGCh":177,"SK Name":"소비자TV","SKCh":275,"Icon_url":"http://i.imgur.com/971hUD2.png","Source":"NAVER","ServiceId":815094,"Enabled":0}, -{"Id":257,"Name":"소상공인방송","KT Name":"소상공인방송","KTCh":255,"LG Name":"소상공인방송","LGCh":175,"SK Name":"소상공인방송","SKCh":271,"Icon_url":"http://i.imgur.com/3k1D4LA.png","Source":"NAVER","ServiceId":815559,"Enabled":0}, -{"Id":258,"Name":"쇼핑엔T","KT Name":"쇼핑엔티","KTCh":33,"LG Name":"","LGCh":null,"SK Name":"쇼핑 앤 T","SKCh":35,"Icon_url":"http://i.imgur.com/Q7FHxYB.png","Source":"SK","ServiceId":336,"Enabled":0}, -{"Id":260,"Name":"신세계쇼핑","KT Name":"신세계쇼핑","KTCh":2,"LG Name":"","LGCh":null,"SK Name":"신세계쇼핑","SKCh":22,"Icon_url":"http://i.imgur.com/ZhYaqpt.png","Source":"SK","ServiceId":339,"Enabled":0}, -{"Id":262,"Name":"실버아이TV","KT Name":"실버아이TV","KTCh":266,"LG Name":"","LGCh":null,"SK Name":"","SKCh":null,"Icon_url":"http://i.imgur.com/xm1O8eQ.png","Source":"SKY","ServiceId":378,"Enabled":0}, -{"Id":263,"Name":"아리랑 TV","KT Name":"아리랑 TV","KTCh":200,"LG Name":"아리랑TV","LGCh":141,"SK Name":"아리랑TV","SKCh":270,"Icon_url":"http://i.imgur.com/nFWWIFP.png","Source":"SKY","ServiceId":50,"Enabled":0}, -{"Id":264,"Name":"아시아경제TV","KT Name":"아시아경제TV","KTCh":186,"LG Name":"아시아경제TV","LGCh":113,"SK Name":"아시아경제TV","SKCh":154,"Icon_url":"http://i.imgur.com/2D6WoS8.png","Source":"SKY","ServiceId":482,"Enabled":0}, -{"Id":265,"Name":"아임쇼핑","KT Name":"아임쇼핑","KTCh":22,"LG Name":"아임쇼핑","LGCh":20,"SK Name":"아임쇼핑","SKCh":3,"Icon_url":"http://i.imgur.com/E3pJ5Jz.png","Source":"SK","ServiceId":332,"Enabled":0}, -{"Id":266,"Name":"애니플러스","KT Name":"애니플러스","KTCh":138,"LG Name":"애니플러스","LGCh":149,"SK Name":"애니플러스","SKCh":178,"Icon_url":"http://i.imgur.com/7RKoOZq.png","Source":"SKY","ServiceId":348,"Enabled":0}, -{"Id":268,"Name":"연합뉴스TV","KT Name":"연합뉴스TV","KTCh":23,"LG Name":"연합뉴스TV","LGCh":23,"SK Name":"연합뉴스TV","SKCh":23,"Icon_url":"http://i.imgur.com/KlTCP8V.png","Source":"SKY","ServiceId":566,"Enabled":0}, -{"Id":271,"Name":"육아방송","KT Name":"육아방송","KTCh":217,"LG Name":"","LGCh":null,"SK Name":"","SKCh":null,"Icon_url":"http://i.imgur.com/UEIB4ZG.png","Source":"NAVER","ServiceId":815043,"Enabled":0}, -{"Id":272,"Name":"이데일리TV","KT Name":"이데일리TV","KTCh":183,"LG Name":"이데일리TV","LGCh":123,"SK Name":"이데일리TV","SKCh":155,"Icon_url":"http://i.imgur.com/W90Hw2p.png","Source":"SKY","ServiceId":380,"Enabled":0}, -{"Id":273,"Name":"이벤트TV","KT Name":"이벤트TV","KTCh":263,"LG Name":"이벤트TV","LGCh":103,"SK Name":"이벤트TV","SKCh":238,"Icon_url":"http://i.imgur.com/1Eeyijd.png","Source":"NAVER","ServiceId":814831,"Enabled":0}, -{"Id":275,"Name":"인디필름","KT Name":"인디필름","KTCh":277,"LG Name":"","LGCh":null,"SK Name":"인디필름","SKCh":61,"Icon_url":"http://i.imgur.com/iA5UIJ9.png","Source":"NAVER","ServiceId":814731,"Enabled":0}, -{"Id":277,"Name":"정철영어 TV","KT Name":"정철영어 TV","KTCh":155,"LG Name":"정철영어TV","LGCh":161,"SK Name":"정철영어TV","SKCh":201,"Icon_url":"http://i.imgur.com/lumUZz3.png","Source":"SKY","ServiceId":664,"Enabled":0}, -{"Id":278,"Name":"중화TV","KT Name":"중화TV","KTCh":110,"LG Name":"중화TV","LGCh":87,"SK Name":"중화TV","SKCh":104,"Icon_url":"http://i.imgur.com/Nal18s5.png","Source":"NAVER","ServiceId":814788,"Enabled":0}, -{"Id":279,"Name":"JJC지방자치TV","KT Name":"JJC지방자치TV","KTCh":279,"LG Name":"","LGCh":null,"SK Name":"","SKCh":null,"Icon_url":"http://i.imgur.com/AuXr9jA.png","Source":"NAVER","ServiceId":3244879,"Enabled":0}, -{"Id":280,"Name":"채널 Ching","KT Name":"","KTCh":null,"LG Name":"","LGCh":null,"SK Name":"채널 Ching","SKCh":105,"Icon_url":"http://i.imgur.com/tRqGKcS.png","Source":"NAVER","ServiceId":814751,"Enabled":0}, -{"Id":281,"Name":"채널A","KT Name":"채널A","KTCh":18,"LG Name":"채널A","LGCh":18,"SK Name":"채널A","SKCh":18,"Icon_url":"http://i.imgur.com/xti35f5.png","Source":"SKY","ServiceId":564,"Enabled":0}, -{"Id":282,"Name":"채널A 플러스","KT Name":"채널A 플러스","KTCh":98,"LG Name":"채널A플러스","LGCh":115,"SK Name":"채널A 플러스","SKCh":97,"Icon_url":"http://i.imgur.com/rRisTh8.png","Source":"NAVER","ServiceId":5286712,"Enabled":0}, -{"Id":283,"Name":"채널CGV","KT Name":"채널CGV","KTCh":29,"LG Name":"CH CGV","LGCh":39,"SK Name":"Ch CGV","SKCh":53,"Icon_url":"http://i.imgur.com/fwjRwkx.png","Source":"SKY","ServiceId":163,"Enabled":0}, -{"Id":284,"Name":"채널i","KT Name":"채널i","KTCh":250,"LG Name":"","LGCh":null,"SK Name":"채널i","SKCh":281,"Icon_url":"http://i.imgur.com/X7lXvtw.png","Source":"NAVER","ServiceId":3173174,"Enabled":0}, -{"Id":285,"Name":"채널뷰","KT Name":"채널뷰","KTCh":176,"LG Name":"","LGCh":null,"SK Name":"채널View","SKCh":212,"Icon_url":"http://i.imgur.com/lvtWgFL.png","Source":"SKY","ServiceId":918,"Enabled":0}, -{"Id":286,"Name":"채널차이나","KT Name":"채널차이나","KTCh":102,"LG Name":"채널차이나","LGCh":80,"SK Name":"채널차이나","SKCh":108,"Icon_url":"http://i.imgur.com/jEyoLS1.png","Source":"SKY","ServiceId":906,"Enabled":0}, -{"Id":287,"Name":"채널해피독","KT Name":"채널해피독","KTCh":203,"LG Name":"","LGCh":null,"SK Name":"","SKCh":null,"Icon_url":"http://i.imgur.com/ly649tS.png","Source":"NAVER","ServiceId":2296260,"Enabled":0}, -{"Id":289,"Name":"카툰네트워크","KT Name":"카툰네트워크","KTCh":137,"LG Name":"카툰네트워크","LGCh":155,"SK Name":"카툰네트워크","SKCh":177,"Icon_url":"http://i.imgur.com/cJZHPjr.png","Source":"SKY","ServiceId":358,"Enabled":0}, -{"Id":290,"Name":"캐치온1","KT Name":"캐치온1","KTCh":66,"LG Name":"캐치온1","LGCh":48,"SK Name":"CATCH ON 1","SKCh":51,"Icon_url":"http://i.imgur.com/qK9KkRd.png","Source":"SKY","ServiceId":799,"Enabled":0}, -{"Id":291,"Name":"캐치온2","KT Name":"캐치온2","KTCh":67,"LG Name":"캐치온2","LGCh":49,"SK Name":"CATCH ON 2","SKCh":52,"Icon_url":"http://i.imgur.com/sLc2req.png","Source":"SKY","ServiceId":429,"Enabled":0}, -{"Id":292,"Name":"브릿지TV","KT Name":"브릿지TV","KTCh":270,"LG Name":"","LGCh":null,"SK Name":"","SKCh":null,"Icon_url":"http://i.imgur.com/KATTup7.png","Source":"KT","ServiceId":270,"Enabled":0}, -{"Id":293,"Name":"코미디TV","KT Name":"코미디TV","KTCh":85,"LG Name":"","LGCh":null,"SK Name":"코미디TV","SKCh":87,"Icon_url":"http://i.imgur.com/DHbUoDm.png","Source":"SKY","ServiceId":100,"Enabled":0}, -{"Id":294,"Name":"쿠키건강TV","KT Name":"쿠키건강TV","KTCh":220,"LG Name":"쿠키건강TV","LGCh":144,"SK Name":"쿠키건강TV","SKCh":269,"Icon_url":"http://i.imgur.com/4gl92D1.png","Source":"SKY","ServiceId":735,"Enabled":0}, -{"Id":296,"Name":"키즈원","KT Name":"키즈원","KTCh":148,"LG Name":"키즈원","LGCh":157,"SK Name":"KIDS1","SKCh":193,"Icon_url":"http://i.imgur.com/f8T1Sw4.png","Source":"NAVER","ServiceId":815020,"Enabled":0}, -{"Id":297,"Name":"토마토TV","KT Name":"토마토TV","KTCh":185,"LG Name":"토마토TV","LGCh":111,"SK Name":"토마토TV","SKCh":150,"Icon_url":"http://i.imgur.com/dVWy3Ex.png","Source":"SKY","ServiceId":359,"Enabled":0}, -{"Id":299,"Name":"펜트하우스tv","KT Name":"펜트하우스tv","KTCh":208,"LG Name":"","LGCh":null,"SK Name":"펜트하우스TV","SKCh":324,"Icon_url":"http://i.imgur.com/03U2Ges.png","Source":"KT","ServiceId":208,"Enabled":0}, -{"Id":301,"Name":"가톨릭평화방송","KT Name":"가톨릭평화방송","KTCh":231,"LG Name":"가톨릭평화방송","LGCh":184,"SK Name":"가톨릭평화방송","SKCh":307,"Icon_url":"http://i.imgur.com/G5fTCL3.png","Source":"SKY","ServiceId":33,"Enabled":0}, -{"Id":302,"Name":"폴라리스TV","KT Name":"폴라리스TV","KTCh":129,"LG Name":"폴라리스 TV","LGCh":67,"SK Name":"폴라리스TV","SKCh":249,"Icon_url":"http://i.imgur.com/aghufJ7.png","Source":"NAVER","ServiceId":814902,"Enabled":0}, -{"Id":303,"Name":"한국경제TV","KT Name":"한국경제TV","KTCh":180,"LG Name":"한국경제TV","LGCh":121,"SK Name":"한국경제TV","SKCh":151,"Icon_url":"http://i.imgur.com/ChnD0FT.png","Source":"SKY","ServiceId":171,"Enabled":0}, -{"Id":305,"Name":"한국승마방송","KT Name":"한국승마방송","KTCh":259,"LG Name":"","LGCh":null,"SK Name":"","SKCh":null,"Icon_url":"http://i.imgur.com/VZdQLwj.png","Source":"NAVER","ServiceId":814904,"Enabled":0}, -{"Id":307,"Name":"한국직업방송","KT Name":"한국직업방송","KTCh":252,"LG Name":"","LGCh":null,"SK Name":"한국직업방송","SKCh":273,"Icon_url":"http://i.imgur.com/WUvf0If.png","Source":"SKY","ServiceId":79,"Enabled":0}, -{"Id":309,"Name":"허니TV","KT Name":"허니TV","KTCh":207,"LG Name":"허니TV","LGCh":193,"SK Name":"허니TV","SKCh":323,"Icon_url":"http://i.imgur.com/KczRCLW.png","Source":"KT","ServiceId":207,"Enabled":0}, -{"Id":310,"Name":"헝그리앱TV","KT Name":"헝그리앱TV","KTCh":269,"LG Name":"","LGCh":null,"SK Name":"헝그리앱TV","SKCh":138,"Icon_url":"http://i.imgur.com/5Q7JZeM.png","Source":"NAVER","ServiceId":5321817,"Enabled":0}, -{"Id":311,"Name":"헬스메디tv","KT Name":"헬스메디tv","KTCh":271,"LG Name":"헬스메디TV","LGCh":138,"SK Name":"헬스메디TV","SKCh":268,"Icon_url":"http://i.imgur.com/vsxRuFh.png","Source":"NAVER","ServiceId":815500,"Enabled":0}, -{"Id":312,"Name":"현대홈쇼핑","KT Name":"현대홈쇼핑","KTCh":10,"LG Name":"현대홈쇼핑","LGCh":10,"SK Name":"현대홈쇼핑","SKCh":8,"Icon_url":"http://i.imgur.com/87fdrA5.png","Source":"NAVER","ServiceId":815366,"Enabled":0}, -{"Id":313,"Name":"현대홈쇼핑+샵","KT Name":"현대홈쇼핑+샵","KTCh":36,"LG Name":"현대홈쇼핑 플러스샵","LGCh":34,"SK Name":"현대홈쇼핑+Shop","SKCh":31,"Icon_url":"http://i.imgur.com/COo8Bcm.png","Source":"SK","ServiceId":337,"Enabled":0}, -{"Id":314,"Name":"홈&쇼핑","KT Name":"홈&쇼핑","KTCh":14,"LG Name":"홈&쇼핑","LGCh":4,"SK Name":"홈&쇼핑","SKCh":4,"Icon_url":"http://i.imgur.com/nLxw0LW.png","Source":"NAVER","ServiceId":815524,"Enabled":0}, -{"Id":315,"Name":"환경TV","KT Name":"환경TV","KTCh":166,"LG Name":"","LGCh":null,"SK Name":"환경TV","SKCh":276,"Icon_url":"http://i.imgur.com/eITOr2Y.png","Source":"NAVER","ServiceId":814961,"Enabled":0}, -{"Id":316,"Name":"Life N","KT Name":"","KTCh":null,"LG Name":"","LGCh":null,"SK Name":"Life N","SKCh":215,"Icon_url":"http://i.imgur.com/qNde2j7.png","Source":"SKB","ServiceId":277,"Enabled":0}, -{"Id":317,"Name":"Discovery HD","KT Name":"","KTCh":null,"LG Name":"Discovery HD","LGCh":133,"SK Name":"","SKCh":null,"Icon_url":"http://i.imgur.com/bH9BY7E.png","Source":"SKY","ServiceId":929,"Enabled":0}, -{"Id":318,"Name":"Celestial Movies","KT Name":"","KTCh":null,"LG Name":"","LGCh":null,"SK Name":"Celestial Movies","SKCh":62,"Icon_url":"http://i.imgur.com/xDXM13Q.png","Source":"SKB","ServiceId":877,"Enabled":0}, -{"Id":319,"Name":"UHD Dream TV","KT Name":"","KTCh":null,"LG Name":"","LGCh":null,"SK Name":"UHD Dream TV","SKCh":71,"Icon_url":"http://i.imgur.com/aLG2rKa.png","Source":"SKY","ServiceId":689,"Enabled":0}, -{"Id":320,"Name":"UMAX","KT Name":"","KTCh":null,"LG Name":"","LGCh":null,"SK Name":"UMAX","SKCh":73,"Icon_url":"http://i.imgur.com/EgVuybQ.png","Source":"SKB","ServiceId":69,"Enabled":0}, -{"Id":321,"Name":"NHK World TV","KT Name":"","KTCh":null,"LG Name":"NHK World TV","LGCh":142,"SK Name":"NHK World TV","SKCh":221,"Icon_url":"http://i.imgur.com/pCuIQsT.png","Source":"LG","ServiceId":669,"Enabled":0}, -{"Id":362,"Name":"CJB 청주방송","KT Name":"CJB 청주방송","KTCh":5,"LG Name":"CJB 청주방송","LGCh":5,"SK Name":"CJB 청주방송","SKCh":5,"Icon_url":"http://i.imgur.com/J6zQfQu.png","Source":"NAVER","ServiceId":814684,"Enabled":0}, -{"Id":363,"Name":"G1 강원민방","KT Name":"G1 강원민방","KTCh":5,"LG Name":"G1 강원민방","LGCh":5,"SK Name":"G1 강원민방","SKCh":5,"Icon_url":"http://i.imgur.com/aYqGo9x.png","Source":"NAVER","ServiceId":814614,"Enabled":0}, -{"Id":364,"Name":"JIBS 제주방송","KT Name":"JIBS 제주방송","KTCh":5,"LG Name":"JIBS 제주방송","LGCh":5,"SK Name":"JIBS 제주방송","SKCh":5,"Icon_url":"http://i.imgur.com/7YZ1lkJ.png","Source":"NAVER","ServiceId":814703,"Enabled":0}, -{"Id":365,"Name":"JTV 전주방송","KT Name":"JTV 전주방송","KTCh":5,"LG Name":"JTV 전주방송","LGCh":5,"SK Name":"JTV 전주방송","SKCh":5,"Icon_url":"http://i.imgur.com/XFKcvaN.png","Source":"NAVER","ServiceId":814661,"Enabled":0}, -{"Id":366,"Name":"KBC 광주방송","KT Name":"KBC 광주방송","KTCh":5,"LG Name":"KBC 광주방송","LGCh":5,"SK Name":"KBC 광주방송","SKCh":5,"Icon_url":"http://i.imgur.com/3M5UOIH.png","Source":"NAVER","ServiceId":814652,"Enabled":0}, -{"Id":367,"Name":"KNN 부산경남방송","KT Name":"KNN 부산경남방송","KTCh":5,"LG Name":"KNN 부산경남방송","LGCh":5,"SK Name":"KNN 부산경남방송","SKCh":5,"Icon_url":"http://i.imgur.com/RcViTam.png","Source":"NAVER","ServiceId":814628,"Enabled":0}, -{"Id":369,"Name":"TBC 대구방송","KT Name":"TBC 대구방송","KTCh":5,"LG Name":"TBC 대구방송","LGCh":5,"SK Name":"TBC 대구방송","SKCh":5,"Icon_url":"http://i.imgur.com/wmF5z8V.png","Source":"NAVER","ServiceId":814639,"Enabled":0}, -{"Id":370,"Name":"TJB 대전방송","KT Name":"TJB 대전방송","KTCh":5,"LG Name":"TJB 대전방송","LGCh":5,"SK Name":"TJB 대전방송","SKCh":5,"Icon_url":"http://i.imgur.com/9JAy4Bu.png","Source":"NAVER","ServiceId":814671,"Enabled":0}, -{"Id":371,"Name":"UBC 울산방송","KT Name":"UBC 울산방송","KTCh":5,"LG Name":"UBC 울산방송","LGCh":5,"SK Name":"UBC 울산방송","SKCh":5,"Icon_url":"http://i.imgur.com/qbBR1k5.png","Source":"NAVER","ServiceId":814694,"Enabled":0}, -{"Id":372,"Name":"강릉 KBS1","KT Name":"강릉 KBS1","KTCh":9,"LG Name":"강릉 KBS1","LGCh":9,"SK Name":"강릉 KBS1","SKCh":9,"Icon_url":"http://i.imgur.com/e31o5gw.png","Source":"NAVER","ServiceId":814602,"Enabled":0}, -{"Id":373,"Name":"강릉 MBC","KT Name":"강릉 MBC","KTCh":11,"LG Name":"강릉 MBC","LGCh":11,"SK Name":"강릉 MBC","SKCh":11,"Icon_url":"http://i.imgur.com/duig32i.png","Source":"NAVER","ServiceId":814606,"Enabled":0}, -{"Id":374,"Name":"경인 KBS1","KT Name":"경인 KBS1","KTCh":9,"LG Name":"경인 KBS1","LGCh":9,"SK Name":"경인 KBS1","SKCh":9,"Icon_url":"http://i.imgur.com/e31o5gw.png","Source":"NAVER","ServiceId":814597,"Enabled":0}, -{"Id":375,"Name":"광주 KBS1","KT Name":"광주 KBS1","KTCh":9,"LG Name":"광주 KBS1","LGCh":9,"SK Name":"광주 KBS1","SKCh":9,"Icon_url":"http://i.imgur.com/e31o5gw.png","Source":"NAVER","ServiceId":814642,"Enabled":0}, -{"Id":376,"Name":"광주 MBC","KT Name":"광주 MBC","KTCh":11,"LG Name":"광주 MBC","LGCh":11,"SK Name":"광주 MBC","SKCh":11,"Icon_url":"http://i.imgur.com/duig32i.png","Source":"NAVER","ServiceId":814644,"Enabled":0}, -{"Id":377,"Name":"대구 KBS1","KT Name":"대구 KBS1","KTCh":9,"LG Name":"대구 KBS1","LGCh":9,"SK Name":"대구 KBS1","SKCh":9,"Icon_url":"http://i.imgur.com/e31o5gw.png","Source":"NAVER","ServiceId":814630,"Enabled":0}, -{"Id":378,"Name":"대구 MBC","KT Name":"대구 MBC","KTCh":11,"LG Name":"대구 MBC","LGCh":11,"SK Name":"대구 MBC","SKCh":11,"Icon_url":"http://i.imgur.com/duig32i.png","Source":"NAVER","ServiceId":814633,"Enabled":0}, -{"Id":379,"Name":"대전 KBS1","KT Name":"대전 KBS1","KTCh":9,"LG Name":"대전 KBS1","LGCh":9,"SK Name":"대전 KBS1","SKCh":9,"Icon_url":"http://i.imgur.com/e31o5gw.png","Source":"NAVER","ServiceId":814665,"Enabled":0}, -{"Id":380,"Name":"대전 MBC","KT Name":"대전 MBC","KTCh":11,"LG Name":"대전 MBC","LGCh":11,"SK Name":"대전 MBC","SKCh":11,"Icon_url":"http://i.imgur.com/duig32i.png","Source":"NAVER","ServiceId":814668,"Enabled":0}, -{"Id":381,"Name":"목포 KBS1","KT Name":"목포 KBS1","KTCh":9,"LG Name":"목포 KBS1","LGCh":9,"SK Name":"목포 KBS1","SKCh":9,"Icon_url":"http://i.imgur.com/e31o5gw.png","Source":"LG","ServiceId":523,"Enabled":0}, -{"Id":382,"Name":"목포 MBC","KT Name":"목포 MBC","KTCh":11,"LG Name":"목포 MBC","LGCh":11,"SK Name":"목포 MBC","SKCh":11,"Icon_url":"http://i.imgur.com/duig32i.png","Source":"NAVER","ServiceId":814646,"Enabled":0}, -{"Id":383,"Name":"부산 KBS1","KT Name":"부산 KBS1","KTCh":9,"LG Name":"부산 KBS1","LGCh":9,"SK Name":"부산 KBS1","SKCh":9,"Icon_url":"http://i.imgur.com/e31o5gw.png","Source":"NAVER","ServiceId":814617,"Enabled":0}, -{"Id":384,"Name":"부산 MBC","KT Name":"부산 MBC","KTCh":11,"LG Name":"부산 MBC","LGCh":11,"SK Name":"부산 MBC","SKCh":11,"Icon_url":"http://i.imgur.com/duig32i.png","Source":"NAVER","ServiceId":814621,"Enabled":0}, -{"Id":385,"Name":"삼척 MBC","KT Name":"삼척 MBC","KTCh":11,"LG Name":"삼척 MBC","LGCh":11,"SK Name":"삼척 MBC","SKCh":11,"Icon_url":"http://i.imgur.com/duig32i.png","Source":"NAVER","ServiceId":814608,"Enabled":0}, -{"Id":386,"Name":"순천 KBS1","KT Name":"순천 KBS1","KTCh":9,"LG Name":"순천 KBS1","LGCh":9,"SK Name":"순천 KBS1","SKCh":9,"Icon_url":"http://i.imgur.com/e31o5gw.png","Source":"LG","ServiceId":522,"Enabled":0}, -{"Id":387,"Name":"안동 KBS1","KT Name":"안동 KBS1","KTCh":9,"LG Name":"안동 KBS1","LGCh":9,"SK Name":"안동 KBS1","SKCh":9,"Icon_url":"http://i.imgur.com/e31o5gw.png","Source":"LG","ServiceId":517,"Enabled":0}, -{"Id":388,"Name":"안동 MBC","KT Name":"안동 MBC","KTCh":11,"LG Name":"안동 MBC","LGCh":11,"SK Name":"안동 MBC","SKCh":11,"Icon_url":"http://i.imgur.com/duig32i.png","Source":"NAVER","ServiceId":814635,"Enabled":0}, -{"Id":389,"Name":"여수 MBC","KT Name":"여수 MBC","KTCh":11,"LG Name":"여수 MBC","LGCh":11,"SK Name":"여수 MBC","SKCh":11,"Icon_url":"http://i.imgur.com/duig32i.png","Source":"NAVER","ServiceId":814649,"Enabled":0}, -{"Id":390,"Name":"울산 KBS1","KT Name":"울산 KBS1","KTCh":9,"LG Name":"울산 KBS1","LGCh":9,"SK Name":"울산 KBS1","SKCh":9,"Icon_url":"http://i.imgur.com/e31o5gw.png","Source":"NAVER","ServiceId":814687,"Enabled":0}, -{"Id":391,"Name":"울산 MBC","KT Name":"울산 MBC","KTCh":11,"LG Name":"울산 MBC","LGCh":11,"SK Name":"울산 MBC","SKCh":11,"Icon_url":"http://i.imgur.com/duig32i.png","Source":"NAVER","ServiceId":814691,"Enabled":0}, -{"Id":392,"Name":"원주 KBS1","KT Name":"원주 KBS1","KTCh":9,"LG Name":"원주 KBS1","LGCh":9,"SK Name":"원주 KBS1","SKCh":9,"Icon_url":"http://i.imgur.com/e31o5gw.png","Source":"LG","ServiceId":531,"Enabled":0}, -{"Id":393,"Name":"원주 MBC","KT Name":"원주 MBC","KTCh":11,"LG Name":"원주 MBC","LGCh":11,"SK Name":"원주 MBC","SKCh":11,"Icon_url":"http://i.imgur.com/duig32i.png","Source":"NAVER","ServiceId":814610,"Enabled":0}, -{"Id":394,"Name":"전주 KBS1","KT Name":"전주 KBS1","KTCh":9,"LG Name":"전주 KBS1","LGCh":9,"SK Name":"전주 KBS1","SKCh":9,"Icon_url":"http://i.imgur.com/e31o5gw.png","Source":"NAVER","ServiceId":814655,"Enabled":0}, -{"Id":395,"Name":"전주 MBC","KT Name":"전주 MBC","KTCh":11,"LG Name":"전주 MBC","LGCh":11,"SK Name":"전주 MBC","SKCh":11,"Icon_url":"http://i.imgur.com/duig32i.png","Source":"NAVER","ServiceId":814658,"Enabled":0}, -{"Id":396,"Name":"제주 KBS1","KT Name":"제주 KBS1","KTCh":9,"LG Name":"제주 KBS1","LGCh":9,"SK Name":"제주 KBS1","SKCh":9,"Icon_url":"http://i.imgur.com/e31o5gw.png","Source":"NAVER","ServiceId":814697,"Enabled":0}, -{"Id":397,"Name":"제주 MBC","KT Name":"제주 MBC","KTCh":11,"LG Name":"제주 MBC","LGCh":11,"SK Name":"제주 MBC","SKCh":11,"Icon_url":"http://i.imgur.com/duig32i.png","Source":"NAVER","ServiceId":814700,"Enabled":0}, -{"Id":398,"Name":"진주 KBS1","KT Name":"진주 KBS1","KTCh":9,"LG Name":"진주 KBS1","LGCh":9,"SK Name":"진주 KBS1","SKCh":9,"Icon_url":"http://i.imgur.com/e31o5gw.png","Source":"LG","ServiceId":529,"Enabled":0}, -{"Id":399,"Name":"진주 MBC","KT Name":"진주 MBC","KTCh":11,"LG Name":"진주 MBC","LGCh":11,"SK Name":"진주 MBC","SKCh":11,"Icon_url":"http://i.imgur.com/duig32i.png","Source":"NAVER","ServiceId":814624,"Enabled":0}, -{"Id":400,"Name":"창원 KBS1","KT Name":"창원 KBS1","KTCh":9,"LG Name":"창원 KBS1","LGCh":9,"SK Name":"창원 KBS1","SKCh":9,"Icon_url":"http://i.imgur.com/e31o5gw.png","Source":"NAVER","ServiceId":814619,"Enabled":0}, -{"Id":401,"Name":"청주 KBS1","KT Name":"청주 KBS1","KTCh":9,"LG Name":"청주 KBS1","LGCh":9,"SK Name":"청주 KBS1","SKCh":9,"Icon_url":"http://i.imgur.com/e31o5gw.png","Source":"NAVER","ServiceId":814675,"Enabled":0}, -{"Id":402,"Name":"청주 MBC","KT Name":"청주 MBC","KTCh":11,"LG Name":"청주 MBC","LGCh":11,"SK Name":"청주 MBC","SKCh":11,"Icon_url":"http://i.imgur.com/duig32i.png","Source":"NAVER","ServiceId":814678,"Enabled":0}, -{"Id":403,"Name":"춘천 KBS1","KT Name":"춘천 KBS1","KTCh":9,"LG Name":"춘천 KBS1","LGCh":9,"SK Name":"춘천 KBS1","SKCh":9,"Icon_url":"http://i.imgur.com/e31o5gw.png","Source":"NAVER","ServiceId":814604,"Enabled":0}, -{"Id":404,"Name":"춘천 MBC","KT Name":"춘천 MBC","KTCh":11,"LG Name":"춘천 MBC","LGCh":11,"SK Name":"춘천 MBC","SKCh":11,"Icon_url":"http://i.imgur.com/duig32i.png","Source":"NAVER","ServiceId":814612,"Enabled":0}, -{"Id":405,"Name":"충주 KBS1","KT Name":"충주 KBS1","KTCh":9,"LG Name":"충주 KBS1","LGCh":9,"SK Name":"충주 KBS1","SKCh":9,"Icon_url":"http://i.imgur.com/e31o5gw.png","Source":"LG","ServiceId":513,"Enabled":0}, -{"Id":406,"Name":"충주 MBC","KT Name":"충주 MBC","KTCh":11,"LG Name":"충주 MBC","LGCh":11,"SK Name":"충주 MBC","SKCh":11,"Icon_url":"http://i.imgur.com/duig32i.png","Source":"LG","ServiceId":538,"Enabled":0}, -{"Id":407,"Name":"포항 KBS1","KT Name":"포항 KBS1","KTCh":9,"LG Name":"포항 KBS1","LGCh":9,"SK Name":"포항 KBS1","SKCh":9,"Icon_url":"http://i.imgur.com/e31o5gw.png","Source":"LG","ServiceId":518,"Enabled":0}, -{"Id":408,"Name":"포항 MBC","KT Name":"포항 MBC","KTCh":11,"LG Name":"포항 MBC","LGCh":11,"SK Name":"포항 MBC","SKCh":11,"Icon_url":"http://i.imgur.com/duig32i.png","Source":"NAVER","ServiceId":814637,"Enabled":0}, -{"Id":409,"Name":"DIA TV","KT Name":"DIA TV","KTCh":72,"LG Name":"DIA TV","LGCh":93,"SK Name":"DIA TV","SKCh":96,"Icon_url":"http://i.imgur.com/BH3DnrW.png","Source":"SKY","ServiceId":912,"Enabled":0}, -{"Id":410,"Name":"메디컬TV","KT Name":"메디컬TV","KTCh":254,"LG Name":"","LGCh":null,"SK Name":"","SKCh":null,"Icon_url":"http://i.imgur.com/S73ArUy.png","Source":"NAVER","ServiceId":815053,"Enabled":0}, -{"Id":411,"Name":"CGTN","KT Name":"CGTN","KTCh":194,"LG Name":"CGTN","LGCh":119,"SK Name":"CGTN","SKCh":161,"Icon_url":"http://i.imgur.com/rhZf4Zx.png","Source":"SKY","ServiceId":673,"Enabled":0}, -{"Id":412,"Name":"C Music TV","KT Name":"","KTCh":null,"LG Name":"","LGCh":null,"SK Name":"C Music TV","SKCh":237,"Icon_url":"http://i.imgur.com/hV270KM.png","Source":"SKB","ServiceId":672,"Enabled":0}, -{"Id":413,"Name":"Tvis","KT Name":"","KTCh":null,"LG Name":"","LGCh":null,"SK Name":"Tvis","SKCh":250,"Icon_url":"http://i.imgur.com/7jq2VMs.png","Source":"SKB","ServiceId":260,"Enabled":0}, -{"Id":414,"Name":"SPOTV ON","KT Name":"","KTCh":null,"LG Name":"","LGCh":null,"SK Name":"SPOTV ON","SKCh":118,"Icon_url":"http://i.imgur.com/Y3eYOc2.png","Source":"SKB","ServiceId":136,"Enabled":0}, -{"Id":415,"Name":"SPOTV ON2","KT Name":"","KTCh":null,"LG Name":"","LGCh":null,"SK Name":"SPOTV ON2","SKCh":119,"Icon_url":"http://i.imgur.com/jbdurz4.png","Source":"SKB","ServiceId":137,"Enabled":0}, -{"Id":416,"Name":"한국선거방송","KT Name":"한국선거방송","KTCh":273,"LG Name":"","LGCh":null,"SK Name":"","SKCh":null,"Icon_url":"http://i.imgur.com/ZSdcknl.png","Source":"KT","ServiceId":273,"Enabled":0}, -{"Id":417,"Name":"EBS 교육방송","KT Name":"","KTCh":null,"LG Name":"","LGCh":null,"SK Name":"","SKCh":null,"Icon_url":"http://i.imgur.com/eEsZJop.png","Source":"NAVER","ServiceId":815452,"Enabled":0}, -{"Id":418,"Name":"KBS 1 라디오","KT Name":"","KTCh":null,"LG Name":"","LGCh":null,"SK Name":"","SKCh":null,"Icon_url":"http://i.imgur.com/ikJ7QQn.png","Source":"NAVER","ServiceId":815455,"Enabled":0}, -{"Id":419,"Name":"KBS 2 라디오","KT Name":"","KTCh":null,"LG Name":"","LGCh":null,"SK Name":"","SKCh":null,"Icon_url":"http://i.imgur.com/qTrmNld.png","Source":"NAVER","ServiceId":815458,"Enabled":0}, -{"Id":420,"Name":"KBS 3 라디오","KT Name":"","KTCh":null,"LG Name":"","LGCh":null,"SK Name":"","SKCh":null,"Icon_url":"http://i.imgur.com/3tHl7QR.png","Source":"NAVER","ServiceId":815460,"Enabled":0}, -{"Id":421,"Name":"KBS ClassicFM","KT Name":"","KTCh":null,"LG Name":"","LGCh":null,"SK Name":"","SKCh":null,"Icon_url":"http://i.imgur.com/Z46a05G.png","Source":"NAVER","ServiceId":815454,"Enabled":0}, -{"Id":422,"Name":"KBS CoolFM","KT Name":"","KTCh":null,"LG Name":"","LGCh":null,"SK Name":"","SKCh":null,"Icon_url":"http://i.imgur.com/0SQrpHZ.png","Source":"NAVER","ServiceId":815457,"Enabled":0}, -{"Id":423,"Name":"KBS WorldRaido","KT Name":"","KTCh":null,"LG Name":"","LGCh":null,"SK Name":"","SKCh":null,"Icon_url":"http://i.imgur.com/ns1k6LN.png","Source":"KBS","ServiceId":1,"Enabled":0}, -{"Id":424,"Name":"KBS 한민족방송","KT Name":"","KTCh":null,"LG Name":"","LGCh":null,"SK Name":"","SKCh":null,"Icon_url":"http://i.imgur.com/S5YVPyx.png","Source":"NAVER","ServiceId":815461,"Enabled":0}, -{"Id":425,"Name":"MBC 표준FM","KT Name":"","KTCh":null,"LG Name":"","LGCh":null,"SK Name":"","SKCh":null,"Icon_url":"http://i.imgur.com/E9OMdnO.png","Source":"NAVER","ServiceId":815464,"Enabled":0}, -{"Id":426,"Name":"MBC FM4U","KT Name":"","KTCh":null,"LG Name":"","LGCh":null,"SK Name":"","SKCh":null,"Icon_url":"http://i.imgur.com/csdszZD.png","Source":"NAVER","ServiceId":815463,"Enabled":0}, -{"Id":427,"Name":"MBC Channel M","KT Name":"","KTCh":null,"LG Name":"","LGCh":null,"SK Name":"","SKCh":null,"Icon_url":"http://i.imgur.com/jlKGpWs.png","Source":"MBC","ServiceId":1,"Enabled":0}, -{"Id":428,"Name":"SBS 파워 FM","KT Name":"","KTCh":null,"LG Name":"","LGCh":null,"SK Name":"","SKCh":null,"Icon_url":"http://i.imgur.com/7qcJ4bm.png","Source":"NAVER","ServiceId":815467,"Enabled":0}, -{"Id":429,"Name":"SBS 러브 FM","KT Name":"","KTCh":null,"LG Name":"","LGCh":null,"SK Name":"","SKCh":null,"Icon_url":"http://i.imgur.com/XHHHUZ1.png","Source":"NAVER","ServiceId":815465,"Enabled":0}, -{"Id":430,"Name":"국악방송","KT Name":"","KTCh":null,"LG Name":"","LGCh":null,"SK Name":"","SKCh":null,"Icon_url":"http://i.imgur.com/qpbhUhF.png","Source":"NAVER","ServiceId":2891853,"Enabled":0}, -{"Id":431,"Name":"극동방송","KT Name":"","KTCh":null,"LG Name":"","LGCh":null,"SK Name":"","SKCh":null,"Icon_url":"http://i.imgur.com/PlqBFtV.png","Source":"NAVER","ServiceId":2074616,"Enabled":0}, -{"Id":432,"Name":"BBS 불교방송","KT Name":"","KTCh":null,"LG Name":"","LGCh":null,"SK Name":"","SKCh":null,"Icon_url":"http://i.imgur.com/B34jpmo.png","Source":"NAVER","ServiceId":815448,"Enabled":0}, -{"Id":433,"Name":"CBS 표준FM","KT Name":"","KTCh":null,"LG Name":"","LGCh":null,"SK Name":"","SKCh":null,"Icon_url":"http://i.imgur.com/yBNo2mS.png","Source":"NAVER","ServiceId":815451,"Enabled":0}, -{"Id":434,"Name":"CBS 음악FM","KT Name":"","KTCh":null,"LG Name":"","LGCh":null,"SK Name":"","SKCh":null,"Icon_url":"http://i.imgur.com/yBNo2mS.png","Source":"NAVER","ServiceId":815449,"Enabled":0}, -{"Id":435,"Name":"KFM 경기방송","KT Name":"","KTCh":null,"LG Name":"","LGCh":null,"SK Name":"","SKCh":null,"Icon_url":"http://i.imgur.com/8hSikAY.png","Source":"NAVER","ServiceId":1974893,"Enabled":0}, -{"Id":436,"Name":"PBC 평화방송","KT Name":"","KTCh":null,"LG Name":"","LGCh":null,"SK Name":"","SKCh":null,"Icon_url":"http://i.imgur.com/G5fTCL3.png","Source":"NAVER","ServiceId":1974894,"Enabled":0}, -{"Id":437,"Name":"TBS 교통방송","KT Name":"","KTCh":null,"LG Name":"","LGCh":null,"SK Name":"","SKCh":null,"Icon_url":"http://i.imgur.com/9RxxTSi.png","Source":"NAVER","ServiceId":815468,"Enabled":0}, -{"Id":438,"Name":"YTN NEWS FM","KT Name":"","KTCh":null,"LG Name":"","LGCh":null,"SK Name":"","SKCh":null,"Icon_url":"http://i.imgur.com/dSC3YPR.png","Source":"NAVER","ServiceId":2074615,"Enabled":0}, -{"Id":439,"Name":"원음방송","KT Name":"","KTCh":null,"LG Name":"","LGCh":null,"SK Name":"","SKCh":null,"Icon_url":"http://i.imgur.com/mKWQE7z.png","Source":"NAVER","ServiceId":5534687,"Enabled":0}, -{"Id":440,"Name":"국방FM","KT Name":"","KTCh":null,"LG Name":"","LGCh":null,"SK Name":"","SKCh":null,"Icon_url":"http://i.imgur.com/zjvlIIp.png","Source":"MIL","ServiceId":1,"Enabled":0}, -{"Id":441,"Name":"경인방송","KT Name":"","KTCh":null,"LG Name":"","LGCh":null,"SK Name":"","SKCh":null,"Icon_url":"http://i.imgur.com/zBTPTRe.png","Source":"IFM","ServiceId":1,"Enabled":0}, -{"Id":442,"Name":"AMC","KT Name":"","KTCh":null,"LG Name":"","LGCh":null,"SK Name":"AMC","SKCh":100,"Icon_url":"http://i.imgur.com/cJ1B77S.png","Source":"SKB","ServiceId":199,"Enabled":0}, -{"Id":443,"Name":"TVA","KT Name":"","KTCh":null,"LG Name":"","LGCh":null,"SK Name":"","SKCh":null,"Icon_url":"http://i.imgur.com/tg99cob.png","Source":"NAVER","ServiceId":814777,"Enabled":0}, -{"Id":444,"Name":"채널W","KT Name":"","KTCh":null,"LG Name":"","LGCh":null,"SK Name":"","SKCh":null,"Icon_url":"http://i.imgur.com/mtiKEkU.png","Source":"SKY","ServiceId":518,"Enabled":0}, -{"Id":445,"Name":"INSIGHT TV","KT Name":"","KTCh":null,"LG Name":"","LGCh":null,"SK Name":"INSIGHT TV","SKCh":74,"Icon_url":"http://i.imgur.com/eFTXeGV.png","Source":"SKB","ServiceId":890,"Enabled":0}, -{"Id":446,"Name":"인도어스포츠","KT Name":"","KTCh":null,"LG Name":"","LGCh":null,"SK Name":"인도어스포츠","SKCh":139,"Icon_url":"http://i.imgur.com/cb58LLs.png","Source":"NAVER","ServiceId":5949404,"Enabled":0}, -{"Id":447,"Name":"한국시니어TV","KT Name":"한국시니어TV","KTCh":264,"LG Name":"","LGCh":null,"SK Name":"","SKCh":null,"Icon_url":"http://i.imgur.com/XaObZ8I.png","Source":"KT","ServiceId":264,"Enabled":0} +{ "Id": 1, "Name": "9colors", "KT Name": "9colors", "KTCh": 163, "LG Name": "나인컬러스", "LGCh": 178, "SK Name": "9colors", "SKCh": 220, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/tRhzBgK.png", "Source": "SK", "ServiceId": "285", "Enabled": 0 }, +{ "Id": 2, "Name": "애니박스", "KT Name": "애니박스", "KTCh": 135, "LG Name": "애니박스", "LGCh": 148, "SK Name": "애니박스", "SKCh": 179, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/ipM9AXe.png", "Source": "SKY", "ServiceId": "84", "Enabled": 0 }, +{ "Id": 3, "Name": "Animal Planet", "KT Name": "Animal Planet", "KTCh": 179, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/ae70Di1.png", "Source": "SKY", "ServiceId": "182", "Enabled": 0 }, +{ "Id": 4, "Name": "ANIMAX", "KT Name": "ANIMAX", "KTCh": 133, "LG Name": "애니맥스", "LGCh": 167, "SK Name": "Animax", "SKCh": 173, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/2Gfqhuj.png", "Source": "SKY", "ServiceId": "725", "Enabled": 0 }, +{ "Id": 5, "Name": "애니원", "KT Name": "애니원", "KTCh": 134, "LG Name": "애니원", "LGCh": 153, "SK Name": "애니원", "SKCh": 174, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/sIp2MZ3.png", "Source": "SKY", "ServiceId": "56", "Enabled": 0 }, +{ "Id": 6, "Name": "예술 TV아르떼", "KT Name": "예술 TV아르떼", "KTCh": 91, "LG Name": "예술TV 아르떼", "LGCh": 139, "SK Name": "Arte TV", "SKCh": 234, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/zReu7df.png", "Source": "SK", "ServiceId": "421", "Enabled": 0 }, +{ "Id": 7, "Name": "Asia UHD", "KT Name": "Asia UHD", "KTCh": 109, "LG Name": "", "LGCh": null, "SK Name": "Asia UHD", "SKCh": 72, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/1u80OGN.png", "Source": "SKY", "ServiceId": "655", "Enabled": 0 }, +{ "Id": 8, "Name": "AsiaN", "KT Name": "AsiaN", "KTCh": 111, "LG Name": "아시아N", "LGCh": 88, "SK Name": "Asia N", "SKCh": 106, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/gleMSFq.png", "Source": "SK", "ServiceId": "177", "Enabled": 0 }, +{ "Id": 9, "Name": "Australia Plus", "KT Name": "Australia Plus", "KTCh": 258, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/6k9j2Hj.png", "Source": "NAVER", "ServiceId": "815391", "Enabled": 0 }, +{ "Id": 10, "Name": "AXN", "KT Name": "AXN", "KTCh": 113, "LG Name": "AXN", "LGCh": 45, "SK Name": "AXN", "SKCh": 102, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/QrAXBEm.png", "Source": "LG", "ServiceId": "744", "Enabled": 0 }, +{ "Id": 11, "Name": "B Shopping", "KT Name": "B Shopping", "KTCh": 30, "LG Name": "B쇼핑", "LGCh": 28, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/HiCKxpt.png", "Source": "LG", "ServiceId": "738", "Enabled": 0 }, +{ "Id": 14, "Name": "Baby TV", "KT Name": "Baby TV", "KTCh": 146, "LG Name": "", "LGCh": null, "SK Name": "Baby TV", "SKCh": 195, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/mU7QuTz.png", "Source": "KT", "ServiceId": "146", "Enabled": 0 }, +{ "Id": 15, "Name": "BBC Earth", "KT Name": "BBC Earth", "KTCh": 172, "LG Name": "BBC Earth", "LGCh": 130, "SK Name": "BBC earth", "SKCh": 265, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/SJZjuqO.png", "Source": "EPG", "ServiceId": "904", "Enabled": 0 }, +{ "Id": 18, "Name": "BBC WN", "KT Name": "BBC WN", "KTCh": 192, "LG Name": "BBC World News", "LGCh": 126, "SK Name": "BBC World News", "SKCh": 160, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/IwJBNd4.png", "Source": "EPG", "ServiceId": "260", "Enabled": 0 }, +{ "Id": 19, "Name": "BBS불교방송", "KT Name": "BBS불교방송", "KTCh": 232, "LG Name": "BBS", "LGCh": 186, "SK Name": "BBS 불교방송", "SKCh": 306, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/B34jpmo.png", "Source": "HCN", "ServiceId": "903", "Enabled": 0 }, +{ "Id": 20, "Name": "빌리어즈티비", "KT Name": "빌리어즈티비", "KTCh": 116, "LG Name": "빌리어즈TV", "LGCh": 63, "SK Name": "Billiards TV", "SKCh": 130, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/f0OW8wX.png", "Source": "EPG", "ServiceId": "615", "Enabled": 0 }, +{ "Id": 21, "Name": "Bloomberg", "KT Name": "Bloomberg", "KTCh": 196, "LG Name": "", "LGCh": null, "SK Name": "Bloomberg TV", "SKCh": 162, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/WWNLhh3.png", "Source": "SK", "ServiceId": "775", "Enabled": 0 }, +{ "Id": 23, "Name": "BTN불교TV", "KT Name": "BTN불교TV", "KTCh": 233, "LG Name": "BTN", "LGCh": 185, "SK Name": "BTN 불교TV", "SKCh": 305, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/XU4pwpC.png", "Source": "HCN", "ServiceId": "52", "Enabled": 0 }, +{ "Id": 24, "Name": "C channel", "KT Name": "C Channel", "KTCh": 235, "LG Name": "C채널", "LGCh": 182, "SK Name": "C채널", "SKCh": 304, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/SFouN1c.png", "Source": "HCN", "ServiceId": "907", "Enabled": 0 }, +{ "Id": 26, "Name": "C TIME", "KT Name": "C TIME", "KTCh": 69, "LG Name": "C타임", "LGCh": 86, "SK Name": "C TIME", "SKCh": 86, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/2FwWidb.png", "Source": "LG", "ServiceId": "775", "Enabled": 0 }, +{ "Id": 27, "Name": "Cbeebies", "KT Name": "Cbeebies", "KTCh": 152, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/4bIQeie.png", "Source": "NAVER", "ServiceId": "814991", "Enabled": 0 }, +{ "Id": 28, "Name": "CBS", "KT Name": "CBS", "KTCh": 238, "LG Name": "CBS", "LGCh": 181, "SK Name": "CBS", "SKCh": 300, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/yBNo2mS.png", "Source": "HCN", "ServiceId": "156", "Enabled": 0 }, +{ "Id": 31, "Name": "CCTV4", "KT Name": "CCTV4", "KTCh": 280, "LG Name": "CCTV4", "LGCh": 120, "SK Name": "CCTV4", "SKCh": 277, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/ACwvhcc.png", "Source": "ISCS", "ServiceId": "1467", "Enabled": 0 }, +{ "Id": 32, "Name": "CGNTV", "KT Name": "CGNTV", "KTCh": 237, "LG Name": "CGNTV", "LGCh": 183, "SK Name": "CGNTV", "SKCh": 302, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/9fNvKEX.png", "Source": "NAVER", "ServiceId": "815106", "Enabled": 0 }, +{ "Id": 34, "Name": "Channel [V]", "KT Name": "Channel [V]", "KTCh": 89, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/t1PNA6v.png", "Source": "KT", "ServiceId": "89", "Enabled": 0 }, +{ "Id": 35, "Name": "채널 J", "KT Name": "채널 J", "KTCh": 108, "LG Name": "채널J", "LGCh": 145, "SK Name": "채널J", "SKCh": 103, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/V9jGCZm.png", "Source": "LG", "ServiceId": "656", "Enabled": 0 }, +{ "Id": 36, "Name": "Channel News Asia", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "Channel News Asia", "SKCh": 163, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/hahdOp1.png", "Source": "SKB", "ServiceId": "777", "Enabled": 0 }, +{ "Id": 38, "Name": "cineF", "KT Name": "", "KTCh": null, "LG Name": "시네프", "LGCh": 42, "SK Name": "Cinef", "SKCh": 58, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/TfhQXIv.png", "Source": "SKB", "ServiceId": "193", "Enabled": 0 }, +{ "Id": 39, "Name": "UXN", "KT Name": "UXN", "KTCh": 101, "LG Name": "UXN", "LGCh": 2, "SK Name": "UXN", "SKCh": 70, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/5rRW0R3.png", "Source": "SKY", "ServiceId": "624", "Enabled": 0 }, +{ "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", "Enabled": 0 }, +{ "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", "Enabled": 0 }, +{ "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", "Enabled": 0 }, +{ "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", "Enabled": 0 }, +{ "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", "Enabled": 0 }, +{ "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", "Enabled": 0 }, +{ "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", "Enabled": 0 }, +{ "Id": 47, "Name": "CNN US", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "CNN US", "SKCh": 159, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/EL6i9mA.png", "Source": "SK", "ServiceId": "782", "Enabled": 0 }, +{ "Id": 48, "Name": "CNTV", "KT Name": "CNTV", "KTCh": 68, "LG Name": "CNTV", "LGCh": 85, "SK Name": "CNTV", "SKCh": 43, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/lCGq3v1.png", "Source": "NAVER", "ServiceId": "814709", "Enabled": 0 }, +{ "Id": 49, "Name": "CTS기독교TV", "KT Name": "CTS기독교TV", "KTCh": 236, "LG Name": "CTS", "LGCh": 180, "SK Name": "CTS", "SKCh": 301, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/lW9nvaB.png", "Source": "HCN", "ServiceId": "42", "Enabled": 0 }, +{ "Id": 50, "Name": "CUBE TV", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "CUBE TV", "SKCh": 89, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/xvEjFJa.png", "Source": "NAVER", "ServiceId": "1725243", "Enabled": 0 }, +{ "Id": 51, "Name": "디스커버리채널", "KT Name": "디스커버리채널", "KTCh": 177, "LG Name": "", "LGCh": null, "SK Name": "Discovery Channel", "SKCh": 261, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/1SgSI0P.png", "Source": "SKB", "ServiceId": "437", "Enabled": 0 }, +{ "Id": 52, "Name": "Dog TV", "KT Name": "Dog TV", "KTCh": 201, "LG Name": "DOG TV", "LGCh": 89, "SK Name": "DOG TV", "SKCh": 79, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/4Xqehq9.png", "Source": "SKB", "ServiceId": "255", "Enabled": 0 }, +{ "Id": 53, "Name": "Dream Works Channel", "KT Name": "Dream Works Channel", "KTCh": 131, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/ETfF49T.png", "Source": "KT", "ServiceId": "131", "Enabled": 0 }, +{ "Id": 54, "Name": "DW-TV Asia+", "KT Name": "DW-TV Asia+", "KTCh": 257, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/b0yhwNu.png", "Source": "NAVER", "ServiceId": "815529", "Enabled": 0 }, +{ "Id": 55, "Name": "E채널", "KT Name": "E채널", "KTCh": 48, "LG Name": "E 채널", "LGCh": 104, "SK Name": "E채널", "SKCh": 83, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/0WmEGB4.png", "Source": "EPG", "ServiceId": "108", "Enabled": 0 }, +{ "Id": 56, "Name": "EBS English", "KT Name": "EBS English", "KTCh": 156, "LG Name": "EBS English", "LGCh": 162, "SK Name": "EBS English", "SKCh": 202, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/Rx4mgpm.png", "Source": "LG", "ServiceId": "801", "Enabled": 0 }, +{ "Id": 57, "Name": "EBS u", "KT Name": "EBS u", "KTCh": 145, "LG Name": "EBS u", "LGCh": 168, "SK Name": "EBSu", "SKCh": 194, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/RIgVjvP.png", "Source": "NAVER", "ServiceId": "815547", "Enabled": 0 }, +{ "Id": 58, "Name": "EBS PLUS1", "KT Name": "EBS PLUS1", "KTCh": 157, "LG Name": "EBS+1", "LGCh": 163, "SK Name": "EBS +1", "SKCh": 203, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/WGlWiWy.png", "Source": "LG", "ServiceId": "714", "Enabled": 0 }, +{ "Id": 59, "Name": "EBS PLUS2", "KT Name": "EBS PLUS2", "KTCh": 158, "LG Name": "EBS+2", "LGCh": 164, "SK Name": "EBS +2", "SKCh": 204, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/QPq2wcg.png", "Source": "LG", "ServiceId": "715", "Enabled": 0 }, +{ "Id": 60, "Name": "EBS", "KT Name": "EBS", "KTCh": 13, "LG Name": "EBS1", "LGCh": 14, "SK Name": "EBS", "SKCh": 13, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/WViFruZ.png", "Source": "SKY", "ServiceId": "798", "Enabled": 1 }, +{ "Id": 61, "Name": "EBS2", "KT Name": "EBS2", "KTCh": 95, "LG Name": "EBS2", "LGCh": 95, "SK Name": "EBS2", "SKCh": 95, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/RIrBF4D.png", "Source": "POOQ", "ServiceId": "E02", "Enabled": 0 }, +{ "Id": 62, "Name": "Edge TV", "KT Name": "Edge TV", "KTCh": 79, "LG Name": "엣지TV", "LGCh": 68, "SK Name": "EDGE TV", "SKCh": 44, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/gsnjG4A.png", "Source": "HCN", "ServiceId": "104", "Enabled": 0 }, +{ "Id": 63, "Name": "edu TV", "KT Name": "edu TV", "KTCh": 159, "LG Name": "에듀TV", "LGCh": 165, "SK Name": "edu TV", "SKCh": 205, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/ZsMKNGe.png", "Source": "LG", "ServiceId": "810", "Enabled": 0 }, +{ "Id": 67, "Name": "Euro News", "KT Name": "Euro News", "KTCh": 193, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/6jswCZM.png", "Source": "NAVER", "ServiceId": "814935", "Enabled": 0 }, +{ "Id": 68, "Name": "Euro sport", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "Eurosport", "SKCh": 134, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/7hVKz6n.png", "Source": "SKB", "ServiceId": "120", "Enabled": 0 }, +{ "Id": 70, "Name": "Extreme Fun", "KT Name": "Extreme Fun", "KTCh": 173, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/yDg1RC6.png", "Source": "KT", "ServiceId": "173", "Enabled": 0 }, +{ "Id": 71, "Name": "Fashion N", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "Fashion N", "SKCh": 211, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/qPBnZpV.png", "Source": "SKB", "ServiceId": "274", "Enabled": 0 }, +{ "Id": 72, "Name": "FISHING TV", "KT Name": "FISHING TV", "KTCh": 119, "LG Name": "피싱TV", "LGCh": 65, "SK Name": "FISHING TV", "SKCh": 244, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/Go4FdK1.png", "Source": "SK", "ServiceId": "273", "Enabled": 0 }, +{ "Id": 73, "Name": "푸드TV", "KT Name": "푸드TV", "KTCh": 78, "LG Name": "푸드TV", "LGCh": 83, "SK Name": "Food TV", "SKCh": 213, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/F9Rb9SA.png", "Source": "HCN", "ServiceId": "753", "Enabled": 0 }, +{ "Id": 74, "Name": "FOX", "KT Name": "FOX", "KTCh": 107, "LG Name": "FOX채널", "LGCh": 44, "SK Name": "FOX", "SKCh": 101, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/8usDWOC.png", "Source": "LG", "ServiceId": "654", "Enabled": 0 }, +{ "Id": 75, "Name": "Fox life", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "Fox life", "SKCh": 216, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/CqVujLk.png", "Source": "SKB", "ServiceId": "280", "Enabled": 0 }, +{ "Id": 76, "Name": "Fox News", "KT Name": "Fox News", "KTCh": 195, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/9rGThzD.png", "Source": "NAVER", "ServiceId": "815413", "Enabled": 0 }, +{ "Id": 78, "Name": "FTV", "KT Name": "FTV", "KTCh": 118, "LG Name": "FTV", "LGCh": 64, "SK Name": "FTV", "SKCh": 243, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/eI9wGgS.png", "Source": "HCN", "ServiceId": "262", "Enabled": 0 }, +{ "Id": 79, "Name": "FUN TV", "KT Name": "FUN TV", "KTCh": 71, "LG Name": "", "LGCh": null, "SK Name": "FUN TV", "SKCh": 91, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/6V8X43L.png", "Source": "KT", "ServiceId": "71", "Enabled": 0 }, +{ "Id": 80, "Name": "FX", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "FX", "SKCh": 90, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/DAnUsTS.png", "Source": "SKY", "ServiceId": "818", "Enabled": 0 }, +{ "Id": 82, "Name": "GMTV", "KT Name": "GMTV", "KTCh": 88, "LG Name": "GMTV", "LGCh": 101, "SK Name": "GMTV", "SKCh": 232, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/WPF3G5V.png", "Source": "NAVER", "ServiceId": "814815", "Enabled": 0 }, +{ "Id": 83, "Name": "Good TV", "KT Name": "Good TV", "KTCh": 234, "LG Name": "", "LGCh": null, "SK Name": "Good TV", "SKCh": 303, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/fFN1YJb.png", "Source": "HCN", "ServiceId": "293", "Enabled": 0 }, +{ "Id": 84, "Name": "GS MY SHOP", "KT Name": "GS MY SHOP", "KTCh": 38, "LG Name": "GS마이샵", "LGCh": 30, "SK Name": "GS MY SHOP", "SKCh": 29, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/0Y0pRW4.png", "Source": "SK", "ServiceId": "343", "Enabled": 0 }, +{ "Id": 85, "Name": "GS SHOP", "KT Name": "GS SHOP", "KTCh": 8, "LG Name": "GS샵", "LGCh": 6, "SK Name": "GS SHOP", "SKCh": 12, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/tz88mYd.png", "Source": "HCN", "ServiceId": "45", "Enabled": 0 }, +{ "Id": 86, "Name": "GTV", "KT Name": "GTV", "KTCh": 73, "LG Name": "GTV", "LGCh": 136, "SK Name": "Gtv", "SKCh": 217, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/1qXSXRa.png", "Source": "HCN", "ServiceId": "35", "Enabled": 0 }, +{ "Id": 87, "Name": "히어로액션", "KT Name": "히어로액션", "KTCh": 112, "LG Name": "히어로액션", "LGCh": 110, "SK Name": "히어로액션", "SKCh": 107, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/yBChQVh.png", "Source": "NAVER", "ServiceId": "814760", "Enabled": 0 }, +{ "Id": 89, "Name": "하이라이트TV", "KT Name": "하이라이트TV", "KTCh": 74, "LG Name": "하이라이트TV", "LGCh": 91, "SK Name": "Highlight TV", "SKCh": 42, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/V9CQ4A6.png", "Source": "LG", "ServiceId": "701", "Enabled": 0 }, +{ "Id": 90, "Name": "History HD", "KT Name": "History HD", "KTCh": 169, "LG Name": "히스토리 HD", "LGCh": 132, "SK Name": "History HD", "SKCh": 264, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/SSkop4X.png", "Source": "EPG", "ServiceId": "900", "Enabled": 0 }, +{ "Id": 91, "Name": "HQ+", "KT Name": "HQ+", "KTCh": 253, "LG Name": "", "LGCh": null, "SK Name": "HQ+", "SKCh": 47, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/GTANuZS.png", "Source": "NAVER", "ServiceId": "3566359", "Enabled": 0 }, +{ "Id": 92, "Name": "아이넷TV", "KT Name": "아이넷TV", "KTCh": 92, "LG Name": "아이넷TV", "LGCh": 106, "SK Name": "아이넷 TV", "SKCh": 233, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/JYQpemw.png", "Source": "SKB", "ServiceId": "261", "Enabled": 0 }, +{ "Id": 93, "Name": "IB SPORTS", "KT Name": "IB SPORTS", "KTCh": 53, "LG Name": "IB스포츠", "LGCh": 62, "SK Name": "IB Sports", "SKCh": 129, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/wOOQEC1.png", "Source": "SKY", "ServiceId": "515", "Enabled": 0 }, +{ "Id": 94, "Name": "i-Concerts", "KT Name": "", "KTCh": null, "LG Name": "아이콘서트", "LGCh": 108, "SK Name": "i-Concerts", "SKCh": 236, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/oUUZQdi.png", "Source": "LG", "ServiceId": "661", "Enabled": 0 }, +{ "Id": 95, "Name": "JEI EnglishTV", "KT Name": "JEI EnglishTV", "KTCh": 154, "LG Name": "JEI EnglishTV", "LGCh": 160, "SK Name": "JEI 재능 English", "SKCh": 200, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/R1oJmLo.png", "Source": "SKY", "ServiceId": "289", "Enabled": 0 }, +{ "Id": 96, "Name": "JEI 재능TV", "KT Name": "JEI 재능TV", "KTCh": 142, "LG Name": "JEI재능TV", "LGCh": 159, "SK Name": "JEI 재능TV", "SKCh": 192, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/NoNRdSt.png", "Source": "SKY", "ServiceId": "23", "Enabled": 0 }, +{ "Id": 97, "Name": "JTBC", "KT Name": "JTBC", "KTCh": 15, "LG Name": "JTBC", "LGCh": 15, "SK Name": "JTBC", "SKCh": 15, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/YOYosLG.png", "Source": "POOQ", "ServiceId": "C2301", "Enabled": 0 }, +{ "Id": 98, "Name": "JTBC Golf", "KT Name": "JTBC Golf", "KTCh": 56, "LG Name": "JTBC골프", "LGCh": 54, "SK Name": "JTBC GOLF", "SKCh": 132, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/Bnw7O5U.png", "Source": "SKY", "ServiceId": "974", "Enabled": 0 }, +{ "Id": 99, "Name": "JTBC2", "KT Name": "JTBC2", "KTCh": 39, "LG Name": "JTBC2", "LGCh": 94, "SK Name": "jtbc2", "SKCh": 82, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/WtXDuFU.png", "Source": "POOQ", "ServiceId": "C2303", "Enabled": 0 }, +{ "Id": 100, "Name": "JTBC3", "KT Name": "JTBC3", "KTCh": 62, "LG Name": "JTBC3 FOX스포츠", "LGCh": 50, "SK Name": "JTBC3 FOXSPORTS", "SKCh": 126, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/KvGwEc1.png", "Source": "POOQ", "ServiceId": "C2304", "Enabled": 0 }, +{ "Id": 101, "Name": "K STAR", "KT Name": "K STAR", "KTCh": 87, "LG Name": "K스타", "LGCh": 105, "SK Name": "K star", "SKCh": 88, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/MYtePna.png", "Source": "LG", "ServiceId": "662", "Enabled": 0 }, +{ "Id": 103, "Name": "KBS DRAMA", "KT Name": "KBS Drama", "KTCh": 35, "LG Name": "KBS드라마", "LGCh": 31, "SK Name": "KBS 드라마", "SKCh": 30, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/CrLMIEQ.png", "Source": "SKY", "ServiceId": "910", "Enabled": 0 }, +{ "Id": 104, "Name": "KBS JOY", "KT Name": "KBS Joy", "KTCh": 41, "LG Name": "KBS조이", "LGCh": 3, "SK Name": "KBS joy", "SKCh": 80, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/D1o9by9.png", "Source": "POOQ", "ServiceId": "K04", "Enabled": 0 }, +{ "Id": 105, "Name": "KBS kids", "KT Name": "KBS Kids", "KTCh": 144, "LG Name": "KBS키즈", "LGCh": 169, "SK Name": "KBS KIDS", "SKCh": 190, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/Jcfjs9E.png", "Source": "SKY", "ServiceId": "596", "Enabled": 0 }, +{ "Id": 106, "Name": "KBSN Life", "KT Name": "KBSN Life", "KTCh": 281, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/5Ni1YIT.png", "Source": "POOQ", "ServiceId": "K05", "Enabled": 0 }, +{ "Id": 107, "Name": "KBS N Sports", "KT Name": "KBS N Sports", "KTCh": 59, "LG Name": "KBSN스포츠", "LGCh": 59, "SK Name": "KBSN 스포츠", "SKCh": 121, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/xspD7UE.png", "Source": "LG", "ServiceId": "618", "Enabled": 0 }, +{ "Id": 108, "Name": "KBS W", "KT Name": "KBS W", "KTCh": 83, "LG Name": "KBS W", "LGCh": 77, "SK Name": "KBS W", "SKCh": 214, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/sVqBczs.png", "Source": "POOQ", "ServiceId": "K09", "Enabled": 0 }, +{ "Id": 110, "Name": "KBS1", "KT Name": "KBS1", "KTCh": 9, "LG Name": "KBS1", "LGCh": 9, "SK Name": "KBS1", "SKCh": 9, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/e31o5gw.png", "Source": "SKY", "ServiceId": "796", "Enabled": 1 }, +{ "Id": 111, "Name": "KBS2", "KT Name": "KBS2", "KTCh": 7, "LG Name": "KBS2", "LGCh": 7, "SK Name": "KBS2", "SKCh": 7, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/XgibZbD.png", "Source": "SKY", "ServiceId": "795", "Enabled": 1 }, +{ "Id": 112, "Name": "키즈톡톡", "KT Name": "", "KTCh": null, "LG Name": "키즈톡톡", "LGCh": 158, "SK Name": "키즈톡톡 플러스", "SKCh": 189, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/0loInJO.png", "Source": "LG", "ServiceId": "805", "Enabled": 0 }, +{ "Id": 115, "Name": "KIDS-TV", "KT Name": "KIDS-TV", "KTCh": 149, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/AVCSEdn.png", "Source": "NAVER", "ServiceId": "814999", "Enabled": 0 }, +{ "Id": 116, "Name": "K-NET TV", "KT Name": "K-NET TV", "KTCh": 230, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/GelnqjB.png", "Source": "KT", "ServiceId": "230", "Enabled": 0 }, +{ "Id": 117, "Name": "KTV", "KT Name": "KTV", "KTCh": 64, "LG Name": "KTV", "LGCh": 171, "SK Name": "KTV", "SKCh": 290, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/yUk2RhO.png", "Source": "ISCS", "ServiceId": "1327", "Enabled": 0 }, +{ "Id": 118, "Name": "K-바둑", "KT Name": "K-바둑", "KTCh": 121, "LG Name": "K-바둑", "LGCh": 107, "SK Name": "K-바둑", "SKCh": 241, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/EAk5ySy.png", "Source": "HCN", "ServiceId": "162", "Enabled": 0 }, +{ "Id": 119, "Name": "K쇼핑", "KT Name": "K쇼핑", "KTCh": 20, "LG Name": "", "LGCh": null, "SK Name": "K쇼핑", "SKCh": 25, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/6ORm0Rz.png", "Source": "SK", "ServiceId": "333", "Enabled": 0 }, +{ "Id": 121, "Name": "Mnet", "KT Name": "Mnet", "KTCh": 27, "LG Name": "엠넷", "LGCh": 22, "SK Name": "M.net", "SKCh": 27, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/putHm2b.png", "Source": "SKY", "ServiceId": "273", "Enabled": 0 }, +{ "Id": 122, "Name": "MBC", "KT Name": "MBC", "KTCh": 11, "LG Name": "MBC", "LGCh": 11, "SK Name": "MBC", "SKCh": 11, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/duig32i.png", "Source": "SKY", "ServiceId": "797", "Enabled": 1 }, +{ "Id": 123, "Name": "MBC Every1", "KT Name": "MBC Every1", "KTCh": 3, "LG Name": "MBC에브리원", "LGCh": 29, "SK Name": "MBC Every1", "SKCh": 28, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/oOnpFes.png", "Source": "POOQ", "ServiceId": "M03", "Enabled": 0 }, +{ "Id": 124, "Name": "MBC MUSIC", "KT Name": "MBC MUSIC", "KTCh": 97, "LG Name": "MBC뮤직", "LGCh": 99, "SK Name": "MBC Music", "SKCh": 231, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/6g56RDx.png", "Source": "POOQ", "ServiceId": "M06", "Enabled": 0 }, +{ "Id": 125, "Name": "MBC NET", "KT Name": "MBC NET", "KTCh": 164, "LG Name": "MBCNET", "LGCh": 140, "SK Name": "MBC NET", "SKCh": 274, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/lxDOgY8.png", "Source": "SKY", "ServiceId": "537", "Enabled": 0 }, +{ "Id": 126, "Name": "MBC SPORTS+", "KT Name": "MBC SPORT+", "KTCh": 60, "LG Name": "MBC스포츠+", "LGCh": 60, "SK Name": "MBC Sports+", "SKCh": 123, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/Su21uj3.png", "Source": "SKY", "ServiceId": "911", "Enabled": 0 }, +{ "Id": 127, "Name": "MBC SPORTS+2", "KT Name": "MBC SPORTS+2", "KTCh": 61, "LG Name": "MBC스포츠+2", "LGCh": 61, "SK Name": "MBC SPORTS+2", "SKCh": 124, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/frAuUS3.png", "Source": "SKY", "ServiceId": "96", "Enabled": 0 }, +{ "Id": 128, "Name": "MBC Dramanet", "KT Name": "MBC Dramanet", "KTCh": 75, "LG Name": "MBC드라마넷", "LGCh": 35, "SK Name": "MBC 드라마", "SKCh": 32, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/VBMFcZ3.png", "Source": "POOQ", "ServiceId": "M02", "Enabled": 0 }, +{ "Id": 129, "Name": "MBN", "KT Name": "MBN", "KTCh": 16, "LG Name": "MBN", "LGCh": 16, "SK Name": "MBN", "SKCh": 16, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/p0mvIJN.png", "Source": "POOQ", "ServiceId": "C2401", "Enabled": 0 }, +{ "Id": 130, "Name": "MBN Plus", "KT Name": "MBN Plus", "KTCh": 99, "LG Name": "MBN+", "LGCh": 116, "SK Name": "MBN 플러스", "SKCh": 98, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/yMZiUUp.png", "Source": "NAVER", "ServiceId": "5286722", "Enabled": 0 }, +{ "Id": 133, "Name": "마운틴TV", "KT Name": "마운틴TV", "KTCh": 117, "LG Name": "마운틴TV", "LGCh": 69, "SK Name": "Mountain TV", "SKCh": 247, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/4nLYnVC.png", "Source": "ISCS", "ServiceId": "713", "Enabled": 0 }, +{ "Id": 134, "Name": "mplex", "KT Name": "mplex", "KTCh": 103, "LG Name": "엠플렉스", "LGCh": 46, "SK Name": "Mplex", "SKCh": 57, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/dOOBYJm.png", "Source": "ISCS", "ServiceId": "1487", "Enabled": 0 }, +{ "Id": 135, "Name": "머니투데이방송", "KT Name": "머니투데이방송", "KTCh": 181, "LG Name": "MTN", "LGCh": 122, "SK Name": "MTN", "SKCh": 152, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/joWd14j.png", "Source": "EPG", "ServiceId": "132", "Enabled": 0 }, +{ "Id": 136, "Name": "NatGeo People", "KT Name": "NatGeo People", "KTCh": 171, "LG Name": "", "LGCh": null, "SK Name": "Natgeo People", "SKCh": 263, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/2ghKPUg.png", "Source": "NAVER", "ServiceId": "814946", "Enabled": 0 }, +{ "Id": 137, "Name": "NatGeo Wild", "KT Name": "NatGeo Wild", "KTCh": 170, "LG Name": "냇지오 와일드", "LGCh": 134, "SK Name": "Natgeo Wild HD", "SKCh": 266, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/M4nh0Rk.png", "Source": "SKY", "ServiceId": "166", "Enabled": 0 }, +{ "Id": 138, "Name": "NGC", "KT Name": "NGC", "KTCh": 168, "LG Name": "내셔널지오그래픽", "LGCh": 131, "SK Name": "NGC", "SKCh": 260, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/mqTSPMN.png", "Source": "SKY", "ServiceId": "972", "Enabled": 0 }, +{ "Id": 139, "Name": "NHK WP", "KT Name": "NHK WP", "KTCh": 199, "LG Name": "NHK World Premium", "LGCh": 143, "SK Name": "NHK World Premium", "SKCh": 278, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/ZSHeMzp.png", "Source": "NAVER", "ServiceId": "815432", "Enabled": 0 }, +{ "Id": 141, "Name": "니켈로디언", "KT Name": "니켈로디언", "KTCh": 136, "LG Name": "니켈로디언", "LGCh": 154, "SK Name": "Nickelodeon", "SKCh": 176, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/6pWpFCX.png", "Source": "SKY", "ServiceId": "685", "Enabled": 0 }, +{ "Id": 142, "Name": "놀티비", "KT Name": "놀티비", "KTCh": 128, "LG Name": "놀TV", "LGCh": 92, "SK Name": "Noll TV", "SKCh": 248, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/IK9h4rw.png", "Source": "HCN", "ServiceId": "923", "Enabled": 0 }, +{ "Id": 143, "Name": "NS Shop+", "KT Name": "NS Shop+", "KTCh": 42, "LG Name": "", "LGCh": null, "SK Name": "NS Shop+", "SKCh": 41, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/ipGXgEK.png", "Source": "SK", "ServiceId": "341", "Enabled": 0 }, +{ "Id": 144, "Name": "NS홈쇼핑", "KT Name": "NS홈쇼핑", "KTCh": 12, "LG Name": "NS홈쇼핑", "LGCh": 13, "SK Name": "NS홈쇼핑", "SKCh": 14, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/UD1yoj1.png", "Source": "ISCS", "ServiceId": "12", "Enabled": 0 }, +{ "Id": 147, "Name": "O tvN", "KT Name": "O tvn", "KTCh": 45, "LG Name": "O tvN", "LGCh": 71, "SK Name": "O tvN", "SKCh": 34, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/0SMl3O5.png", "Source": "SKY", "ServiceId": "555", "Enabled": 0 }, +{ "Id": 148, "Name": "올리브", "KT Name": "올리브", "KTCh": 34, "LG Name": "올리브", "LGCh": 82, "SK Name": "올리브", "SKCh": 84, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/5kF0Ypt.png", "Source": "EPG", "ServiceId": "15", "Enabled": 0 }, +{ "Id": 149, "Name": "OBS", "KT Name": "OBS", "KTCh": 26, "LG Name": "OBS", "LGCh": 26, "SK Name": "OBS", "SKCh": 20, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/DJHN8M6.png", "Source": "SKY", "ServiceId": "935", "Enabled": 0 }, +{ "Id": 150, "Name": "HD OBS W", "KT Name": "HD OBS W", "KTCh": 81, "LG Name": "OBS W", "LGCh": 137, "SK Name": "OBSW", "SKCh": 219, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/uZkbU7b.png", "Source": "LG", "ServiceId": "648", "Enabled": 0 }, +{ "Id": 151, "Name": "OCN", "KT Name": "OCN", "KTCh": 21, "LG Name": "OCN", "LGCh": 38, "SK Name": "OCN", "SKCh": 54, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/IXh6dwo.png", "Source": "SKY", "ServiceId": "847", "Enabled": 0 }, +{ "Id": 153, "Name": "OGN", "KT Name": "OGN", "KTCh": 123, "LG Name": "OGN", "LGCh": 96, "SK Name": "OGN", "SKCh": 136, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/tLtSTaq.png", "Source": "SKY", "ServiceId": "55", "Enabled": 0 }, +{ "Id": 154, "Name": "온스타일", "KT Name": "온스타일", "KTCh": 77, "LG Name": "온스타일", "LGCh": 73, "SK Name": "On style", "SKCh": 210, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/9brMDfR.png", "Source": "HCN", "ServiceId": "414", "Enabled": 0 }, +{ "Id": 156, "Name": "ONT", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "ONT", "SKCh": 245, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/2lu0ZBu.png", "Source": "SK", "ServiceId": "256", "Enabled": 0 }, +{ "Id": 157, "Name": "OUN", "KT Name": "OUN", "KTCh": 160, "LG Name": "OUN", "LGCh": 170, "SK Name": "OUN", "SKCh": 292, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/VimbcIH.png", "Source": "EPG", "ServiceId": "47", "Enabled": 0 }, +{ "Id": 158, "Name": "Outdoor", "KT Name": "", "KTCh": null, "LG Name": "아웃도어 채널", "LGCh": 135, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/4M65Rrv.png", "Source": "LG", "ServiceId": "710", "Enabled": 0 }, +{ "Id": 159, "Name": "Playboy TV", "KT Name": "Playboy TV", "KTCh": 206, "LG Name": "플레이보이", "LGCh": 190, "SK Name": "플레이보이TV", "SKCh": 320, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/NglRqcV.png", "Source": "EPG", "ServiceId": "146", "Enabled": 0 }, +{ "Id": 160, "Name": "리얼TV", "KT Name": "리얼TV", "KTCh": 127, "LG Name": "", "LGCh": null, "SK Name": "리얼TV", "SKCh": 267, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/PYnXtlb.png", "Source": "SK", "ServiceId": "440", "Enabled": 0 }, +{ "Id": 164, "Name": "SBS", "KT Name": "SBS", "KTCh": 5, "LG Name": "SBS", "LGCh": 5, "SK Name": "SBS", "SKCh": 5, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/K2ztoDT.png", "Source": "SKY", "ServiceId": "794", "Enabled": 1 }, +{ "Id": 165, "Name": "SBS CNBC", "KT Name": "SBS CNBC", "KTCh": 25, "LG Name": "SBS CNBC", "LGCh": 27, "SK Name": "SBS CNBC", "SKCh": 26, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/SfDs4qN.png", "Source": "POOQ", "ServiceId": "S06", "Enabled": 0 }, +{ "Id": 166, "Name": "SBS funE", "KT Name": "SBS funE", "KTCh": 43, "LG Name": "SBS퍼니", "LGCh": 75, "SK Name": "SBS fun E", "SKCh": 81, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/D1EYJmr.png", "Source": "POOQ", "ServiceId": "S04", "Enabled": 0 }, +{ "Id": 167, "Name": "SBSGOLF", "KT Name": "SBSGOLF", "KTCh": 57, "LG Name": "SBS골프", "LGCh": 53, "SK Name": "SBS GOLF", "SKCh": 131, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/HdS0GNV.png", "Source": "SKY", "ServiceId": "769", "Enabled": 0 }, +{ "Id": 168, "Name": "SBS MTV", "KT Name": "SBS MTV", "KTCh": 96, "LG Name": "SBS MTV", "LGCh": 100, "SK Name": "SBS MTV", "SKCh": 230, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/OeSJ9Ik.png", "Source": "POOQ", "ServiceId": "S03", "Enabled": 0 }, +{ "Id": 169, "Name": "SBS Sports", "KT Name": "SBS Sports", "KTCh": 58, "LG Name": "SBS스포츠", "LGCh": 58, "SK Name": "SBS Sports", "SKCh": 122, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/j1vHAu6.png", "Source": "POOQ", "ServiceId": "S02", "Enabled": 0 }, +{ "Id": 170, "Name": "SBS Plus", "KT Name": "SBS Plus", "KTCh": 37, "LG Name": "SBS플러스", "LGCh": 33, "SK Name": "SBS 플러스", "SKCh": 2, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/asfyrTm.png", "Source": "POOQ", "ServiceId": "S03", "Enabled": 0 }, +{ "Id": 171, "Name": "스크린", "KT Name": "스크린", "KTCh": 106, "LG Name": "스크린", "LGCh": 41, "SK Name": "Screen", "SKCh": 56, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/lTK9VD4.png", "Source": "SKB", "ServiceId": "192", "Enabled": 0 }, +{ "Id": 172, "Name": "SkyA&C", "KT Name": "SkyA&C", "KTCh": 80, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/cljag6U.png", "Source": "SKY", "ServiceId": "514", "Enabled": 0 }, +{ "Id": 173, "Name": "SkyDrama", "KT Name": "SkyDrama", "KTCh": 31, "LG Name": "스카이드라마", "LGCh": 79, "SK Name": "sky Drama", "SKCh": 40, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/e9BTUAb.png", "Source": "SKY", "ServiceId": "783", "Enabled": 0 }, +{ "Id": 174, "Name": "SkyENT", "KT Name": "SkyENT", "KTCh": 50, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/ALqDHH6.png", "Source": "SKY", "ServiceId": "970", "Enabled": 0 }, +{ "Id": 175, "Name": "Sky힐링", "KT Name": "Sky힐링", "KTCh": 167, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/64SK0o9.png", "Source": "SKY", "ServiceId": "40", "Enabled": 0 }, +{ "Id": 176, "Name": "SkyICT", "KT Name": "SkyICT", "KTCh": 165, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/luZjU1e.png", "Source": "SKY", "ServiceId": "568", "Enabled": 0 }, +{ "Id": 177, "Name": "SkyPetPark", "KT Name": "SkyPetPark", "KTCh": 49, "LG Name": "", "LGCh": null, "SK Name": "Sky Petpark", "SKCh": 94, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/RDUfvRG.png", "Source": "SKY", "ServiceId": "513", "Enabled": 0 }, +{ "Id": 178, "Name": "SkySports", "KT Name": "SkySports", "KTCh": 54, "LG Name": "스카이스포츠", "LGCh": 57, "SK Name": "sky Sports", "SKCh": 125, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/QHV9bdA.png", "Source": "SKY", "ServiceId": "447", "Enabled": 0 }, +{ "Id": 179, "Name": "SkyTravel", "KT Name": "SkyTravel", "KTCh": 100, "LG Name": "스카이트래블", "LGCh": 66, "SK Name": "sky Travel", "SKCh": 246, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/fAJgmna.png", "Source": "SKY", "ServiceId": "934", "Enabled": 0 }, +{ "Id": 181, "Name": "Sky UHD", "KT Name": "Sky UHD", "KTCh": 174, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/BNxE2zT.png", "Source": "SKY", "ServiceId": "500", "Enabled": 0 }, +{ "Id": 182, "Name": "Smile TV", "KT Name": "Smile TV", "KTCh": 84, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/alk8plD.png", "Source": "KT", "ServiceId": "84", "Enabled": 0 }, +{ "Id": 183, "Name": "SPOTV", "KT Name": "SPOTV", "KTCh": 51, "LG Name": "스포티비", "LGCh": 56, "SK Name": "SPOTV", "SKCh": 120, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/cIpIf6b.png", "Source": "SKY", "ServiceId": "109", "Enabled": 0 }, +{ "Id": 184, "Name": "SPOTV Games", "KT Name": "SPOTV Games", "KTCh": 124, "LG Name": "스포티비 게임즈", "LGCh": 109, "SK Name": "SPOTV GAMES", "SKCh": 137, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/5IMfa6N.png", "Source": "NAVER", "ServiceId": "1876333", "Enabled": 0 }, +{ "Id": 185, "Name": "SPOTV+", "KT Name": "SPOTV+", "KTCh": 125, "LG Name": "스포티비+", "LGCh": 51, "SK Name": "SPOTV+", "SKCh": 127, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/81Fshnn.png", "Source": "SKY", "ServiceId": "713", "Enabled": 0 }, +{ "Id": 186, "Name": "SPOTV2", "KT Name": "SPOTV2", "KTCh": 52, "LG Name": "스포티비2", "LGCh": 52, "SK Name": "SPOTV2", "SKCh": 128, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/GNicmGY.png", "Source": "NAVER", "ServiceId": "5286701", "Enabled": 0 }, +{ "Id": 192, "Name": "Star Sports", "KT Name": "Star Sports", "KTCh": 63, "LG Name": "", "LGCh": null, "SK Name": "Star Sports", "SKCh": 135, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/8ndGr4n.png", "Source": "EPG", "ServiceId": "122", "Enabled": 0 }, +{ "Id": 193, "Name": "STB상생방송", "KT Name": "STB상생방송", "KTCh": 261, "LG Name": "상생방송", "LGCh": 187, "SK Name": "STB 상생방송", "SKCh": 308, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/Z3Xknso.png", "Source": "HCN", "ServiceId": "779", "Enabled": 0 }, +{ "Id": 194, "Name": "STN", "KT Name": "STN", "KTCh": 267, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/ZJi3NQy.png", "Source": "KT", "ServiceId": "267", "Enabled": 0 }, +{ "Id": 196, "Name": "슈퍼액션", "KT Name": "슈퍼액션", "KTCh": 32, "LG Name": "수퍼액션", "LGCh": 40, "SK Name": "SUPER ACTION", "SKCh": 55, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/D9PzDBr.png", "Source": "SKY", "ServiceId": "129", "Enabled": 0 }, +{ "Id": 197, "Name": "tag TV", "KT Name": "tag TV", "KTCh": 94, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/Mmc89FS.png", "Source": "KT", "ServiceId": "94", "Enabled": 0 }, +{ "Id": 198, "Name": "tbsTV", "KT Name": "tbsTV", "KTCh": 214, "LG Name": "tbsTV", "LGCh": 176, "SK Name": "tbsTV", "SKCh": 272, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/o3MWHfb.png", "Source": "SK", "ServiceId": "420", "Enabled": 0 }, +{ "Id": 199, "Name": "텔레노벨라", "KT Name": "텔레노벨라", "KTCh": 114, "LG Name": "텔레노벨라", "LGCh": 81, "SK Name": "텔레노벨라", "SKCh": 109, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/Ea3Vu8Z.png", "Source": "LG", "ServiceId": "700", "Enabled": 0 }, +{ "Id": 200, "Name": "The Golf Channel", "KT Name": "The Golf Channel", "KTCh": 55, "LG Name": "더 골프채널 코리아", "LGCh": 55, "SK Name": "Golf Channel Korea", "SKCh": 133, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/3VlCrJ7.png", "Source": "SK", "ServiceId": "135", "Enabled": 0 }, +{ "Id": 201, "Name": "THE MOVIE", "KT Name": "THE MOVIE", "KTCh": 104, "LG Name": "더 무비", "LGCh": 47, "SK Name": "The Movie", "SKCh": 59, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/6vzmEfd.png", "Source": "HCN", "ServiceId": "165", "Enabled": 0 }, +{ "Id": 202, "Name": "Tooniverse", "KT Name": "Tooniverse", "KTCh": 132, "LG Name": "투니버스", "LGCh": 152, "SK Name": "Tooniverse", "SKCh": 170, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/VUqSOjx.png", "Source": "SKY", "ServiceId": "526", "Enabled": 0 }, +{ "Id": 203, "Name": "TRENDY", "KT Name": "TRENDY", "KTCh": 251, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/NP2KTGN.png", "Source": "KT", "ServiceId": "251", "Enabled": 0 }, +{ "Id": 205, "Name": "TV5MONDE", "KT Name": "TV5MONDE", "KTCh": 198, "LG Name": "", "LGCh": null, "SK Name": "TV5Monde", "SKCh": 279, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/NogUKpP.png", "Source": "HCN", "ServiceId": "612", "Enabled": 0 }, +{ "Id": 207, "Name": "tvN", "KT Name": "tvN", "KTCh": 17, "LG Name": "tvN", "LGCh": 17, "SK Name": "tvN", "SKCh": 17, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/OJ9A8fZ.png", "Source": "SKY", "ServiceId": "60", "Enabled": 0 }, +{ "Id": 208, "Name": "TV조선", "KT Name": "TV조선", "KTCh": 19, "LG Name": "TV조선", "LGCh": 19, "SK Name": "TV조선", "SKCh": 19, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/ShJ5joR.png", "Source": "POOQ", "ServiceId": "C2601", "Enabled": 0 }, +{ "Id": 212, "Name": "viki", "KT Name": "viki", "KTCh": 204, "LG Name": "비키", "LGCh": 192, "SK Name": "Viki", "SKCh": 322, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/ZVD51K9.png", "Source": "EPG", "ServiceId": "86", "Enabled": 0 }, +{ "Id": 213, "Name": "W 쇼핑", "KT Name": "W 쇼핑", "KTCh": 40, "LG Name": "", "LGCh": null, "SK Name": "W쇼핑", "SKCh": 37, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/Cged9ve.png", "Source": "SK", "ServiceId": "342", "Enabled": 0 }, +{ "Id": 215, "Name": "WBS원음방송", "KT Name": "원음방송", "KTCh": 284, "LG Name": "원음방송", "LGCh": 188, "SK Name": "원음방송", "SKCh": 309, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/mKWQE7z.png", "Source": "EPG", "ServiceId": "644", "Enabled": 0 }, +{ "Id": 216, "Name": "XTM", "KT Name": "XTM", "KTCh": 76, "LG Name": "XTM", "LGCh": 72, "SK Name": "XTM", "SKCh": 85, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/hGwA39y.png", "Source": "EPG", "ServiceId": "388", "Enabled": 0 }, +{ "Id": 218, "Name": "YTN", "KT Name": "YTN", "KTCh": 24, "LG Name": "YTN", "LGCh": 24, "SK Name": "YTN", "SKCh": 24, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/ByeeX5e.png", "Source": "POOQ", "ServiceId": "C2101", "Enabled": 0 }, +{ "Id": 219, "Name": "YTN 사이언스", "KT Name": "YTN 사이언스", "KTCh": 175, "LG Name": "사이언스TV", "LGCh": 25, "SK Name": "YTN 사이언스", "SKCh": 262, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/gwDHYGf.png", "Source": "SKB", "ServiceId": "422", "Enabled": 0 }, +{ "Id": 220, "Name": "YTN life", "KT Name": "YTN life", "KTCh": 190, "LG Name": "YTN 라이프", "LGCh": 125, "SK Name": "YTN 라이프", "SKCh": 157, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/f66yRT9.png", "Source": "SK", "ServiceId": "632", "Enabled": 0 }, +{ "Id": 221, "Name": "가요TV", "KT Name": "가요TV", "KTCh": 93, "LG Name": "가요TV", "LGCh": 102, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/6ncOOSg.png", "Source": "ISCS", "ServiceId": "356", "Enabled": 0 }, +{ "Id": 222, "Name": "국방TV", "KT Name": "국방TV", "KTCh": 260, "LG Name": "국방TV", "LGCh": 174, "SK Name": "국방TV", "SKCh": 282, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/yyXkYzJ.png", "Source": "ISCS", "ServiceId": "114", "Enabled": 0 }, +{ "Id": 223, "Name": "국회방송", "KT Name": "국회방송", "KTCh": 65, "LG Name": "국회방송", "LGCh": 172, "SK Name": "국회방송", "SKCh": 291, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/l1OEn7O.png", "Source": "LG", "ServiceId": "717", "Enabled": 0 }, +{ "Id": 225, "Name": "내외경제TV", "KT Name": "내외경제TV", "KTCh": 285, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/cQHPmCw.png", "Source": "KT", "ServiceId": "285", "Enabled": 0 }, +{ "Id": 226, "Name": "다문화티브이", "KT Name": "다문화티브이", "KTCh": 283, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/nZK3lCC.png", "Source": "KT", "ServiceId": "283", "Enabled": 0 }, +{ "Id": 228, "Name": "대교 어린이TV", "KT Name": "대교 어린이TV", "KTCh": 141, "LG Name": "어린이TV", "LGCh": 156, "SK Name": "어린이TV", "SKCh": 191, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/CETWIE6.png", "Source": "SKY", "ServiceId": "17", "Enabled": 0 }, +{ "Id": 229, "Name": "동아TV", "KT Name": "동아TV", "KTCh": 82, "LG Name": "동아TV", "LGCh": 84, "SK Name": "동아TV", "SKCh": 218, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/AlmV8jS.png", "Source": "HCN", "ServiceId": "247", "Enabled": 0 }, +{ "Id": 230, "Name": "드라마H", "KT Name": "드라마H", "KTCh": 70, "LG Name": "", "LGCh": null, "SK Name": "드라마H", "SKCh": 46, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/xT7pVuI.png", "Source": "SKY", "ServiceId": "287", "Enabled": 0 }, +{ "Id": 231, "Name": "드라마큐브", "KT Name": "드라마큐브", "KTCh": 46, "LG Name": "", "LGCh": null, "SK Name": "드라마큐브", "SKCh": 36, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/4ESaIH6.png", "Source": "HCN", "ServiceId": "499", "Enabled": 0 }, +{ "Id": 232, "Name": "드라맥스", "KT Name": "드라맥스", "KTCh": 47, "LG Name": "", "LGCh": null, "SK Name": "드라맥스", "SKCh": 38, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/jcguamX.png", "Source": "NAVER", "ServiceId": "814782", "Enabled": 0 }, +{ "Id": 233, "Name": "디원", "KT Name": "디원", "KTCh": 115, "LG Name": "디원", "LGCh": 90, "SK Name": "디원", "SKCh": 45, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/8nE7mmk.png", "Source": "LG", "ServiceId": "666", "Enabled": 0 }, +{ "Id": 234, "Name": "디즈니주니어", "KT Name": "디즈니주니어", "KTCh": 151, "LG Name": "디즈니 주니어", "LGCh": 151, "SK Name": "디즈니주니어", "SKCh": 172, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/EGiEKhj.png", "Source": "SKY", "ServiceId": "504", "Enabled": 0 }, +{ "Id": 235, "Name": "Disney Channel", "KT Name": "Disney Channel", "KTCh": 130, "LG Name": "디즈니 채널", "LGCh": 150, "SK Name": "디즈니채널", "SKCh": 171, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/qZdqeZo.png", "Source": "SKY", "ServiceId": "503", "Enabled": 0 }, +{ "Id": 237, "Name": "롯데원티비", "KT Name": "롯데원티비", "KTCh": 44, "LG Name": "롯데 OneTV", "LGCh": 21, "SK Name": "롯데OneTV", "SKCh": 39, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/vri0qlq.png", "Source": "EPG", "ServiceId": "548", "Enabled": 0 }, +{ "Id": 238, "Name": "롯데홈쇼핑", "KT Name": "롯데홈쇼핑", "KTCh": 6, "LG Name": "롯데홈쇼핑", "LGCh": 12, "SK Name": "롯데홈쇼핑", "SKCh": 10, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/2bCfj0y.png", "Source": "ISCS", "ServiceId": "3", "Enabled": 0 }, +{ "Id": 239, "Name": "리빙TV", "KT Name": "리빙TV", "KTCh": 276, "LG Name": "", "LGCh": null, "SK Name": "리빙TV", "SKCh": 251, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/0jGCpfx.png", "Source": "EPG", "ServiceId": "28", "Enabled": 0 }, +{ "Id": 240, "Name": "마이펫TV", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "마이펫TV", "SKCh": 92, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/Oy7qjnW.png", "Source": "SK", "ServiceId": "258", "Enabled": 0 }, +{ "Id": 241, "Name": "매일경제TV", "KT Name": "매일경제TV", "KTCh": 182, "LG Name": "매일경제TV", "LGCh": 112, "SK Name": "매일경제TV", "SKCh": 153, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/a4PwnPm.png", "Source": "EPG", "ServiceId": "594", "Enabled": 0 }, +{ "Id": 244, "Name": "미드나잇", "KT Name": "미드나잇", "KTCh": 205, "LG Name": "미드나잇", "LGCh": 191, "SK Name": "미드나잇", "SKCh": 321, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/zLJHU3J.png", "Source": "EPG", "ServiceId": "169", "Enabled": 0 }, +{ "Id": 245, "Name": "바둑TV", "KT Name": "바둑TV", "KTCh": 120, "LG Name": "바둑TV", "LGCh": 97, "SK Name": "바둑TV", "SKCh": 240, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/jbRu8T2.png", "Source": "EPG", "ServiceId": "46", "Enabled": 0 }, +{ "Id": 246, "Name": "법률방송", "KT Name": "법률방송", "KTCh": 213, "LG Name": "", "LGCh": null, "SK Name": "법률방송", "SKCh": 280, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/WJaHOAP.png", "Source": "ISCS", "ServiceId": "149", "Enabled": 0 }, +{ "Id": 247, "Name": "복지TV", "KT Name": "복지TV", "KTCh": 219, "LG Name": "복지TV", "LGCh": 173, "SK Name": "복지TV", "SKCh": 293, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/cTV0rnb.png", "Source": "ISCS", "ServiceId": "344", "Enabled": 0 }, +{ "Id": 249, "Name": "부동산토마토", "KT Name": "부동산토마토", "KTCh": 188, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/ePLp200.png", "Source": "KT", "ServiceId": "188", "Enabled": 0 }, +{ "Id": 250, "Name": "부메랑", "KT Name": "부메랑", "KTCh": 139, "LG Name": "부메랑", "LGCh": 166, "SK Name": "부메랑", "SKCh": 175, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/GSPRJqf.png", "Source": "NAVER", "ServiceId": "815072", "Enabled": 0 }, +{ "Id": 251, "Name": "브레인TV", "KT Name": "브레인TV", "KTCh": 122, "LG Name": "브레인TV", "LGCh": 98, "SK Name": "브레인TV", "SKCh": 242, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/1422kP1.png", "Source": "EPG", "ServiceId": "488", "Enabled": 0 }, +{ "Id": 253, "Name": "사회안전방송", "KT Name": "사회안전방송", "KTCh": 278, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/EEfrqCW.png", "Source": "NAVER", "ServiceId": "815484", "Enabled": 0 }, +{ "Id": 254, "Name": "생활체육TV", "KT Name": "생활체육TV", "KTCh": 282, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/gefY5Bw.png", "Source": "NAVER", "ServiceId": "814883", "Enabled": 0 }, +{ "Id": 255, "Name": "서울경제TV", "KT Name": "서울경제TV", "KTCh": 184, "LG Name": "서울경제TV", "LGCh": 124, "SK Name": "서울경제TV", "SKCh": 156, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/LBzj77k.png", "Source": "ISCS", "ServiceId": "24", "Enabled": 0 }, +{ "Id": 256, "Name": "소비자TV", "KT Name": "소비자TV", "KTCh": 265, "LG Name": "소비자TV", "LGCh": 177, "SK Name": "소비자TV", "SKCh": 275, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/971hUD2.png", "Source": "SKB", "ServiceId": "442", "Enabled": 0 }, +{ "Id": 257, "Name": "소상공인방송", "KT Name": "소상공인방송", "KTCh": 255, "LG Name": "소상공인방송", "LGCh": 175, "SK Name": "소상공인방송", "SKCh": 271, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/3k1D4LA.png", "Source": "ISCS", "ServiceId": "1395", "Enabled": 0 }, +{ "Id": 258, "Name": "쇼핑엔T", "KT Name": "쇼핑엔티", "KTCh": 33, "LG Name": "쇼핑엔티", "LGCh": 76, "SK Name": "쇼핑엔티", "SKCh": 35, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/Q7FHxYB.png", "Source": "SK", "ServiceId": "336", "Enabled": 0 }, +{ "Id": 260, "Name": "신세계쇼핑", "KT Name": "신세계쇼핑", "KTCh": 2, "LG Name": "신세계쇼핑", "LGCh": 74, "SK Name": "신세계쇼핑", "SKCh": 22, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/ZhYaqpt.png", "Source": "SK", "ServiceId": "339", "Enabled": 0 }, +{ "Id": 262, "Name": "실버아이TV", "KT Name": "실버아이TV", "KTCh": 266, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/xm1O8eQ.png", "Source": "ISCS", "ServiceId": "357", "Enabled": 0 }, +{ "Id": 263, "Name": "아리랑 TV", "KT Name": "아리랑 TV", "KTCh": 200, "LG Name": "아리랑TV", "LGCh": 141, "SK Name": "아리랑TV", "SKCh": 270, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/nFWWIFP.png", "Source": "ISCS", "ServiceId": "17", "Enabled": 0 }, +{ "Id": 264, "Name": "아시아경제TV", "KT Name": "아시아경제TV", "KTCh": 186, "LG Name": "아시아경제TV", "LGCh": 113, "SK Name": "아시아경제TV", "SKCh": 154, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/2D6WoS8.png", "Source": "ISCS", "ServiceId": "1348", "Enabled": 0 }, +{ "Id": 265, "Name": "아임쇼핑", "KT Name": "아임쇼핑", "KTCh": 22, "LG Name": "아임쇼핑", "LGCh": 20, "SK Name": "아임쇼핑", "SKCh": 3, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/E3pJ5Jz.png", "Source": "SK", "ServiceId": "332", "Enabled": 0 }, +{ "Id": 266, "Name": "애니플러스", "KT Name": "애니플러스", "KTCh": 138, "LG Name": "애니플러스", "LGCh": 149, "SK Name": "애니플러스", "SKCh": 178, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/7RKoOZq.png", "Source": "SKY", "ServiceId": "348", "Enabled": 0 }, +{ "Id": 268, "Name": "연합뉴스TV", "KT Name": "연합뉴스TV", "KTCh": 23, "LG Name": "연합뉴스TV", "LGCh": 23, "SK Name": "연합뉴스TV", "SKCh": 23, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/KlTCP8V.png", "Source": "POOQ", "ServiceId": "Y01", "Enabled": 0 }, +{ "Id": 271, "Name": "육아방송", "KT Name": "육아방송", "KTCh": 217, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/UEIB4ZG.png", "Source": "EPG", "ServiceId": "252", "Enabled": 0 }, +{ "Id": 272, "Name": "이데일리TV", "KT Name": "이데일리TV", "KTCh": 183, "LG Name": "이데일리TV", "LGCh": 123, "SK Name": "이데일리TV", "SKCh": 155, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/W90Hw2p.png", "Source": "LG", "ServiceId": "631", "Enabled": 0 }, +{ "Id": 273, "Name": "이벤트TV", "KT Name": "이벤트TV", "KTCh": 263, "LG Name": "이벤트TV", "LGCh": 103, "SK Name": "이벤트TV", "SKCh": 238, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/1Eeyijd.png", "Source": "SKB", "ServiceId": "262", "Enabled": 0 }, +{ "Id": 275, "Name": "인디필름", "KT Name": "인디필름", "KTCh": 277, "LG Name": "", "LGCh": null, "SK Name": "인디필름", "SKCh": 61, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/iA5UIJ9.png", "Source": "SKB", "ServiceId": "441", "Enabled": 0 }, +{ "Id": 277, "Name": "정철영어 TV", "KT Name": "정철영어 TV", "KTCh": 155, "LG Name": "정철영어TV", "LGCh": 161, "SK Name": "정철영어TV", "SKCh": 201, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/lumUZz3.png", "Source": "LG", "ServiceId": "772", "Enabled": 0 }, +{ "Id": 278, "Name": "중화TV", "KT Name": "중화TV", "KTCh": 110, "LG Name": "중화TV", "LGCh": 87, "SK Name": "중화TV", "SKCh": 104, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/Nal18s5.png", "Source": "SKB", "ServiceId": "186", "Enabled": 0 }, +{ "Id": 279, "Name": "JJC지방자치TV", "KT Name": "JJC지방자치TV", "KTCh": 279, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/AuXr9jA.png", "Source": "NAVER", "ServiceId": "3244879", "Enabled": 0 }, +{ "Id": 280, "Name": "채널 Ching", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "채널 Ching", "SKCh": 105, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/tRqGKcS.png", "Source": "HCN", "ServiceId": "780", "Enabled": 0 }, +{ "Id": 281, "Name": "채널A", "KT Name": "채널A", "KTCh": 18, "LG Name": "채널A", "LGCh": 18, "SK Name": "채널A", "SKCh": 18, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/xti35f5.png", "Source": "POOQ", "ServiceId": "C2501", "Enabled": 0 }, +{ "Id": 282, "Name": "채널A 플러스", "KT Name": "채널A 플러스", "KTCh": 98, "LG Name": "채널A+", "LGCh": 115, "SK Name": "채널A 플러스", "SKCh": 97, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/rRisTh8.png", "Source": "SKB", "ServiceId": "891", "Enabled": 0 }, +{ "Id": 283, "Name": "채널CGV", "KT Name": "채널CGV", "KTCh": 29, "LG Name": "채널CGV", "LGCh": 39, "SK Name": "Ch CGV", "SKCh": 53, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/fwjRwkx.png", "Source": "SKY", "ServiceId": "163", "Enabled": 0 }, +{ "Id": 284, "Name": "채널i", "KT Name": "채널i", "KTCh": 250, "LG Name": "", "LGCh": null, "SK Name": "채널i", "SKCh": 281, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/X7lXvtw.png", "Source": "ISCS", "ServiceId": "1397", "Enabled": 0 }, +{ "Id": 285, "Name": "채널뷰", "KT Name": "채널뷰", "KTCh": 176, "LG Name": "", "LGCh": null, "SK Name": "채널View", "SKCh": 212, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/lvtWgFL.png", "Source": "SKY", "ServiceId": "918", "Enabled": 0 }, +{ "Id": 286, "Name": "채널차이나", "KT Name": "채널차이나", "KTCh": 102, "LG Name": "채널차이나", "LGCh": 80, "SK Name": "채널차이나", "SKCh": 108, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/jEyoLS1.png", "Source": "ISCS", "ServiceId": "1066", "Enabled": 0 }, +{ "Id": 287, "Name": "채널해피독", "KT Name": "채널해피독", "KTCh": 203, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/ly649tS.png", "Source": "NAVER", "ServiceId": "2296260", "Enabled": 0 }, +{ "Id": 289, "Name": "카툰네트워크", "KT Name": "카툰네트워크", "KTCh": 137, "LG Name": "카툰네트워크", "LGCh": 155, "SK Name": "카툰네트워크", "SKCh": 177, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/cJZHPjr.png", "Source": "SKY", "ServiceId": "358", "Enabled": 0 }, +{ "Id": 290, "Name": "캐치온1", "KT Name": "캐치온1", "KTCh": 66, "LG Name": "캐치온1", "LGCh": 48, "SK Name": "CATCH ON 1", "SKCh": 51, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/qK9KkRd.png", "Source": "EPG", "ServiceId": "31", "Enabled": 0 }, +{ "Id": 291, "Name": "캐치온2", "KT Name": "캐치온2", "KTCh": 67, "LG Name": "캐치온2", "LGCh": 49, "SK Name": "CATCH ON 2", "SKCh": 52, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/sLc2req.png", "Source": "EPG", "ServiceId": "161", "Enabled": 0 }, +{ "Id": 292, "Name": "브릿지TV", "KT Name": "브릿지TV", "KTCh": 270, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/KATTup7.png", "Source": "KT", "ServiceId": "207", "Enabled": 0 }, +{ "Id": 293, "Name": "코미디TV", "KT Name": "코미디TV", "KTCh": 85, "LG Name": "", "LGCh": null, "SK Name": "코미디TV", "SKCh": 87, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/DHbUoDm.png", "Source": "SKY", "ServiceId": "100", "Enabled": 0 }, +{ "Id": 294, "Name": "쿠키건강TV", "KT Name": "쿠키건강TV", "KTCh": 220, "LG Name": "쿠키건강TV", "LGCh": 144, "SK Name": "쿠키건강TV", "SKCh": 269, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/4gl92D1.png", "Source": "EPG", "ServiceId": "735", "Enabled": 0 }, +{ "Id": 296, "Name": "키즈원", "KT Name": "키즈원", "KTCh": 148, "LG Name": "키즈원", "LGCh": 157, "SK Name": "KIDS1", "SKCh": 193, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/f8T1Sw4.png", "Source": "NAVER", "ServiceId": "815020", "Enabled": 0 }, +{ "Id": 297, "Name": "토마토TV", "KT Name": "토마토TV", "KTCh": 185, "LG Name": "토마토TV", "LGCh": 111, "SK Name": "토마토TV", "SKCh": 150, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/dVWy3Ex.png", "Source": "SK", "ServiceId": "620", "Enabled": 0 }, +{ "Id": 299, "Name": "펜트하우스tv", "KT Name": "펜트하우스tv", "KTCh": 208, "LG Name": "", "LGCh": null, "SK Name": "펜트하우스TV", "SKCh": 324, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/03U2Ges.png", "Source": "EPG", "ServiceId": "599", "Enabled": 0 }, +{ "Id": 301, "Name": "가톨릭평화방송", "KT Name": "가톨릭평화방송", "KTCh": 231, "LG Name": "가톨릭평화방송", "LGCh": 184, "SK Name": "가톨릭평화방송", "SKCh": 307, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/G5fTCL3.png", "Source": "HCN", "ServiceId": "33", "Enabled": 0 }, +{ "Id": 302, "Name": "폴라리스TV", "KT Name": "폴라리스TV", "KTCh": 129, "LG Name": "폴라리스 TV", "LGCh": 67, "SK Name": "폴라리스TV", "SKCh": 249, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/aghufJ7.png", "Source": "SK", "ServiceId": "252", "Enabled": 0 }, +{ "Id": 303, "Name": "한국경제TV", "KT Name": "한국경제TV", "KTCh": 180, "LG Name": "한국경제TV", "LGCh": 121, "SK Name": "한국경제TV", "SKCh": 151, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/ChnD0FT.png", "Source": "ISCS", "ServiceId": "197", "Enabled": 0 }, +{ "Id": 305, "Name": "한국승마방송", "KT Name": "한국승마방송", "KTCh": 259, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/VZdQLwj.png", "Source": "NAVER", "ServiceId": "814904", "Enabled": 0 }, +{ "Id": 307, "Name": "한국직업방송", "KT Name": "한국직업방송", "KTCh": 252, "LG Name": "", "LGCh": null, "SK Name": "한국직업방송", "SKCh": 273, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/WUvf0If.png", "Source": "ISCS", "ServiceId": "1325", "Enabled": 0 }, +{ "Id": 309, "Name": "허니TV", "KT Name": "허니TV", "KTCh": 207, "LG Name": "허니TV", "LGCh": 193, "SK Name": "허니TV", "SKCh": 323, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/KczRCLW.png", "Source": "EPG", "ServiceId": "112", "Enabled": 0 }, +{ "Id": 311, "Name": "헬스메디tv", "KT Name": "헬스메디tv", "KTCh": 271, "LG Name": "헬스메디TV", "LGCh": 138, "SK Name": "헬스메디TV", "SKCh": 268, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/vsxRuFh.png", "Source": "ISCS", "ServiceId": "1419", "Enabled": 0 }, +{ "Id": 312, "Name": "현대홈쇼핑", "KT Name": "현대홈쇼핑", "KTCh": 10, "LG Name": "현대홈쇼핑", "LGCh": 10, "SK Name": "현대홈쇼핑", "SKCh": 8, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/87fdrA5.png", "Source": "ISCS", "ServiceId": "8", "Enabled": 0 }, +{ "Id": 313, "Name": "현대홈쇼핑+샵", "KT Name": "현대홈쇼핑+샵", "KTCh": 36, "LG Name": "현대홈쇼핑+샵", "LGCh": 34, "SK Name": "현대홈쇼핑+Shop", "SKCh": 31, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/COo8Bcm.png", "Source": "SK", "ServiceId": "337", "Enabled": 0 }, +{ "Id": 314, "Name": "홈&쇼핑", "KT Name": "홈&쇼핑", "KTCh": 14, "LG Name": "홈앤쇼핑", "LGCh": 4, "SK Name": "홈&쇼핑", "SKCh": 4, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/nLxw0LW.png", "Source": "ISCS", "ServiceId": "1028", "Enabled": 0 }, +{ "Id": 315, "Name": "환경TV", "KT Name": "환경TV", "KTCh": 166, "LG Name": "", "LGCh": null, "SK Name": "환경TV", "SKCh": 276, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/eITOr2Y.png", "Source": "HCN", "ServiceId": "29", "Enabled": 0 }, +{ "Id": 316, "Name": "Life N", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "Life N", "SKCh": 215, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/qNde2j7.png", "Source": "SKB", "ServiceId": "277", "Enabled": 0 }, +{ "Id": 317, "Name": "Discovery HD", "KT Name": "", "KTCh": null, "LG Name": "디스커버리 아시아", "LGCh": 133, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/bH9BY7E.png", "Source": "SKY", "ServiceId": "929", "Enabled": 0 }, +{ "Id": 318, "Name": "Celestial Movies", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "Celestial Movies", "SKCh": 62, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/xDXM13Q.png", "Source": "SKB", "ServiceId": "877", "Enabled": 0 }, +{ "Id": 319, "Name": "UHD Dream TV", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "UHD Dream TV", "SKCh": 71, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/aLG2rKa.png", "Source": "SKY", "ServiceId": "689", "Enabled": 0 }, +{ "Id": 320, "Name": "UMAX", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "UMAX", "SKCh": 73, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/EgVuybQ.png", "Source": "SKB", "ServiceId": "69", "Enabled": 0 }, +{ "Id": 321, "Name": "NHK World TV", "KT Name": "", "KTCh": null, "LG Name": "NHK World TV", "LGCh": 142, "SK Name": "NHK World TV", "SKCh": 221, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/pCuIQsT.png", "Source": "LG", "ServiceId": "669", "Enabled": 0 }, +{ "Id": 362, "Name": "CJB 청주방송", "KT Name": "CJB 청주방송", "KTCh": 5, "LG Name": "CJB 청주방송", "LGCh": 5, "SK Name": "CJB 청주방송", "SKCh": 5, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/J6zQfQu.png", "Source": "NAVER", "ServiceId": "814684", "Enabled": 0 }, +{ "Id": 363, "Name": "G1 강원민방", "KT Name": "G1 강원민방", "KTCh": 5, "LG Name": "G1 강원민방", "LGCh": 5, "SK Name": "G1 강원민방", "SKCh": 5, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/aYqGo9x.png", "Source": "NAVER", "ServiceId": "814614", "Enabled": 0 }, +{ "Id": 364, "Name": "JIBS 제주방송", "KT Name": "JIBS 제주방송", "KTCh": 5, "LG Name": "JIBS 제주방송", "LGCh": 5, "SK Name": "JIBS 제주방송", "SKCh": 5, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/7YZ1lkJ.png", "Source": "NAVER", "ServiceId": "814703", "Enabled": 0 }, +{ "Id": 365, "Name": "JTV 전주방송", "KT Name": "JTV 전주방송", "KTCh": 5, "LG Name": "JTV 전주방송", "LGCh": 5, "SK Name": "JTV 전주방송", "SKCh": 5, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/XFKcvaN.png", "Source": "NAVER", "ServiceId": "814661", "Enabled": 0 }, +{ "Id": 366, "Name": "KBC 광주방송", "KT Name": "KBC 광주방송", "KTCh": 5, "LG Name": "KBC 광주방송", "LGCh": 5, "SK Name": "KBC 광주방송", "SKCh": 5, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/3M5UOIH.png", "Source": "NAVER", "ServiceId": "814652", "Enabled": 0 }, +{ "Id": 367, "Name": "KNN 부산경남방송", "KT Name": "KNN 부산경남방송", "KTCh": 5, "LG Name": "KNN 부산경남방송", "LGCh": 5, "SK Name": "KNN 부산경남방송", "SKCh": 5, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/RcViTam.png", "Source": "NAVER", "ServiceId": "814628", "Enabled": 0 }, +{ "Id": 369, "Name": "TBC 대구방송", "KT Name": "TBC 대구방송", "KTCh": 5, "LG Name": "TBC 대구방송", "LGCh": 5, "SK Name": "TBC 대구방송", "SKCh": 5, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/wmF5z8V.png", "Source": "NAVER", "ServiceId": "814639", "Enabled": 0 }, +{ "Id": 370, "Name": "TJB 대전방송", "KT Name": "TJB 대전방송", "KTCh": 5, "LG Name": "TJB 대전방송", "LGCh": 5, "SK Name": "TJB 대전방송", "SKCh": 5, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/9JAy4Bu.png", "Source": "NAVER", "ServiceId": "814671", "Enabled": 0 }, +{ "Id": 371, "Name": "UBC 울산방송", "KT Name": "UBC 울산방송", "KTCh": 5, "LG Name": "UBC 울산방송", "LGCh": 5, "SK Name": "UBC 울산방송", "SKCh": 5, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/qbBR1k5.png", "Source": "NAVER", "ServiceId": "814694", "Enabled": 0 }, +{ "Id": 372, "Name": "강릉 KBS1", "KT Name": "강릉 KBS1", "KTCh": 9, "LG Name": "강릉 KBS1", "LGCh": 9, "SK Name": "강릉 KBS1", "SKCh": 9, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/e31o5gw.png", "Source": "NAVER", "ServiceId": "814602", "Enabled": 0 }, +{ "Id": 373, "Name": "강릉 MBC", "KT Name": "강릉 MBC", "KTCh": 11, "LG Name": "강릉 MBC", "LGCh": 11, "SK Name": "강릉 MBC", "SKCh": 11, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/duig32i.png", "Source": "NAVER", "ServiceId": "814606", "Enabled": 0 }, +{ "Id": 374, "Name": "경인 KBS1", "KT Name": "경인 KBS1", "KTCh": 9, "LG Name": "경인 KBS1", "LGCh": 9, "SK Name": "경인 KBS1", "SKCh": 9, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/e31o5gw.png", "Source": "NAVER", "ServiceId": "814597", "Enabled": 0 }, +{ "Id": 375, "Name": "광주 KBS1", "KT Name": "광주 KBS1", "KTCh": 9, "LG Name": "광주 KBS1", "LGCh": 9, "SK Name": "광주 KBS1", "SKCh": 9, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/e31o5gw.png", "Source": "NAVER", "ServiceId": "814642", "Enabled": 0 }, +{ "Id": 376, "Name": "광주 MBC", "KT Name": "광주 MBC", "KTCh": 11, "LG Name": "광주 MBC", "LGCh": 11, "SK Name": "광주 MBC", "SKCh": 11, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/duig32i.png", "Source": "NAVER", "ServiceId": "814644", "Enabled": 0 }, +{ "Id": 377, "Name": "대구 KBS1", "KT Name": "대구 KBS1", "KTCh": 9, "LG Name": "대구 KBS1", "LGCh": 9, "SK Name": "대구 KBS1", "SKCh": 9, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/e31o5gw.png", "Source": "NAVER", "ServiceId": "814630", "Enabled": 0 }, +{ "Id": 378, "Name": "대구 MBC", "KT Name": "대구 MBC", "KTCh": 11, "LG Name": "대구 MBC", "LGCh": 11, "SK Name": "대구 MBC", "SKCh": 11, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/duig32i.png", "Source": "NAVER", "ServiceId": "814633", "Enabled": 0 }, +{ "Id": 379, "Name": "대전 KBS1", "KT Name": "대전 KBS1", "KTCh": 9, "LG Name": "대전 KBS1", "LGCh": 9, "SK Name": "대전 KBS1", "SKCh": 9, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/e31o5gw.png", "Source": "NAVER", "ServiceId": "814665", "Enabled": 0 }, +{ "Id": 380, "Name": "대전 MBC", "KT Name": "대전 MBC", "KTCh": 11, "LG Name": "대전 MBC", "LGCh": 11, "SK Name": "대전 MBC", "SKCh": 11, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/duig32i.png", "Source": "NAVER", "ServiceId": "814668", "Enabled": 0 }, +{ "Id": 381, "Name": "목포 KBS1", "KT Name": "목포 KBS1", "KTCh": 9, "LG Name": "목포 KBS1", "LGCh": 9, "SK Name": "목포 KBS1", "SKCh": 9, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/e31o5gw.png", "Source": "LG", "ServiceId": "523", "Enabled": 0 }, +{ "Id": 382, "Name": "목포 MBC", "KT Name": "목포 MBC", "KTCh": 11, "LG Name": "목포 MBC", "LGCh": 11, "SK Name": "목포 MBC", "SKCh": 11, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/duig32i.png", "Source": "NAVER", "ServiceId": "814646", "Enabled": 0 }, +{ "Id": 383, "Name": "부산 KBS1", "KT Name": "부산 KBS1", "KTCh": 9, "LG Name": "부산 KBS1", "LGCh": 9, "SK Name": "부산 KBS1", "SKCh": 9, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/e31o5gw.png", "Source": "NAVER", "ServiceId": "814617", "Enabled": 0 }, +{ "Id": 384, "Name": "부산 MBC", "KT Name": "부산 MBC", "KTCh": 11, "LG Name": "부산 MBC", "LGCh": 11, "SK Name": "부산 MBC", "SKCh": 11, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/duig32i.png", "Source": "NAVER", "ServiceId": "814621", "Enabled": 0 }, +{ "Id": 385, "Name": "삼척 MBC", "KT Name": "삼척 MBC", "KTCh": 11, "LG Name": "삼척 MBC", "LGCh": 11, "SK Name": "삼척 MBC", "SKCh": 11, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/duig32i.png", "Source": "NAVER", "ServiceId": "814608", "Enabled": 0 }, +{ "Id": 386, "Name": "순천 KBS1", "KT Name": "순천 KBS1", "KTCh": 9, "LG Name": "순천 KBS1", "LGCh": 9, "SK Name": "순천 KBS1", "SKCh": 9, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/e31o5gw.png", "Source": "LG", "ServiceId": "522", "Enabled": 0 }, +{ "Id": 387, "Name": "안동 KBS1", "KT Name": "안동 KBS1", "KTCh": 9, "LG Name": "안동 KBS1", "LGCh": 9, "SK Name": "안동 KBS1", "SKCh": 9, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/e31o5gw.png", "Source": "LG", "ServiceId": "517", "Enabled": 0 }, +{ "Id": 388, "Name": "안동 MBC", "KT Name": "안동 MBC", "KTCh": 11, "LG Name": "안동 MBC", "LGCh": 11, "SK Name": "안동 MBC", "SKCh": 11, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/duig32i.png", "Source": "NAVER", "ServiceId": "814635", "Enabled": 0 }, +{ "Id": 389, "Name": "여수 MBC", "KT Name": "여수 MBC", "KTCh": 11, "LG Name": "여수 MBC", "LGCh": 11, "SK Name": "여수 MBC", "SKCh": 11, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/duig32i.png", "Source": "NAVER", "ServiceId": "814649", "Enabled": 0 }, +{ "Id": 390, "Name": "울산 KBS1", "KT Name": "울산 KBS1", "KTCh": 9, "LG Name": "울산 KBS1", "LGCh": 9, "SK Name": "울산 KBS1", "SKCh": 9, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/e31o5gw.png", "Source": "NAVER", "ServiceId": "814687", "Enabled": 0 }, +{ "Id": 391, "Name": "울산 MBC", "KT Name": "울산 MBC", "KTCh": 11, "LG Name": "울산 MBC", "LGCh": 11, "SK Name": "울산 MBC", "SKCh": 11, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/duig32i.png", "Source": "NAVER", "ServiceId": "814691", "Enabled": 0 }, +{ "Id": 392, "Name": "원주 KBS1", "KT Name": "원주 KBS1", "KTCh": 9, "LG Name": "원주 KBS1", "LGCh": 9, "SK Name": "원주 KBS1", "SKCh": 9, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/e31o5gw.png", "Source": "LG", "ServiceId": "531", "Enabled": 0 }, +{ "Id": 393, "Name": "원주 MBC", "KT Name": "원주 MBC", "KTCh": 11, "LG Name": "원주 MBC", "LGCh": 11, "SK Name": "원주 MBC", "SKCh": 11, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/duig32i.png", "Source": "NAVER", "ServiceId": "814610", "Enabled": 0 }, +{ "Id": 394, "Name": "전주 KBS1", "KT Name": "전주 KBS1", "KTCh": 9, "LG Name": "전주 KBS1", "LGCh": 9, "SK Name": "전주 KBS1", "SKCh": 9, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/e31o5gw.png", "Source": "NAVER", "ServiceId": "814655", "Enabled": 0 }, +{ "Id": 395, "Name": "전주 MBC", "KT Name": "전주 MBC", "KTCh": 11, "LG Name": "전주 MBC", "LGCh": 11, "SK Name": "전주 MBC", "SKCh": 11, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/duig32i.png", "Source": "NAVER", "ServiceId": "814658", "Enabled": 0 }, +{ "Id": 396, "Name": "제주 KBS1", "KT Name": "제주 KBS1", "KTCh": 9, "LG Name": "제주 KBS1", "LGCh": 9, "SK Name": "제주 KBS1", "SKCh": 9, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/e31o5gw.png", "Source": "NAVER", "ServiceId": "814697", "Enabled": 0 }, +{ "Id": 397, "Name": "제주 MBC", "KT Name": "제주 MBC", "KTCh": 11, "LG Name": "제주 MBC", "LGCh": 11, "SK Name": "제주 MBC", "SKCh": 11, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/duig32i.png", "Source": "NAVER", "ServiceId": "814700", "Enabled": 0 }, +{ "Id": 398, "Name": "진주 KBS1", "KT Name": "진주 KBS1", "KTCh": 9, "LG Name": "진주 KBS1", "LGCh": 9, "SK Name": "진주 KBS1", "SKCh": 9, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/e31o5gw.png", "Source": "LG", "ServiceId": "529", "Enabled": 0 }, +{ "Id": 399, "Name": "진주 MBC", "KT Name": "진주 MBC", "KTCh": 11, "LG Name": "진주 MBC", "LGCh": 11, "SK Name": "진주 MBC", "SKCh": 11, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/duig32i.png", "Source": "NAVER", "ServiceId": "814624", "Enabled": 0 }, +{ "Id": 400, "Name": "창원 KBS1", "KT Name": "창원 KBS1", "KTCh": 9, "LG Name": "창원 KBS1", "LGCh": 9, "SK Name": "창원 KBS1", "SKCh": 9, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/e31o5gw.png", "Source": "NAVER", "ServiceId": "814619", "Enabled": 0 }, +{ "Id": 401, "Name": "청주 KBS1", "KT Name": "청주 KBS1", "KTCh": 9, "LG Name": "청주 KBS1", "LGCh": 9, "SK Name": "청주 KBS1", "SKCh": 9, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/e31o5gw.png", "Source": "NAVER", "ServiceId": "814675", "Enabled": 0 }, +{ "Id": 402, "Name": "청주 MBC", "KT Name": "청주 MBC", "KTCh": 11, "LG Name": "청주 MBC", "LGCh": 11, "SK Name": "청주 MBC", "SKCh": 11, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/duig32i.png", "Source": "NAVER", "ServiceId": "814678", "Enabled": 0 }, +{ "Id": 403, "Name": "춘천 KBS1", "KT Name": "춘천 KBS1", "KTCh": 9, "LG Name": "춘천 KBS1", "LGCh": 9, "SK Name": "춘천 KBS1", "SKCh": 9, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/e31o5gw.png", "Source": "NAVER", "ServiceId": "814604", "Enabled": 0 }, +{ "Id": 404, "Name": "춘천 MBC", "KT Name": "춘천 MBC", "KTCh": 11, "LG Name": "춘천 MBC", "LGCh": 11, "SK Name": "춘천 MBC", "SKCh": 11, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/duig32i.png", "Source": "NAVER", "ServiceId": "814612", "Enabled": 0 }, +{ "Id": 405, "Name": "충주 KBS1", "KT Name": "충주 KBS1", "KTCh": 9, "LG Name": "충주 KBS1", "LGCh": 9, "SK Name": "충주 KBS1", "SKCh": 9, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/e31o5gw.png", "Source": "LG", "ServiceId": "513", "Enabled": 0 }, +{ "Id": 406, "Name": "충주 MBC", "KT Name": "충주 MBC", "KTCh": 11, "LG Name": "충주 MBC", "LGCh": 11, "SK Name": "충주 MBC", "SKCh": 11, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/duig32i.png", "Source": "LG", "ServiceId": "538", "Enabled": 0 }, +{ "Id": 407, "Name": "포항 KBS1", "KT Name": "포항 KBS1", "KTCh": 9, "LG Name": "포항 KBS1", "LGCh": 9, "SK Name": "포항 KBS1", "SKCh": 9, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/e31o5gw.png", "Source": "LG", "ServiceId": "518", "Enabled": 0 }, +{ "Id": 408, "Name": "포항 MBC", "KT Name": "포항 MBC", "KTCh": 11, "LG Name": "포항 MBC", "LGCh": 11, "SK Name": "포항 MBC", "SKCh": 11, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/duig32i.png", "Source": "NAVER", "ServiceId": "814637", "Enabled": 0 }, +{ "Id": 409, "Name": "DIA TV", "KT Name": "DIA TV", "KTCh": 72, "LG Name": "다이아TV", "LGCh": 93, "SK Name": "DIA TV", "SKCh": 96, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/BH3DnrW.png", "Source": "LG", "ServiceId": "690", "Enabled": 0 }, +{ "Id": 410, "Name": "메디컬TV", "KT Name": "메디컬TV", "KTCh": 254, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/S73ArUy.png", "Source": "KT", "ServiceId": "254", "Enabled": 0 }, +{ "Id": 411, "Name": "CGTN", "KT Name": "CGTN", "KTCh": 194, "LG Name": "CGTN", "LGCh": 119, "SK Name": "CGTN", "SKCh": 161, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/rhZf4Zx.png", "Source": "ISCS", "ServiceId": "86", "Enabled": 0 }, +{ "Id": 412, "Name": "C Music TV", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "C Music TV", "SKCh": 237, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/hV270KM.png", "Source": "SKB", "ServiceId": "672", "Enabled": 0 }, +{ "Id": 413, "Name": "Tvis", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "Tvis", "SKCh": 250, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/7jq2VMs.png", "Source": "SKB", "ServiceId": "260", "Enabled": 0 }, +{ "Id": 414, "Name": "SPOTV ON", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "SPOTV ON", "SKCh": 118, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/Y3eYOc2.png", "Source": "SKB", "ServiceId": "136", "Enabled": 0 }, +{ "Id": 415, "Name": "SPOTV ON2", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "SPOTV ON2", "SKCh": 119, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/jbdurz4.png", "Source": "SKB", "ServiceId": "137", "Enabled": 0 }, +{ "Id": 416, "Name": "한국선거방송", "KT Name": "한국선거방송", "KTCh": 273, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/ZSdcknl.png", "Source": "KT", "ServiceId": "273", "Enabled": 0 }, +{ "Id": 417, "Name": "EBS 교육방송", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "EBS 교육방송", "RadioCh": 901, "Icon_url": "http://i.imgur.com/eEsZJop.png", "Source": "NAVER", "ServiceId": "815452", "Enabled": 0 }, +{ "Id": 418, "Name": "KBS 1 라디오", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "KBS 1 라디오", "RadioCh": 902, "Icon_url": "http://i.imgur.com/ikJ7QQn.png", "Source": "NAVER", "ServiceId": "815455", "Enabled": 0 }, +{ "Id": 419, "Name": "KBS 2 라디오", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "KBS 2 라디오", "RadioCh": 903, "Icon_url": "http://i.imgur.com/qTrmNld.png", "Source": "NAVER", "ServiceId": "815458", "Enabled": 0 }, +{ "Id": 420, "Name": "KBS 3 라디오", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "KBS 3 라디오", "RadioCh": 904, "Icon_url": "http://i.imgur.com/3tHl7QR.png", "Source": "NAVER", "ServiceId": "815460", "Enabled": 0 }, +{ "Id": 421, "Name": "KBS ClassicFM", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "KBS ClassicFM", "RadioCh": 905, "Icon_url": "http://i.imgur.com/Z46a05G.png", "Source": "NAVER", "ServiceId": "815454", "Enabled": 0 }, +{ "Id": 422, "Name": "KBS CoolFM", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "KBS CoolFM", "RadioCh": 906, "Icon_url": "http://i.imgur.com/0SQrpHZ.png", "Source": "NAVER", "ServiceId": "815457", "Enabled": 0 }, +{ "Id": 423, "Name": "KBS WorldRaido", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "KBS WorldRaido", "RadioCh": 907, "Icon_url": "http://i.imgur.com/ns1k6LN.png", "Source": "KBS", "ServiceId": "1", "Enabled": 0 }, +{ "Id": 424, "Name": "KBS 한민족방송", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "KBS 한민족방송", "RadioCh": 908, "Icon_url": "http://i.imgur.com/S5YVPyx.png", "Source": "NAVER", "ServiceId": "815461", "Enabled": 0 }, +{ "Id": 425, "Name": "MBC 표준FM", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "MBC 표준FM", "RadioCh": 909, "Icon_url": "http://i.imgur.com/E9OMdnO.png", "Source": "NAVER", "ServiceId": "815464", "Enabled": 0 }, +{ "Id": 426, "Name": "MBC FM4U", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "MBC FM4U", "RadioCh": 910, "Icon_url": "http://i.imgur.com/csdszZD.png", "Source": "NAVER", "ServiceId": "815463", "Enabled": 0 }, +{ "Id": 427, "Name": "MBC Channel M", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "MBC Channel M", "RadioCh": 911, "Icon_url": "http://i.imgur.com/jlKGpWs.png", "Source": "MBC", "ServiceId": "1", "Enabled": 0 }, +{ "Id": 428, "Name": "SBS 파워 FM", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "SBS 파워 FM", "RadioCh": 912, "Icon_url": "http://i.imgur.com/7qcJ4bm.png", "Source": "NAVER", "ServiceId": "815467", "Enabled": 0 }, +{ "Id": 429, "Name": "SBS 러브 FM", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "SBS 러브 FM", "RadioCh": 913, "Icon_url": "http://i.imgur.com/XHHHUZ1.png", "Source": "NAVER", "ServiceId": "815465", "Enabled": 0 }, +{ "Id": 430, "Name": "국악방송", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "국악방송", "RadioCh": 914, "Icon_url": "http://i.imgur.com/qpbhUhF.png", "Source": "NAVER", "ServiceId": "2891853", "Enabled": 0 }, +{ "Id": 431, "Name": "극동방송", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "극동방송", "RadioCh": 915, "Icon_url": "http://i.imgur.com/PlqBFtV.png", "Source": "NAVER", "ServiceId": "2074616", "Enabled": 0 }, +{ "Id": 432, "Name": "BBS 불교방송", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "BBS 불교방송", "RadioCh": 916, "Icon_url": "http://i.imgur.com/B34jpmo.png", "Source": "NAVER", "ServiceId": "815448", "Enabled": 0 }, +{ "Id": 433, "Name": "CBS 표준FM", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "CBS 표준FM", "RadioCh": 917, "Icon_url": "http://i.imgur.com/yBNo2mS.png", "Source": "NAVER", "ServiceId": "815451", "Enabled": 0 }, +{ "Id": 434, "Name": "CBS 음악FM", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "CBS 음악FM", "RadioCh": 918, "Icon_url": "http://i.imgur.com/yBNo2mS.png", "Source": "NAVER", "ServiceId": "815449", "Enabled": 0 }, +{ "Id": 435, "Name": "KFM 경기방송", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "KFM 경기방송", "RadioCh": 919, "Icon_url": "http://i.imgur.com/8hSikAY.png", "Source": "NAVER", "ServiceId": "1974893", "Enabled": 0 }, +{ "Id": 436, "Name": "PBC 평화방송", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "PBC 평화방송", "RadioCh": 920, "Icon_url": "http://i.imgur.com/G5fTCL3.png", "Source": "NAVER", "ServiceId": "1974894", "Enabled": 0 }, +{ "Id": 437, "Name": "TBS 교통방송", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "TBS 교통방송", "RadioCh": 921, "Icon_url": "http://i.imgur.com/9RxxTSi.png", "Source": "NAVER", "ServiceId": "815468", "Enabled": 0 }, +{ "Id": 438, "Name": "YTN NEWS FM", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "YTN NEWS FM", "RadioCh": 922, "Icon_url": "http://i.imgur.com/dSC3YPR.png", "Source": "NAVER", "ServiceId": "2074615", "Enabled": 0 }, +{ "Id": 439, "Name": "원음방송", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "원음방송", "RadioCh": 923, "Icon_url": "http://i.imgur.com/mKWQE7z.png", "Source": "NAVER", "ServiceId": "5534687", "Enabled": 0 }, +{ "Id": 440, "Name": "국방FM", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "국방FM", "RadioCh": 924, "Icon_url": "http://i.imgur.com/zjvlIIp.png", "Source": "MIL", "ServiceId": "1", "Enabled": 0 }, +{ "Id": 441, "Name": "경인방송", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "경인방송", "RadioCh": 925, "Icon_url": "http://i.imgur.com/zBTPTRe.png", "Source": "IFM", "ServiceId": "1", "Enabled": 0 }, +{ "Id": 442, "Name": "AMC", "KT Name": "AMC", "KTCh": 221, "LG Name": "", "LGCh": null, "SK Name": "AMC", "SKCh": 100, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/cJ1B77S.png", "Source": "SKB", "ServiceId": "199", "Enabled": 0 }, +{ "Id": 443, "Name": "TVA", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/tg99cob.png", "Source": "HCN", "ServiceId": "781", "Enabled": 0 }, +{ "Id": 444, "Name": "채널W", "KT Name": "채널 W", "KTCh": 226, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/mtiKEkU.png", "Source": "POOQ", "ServiceId": "C3901", "Enabled": 0 }, +{ "Id": 445, "Name": "INSIGHT TV", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "INSIGHT TV", "SKCh": 74, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/eFTXeGV.png", "Source": "SKB", "ServiceId": "890", "Enabled": 0 }, +{ "Id": 446, "Name": "인도어스포츠", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "인도어스포츠", "SKCh": 139, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/cb58LLs.png", "Source": "ISCS", "ServiceId": "576", "Enabled": 0 }, +{ "Id": 447, "Name": "시니어TV", "KT Name": "시니어TV", "KTCh": 264, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/XaObZ8I.png", "Source": "KT", "ServiceId": "264", "Enabled": 0 }, +{ "Id": 449, "Name": "아리랑 라디오", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/GLY8HCN.png", "Source": "ARIRANG", "ServiceId": "1", "Enabled": 0 }, +{ "Id": 450, "Name": "HGTV", "KT Name": "HGTV", "KTCh": 223, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/PR4w3i2.png", "Source": "KT", "ServiceId": "223", "Enabled": 0 }, +{ "Id": 451, "Name": "다빈치러닝", "KT Name": "다빈치러닝", "KTCh": 224, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/mB9BL31.png", "Source": "KT", "ServiceId": "224", "Enabled": 0 }, +{ "Id": 452, "Name": "E! Entertainment", "KT Name": "E! 엔터", "KTCh": 225, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/VqIgfE9.png", "Source": "KT", "ServiceId": "225", "Enabled": 0 }, +{ "Id": 453, "Name": "다큐원", "KT Name": "다큐원", "KTCh": 269, "LG Name": "", "LGCh": null, "SK Name": "다큐원", "SKCh": 283, "Radio Name": "아리랑 라디오", "RadioCh": 926, "Icon_url": "http://i.imgur.com/1EZs0Tn.png", "Source": "SK", "ServiceId": "257", "Enabled": 0 }, +{ "Id": 454, "Name": "Discovery Science", "KT Name": "DSC Science", "KTCh": 222, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/3UfATJL.png", "Source": "KT", "ServiceId": "222", "Enabled": 0 } ] \ No newline at end of file From 5bb93a0d52ee7d11c211189430a48d03598cacb0 Mon Sep 17 00:00:00 2001 From: wonipapa Date: Tue, 22 Aug 2017 10:54:18 +0900 Subject: [PATCH 12/41] =?UTF-8?q?SKB=20=ED=95=A8=EC=88=98=20=EB=B2=84?= =?UTF-8?q?=EA=B7=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- epg2xml.py | 89 +++++++++++++++++++++++++++++++----------------------- 1 file changed, 51 insertions(+), 38 deletions(-) diff --git a/epg2xml.py b/epg2xml.py index 4c72af0..91d96a6 100644 --- a/epg2xml.py +++ b/epg2xml.py @@ -121,8 +121,8 @@ def getEpg(): GetEPGFromSK(ChannelInfo) elif ChannelSource == 'SKB': GetEPGFromSKB(ChannelInfo) - #elif ChannelSource == 'SKY': - # GetEPGFromSKY(ChannelInfo) + elif ChannelSource == 'SKY': + GetEPGFromSKY(ChannelInfo) elif ChannelSource == 'NAVER': GetEPGFromNaver(ChannelInfo) elif ChannelSource == 'ISCS': @@ -150,7 +150,6 @@ def GetEPGFromEPG(ChannelInfo): ServiceId = ChannelInfo[3] epginfo = [] url = 'http://211.43.210.10:88/epg-cgi/extern/cnm_guide_type_v070530.php' - for k in range(period): day = today + datetime.timedelta(days=k) params = {'beforegroup':'100', 'checkchannel[]':ServiceId, 'select_group':'100', 'start_date':day.strftime('%Y%m%d')} @@ -161,39 +160,44 @@ def GetEPGFromEPG(ChannelInfo): data = unicode(html_data, 'euc-kr', 'ignore').encode('utf-8', 'ignore') strainer = SoupStrainer('table', {'style':'margin-bottom:30'}) soup = BeautifulSoup(data, 'lxml', parse_only=strainer, from_encoding='utf-8') - tables = soup.find_all('table', {'style':'margin-bottom:30'}) - for i in range(1,4): - thisday = day - row = tables[i].find_all('td', {'colspan':'2'}) - for cell in row: - hour = int(cell.text.strip().strip('시')) - if(i == 1) : hour = 'AM ' + str(hour) - elif(i == 2) : hour = 'PM ' + str(hour) - elif(i == 3 and hour > 5 and hour < 12 ) : hour = 'PM ' + str(hour) - elif(i == 3 and (hour < 5 or hour == 12)) : - hour = 'AM ' + str(hour) - thisday = day + datetime.timedelta(days=1) - for celldata in cell.parent.find_all('tr'): - startTime = endTime = programName = subprogramName = desc = actors = producers = category = episode = '' - rebroadcast = False - rating = 0 - pattern = ".*\[(.*)\]<\/td>\s.*\">(.*?)\s*(<(.*)>)?\s*(\(재\))?\s*(\(([\d,]+)회\)?)?()?\s*<\/td><\/tr>" - matches = re.match(pattern, str(celldata)) - if not (matches is None): - minute = matches.group(1) if matches.group(1) else '' - startTime = str(thisday) + ' ' + hour + ':' + minute[-2:] - startTime = datetime.datetime.strptime(startTime, '%Y-%m-%d %p %I:%M') - startTime = startTime.strftime('%Y%m%d%H%M%S') - image = matches.group(8) if matches.group(8) else '' - grade = re.match('.*schedule_([\d,]+)?.*',image) - if not (grade is None): rating = int(grade.group(1)) - programName = matches.group(2).strip() if matches.group(2) else '' - subprogramName = matches.group(4).strip() if matches.group(4) else '' - rebroadcast = True if matches.group(5) else False; - episode = matches.group(7) if matches.group(7) else '' - #ChannelId, startTime, programName, subprogramName, desc, actors, producers, category, episode, rebroadcast, rating - epginfo.append([ChannelId, startTime, programName, subprogramName, desc, actors, producers, category, episode, rebroadcast, rating]) - epgzip(epginfo) + html = soup.find_all('table', {'style':'margin-bottom:30'}) + if(html): + for i in range(1,4): + thisday = day + row = html[i].find_all('td', {'colspan':'2'}) + for cell in row: + hour = int(cell.text.strip().strip('시')) + if(i == 1) : hour = 'AM ' + str(hour) + elif(i == 2) : hour = 'PM ' + str(hour) + elif(i == 3 and hour > 5 and hour < 12 ) : hour = 'PM ' + str(hour) + elif(i == 3 and (hour < 5 or hour == 12)) : + hour = 'AM ' + str(hour) + thisday = day + datetime.timedelta(days=1) + for celldata in cell.parent.find_all('tr'): + startTime = endTime = programName = subprogramName = desc = actors = producers = category = episode = '' + rebroadcast = False + rating = 0 + pattern = ".*\[(.*)\]<\/td>\s.*\">(.*?)\s*(<(.*)>)?\s*(\(재\))?\s*(\(([\d,]+)회\)?)?()?\s*<\/td><\/tr>" + matches = re.match(pattern, str(celldata)) + if not (matches is None): + minute = matches.group(1) if matches.group(1) else '' + startTime = str(thisday) + ' ' + hour + ':' + minute[-2:] + startTime = datetime.datetime.strptime(startTime, '%Y-%m-%d %p %I:%M') + startTime = startTime.strftime('%Y%m%d%H%M%S') + image = matches.group(8) if matches.group(8) else '' + grade = re.match('.*schedule_([\d,]+)?.*',image) + if not (grade is None): rating = int(grade.group(1)) + programName = matches.group(2).strip() if matches.group(2) else '' + subprogramName = matches.group(4).strip() if matches.group(4) else '' + rebroadcast = True if matches.group(5) else False; + episode = matches.group(7) if matches.group(7) else '' + #ChannelId, startTime, programName, subprogramName, desc, actors, producers, category, episode, rebroadcast, rating + epginfo.append([ChannelId, startTime, programName, subprogramName, desc, actors, producers, category, episode, rebroadcast, rating]) + epgzip(epginfo) + else: + if(debug): printError(ChannelName + CONTENT_ERROR) + else: pass + except (requests.exceptions.RequestException) as e: if(debug): printError(ChannelName + str(e)) else: pass @@ -365,6 +369,9 @@ def GetEPGFromSKB(ChannelInfo): rebroadcast = False rating = 0 startTime = str(day) + ' ' + row.find('span', {'class':'time'}).text + startTime = datetime.datetime.strptime(startTime, '%Y-%m-%d %H:%M') + startTime = startTime.strftime('%Y%m%d%H%M%S') + row.find('span', {'class':'fullHD'}).decompose() cell = row.find('span', {'class':None}).text.decode('string_escape').strip() pattern = "^(.*?)(\(([\d,]+)회\))?(<(.*)>)?(\((재)\))?$" matches = re.match(pattern, cell) @@ -419,7 +426,10 @@ def GetEPGFromSKY(ChannelInfo): description = unescape(program['description']).replace('lt;','<').replace('gt;','>').replace('amp;','&') if program['description'] else '' summary = unescape(program['summary']).replace('lt;','<').replace('gt;','>').replace('amp;','&') if program['summary'] else '' desc = description if description else '' - if summary : desc = desc + '\n' + summary + if desc: + if summary : desc = desc + '\n' + summary + else: + desc = summary category = program['program_category1'] episode = program['episode_id'] if program['episode_id'] else '' if episode : episode = int(episode) @@ -499,6 +509,8 @@ def GetEPGFromIscs(ChannelInfo): rebroadcast = False rating = 0 startTime = str(day) + ' ' + row.find('td', {'class':'time'}).text + startTime = datetime.datetime.strptime(startTime, '%Y-%m-%d %H:%M') + startTime = startTime.strftime('%Y%m%d%H%M%S') programName = row.find('td', {'class':'name'}).text.decode('string_escape').strip() rating = row.find('span', {'class':'year'}).text.decode('string_escape').strip() if rating == '전체관람' : rating = 0 @@ -566,7 +578,7 @@ def GetEPGFromPooq(ChannelInfo): ChannelId = ChannelInfo[0] ChannelName = ChannelInfo[1] ServiceId = ChannelInfo[3] - url = 'https://wapie.pooq.co.kr/v1/epgs30/C' + str(ServiceId) + '/' + url = 'https://wapie.pooq.co.kr/v1/epgs30/' + str(ServiceId) + '/' lastday = today + datetime.timedelta(days=period-1) params = {'deviceTypeId': 'pc', 'marketTypeId': 'generic', 'apiAccessCredential': 'EEBE901F80B3A4C4E5322D58110BE95C', 'offset': '0', 'limit': '1000', 'startTime': today.strftime('%Y/%m/%d') + ' 00:00', 'endTime': lastday.strftime('%Y/%m/%d') + ' 00:00'} date_list = [(today + datetime.timedelta(days=x)).strftime('%Y-%m-%d') for x in range(0, period)] @@ -906,6 +918,7 @@ def writeProgram(programdata): if subprogramName : print(' %s' % (subprogramName)) if addverbose=='y' : + desc = re.sub(' +',' ', desc) print(' %s' % (desc)) if actors or producers: print(' ') From bae87bba87420f58f80450548d8ee7570a69340d Mon Sep 17 00:00:00 2001 From: wonipapa Date: Tue, 22 Aug 2017 11:03:47 +0900 Subject: [PATCH 13/41] =?UTF-8?q?SKB=20=ED=95=A8=EC=88=98=20=EB=B2=84?= =?UTF-8?q?=EA=B7=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- epg2xml.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/epg2xml.py b/epg2xml.py index 91d96a6..a3afa0c 100644 --- a/epg2xml.py +++ b/epg2xml.py @@ -121,8 +121,8 @@ def getEpg(): GetEPGFromSK(ChannelInfo) elif ChannelSource == 'SKB': GetEPGFromSKB(ChannelInfo) - elif ChannelSource == 'SKY': - GetEPGFromSKY(ChannelInfo) + #elif ChannelSource == 'SKY': + # GetEPGFromSKY(ChannelInfo) elif ChannelSource == 'NAVER': GetEPGFromNaver(ChannelInfo) elif ChannelSource == 'ISCS': @@ -371,7 +371,7 @@ def GetEPGFromSKB(ChannelInfo): startTime = str(day) + ' ' + row.find('span', {'class':'time'}).text startTime = datetime.datetime.strptime(startTime, '%Y-%m-%d %H:%M') startTime = startTime.strftime('%Y%m%d%H%M%S') - row.find('span', {'class':'fullHD'}).decompose() + row.find('span', {'class':['fullHD', 'UHD']}).decompose() cell = row.find('span', {'class':None}).text.decode('string_escape').strip() pattern = "^(.*?)(\(([\d,]+)회\))?(<(.*)>)?(\((재)\))?$" matches = re.match(pattern, cell) From e24a24a944c2ffe93f455b29fff5ab7bdee68f64 Mon Sep 17 00:00:00 2001 From: wonipapa Date: Tue, 22 Aug 2017 11:04:19 +0900 Subject: [PATCH 14/41] =?UTF-8?q?SKB=ED=95=A8=EC=88=98=20=EB=B2=84?= =?UTF-8?q?=EA=B7=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- epg2xml.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/epg2xml.py b/epg2xml.py index a3afa0c..6bb40b8 100644 --- a/epg2xml.py +++ b/epg2xml.py @@ -121,8 +121,8 @@ def getEpg(): GetEPGFromSK(ChannelInfo) elif ChannelSource == 'SKB': GetEPGFromSKB(ChannelInfo) - #elif ChannelSource == 'SKY': - # GetEPGFromSKY(ChannelInfo) + elif ChannelSource == 'SKY': + GetEPGFromSKY(ChannelInfo) elif ChannelSource == 'NAVER': GetEPGFromNaver(ChannelInfo) elif ChannelSource == 'ISCS': From e474251e7e50fd7173d4204d05b58fa9009f6445 Mon Sep 17 00:00:00 2001 From: wonipapa Date: Tue, 22 Aug 2017 11:10:35 +0900 Subject: [PATCH 15/41] update README.md --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index f813c11..43ff7dd 100644 --- a/README.md +++ b/README.md @@ -113,6 +113,10 @@ https://github.com/wonipapa/epg2xml/wiki https://github.com/wonipapa/epg2xml/wiki/FAQ ## 변경사항 +### Version 1.2.2 + - My Channel 추가 + - 소스 추가 + - Channel.json 분리로 삭제 ### Version 1.2.1 - SKB 함수 추가 - 가져오는 날짜 최대 2일로 변경 @@ -208,8 +212,4 @@ https://github.com/wonipapa/epg2xml/wiki/FAQ - 등록된 채널 정보만 EPG 정보 가져오도록 설정 - IPTV별 개인화 ### Version 1.0.0 - - first release - - KBS 함수 추가 - - Channel.json 소스 변경 - - 스카이라이프 url 변경 - - EPG 누락 데이터 수정 \ No newline at end of file + - first release \ No newline at end of file From 1b7eb5bce070fb75b211cab4bc7e03e3a1e77f41 Mon Sep 17 00:00:00 2001 From: wonipapa Date: Tue, 22 Aug 2017 11:21:52 +0900 Subject: [PATCH 16/41] Delete Channel.json --- Channel.json | 346 --------------------------------------------------- 1 file changed, 346 deletions(-) delete mode 100644 Channel.json diff --git a/Channel.json b/Channel.json deleted file mode 100644 index d6577d7..0000000 --- a/Channel.json +++ /dev/null @@ -1,346 +0,0 @@ -[ -{ "Id": 1, "Name": "9colors", "KT Name": "9colors", "KTCh": 163, "LG Name": "나인컬러스", "LGCh": 178, "SK Name": "9colors", "SKCh": 220, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/tRhzBgK.png", "Source": "SK", "ServiceId": "285", "Enabled": 0 }, -{ "Id": 2, "Name": "애니박스", "KT Name": "애니박스", "KTCh": 135, "LG Name": "애니박스", "LGCh": 148, "SK Name": "애니박스", "SKCh": 179, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/ipM9AXe.png", "Source": "SKY", "ServiceId": "84", "Enabled": 0 }, -{ "Id": 3, "Name": "Animal Planet", "KT Name": "Animal Planet", "KTCh": 179, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/ae70Di1.png", "Source": "SKY", "ServiceId": "182", "Enabled": 0 }, -{ "Id": 4, "Name": "ANIMAX", "KT Name": "ANIMAX", "KTCh": 133, "LG Name": "애니맥스", "LGCh": 167, "SK Name": "Animax", "SKCh": 173, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/2Gfqhuj.png", "Source": "SKY", "ServiceId": "725", "Enabled": 0 }, -{ "Id": 5, "Name": "애니원", "KT Name": "애니원", "KTCh": 134, "LG Name": "애니원", "LGCh": 153, "SK Name": "애니원", "SKCh": 174, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/sIp2MZ3.png", "Source": "SKY", "ServiceId": "56", "Enabled": 0 }, -{ "Id": 6, "Name": "예술 TV아르떼", "KT Name": "예술 TV아르떼", "KTCh": 91, "LG Name": "예술TV 아르떼", "LGCh": 139, "SK Name": "Arte TV", "SKCh": 234, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/zReu7df.png", "Source": "SK", "ServiceId": "421", "Enabled": 0 }, -{ "Id": 7, "Name": "Asia UHD", "KT Name": "Asia UHD", "KTCh": 109, "LG Name": "", "LGCh": null, "SK Name": "Asia UHD", "SKCh": 72, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/1u80OGN.png", "Source": "SKY", "ServiceId": "655", "Enabled": 0 }, -{ "Id": 8, "Name": "AsiaN", "KT Name": "AsiaN", "KTCh": 111, "LG Name": "아시아N", "LGCh": 88, "SK Name": "Asia N", "SKCh": 106, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/gleMSFq.png", "Source": "SK", "ServiceId": "177", "Enabled": 0 }, -{ "Id": 9, "Name": "Australia Plus", "KT Name": "Australia Plus", "KTCh": 258, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/6k9j2Hj.png", "Source": "NAVER", "ServiceId": "815391", "Enabled": 0 }, -{ "Id": 10, "Name": "AXN", "KT Name": "AXN", "KTCh": 113, "LG Name": "AXN", "LGCh": 45, "SK Name": "AXN", "SKCh": 102, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/QrAXBEm.png", "Source": "LG", "ServiceId": "744", "Enabled": 0 }, -{ "Id": 11, "Name": "B Shopping", "KT Name": "B Shopping", "KTCh": 30, "LG Name": "B쇼핑", "LGCh": 28, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/HiCKxpt.png", "Source": "LG", "ServiceId": "738", "Enabled": 0 }, -{ "Id": 14, "Name": "Baby TV", "KT Name": "Baby TV", "KTCh": 146, "LG Name": "", "LGCh": null, "SK Name": "Baby TV", "SKCh": 195, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/mU7QuTz.png", "Source": "KT", "ServiceId": "146", "Enabled": 0 }, -{ "Id": 15, "Name": "BBC Earth", "KT Name": "BBC Earth", "KTCh": 172, "LG Name": "BBC Earth", "LGCh": 130, "SK Name": "BBC earth", "SKCh": 265, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/SJZjuqO.png", "Source": "EPG", "ServiceId": "904", "Enabled": 0 }, -{ "Id": 18, "Name": "BBC WN", "KT Name": "BBC WN", "KTCh": 192, "LG Name": "BBC World News", "LGCh": 126, "SK Name": "BBC World News", "SKCh": 160, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/IwJBNd4.png", "Source": "EPG", "ServiceId": "260", "Enabled": 0 }, -{ "Id": 19, "Name": "BBS불교방송", "KT Name": "BBS불교방송", "KTCh": 232, "LG Name": "BBS", "LGCh": 186, "SK Name": "BBS 불교방송", "SKCh": 306, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/B34jpmo.png", "Source": "HCN", "ServiceId": "903", "Enabled": 0 }, -{ "Id": 20, "Name": "빌리어즈티비", "KT Name": "빌리어즈티비", "KTCh": 116, "LG Name": "빌리어즈TV", "LGCh": 63, "SK Name": "Billiards TV", "SKCh": 130, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/f0OW8wX.png", "Source": "EPG", "ServiceId": "615", "Enabled": 0 }, -{ "Id": 21, "Name": "Bloomberg", "KT Name": "Bloomberg", "KTCh": 196, "LG Name": "", "LGCh": null, "SK Name": "Bloomberg TV", "SKCh": 162, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/WWNLhh3.png", "Source": "SK", "ServiceId": "775", "Enabled": 0 }, -{ "Id": 23, "Name": "BTN불교TV", "KT Name": "BTN불교TV", "KTCh": 233, "LG Name": "BTN", "LGCh": 185, "SK Name": "BTN 불교TV", "SKCh": 305, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/XU4pwpC.png", "Source": "HCN", "ServiceId": "52", "Enabled": 0 }, -{ "Id": 24, "Name": "C channel", "KT Name": "C Channel", "KTCh": 235, "LG Name": "C채널", "LGCh": 182, "SK Name": "C채널", "SKCh": 304, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/SFouN1c.png", "Source": "HCN", "ServiceId": "907", "Enabled": 0 }, -{ "Id": 26, "Name": "C TIME", "KT Name": "C TIME", "KTCh": 69, "LG Name": "C타임", "LGCh": 86, "SK Name": "C TIME", "SKCh": 86, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/2FwWidb.png", "Source": "LG", "ServiceId": "775", "Enabled": 0 }, -{ "Id": 27, "Name": "Cbeebies", "KT Name": "Cbeebies", "KTCh": 152, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/4bIQeie.png", "Source": "NAVER", "ServiceId": "814991", "Enabled": 0 }, -{ "Id": 28, "Name": "CBS", "KT Name": "CBS", "KTCh": 238, "LG Name": "CBS", "LGCh": 181, "SK Name": "CBS", "SKCh": 300, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/yBNo2mS.png", "Source": "HCN", "ServiceId": "156", "Enabled": 0 }, -{ "Id": 31, "Name": "CCTV4", "KT Name": "CCTV4", "KTCh": 280, "LG Name": "CCTV4", "LGCh": 120, "SK Name": "CCTV4", "SKCh": 277, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/ACwvhcc.png", "Source": "ISCS", "ServiceId": "1467", "Enabled": 0 }, -{ "Id": 32, "Name": "CGNTV", "KT Name": "CGNTV", "KTCh": 237, "LG Name": "CGNTV", "LGCh": 183, "SK Name": "CGNTV", "SKCh": 302, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/9fNvKEX.png", "Source": "NAVER", "ServiceId": "815106", "Enabled": 0 }, -{ "Id": 34, "Name": "Channel [V]", "KT Name": "Channel [V]", "KTCh": 89, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/t1PNA6v.png", "Source": "KT", "ServiceId": "89", "Enabled": 0 }, -{ "Id": 35, "Name": "채널 J", "KT Name": "채널 J", "KTCh": 108, "LG Name": "채널J", "LGCh": 145, "SK Name": "채널J", "SKCh": 103, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/V9jGCZm.png", "Source": "LG", "ServiceId": "656", "Enabled": 0 }, -{ "Id": 36, "Name": "Channel News Asia", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "Channel News Asia", "SKCh": 163, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/hahdOp1.png", "Source": "SKB", "ServiceId": "777", "Enabled": 0 }, -{ "Id": 38, "Name": "cineF", "KT Name": "", "KTCh": null, "LG Name": "시네프", "LGCh": 42, "SK Name": "Cinef", "SKCh": 58, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/TfhQXIv.png", "Source": "SKB", "ServiceId": "193", "Enabled": 0 }, -{ "Id": 39, "Name": "UXN", "KT Name": "UXN", "KTCh": 101, "LG Name": "UXN", "LGCh": 2, "SK Name": "UXN", "SKCh": 70, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/5rRW0R3.png", "Source": "SKY", "ServiceId": "624", "Enabled": 0 }, -{ "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", "Enabled": 0 }, -{ "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", "Enabled": 0 }, -{ "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", "Enabled": 0 }, -{ "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", "Enabled": 0 }, -{ "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", "Enabled": 0 }, -{ "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", "Enabled": 0 }, -{ "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", "Enabled": 0 }, -{ "Id": 47, "Name": "CNN US", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "CNN US", "SKCh": 159, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/EL6i9mA.png", "Source": "SK", "ServiceId": "782", "Enabled": 0 }, -{ "Id": 48, "Name": "CNTV", "KT Name": "CNTV", "KTCh": 68, "LG Name": "CNTV", "LGCh": 85, "SK Name": "CNTV", "SKCh": 43, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/lCGq3v1.png", "Source": "NAVER", "ServiceId": "814709", "Enabled": 0 }, -{ "Id": 49, "Name": "CTS기독교TV", "KT Name": "CTS기독교TV", "KTCh": 236, "LG Name": "CTS", "LGCh": 180, "SK Name": "CTS", "SKCh": 301, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/lW9nvaB.png", "Source": "HCN", "ServiceId": "42", "Enabled": 0 }, -{ "Id": 50, "Name": "CUBE TV", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "CUBE TV", "SKCh": 89, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/xvEjFJa.png", "Source": "NAVER", "ServiceId": "1725243", "Enabled": 0 }, -{ "Id": 51, "Name": "디스커버리채널", "KT Name": "디스커버리채널", "KTCh": 177, "LG Name": "", "LGCh": null, "SK Name": "Discovery Channel", "SKCh": 261, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/1SgSI0P.png", "Source": "SKB", "ServiceId": "437", "Enabled": 0 }, -{ "Id": 52, "Name": "Dog TV", "KT Name": "Dog TV", "KTCh": 201, "LG Name": "DOG TV", "LGCh": 89, "SK Name": "DOG TV", "SKCh": 79, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/4Xqehq9.png", "Source": "SKB", "ServiceId": "255", "Enabled": 0 }, -{ "Id": 53, "Name": "Dream Works Channel", "KT Name": "Dream Works Channel", "KTCh": 131, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/ETfF49T.png", "Source": "KT", "ServiceId": "131", "Enabled": 0 }, -{ "Id": 54, "Name": "DW-TV Asia+", "KT Name": "DW-TV Asia+", "KTCh": 257, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/b0yhwNu.png", "Source": "NAVER", "ServiceId": "815529", "Enabled": 0 }, -{ "Id": 55, "Name": "E채널", "KT Name": "E채널", "KTCh": 48, "LG Name": "E 채널", "LGCh": 104, "SK Name": "E채널", "SKCh": 83, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/0WmEGB4.png", "Source": "EPG", "ServiceId": "108", "Enabled": 0 }, -{ "Id": 56, "Name": "EBS English", "KT Name": "EBS English", "KTCh": 156, "LG Name": "EBS English", "LGCh": 162, "SK Name": "EBS English", "SKCh": 202, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/Rx4mgpm.png", "Source": "LG", "ServiceId": "801", "Enabled": 0 }, -{ "Id": 57, "Name": "EBS u", "KT Name": "EBS u", "KTCh": 145, "LG Name": "EBS u", "LGCh": 168, "SK Name": "EBSu", "SKCh": 194, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/RIgVjvP.png", "Source": "NAVER", "ServiceId": "815547", "Enabled": 0 }, -{ "Id": 58, "Name": "EBS PLUS1", "KT Name": "EBS PLUS1", "KTCh": 157, "LG Name": "EBS+1", "LGCh": 163, "SK Name": "EBS +1", "SKCh": 203, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/WGlWiWy.png", "Source": "LG", "ServiceId": "714", "Enabled": 0 }, -{ "Id": 59, "Name": "EBS PLUS2", "KT Name": "EBS PLUS2", "KTCh": 158, "LG Name": "EBS+2", "LGCh": 164, "SK Name": "EBS +2", "SKCh": 204, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/QPq2wcg.png", "Source": "LG", "ServiceId": "715", "Enabled": 0 }, -{ "Id": 60, "Name": "EBS", "KT Name": "EBS", "KTCh": 13, "LG Name": "EBS1", "LGCh": 14, "SK Name": "EBS", "SKCh": 13, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/WViFruZ.png", "Source": "SKY", "ServiceId": "798", "Enabled": 1 }, -{ "Id": 61, "Name": "EBS2", "KT Name": "EBS2", "KTCh": 95, "LG Name": "EBS2", "LGCh": 95, "SK Name": "EBS2", "SKCh": 95, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/RIrBF4D.png", "Source": "POOQ", "ServiceId": "E02", "Enabled": 0 }, -{ "Id": 62, "Name": "Edge TV", "KT Name": "Edge TV", "KTCh": 79, "LG Name": "엣지TV", "LGCh": 68, "SK Name": "EDGE TV", "SKCh": 44, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/gsnjG4A.png", "Source": "HCN", "ServiceId": "104", "Enabled": 0 }, -{ "Id": 63, "Name": "edu TV", "KT Name": "edu TV", "KTCh": 159, "LG Name": "에듀TV", "LGCh": 165, "SK Name": "edu TV", "SKCh": 205, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/ZsMKNGe.png", "Source": "LG", "ServiceId": "810", "Enabled": 0 }, -{ "Id": 67, "Name": "Euro News", "KT Name": "Euro News", "KTCh": 193, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/6jswCZM.png", "Source": "NAVER", "ServiceId": "814935", "Enabled": 0 }, -{ "Id": 68, "Name": "Euro sport", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "Eurosport", "SKCh": 134, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/7hVKz6n.png", "Source": "SKB", "ServiceId": "120", "Enabled": 0 }, -{ "Id": 70, "Name": "Extreme Fun", "KT Name": "Extreme Fun", "KTCh": 173, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/yDg1RC6.png", "Source": "KT", "ServiceId": "173", "Enabled": 0 }, -{ "Id": 71, "Name": "Fashion N", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "Fashion N", "SKCh": 211, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/qPBnZpV.png", "Source": "SKB", "ServiceId": "274", "Enabled": 0 }, -{ "Id": 72, "Name": "FISHING TV", "KT Name": "FISHING TV", "KTCh": 119, "LG Name": "피싱TV", "LGCh": 65, "SK Name": "FISHING TV", "SKCh": 244, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/Go4FdK1.png", "Source": "SK", "ServiceId": "273", "Enabled": 0 }, -{ "Id": 73, "Name": "푸드TV", "KT Name": "푸드TV", "KTCh": 78, "LG Name": "푸드TV", "LGCh": 83, "SK Name": "Food TV", "SKCh": 213, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/F9Rb9SA.png", "Source": "HCN", "ServiceId": "753", "Enabled": 0 }, -{ "Id": 74, "Name": "FOX", "KT Name": "FOX", "KTCh": 107, "LG Name": "FOX채널", "LGCh": 44, "SK Name": "FOX", "SKCh": 101, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/8usDWOC.png", "Source": "LG", "ServiceId": "654", "Enabled": 0 }, -{ "Id": 75, "Name": "Fox life", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "Fox life", "SKCh": 216, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/CqVujLk.png", "Source": "SKB", "ServiceId": "280", "Enabled": 0 }, -{ "Id": 76, "Name": "Fox News", "KT Name": "Fox News", "KTCh": 195, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/9rGThzD.png", "Source": "NAVER", "ServiceId": "815413", "Enabled": 0 }, -{ "Id": 78, "Name": "FTV", "KT Name": "FTV", "KTCh": 118, "LG Name": "FTV", "LGCh": 64, "SK Name": "FTV", "SKCh": 243, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/eI9wGgS.png", "Source": "HCN", "ServiceId": "262", "Enabled": 0 }, -{ "Id": 79, "Name": "FUN TV", "KT Name": "FUN TV", "KTCh": 71, "LG Name": "", "LGCh": null, "SK Name": "FUN TV", "SKCh": 91, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/6V8X43L.png", "Source": "KT", "ServiceId": "71", "Enabled": 0 }, -{ "Id": 80, "Name": "FX", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "FX", "SKCh": 90, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/DAnUsTS.png", "Source": "SKY", "ServiceId": "818", "Enabled": 0 }, -{ "Id": 82, "Name": "GMTV", "KT Name": "GMTV", "KTCh": 88, "LG Name": "GMTV", "LGCh": 101, "SK Name": "GMTV", "SKCh": 232, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/WPF3G5V.png", "Source": "NAVER", "ServiceId": "814815", "Enabled": 0 }, -{ "Id": 83, "Name": "Good TV", "KT Name": "Good TV", "KTCh": 234, "LG Name": "", "LGCh": null, "SK Name": "Good TV", "SKCh": 303, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/fFN1YJb.png", "Source": "HCN", "ServiceId": "293", "Enabled": 0 }, -{ "Id": 84, "Name": "GS MY SHOP", "KT Name": "GS MY SHOP", "KTCh": 38, "LG Name": "GS마이샵", "LGCh": 30, "SK Name": "GS MY SHOP", "SKCh": 29, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/0Y0pRW4.png", "Source": "SK", "ServiceId": "343", "Enabled": 0 }, -{ "Id": 85, "Name": "GS SHOP", "KT Name": "GS SHOP", "KTCh": 8, "LG Name": "GS샵", "LGCh": 6, "SK Name": "GS SHOP", "SKCh": 12, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/tz88mYd.png", "Source": "HCN", "ServiceId": "45", "Enabled": 0 }, -{ "Id": 86, "Name": "GTV", "KT Name": "GTV", "KTCh": 73, "LG Name": "GTV", "LGCh": 136, "SK Name": "Gtv", "SKCh": 217, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/1qXSXRa.png", "Source": "HCN", "ServiceId": "35", "Enabled": 0 }, -{ "Id": 87, "Name": "히어로액션", "KT Name": "히어로액션", "KTCh": 112, "LG Name": "히어로액션", "LGCh": 110, "SK Name": "히어로액션", "SKCh": 107, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/yBChQVh.png", "Source": "NAVER", "ServiceId": "814760", "Enabled": 0 }, -{ "Id": 89, "Name": "하이라이트TV", "KT Name": "하이라이트TV", "KTCh": 74, "LG Name": "하이라이트TV", "LGCh": 91, "SK Name": "Highlight TV", "SKCh": 42, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/V9CQ4A6.png", "Source": "LG", "ServiceId": "701", "Enabled": 0 }, -{ "Id": 90, "Name": "History HD", "KT Name": "History HD", "KTCh": 169, "LG Name": "히스토리 HD", "LGCh": 132, "SK Name": "History HD", "SKCh": 264, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/SSkop4X.png", "Source": "EPG", "ServiceId": "900", "Enabled": 0 }, -{ "Id": 91, "Name": "HQ+", "KT Name": "HQ+", "KTCh": 253, "LG Name": "", "LGCh": null, "SK Name": "HQ+", "SKCh": 47, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/GTANuZS.png", "Source": "NAVER", "ServiceId": "3566359", "Enabled": 0 }, -{ "Id": 92, "Name": "아이넷TV", "KT Name": "아이넷TV", "KTCh": 92, "LG Name": "아이넷TV", "LGCh": 106, "SK Name": "아이넷 TV", "SKCh": 233, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/JYQpemw.png", "Source": "SKB", "ServiceId": "261", "Enabled": 0 }, -{ "Id": 93, "Name": "IB SPORTS", "KT Name": "IB SPORTS", "KTCh": 53, "LG Name": "IB스포츠", "LGCh": 62, "SK Name": "IB Sports", "SKCh": 129, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/wOOQEC1.png", "Source": "SKY", "ServiceId": "515", "Enabled": 0 }, -{ "Id": 94, "Name": "i-Concerts", "KT Name": "", "KTCh": null, "LG Name": "아이콘서트", "LGCh": 108, "SK Name": "i-Concerts", "SKCh": 236, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/oUUZQdi.png", "Source": "LG", "ServiceId": "661", "Enabled": 0 }, -{ "Id": 95, "Name": "JEI EnglishTV", "KT Name": "JEI EnglishTV", "KTCh": 154, "LG Name": "JEI EnglishTV", "LGCh": 160, "SK Name": "JEI 재능 English", "SKCh": 200, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/R1oJmLo.png", "Source": "SKY", "ServiceId": "289", "Enabled": 0 }, -{ "Id": 96, "Name": "JEI 재능TV", "KT Name": "JEI 재능TV", "KTCh": 142, "LG Name": "JEI재능TV", "LGCh": 159, "SK Name": "JEI 재능TV", "SKCh": 192, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/NoNRdSt.png", "Source": "SKY", "ServiceId": "23", "Enabled": 0 }, -{ "Id": 97, "Name": "JTBC", "KT Name": "JTBC", "KTCh": 15, "LG Name": "JTBC", "LGCh": 15, "SK Name": "JTBC", "SKCh": 15, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/YOYosLG.png", "Source": "POOQ", "ServiceId": "C2301", "Enabled": 0 }, -{ "Id": 98, "Name": "JTBC Golf", "KT Name": "JTBC Golf", "KTCh": 56, "LG Name": "JTBC골프", "LGCh": 54, "SK Name": "JTBC GOLF", "SKCh": 132, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/Bnw7O5U.png", "Source": "SKY", "ServiceId": "974", "Enabled": 0 }, -{ "Id": 99, "Name": "JTBC2", "KT Name": "JTBC2", "KTCh": 39, "LG Name": "JTBC2", "LGCh": 94, "SK Name": "jtbc2", "SKCh": 82, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/WtXDuFU.png", "Source": "POOQ", "ServiceId": "C2303", "Enabled": 0 }, -{ "Id": 100, "Name": "JTBC3", "KT Name": "JTBC3", "KTCh": 62, "LG Name": "JTBC3 FOX스포츠", "LGCh": 50, "SK Name": "JTBC3 FOXSPORTS", "SKCh": 126, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/KvGwEc1.png", "Source": "POOQ", "ServiceId": "C2304", "Enabled": 0 }, -{ "Id": 101, "Name": "K STAR", "KT Name": "K STAR", "KTCh": 87, "LG Name": "K스타", "LGCh": 105, "SK Name": "K star", "SKCh": 88, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/MYtePna.png", "Source": "LG", "ServiceId": "662", "Enabled": 0 }, -{ "Id": 103, "Name": "KBS DRAMA", "KT Name": "KBS Drama", "KTCh": 35, "LG Name": "KBS드라마", "LGCh": 31, "SK Name": "KBS 드라마", "SKCh": 30, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/CrLMIEQ.png", "Source": "SKY", "ServiceId": "910", "Enabled": 0 }, -{ "Id": 104, "Name": "KBS JOY", "KT Name": "KBS Joy", "KTCh": 41, "LG Name": "KBS조이", "LGCh": 3, "SK Name": "KBS joy", "SKCh": 80, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/D1o9by9.png", "Source": "POOQ", "ServiceId": "K04", "Enabled": 0 }, -{ "Id": 105, "Name": "KBS kids", "KT Name": "KBS Kids", "KTCh": 144, "LG Name": "KBS키즈", "LGCh": 169, "SK Name": "KBS KIDS", "SKCh": 190, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/Jcfjs9E.png", "Source": "SKY", "ServiceId": "596", "Enabled": 0 }, -{ "Id": 106, "Name": "KBSN Life", "KT Name": "KBSN Life", "KTCh": 281, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/5Ni1YIT.png", "Source": "POOQ", "ServiceId": "K05", "Enabled": 0 }, -{ "Id": 107, "Name": "KBS N Sports", "KT Name": "KBS N Sports", "KTCh": 59, "LG Name": "KBSN스포츠", "LGCh": 59, "SK Name": "KBSN 스포츠", "SKCh": 121, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/xspD7UE.png", "Source": "LG", "ServiceId": "618", "Enabled": 0 }, -{ "Id": 108, "Name": "KBS W", "KT Name": "KBS W", "KTCh": 83, "LG Name": "KBS W", "LGCh": 77, "SK Name": "KBS W", "SKCh": 214, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/sVqBczs.png", "Source": "POOQ", "ServiceId": "K09", "Enabled": 0 }, -{ "Id": 110, "Name": "KBS1", "KT Name": "KBS1", "KTCh": 9, "LG Name": "KBS1", "LGCh": 9, "SK Name": "KBS1", "SKCh": 9, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/e31o5gw.png", "Source": "SKY", "ServiceId": "796", "Enabled": 1 }, -{ "Id": 111, "Name": "KBS2", "KT Name": "KBS2", "KTCh": 7, "LG Name": "KBS2", "LGCh": 7, "SK Name": "KBS2", "SKCh": 7, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/XgibZbD.png", "Source": "SKY", "ServiceId": "795", "Enabled": 1 }, -{ "Id": 112, "Name": "키즈톡톡", "KT Name": "", "KTCh": null, "LG Name": "키즈톡톡", "LGCh": 158, "SK Name": "키즈톡톡 플러스", "SKCh": 189, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/0loInJO.png", "Source": "LG", "ServiceId": "805", "Enabled": 0 }, -{ "Id": 115, "Name": "KIDS-TV", "KT Name": "KIDS-TV", "KTCh": 149, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/AVCSEdn.png", "Source": "NAVER", "ServiceId": "814999", "Enabled": 0 }, -{ "Id": 116, "Name": "K-NET TV", "KT Name": "K-NET TV", "KTCh": 230, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/GelnqjB.png", "Source": "KT", "ServiceId": "230", "Enabled": 0 }, -{ "Id": 117, "Name": "KTV", "KT Name": "KTV", "KTCh": 64, "LG Name": "KTV", "LGCh": 171, "SK Name": "KTV", "SKCh": 290, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/yUk2RhO.png", "Source": "ISCS", "ServiceId": "1327", "Enabled": 0 }, -{ "Id": 118, "Name": "K-바둑", "KT Name": "K-바둑", "KTCh": 121, "LG Name": "K-바둑", "LGCh": 107, "SK Name": "K-바둑", "SKCh": 241, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/EAk5ySy.png", "Source": "HCN", "ServiceId": "162", "Enabled": 0 }, -{ "Id": 119, "Name": "K쇼핑", "KT Name": "K쇼핑", "KTCh": 20, "LG Name": "", "LGCh": null, "SK Name": "K쇼핑", "SKCh": 25, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/6ORm0Rz.png", "Source": "SK", "ServiceId": "333", "Enabled": 0 }, -{ "Id": 121, "Name": "Mnet", "KT Name": "Mnet", "KTCh": 27, "LG Name": "엠넷", "LGCh": 22, "SK Name": "M.net", "SKCh": 27, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/putHm2b.png", "Source": "SKY", "ServiceId": "273", "Enabled": 0 }, -{ "Id": 122, "Name": "MBC", "KT Name": "MBC", "KTCh": 11, "LG Name": "MBC", "LGCh": 11, "SK Name": "MBC", "SKCh": 11, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/duig32i.png", "Source": "SKY", "ServiceId": "797", "Enabled": 1 }, -{ "Id": 123, "Name": "MBC Every1", "KT Name": "MBC Every1", "KTCh": 3, "LG Name": "MBC에브리원", "LGCh": 29, "SK Name": "MBC Every1", "SKCh": 28, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/oOnpFes.png", "Source": "POOQ", "ServiceId": "M03", "Enabled": 0 }, -{ "Id": 124, "Name": "MBC MUSIC", "KT Name": "MBC MUSIC", "KTCh": 97, "LG Name": "MBC뮤직", "LGCh": 99, "SK Name": "MBC Music", "SKCh": 231, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/6g56RDx.png", "Source": "POOQ", "ServiceId": "M06", "Enabled": 0 }, -{ "Id": 125, "Name": "MBC NET", "KT Name": "MBC NET", "KTCh": 164, "LG Name": "MBCNET", "LGCh": 140, "SK Name": "MBC NET", "SKCh": 274, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/lxDOgY8.png", "Source": "SKY", "ServiceId": "537", "Enabled": 0 }, -{ "Id": 126, "Name": "MBC SPORTS+", "KT Name": "MBC SPORT+", "KTCh": 60, "LG Name": "MBC스포츠+", "LGCh": 60, "SK Name": "MBC Sports+", "SKCh": 123, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/Su21uj3.png", "Source": "SKY", "ServiceId": "911", "Enabled": 0 }, -{ "Id": 127, "Name": "MBC SPORTS+2", "KT Name": "MBC SPORTS+2", "KTCh": 61, "LG Name": "MBC스포츠+2", "LGCh": 61, "SK Name": "MBC SPORTS+2", "SKCh": 124, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/frAuUS3.png", "Source": "SKY", "ServiceId": "96", "Enabled": 0 }, -{ "Id": 128, "Name": "MBC Dramanet", "KT Name": "MBC Dramanet", "KTCh": 75, "LG Name": "MBC드라마넷", "LGCh": 35, "SK Name": "MBC 드라마", "SKCh": 32, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/VBMFcZ3.png", "Source": "POOQ", "ServiceId": "M02", "Enabled": 0 }, -{ "Id": 129, "Name": "MBN", "KT Name": "MBN", "KTCh": 16, "LG Name": "MBN", "LGCh": 16, "SK Name": "MBN", "SKCh": 16, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/p0mvIJN.png", "Source": "POOQ", "ServiceId": "C2401", "Enabled": 0 }, -{ "Id": 130, "Name": "MBN Plus", "KT Name": "MBN Plus", "KTCh": 99, "LG Name": "MBN+", "LGCh": 116, "SK Name": "MBN 플러스", "SKCh": 98, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/yMZiUUp.png", "Source": "NAVER", "ServiceId": "5286722", "Enabled": 0 }, -{ "Id": 133, "Name": "마운틴TV", "KT Name": "마운틴TV", "KTCh": 117, "LG Name": "마운틴TV", "LGCh": 69, "SK Name": "Mountain TV", "SKCh": 247, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/4nLYnVC.png", "Source": "ISCS", "ServiceId": "713", "Enabled": 0 }, -{ "Id": 134, "Name": "mplex", "KT Name": "mplex", "KTCh": 103, "LG Name": "엠플렉스", "LGCh": 46, "SK Name": "Mplex", "SKCh": 57, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/dOOBYJm.png", "Source": "ISCS", "ServiceId": "1487", "Enabled": 0 }, -{ "Id": 135, "Name": "머니투데이방송", "KT Name": "머니투데이방송", "KTCh": 181, "LG Name": "MTN", "LGCh": 122, "SK Name": "MTN", "SKCh": 152, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/joWd14j.png", "Source": "EPG", "ServiceId": "132", "Enabled": 0 }, -{ "Id": 136, "Name": "NatGeo People", "KT Name": "NatGeo People", "KTCh": 171, "LG Name": "", "LGCh": null, "SK Name": "Natgeo People", "SKCh": 263, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/2ghKPUg.png", "Source": "NAVER", "ServiceId": "814946", "Enabled": 0 }, -{ "Id": 137, "Name": "NatGeo Wild", "KT Name": "NatGeo Wild", "KTCh": 170, "LG Name": "냇지오 와일드", "LGCh": 134, "SK Name": "Natgeo Wild HD", "SKCh": 266, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/M4nh0Rk.png", "Source": "SKY", "ServiceId": "166", "Enabled": 0 }, -{ "Id": 138, "Name": "NGC", "KT Name": "NGC", "KTCh": 168, "LG Name": "내셔널지오그래픽", "LGCh": 131, "SK Name": "NGC", "SKCh": 260, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/mqTSPMN.png", "Source": "SKY", "ServiceId": "972", "Enabled": 0 }, -{ "Id": 139, "Name": "NHK WP", "KT Name": "NHK WP", "KTCh": 199, "LG Name": "NHK World Premium", "LGCh": 143, "SK Name": "NHK World Premium", "SKCh": 278, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/ZSHeMzp.png", "Source": "NAVER", "ServiceId": "815432", "Enabled": 0 }, -{ "Id": 141, "Name": "니켈로디언", "KT Name": "니켈로디언", "KTCh": 136, "LG Name": "니켈로디언", "LGCh": 154, "SK Name": "Nickelodeon", "SKCh": 176, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/6pWpFCX.png", "Source": "SKY", "ServiceId": "685", "Enabled": 0 }, -{ "Id": 142, "Name": "놀티비", "KT Name": "놀티비", "KTCh": 128, "LG Name": "놀TV", "LGCh": 92, "SK Name": "Noll TV", "SKCh": 248, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/IK9h4rw.png", "Source": "HCN", "ServiceId": "923", "Enabled": 0 }, -{ "Id": 143, "Name": "NS Shop+", "KT Name": "NS Shop+", "KTCh": 42, "LG Name": "", "LGCh": null, "SK Name": "NS Shop+", "SKCh": 41, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/ipGXgEK.png", "Source": "SK", "ServiceId": "341", "Enabled": 0 }, -{ "Id": 144, "Name": "NS홈쇼핑", "KT Name": "NS홈쇼핑", "KTCh": 12, "LG Name": "NS홈쇼핑", "LGCh": 13, "SK Name": "NS홈쇼핑", "SKCh": 14, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/UD1yoj1.png", "Source": "ISCS", "ServiceId": "12", "Enabled": 0 }, -{ "Id": 147, "Name": "O tvN", "KT Name": "O tvn", "KTCh": 45, "LG Name": "O tvN", "LGCh": 71, "SK Name": "O tvN", "SKCh": 34, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/0SMl3O5.png", "Source": "SKY", "ServiceId": "555", "Enabled": 0 }, -{ "Id": 148, "Name": "올리브", "KT Name": "올리브", "KTCh": 34, "LG Name": "올리브", "LGCh": 82, "SK Name": "올리브", "SKCh": 84, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/5kF0Ypt.png", "Source": "EPG", "ServiceId": "15", "Enabled": 0 }, -{ "Id": 149, "Name": "OBS", "KT Name": "OBS", "KTCh": 26, "LG Name": "OBS", "LGCh": 26, "SK Name": "OBS", "SKCh": 20, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/DJHN8M6.png", "Source": "SKY", "ServiceId": "935", "Enabled": 0 }, -{ "Id": 150, "Name": "HD OBS W", "KT Name": "HD OBS W", "KTCh": 81, "LG Name": "OBS W", "LGCh": 137, "SK Name": "OBSW", "SKCh": 219, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/uZkbU7b.png", "Source": "LG", "ServiceId": "648", "Enabled": 0 }, -{ "Id": 151, "Name": "OCN", "KT Name": "OCN", "KTCh": 21, "LG Name": "OCN", "LGCh": 38, "SK Name": "OCN", "SKCh": 54, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/IXh6dwo.png", "Source": "SKY", "ServiceId": "847", "Enabled": 0 }, -{ "Id": 153, "Name": "OGN", "KT Name": "OGN", "KTCh": 123, "LG Name": "OGN", "LGCh": 96, "SK Name": "OGN", "SKCh": 136, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/tLtSTaq.png", "Source": "SKY", "ServiceId": "55", "Enabled": 0 }, -{ "Id": 154, "Name": "온스타일", "KT Name": "온스타일", "KTCh": 77, "LG Name": "온스타일", "LGCh": 73, "SK Name": "On style", "SKCh": 210, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/9brMDfR.png", "Source": "HCN", "ServiceId": "414", "Enabled": 0 }, -{ "Id": 156, "Name": "ONT", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "ONT", "SKCh": 245, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/2lu0ZBu.png", "Source": "SK", "ServiceId": "256", "Enabled": 0 }, -{ "Id": 157, "Name": "OUN", "KT Name": "OUN", "KTCh": 160, "LG Name": "OUN", "LGCh": 170, "SK Name": "OUN", "SKCh": 292, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/VimbcIH.png", "Source": "EPG", "ServiceId": "47", "Enabled": 0 }, -{ "Id": 158, "Name": "Outdoor", "KT Name": "", "KTCh": null, "LG Name": "아웃도어 채널", "LGCh": 135, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/4M65Rrv.png", "Source": "LG", "ServiceId": "710", "Enabled": 0 }, -{ "Id": 159, "Name": "Playboy TV", "KT Name": "Playboy TV", "KTCh": 206, "LG Name": "플레이보이", "LGCh": 190, "SK Name": "플레이보이TV", "SKCh": 320, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/NglRqcV.png", "Source": "EPG", "ServiceId": "146", "Enabled": 0 }, -{ "Id": 160, "Name": "리얼TV", "KT Name": "리얼TV", "KTCh": 127, "LG Name": "", "LGCh": null, "SK Name": "리얼TV", "SKCh": 267, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/PYnXtlb.png", "Source": "SK", "ServiceId": "440", "Enabled": 0 }, -{ "Id": 164, "Name": "SBS", "KT Name": "SBS", "KTCh": 5, "LG Name": "SBS", "LGCh": 5, "SK Name": "SBS", "SKCh": 5, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/K2ztoDT.png", "Source": "SKY", "ServiceId": "794", "Enabled": 1 }, -{ "Id": 165, "Name": "SBS CNBC", "KT Name": "SBS CNBC", "KTCh": 25, "LG Name": "SBS CNBC", "LGCh": 27, "SK Name": "SBS CNBC", "SKCh": 26, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/SfDs4qN.png", "Source": "POOQ", "ServiceId": "S06", "Enabled": 0 }, -{ "Id": 166, "Name": "SBS funE", "KT Name": "SBS funE", "KTCh": 43, "LG Name": "SBS퍼니", "LGCh": 75, "SK Name": "SBS fun E", "SKCh": 81, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/D1EYJmr.png", "Source": "POOQ", "ServiceId": "S04", "Enabled": 0 }, -{ "Id": 167, "Name": "SBSGOLF", "KT Name": "SBSGOLF", "KTCh": 57, "LG Name": "SBS골프", "LGCh": 53, "SK Name": "SBS GOLF", "SKCh": 131, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/HdS0GNV.png", "Source": "SKY", "ServiceId": "769", "Enabled": 0 }, -{ "Id": 168, "Name": "SBS MTV", "KT Name": "SBS MTV", "KTCh": 96, "LG Name": "SBS MTV", "LGCh": 100, "SK Name": "SBS MTV", "SKCh": 230, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/OeSJ9Ik.png", "Source": "POOQ", "ServiceId": "S03", "Enabled": 0 }, -{ "Id": 169, "Name": "SBS Sports", "KT Name": "SBS Sports", "KTCh": 58, "LG Name": "SBS스포츠", "LGCh": 58, "SK Name": "SBS Sports", "SKCh": 122, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/j1vHAu6.png", "Source": "POOQ", "ServiceId": "S02", "Enabled": 0 }, -{ "Id": 170, "Name": "SBS Plus", "KT Name": "SBS Plus", "KTCh": 37, "LG Name": "SBS플러스", "LGCh": 33, "SK Name": "SBS 플러스", "SKCh": 2, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/asfyrTm.png", "Source": "POOQ", "ServiceId": "S03", "Enabled": 0 }, -{ "Id": 171, "Name": "스크린", "KT Name": "스크린", "KTCh": 106, "LG Name": "스크린", "LGCh": 41, "SK Name": "Screen", "SKCh": 56, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/lTK9VD4.png", "Source": "SKB", "ServiceId": "192", "Enabled": 0 }, -{ "Id": 172, "Name": "SkyA&C", "KT Name": "SkyA&C", "KTCh": 80, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/cljag6U.png", "Source": "SKY", "ServiceId": "514", "Enabled": 0 }, -{ "Id": 173, "Name": "SkyDrama", "KT Name": "SkyDrama", "KTCh": 31, "LG Name": "스카이드라마", "LGCh": 79, "SK Name": "sky Drama", "SKCh": 40, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/e9BTUAb.png", "Source": "SKY", "ServiceId": "783", "Enabled": 0 }, -{ "Id": 174, "Name": "SkyENT", "KT Name": "SkyENT", "KTCh": 50, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/ALqDHH6.png", "Source": "SKY", "ServiceId": "970", "Enabled": 0 }, -{ "Id": 175, "Name": "Sky힐링", "KT Name": "Sky힐링", "KTCh": 167, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/64SK0o9.png", "Source": "SKY", "ServiceId": "40", "Enabled": 0 }, -{ "Id": 176, "Name": "SkyICT", "KT Name": "SkyICT", "KTCh": 165, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/luZjU1e.png", "Source": "SKY", "ServiceId": "568", "Enabled": 0 }, -{ "Id": 177, "Name": "SkyPetPark", "KT Name": "SkyPetPark", "KTCh": 49, "LG Name": "", "LGCh": null, "SK Name": "Sky Petpark", "SKCh": 94, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/RDUfvRG.png", "Source": "SKY", "ServiceId": "513", "Enabled": 0 }, -{ "Id": 178, "Name": "SkySports", "KT Name": "SkySports", "KTCh": 54, "LG Name": "스카이스포츠", "LGCh": 57, "SK Name": "sky Sports", "SKCh": 125, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/QHV9bdA.png", "Source": "SKY", "ServiceId": "447", "Enabled": 0 }, -{ "Id": 179, "Name": "SkyTravel", "KT Name": "SkyTravel", "KTCh": 100, "LG Name": "스카이트래블", "LGCh": 66, "SK Name": "sky Travel", "SKCh": 246, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/fAJgmna.png", "Source": "SKY", "ServiceId": "934", "Enabled": 0 }, -{ "Id": 181, "Name": "Sky UHD", "KT Name": "Sky UHD", "KTCh": 174, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/BNxE2zT.png", "Source": "SKY", "ServiceId": "500", "Enabled": 0 }, -{ "Id": 182, "Name": "Smile TV", "KT Name": "Smile TV", "KTCh": 84, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/alk8plD.png", "Source": "KT", "ServiceId": "84", "Enabled": 0 }, -{ "Id": 183, "Name": "SPOTV", "KT Name": "SPOTV", "KTCh": 51, "LG Name": "스포티비", "LGCh": 56, "SK Name": "SPOTV", "SKCh": 120, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/cIpIf6b.png", "Source": "SKY", "ServiceId": "109", "Enabled": 0 }, -{ "Id": 184, "Name": "SPOTV Games", "KT Name": "SPOTV Games", "KTCh": 124, "LG Name": "스포티비 게임즈", "LGCh": 109, "SK Name": "SPOTV GAMES", "SKCh": 137, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/5IMfa6N.png", "Source": "NAVER", "ServiceId": "1876333", "Enabled": 0 }, -{ "Id": 185, "Name": "SPOTV+", "KT Name": "SPOTV+", "KTCh": 125, "LG Name": "스포티비+", "LGCh": 51, "SK Name": "SPOTV+", "SKCh": 127, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/81Fshnn.png", "Source": "SKY", "ServiceId": "713", "Enabled": 0 }, -{ "Id": 186, "Name": "SPOTV2", "KT Name": "SPOTV2", "KTCh": 52, "LG Name": "스포티비2", "LGCh": 52, "SK Name": "SPOTV2", "SKCh": 128, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/GNicmGY.png", "Source": "NAVER", "ServiceId": "5286701", "Enabled": 0 }, -{ "Id": 192, "Name": "Star Sports", "KT Name": "Star Sports", "KTCh": 63, "LG Name": "", "LGCh": null, "SK Name": "Star Sports", "SKCh": 135, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/8ndGr4n.png", "Source": "EPG", "ServiceId": "122", "Enabled": 0 }, -{ "Id": 193, "Name": "STB상생방송", "KT Name": "STB상생방송", "KTCh": 261, "LG Name": "상생방송", "LGCh": 187, "SK Name": "STB 상생방송", "SKCh": 308, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/Z3Xknso.png", "Source": "HCN", "ServiceId": "779", "Enabled": 0 }, -{ "Id": 194, "Name": "STN", "KT Name": "STN", "KTCh": 267, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/ZJi3NQy.png", "Source": "KT", "ServiceId": "267", "Enabled": 0 }, -{ "Id": 196, "Name": "슈퍼액션", "KT Name": "슈퍼액션", "KTCh": 32, "LG Name": "수퍼액션", "LGCh": 40, "SK Name": "SUPER ACTION", "SKCh": 55, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/D9PzDBr.png", "Source": "SKY", "ServiceId": "129", "Enabled": 0 }, -{ "Id": 197, "Name": "tag TV", "KT Name": "tag TV", "KTCh": 94, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/Mmc89FS.png", "Source": "KT", "ServiceId": "94", "Enabled": 0 }, -{ "Id": 198, "Name": "tbsTV", "KT Name": "tbsTV", "KTCh": 214, "LG Name": "tbsTV", "LGCh": 176, "SK Name": "tbsTV", "SKCh": 272, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/o3MWHfb.png", "Source": "SK", "ServiceId": "420", "Enabled": 0 }, -{ "Id": 199, "Name": "텔레노벨라", "KT Name": "텔레노벨라", "KTCh": 114, "LG Name": "텔레노벨라", "LGCh": 81, "SK Name": "텔레노벨라", "SKCh": 109, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/Ea3Vu8Z.png", "Source": "LG", "ServiceId": "700", "Enabled": 0 }, -{ "Id": 200, "Name": "The Golf Channel", "KT Name": "The Golf Channel", "KTCh": 55, "LG Name": "더 골프채널 코리아", "LGCh": 55, "SK Name": "Golf Channel Korea", "SKCh": 133, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/3VlCrJ7.png", "Source": "SK", "ServiceId": "135", "Enabled": 0 }, -{ "Id": 201, "Name": "THE MOVIE", "KT Name": "THE MOVIE", "KTCh": 104, "LG Name": "더 무비", "LGCh": 47, "SK Name": "The Movie", "SKCh": 59, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/6vzmEfd.png", "Source": "HCN", "ServiceId": "165", "Enabled": 0 }, -{ "Id": 202, "Name": "Tooniverse", "KT Name": "Tooniverse", "KTCh": 132, "LG Name": "투니버스", "LGCh": 152, "SK Name": "Tooniverse", "SKCh": 170, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/VUqSOjx.png", "Source": "SKY", "ServiceId": "526", "Enabled": 0 }, -{ "Id": 203, "Name": "TRENDY", "KT Name": "TRENDY", "KTCh": 251, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/NP2KTGN.png", "Source": "KT", "ServiceId": "251", "Enabled": 0 }, -{ "Id": 205, "Name": "TV5MONDE", "KT Name": "TV5MONDE", "KTCh": 198, "LG Name": "", "LGCh": null, "SK Name": "TV5Monde", "SKCh": 279, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/NogUKpP.png", "Source": "HCN", "ServiceId": "612", "Enabled": 0 }, -{ "Id": 207, "Name": "tvN", "KT Name": "tvN", "KTCh": 17, "LG Name": "tvN", "LGCh": 17, "SK Name": "tvN", "SKCh": 17, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/OJ9A8fZ.png", "Source": "SKY", "ServiceId": "60", "Enabled": 0 }, -{ "Id": 208, "Name": "TV조선", "KT Name": "TV조선", "KTCh": 19, "LG Name": "TV조선", "LGCh": 19, "SK Name": "TV조선", "SKCh": 19, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/ShJ5joR.png", "Source": "POOQ", "ServiceId": "C2601", "Enabled": 0 }, -{ "Id": 212, "Name": "viki", "KT Name": "viki", "KTCh": 204, "LG Name": "비키", "LGCh": 192, "SK Name": "Viki", "SKCh": 322, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/ZVD51K9.png", "Source": "EPG", "ServiceId": "86", "Enabled": 0 }, -{ "Id": 213, "Name": "W 쇼핑", "KT Name": "W 쇼핑", "KTCh": 40, "LG Name": "", "LGCh": null, "SK Name": "W쇼핑", "SKCh": 37, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/Cged9ve.png", "Source": "SK", "ServiceId": "342", "Enabled": 0 }, -{ "Id": 215, "Name": "WBS원음방송", "KT Name": "원음방송", "KTCh": 284, "LG Name": "원음방송", "LGCh": 188, "SK Name": "원음방송", "SKCh": 309, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/mKWQE7z.png", "Source": "EPG", "ServiceId": "644", "Enabled": 0 }, -{ "Id": 216, "Name": "XTM", "KT Name": "XTM", "KTCh": 76, "LG Name": "XTM", "LGCh": 72, "SK Name": "XTM", "SKCh": 85, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/hGwA39y.png", "Source": "EPG", "ServiceId": "388", "Enabled": 0 }, -{ "Id": 218, "Name": "YTN", "KT Name": "YTN", "KTCh": 24, "LG Name": "YTN", "LGCh": 24, "SK Name": "YTN", "SKCh": 24, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/ByeeX5e.png", "Source": "POOQ", "ServiceId": "C2101", "Enabled": 0 }, -{ "Id": 219, "Name": "YTN 사이언스", "KT Name": "YTN 사이언스", "KTCh": 175, "LG Name": "사이언스TV", "LGCh": 25, "SK Name": "YTN 사이언스", "SKCh": 262, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/gwDHYGf.png", "Source": "SKB", "ServiceId": "422", "Enabled": 0 }, -{ "Id": 220, "Name": "YTN life", "KT Name": "YTN life", "KTCh": 190, "LG Name": "YTN 라이프", "LGCh": 125, "SK Name": "YTN 라이프", "SKCh": 157, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/f66yRT9.png", "Source": "SK", "ServiceId": "632", "Enabled": 0 }, -{ "Id": 221, "Name": "가요TV", "KT Name": "가요TV", "KTCh": 93, "LG Name": "가요TV", "LGCh": 102, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/6ncOOSg.png", "Source": "ISCS", "ServiceId": "356", "Enabled": 0 }, -{ "Id": 222, "Name": "국방TV", "KT Name": "국방TV", "KTCh": 260, "LG Name": "국방TV", "LGCh": 174, "SK Name": "국방TV", "SKCh": 282, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/yyXkYzJ.png", "Source": "ISCS", "ServiceId": "114", "Enabled": 0 }, -{ "Id": 223, "Name": "국회방송", "KT Name": "국회방송", "KTCh": 65, "LG Name": "국회방송", "LGCh": 172, "SK Name": "국회방송", "SKCh": 291, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/l1OEn7O.png", "Source": "LG", "ServiceId": "717", "Enabled": 0 }, -{ "Id": 225, "Name": "내외경제TV", "KT Name": "내외경제TV", "KTCh": 285, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/cQHPmCw.png", "Source": "KT", "ServiceId": "285", "Enabled": 0 }, -{ "Id": 226, "Name": "다문화티브이", "KT Name": "다문화티브이", "KTCh": 283, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/nZK3lCC.png", "Source": "KT", "ServiceId": "283", "Enabled": 0 }, -{ "Id": 228, "Name": "대교 어린이TV", "KT Name": "대교 어린이TV", "KTCh": 141, "LG Name": "어린이TV", "LGCh": 156, "SK Name": "어린이TV", "SKCh": 191, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/CETWIE6.png", "Source": "SKY", "ServiceId": "17", "Enabled": 0 }, -{ "Id": 229, "Name": "동아TV", "KT Name": "동아TV", "KTCh": 82, "LG Name": "동아TV", "LGCh": 84, "SK Name": "동아TV", "SKCh": 218, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/AlmV8jS.png", "Source": "HCN", "ServiceId": "247", "Enabled": 0 }, -{ "Id": 230, "Name": "드라마H", "KT Name": "드라마H", "KTCh": 70, "LG Name": "", "LGCh": null, "SK Name": "드라마H", "SKCh": 46, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/xT7pVuI.png", "Source": "SKY", "ServiceId": "287", "Enabled": 0 }, -{ "Id": 231, "Name": "드라마큐브", "KT Name": "드라마큐브", "KTCh": 46, "LG Name": "", "LGCh": null, "SK Name": "드라마큐브", "SKCh": 36, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/4ESaIH6.png", "Source": "HCN", "ServiceId": "499", "Enabled": 0 }, -{ "Id": 232, "Name": "드라맥스", "KT Name": "드라맥스", "KTCh": 47, "LG Name": "", "LGCh": null, "SK Name": "드라맥스", "SKCh": 38, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/jcguamX.png", "Source": "NAVER", "ServiceId": "814782", "Enabled": 0 }, -{ "Id": 233, "Name": "디원", "KT Name": "디원", "KTCh": 115, "LG Name": "디원", "LGCh": 90, "SK Name": "디원", "SKCh": 45, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/8nE7mmk.png", "Source": "LG", "ServiceId": "666", "Enabled": 0 }, -{ "Id": 234, "Name": "디즈니주니어", "KT Name": "디즈니주니어", "KTCh": 151, "LG Name": "디즈니 주니어", "LGCh": 151, "SK Name": "디즈니주니어", "SKCh": 172, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/EGiEKhj.png", "Source": "SKY", "ServiceId": "504", "Enabled": 0 }, -{ "Id": 235, "Name": "Disney Channel", "KT Name": "Disney Channel", "KTCh": 130, "LG Name": "디즈니 채널", "LGCh": 150, "SK Name": "디즈니채널", "SKCh": 171, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/qZdqeZo.png", "Source": "SKY", "ServiceId": "503", "Enabled": 0 }, -{ "Id": 237, "Name": "롯데원티비", "KT Name": "롯데원티비", "KTCh": 44, "LG Name": "롯데 OneTV", "LGCh": 21, "SK Name": "롯데OneTV", "SKCh": 39, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/vri0qlq.png", "Source": "EPG", "ServiceId": "548", "Enabled": 0 }, -{ "Id": 238, "Name": "롯데홈쇼핑", "KT Name": "롯데홈쇼핑", "KTCh": 6, "LG Name": "롯데홈쇼핑", "LGCh": 12, "SK Name": "롯데홈쇼핑", "SKCh": 10, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/2bCfj0y.png", "Source": "ISCS", "ServiceId": "3", "Enabled": 0 }, -{ "Id": 239, "Name": "리빙TV", "KT Name": "리빙TV", "KTCh": 276, "LG Name": "", "LGCh": null, "SK Name": "리빙TV", "SKCh": 251, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/0jGCpfx.png", "Source": "EPG", "ServiceId": "28", "Enabled": 0 }, -{ "Id": 240, "Name": "마이펫TV", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "마이펫TV", "SKCh": 92, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/Oy7qjnW.png", "Source": "SK", "ServiceId": "258", "Enabled": 0 }, -{ "Id": 241, "Name": "매일경제TV", "KT Name": "매일경제TV", "KTCh": 182, "LG Name": "매일경제TV", "LGCh": 112, "SK Name": "매일경제TV", "SKCh": 153, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/a4PwnPm.png", "Source": "EPG", "ServiceId": "594", "Enabled": 0 }, -{ "Id": 244, "Name": "미드나잇", "KT Name": "미드나잇", "KTCh": 205, "LG Name": "미드나잇", "LGCh": 191, "SK Name": "미드나잇", "SKCh": 321, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/zLJHU3J.png", "Source": "EPG", "ServiceId": "169", "Enabled": 0 }, -{ "Id": 245, "Name": "바둑TV", "KT Name": "바둑TV", "KTCh": 120, "LG Name": "바둑TV", "LGCh": 97, "SK Name": "바둑TV", "SKCh": 240, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/jbRu8T2.png", "Source": "EPG", "ServiceId": "46", "Enabled": 0 }, -{ "Id": 246, "Name": "법률방송", "KT Name": "법률방송", "KTCh": 213, "LG Name": "", "LGCh": null, "SK Name": "법률방송", "SKCh": 280, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/WJaHOAP.png", "Source": "ISCS", "ServiceId": "149", "Enabled": 0 }, -{ "Id": 247, "Name": "복지TV", "KT Name": "복지TV", "KTCh": 219, "LG Name": "복지TV", "LGCh": 173, "SK Name": "복지TV", "SKCh": 293, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/cTV0rnb.png", "Source": "ISCS", "ServiceId": "344", "Enabled": 0 }, -{ "Id": 249, "Name": "부동산토마토", "KT Name": "부동산토마토", "KTCh": 188, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/ePLp200.png", "Source": "KT", "ServiceId": "188", "Enabled": 0 }, -{ "Id": 250, "Name": "부메랑", "KT Name": "부메랑", "KTCh": 139, "LG Name": "부메랑", "LGCh": 166, "SK Name": "부메랑", "SKCh": 175, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/GSPRJqf.png", "Source": "NAVER", "ServiceId": "815072", "Enabled": 0 }, -{ "Id": 251, "Name": "브레인TV", "KT Name": "브레인TV", "KTCh": 122, "LG Name": "브레인TV", "LGCh": 98, "SK Name": "브레인TV", "SKCh": 242, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/1422kP1.png", "Source": "EPG", "ServiceId": "488", "Enabled": 0 }, -{ "Id": 253, "Name": "사회안전방송", "KT Name": "사회안전방송", "KTCh": 278, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/EEfrqCW.png", "Source": "NAVER", "ServiceId": "815484", "Enabled": 0 }, -{ "Id": 254, "Name": "생활체육TV", "KT Name": "생활체육TV", "KTCh": 282, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/gefY5Bw.png", "Source": "NAVER", "ServiceId": "814883", "Enabled": 0 }, -{ "Id": 255, "Name": "서울경제TV", "KT Name": "서울경제TV", "KTCh": 184, "LG Name": "서울경제TV", "LGCh": 124, "SK Name": "서울경제TV", "SKCh": 156, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/LBzj77k.png", "Source": "ISCS", "ServiceId": "24", "Enabled": 0 }, -{ "Id": 256, "Name": "소비자TV", "KT Name": "소비자TV", "KTCh": 265, "LG Name": "소비자TV", "LGCh": 177, "SK Name": "소비자TV", "SKCh": 275, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/971hUD2.png", "Source": "SKB", "ServiceId": "442", "Enabled": 0 }, -{ "Id": 257, "Name": "소상공인방송", "KT Name": "소상공인방송", "KTCh": 255, "LG Name": "소상공인방송", "LGCh": 175, "SK Name": "소상공인방송", "SKCh": 271, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/3k1D4LA.png", "Source": "ISCS", "ServiceId": "1395", "Enabled": 0 }, -{ "Id": 258, "Name": "쇼핑엔T", "KT Name": "쇼핑엔티", "KTCh": 33, "LG Name": "쇼핑엔티", "LGCh": 76, "SK Name": "쇼핑엔티", "SKCh": 35, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/Q7FHxYB.png", "Source": "SK", "ServiceId": "336", "Enabled": 0 }, -{ "Id": 260, "Name": "신세계쇼핑", "KT Name": "신세계쇼핑", "KTCh": 2, "LG Name": "신세계쇼핑", "LGCh": 74, "SK Name": "신세계쇼핑", "SKCh": 22, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/ZhYaqpt.png", "Source": "SK", "ServiceId": "339", "Enabled": 0 }, -{ "Id": 262, "Name": "실버아이TV", "KT Name": "실버아이TV", "KTCh": 266, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/xm1O8eQ.png", "Source": "ISCS", "ServiceId": "357", "Enabled": 0 }, -{ "Id": 263, "Name": "아리랑 TV", "KT Name": "아리랑 TV", "KTCh": 200, "LG Name": "아리랑TV", "LGCh": 141, "SK Name": "아리랑TV", "SKCh": 270, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/nFWWIFP.png", "Source": "ISCS", "ServiceId": "17", "Enabled": 0 }, -{ "Id": 264, "Name": "아시아경제TV", "KT Name": "아시아경제TV", "KTCh": 186, "LG Name": "아시아경제TV", "LGCh": 113, "SK Name": "아시아경제TV", "SKCh": 154, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/2D6WoS8.png", "Source": "ISCS", "ServiceId": "1348", "Enabled": 0 }, -{ "Id": 265, "Name": "아임쇼핑", "KT Name": "아임쇼핑", "KTCh": 22, "LG Name": "아임쇼핑", "LGCh": 20, "SK Name": "아임쇼핑", "SKCh": 3, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/E3pJ5Jz.png", "Source": "SK", "ServiceId": "332", "Enabled": 0 }, -{ "Id": 266, "Name": "애니플러스", "KT Name": "애니플러스", "KTCh": 138, "LG Name": "애니플러스", "LGCh": 149, "SK Name": "애니플러스", "SKCh": 178, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/7RKoOZq.png", "Source": "SKY", "ServiceId": "348", "Enabled": 0 }, -{ "Id": 268, "Name": "연합뉴스TV", "KT Name": "연합뉴스TV", "KTCh": 23, "LG Name": "연합뉴스TV", "LGCh": 23, "SK Name": "연합뉴스TV", "SKCh": 23, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/KlTCP8V.png", "Source": "POOQ", "ServiceId": "Y01", "Enabled": 0 }, -{ "Id": 271, "Name": "육아방송", "KT Name": "육아방송", "KTCh": 217, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/UEIB4ZG.png", "Source": "EPG", "ServiceId": "252", "Enabled": 0 }, -{ "Id": 272, "Name": "이데일리TV", "KT Name": "이데일리TV", "KTCh": 183, "LG Name": "이데일리TV", "LGCh": 123, "SK Name": "이데일리TV", "SKCh": 155, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/W90Hw2p.png", "Source": "LG", "ServiceId": "631", "Enabled": 0 }, -{ "Id": 273, "Name": "이벤트TV", "KT Name": "이벤트TV", "KTCh": 263, "LG Name": "이벤트TV", "LGCh": 103, "SK Name": "이벤트TV", "SKCh": 238, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/1Eeyijd.png", "Source": "SKB", "ServiceId": "262", "Enabled": 0 }, -{ "Id": 275, "Name": "인디필름", "KT Name": "인디필름", "KTCh": 277, "LG Name": "", "LGCh": null, "SK Name": "인디필름", "SKCh": 61, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/iA5UIJ9.png", "Source": "SKB", "ServiceId": "441", "Enabled": 0 }, -{ "Id": 277, "Name": "정철영어 TV", "KT Name": "정철영어 TV", "KTCh": 155, "LG Name": "정철영어TV", "LGCh": 161, "SK Name": "정철영어TV", "SKCh": 201, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/lumUZz3.png", "Source": "LG", "ServiceId": "772", "Enabled": 0 }, -{ "Id": 278, "Name": "중화TV", "KT Name": "중화TV", "KTCh": 110, "LG Name": "중화TV", "LGCh": 87, "SK Name": "중화TV", "SKCh": 104, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/Nal18s5.png", "Source": "SKB", "ServiceId": "186", "Enabled": 0 }, -{ "Id": 279, "Name": "JJC지방자치TV", "KT Name": "JJC지방자치TV", "KTCh": 279, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/AuXr9jA.png", "Source": "NAVER", "ServiceId": "3244879", "Enabled": 0 }, -{ "Id": 280, "Name": "채널 Ching", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "채널 Ching", "SKCh": 105, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/tRqGKcS.png", "Source": "HCN", "ServiceId": "780", "Enabled": 0 }, -{ "Id": 281, "Name": "채널A", "KT Name": "채널A", "KTCh": 18, "LG Name": "채널A", "LGCh": 18, "SK Name": "채널A", "SKCh": 18, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/xti35f5.png", "Source": "POOQ", "ServiceId": "C2501", "Enabled": 0 }, -{ "Id": 282, "Name": "채널A 플러스", "KT Name": "채널A 플러스", "KTCh": 98, "LG Name": "채널A+", "LGCh": 115, "SK Name": "채널A 플러스", "SKCh": 97, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/rRisTh8.png", "Source": "SKB", "ServiceId": "891", "Enabled": 0 }, -{ "Id": 283, "Name": "채널CGV", "KT Name": "채널CGV", "KTCh": 29, "LG Name": "채널CGV", "LGCh": 39, "SK Name": "Ch CGV", "SKCh": 53, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/fwjRwkx.png", "Source": "SKY", "ServiceId": "163", "Enabled": 0 }, -{ "Id": 284, "Name": "채널i", "KT Name": "채널i", "KTCh": 250, "LG Name": "", "LGCh": null, "SK Name": "채널i", "SKCh": 281, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/X7lXvtw.png", "Source": "ISCS", "ServiceId": "1397", "Enabled": 0 }, -{ "Id": 285, "Name": "채널뷰", "KT Name": "채널뷰", "KTCh": 176, "LG Name": "", "LGCh": null, "SK Name": "채널View", "SKCh": 212, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/lvtWgFL.png", "Source": "SKY", "ServiceId": "918", "Enabled": 0 }, -{ "Id": 286, "Name": "채널차이나", "KT Name": "채널차이나", "KTCh": 102, "LG Name": "채널차이나", "LGCh": 80, "SK Name": "채널차이나", "SKCh": 108, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/jEyoLS1.png", "Source": "ISCS", "ServiceId": "1066", "Enabled": 0 }, -{ "Id": 287, "Name": "채널해피독", "KT Name": "채널해피독", "KTCh": 203, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/ly649tS.png", "Source": "NAVER", "ServiceId": "2296260", "Enabled": 0 }, -{ "Id": 289, "Name": "카툰네트워크", "KT Name": "카툰네트워크", "KTCh": 137, "LG Name": "카툰네트워크", "LGCh": 155, "SK Name": "카툰네트워크", "SKCh": 177, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/cJZHPjr.png", "Source": "SKY", "ServiceId": "358", "Enabled": 0 }, -{ "Id": 290, "Name": "캐치온1", "KT Name": "캐치온1", "KTCh": 66, "LG Name": "캐치온1", "LGCh": 48, "SK Name": "CATCH ON 1", "SKCh": 51, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/qK9KkRd.png", "Source": "EPG", "ServiceId": "31", "Enabled": 0 }, -{ "Id": 291, "Name": "캐치온2", "KT Name": "캐치온2", "KTCh": 67, "LG Name": "캐치온2", "LGCh": 49, "SK Name": "CATCH ON 2", "SKCh": 52, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/sLc2req.png", "Source": "EPG", "ServiceId": "161", "Enabled": 0 }, -{ "Id": 292, "Name": "브릿지TV", "KT Name": "브릿지TV", "KTCh": 270, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/KATTup7.png", "Source": "KT", "ServiceId": "207", "Enabled": 0 }, -{ "Id": 293, "Name": "코미디TV", "KT Name": "코미디TV", "KTCh": 85, "LG Name": "", "LGCh": null, "SK Name": "코미디TV", "SKCh": 87, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/DHbUoDm.png", "Source": "SKY", "ServiceId": "100", "Enabled": 0 }, -{ "Id": 294, "Name": "쿠키건강TV", "KT Name": "쿠키건강TV", "KTCh": 220, "LG Name": "쿠키건강TV", "LGCh": 144, "SK Name": "쿠키건강TV", "SKCh": 269, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/4gl92D1.png", "Source": "EPG", "ServiceId": "735", "Enabled": 0 }, -{ "Id": 296, "Name": "키즈원", "KT Name": "키즈원", "KTCh": 148, "LG Name": "키즈원", "LGCh": 157, "SK Name": "KIDS1", "SKCh": 193, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/f8T1Sw4.png", "Source": "NAVER", "ServiceId": "815020", "Enabled": 0 }, -{ "Id": 297, "Name": "토마토TV", "KT Name": "토마토TV", "KTCh": 185, "LG Name": "토마토TV", "LGCh": 111, "SK Name": "토마토TV", "SKCh": 150, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/dVWy3Ex.png", "Source": "SK", "ServiceId": "620", "Enabled": 0 }, -{ "Id": 299, "Name": "펜트하우스tv", "KT Name": "펜트하우스tv", "KTCh": 208, "LG Name": "", "LGCh": null, "SK Name": "펜트하우스TV", "SKCh": 324, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/03U2Ges.png", "Source": "EPG", "ServiceId": "599", "Enabled": 0 }, -{ "Id": 301, "Name": "가톨릭평화방송", "KT Name": "가톨릭평화방송", "KTCh": 231, "LG Name": "가톨릭평화방송", "LGCh": 184, "SK Name": "가톨릭평화방송", "SKCh": 307, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/G5fTCL3.png", "Source": "HCN", "ServiceId": "33", "Enabled": 0 }, -{ "Id": 302, "Name": "폴라리스TV", "KT Name": "폴라리스TV", "KTCh": 129, "LG Name": "폴라리스 TV", "LGCh": 67, "SK Name": "폴라리스TV", "SKCh": 249, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/aghufJ7.png", "Source": "SK", "ServiceId": "252", "Enabled": 0 }, -{ "Id": 303, "Name": "한국경제TV", "KT Name": "한국경제TV", "KTCh": 180, "LG Name": "한국경제TV", "LGCh": 121, "SK Name": "한국경제TV", "SKCh": 151, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/ChnD0FT.png", "Source": "ISCS", "ServiceId": "197", "Enabled": 0 }, -{ "Id": 305, "Name": "한국승마방송", "KT Name": "한국승마방송", "KTCh": 259, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/VZdQLwj.png", "Source": "NAVER", "ServiceId": "814904", "Enabled": 0 }, -{ "Id": 307, "Name": "한국직업방송", "KT Name": "한국직업방송", "KTCh": 252, "LG Name": "", "LGCh": null, "SK Name": "한국직업방송", "SKCh": 273, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/WUvf0If.png", "Source": "ISCS", "ServiceId": "1325", "Enabled": 0 }, -{ "Id": 309, "Name": "허니TV", "KT Name": "허니TV", "KTCh": 207, "LG Name": "허니TV", "LGCh": 193, "SK Name": "허니TV", "SKCh": 323, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/KczRCLW.png", "Source": "EPG", "ServiceId": "112", "Enabled": 0 }, -{ "Id": 311, "Name": "헬스메디tv", "KT Name": "헬스메디tv", "KTCh": 271, "LG Name": "헬스메디TV", "LGCh": 138, "SK Name": "헬스메디TV", "SKCh": 268, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/vsxRuFh.png", "Source": "ISCS", "ServiceId": "1419", "Enabled": 0 }, -{ "Id": 312, "Name": "현대홈쇼핑", "KT Name": "현대홈쇼핑", "KTCh": 10, "LG Name": "현대홈쇼핑", "LGCh": 10, "SK Name": "현대홈쇼핑", "SKCh": 8, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/87fdrA5.png", "Source": "ISCS", "ServiceId": "8", "Enabled": 0 }, -{ "Id": 313, "Name": "현대홈쇼핑+샵", "KT Name": "현대홈쇼핑+샵", "KTCh": 36, "LG Name": "현대홈쇼핑+샵", "LGCh": 34, "SK Name": "현대홈쇼핑+Shop", "SKCh": 31, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/COo8Bcm.png", "Source": "SK", "ServiceId": "337", "Enabled": 0 }, -{ "Id": 314, "Name": "홈&쇼핑", "KT Name": "홈&쇼핑", "KTCh": 14, "LG Name": "홈앤쇼핑", "LGCh": 4, "SK Name": "홈&쇼핑", "SKCh": 4, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/nLxw0LW.png", "Source": "ISCS", "ServiceId": "1028", "Enabled": 0 }, -{ "Id": 315, "Name": "환경TV", "KT Name": "환경TV", "KTCh": 166, "LG Name": "", "LGCh": null, "SK Name": "환경TV", "SKCh": 276, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/eITOr2Y.png", "Source": "HCN", "ServiceId": "29", "Enabled": 0 }, -{ "Id": 316, "Name": "Life N", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "Life N", "SKCh": 215, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/qNde2j7.png", "Source": "SKB", "ServiceId": "277", "Enabled": 0 }, -{ "Id": 317, "Name": "Discovery HD", "KT Name": "", "KTCh": null, "LG Name": "디스커버리 아시아", "LGCh": 133, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/bH9BY7E.png", "Source": "SKY", "ServiceId": "929", "Enabled": 0 }, -{ "Id": 318, "Name": "Celestial Movies", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "Celestial Movies", "SKCh": 62, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/xDXM13Q.png", "Source": "SKB", "ServiceId": "877", "Enabled": 0 }, -{ "Id": 319, "Name": "UHD Dream TV", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "UHD Dream TV", "SKCh": 71, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/aLG2rKa.png", "Source": "SKY", "ServiceId": "689", "Enabled": 0 }, -{ "Id": 320, "Name": "UMAX", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "UMAX", "SKCh": 73, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/EgVuybQ.png", "Source": "SKB", "ServiceId": "69", "Enabled": 0 }, -{ "Id": 321, "Name": "NHK World TV", "KT Name": "", "KTCh": null, "LG Name": "NHK World TV", "LGCh": 142, "SK Name": "NHK World TV", "SKCh": 221, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/pCuIQsT.png", "Source": "LG", "ServiceId": "669", "Enabled": 0 }, -{ "Id": 362, "Name": "CJB 청주방송", "KT Name": "CJB 청주방송", "KTCh": 5, "LG Name": "CJB 청주방송", "LGCh": 5, "SK Name": "CJB 청주방송", "SKCh": 5, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/J6zQfQu.png", "Source": "NAVER", "ServiceId": "814684", "Enabled": 0 }, -{ "Id": 363, "Name": "G1 강원민방", "KT Name": "G1 강원민방", "KTCh": 5, "LG Name": "G1 강원민방", "LGCh": 5, "SK Name": "G1 강원민방", "SKCh": 5, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/aYqGo9x.png", "Source": "NAVER", "ServiceId": "814614", "Enabled": 0 }, -{ "Id": 364, "Name": "JIBS 제주방송", "KT Name": "JIBS 제주방송", "KTCh": 5, "LG Name": "JIBS 제주방송", "LGCh": 5, "SK Name": "JIBS 제주방송", "SKCh": 5, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/7YZ1lkJ.png", "Source": "NAVER", "ServiceId": "814703", "Enabled": 0 }, -{ "Id": 365, "Name": "JTV 전주방송", "KT Name": "JTV 전주방송", "KTCh": 5, "LG Name": "JTV 전주방송", "LGCh": 5, "SK Name": "JTV 전주방송", "SKCh": 5, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/XFKcvaN.png", "Source": "NAVER", "ServiceId": "814661", "Enabled": 0 }, -{ "Id": 366, "Name": "KBC 광주방송", "KT Name": "KBC 광주방송", "KTCh": 5, "LG Name": "KBC 광주방송", "LGCh": 5, "SK Name": "KBC 광주방송", "SKCh": 5, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/3M5UOIH.png", "Source": "NAVER", "ServiceId": "814652", "Enabled": 0 }, -{ "Id": 367, "Name": "KNN 부산경남방송", "KT Name": "KNN 부산경남방송", "KTCh": 5, "LG Name": "KNN 부산경남방송", "LGCh": 5, "SK Name": "KNN 부산경남방송", "SKCh": 5, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/RcViTam.png", "Source": "NAVER", "ServiceId": "814628", "Enabled": 0 }, -{ "Id": 369, "Name": "TBC 대구방송", "KT Name": "TBC 대구방송", "KTCh": 5, "LG Name": "TBC 대구방송", "LGCh": 5, "SK Name": "TBC 대구방송", "SKCh": 5, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/wmF5z8V.png", "Source": "NAVER", "ServiceId": "814639", "Enabled": 0 }, -{ "Id": 370, "Name": "TJB 대전방송", "KT Name": "TJB 대전방송", "KTCh": 5, "LG Name": "TJB 대전방송", "LGCh": 5, "SK Name": "TJB 대전방송", "SKCh": 5, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/9JAy4Bu.png", "Source": "NAVER", "ServiceId": "814671", "Enabled": 0 }, -{ "Id": 371, "Name": "UBC 울산방송", "KT Name": "UBC 울산방송", "KTCh": 5, "LG Name": "UBC 울산방송", "LGCh": 5, "SK Name": "UBC 울산방송", "SKCh": 5, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/qbBR1k5.png", "Source": "NAVER", "ServiceId": "814694", "Enabled": 0 }, -{ "Id": 372, "Name": "강릉 KBS1", "KT Name": "강릉 KBS1", "KTCh": 9, "LG Name": "강릉 KBS1", "LGCh": 9, "SK Name": "강릉 KBS1", "SKCh": 9, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/e31o5gw.png", "Source": "NAVER", "ServiceId": "814602", "Enabled": 0 }, -{ "Id": 373, "Name": "강릉 MBC", "KT Name": "강릉 MBC", "KTCh": 11, "LG Name": "강릉 MBC", "LGCh": 11, "SK Name": "강릉 MBC", "SKCh": 11, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/duig32i.png", "Source": "NAVER", "ServiceId": "814606", "Enabled": 0 }, -{ "Id": 374, "Name": "경인 KBS1", "KT Name": "경인 KBS1", "KTCh": 9, "LG Name": "경인 KBS1", "LGCh": 9, "SK Name": "경인 KBS1", "SKCh": 9, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/e31o5gw.png", "Source": "NAVER", "ServiceId": "814597", "Enabled": 0 }, -{ "Id": 375, "Name": "광주 KBS1", "KT Name": "광주 KBS1", "KTCh": 9, "LG Name": "광주 KBS1", "LGCh": 9, "SK Name": "광주 KBS1", "SKCh": 9, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/e31o5gw.png", "Source": "NAVER", "ServiceId": "814642", "Enabled": 0 }, -{ "Id": 376, "Name": "광주 MBC", "KT Name": "광주 MBC", "KTCh": 11, "LG Name": "광주 MBC", "LGCh": 11, "SK Name": "광주 MBC", "SKCh": 11, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/duig32i.png", "Source": "NAVER", "ServiceId": "814644", "Enabled": 0 }, -{ "Id": 377, "Name": "대구 KBS1", "KT Name": "대구 KBS1", "KTCh": 9, "LG Name": "대구 KBS1", "LGCh": 9, "SK Name": "대구 KBS1", "SKCh": 9, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/e31o5gw.png", "Source": "NAVER", "ServiceId": "814630", "Enabled": 0 }, -{ "Id": 378, "Name": "대구 MBC", "KT Name": "대구 MBC", "KTCh": 11, "LG Name": "대구 MBC", "LGCh": 11, "SK Name": "대구 MBC", "SKCh": 11, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/duig32i.png", "Source": "NAVER", "ServiceId": "814633", "Enabled": 0 }, -{ "Id": 379, "Name": "대전 KBS1", "KT Name": "대전 KBS1", "KTCh": 9, "LG Name": "대전 KBS1", "LGCh": 9, "SK Name": "대전 KBS1", "SKCh": 9, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/e31o5gw.png", "Source": "NAVER", "ServiceId": "814665", "Enabled": 0 }, -{ "Id": 380, "Name": "대전 MBC", "KT Name": "대전 MBC", "KTCh": 11, "LG Name": "대전 MBC", "LGCh": 11, "SK Name": "대전 MBC", "SKCh": 11, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/duig32i.png", "Source": "NAVER", "ServiceId": "814668", "Enabled": 0 }, -{ "Id": 381, "Name": "목포 KBS1", "KT Name": "목포 KBS1", "KTCh": 9, "LG Name": "목포 KBS1", "LGCh": 9, "SK Name": "목포 KBS1", "SKCh": 9, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/e31o5gw.png", "Source": "LG", "ServiceId": "523", "Enabled": 0 }, -{ "Id": 382, "Name": "목포 MBC", "KT Name": "목포 MBC", "KTCh": 11, "LG Name": "목포 MBC", "LGCh": 11, "SK Name": "목포 MBC", "SKCh": 11, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/duig32i.png", "Source": "NAVER", "ServiceId": "814646", "Enabled": 0 }, -{ "Id": 383, "Name": "부산 KBS1", "KT Name": "부산 KBS1", "KTCh": 9, "LG Name": "부산 KBS1", "LGCh": 9, "SK Name": "부산 KBS1", "SKCh": 9, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/e31o5gw.png", "Source": "NAVER", "ServiceId": "814617", "Enabled": 0 }, -{ "Id": 384, "Name": "부산 MBC", "KT Name": "부산 MBC", "KTCh": 11, "LG Name": "부산 MBC", "LGCh": 11, "SK Name": "부산 MBC", "SKCh": 11, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/duig32i.png", "Source": "NAVER", "ServiceId": "814621", "Enabled": 0 }, -{ "Id": 385, "Name": "삼척 MBC", "KT Name": "삼척 MBC", "KTCh": 11, "LG Name": "삼척 MBC", "LGCh": 11, "SK Name": "삼척 MBC", "SKCh": 11, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/duig32i.png", "Source": "NAVER", "ServiceId": "814608", "Enabled": 0 }, -{ "Id": 386, "Name": "순천 KBS1", "KT Name": "순천 KBS1", "KTCh": 9, "LG Name": "순천 KBS1", "LGCh": 9, "SK Name": "순천 KBS1", "SKCh": 9, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/e31o5gw.png", "Source": "LG", "ServiceId": "522", "Enabled": 0 }, -{ "Id": 387, "Name": "안동 KBS1", "KT Name": "안동 KBS1", "KTCh": 9, "LG Name": "안동 KBS1", "LGCh": 9, "SK Name": "안동 KBS1", "SKCh": 9, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/e31o5gw.png", "Source": "LG", "ServiceId": "517", "Enabled": 0 }, -{ "Id": 388, "Name": "안동 MBC", "KT Name": "안동 MBC", "KTCh": 11, "LG Name": "안동 MBC", "LGCh": 11, "SK Name": "안동 MBC", "SKCh": 11, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/duig32i.png", "Source": "NAVER", "ServiceId": "814635", "Enabled": 0 }, -{ "Id": 389, "Name": "여수 MBC", "KT Name": "여수 MBC", "KTCh": 11, "LG Name": "여수 MBC", "LGCh": 11, "SK Name": "여수 MBC", "SKCh": 11, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/duig32i.png", "Source": "NAVER", "ServiceId": "814649", "Enabled": 0 }, -{ "Id": 390, "Name": "울산 KBS1", "KT Name": "울산 KBS1", "KTCh": 9, "LG Name": "울산 KBS1", "LGCh": 9, "SK Name": "울산 KBS1", "SKCh": 9, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/e31o5gw.png", "Source": "NAVER", "ServiceId": "814687", "Enabled": 0 }, -{ "Id": 391, "Name": "울산 MBC", "KT Name": "울산 MBC", "KTCh": 11, "LG Name": "울산 MBC", "LGCh": 11, "SK Name": "울산 MBC", "SKCh": 11, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/duig32i.png", "Source": "NAVER", "ServiceId": "814691", "Enabled": 0 }, -{ "Id": 392, "Name": "원주 KBS1", "KT Name": "원주 KBS1", "KTCh": 9, "LG Name": "원주 KBS1", "LGCh": 9, "SK Name": "원주 KBS1", "SKCh": 9, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/e31o5gw.png", "Source": "LG", "ServiceId": "531", "Enabled": 0 }, -{ "Id": 393, "Name": "원주 MBC", "KT Name": "원주 MBC", "KTCh": 11, "LG Name": "원주 MBC", "LGCh": 11, "SK Name": "원주 MBC", "SKCh": 11, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/duig32i.png", "Source": "NAVER", "ServiceId": "814610", "Enabled": 0 }, -{ "Id": 394, "Name": "전주 KBS1", "KT Name": "전주 KBS1", "KTCh": 9, "LG Name": "전주 KBS1", "LGCh": 9, "SK Name": "전주 KBS1", "SKCh": 9, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/e31o5gw.png", "Source": "NAVER", "ServiceId": "814655", "Enabled": 0 }, -{ "Id": 395, "Name": "전주 MBC", "KT Name": "전주 MBC", "KTCh": 11, "LG Name": "전주 MBC", "LGCh": 11, "SK Name": "전주 MBC", "SKCh": 11, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/duig32i.png", "Source": "NAVER", "ServiceId": "814658", "Enabled": 0 }, -{ "Id": 396, "Name": "제주 KBS1", "KT Name": "제주 KBS1", "KTCh": 9, "LG Name": "제주 KBS1", "LGCh": 9, "SK Name": "제주 KBS1", "SKCh": 9, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/e31o5gw.png", "Source": "NAVER", "ServiceId": "814697", "Enabled": 0 }, -{ "Id": 397, "Name": "제주 MBC", "KT Name": "제주 MBC", "KTCh": 11, "LG Name": "제주 MBC", "LGCh": 11, "SK Name": "제주 MBC", "SKCh": 11, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/duig32i.png", "Source": "NAVER", "ServiceId": "814700", "Enabled": 0 }, -{ "Id": 398, "Name": "진주 KBS1", "KT Name": "진주 KBS1", "KTCh": 9, "LG Name": "진주 KBS1", "LGCh": 9, "SK Name": "진주 KBS1", "SKCh": 9, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/e31o5gw.png", "Source": "LG", "ServiceId": "529", "Enabled": 0 }, -{ "Id": 399, "Name": "진주 MBC", "KT Name": "진주 MBC", "KTCh": 11, "LG Name": "진주 MBC", "LGCh": 11, "SK Name": "진주 MBC", "SKCh": 11, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/duig32i.png", "Source": "NAVER", "ServiceId": "814624", "Enabled": 0 }, -{ "Id": 400, "Name": "창원 KBS1", "KT Name": "창원 KBS1", "KTCh": 9, "LG Name": "창원 KBS1", "LGCh": 9, "SK Name": "창원 KBS1", "SKCh": 9, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/e31o5gw.png", "Source": "NAVER", "ServiceId": "814619", "Enabled": 0 }, -{ "Id": 401, "Name": "청주 KBS1", "KT Name": "청주 KBS1", "KTCh": 9, "LG Name": "청주 KBS1", "LGCh": 9, "SK Name": "청주 KBS1", "SKCh": 9, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/e31o5gw.png", "Source": "NAVER", "ServiceId": "814675", "Enabled": 0 }, -{ "Id": 402, "Name": "청주 MBC", "KT Name": "청주 MBC", "KTCh": 11, "LG Name": "청주 MBC", "LGCh": 11, "SK Name": "청주 MBC", "SKCh": 11, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/duig32i.png", "Source": "NAVER", "ServiceId": "814678", "Enabled": 0 }, -{ "Id": 403, "Name": "춘천 KBS1", "KT Name": "춘천 KBS1", "KTCh": 9, "LG Name": "춘천 KBS1", "LGCh": 9, "SK Name": "춘천 KBS1", "SKCh": 9, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/e31o5gw.png", "Source": "NAVER", "ServiceId": "814604", "Enabled": 0 }, -{ "Id": 404, "Name": "춘천 MBC", "KT Name": "춘천 MBC", "KTCh": 11, "LG Name": "춘천 MBC", "LGCh": 11, "SK Name": "춘천 MBC", "SKCh": 11, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/duig32i.png", "Source": "NAVER", "ServiceId": "814612", "Enabled": 0 }, -{ "Id": 405, "Name": "충주 KBS1", "KT Name": "충주 KBS1", "KTCh": 9, "LG Name": "충주 KBS1", "LGCh": 9, "SK Name": "충주 KBS1", "SKCh": 9, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/e31o5gw.png", "Source": "LG", "ServiceId": "513", "Enabled": 0 }, -{ "Id": 406, "Name": "충주 MBC", "KT Name": "충주 MBC", "KTCh": 11, "LG Name": "충주 MBC", "LGCh": 11, "SK Name": "충주 MBC", "SKCh": 11, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/duig32i.png", "Source": "LG", "ServiceId": "538", "Enabled": 0 }, -{ "Id": 407, "Name": "포항 KBS1", "KT Name": "포항 KBS1", "KTCh": 9, "LG Name": "포항 KBS1", "LGCh": 9, "SK Name": "포항 KBS1", "SKCh": 9, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/e31o5gw.png", "Source": "LG", "ServiceId": "518", "Enabled": 0 }, -{ "Id": 408, "Name": "포항 MBC", "KT Name": "포항 MBC", "KTCh": 11, "LG Name": "포항 MBC", "LGCh": 11, "SK Name": "포항 MBC", "SKCh": 11, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/duig32i.png", "Source": "NAVER", "ServiceId": "814637", "Enabled": 0 }, -{ "Id": 409, "Name": "DIA TV", "KT Name": "DIA TV", "KTCh": 72, "LG Name": "다이아TV", "LGCh": 93, "SK Name": "DIA TV", "SKCh": 96, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/BH3DnrW.png", "Source": "LG", "ServiceId": "690", "Enabled": 0 }, -{ "Id": 410, "Name": "메디컬TV", "KT Name": "메디컬TV", "KTCh": 254, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/S73ArUy.png", "Source": "KT", "ServiceId": "254", "Enabled": 0 }, -{ "Id": 411, "Name": "CGTN", "KT Name": "CGTN", "KTCh": 194, "LG Name": "CGTN", "LGCh": 119, "SK Name": "CGTN", "SKCh": 161, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/rhZf4Zx.png", "Source": "ISCS", "ServiceId": "86", "Enabled": 0 }, -{ "Id": 412, "Name": "C Music TV", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "C Music TV", "SKCh": 237, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/hV270KM.png", "Source": "SKB", "ServiceId": "672", "Enabled": 0 }, -{ "Id": 413, "Name": "Tvis", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "Tvis", "SKCh": 250, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/7jq2VMs.png", "Source": "SKB", "ServiceId": "260", "Enabled": 0 }, -{ "Id": 414, "Name": "SPOTV ON", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "SPOTV ON", "SKCh": 118, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/Y3eYOc2.png", "Source": "SKB", "ServiceId": "136", "Enabled": 0 }, -{ "Id": 415, "Name": "SPOTV ON2", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "SPOTV ON2", "SKCh": 119, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/jbdurz4.png", "Source": "SKB", "ServiceId": "137", "Enabled": 0 }, -{ "Id": 416, "Name": "한국선거방송", "KT Name": "한국선거방송", "KTCh": 273, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/ZSdcknl.png", "Source": "KT", "ServiceId": "273", "Enabled": 0 }, -{ "Id": 417, "Name": "EBS 교육방송", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "EBS 교육방송", "RadioCh": 901, "Icon_url": "http://i.imgur.com/eEsZJop.png", "Source": "NAVER", "ServiceId": "815452", "Enabled": 0 }, -{ "Id": 418, "Name": "KBS 1 라디오", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "KBS 1 라디오", "RadioCh": 902, "Icon_url": "http://i.imgur.com/ikJ7QQn.png", "Source": "NAVER", "ServiceId": "815455", "Enabled": 0 }, -{ "Id": 419, "Name": "KBS 2 라디오", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "KBS 2 라디오", "RadioCh": 903, "Icon_url": "http://i.imgur.com/qTrmNld.png", "Source": "NAVER", "ServiceId": "815458", "Enabled": 0 }, -{ "Id": 420, "Name": "KBS 3 라디오", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "KBS 3 라디오", "RadioCh": 904, "Icon_url": "http://i.imgur.com/3tHl7QR.png", "Source": "NAVER", "ServiceId": "815460", "Enabled": 0 }, -{ "Id": 421, "Name": "KBS ClassicFM", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "KBS ClassicFM", "RadioCh": 905, "Icon_url": "http://i.imgur.com/Z46a05G.png", "Source": "NAVER", "ServiceId": "815454", "Enabled": 0 }, -{ "Id": 422, "Name": "KBS CoolFM", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "KBS CoolFM", "RadioCh": 906, "Icon_url": "http://i.imgur.com/0SQrpHZ.png", "Source": "NAVER", "ServiceId": "815457", "Enabled": 0 }, -{ "Id": 423, "Name": "KBS WorldRaido", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "KBS WorldRaido", "RadioCh": 907, "Icon_url": "http://i.imgur.com/ns1k6LN.png", "Source": "KBS", "ServiceId": "1", "Enabled": 0 }, -{ "Id": 424, "Name": "KBS 한민족방송", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "KBS 한민족방송", "RadioCh": 908, "Icon_url": "http://i.imgur.com/S5YVPyx.png", "Source": "NAVER", "ServiceId": "815461", "Enabled": 0 }, -{ "Id": 425, "Name": "MBC 표준FM", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "MBC 표준FM", "RadioCh": 909, "Icon_url": "http://i.imgur.com/E9OMdnO.png", "Source": "NAVER", "ServiceId": "815464", "Enabled": 0 }, -{ "Id": 426, "Name": "MBC FM4U", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "MBC FM4U", "RadioCh": 910, "Icon_url": "http://i.imgur.com/csdszZD.png", "Source": "NAVER", "ServiceId": "815463", "Enabled": 0 }, -{ "Id": 427, "Name": "MBC Channel M", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "MBC Channel M", "RadioCh": 911, "Icon_url": "http://i.imgur.com/jlKGpWs.png", "Source": "MBC", "ServiceId": "1", "Enabled": 0 }, -{ "Id": 428, "Name": "SBS 파워 FM", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "SBS 파워 FM", "RadioCh": 912, "Icon_url": "http://i.imgur.com/7qcJ4bm.png", "Source": "NAVER", "ServiceId": "815467", "Enabled": 0 }, -{ "Id": 429, "Name": "SBS 러브 FM", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "SBS 러브 FM", "RadioCh": 913, "Icon_url": "http://i.imgur.com/XHHHUZ1.png", "Source": "NAVER", "ServiceId": "815465", "Enabled": 0 }, -{ "Id": 430, "Name": "국악방송", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "국악방송", "RadioCh": 914, "Icon_url": "http://i.imgur.com/qpbhUhF.png", "Source": "NAVER", "ServiceId": "2891853", "Enabled": 0 }, -{ "Id": 431, "Name": "극동방송", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "극동방송", "RadioCh": 915, "Icon_url": "http://i.imgur.com/PlqBFtV.png", "Source": "NAVER", "ServiceId": "2074616", "Enabled": 0 }, -{ "Id": 432, "Name": "BBS 불교방송", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "BBS 불교방송", "RadioCh": 916, "Icon_url": "http://i.imgur.com/B34jpmo.png", "Source": "NAVER", "ServiceId": "815448", "Enabled": 0 }, -{ "Id": 433, "Name": "CBS 표준FM", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "CBS 표준FM", "RadioCh": 917, "Icon_url": "http://i.imgur.com/yBNo2mS.png", "Source": "NAVER", "ServiceId": "815451", "Enabled": 0 }, -{ "Id": 434, "Name": "CBS 음악FM", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "CBS 음악FM", "RadioCh": 918, "Icon_url": "http://i.imgur.com/yBNo2mS.png", "Source": "NAVER", "ServiceId": "815449", "Enabled": 0 }, -{ "Id": 435, "Name": "KFM 경기방송", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "KFM 경기방송", "RadioCh": 919, "Icon_url": "http://i.imgur.com/8hSikAY.png", "Source": "NAVER", "ServiceId": "1974893", "Enabled": 0 }, -{ "Id": 436, "Name": "PBC 평화방송", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "PBC 평화방송", "RadioCh": 920, "Icon_url": "http://i.imgur.com/G5fTCL3.png", "Source": "NAVER", "ServiceId": "1974894", "Enabled": 0 }, -{ "Id": 437, "Name": "TBS 교통방송", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "TBS 교통방송", "RadioCh": 921, "Icon_url": "http://i.imgur.com/9RxxTSi.png", "Source": "NAVER", "ServiceId": "815468", "Enabled": 0 }, -{ "Id": 438, "Name": "YTN NEWS FM", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "YTN NEWS FM", "RadioCh": 922, "Icon_url": "http://i.imgur.com/dSC3YPR.png", "Source": "NAVER", "ServiceId": "2074615", "Enabled": 0 }, -{ "Id": 439, "Name": "원음방송", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "원음방송", "RadioCh": 923, "Icon_url": "http://i.imgur.com/mKWQE7z.png", "Source": "NAVER", "ServiceId": "5534687", "Enabled": 0 }, -{ "Id": 440, "Name": "국방FM", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "국방FM", "RadioCh": 924, "Icon_url": "http://i.imgur.com/zjvlIIp.png", "Source": "MIL", "ServiceId": "1", "Enabled": 0 }, -{ "Id": 441, "Name": "경인방송", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "경인방송", "RadioCh": 925, "Icon_url": "http://i.imgur.com/zBTPTRe.png", "Source": "IFM", "ServiceId": "1", "Enabled": 0 }, -{ "Id": 442, "Name": "AMC", "KT Name": "AMC", "KTCh": 221, "LG Name": "", "LGCh": null, "SK Name": "AMC", "SKCh": 100, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/cJ1B77S.png", "Source": "SKB", "ServiceId": "199", "Enabled": 0 }, -{ "Id": 443, "Name": "TVA", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/tg99cob.png", "Source": "HCN", "ServiceId": "781", "Enabled": 0 }, -{ "Id": 444, "Name": "채널W", "KT Name": "채널 W", "KTCh": 226, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/mtiKEkU.png", "Source": "POOQ", "ServiceId": "C3901", "Enabled": 0 }, -{ "Id": 445, "Name": "INSIGHT TV", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "INSIGHT TV", "SKCh": 74, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/eFTXeGV.png", "Source": "SKB", "ServiceId": "890", "Enabled": 0 }, -{ "Id": 446, "Name": "인도어스포츠", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "인도어스포츠", "SKCh": 139, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/cb58LLs.png", "Source": "ISCS", "ServiceId": "576", "Enabled": 0 }, -{ "Id": 447, "Name": "시니어TV", "KT Name": "시니어TV", "KTCh": 264, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/XaObZ8I.png", "Source": "KT", "ServiceId": "264", "Enabled": 0 }, -{ "Id": 449, "Name": "아리랑 라디오", "KT Name": "", "KTCh": null, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/GLY8HCN.png", "Source": "ARIRANG", "ServiceId": "1", "Enabled": 0 }, -{ "Id": 450, "Name": "HGTV", "KT Name": "HGTV", "KTCh": 223, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/PR4w3i2.png", "Source": "KT", "ServiceId": "223", "Enabled": 0 }, -{ "Id": 451, "Name": "다빈치러닝", "KT Name": "다빈치러닝", "KTCh": 224, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/mB9BL31.png", "Source": "KT", "ServiceId": "224", "Enabled": 0 }, -{ "Id": 452, "Name": "E! Entertainment", "KT Name": "E! 엔터", "KTCh": 225, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/VqIgfE9.png", "Source": "KT", "ServiceId": "225", "Enabled": 0 }, -{ "Id": 453, "Name": "다큐원", "KT Name": "다큐원", "KTCh": 269, "LG Name": "", "LGCh": null, "SK Name": "다큐원", "SKCh": 283, "Radio Name": "아리랑 라디오", "RadioCh": 926, "Icon_url": "http://i.imgur.com/1EZs0Tn.png", "Source": "SK", "ServiceId": "257", "Enabled": 0 }, -{ "Id": 454, "Name": "Discovery Science", "KT Name": "DSC Science", "KTCh": 222, "LG Name": "", "LGCh": null, "SK Name": "", "SKCh": null, "Radio Name": "", "RadioCh": null, "Icon_url": "http://i.imgur.com/3UfATJL.png", "Source": "KT", "ServiceId": "222", "Enabled": 0 } -] \ No newline at end of file From f543d74189f309ac013556e0c08e8cae1e7d66c8 Mon Sep 17 00:00:00 2001 From: wonipapa Date: Thu, 31 Aug 2017 17:38:52 +0900 Subject: [PATCH 17/41] =?UTF-8?q?KT=ED=95=A8=EC=88=98=EA=B9=8C=EC=A7=80=20?= =?UTF-8?q?=EC=99=84=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- epg2xml.php | 841 ++++++++++++++++++++++++++++++++-------------------- epg2xml.py | 51 ++-- 2 files changed, 549 insertions(+), 343 deletions(-) diff --git a/epg2xml.php b/epg2xml.php index 1c29e44..99b1c85 100644 --- a/epg2xml.php +++ b/epg2xml.php @@ -1,11 +1,13 @@ #!/usr/bin/env php 2 ? 2 : $period; + //$period = $period > 2 ? 2 : $period; else : printError("default_fetch_limit는 1, 2, 3, 4, 5, 6, 7만 가능합니다."); @@ -301,10 +303,10 @@ endif; function getEPG() { $fp = $GLOBALS['fp']; $MyISP = $GLOBALS['MyISP']; + $MyChannels = $GLOBALS['MyChannels']; $Channelfile = __DIR__."/Channel.json"; $IconUrl = ""; $ChannelInfos = array(); - try { $f = @file_get_contents($Channelfile); if($f === False) : @@ -312,7 +314,7 @@ function getEPG() { exit; else : try { - $Channeldatas = json_decode($f, TRUE); + $Channeldatajson = json_decode($f, TRUE); if(json_last_error() != JSON_ERROR_NONE) throw new Exception("Channel.".JSON_SYNTAX_ERROR); } catch(Exception $e) { @@ -325,12 +327,18 @@ function getEPG() { printError($e->getMessage()); exit; } +//My Channel 정의 + $MyChannelInfo = array(); + if($MyChannels) : + $MyChannelInfo = array_map('trim',explode(',', $MyChannels)); + endif; + fprintf($fp, "\n"); fprintf($fp, "\n\n"); fprintf($fp, "\n", VERSION); - foreach ($Channeldatas as $Channeldata) : #Get Channel & Print Channel info - if($Channeldata['Enabled'] == 1) : + foreach ($Channeldatajson as $Channeldata) : //Get Channel & Print Channel info + if($Channeldata['Enabled'] == 1 || in_array($Channeldata['Id'], $MyChannelInfo)) : $ChannelId = $Channeldata['Id']; $ChannelName = htmlspecialchars($Channeldata['Name'], ENT_XML1); $ChannelSource = $Channeldata['Source']; @@ -364,13 +372,14 @@ function getEPG() { endif; endif; endforeach; - # Print Program Information + // 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') : @@ -385,10 +394,12 @@ function getEPG() { GetEPGFromSKY($ChannelInfo); elseif($ChannelSource == 'NAVER') : GetEPGFromNaver($ChannelInfo); - elseif($ChannelSource == 'TBROAD') : - GetEPGFromTbroad($ChannelInfo); elseif($ChannelSource == 'ISCS') : GetEPGFromIscs($ChannelInfo); + elseif($ChannelSource == 'HCN') : + GetEPGFromHcn($ChannelInfo); + elseif($ChannelSource == 'POOQ') : + GetEPGFromPooq($ChannelInfo); elseif($ChannelSource == 'MBC') : GetEPGFromMbc($ChannelInfo); elseif($ChannelSource == 'MIL'): @@ -397,6 +408,8 @@ function getEPG() { GetEPGFromIfm($ChannelInfo); elseif($ChannelSource == 'KBS'): GetEPGFromKbs($ChannelInfo); + elseif($ChannelSource == 'ARIRANG'): + GetEPGFromArirang($ChannelInfo); endif; endforeach; fprintf($fp, "\n"); @@ -409,11 +422,11 @@ function GetEPGFromEPG($ChannelInfo) { $ServiceId = $ChannelInfo[3]; $epginfo = array(); foreach(range(1, $GLOBALS['period']) as $k) : - $url = "http://www.epg.co.kr/epg-cgi/extern/cnm_guide_type_v070530.cgi"; + $url = "http://211.43.210.10:88/epg-cgi/extern/cnm_guide_type_v070530.php"; $day = date("Ymd", strtotime("+".($k - 1)." days")); $params = array( 'beforegroup' => '100', - 'checkchannel' => $ServiceId, + 'checkchannel[]' => $ServiceId, 'select_group' => '100', 'start_date' => $day ); @@ -425,92 +438,72 @@ function GetEPGFromEPG($ChannelInfo) { printError($ChannelName.HTTP_ERROR); else : $response = str_replace("charset=euc-kr", "charset=utf-8", $response); + $response = mb_convert_encoding($response, "UTF-8", "EUC-KR"); + $pattern = '/(.*)<\/td>/'; + $response = preg_replace_callback($pattern, function($matches) { return ''.htmlspecialchars($matches[1], ENT_NOQUOTES).'';}, $response); + $response = str_replace(array('</b>', '</a>', '<img', 'valign=top>','align=absmiddle>'), array('', '', '','>'), $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 < 12) : - $hour = $hour." PM"; - elseif($hour <5 || $hour == 12) : + if($dom->loadHTML($response)): + $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) : + $startTime = $endTime = $programName = $subprogramName = $desc = $actors = $producers = $category = $episode = ""; + $rebroadcast = False; + $rating = 0; + $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); + $minute = str_replace(array("[", "]"), array("",""), trim($minute->nodeValue)); + $minute = substr($minute, -2); + $hour = $hour.":".$minute; + switch ($i) : + case 2 : $hour = $hour." AM"; - $thisday = date("Ymd", strtotime($day." +1 days")); - endif; - break; - endswitch; - $startTime = date("YmdHis", strtotime($thisday." ".$hour)); - $programName = ""; - $subprogramName = ""; - $rating = 0; - $episode = ""; - $rebroadcast = False; - $pattern = '/?(.*)?(.*?)\s*(<(.*)>)?\s*(\(재\))?\s*(\(([\d,]+)회\))?()?\s*<\/td>/'; - preg_match($pattern, trim($dom->saveHTML($program)), $matches); - 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] : ""; - preg_match('/.*schedule_([\d,]+)?.*/', $image, $grade); - if($grade != NULL) $rating = $grade[1]; + break; + case 3 : + $hour = $hour." PM"; + break; + case 4 : + if($hour > 5 && $hour < 12) : + $hour = $hour." PM"; + elseif($hour <5 || $hour == 12) : + $hour = $hour." AM"; + $thisday = date("Ymd", strtotime($day." +1 days")); + endif; + break; + endswitch; + $startTime = date("YmdHis", strtotime($thisday." ".$hour)); + $pattern = '/^(.*?)\s*(?:<(.*)>)?\s*(?:\((재)\))?\s*(?:\(([\d,]+)회\)?)?$/'; + $programName = trim($program->nodeValue); + preg_match($pattern, $programName, $matches); + if ($matches != NULL) : + if(isset($matches[1])) $programName = trim($matches[1]) ?: ""; + if(isset($matches[2])) $subprogramName = trim($matches[2]) ?: ""; + if(isset($matches[3])) $rebroadcast = $matches[3] ? True : False; + if(isset($matches[4])) $episode = $matches[4] ?: ""; endif; - endif; - //programName, startTime, rating, subprogramName, rebroadcast, episode - $epginfo[] = array($programName, $startTime, $rating, $subprogramName, $rebroadcast, $episode ); - endforeach; - endfor; + $images = $program->getElementsByTagName('img'); + foreach($images as $image): + preg_match('/.*schedule_([\d,]+)?.*/', $image->getAttribute('src'), $grade); + if($grade != NULL) $rating = $grade[1]; + endforeach; + //ChannelId, startTime, programName, subprogramName, desc, actors, producers, category, episode, rebroadcast, rating + $epginfo[] = array($ChannelId, $startTime, $programName, $subprogramName, $desc, $actors, $producers, $category, $episode, $rebroadcast, $rating); + endforeach; + endfor; + else: + if($GLOBALS['debug']) printError($ChannelName.CONTENT_ERROR); + endif; endif; } catch (Exception $e) { if($GLOBALS['debug']) printError($e->getMessage()); } endforeach; - $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]; - $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; + epgzip($epginfo); } // Get EPG data from KT @@ -537,59 +530,41 @@ function GetEPGFromKT($ChannelInfo) { printError($ChannelName.HTTP_ERROR); else : $response = str_replace("charset=euc-kr", "charset=utf-8", $response); + $response = mb_convert_encoding($response, "UTF-8", "EUC-KR"); $dom = new DomDocument; libxml_use_internal_errors(True); - $dom->loadHTML(mb_convert_encoding($response, "UTF-8", "EUC-KR")); - $xpath = new DomXPath($dom); - $query = "//table[@id='pop_day']/tbody/tr"; - $rows = $xpath->query($query); - foreach($rows as $row) : - $cells = $row->getElementsByTagName('td'); - #programName, startTime, rating, category - $startTime = date("YmdHis", strtotime($day." ".trim($cells->item(0)->nodeValue))); - $rating = str_replace("all", 0, str_replace("세 이상", "", trim($cells->item(2)->nodeValue))); - $epginfo[]= array(trim($cells->item(1)->nodeValue), $startTime, $rating, trim($cells->item(4)->nodeValue)); - endforeach; + if($dom->loadHTML($response)): + $xpath = new DomXPath($dom); + $query = "//table[@id='pop_day']/tbody/tr"; + $rows = $xpath->query($query); + foreach($rows as $row) : + $startTime = $endTime = $programName = $subprogramName = $desc = $actors = $producers = $category = $episode = ""; + $rebroadcast = False; + $rating = 0; + $cells = $row->getElementsByTagName('td'); + //programName, startTime, rating, category + $startTime = date("YmdHis", strtotime($day." ".trim($cells->item(0)->nodeValue))); + $pattern = '/^(.*?)( <(.*)>)?$/'; + $programName = trim($cells->item(1)->nodeValue); + preg_match($pattern, $programName, $matches); + if ($matches != NULL) : + if(isset($matches[1])) $programName = $matches[1] ?: ""; + if(isset($matches[3])) $subprogramName = $matches[3] ?: ""; + endif; + $category = trim($cells->item(4)->nodeValue); + $rating = str_replace("all", 0, str_replace("세 이상", "", trim($cells->item(2)->nodeValue))); + //ChannelId, startTime, programName, subprogramName, desc, actors, producers, category, episode, rebroadcast, rating + $epginfo[] = array($ChannelId, $startTime, $programName, $subprogramName, $desc, $actors, $producers, $category, $episode, $rebroadcast, $rating); + endforeach; + else : + if($GLOBALS['debug']) printError($ChannelName.CONTENT_ERROR); + endif; endif; } catch (Exception $e) { if($GLOBALS['debug']) printError($e->getMessage()); } endforeach; - $zipped = array_slice(array_map(NULL, $epginfo, array_slice($epginfo,1)),0,-1); - foreach($zipped as $epg) : - $programName = ""; - $subprogramName = ""; - $pattern = '/^(.*?)( <(.*)>)?$/'; - preg_match($pattern, $epg[0][0], $matches); - if ($matches != NULL) : - if(isset($matches[1])) $programName = $matches[1] ?: ""; - if(isset($matches[3])) $subprogramName = $matches[3] ?: ""; - endif; - $startTime = $epg[0][1] ?: ""; - $endTime = $epg[1][1] ?: ""; - $desc = ""; - $actors = ""; - $producers = ""; - $category = $epg[0][3] ?: ""; - $rebroadcast = False; - $episode = ""; - $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; + epgzip($epginfo); } // Get EPG data from LG @@ -617,62 +592,40 @@ function GetEPGFromLG($ChannelInfo) { libxml_use_internal_errors(True); $response = mb_convert_encoding($response, "UTF-8", "EUC-KR"); $response = str_replace(array('<재>', ' [..', ' (..'), array('<재>', '', ''), $response); - $dom->loadHTML($response); - $xpath = new DomXPath($dom); - $query = "//div[@class='tblType list']/table/tbody/tr"; - $rows = $xpath->query($query); - foreach($rows as $row) : - $cells = $row->getElementsByTagName('td'); - $programName = trim($cells->item(1)->childNodes->item(0)->nodeValue); - $startTime = date("YmdHis", strtotime($day." ".trim($cells->item(0)->nodeValue))); - $spans = $cells->item(1)->getElementsByTagName('span'); - $rating = trim($spans->item(1)->nodeValue)=="All" ? 0 : trim($spans->item(1)->nodeValue); - //programName, startTime, rating, category - $epginfo[]= array($programName, $startTime, $rating, trim($cells->item(2)->nodeValue)); - endforeach; + if($dom->loadHTML($response)): + $xpath = new DomXPath($dom); + $query = "//div[@class='tblType list']/table/tbody/tr"; + $rows = $xpath->query($query); + foreach($rows as $row) : + $startTime = $endTime = $programName = $subprogramName = $desc = $actors = $producers = $category = $episode = ""; + $rebroadcast = False; + $rating = 0; + $cells = $row->getElementsByTagName('td'); + $startTime = date("YmdHis", strtotime($day." ".trim($cells->item(0)->nodeValue))); + $programName = trim($cells->item(1)->childNodes->item(0)->nodeValue); + $pattern = '/(<재>?)?(.*?)(?:\[(.*)\])?\s?(?:\(([\d,]+)회\))?$/'; + preg_match($pattern, $programName, $matches); + if ($matches != NULL) : + if(isset($matches[2])) $programName = trim($matches[2]) ?: ""; + if(isset($matches[3])) $subprogramName = trim($matches[3]) ?: ""; + if(isset($matches[4])) $episode = trim($matches[4]) ?: ""; + if(isset($matches[1])) $rebroadcast = trim($matches[1]) ? True: False; + endif; + $category = trim($cells->item(2)->nodeValue); + $spans = $cells->item(1)->getElementsByTagName('span'); + $rating = trim($spans->item(1)->nodeValue)=="All" ? 0 : trim($spans->item(1)->nodeValue); + //ChannelId, startTime, programName, subprogramName, desc, actors, producers, category, episode, rebroadcast, rating + $epginfo[] = array($ChannelId, $startTime, $programName, $subprogramName, $desc, $actors, $producers, $category, $episode, $rebroadcast, $rating); + endforeach; + else : + if($GLOBALS['debug']) printError($ChannelName.CONTENT_ERROR); + endif; endif; } catch (Exception $e) { if($GLOBALS['debug']) printError($e->getMessage()); } endforeach; - $zipped = array_slice(array_map(NULL, $epginfo, array_slice($epginfo,1)),0,-1); - foreach($zipped as $epg) : - $pattern = '/(<재>?)?(.*?)(\[(.*)\])?\s?(\(([\d,]+)회\))?$/'; - preg_match($pattern, $epg[0][0], $matches); - $programName = ""; - $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] ?: ""; - $endTime = $epg[1][1] ?: ""; - $desc = ""; - $actors = ""; - $producers = ""; - $category = $epg[0][3] ?: ""; - - $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; + epgzip($epginfo); } // Get EPG data from SK @@ -704,10 +657,9 @@ function GetEPGFromSK($ChannelInfo) { else : $programs = $data['channel']['programs']; foreach ($programs as $program) : - $programName = ""; - $subprogramName = ""; - $episode = ""; + $startTime = $endTime = $programName = $subprogramName = $desc = $actors = $producers = $category = $episode = ""; $rebroadcast = False; + $rating = 0; $pattern = '/^(.*?)(?:\s*[\(<]([\d,회]+)[\)>])?(?:\s*<([^<]*?)>)?(\((재)\))?$/'; preg_match($pattern, str_replace('...', '>', $program['programName']), $matches); if ($matches != NULL) : @@ -760,12 +712,11 @@ function GetEPGFromSKB($ChannelInfo) { $ServiceId = $ChannelInfo[3]; $epginfo = array(); foreach(range(1, $GLOBALS['period']) as $k) : - $url = "http://www.skbroadband.com/content/realtime/Channel_List.do"; + $url = "http://m.skbroadband.com/content/realtime/Channel_List.do"; $day = date("Ymd", strtotime("+".($k - 1)." days")); $params = array( 'key_depth2' => $ServiceId, - 'key_depth3' => $day, - 'tab_gubun' => 'lst' + 'key_depth3' => $day ); $params = http_build_query($params); $method = "POST"; @@ -778,61 +729,44 @@ function GetEPGFromSKB($ChannelInfo) { $dom = new DomDocument; libxml_use_internal_errors(True); $response = mb_convert_encoding($response, "UTF-8", "EUC-KR"); - $dom->loadHTML($response); - $xpath = new DomXPath($dom); - $query = "//tr[@class='".$day."']"; - $rows = $xpath->query($query); - foreach($rows as $row) : - $cells = $row->getElementsByTagName('td'); - $pattern = '/^(.*?)(\(([\d,]+)회\))?(<(.*)>)?(\((재)\))?$/'; - preg_match($pattern, trim($cells->item(0)->nodeValue), $matches); - if ($matches != NULL) : - if(isset($matches[1])) $programName = trim($matches[1]) ?: ""; - if(isset($matches[5])) $subprogramName = trim($matches[5]) ?: ""; - if(isset($matches[3])) $episode = $matches[3] ?: ""; - if(isset($matches[7])) $rebroadcast = $matches[7] ? True : False; - endif; - preg_match('/.*\s*([\d,]+)\s*.*/', $cells->item(1)->nodeValue, $rating); - $startTime = $row->getElementsByTagName('th')->item(0)->nodeValue; - $startTime = date("YmdHis", strtotime($day." ".$startTime)); - $rating = $rating[1]; - //programName, startTime, rating, subprogramName, rebroadcast, episode - $epginfo[]= array($programName, $startTime, $rating, $subprogramName, $rebroadcast, $episode); - endforeach; + if($dom->loadHTML($response)): + $xpath = new DomXPath($dom); + $query = "//span[@class='caption' or @class='explan' or @class='fullHD' or @class='UHD' or @class='nowon']"; + $spans = $xpath->query($query); + foreach($spans as $span) : + $span->parentNode->removeChild( $span); + endforeach; + $query = "//div[@id='dawn']/ul/li"; + $rows = $xpath->query($query); + foreach($rows as $row) : + $startTime = $endTime = $programName = $subprogramName = $desc = $actors = $producers = $category = $episode = ""; + $rebroadcast = False; + $rating = 0; + $cells = $row->getElementsByTagName('span'); + $startTime = $cells->item(0)->nodeValue ?: ""; + $startTime = date("YmdHis", strtotime($day." ".$startTime)); + $programName = trim($cells->item(2)->nodeValue) ?: ""; + $pattern = '/^(.*?)(\(([\d,]+)회\))?(<(.*)>)?(\((재)\))?$/'; + preg_match($pattern, $programName, $matches); + if ($matches != NULL) : + if(isset($matches[1])) $programName = trim($matches[1]) ?: ""; + if(isset($matches[5])) $subprogramName = trim($matches[5]) ?: ""; + if(isset($matches[3])) $episode = $matches[3] ?: ""; + if(isset($matches[7])) $rebroadcast = $matches[7] ? True : False; + endif; + if($cells->length > 3) $rating = str_replace('세', '', $cells->item(3)->nodeValue) ?: 0; + //ChannelId, startTime, programName, subprogramName, desc, actors, producers, category, episode, rebroadcast, rating + $epginfo[] = array($ChannelId, $startTime, $programName, $subprogramName, $desc, $actors, $producers, $category, $episode, $rebroadcast, $rating); + endforeach; + epgzip($epginfo); + else : + if($GLOBALS['debug']) printError($ChannelName.CONTENT_ERROR); + endif; endif; } catch (Exception $e) { if($GLOBALS['debug']) printError($e->getMessage()); } endforeach; - $zipped = array_slice(array_map(NULL, $epginfo, array_slice($epginfo,1)),0,-1); - foreach($zipped as $epg) : - $programName = trim($epg[0][0]) ?: ""; - $subprogramName = trim($epg[0][3]) ?: ""; - $episode = $epg[0][5] ?: ""; - $rebroadcast = $epg[0][4] ? True: False; - $startTime = $epg[0][1] ?: ""; - $endTime = $epg[1][1] ?: ""; - $desc = ""; - $actors = ""; - $producers = ""; - $category = ""; - $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; } // Get EPG data from SKY @@ -866,6 +800,9 @@ function GetEPGFromSKY($ChannelInfo) { else : $programs = $data['scheduleListIn']; foreach($programs as $program) : + $startTime = $endTime = $programName = $subprogramName = $desc = $actors = $producers = $category = $episode = ""; + $rebroadcast = False; + $rating = 0; $programName = htmlspecialchars_decode($program['program_name']) ?: ""; $subprogramName = str_replace(array('lt;', 'gt;', 'amp;'), array('<', '>', '&'),$program['program_subname']) ?: ""; $startTime = $program['starttime']; @@ -875,8 +812,12 @@ function GetEPGFromSKY($ChannelInfo) { $description = str_replace(array('lt;', 'gt;', 'amp;'), array('<', '>', '&'),$program['description']) ?: ""; $summary = str_replace(array('lt;', 'gt;', 'amp;'), array('<', '>', '&'),$program['summary']) ?: ""; $desc = $description ?: ""; - if($summary) : - $desc = $desc."\n".$summary; + if($desc) : + if($summary): + $desc = $desc."\n".$summary; + endif; + else : + $desc = $summary; endif; $category = $program['program_category1']; $episode = $program['episode_id'] ?: ""; @@ -956,41 +897,20 @@ function GetEPGFromNaver($ChannelInfo) { for($i = 0; $i < count($data['displayDates']); $i++) : for($j = 0; $j < 24; $j++) : foreach($data['schedules'][$j][$i] as $program) : - //programName, startTime, episode, rebroadcast, rating + $startTime = $endTime = $programName = $subprogramName = $desc = $actors = $producers = $category = $episode = ""; + $rebroadcast = False; + $rating = 0; $startTime = date("YmdHis", strtotime($data['displayDates'][$i]['date']." ".$program['startTime'])); - $epginfo[] = array($program['title'], $startTime, str_replace("회","", $program['episode']), $program['isRerun'], $program['grade']); + $programName = htmlspecialchars_decode(trim($program['title']), ENT_XML1); + $episode = str_replace("회","", $program['episode']); + $rebroadcast = $program['isRerun'] ? True : False; + $rating = $program['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); endforeach; endfor; endfor; - $zipped = array_slice(array_map(NULL, $epginfo, array_slice($epginfo,1)),0,-1); - foreach($zipped as $epg) : - $programName = htmlspecialchars_decode($epg[0][0], ENT_XML1) ?: ""; - $subprogramName = ""; - $startTime = $epg[0][1] ?: ""; - $endTime = $epg[1][1] ?: ""; - $desc = ""; - $actors = ""; - $producers = ""; - $category = ""; - $rebroadcast = $epg[0][3] ? True: False; - $episode = $epg[0][2] ?: ""; - $rating = $epg[0][4] ?: 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; + epgzip($epginfo); endif; } catch(Exception $e) { if($GLOBALS['debug']) printError($e->getMessage()); @@ -1001,19 +921,218 @@ function GetEPGFromNaver($ChannelInfo) { } } -// Get EPG data from Tbroad -function GetEPGFromTbroad($ChannelInfo) { - $url='https://www.tbroad.com/chplan/selectRealTimeListForNormal.tb'; -} - // Get EPG data from Iscs function GetEPGFromIscs($ChannelInfo) { - $url='http://service.iscs.co.kr/sub/channel_view.asp'; + $ChannelId = $ChannelInfo[0]; + $ChannelName = $ChannelInfo[1]; + $ServiceId = $ChannelInfo[3]; + $epginfo = array(); + foreach(range(1, $GLOBALS['period']) as $k) : + $url = "https://www.iscs.co.kr/service/sub/ajax_channel_view.asp"; + $day = date("Y-m-d", strtotime("+".($k - 1)." days")); + $params = array( + 's_idx' => $ServiceId, + 'C_date' => $day + ); + $params = http_build_query($params); + $method = "POST"; + try { + $response = getWeb($url, $params, $method); + if ($response === False && $GLOBALS['debug']) : + printError($ChannelName.HTTP_ERROR); + else : + try { + $data = json_decode($response, TRUE); + if(json_last_error() != JSON_ERROR_NONE) throw new Exception(JSON_SYNTAX_ERROR); + if(count($data['html']) == 0) : + if($GLOBALS['debug']) : + printError($ChannelName.CHANNEL_ERROR); + endif; + else : + $html = $data['html']; + $pattern = '/(.*)<\/td>/'; + $html = preg_replace_callback($pattern, function($matches) { return ''.htmlspecialchars($matches[1]).'';}, $html); + $dom = new DomDocument; + libxml_use_internal_errors(True); + $html = mb_convert_encoding($html, "HTML-ENTITIES", "UTF-8"); + if($dom->loadHTML($html)): + $xpath = new DomXPath($dom); + $query = "//div[@class='pp_tbl']/table/tbody/tr"; + $rows = $xpath->query($query); + foreach($rows as $row) : + $startTime = $endTime = $programName = $subprogramName = $desc = $actors = $producers = $category = $episode = ""; + $rebroadcast = False; + $rating = 0; + $cells = $row->getElementsByTagName('td'); + $startTime = $cells->item(0)->nodeValue ?: ""; + $startTime = date("YmdHis", strtotime($day." ".$startTime)); + $programName = trim($cells->item(1)->nodeValue) ?: ""; + $pattern = '/^(.*?)(?:\(([\d,]+)회\))?(?:\((재)\))?$/'; + preg_match($pattern, $programName, $matches); + if ($matches != NULL) : + if(isset($matches[1])) $programName = trim($matches[1]) ?: ""; + if(isset($matches[2])) $episode = $matches[2] ?: ""; + if(isset($matches[3])) $rebroadcast = $matches[3] ? True : False; + endif; + $rating = $cells->item(2)->nodeValue=='전체관람' ? 0 : str_replace('세이상', '', $cells->item(2)->nodeValue); + //ChannelId, startTime, programName, subprogramName, desc, actors, producers, category, episode, rebroadcast, rating + $epginfo[] = array($ChannelId, $startTime, $programName, $subprogramName, $desc, $actors, $producers, $category, $episode, $rebroadcast, $rating); + endforeach; + epgzip($epginfo); + else : + if($GLOBALS['debug']) printError($ChannelName.CONTENT_ERROR); + endif; + endif; + } catch(Exception $e) { + if($GLOBALS['debug']) printError($e->getMessage()); + } + endif; + } catch (Exception $e) { + if($GLOBALS['debug']) printError($e->getMessage()); + } + endforeach; +} + +// Get EPG data from Hcn +function GetEPGFromHcn($ChannelInfo) { + $ChannelId = $ChannelInfo[0]; + $ChannelName = $ChannelInfo[1]; + $ServiceId = $ChannelInfo[3]; + $epginfo = array(); + foreach(range(1, $GLOBALS['period']) as $k) : + $url = "https://www.hcn.co.kr/ur/bs/ch/channelInfo.hcn"; + $day = date("Y-m-d", strtotime("+".($k - 1)." days")); + $params = array( + 'method' => 'ajax_00', + 'pageType' => 'sheetList', + 'ch_id' => $ServiceId, + 'onairdate' => $day + ); + $params = http_build_query($params); + $method = "POST"; + try { + $response = getWeb($url, $params, $method); + if ($response === False && $GLOBALS['debug']) : + printError($ChannelName.HTTP_ERROR); + else : + $dom = new DomDocument; + libxml_use_internal_errors(True); + $response = mb_convert_encoding($response, "HTML-ENTITIES", "EUC-KR"); + if($dom->loadHTML($response)): + $xpath = new DomXPath($dom); + $query = "//tr[@class='']"; + $rows = $xpath->query($query); + foreach($rows as $row) : + $startTime = $endTime = $programName = $subprogramName = $desc = $actors = $producers = $category = $episode = ""; + $rebroadcast = False; + $rating = 0; + $cells = $row->getElementsByTagName('td'); + $startTime = $cells->item(0)->nodeValue ?: ""; + $startTime = date("YmdHis", strtotime($day." ".$startTime)); + $programName = trim($cells->item(1)->nodeValue) ?: ""; + $images = $row->getElementsByTagName('img'); + foreach($images as $image): + preg_match('/re\.png/', $image->getAttribute('src'), $rebroadcast); + if($rebroadcast != NULL) $rebroadcast = True; + preg_match('/.*plus([\d,]+)\.png/', $image->getAttribute('src'), $grade); + if($grade != NULL) $rating = $grade[1]; + endforeach; + //ChannelId, startTime, programName, subprogramName, desc, actors, producers, category, episode, rebroadcast, rating + $epginfo[] = array($ChannelId, $startTime, $programName, $subprogramName, $desc, $actors, $producers, $category, $episode, $rebroadcast, $rating); + endforeach; + epgzip($epginfo); + else : + if($GLOBALS['debug']) printError($ChannelName.CONTENT_ERROR); + endif; + endif; + } catch (Exception $e) { + if($GLOBALS['debug']) printError($e->getMessage()); + } + endforeach; +} + +// Get EPG data from POOQ +function GetEPGFromPooq($ChannelInfo) { + $ChannelId = $ChannelInfo[0]; + $ChannelName = $ChannelInfo[1]; + $ServiceId = $ChannelInfo[3]; + $today = date("Ymd"); + $lastday = date("Ymd", strtotime("+".($GLOBALS['period'] - 1)." days")); + $url = "https://wapie.pooq.co.kr/v1/epgs30/".$ServiceId."/"; $params = array( - 'chan_idx'=>'242', - 'source_id'=>'203', - 'Chan_Date'=>'2017-04-18' + 'deviceTypeId'=> 'pc', + 'marketTypeId'=> 'generic', + 'apiAccessCredential'=> 'EEBE901F80B3A4C4E5322D58110BE95C', + 'offset'=> '0', + 'limit'=> '1000', + 'startTime'=> date("Y/m/d", strtotime($today)).' 00:00', + 'endTime'=> date("Y/m/d", strtotime($lastday)).' 00:00' ); + foreach(range(1, $GLOBALS['period']) as $k) : + $day = date("Y-m-d", strtotime("+".($k - 1)." days")); + $date_list[] = $day; + endforeach; + $params = http_build_query($params); + $method = "GET"; + try { + $response = getWeb($url, $params, $method); + if ($response === False && $GLOBALS['debug']) : + printError($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['result']['count'] == 0) : + if($GLOBALS['debug']) : + printError($ChannelName.CHANNEL_ERROR); + endif; + else : + $programs = $data['result']['list']; + foreach ($programs as $program) : + $startTime = $endTime = $programName = $subprogramName = $desc = $actors = $producers = $category = $episode = ""; + $rebroadcast = False; + $rating = 0; + if(in_array($program['startDate'] , $date_list)) : + $startTime = $program['startDate']." ".$program['startTime']; + $startTime = date("YmdHis", strtotime($startTime)); + $endTime = $program['startDate']." ".$program['endTime']; + $endTime = date("YmdHis", strtotime($endTime)); + $pattern = '/^(.*?)(?:([\d,]+)회)?(?:\((재)\))?$/'; + $programName = $program['programTitle']; + preg_match($pattern, $programName, $matches); + if($matches !== NULL) : + if(isset($matches[1])) $programName = trim($matches[1]) ?: ""; + if(isset($matches[2])) $episode = trim($matches[2]) ?: ""; + if(isset($matches[3])) $rebroadcast = $matches[3] ? True : False; + endif; + if($program['programStaring']) $actors = trim($program['programStaring'], ','); + if($program['programSummary']) $desc = trim($program['programSummary']); + $rating = $program['age']; + $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); + endif; + endforeach; + endif; + } catch(Exception $e) { + if($GLOBALS['debug']) printError($e->getMessage()); + } + endif; + } catch (Exception $e) { + if($GLOBALS['debug']) printError($e->getMessage()); + } } // Get EPG data from MBC @@ -1046,24 +1165,19 @@ function GetEPGFromMbc($ChannelInfo) { $programs = $data['Programs']; foreach($programs as $program) : if($program['Channel'] == "CHAM" && $program['LiveDays'] == $dayofweek[date("w", strtotime($day))]) : - $programName = ""; + $startTime = $endTime = $programName = $subprogramName = $desc = $actors = $producers = $category = $episode = ""; $rebroadcast = False; + $rating = 0; $pattern = '/^(.*?)(\(재\))?$/'; preg_match($pattern, htmlspecialchars_decode($program['ProgramTitle']), $matches); if ($matches != NULL) : $programName = $matches[1]; - $rebroadcast = $matches[2] ? True : False; + if(isset($matches[2])) $rebroadcast = $matches[2] ? True : False; endif; - $subprogramName = ""; $startTime = $day." ".$program['StartTime']; $startTime = date("YmdHis", strtotime($startTime)); $endTime = date("YmdHis", strtotime("+".$program['RunningTime']." minutes", strtotime($startTime))); - $desc = ""; - $actors = ""; - $producers = ""; $category = "음악"; - $episode = ""; - $rating = 0; $programdata = array( 'channelId'=> $ChannelId, 'startTime' => $startTime, @@ -1120,25 +1234,22 @@ function GetEPGFromMil($ChannelInfo) { else : $programs = $data['resultList']; foreach($programs as $program) : - $programName = ""; + $startTime = $endTime = $programName = $subprogramName = $desc = $actors = $producers = $category = $episode = ""; $rebroadcast = False; + $rating = 0; $pattern = '/^(.*?)(\(재\))?$/'; preg_match($pattern, htmlspecialchars_decode($program['program_title']), $matches); if ($matches != NULL) : $programName = $matches[1]; - $rebroadcast = $matches[2] ? True : False; + if(isset($matches[2])) $rebroadcast = $matches[2] ? True : False; endif; $subprogramName = htmlspecialchars_decode($program['program_subtitle']); $startTime = $day." ".$program['program_time']; $startTime = date("YmdHis", strtotime($startTime)); $endTime = $day." ".$program['program_end_time']; $endTime = date("YmdHis", strtotime($endTime)); - $desc = ""; $actors = htmlspecialchars_decode($program['movie_actor']); $producers = htmlspecialchars_decode($program['movie_director']); - $category = ""; - $episode = ""; - $rating = 0; $programdata = array( 'channelId'=> $ChannelId, 'startTime' => $startTime, @@ -1196,19 +1307,16 @@ function GetEPGFromIfm($ChannelInfo) { else : $programs = $data['hybMusicInfoList']; foreach($programs as $program) : + $startTime = $endTime = $programName = $subprogramName = $desc = $actors = $producers = $category = $episode = ""; + $rebroadcast = False; + $rating = 0; $programName = htmlspecialchars_decode($program['pgmTitle']) ?: ""; - $subprogramName = ""; $startTime = $day." ".$program['pgmStime']; $startTime = date("YmdHis", strtotime($startTime)); $endTime = $day." ".$program['pgmEtime']; $endTime = date("YmdHis", strtotime($endTime)); - $desc = ""; $actors = htmlspecialchars_decode($program['pgmDj']); $producers = htmlspecialchars_decode($program['pgmPd']); - $category = ""; - $episode = ""; - $rebroadcast = False; - $rating = 0; $programdata = array( 'channelId'=> $ChannelId, 'startTime' => $startTime, @@ -1270,13 +1378,18 @@ function GetEPGFromKbs($ChannelInfo) { $query = "//li"; $rows = $xpath->query($query); foreach($rows as $row) : + $startTime = $endTime = $programName = $subprogramName = $desc = $actors = $producers = $category = $episode = ""; + $rebroadcast = False; + $rating = 0; $cells = $row->getElementsByTagName('span'); + $startTime = $day." ".trim($cells->item(0)->childNodes->item(0)->nodeValue); + $startTime = date("YmdHis", strtotime($startTime)); $programName = trim($cells->item(2)->childNodes->item(0)->nodeValue); $programName = str_replace(array("[","]", " Broadcast"), array("", "", ""), $programName); - $startTime = $day." ".trim($cells->item(0)->childNodes->item(0)->nodeValue); - //programName, startTime, rating, category - $epginfo[]= array($programName, $startTime); + //ChannelId, startTime, programName, subprogramName, desc, actors, producers, category, episode, rebroadcast, rating + $epginfo[] = array($ChannelId, $startTime, $programName, $subprogramName, $desc, $actors, $producers, $category, $episode, $rebroadcast, $rating); endforeach; + epgzip($epginfo); endif; } catch(Exception $e) { if($GLOBALS['debug']) printError($e->getMessage()); @@ -1286,21 +1399,97 @@ function GetEPGFromKbs($ChannelInfo) { if($GLOBALS['debug']) printError($e->getMessage()); } endforeach; +} + +function GetEPGFromArirang($ChannelInfo) { + $ChannelId = $ChannelInfo[0]; + $ChannelName = $ChannelInfo[1]; + $ServiceId = $ChannelInfo[3]; + $epginfo = array(); + foreach(range(1, $GLOBALS['period']) as $k) : + $url = "http://www.arirang.com/Radio/Radio_Index.asp"; + $day = date("Y-m-d", strtotime("+".($k - 1)." days")); + $params = array(); + $params = http_build_query($params); + $method = "GET"; + try { + $response = getWeb($url, $params, $method); + if ($response === False && $GLOBALS['debug']) : + printError($ChannelName.HTTP_ERROR); + else : + $dom = new DomDocument; + libxml_use_internal_errors(True); + //echo $response; + + $response = mb_convert_encoding($response, "HTML-ENTITIES", "EUC-KR"); + if($dom->loadHTML($response)): + $xpath = new DomXPath($dom); + $dayofweek = date("w", strtotime($day)); + if($dayofweek == 0): + $query = "//table[@id='aIRSW_sun']/tr"; + elseif($dayofweek == 6): + $query = "//table[@id='aIRSW_sat']/tr"; + else : + $query = "//table[@id='aIRSW_week']/tr"; + endif; + $rows = $xpath->query($query); + foreach($rows as $row) : + $startTime = $endTime = $programName = $subprogramName = $desc = $actors = $producers = $category = $episode = ""; + $rebroadcast = False; + $rating = 0; + $time = $row->getElementsByTagName('th'); + $times = explode('~', trim($time->item(0)->nodeValue)); + $startTime = date("YmdHis", strtotime($day." ".$times[0])); + $endTime = date("YmdHis", strtotime($day." ".$times[1])); + $program = $row->getElementsByTagName('td'); + $pattern = '/^(.*?)(?:\((Re)\))?$/'; + preg_match($pattern, trim($program->item(0)->nodeValue), $matches); + if ($matches != NULL) : + $programName = $matches[1]; + if(isset($matches[2])) $rebroadcast = $matches[2] ? True : False; + endif; + $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; + else : + if($GLOBALS['debug']) printError($ChannelName.CONTENT_ERROR); + endif; + endif; + } catch (Exception $e) { + if($GLOBALS['debug']) printError($e->getMessage()); + } + endforeach; +} +# Zip epginfo +function epgzip($epginfo) { + #ChannelId, startTime, programName, subprogramName, desc, actors, producers, category, episode, rebroadcast, rating $zipped = array_slice(array_map(NULL, $epginfo, array_slice($epginfo,1)),0,-1); foreach($zipped as $epg) : - $programName = $epg[0][0] ?: ""; - $subprogramName = ""; + $ChannelId = $epg[0][0] ?: ""; $startTime = $epg[0][1] ?: ""; - $startTime = date("YmdHis", strtotime($startTime)); $endTime = $epg[1][1] ?: ""; - $endTime = date("YmdHis", strtotime($endTime)); - $desc = ""; - $actors = ""; - $producers = ""; - $category = ""; - $rebroadcast = False; - $episode = ""; - $rating = 0; + $programName = $epg[0][2] ?: ""; + $subprogramName = $epg[0][3] ?: ""; + $desc = $epg[0][4] ?: ""; + $actors = $epg[0][5] ?: ""; + $producers = $epg[0][6] ?: ""; + $category = $epg[0][7] ?: ""; + $episode = $epg[0][8] ?: ""; + $rebroadcast = $rebroadcast = $epg[0][9] ? True: False; + $rating = $epg[0][10] ?: 0; $programdata = array( 'channelId'=> $ChannelId, 'startTime' => $startTime, @@ -1318,7 +1507,6 @@ function GetEPGFromKbs($ChannelInfo) { writeProgram($programdata); endforeach; } - function writeProgram($programdata) { $fp = $GLOBALS['fp']; $ChannelId = $programdata['channelId']; @@ -1349,6 +1537,7 @@ function writeProgram($programdata) { if($GLOBALS['addverbose'] == 'y') : $desc = htmlspecialchars($programdata['programName'], ENT_XML1); if($subprogramName) $desc = $desc."\n부제 : ".$subprogramName; + if($rebroadcast == True && $GLOBALS['addrebroadcast'] == 'y') $desc = $desc."\n방송 : 재방송"; if($episode) $desc = $desc."\n회차 : ".$episode."회"; if($category) $desc = $desc."\n장르 : ".$category; if($actors) $desc = $desc."\n출연 : ".$actors; @@ -1358,6 +1547,7 @@ function writeProgram($programdata) { $desc = ""; endif; if($programdata['desc']) $desc = $desc."\n".htmlspecialchars($programdata['desc'], ENT_XML1); + $desc = preg_replace('/ +/', ' ', $desc); $contentTypeDict = array( '교양' => 'Arts / Culture (without music)', '만화' => 'Cartoons / Puppets', @@ -1422,10 +1612,10 @@ function getWeb($url, $params, $method) { curl_setopt ($ch, CURLOPT_POSTFIELDS, $params); endif; curl_setopt($ch, CURLOPT_URL, $url); - curl_setopt($ch, CURLOPT_RETURNTRANSFER,True); - curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 3); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, True); + curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $GLOBALS['timeout']); curl_setopt($ch, CURLOPT_HEADER, False); - curl_setopt($ch, CURLOPT_FAILONERROR,True); + curl_setopt($ch, CURLOPT_FAILONERROR, True); curl_setopt($ch, CURLOPT_USERAGENT, $GLOBALS['ua']); $response = curl_exec($ch); if(curl_error($ch) && $GLOBALS['debug']) printError($url." ".curl_error($ch)); @@ -1439,5 +1629,4 @@ function printLog($string) { function printError($string) { fwrite(STDERR, "Error : ".$string."\n"); } -?> - +?> \ No newline at end of file diff --git a/epg2xml.py b/epg2xml.py index 6bb40b8..300af80 100644 --- a/epg2xml.py +++ b/epg2xml.py @@ -13,6 +13,8 @@ import re from xml.sax.saxutils import escape, unescape import argparse import pprint +from functools import partial + try: imp.find_module('bs4') from bs4 import BeautifulSoup, SoupStrainer @@ -21,6 +23,7 @@ except ImportError: sys.exit() try: imp.find_module('lxml') + from lxml import html except ImportError: print("Error : ", "lxml 모듈이 설치되지 않았습니다.", file=sys.stderr) sys.exit() @@ -30,6 +33,7 @@ try: except ImportError: print("Error : ", "requests 모듈이 설치되지 않았습니다.", file=sys.stderr) sys.exit() + reload(sys) sys.setdefaultencoding('utf-8') @@ -158,6 +162,8 @@ def GetEPGFromEPG(ChannelInfo): response.raise_for_status() html_data = response.content data = unicode(html_data, 'euc-kr', 'ignore').encode('utf-8', 'ignore') + pattern = '(.*)<\/td>' + data = re.sub(pattern, partial(replacement,txt='title'), data) strainer = SoupStrainer('table', {'style':'margin-bottom:30'}) soup = BeautifulSoup(data, 'lxml', parse_only=strainer, from_encoding='utf-8') html = soup.find_all('table', {'style':'margin-bottom:30'}) @@ -174,6 +180,8 @@ def GetEPGFromEPG(ChannelInfo): hour = 'AM ' + str(hour) thisday = day + datetime.timedelta(days=1) for celldata in cell.parent.find_all('tr'): + celldata = str(celldata).replace('</b></a>','').replace('</b>','') + celldata = celldata.replace('<img','').replace('align=absmiddle>','>').replace('</a>','') startTime = endTime = programName = subprogramName = desc = actors = producers = category = episode = '' rebroadcast = False rating = 0 @@ -188,19 +196,19 @@ def GetEPGFromEPG(ChannelInfo): grade = re.match('.*schedule_([\d,]+)?.*',image) if not (grade is None): rating = int(grade.group(1)) programName = matches.group(2).strip() if matches.group(2) else '' + programName = unescape(programName) subprogramName = matches.group(4).strip() if matches.group(4) else '' + subprogramName = unescape(subprogramName) rebroadcast = True if matches.group(5) else False; episode = matches.group(7) if matches.group(7) else '' #ChannelId, startTime, programName, subprogramName, desc, actors, producers, category, episode, rebroadcast, rating epginfo.append([ChannelId, startTime, programName, subprogramName, desc, actors, producers, category, episode, rebroadcast, rating]) - epgzip(epginfo) else: if(debug): printError(ChannelName + CONTENT_ERROR) else: pass - except (requests.exceptions.RequestException) as e: if(debug): printError(ChannelName + str(e)) - else: pass + epgzip(epginfo) # Get EPG data from KT def GetEPGFromKT(ChannelInfo): @@ -239,13 +247,13 @@ def GetEPGFromKT(ChannelInfo): if not(matches is None): rating = int(matches.group()) #ChannelId, startTime, programName, subprogramName, desc, actors, producers, category, episode, rebroadcast, rating epginfo.append([ChannelId, startTime, programName, subprogramName, desc, actors, producers, category, episode, rebroadcast, rating]) - epgzip(epginfo) else: if(debug): printError(ChannelName + CONTENT_ERROR) else: pass except (requests.exceptions.RequestException) as e: if(debug): printError(ChannelName + str(e)) else: pass + epgzip(epginfo) # Get EPG data from LG def GetEPGFromLG(ChannelInfo): @@ -277,23 +285,23 @@ def GetEPGFromLG(ChannelInfo): startTime = startTime.strftime('%Y%m%d%H%M%S') rating = 0 if cell[1].find('span', {'class': 'tag cte_all'}).text.strip()=="All" else int(cell[1].find('span', {'class': 'tag cte_all'}).text.strip()) cell[1].find('span', {'class': 'tagGroup'}).decompose() - pattern = '(<재>?)?(.*?)(\[(.*)\])?\s?(\(([\d,]+)회\))?$' + pattern = '(<재>?)?(.*?)(?;\[(.*)\])?\s?(?:\(([\d,]+)회\))?$' matches = re.match(pattern, cell[1].text.strip().decode('string_escape')) if not (matches is None): programName = matches.group(2).strip() if matches.group(2) else '' - subprogramName = matches.group(4).strip() if matches.group(4) else '' - episode = matches.group(6) if matches.group(6) else '' + subprogramName = matches.group(3).strip() if matches.group(3) else '' + episode = matches.group(4) if matches.group(4) else '' rebroadcast = True if matches.group(1) else False category = cell[2].text.strip() #ChannelId, startTime, programName, subprogramName, desc, actors, producers, category, episode, rebroadcast, rating epginfo.append([ChannelId, startTime, programName, subprogramName, desc, actors, producers, category, episode, rebroadcast, rating]) - epgzip(epginfo) else: if(debug): printError(ChannelName + CONTENT_ERROR) else: pass except (requests.exceptions.RequestException) as e: if(debug): printError(ChannelName + str(e)) else: pass + epgzip(epginfo) # Get EPG data from SK def GetEPGFromSK(ChannelInfo): @@ -371,7 +379,8 @@ def GetEPGFromSKB(ChannelInfo): startTime = str(day) + ' ' + row.find('span', {'class':'time'}).text startTime = datetime.datetime.strptime(startTime, '%Y-%m-%d %H:%M') startTime = startTime.strftime('%Y%m%d%H%M%S') - row.find('span', {'class':['fullHD', 'UHD']}).decompose() + if row.find('span', {'class':['caption', 'explan', 'fullHD', 'UHD', 'nowon']}) : + row.find('span', {'class':['caption', 'explan', 'fullHD', 'UHD', 'nowon']}).decompose() cell = row.find('span', {'class':None}).text.decode('string_escape').strip() pattern = "^(.*?)(\(([\d,]+)회\))?(<(.*)>)?(\((재)\))?$" matches = re.match(pattern, cell) @@ -491,7 +500,7 @@ def GetEPGFromIscs(ChannelInfo): ChannelName = ChannelInfo[1] ServiceId = ChannelInfo[3] epginfo = [] - url='https://www.iscs.co.kr/service/sub/ajax_channel_view.asp' + url='http://www.iscs.co.kr/service/sub/ajax_channel_view.asp' for k in range(period): day = today + datetime.timedelta(days=k) params = {'s_idx': ServiceId, 'C_date': day} @@ -500,6 +509,8 @@ def GetEPGFromIscs(ChannelInfo): json_data = response.text try: data = json.loads(json_data, encoding='utf-8') + pattern = '(.*)<\/td>' + data['html'] = re.sub(pattern, partial(replacement, txt='name'), data['html']) strainer = SoupStrainer('tbody') soup = BeautifulSoup(data['html'], 'lxml', parse_only=strainer) html = soup.find_all('tr') if soup.find_all('tr') else '' @@ -578,8 +589,8 @@ def GetEPGFromPooq(ChannelInfo): ChannelId = ChannelInfo[0] ChannelName = ChannelInfo[1] ServiceId = ChannelInfo[3] - url = 'https://wapie.pooq.co.kr/v1/epgs30/' + str(ServiceId) + '/' lastday = today + datetime.timedelta(days=period-1) + url = 'https://wapie.pooq.co.kr/v1/epgs30/' + str(ServiceId) + '/' params = {'deviceTypeId': 'pc', 'marketTypeId': 'generic', 'apiAccessCredential': 'EEBE901F80B3A4C4E5322D58110BE95C', 'offset': '0', 'limit': '1000', 'startTime': today.strftime('%Y/%m/%d') + ' 00:00', 'endTime': lastday.strftime('%Y/%m/%d') + ' 00:00'} date_list = [(today + datetime.timedelta(days=x)).strftime('%Y-%m-%d') for x in range(0, period)] try: @@ -807,7 +818,6 @@ def GetEPGFromArirang(ChannelInfo): response = requests.get(url, params=params, headers=ua, timeout=timeout) response.raise_for_status() data = response.content - #data = html_data.encode('utf-8', 'ignore') if day.weekday() < 5 : strainer = SoupStrainer('table', {'id':'aIRSW_week'}) elif day.weekday() == 5: @@ -876,7 +886,6 @@ def writeProgram(programdata): endTime = programdata['endTime'] programName = escape(programdata['programName']).strip() subprogramName = escape(programdata['subprogramName']).strip() - matches = re.match('(.*) \(?(\d+부)\)?', unescape(programName.encode('utf-8', 'ignore'))) if not(matches is None): programName = escape(matches.group(1)); @@ -884,7 +893,6 @@ def writeProgram(programdata): subprogramName = subprogramName.strip() if programName is None: programName = subprogramName - actors = escape(programdata['actors']) producers = escape(programdata['producers']) category = escape(programdata['category']) @@ -899,7 +907,7 @@ def writeProgram(programdata): if addverbose == 'y': desc = escape(programdata['programName']) 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 category : desc = desc + '\n장르 : ' + category if actors : desc = desc + '\n출연 : ' + actors @@ -908,6 +916,8 @@ def writeProgram(programdata): else: desc ='' if programdata['desc'] : desc = desc + '\n' + escape(programdata['desc']) + desc = re.sub(' +',' ', desc) + #desc = re.sub('\s+','\s', desc) contentTypeDict={'교양':'Arts / Culture (without music)', '만화':'Cartoons / Puppets', '교육':'Education / Science / Factual topics', '취미':'Leisure hobbies', '드라마':'Movie / Drama', '영화':'Movie / Drama', '음악':'Music / Ballet / Dance', '뉴스':'News / Current affairs', '다큐':'Documentary', '라이프':'Documentary', '시사/다큐':'Documentary', '연예':'Show / Game show', '스포츠':'Sports', '홈쇼핑':'Advertisement / Shopping'} contentType = '' for key, value in contentTypeDict.iteritems(): @@ -918,7 +928,6 @@ def writeProgram(programdata): if subprogramName : print(' %s' % (subprogramName)) if addverbose=='y' : - desc = re.sub(' +',' ', desc) print(' %s' % (desc)) if actors or producers: print(' ') @@ -947,6 +956,14 @@ def printLog(*args): def printError(*args): print("Error : ", *args, file=sys.stderr) +def replacement(match, txt): + if not(match is None): + programName = unescape(match.group(1)).replace('<','<').replace('>','>').strip() + programName = '' + programName + '' + return programName + else: + return ''; + Settingfile = os.path.dirname(os.path.abspath(__file__)) + '/epg2xml.json' ChannelInfos = [] try: @@ -1061,7 +1078,7 @@ if default_fetch_limit : sys.exit() else : period = int(default_fetch_limit) - if period > 2 : period = 2 + #if period > 2 : period = 2 else : printError("epg2xml.json 파일의 default_fetch_limit항목이 없습니다."); sys.exit() From ff5d25496720dec93305784a60a1c2db225dbd3f Mon Sep 17 00:00:00 2001 From: wonipapa Date: Thu, 31 Aug 2017 17:41:51 +0900 Subject: [PATCH 18/41] =?UTF-8?q?KT=ED=95=A8=EC=88=98=EA=B9=8C=EC=A7=80=20?= =?UTF-8?q?=EC=99=84=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- epg2xml.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/epg2xml.py b/epg2xml.py index 300af80..eca42fa 100644 --- a/epg2xml.py +++ b/epg2xml.py @@ -285,7 +285,7 @@ def GetEPGFromLG(ChannelInfo): startTime = startTime.strftime('%Y%m%d%H%M%S') rating = 0 if cell[1].find('span', {'class': 'tag cte_all'}).text.strip()=="All" else int(cell[1].find('span', {'class': 'tag cte_all'}).text.strip()) cell[1].find('span', {'class': 'tagGroup'}).decompose() - pattern = '(<재>?)?(.*?)(?;\[(.*)\])?\s?(?:\(([\d,]+)회\))?$' + pattern = '(<재>?)?(.*?)(?:\[(.*)\])?\s?(?:\(([\d,]+)회\))?$' matches = re.match(pattern, cell[1].text.strip().decode('string_escape')) if not (matches is None): programName = matches.group(2).strip() if matches.group(2) else '' From f40c20e9770b76015bd2c2f4ee712172150e9472 Mon Sep 17 00:00:00 2001 From: wonipapa Date: Fri, 1 Sep 2017 12:23:52 +0900 Subject: [PATCH 19/41] =?UTF-8?q?SKB=20=ED=95=A8=EC=88=98=EA=B9=8C?= =?UTF-8?q?=EC=A7=80=20=EC=B2=B4=ED=81=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- epg2xml.php | 16 ++++++++++------ epg2xml.py | 39 ++++++++++++++++++++++++--------------- 2 files changed, 34 insertions(+), 21 deletions(-) diff --git a/epg2xml.php b/epg2xml.php index 99b1c85..6e7c82a 100644 --- a/epg2xml.php +++ b/epg2xml.php @@ -588,10 +588,10 @@ function GetEPGFromLG($ChannelInfo) { printError($ChannelName.HTTP_ERROR); else : $response = ''.$response; - $dom = new DomDocument; - libxml_use_internal_errors(True); $response = mb_convert_encoding($response, "UTF-8", "EUC-KR"); $response = str_replace(array('<재>', ' [..', ' (..'), array('<재>', '', ''), $response); + $dom = new DomDocument; + libxml_use_internal_errors(True); if($dom->loadHTML($response)): $xpath = new DomXPath($dom); $query = "//div[@class='tblType list']/table/tbody/tr"; @@ -603,7 +603,7 @@ function GetEPGFromLG($ChannelInfo) { $cells = $row->getElementsByTagName('td'); $startTime = date("YmdHis", strtotime($day." ".trim($cells->item(0)->nodeValue))); $programName = trim($cells->item(1)->childNodes->item(0)->nodeValue); - $pattern = '/(<재>?)?(.*?)(?:\[(.*)\])?\s?(?:\(([\d,]+)회\))?$/'; + $pattern = '/(<재>)?\s?(?:\[.*?\])?(.*?)(?:\[(.*)\])?\s?(?:\(([\d,]+)회\))?$/'; preg_match($pattern, $programName, $matches); if ($matches != NULL) : if(isset($matches[2])) $programName = trim($matches[2]) ?: ""; @@ -726,9 +726,13 @@ function GetEPGFromSKB($ChannelInfo) { printError($ChannelName.HTTP_ERROR); else : $response = str_replace('charset="euc-kr"', 'charset="utf-8"', $response); + $response = mb_convert_encoding($response, "UTF-8", "EUC-KR"); + $response = preg_replace('//is', '', $response); + $response = preg_replace('/<\/span>/is', '', $response); + $pattern = '/(.*)<\/span>/'; + $response = preg_replace_callback($pattern, function($matches) { return ''.htmlspecialchars($matches[1], ENT_NOQUOTES).'';}, $response); $dom = new DomDocument; libxml_use_internal_errors(True); - $response = mb_convert_encoding($response, "UTF-8", "EUC-KR"); if($dom->loadHTML($response)): $xpath = new DomXPath($dom); $query = "//span[@class='caption' or @class='explan' or @class='fullHD' or @class='UHD' or @class='nowon']"; @@ -758,7 +762,6 @@ function GetEPGFromSKB($ChannelInfo) { //ChannelId, startTime, programName, subprogramName, desc, actors, producers, category, episode, rebroadcast, rating $epginfo[] = array($ChannelId, $startTime, $programName, $subprogramName, $desc, $actors, $producers, $category, $episode, $rebroadcast, $rating); endforeach; - epgzip($epginfo); else : if($GLOBALS['debug']) printError($ChannelName.CONTENT_ERROR); endif; @@ -767,6 +770,7 @@ function GetEPGFromSKB($ChannelInfo) { if($GLOBALS['debug']) printError($e->getMessage()); } endforeach; + epgzip($epginfo); } // Get EPG data from SKY @@ -1535,7 +1539,7 @@ function writeProgram($programdata) { $rating = sprintf("%s세 이상 관람가", $programdata['rating']); endif; if($GLOBALS['addverbose'] == 'y') : - $desc = htmlspecialchars($programdata['programName'], ENT_XML1); + $desc = trim(htmlspecialchars($programdata['programName'], ENT_XML1)); if($subprogramName) $desc = $desc."\n부제 : ".$subprogramName; if($rebroadcast == True && $GLOBALS['addrebroadcast'] == 'y') $desc = $desc."\n방송 : 재방송"; if($episode) $desc = $desc."\n회차 : ".$episode."회"; diff --git a/epg2xml.py b/epg2xml.py index eca42fa..63038b9 100644 --- a/epg2xml.py +++ b/epg2xml.py @@ -163,7 +163,7 @@ def GetEPGFromEPG(ChannelInfo): html_data = response.content data = unicode(html_data, 'euc-kr', 'ignore').encode('utf-8', 'ignore') pattern = '(.*)<\/td>' - data = re.sub(pattern, partial(replacement,txt='title'), data) + data = re.sub(pattern, partial(replacement, tag='td'), data) strainer = SoupStrainer('table', {'style':'margin-bottom:30'}) soup = BeautifulSoup(data, 'lxml', parse_only=strainer, from_encoding='utf-8') html = soup.find_all('table', {'style':'margin-bottom:30'}) @@ -270,7 +270,7 @@ def GetEPGFromLG(ChannelInfo): response.raise_for_status() html_data = response.content data = unicode(html_data, 'euc-kr', 'ignore').encode('utf-8', 'ignore') - data = data.replace('<재>', '<재>') + data = data.replace('<재>', '<재>').replace(' [..','').replace(' (..', '') strainer = SoupStrainer('table') soup = BeautifulSoup(data, 'lxml', parse_only=strainer, from_encoding='utf-8') html = soup.find('table').tbody.find_all('tr') if soup.find('table') else '' @@ -285,7 +285,7 @@ def GetEPGFromLG(ChannelInfo): startTime = startTime.strftime('%Y%m%d%H%M%S') rating = 0 if cell[1].find('span', {'class': 'tag cte_all'}).text.strip()=="All" else int(cell[1].find('span', {'class': 'tag cte_all'}).text.strip()) cell[1].find('span', {'class': 'tagGroup'}).decompose() - pattern = '(<재>?)?(.*?)(?:\[(.*)\])?\s?(?:\(([\d,]+)회\))?$' + pattern = '(<재>)?\s?(?:\[.*?\])?(.*?)(?:\[(.*)\])?\s?(?:\(([\d,]+)회\))?$' matches = re.match(pattern, cell[1].text.strip().decode('string_escape')) if not (matches is None): programName = matches.group(2).strip() if matches.group(2) else '' @@ -368,6 +368,17 @@ def GetEPGFromSKB(ChannelInfo): response.raise_for_status() html_data = response.content data = unicode(html_data, 'euc-kr', 'ignore').encode('utf-8', 'ignore') + data = re.sub('', '', data, 0, re.I|re.S) + data = re.sub('', '', data) + data = re.sub('', '', data) + data = re.sub('화면해설','',data) + data = re.sub('자막방송','',data) + data = re.sub('Full HD','',data) + data = re.sub('UHD','',data) + data = re.sub('now on','',data) + pattern = '(.*)<\/span>' + data = re.sub(pattern, partial(replacement, tag='span'), data) + #print(data) strainer = SoupStrainer('div', {'id':'dawn'}) soup = BeautifulSoup(data, 'lxml', parse_only=strainer, from_encoding='utf-8') html = soup.find_all('li') if soup.find_all('li') else '' @@ -379,9 +390,7 @@ def GetEPGFromSKB(ChannelInfo): startTime = str(day) + ' ' + row.find('span', {'class':'time'}).text startTime = datetime.datetime.strptime(startTime, '%Y-%m-%d %H:%M') startTime = startTime.strftime('%Y%m%d%H%M%S') - if row.find('span', {'class':['caption', 'explan', 'fullHD', 'UHD', 'nowon']}) : - row.find('span', {'class':['caption', 'explan', 'fullHD', 'UHD', 'nowon']}).decompose() - cell = row.find('span', {'class':None}).text.decode('string_escape').strip() + cell = row.find('span', {'class':'title'}).text.decode('string_escape').strip() pattern = "^(.*?)(\(([\d,]+)회\))?(<(.*)>)?(\((재)\))?$" matches = re.match(pattern, cell) if not(matches is None) : @@ -394,13 +403,13 @@ def GetEPGFromSKB(ChannelInfo): rating = int(rating.text.decode('string_escape').replace('세','').strip()) #ChannelId, startTime, programName, subprogramName, desc, actors, producers, category, episode, rebroadcast, rating epginfo.append([ChannelId, startTime, programName, subprogramName, desc, actors, producers, category, episode, rebroadcast, rating]) - epgzip(epginfo) else: if(debug): printError(ChannelName + CONTENT_ERROR) else: pass except (requests.exceptions.RequestException) as e: if(debug): printError(ChannelName + str(e)) else: pass + epgzip(epginfo) # Get EPG data from SKY def GetEPGFromSKY(ChannelInfo): @@ -510,7 +519,7 @@ def GetEPGFromIscs(ChannelInfo): try: data = json.loads(json_data, encoding='utf-8') pattern = '(.*)<\/td>' - data['html'] = re.sub(pattern, partial(replacement, txt='name'), data['html']) + data['html'] = re.sub(pattern, partial(replacement, tag='td'), data['html']) strainer = SoupStrainer('tbody') soup = BeautifulSoup(data['html'], 'lxml', parse_only=strainer) html = soup.find_all('tr') if soup.find_all('tr') else '' @@ -522,7 +531,7 @@ def GetEPGFromIscs(ChannelInfo): startTime = str(day) + ' ' + row.find('td', {'class':'time'}).text startTime = datetime.datetime.strptime(startTime, '%Y-%m-%d %H:%M') startTime = startTime.strftime('%Y%m%d%H%M%S') - programName = row.find('td', {'class':'name'}).text.decode('string_escape').strip() + programName = row.find('td', {'class':'title'}).text.decode('string_escape').strip() rating = row.find('span', {'class':'year'}).text.decode('string_escape').strip() if rating == '전체관람' : rating = 0 else : rating = rating.replace('세이상', ' ') @@ -888,7 +897,7 @@ def writeProgram(programdata): subprogramName = escape(programdata['subprogramName']).strip() matches = re.match('(.*) \(?(\d+부)\)?', unescape(programName.encode('utf-8', 'ignore'))) if not(matches is None): - programName = escape(matches.group(1)); + programName = escape(matches.group(1)).strip(); subprogramName = escape(matches.group(2)) + ' ' + subprogramName subprogramName = subprogramName.strip() if programName is None: @@ -905,7 +914,7 @@ def writeProgram(programdata): else : rating = '%s세 이상 관람가' % (programdata['rating']) if addverbose == 'y': - desc = escape(programdata['programName']) + desc = escape(programdata['programName']).strip() if subprogramName : desc = desc + '\n부제 : ' + subprogramName if rebroadcast == True and addrebroadcast == 'y' : desc = desc + '\n방송 : 재방송' if episode : desc = desc + '\n회차 : ' + str(episode) + '회' @@ -917,11 +926,10 @@ def writeProgram(programdata): desc ='' if programdata['desc'] : desc = desc + '\n' + escape(programdata['desc']) desc = re.sub(' +',' ', desc) - #desc = re.sub('\s+','\s', desc) contentTypeDict={'교양':'Arts / Culture (without music)', '만화':'Cartoons / Puppets', '교육':'Education / Science / Factual topics', '취미':'Leisure hobbies', '드라마':'Movie / Drama', '영화':'Movie / Drama', '음악':'Music / Ballet / Dance', '뉴스':'News / Current affairs', '다큐':'Documentary', '라이프':'Documentary', '시사/다큐':'Documentary', '연예':'Show / Game show', '스포츠':'Sports', '홈쇼핑':'Advertisement / Shopping'} contentType = '' for key, value in contentTypeDict.iteritems(): - if category.startswith(key): + if key in category: contentType = value print(' ' % (startTime, endTime, ChannelId)) print(' %s' % (programName)) @@ -956,10 +964,11 @@ def printLog(*args): def printError(*args): print("Error : ", *args, file=sys.stderr) -def replacement(match, txt): +def replacement(match, tag): if not(match is None): + tag = tag.strip() programName = unescape(match.group(1)).replace('<','<').replace('>','>').strip() - programName = '' + programName + '' + programName = '<'+ tag + ' class="title">' + programName + '' return programName else: return ''; From 4b62f0140d05c8147839ae662d7d5f57f2687c1a Mon Sep 17 00:00:00 2001 From: wonipapa Date: Fri, 1 Sep 2017 13:11:03 +0900 Subject: [PATCH 20/41] =?UTF-8?q?ISCS=20=ED=95=A8=EC=88=98=EA=B9=8C?= =?UTF-8?q?=EC=A7=80=20=EC=B2=B4=ED=81=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- epg2xml.php | 6 +++--- epg2xml.py | 7 ++++--- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/epg2xml.php b/epg2xml.php index 6e7c82a..c1662e5 100644 --- a/epg2xml.php +++ b/epg2xml.php @@ -914,7 +914,6 @@ function GetEPGFromNaver($ChannelInfo) { endforeach; endfor; endfor; - epgzip($epginfo); endif; } catch(Exception $e) { if($GLOBALS['debug']) printError($e->getMessage()); @@ -923,6 +922,7 @@ function GetEPGFromNaver($ChannelInfo) { } catch (Exception $e) { if($GLOBALS['debug']) printError($e->getMessage()); } + epgzip($epginfo); } // Get EPG data from Iscs @@ -982,7 +982,6 @@ function GetEPGFromIscs($ChannelInfo) { //ChannelId, startTime, programName, subprogramName, desc, actors, producers, category, episode, rebroadcast, rating $epginfo[] = array($ChannelId, $startTime, $programName, $subprogramName, $desc, $actors, $producers, $category, $episode, $rebroadcast, $rating); endforeach; - epgzip($epginfo); else : if($GLOBALS['debug']) printError($ChannelName.CONTENT_ERROR); endif; @@ -995,6 +994,7 @@ function GetEPGFromIscs($ChannelInfo) { if($GLOBALS['debug']) printError($e->getMessage()); } endforeach; + epgzip($epginfo); } // Get EPG data from Hcn @@ -1044,7 +1044,6 @@ function GetEPGFromHcn($ChannelInfo) { //ChannelId, startTime, programName, subprogramName, desc, actors, producers, category, episode, rebroadcast, rating $epginfo[] = array($ChannelId, $startTime, $programName, $subprogramName, $desc, $actors, $producers, $category, $episode, $rebroadcast, $rating); endforeach; - epgzip($epginfo); else : if($GLOBALS['debug']) printError($ChannelName.CONTENT_ERROR); endif; @@ -1053,6 +1052,7 @@ function GetEPGFromHcn($ChannelInfo) { if($GLOBALS['debug']) printError($e->getMessage()); } endforeach; + epgzip($epginfo); } // Get EPG data from POOQ diff --git a/epg2xml.py b/epg2xml.py index 63038b9..0c4e6af 100644 --- a/epg2xml.py +++ b/epg2xml.py @@ -495,13 +495,13 @@ def GetEPGFromNaver(ChannelInfo): rating = program['grade'] #ChannelId, startTime, programName, subprogramName, desc, actors, producers, category, episode, rebroadcast, rating epginfo.append([ChannelId, startTime, programName, subprogramName, desc, actors, producers, category, episode, rebroadcast, rating]) - epgzip(epginfo) except ValueError: if(debug): printError(ChannelName + CONTENT_ERROR) else: pass except (requests.RequestException) as e: if(debug): printError(ChannelName + str(e)) else: pass + epgzip(epginfo) # Get EPG data from ISCS def GetEPGFromIscs(ChannelInfo): @@ -543,13 +543,14 @@ def GetEPGFromIscs(ChannelInfo): rebroadcast = True if matches.group(3) else False #ChannelId, startTime, programName, subprogramName, desc, actors, producers, category, episode, rebroadcast, rating epginfo.append([ChannelId, startTime, programName, subprogramName, desc, actors, producers, category, episode, rebroadcast, rating]) - epgzip(epginfo) + except ValueError: if(debug): printError(ChannelName + CONTENT_ERROR) else: pass except (requests.RequestException) as e: if(debug): printError(ChannelName + str(e)) else: pass + epgzip(epginfo) # Get EPG data from HCN def GetEPGFromHcn(ChannelInfo): @@ -585,13 +586,13 @@ def GetEPGFromHcn(ChannelInfo): if not (grade is None): rating = int(grade.group(1)) #ChannelId, startTime, programName, subprogramName, desc, actors, producers, category, episode, rebroadcast, rating epginfo.append([ChannelId, startTime, programName, subprogramName, desc, actors, producers, category, episode, rebroadcast, rating]) - epgzip(epginfo) else: if(debug): printError(ChannelName + CONTENT_ERROR) else: pass except (requests.exceptions.RequestException) as e: if(debug): printError(ChannelName + str(e)) else: pass + epgzip(epginfo) # Get EPG data from POOQ def GetEPGFromPooq(ChannelInfo): From 3a235912163782a3cfca9972d7b3280d3d80296f Mon Sep 17 00:00:00 2001 From: wonipapa Date: Fri, 1 Sep 2017 15:49:50 +0900 Subject: [PATCH 21/41] =?UTF-8?q?HCN=20=ED=95=A8=EC=88=98=EA=B9=8C?= =?UTF-8?q?=EC=A7=80=20=EC=B2=B4=ED=81=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- epg2xml.php | 16 +++++++++------- epg2xml.py | 2 ++ 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/epg2xml.php b/epg2xml.php index c1662e5..eda5157 100644 --- a/epg2xml.php +++ b/epg2xml.php @@ -953,13 +953,13 @@ function GetEPGFromIscs($ChannelInfo) { printError($ChannelName.CHANNEL_ERROR); endif; else : - $html = $data['html']; + $response = $data['html']; + $response = mb_convert_encoding($response, "HTML-ENTITIES", "UTF-8"); $pattern = '/(.*)<\/td>/'; - $html = preg_replace_callback($pattern, function($matches) { return ''.htmlspecialchars($matches[1]).'';}, $html); + $response = preg_replace_callback($pattern, function($matches) { return ''.htmlspecialchars($matches[1]).'';}, $response); $dom = new DomDocument; libxml_use_internal_errors(True); - $html = mb_convert_encoding($html, "HTML-ENTITIES", "UTF-8"); - if($dom->loadHTML($html)): + if($dom->loadHTML($response)): $xpath = new DomXPath($dom); $query = "//div[@class='pp_tbl']/table/tbody/tr"; $rows = $xpath->query($query); @@ -1019,9 +1019,9 @@ function GetEPGFromHcn($ChannelInfo) { if ($response === False && $GLOBALS['debug']) : printError($ChannelName.HTTP_ERROR); else : + $response = mb_convert_encoding($response, "HTML-ENTITIES", "EUC-KR"); $dom = new DomDocument; libxml_use_internal_errors(True); - $response = mb_convert_encoding($response, "HTML-ENTITIES", "EUC-KR"); if($dom->loadHTML($response)): $xpath = new DomXPath($dom); $query = "//tr[@class='']"; @@ -1034,10 +1034,12 @@ function GetEPGFromHcn($ChannelInfo) { $startTime = $cells->item(0)->nodeValue ?: ""; $startTime = date("YmdHis", strtotime($day." ".$startTime)); $programName = trim($cells->item(1)->nodeValue) ?: ""; + $category = trim($cells->item(2)->nodeValue) ?: ""; + $category = preg_replace('/\(.*\)/', '', $category); $images = $row->getElementsByTagName('img'); foreach($images as $image): - preg_match('/re\.png/', $image->getAttribute('src'), $rebroadcast); - if($rebroadcast != NULL) $rebroadcast = True; + preg_match('/re\.png/', $image->getAttribute('src'), $rebroad); + if($rebroad != NULL) $rebroadcast = True; preg_match('/.*plus([\d,]+)\.png/', $image->getAttribute('src'), $grade); if($grade != NULL) $rating = $grade[1]; endforeach; diff --git a/epg2xml.py b/epg2xml.py index 0c4e6af..2d74c40 100644 --- a/epg2xml.py +++ b/epg2xml.py @@ -579,6 +579,8 @@ def GetEPGFromHcn(ChannelInfo): startTime = datetime.datetime.strptime(startTime, '%Y-%m-%d %H:%M') startTime = startTime.strftime('%Y%m%d%H%M%S') programName = row.find('td', {'class':'left'}).text.decode('string_escape').strip() + category = row.find('td', {'class':'l'}).text.decode('string_escape').strip() + category = re.sub('\(.*\)', '', category) for image in row.find_all('img', {'class':'vM'}, alt=True): rebroad = re.match('(재방송)',image['alt'].decode('string_escape').strip()) if not (rebroad is None): rebroadcast = True From 7c205587c7da97c99e9b9d2b7a276b46700ba23e Mon Sep 17 00:00:00 2001 From: wonipapa Date: Fri, 1 Sep 2017 15:54:29 +0900 Subject: [PATCH 22/41] Update README.md --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 43ff7dd..6f9fb8b 100644 --- a/README.md +++ b/README.md @@ -22,6 +22,7 @@ epg2xml.php와 동일하다. epg2xml.json 안의 항목이 설정 가능한 항목이다.