Browse Source

Fixed for SKB with Python 3.7

delete
flywithu 6 months ago
parent
commit
141b251585
8 changed files with 4188 additions and 1393 deletions
  1. 3721
    344
      Channel.json
  2. 10
    0
      README.md
  3. 0
    997
      epg2xml-web.php
  4. 5
    6
      epg2xml.json
  5. 0
    4
      epg2xml.php
  6. 55
    42
      epg2xml.py
  7. 149
    0
      skb.py
  8. 248
    0
      skbchannel.txt

+ 3721
- 344
Channel.json
File diff suppressed because it is too large
View File


+ 10
- 0
README.md View File

@@ -1,3 +1,13 @@
1
+## 변경사항
2
+### Version 2.0.0
3
+Python3.7 용으로 수정
4
+SKB 용으로 채널 정보 수정 및 id는 skb 채널 번호로 수정
5
+PHP 파일 삭제
6
+
7
+
8
+
9
+# 원본 메시지 아래
10
+-- 아래
1 11
 # 공지
2 12
 리포지터리 삭제되었습니다
3 13
 

+ 0
- 997
epg2xml-web.php
File diff suppressed because it is too large
View File


+ 5
- 6
epg2xml.json View File

@@ -2,30 +2,29 @@
2 2
     "###_COMMENT_###" : "",
3 3
     "###_COMMENT_###" : "epg 정보를 가져오는 설정 파일",
4 4
     "###_COMMENT_###" : "사용하는 ISP 선택 (ALL, KT, LG, SK)",
5
-    "MyISP": "ALL",
5
+    "MyISP": "SK",
6 6
     "###_COMMENT_###" : "### # My Channel EPG 정보 가져오는 채널 ID ###",
7 7
     "###_COMMENT_###" : "### 채널 ID를 , 로 구분하여 입력 ###",
8
-    "MyChannels" : "60, 110, 111, 122, 164",
9 8
     "###_COMMENT_###" : "output 셋팅은 (d, o, s) 셋중에 하나로 선택한다",
10 9
     "###_COMMENT_###" : " d - EPG 정보 화면 출력",
11 10
     "###_COMMENT_###" : " o - EPG 정보 파일로 저장",
12 11
     "###_COMMENT_###" : " s - EPG 정보 소켓으로 출력",
13
-    "output": "d",
12
+    "output": "s",
14 13
     "###_COMMENT_###" : "### TV channel icon url (ex : http://www.example.com/Channels) ###",
15 14
     "default_icon_url": "",
16 15
     "###_COMMENT_###" : "### 제목에 재방송 정보 출력 ###",
17 16
     "default_rebroadcast": "n",
18
-    "###_COMMENT_###" : "#### 제목에 회차정보 출력 ###",     
17
+    "###_COMMENT_###" : "#### 제목에 회차정보 출력 ###",
19 18
     "default_episode" : "y",
20 19
     "###_COMMENT_###" : "### EPG 정보 추가 출력 ###",
21 20
     "default_verbose" : "y",
22 21
     "###_COMMENT_###" : "### XMLTV_NS 정보 추가 출력 ###",
23 22
     "default_xmltvns" : "n",
24 23
     "###_COMMENT_###" : "### epg 데이터 가져오는 기간으로 1에서 7까지 설정가능 ###",
25
-    "default_fetch_limit" : "2",
24
+    "default_fetch_limit" : "4",
26 25
     "###_COMMENT_###" : "### epg 저장시 기본 저장 이름 (ex: /home/tvheadend/xmltv.xml) ###",
27 26
     "default_xml_file" : "xmltv.xml",
28 27
     "###_COMMENT_###" : "### # External XMLTV 사용시 기본 소켓 이름 (ex: /home/tvheadend/xmltv.sock) ###",
29
-    "default_xml_socket" : "xmltv.sock",
28
+    "default_xml_socket" : "/sock/xmltv.sock",
30 29
     "###_COMMENT_###" : ""
31 30
 }

+ 0
- 4
epg2xml.php View File

