라디오 채널 epg 추가

This commit is contained in:
wonipapa 2017-04-19 12:44:18 +09:00 committed by GitHub
parent b4d051f5a4
commit da5c1a756c

View File

@ -6,6 +6,7 @@ import os
import sys import sys
import requests import requests
import json import json
import locale
import datetime import datetime
from bs4 import BeautifulSoup, SoupStrainer from bs4 import BeautifulSoup, SoupStrainer
import codecs import codecs
@ -14,10 +15,11 @@ import re
from xml.sax.saxutils import escape, unescape from xml.sax.saxutils import escape, unescape
import argparse import argparse
import pprint import pprint
reload(sys) reload(sys)
sys.setdefaultencoding('utf-8') sys.setdefaultencoding('utf-8')
__version__ = '1.1.6' __version__ = '1.1.7'
# Set variable # Set variable
debug = False debug = False
@ -43,7 +45,6 @@ def getEpg():
except ValueError: except ValueError:
printError("Channel." + JSON_SYNTAX_ERROR) printError("Channel." + JSON_SYNTAX_ERROR)
sys.exit() sys.exit()
print('<?xml version="1.0" encoding="UTF-8"?>') print('<?xml version="1.0" encoding="UTF-8"?>')
print('<!DOCTYPE tv SYSTEM "xmltv.dtd">\n') print('<!DOCTYPE tv SYSTEM "xmltv.dtd">\n')
print('<tv generator-info-name="epg2xml ' + __version__ + '">') print('<tv generator-info-name="epg2xml ' + __version__ + '">')
@ -89,6 +90,16 @@ def getEpg():
GetEPGFromSKY(ChannelInfo) GetEPGFromSKY(ChannelInfo)
elif ChannelSource == 'NAVER': elif ChannelSource == 'NAVER':
GetEPGFromNaver(ChannelInfo) 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)
print('</tv>') print('</tv>')
# Get EPG data from epg.co.kr # Get EPG data from epg.co.kr
@ -109,7 +120,6 @@ def GetEPGFromEPG(ChannelInfo):
strainer = SoupStrainer('table', {'style':'margin-bottom:30'}) strainer = SoupStrainer('table', {'style':'margin-bottom:30'})
soup = BeautifulSoup(data, 'lxml', parse_only=strainer, from_encoding='utf-8') soup = BeautifulSoup(data, 'lxml', parse_only=strainer, from_encoding='utf-8')
tables = soup.find_all('table', {'style':'margin-bottom:30'}) tables = soup.find_all('table', {'style':'margin-bottom:30'})
for i in range(1,4): for i in range(1,4):
thisday = day thisday = day
row = tables[i].find_all('td', {'colspan':'2'}) row = tables[i].find_all('td', {'colspan':'2'})
@ -137,7 +147,6 @@ def GetEPGFromEPG(ChannelInfo):
subprogramName = matches.group(4).strip() if matches.group(4) else '' subprogramName = matches.group(4).strip() if matches.group(4) else ''
#programName, startTime, rating, subprogramName, rebroadcast, episode #programName, startTime, rating, subprogramName, rebroadcast, episode
epginfo.append([programName, startTime, rating, subprogramName, matches.group(5), matches.group(7)]) epginfo.append([programName, startTime, rating, subprogramName, matches.group(5), matches.group(7)])
for epg1, epg2 in zip(epginfo, epginfo[1:]): for epg1, epg2 in zip(epginfo, epginfo[1:]):
programName = epg1[0] if epg1[0] else '' programName = epg1[0] if epg1[0] else ''
subprogramName = epg1[3] if epg1[3] else '' subprogramName = epg1[3] if epg1[3] else ''
@ -161,7 +170,6 @@ def GetEPGFromKT(ChannelInfo):
ChannelId = ChannelInfo[0] ChannelId = ChannelInfo[0]
ChannelName = ChannelInfo[1] ChannelName = ChannelInfo[1]
ServiceId = ChannelInfo[3] ServiceId = ChannelInfo[3]
url = 'http://tv.olleh.com/renewal_sub/liveTv/pop_schedule_week.asp' url = 'http://tv.olleh.com/renewal_sub/liveTv/pop_schedule_week.asp'
for k in range(period): for k in range(period):
day = today + datetime.timedelta(days=k) day = today + datetime.timedelta(days=k)
@ -213,7 +221,6 @@ def GetEPGFromLG(ChannelInfo):
ChannelId = ChannelInfo[0] ChannelId = ChannelInfo[0]
ChannelName = ChannelInfo[1] ChannelName = ChannelInfo[1]
ServiceId = ChannelInfo[3] ServiceId = ChannelInfo[3]
url = 'http://www.uplus.co.kr/css/chgi/chgi/RetrieveTvSchedule.hpi' url = 'http://www.uplus.co.kr/css/chgi/chgi/RetrieveTvSchedule.hpi'
for k in range(period): for k in range(period):
day = today + datetime.timedelta(days=k) day = today + datetime.timedelta(days=k)
@ -234,7 +241,6 @@ def GetEPGFromLG(ChannelInfo):
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()) 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() cell[1].find('span', {'class': 'tagGroup'}).decompose()
epginfo.append([cell[1].text.strip(), str(day) + ' ' + cell[0].text, cell[2].text.strip(), rating]) epginfo.append([cell[1].text.strip(), str(day) + ' ' + cell[0].text, cell[2].text.strip(), rating])
#cell[1].find('img', alt=True)['alt'].strip()])
for epg1, epg2 in zip(epginfo, epginfo[1:]): for epg1, epg2 in zip(epginfo, epginfo[1:]):
programName = '' programName = ''
subprogramName = '' subprogramName = ''
@ -298,14 +304,9 @@ def GetEPGFromSK(ChannelInfo):
startTime = startTime.strftime('%Y%m%d%H%M%S') startTime = startTime.strftime('%Y%m%d%H%M%S')
endTime = datetime.datetime.fromtimestamp(int(program['endTime'])/1000) endTime = datetime.datetime.fromtimestamp(int(program['endTime'])/1000)
endTime = endTime.strftime('%Y%m%d%H%M%S') endTime = endTime.strftime('%Y%m%d%H%M%S')
if addverbose=='y' : desc = program['synopsis'] if program['synopsis'] else ''
desc = program['synopsis'] if program['synopsis'] else '' actors = program['actorName'].replace('...','').strip(', ') if program['actorName'] else ''
actors = program['actorName'].replace('...','').strip(', ') if program['actorName'] else '' producers = program['directorName'].replace('...','').strip(', ') if program['directorName'] else ''
producers = program['directorName'].replace('...','').strip(', ') if program['directorName'] else ''
else:
desc = ''
actors = ''
producers = ''
if not (program['mainGenreName'] is None) : if not (program['mainGenreName'] is None) :
category = program['mainGenreName'] category = program['mainGenreName']
else: else:
@ -345,21 +346,16 @@ def GetEPGFromSKY(ChannelInfo):
subprogramName = unescape(program['program_subname']).replace('lt;','<').replace('gt;','>').replace('amp;','&') if program['program_subname'] else '' subprogramName = unescape(program['program_subname']).replace('lt;','<').replace('gt;','>').replace('amp;','&') if program['program_subname'] else ''
startTime = program['starttime'] startTime = program['starttime']
endTime = program['endtime'] endTime = program['endtime']
if addverbose == 'y': actors = program['cast'].replace('...','').strip(', ') if program['cast'] else ''
actors = program['cast'].replace('...','').strip(', ') if program['cast'] else '' producers = program['dirt'].replace('...','').strip(', ') if program['dirt'] else ''
producers = program['dirt'].replace('...','').strip(', ') if program['dirt'] else '' description = unescape(program['description']).replace('lt;','<').replace('gt;','>').replace('amp;','&') if program['description'] else ''
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 ''
summary = unescape(program['summary']).replace('lt;','<').replace('gt;','>').replace('amp;','&') if program['summary'] else '' desc = description if description else ''
desc = description if description else '' if summary : desc = desc + '\n' + summary
if summary : desc = desc + '\n' + summary
else:
desc = ''
actors = ''
producers = ''
category = program['program_category1'] category = program['program_category1']
episode = program['episode_id'] if program['episode_id'] else '' episode = program['episode_id'] if program['episode_id'] else ''
if episode : episode = int(episode) if episode : episode = int(episode)
rebroadcast = True if program['rebroad']== 'Y' else False rebroadcast = True if program['rebroad']== 'Y' else False
rating = int(program['grade']) if program['grade'] else 0 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} programdata = {'channelId':ChannelId, 'startTime':startTime, 'endTime':endTime, 'programName':programName, 'subprogramName':subprogramName, 'desc':desc, 'actors':actors, 'producers':producers, 'category':category, 'episode':episode, 'rebroadcast':rebroadcast, 'rating':rating}
writeProgram(programdata) writeProgram(programdata)
@ -381,9 +377,7 @@ def GetEPGFromNaver(ChannelInfo):
for k in range(period): for k in range(period):
day = today + datetime.timedelta(days=k) day = today + datetime.timedelta(days=k)
totaldate.append(day.strftime('%Y%m%d')) totaldate.append(day.strftime('%Y%m%d'))
params = {'_callback': 'epg', 'fileKey': 'single_schedule_channel_day', 'pkid': '66', 'u1': 'single_schedule_channel_day', 'u2': ','.join(totaldate), 'u3': today.strftime('%Y%m%d'), 'u4': period, 'u5': ServiceId, 'u6': '1', 'u7': ChannelName + '편성표', 'u8': ChannelName + '편성표', 'where': 'nexearch'} params = {'_callback': 'epg', 'fileKey': 'single_schedule_channel_day', 'pkid': '66', 'u1': 'single_schedule_channel_day', 'u2': ','.join(totaldate), 'u3': today.strftime('%Y%m%d'), 'u4': period, 'u5': ServiceId, 'u6': '1', 'u7': ChannelName + '편성표', 'u8': ChannelName + '편성표', 'where': 'nexearch'}
try: try:
response = requests.get(url, params=params, headers=ua) response = requests.get(url, params=params, headers=ua)
response.raise_for_status() response.raise_for_status()
@ -394,7 +388,6 @@ def GetEPGFromNaver(ChannelInfo):
for j in range(0,24): for j in range(0,24):
for program in data['schedules'][j][i]: for program in data['schedules'][j][i]:
epginfo.append([program['title'], date['date'] + ' ' + program['startTime'], program['episode'].replace('',''), program['isRerun'], program['grade']]) epginfo.append([program['title'], date['date'] + ' ' + program['startTime'], program['episode'].replace('',''), program['isRerun'], program['grade']])
for epg1, epg2 in zip(epginfo, epginfo[1:]): for epg1, epg2 in zip(epginfo, epginfo[1:]):
programName = unescape(epg1[0]) if epg1[0] else '' programName = unescape(epg1[0]) if epg1[0] else ''
subprogramName = '' subprogramName = ''
@ -419,6 +412,159 @@ def GetEPGFromNaver(ChannelInfo):
if(debug): printError(ChannelName + HTTP_ERROR) if(debug): printError(ChannelName + HTTP_ERROR)
else: pass 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 MBC
def GetEPGFromMbc(ChannelInfo):
ChannelId = ChannelInfo[0]
ChannelName = ChannelInfo[1]
ServiceId = ChannelInfo[3]
dayofweek = ['', '', '', '', '', '', '']
url = 'http://miniunit.imbc.com/Schedule'
params = {'rtype': 'json'}
for k in range(period):
day = today + datetime.timedelta(days=k)
try:
response = requests.get(url, params=params, headers=ua)
response.raise_for_status()
json_data = response.text
try:
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
matches = re.match('^(.*?)(\(재\))?$', 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:
if(debug): printError(ChannelName + CONTENT_ERROR)
else: pass
except requests.exceptions.HTTPError:
if(debug): printError(ChannelName + HTTP_ERROR)
else: pass
# Get EPG data from MIL
def GetEPGFromMil(ChannelInfo):
ChannelId = ChannelInfo[0]
ChannelName = ChannelInfo[1]
ServiceId = ChannelInfo[3]
url = 'http://radio.dema.mil.kr/web/fm/quick/ajaxTimetableList.do'
for k in range(period):
day = today + datetime.timedelta(days=k)
params = {'program_date': day.strftime('%Y%m%d')}
try:
response = requests.get(url, params=params, headers=ua)
response.raise_for_status()
json_data = response.text
try:
data = json.loads(json_data, encoding='utf-8')
for program in data['resultList']:
programName = ''
rebroadcast = False
matches = re.match('^(.*?)(\(재\))?$', unescape(program['program_title'].encode('utf-8', 'ignore')))
if not(matches is None):
programName = matches.group(1)
rebroadcast = True if matches.group(2) else False
subprogramName = unescape(program['program_subtitle'])
startTime = str(day) + ' ' + program['program_time']
startTime = datetime.datetime.strptime(startTime, '%Y-%m-%d %H%M')
startTime = startTime.strftime('%Y%m%d%H%M%S')
endTime = str(day) + ' ' + program['program_end_time']
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')
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:
if(debug): printError(ChannelName + CONTENT_ERROR)
else: pass
except requests.exceptions.HTTPError:
if(debug): printError(ChannelName + HTTP_ERROR)
else: pass
# Get EPG data from IFM
def GetEPGFromIfm(ChannelInfo):
ChannelId = ChannelInfo[0]
ChannelName = ChannelInfo[1]
ServiceId = ChannelInfo[3]
dayofweek = ['1', '2', '3', '4', '5', '6', '7']
url = 'http://mapp.itvfm.co.kr/hyb/front/selectHybPgmList.do'
for k in range(period):
day = today + datetime.timedelta(days=k)
params = {'outDay':dayofweek[(day.weekday()+1)%7], 'viewDt':day}
try:
response = requests.get(url, params=params, headers=ua)
response.raise_for_status()
json_data = response.text
try:
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')
endTime = str(day) + ' ' + program['pgmEtime']
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')
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:
if(debug): printError(ChannelName + CONTENT_ERROR)
else: pass
except requests.exceptions.HTTPError:
if(debug): printError(ChannelName + HTTP_ERROR)
else: pass
# Write Program # Write Program
def writeProgram(programdata): def writeProgram(programdata):
ChannelId = programdata['channelId'] ChannelId = programdata['channelId']
@ -463,10 +609,10 @@ def writeProgram(programdata):
print(' <credits>') print(' <credits>')
if actors: if actors:
for actor in actors.split(','): for actor in actors.split(','):
if actor: print(' <actor>%s</actor>' % (actor)) if actor.strip(): print(' <actor>%s</actor>' % (actor.strip()))
if producers: if producers:
for producer in producers.split(','): for producer in producers.split(','):
if producer: print(' <producer>%s</producer>' % (producer)) if producer.strip(): print(' <producer>%s</producer>' % (producer).strip())
print(' </credits>') print(' </credits>')
if category: print(' <category lang="kr">%s</category>' % (category)) if category: print(' <category lang="kr">%s</category>' % (category))
@ -508,7 +654,6 @@ except ValueError:
printError("epg2xml." + JSON_SYNTAX_ERROR) printError("epg2xml." + JSON_SYNTAX_ERROR)
sys.exit() sys.exit()
parser = argparse.ArgumentParser(description = 'EPG 정보를 출력하는 방법을 선택한다') parser = argparse.ArgumentParser(description = 'EPG 정보를 출력하는 방법을 선택한다')
argu1 = parser.add_argument_group(description = 'IPTV 선택') argu1 = parser.add_argument_group(description = 'IPTV 선택')
argu1.add_argument('-i', dest = 'MyISP', choices = ['ALL', 'KT', 'LG', 'SK'], help = '사용하는 IPTV : ALL, KT, LG, SK', default = MyISP) argu1.add_argument('-i', dest = 'MyISP', choices = ['ALL', 'KT', 'LG', 'SK'], help = '사용하는 IPTV : ALL, KT, LG, SK', default = MyISP)