라디오 채널 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 requests
import json
import locale
import datetime
from bs4 import BeautifulSoup, SoupStrainer
import codecs
@ -14,10 +15,11 @@ import re
from xml.sax.saxutils import escape, unescape
import argparse
import pprint
reload(sys)
sys.setdefaultencoding('utf-8')
__version__ = '1.1.6'
__version__ = '1.1.7'
# Set variable
debug = False
@ -43,7 +45,6 @@ def getEpg():
except ValueError:
printError("Channel." + JSON_SYNTAX_ERROR)
sys.exit()
print('<?xml version="1.0" encoding="UTF-8"?>')
print('<!DOCTYPE tv SYSTEM "xmltv.dtd">\n')
print('<tv generator-info-name="epg2xml ' + __version__ + '">')
@ -89,6 +90,16 @@ def getEpg():
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)
print('</tv>')
# Get EPG data from epg.co.kr
@ -109,7 +120,6 @@ def GetEPGFromEPG(ChannelInfo):
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'})
@ -137,7 +147,6 @@ def GetEPGFromEPG(ChannelInfo):
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)])
for epg1, epg2 in zip(epginfo, epginfo[1:]):
programName = epg1[0] if epg1[0] else ''
subprogramName = epg1[3] if epg1[3] else ''
@ -161,7 +170,6 @@ def GetEPGFromKT(ChannelInfo):
ChannelId = ChannelInfo[0]
ChannelName = ChannelInfo[1]
ServiceId = ChannelInfo[3]
url = 'http://tv.olleh.com/renewal_sub/liveTv/pop_schedule_week.asp'
for k in range(period):
day = today + datetime.timedelta(days=k)
@ -213,7 +221,6 @@ def GetEPGFromLG(ChannelInfo):
ChannelId = ChannelInfo[0]
ChannelName = ChannelInfo[1]
ServiceId = ChannelInfo[3]
url = 'http://www.uplus.co.kr/css/chgi/chgi/RetrieveTvSchedule.hpi'
for k in range(period):
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())
cell[1].find('span', {'class': 'tagGroup'}).decompose()
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:]):
programName = ''
subprogramName = ''
@ -298,14 +304,9 @@ def GetEPGFromSK(ChannelInfo):
startTime = startTime.strftime('%Y%m%d%H%M%S')
endTime = datetime.datetime.fromtimestamp(int(program['endTime'])/1000)
endTime = endTime.strftime('%Y%m%d%H%M%S')
if addverbose=='y' :
desc = program['synopsis'] if program['synopsis'] else ''
actors = program['actorName'].replace('...','').strip(', ') if program['actorName'] else ''
producers = program['directorName'].replace('...','').strip(', ') if program['directorName'] else ''
else:
desc = ''
actors = ''
producers = ''
desc = program['synopsis'] if program['synopsis'] else ''
actors = program['actorName'].replace('...','').strip(', ') if program['actorName'] else ''
producers = program['directorName'].replace('...','').strip(', ') if program['directorName'] else ''
if not (program['mainGenreName'] is None) :
category = program['mainGenreName']
else:
@ -345,21 +346,16 @@ def GetEPGFromSKY(ChannelInfo):
subprogramName = unescape(program['program_subname']).replace('lt;','<').replace('gt;','>').replace('amp;','&') if program['program_subname'] else ''
startTime = program['starttime']
endTime = program['endtime']
if addverbose == 'y':
actors = program['cast'].replace('...','').strip(', ') if program['cast'] else ''
producers = program['dirt'].replace('...','').strip(', ') if program['dirt'] 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 ''
desc = description if description else ''
if summary : desc = desc + '\n' + summary
else:
desc = ''
actors = ''
producers = ''
actors = program['cast'].replace('...','').strip(', ') if program['cast'] else ''
producers = program['dirt'].replace('...','').strip(', ') if program['dirt'] 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 ''
desc = description if description else ''
if summary : desc = desc + '\n' + summary
category = program['program_category1']
episode = program['episode_id'] if program['episode_id'] else ''
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
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)
@ -381,9 +377,7 @@ def GetEPGFromNaver(ChannelInfo):
for k in range(period):
day = today + datetime.timedelta(days=k)
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'}
try:
response = requests.get(url, params=params, headers=ua)
response.raise_for_status()
@ -394,7 +388,6 @@ def GetEPGFromNaver(ChannelInfo):
for j in range(0,24):
for program in data['schedules'][j][i]:
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 = ''
@ -419,6 +412,159 @@ def GetEPGFromNaver(ChannelInfo):
if(debug): printError(ChannelName + HTTP_ERROR)
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
def writeProgram(programdata):
ChannelId = programdata['channelId']
@ -463,10 +609,10 @@ def writeProgram(programdata):
print(' <credits>')
if actors:
for actor in actors.split(','):
if actor: print(' <actor>%s</actor>' % (actor))
if actor.strip(): print(' <actor>%s</actor>' % (actor.strip()))
if producers:
for producer in producers.split(','):
if producer: print(' <producer>%s</producer>' % (producer))
if producer.strip(): print(' <producer>%s</producer>' % (producer).strip())
print(' </credits>')
if category: print(' <category lang="kr">%s</category>' % (category))
@ -508,7 +654,6 @@ except ValueError:
printError("epg2xml." + JSON_SYNTAX_ERROR)
sys.exit()
parser = argparse.ArgumentParser(description = 'EPG 정보를 출력하는 방법을 선택한다')
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)