@@ -1,4 +0,0 @@
1
-#!/usr/bin/env php
2
-<?php
3
-include __DIR__."/epg2xml-web.php";
4
-?>

+ 55
- 42
epg2xml.py View File

@@ -1,8 +1,8 @@
1
-#!/usr/bin/env python2
1
+#!/usr/bin/env python3.7
2 2
 # -*- coding: utf-8 -*-
3 3
 
4 4
 from __future__ import print_function
5
-import imp
5
+import importlib.util
6 6
 import os
7 7
 import sys
8 8
 import json
@@ -16,35 +16,34 @@ import argparse
16 16
 import pprint
17 17
 from functools import partial
18 18
 import time
19
-
20 19
 try:
21
-    imp.find_module('bs4')
20
+    importlib.util.find_spec('bs4')
22 21
     from bs4 import BeautifulSoup, SoupStrainer
23 22
 except ImportError:
24 23
     print("Error : ", "BeautifulSoup 모듈이 설치되지 않았습니다.", file=sys.stderr)
25 24
     sys.exit()
26 25
 try:
27
-    imp.find_module('lxml')
26
+    importlib.util.find_spec('lxml')
28 27
     from lxml import html
29 28
 except ImportError:
30 29
     print("Error : ", "lxml 모듈이 설치되지 않았습니다.", file=sys.stderr)
31 30
     sys.exit()
32 31
 try:
33
-    imp.find_module('requests')
32
+    importlib.util.find_spec('requests')
34 33
     import requests
35 34
 except ImportError:
36 35
     print("Error : ", "requests 모듈이 설치되지 않았습니다.", file=sys.stderr)
37 36
     sys.exit()
38 37
 
39
-reload(sys)
40
-sys.setdefaultencoding('utf-8')
38
+sys.stdout.reconfigure(encoding='utf-8')
39
+sys.stdin.reconfigure(encoding='utf-8')
41 40
 
42
-if not sys.version_info[:2] == (2, 7):
43
-    print("Error : ", "python 2.7 버전이 필요합니다.", file=sys.stderr)
44
-    sys.exit()
41
+# if not sys.version_info[:2] == (2, 7):
42
+#     print("Error : ", "python 2.7 버전이 필요합니다.", file=sys.stderr)
43
+#     sys.exit()
45 44
 
46 45
 # Set variable
47
-__version__ = '1.2.6'
46
+__version__ = '2.0.0'
48 47
 debug = False
49 48
 today = datetime.date.today()
50 49
 ua = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116'}
@@ -62,7 +61,7 @@ def getEpg():
62 61
     Channelfile = os.path.dirname(os.path.abspath(__file__)) + '/Channel.json'
63 62
     ChannelInfos = []
64 63
     try:
65
-        with open(Channelfile) as f: # Read Channel Information file
64
+        with open(Channelfile, encoding="utf-8") as f: # Read Channel Information file
66 65
             Channeldatajson = json.load(f)
67 66
     except EnvironmentError:
68 67
         printError("Channel." + JSON_FILE_ERROR)
@@ -74,12 +73,8 @@ def getEpg():
74 73
     print('<!DOCTYPE tv SYSTEM "xmltv.dtd">\n')
75 74
     print('<tv generator-info-name="epg2xml ' + __version__ + '">')
76 75
 # My Channel 정의
77
-    MyChannelInfo = []
78
-    if MyChannels :
79
-        for MyChannel in MyChannels.split(','):
80
-            MyChannelInfo.append(int(MyChannel.strip()))
81 76
     for Channeldata in Channeldatajson: #Get Channel & Print Channel info
82
-        if Channeldata['Id'] in MyChannelInfo:
77
+#        if Channeldata['Id'] is 223:
83 78
             ChannelId = Channeldata['Id']
84 79
             ChannelName = escape(Channeldata['Name'])
85 80
             ChannelSource = Channeldata['Source']
@@ -141,10 +136,17 @@ def GetEPGFromKT(ChannelInfo):
141 136
         try:
142 137
             response = requests.post(url, data=params, headers=ua, timeout=timeout)
143 138
             response.raise_for_status()
144
-            html_data = response.content
145
-            data = unicode(html_data, 'euc-kr', 'ignore').encode('utf-8', 'ignore')
139
+
140
+
141
+            html_data = (response.content).decode("euc-kr")
142
+    #        data = unicode(html_data, 'euc-kr', 'ignore').encode('utf-8', 'ignore')
143
+            data = html_data
144
+
145
+            print(data)
146
+
147
+
146 148
             strainer = SoupStrainer('tbody')
147
-            soup = BeautifulSoup(data, htmlparser, parse_only=strainer, from_encoding='utf-8')
149
+            soup = BeautifulSoup(data, htmlparser, parse_only=strainer)
148 150
             html = soup.find_all('tr') if soup.find('tbody') else ''
149 151
             if(html):
150 152
                 for row in html:
@@ -187,11 +189,12 @@ def GetEPGFromLG(ChannelInfo):
187 189
         try:
188 190
             response = requests.post(url, data=params, headers=ua, timeout=timeout)
189 191
             response.raise_for_status()
190
-            html_data = response.content
191
-            data = unicode(html_data, 'euc-kr', 'ignore').encode('utf-8', 'ignore')
192
+            html_data = (response.content).decode("euc-kr")
193
+    #        data = unicode(html_data, 'euc-kr', 'ignore').encode('utf-8', 'ignore')
194
+            data = html_data
192 195
             data = data.replace('<재>', '&lt;재&gt;').replace(' [..','').replace(' (..', '')
193 196
             strainer = SoupStrainer('table')
194
-            soup = BeautifulSoup(data, htmlparser, parse_only=strainer, from_encoding='utf-8')
197
+            soup = BeautifulSoup(data, htmlparser, parse_only=strainer)
195 198
             html = soup.find('table').tbody.find_all('tr') if soup.find('table') else ''
196 199
             if(html):
197 200
                 for row in html:
@@ -205,7 +208,7 @@ def GetEPGFromLG(ChannelInfo):
205 208
                         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())
206 209
                         cell[1].find('span', {'class': 'tagGroup'}).decompose()
207 210
                         pattern = '(<재>)?\s?(?:\[.*?\])?(.*?)(?:\[(.*)\])?\s?(?:\(([\d,]+)회\))?$'
208
-                        matches = re.match(pattern, cell[1].text.strip().decode('string_escape'))
211
+                        matches = re.match(pattern, cell[1].text.strip())
209 212
                         if not (matches is None):
210 213
                             programName = matches.group(2).strip() if matches.group(2) else ''
211 214
                             subprogramName = matches.group(3).strip() if matches.group(3) else ''
@@ -239,7 +242,7 @@ def GetEPGFromSK(ChannelInfo):
239 242
         try:
240 243
             data = json.loads(json_data, encoding='utf-8')
241 244
             if (data['channel'] is None) :
242
-                 if(debug): printError(ChannelName + CONTENT_ERROR)
245
+                 if(True): printError(ChannelName + CONTENT_ERROR)
243 246
                  else: pass
244 247
             else :
245 248
                 programs = data['channel']['programs']
@@ -249,7 +252,7 @@ def GetEPGFromSK(ChannelInfo):
249 252
                     rating = 0
250 253
                     programName = program['programName'].replace('...', '>').encode('utf-8')
251 254
                     pattern = '^(.*?)(?:\s*[\(<]([\d,회]+)[\)>])?(?:\s*<([^<]*?)>)?(\((재)\))?$'
252
-                    matches = re.match(pattern, programName)
255
+                    matches = re.match(pattern, programName.decode('utf-8'))
253 256
                     if not (matches is None):
254 257
                         programName = matches.group(1).strip() if matches.group(1) else ''
255 258
                         subprogramName = matches.group(3).strip() if matches.group(3) else ''
@@ -289,9 +292,12 @@ def GetEPGFromSKB(ChannelInfo):
289 292
         try:
290 293
             response = requests.get(url, params=params, headers=ua, timeout=timeout)
291 294
             response.raise_for_status()
292
-            html_data = response.content
293
-            data = unicode(html_data, 'euc-kr', 'ignore').encode('utf-8', 'ignore')
294
-	    data = re.sub('EUC-KR', 'utf-8', data)
295
+            html_data = (response.content).decode("euc-kr")
296
+
297
+    #        data = unicode(html_data, 'euc-kr', 'ignore').encode('utf-8', 'ignore')
298
+            data = html_data
299
+
300
+            data = re.sub("EUC-KR", 'utf-8', data)
295 301
             data = re.sub('<!--(.*?)-->', '', data, 0, re.I|re.S)
296 302
             data = re.sub('<span class="round_flag flag02">(.*?)</span>', '', data)
297 303
             data = re.sub('<span class="round_flag flag03">(.*?)</span>', '', data)
@@ -301,10 +307,10 @@ def GetEPGFromSKB(ChannelInfo):
301 307
             data = re.sub('<span class="round_flag flag11">(.*?)</span>', '', data)
302 308
             data = re.sub('<span class="round_flag flag12">(.*?)</span>', '', data)
303 309
             data = re.sub('<strong class="hide">프로그램 안내</strong>', '', data)
304
-	    data = re.sub('<p class="cont">(.*)', partial(replacement, tag='p') , data)
305
-	    data = re.sub('<p class="tit">(.*)', partial(replacement, tag='p') , data)
310
+            data = re.sub('<p class="cont">(.*)', partial(replacement, tag='p') , data)
311
+            data = re.sub('<p class="tit">(.*)', partial(replacement, tag='p') , data)
306 312
             strainer = SoupStrainer('div', {'id':'uiScheduleTabContent'})
307
-	    soup = BeautifulSoup(data, htmlparser, parse_only=strainer, from_encoding='utf-8')
313
+            soup = BeautifulSoup(data, htmlparser, parse_only=strainer)
308 314
             html =  soup.find_all('li',{'class':'list'}) if soup.find_all('li') else ''
309 315
             if(html):
310 316
                 for row in html:
@@ -315,15 +321,23 @@ def GetEPGFromSKB(ChannelInfo):
315 321
                     startTime = datetime.datetime.strptime(startTime, '%Y-%m-%d %H:%M')
316 322
                     startTime = startTime.strftime('%Y%m%d%H%M%S')
317 323
                     cell = row.find('p', {'class':'cont'})
318
-	            grade = row.find('i', {'class':'hide'})
319
-		    if not(grade is None) :
320
-                       rating = int(grade.text.decode('string_escape').replace('세 이상','').strip())
324
+                    grade = row.find('i', {'class':'hide'})
325
+                    if not(grade is None):
326
+#                        rating = int(grade.text.decode('string_escape').replace('세 이상','').strip())
327
+                        rating = int(grade.text.replace('세 이상','').strip())
321 328
 
322 329
                     if(cell):
323 330
                         if cell.find('span'):
324 331
                             cell.span.decompose()
325
-                        cell = cell.text.decode('string_escape').strip()
332
+                #        cell = cell.text.decode('string_escape').strip()
333
+                #cell = cell.text.decode('string_escape').strip()
334
+
335
+                        #print (chardet.detect(cell.text.strip()))
336
+                        cell=cell.text.strip()
337
+                #        print (chardet.detect(bytes(cell,'utf-8')))
338
+                #        cell = cell.text.strip()
326 339
                         pattern = "^(.*?)(\(([\d,]+)회\))?(<(.*)>)?(\((재)\))?$"
340
+#                        print (chardet.detect(pattern))
327 341
                         matches = re.match(pattern, cell)
328 342
 
329 343
                         if not(matches is None) :
@@ -416,7 +430,7 @@ def writeProgram(programdata):
416 430
     endTime = programdata['endTime']
417 431
     programName = escape(programdata['programName']).strip()
418 432
     subprogramName = escape(programdata['subprogramName']).strip()
419
-    matches = re.match('(.*) \(?(\d+부)\)?', unescape(programName.encode('utf-8', 'ignore')))
433
+    matches = re.match('(.*) \(?(\d+부)\)?', unescape(programName))
420 434
     if not(matches is None):
421 435
         programName = escape(matches.group(1)).strip();
422 436
         subprogramName = escape(matches.group(2)) + ' ' + subprogramName
@@ -457,7 +471,7 @@ def writeProgram(programdata):
457 471
     desc = re.sub(' +',' ', desc)
458 472
     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'}
459 473
     contentType = ''
460
-    for key, value in contentTypeDict.iteritems():
474
+    for key, value in contentTypeDict.items():
461 475
         if key in category:
462 476
             contentType = value
463 477
     print('  <programme start="%s +0900" stop="%s +0900" channel="%s">' % (startTime, endTime, ChannelId))
@@ -504,10 +518,9 @@ def replacement(match, tag):
504 518
 Settingfile = os.path.dirname(os.path.abspath(__file__)) + '/epg2xml.json'
505 519
 ChannelInfos = []
506 520
 try:
507
-    with open(Settingfile) as f: # Read Channel Information file
521
+    with open(Settingfile, encoding="utf-8") as f: # Read Channel Information file
508 522
         Settings = json.load(f)
509 523
         MyISP = Settings['MyISP'] if 'MyISP' in Settings else 'ALL'
510
-        MyChannels = Settings['MyChannels'] if 'MyChannels' in Settings else ''
511 524
         default_output = Settings['output'] if 'output' in Settings else 'd'
512 525
         default_xml_file = Settings['default_xml_file'] if 'default_xml_file' in Settings else 'xmltv.xml'
513 526
         default_xml_socket = Settings['default_xml_socket'] if 'default_xml_socket' in Settings else 'xmltv.sock'
@@ -641,7 +654,7 @@ elif output == "socket" :
641 654
         try:
642 655
             sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
643 656
             sock.connect(default_xml_socket)
644
-            sockfile = sock.makefile('w+')
657
+            sockfile = sock.makefile('w')
645 658
             sys.stdout = sockfile
646 659
         except socket.error:
647 660
             printError(SOCKET_ERROR)

+ 149
- 0
skb.py View File

@@ -0,0 +1,149 @@
1
+#!/usr/bin/env python3
2
+# -*- coding: utf-8 -*-
3
+
4
+import json
5
+from pprint import pprint
6
+import sys
7
+import codecs
8
+sys.stdout.reconfigure(encoding='utf-8')
9
+sys.stdin.reconfigure(encoding='utf-8')
10
+
11
+# reload(sys)
12
+# sys.setdefaultencoding('utf-8')
13
+
14
+path = 'skbchannel.txt'
15
+skb_channels = []
16
+
17
+channeljson = 'Channel.json'
18
+channeldatas = []
19
+
20
+#print (sys.stdin.encoding)
21
+#print (sys.stdout.encoding)
22
+with open(channeljson, encoding="utf-8") as json_data:
23
+    channeldatas=json.load(json_data)
24
+    json_data.close()
25
+
26
+with open(path, encoding="utf-8") as f:
27
+  for line in f:
28
+    inner_list = [elt.strip() for elt in line.split('\t')]
29
+    skb_channels.append(inner_list)
30
+
31
+def getChanneldata(a):
32
+  #print ("Search:" + a[1])
33
+  try:
34
+      findchannel=None
35
+      for channeldata in channeldatas:
36
+        channelnames=[(channeldata['SK Name']), (channeldata['KT Name']), channeldata['LG Name']]
37
+    #    print (channelnames)
38
+        if(a[1] in channelnames):
39
+          findchannel = channeldata
40
+          break
41
+
42
+#      print (findchannel['Source'])
43
+#      if(findchannel['Source'] is "KT"):
44
+#        print (findchannel)
45
+      if(findchannel['Source']== "KT"):
46
+        print (findchannel['Name'])
47
+        if(len(a)<3):
48
+            print ("ERR")
49
+        findchannel['Name'] = a[1]
50
+        findchannel['Id'] = int(a[0])
51
+        findchannel['ServiceId'] = a[2]
52
+        findchannel['SK Name']=a[1]
53
+        findchannel['KT Name']=a[1]
54
+        findchannel['LG Name']=a[1]
55
+
56
+      if(findchannel['Source']== "NAVER"):
57
+        print (findchannel['Name'])
58
+        if(len(a)<3):
59
+            print ("ERR")
60
+        findchannel['Name'] = a[1]
61
+        findchannel['Id'] = int(a[0])
62
+        findchannel['ServiceId'] = a[2]
63
+        findchannel['SK Name']=a[1]
64
+        findchannel['KT Name']=a[1]
65
+        findchannel['LG Name']=a[1]
66
+
67
+      if(len(a)>2):
68
+        findchannel = {"Id": 0,
69
+            "Name": "",
70
+            "KT Name": "",
71
+            "KTCh": 0,
72
+            "LG Name": "",
73
+            "LGCh": 0,
74
+            "SK Name": "",
75
+            "SKCh": 0,
76
+            "Radio Name": "",
77
+            "RadioCh":0 ,
78
+            "Icon_url": "",
79
+            "Source": "SKB",
80
+            "ServiceId": 0}
81
+        findchannel['Name'] = a[1]
82
+        findchannel['Id'] = int(a[0])
83
+        findchannel['ServiceId'] = a[2]
84
+        findchannel['SK Name']=a[1]
85
+        findchannel['KT Name']=a[1]
86
+        findchannel['LG Name']=a[1]
87
+#        print (findchannel)
88
+      if (findchannel==None):
89
+        print ("error:" + a[1]+":"+a[0]+":"+str(len(a)))
90
+#  print (findchannel)
91
+      findchannel['Id']=int(a[0])
92
+      findchannel['SK Name']=a[1]
93
+      findchannel['SKCh']=int(a[0])
94
+  except Exception as e:
95
+    print ("error!!:" + a[1]+":"+a[0])
96
+    print (e)
97
+  return findchannel
98
+#  else:
99
+#     print (findchannel)
100
+
101
+MyChannelInfos = []
102
+for skb_channel in skb_channels:
103
+  MyChannelInfo = getChanneldata(skb_channel)
104
+#  print(MyChannelInfo)
105
+  if(MyChannelInfo != None):
106
+#    MyChannelInfo['Id']=str(skb_channel[0])
107
+#    MyChannelInfo['SKCh']= skb_channel[0]
108
+#    print(MyChannelInfo)
109
+    MyChannelInfos.append(MyChannelInfo)
110
+#  else:
111
+#    print("None"+skb_channel[1])
112
+with open('Channel.json','w',encoding="utf-8") as outfile:
113
+  json.dump(MyChannelInfos, outfile, indent=2,ensure_ascii=False)
114
+#print SKB_CHANNEL
115
+#print skb_channel[0][1]
116
+
117
+# //a = Channel name data
118
+# def getChannelNumber(a):
119
+# #  print ("AAAA",a[0])
120
+#   for skb_channel in skb_channels:
121
+# #    print ("BBBB",skb_channel[1])
122
+#     if((unicode(skb_channel[1]).find(a[0])>-1) and a[0]!=""):
123
+#       return skb_channel[0]
124
+#     elif((unicode(skb_channel[1]).find(a[1])>-1) and a[1]!=""):
125
+#       return skb_channel[0]
126
+#     elif((unicode(skb_channel[1]).find(a[2])>-1) and a[2]!=""):
127
+#       return skb_channel[0]
128
+#   return None
129
+#
130
+#
131
+# with open('Channel.json') as json_data:
132
+#
133
+#   MyChannelInfo = []
134
+#
135
+# #  print getChannelNumber('asf')
136
+# #  getChannelNumber=""
137
+#   for Channeldata in Channeldatajson:
138
+#     test=[(Channeldata['SK Name']), (Channeldata['KT Name']), Channeldata['LG Name']]
139
+#     channelNumber=getChannelNumber(test)
140
+# #    print channelNumber
141
+#     if(channelNumber is None):
142
+#       print Channeldata['SK Name']
143
+#     else :
144
+# #      print channelNumber
145
+#       Channeldata['Id']=channelNumber
146
+#       MyChannelInfo.append(Channeldata)
147
+#
148
+#   with open('data.txt','w') as outfile:
149
+#     json.dump(MyChannelInfo, outfile)

+ 248
- 0
skbchannel.txt View File

@@ -0,0 +1,248 @@
1
+23	연합뉴스TV
2
+24	YTN
3
+26	SBS CNBC
4
+150	토마토TV
5
+151	한국경제TV
6
+152	MTN
7
+153	매일경제TV
8
+154	팍스경제TV	622
9
+155	이데일리TV
10
+156	서울경제TV
11
+157	YTN 라이프
12
+158	CNN International
13
+159	CNN US
14
+160	BBC World News
15
+161	CGTN
16
+162	Bloomberg TV
17
+163	Channel News Asia
18
+164	내외경제TV
19
+165	부동산토마토	621
20
+166	FOX News Channel	791
21
+167	tbsTV
22
+260	NGC
23
+261	Discovery Channel
24
+262	YTN 사이언스
25
+263	Natgeo People
26
+264	History
27
+265	BBC earth
28
+266	Natgeo Wild HD
29
+267	리얼TV
30
+268	헬스메디TV
31
+269	쿠키건강TV
32
+270	아리랑TV
33
+271	소상공인방송
34
+273	한국직업방송
35
+274	MBC NET
36
+275	소비자TV
37
+276	NBS 한국농업방송	443
38
+277	CCTV4
39
+278	NHK World Premium
40
+279	TV5Monde
41
+280	법률방송
42
+281	채널i
43
+282	국방TV
44
+283	다큐원
45
+284	브릿지TV	446
46
+285	지방자치TV	447
47
+286	다문화TV	448
48
+300	CBS
49
+301	CTS
50
+302	CGNTV
51
+303	Good TV
52
+304	C채널
53
+305	BTN 불교TV
54
+306	BBS 불교방송
55
+307	가톨릭평화방송
56
+308	STB 상생방송
57
+309	원음방송
58
+3	tvN
59
+28	MBC Every1
60
+48	JTBC2
61
+49	E채널
62
+74	INSIGHT TV
63
+80	KBS joy
64
+81	SBS fun E
65
+83	E! Entertainment	789
66
+84	OtvN	527
67
+85	XtvN
68
+86	TVCHOSUN2	631
69
+87	코미디TV
70
+88	K star
71
+89	라이프타임
72
+90	FX
73
+91	FUN TV
74
+92	마이펫TV
75
+93	CMCTV	876
76
+94	Sky Petpark
77
+96	DIA TV
78
+97	채널A플러스	891
79
+98	MBN플러스	892
80
+99	skyENT	893
81
+213	CUBE TV
82
+290	KTV
83
+291	국회방송
84
+292	OUN
85
+293	복지TV
86
+2	공영쇼핑	332
87
+4	홈&쇼핑
88
+6	CJ오쇼핑
89
+8	현대홈쇼핑	321
90
+10	롯데홈쇼핑	323
91
+12	GS SHOP
92
+14	NS홈쇼핑
93
+17	SK stoa
94
+21	K쇼핑
95
+22	신세계쇼핑
96
+25	쇼핑엔티
97
+29	GS MY SHOP
98
+31	롯데OneTV
99
+33	CJ오쇼핑 플러스
100
+37	W쇼핑
101
+39	현대홈쇼핑+Shop
102
+41	NS Shop+
103
+200	JEI 재능 English
104
+201	플레이런TV
105
+202	EBS English
106
+203	EBS +1
107
+204	EBS +2
108
+205	edu TV
109
+118	SPOTV ON
110
+119	SPOTV ON 2	137
111
+120	SPOTV
112
+121	KBSN 스포츠
113
+122	SBS Sports
114
+123	MBC Sports+
115
+124	MBC SPORTS+2
116
+125	sky Sports
117
+126	JTBC3 FOX SPORTS	436
118
+127	SPOTV+
119
+128	SPOTV2
120
+129	IB Sports
121
+130	Billiards TV
122
+131	SBS GOLF
123
+132	JTBC GOLF
124
+133	Golf Channel Korea
125
+134	Eurosport
126
+135	Star Sports
127
+136	OGN
128
+137	SPOTV GAMES
129
+138	스크린골프존	138
130
+139	인도어스포츠
131
+240	바둑TV
132
+241	K-바둑
133
+242	브레인TV
134
+243	FTV
135
+244	FISHING TV
136
+245	ONT
137
+246	sky Travel
138
+247	Mountain TV
139
+249	폴라리스TV
140
+251	리빙TV
141
+27	M.net
142
+230	SBS MTV
143
+231	MBC Music
144
+232	GMTV
145
+233	아이넷 TV
146
+234	Arte TV
147
+235	STINGRAY CLASSICA	787
148
+237	Stingray CMusic	672
149
+238	이벤트TV
150
+239	BET
151
+79	DOG TV
152
+210	On style
153
+211	Fashion N
154
+212	채널 뷰	276
155
+214	KBS W
156
+215	Life U
157
+216	Fox life
158
+217	Gtv
159
+218	동아TV
160
+219	OBSW
161
+220	9colors
162
+221	NHK WORLD JAPAN	783
163
+222	JTBC4	259
164
+223	TRENDY	288
165
+224	CookTV	289
166
+225	Now제주TV	290
167
+226	육아방송
168
+227	실버아이TV
169
+228	시니어TV	291
170
+1	SBS 플러스
171
+30	KBS 드라마
172
+32	MBC 드라마
173
+34	Olive	431
174
+36	드라마큐브
175
+38	드라맥스
176
+40	sky Drama
177
+42	Highlight TV
178
+43	CNTV
179
+44	EDGE TV
180
+45	디원
181
+46	드라마H
182
+47	HQ+
183
+70	UXN
184
+71	UHD Dream TV
185
+72	Asia UHD
186
+73	UMAX	69
187
+101	FOX
188
+102	AXN
189
+103	채널J
190
+104	중화TV
191
+105	채널 Ching
192
+106	Asia N
193
+107	히어로액션
194
+108	채널차이나
195
+109	텔레노벨라
196
+110	채널W	172
197
+51	CATCH ON 1
198
+52	CATCH ON 2
199
+53	Ch CGV
200
+54	OCN
201
+55	SUPER ACTION
202
+56	Screen
203
+57	Mplex
204
+58	Cinef
205
+59	The Movie
206
+60	AsiaM	174
207
+61	인디필름
208
+62	Celestial Movies
209
+320	플레이보이TV
210
+321	미드나잇
211
+322	Viki
212
+323	허니TV
213
+324	핑크하우스
214
+325	디자이어TV
215
+182	뽀요TV	387
216
+183	캐리TV	388
217
+187	english gem	390
218
+188	신기한나라TV
219
+189	키즈톡톡 플러스
220
+190	KBS KIDS
221
+191	어린이TV
222
+192	JEI 재능TV
223
+193	bravo kids	370
224
+194	EBS KIDS	372
225
+195	Baby TV	785
226
+196	대교베이비TV	373
227
+170	Tooniverse
228
+171	디즈니채널
229
+172	디즈니주니어
230
+173	Animax
231
+174	애니원
232
+175	부메랑
233
+176	Nickelodeon
234
+177	카툰네트워크
235
+178	애니플러스
236
+179	애니박스
237
+180	DreamWorks	790
238
+15	JTBC
239
+16	MBN
240
+18	채널A
241
+19	TV CHOSUN	243
242
+5	SBS
243
+7	KBS2
244
+9	KBS1
245
+11	MBC
246
+13	EBS
247
+20	OBS
248
+95	EBS2