diff --git a/Channel.json b/Channel.json index 30df99a..0a9c8de 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":"NAVR","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":"","SKCh":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,"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": 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 diff --git a/README.md b/README.md index 498e37d..26d06d4 100644 --- a/README.md +++ b/README.md @@ -1,29 +1,29 @@ # 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 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 : 제목에 회차정보 출력
@@ -34,15 +34,17 @@ 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으로 변경하면 오류 발생을 차단할 수 있다. +1.2.3 버전부터 Enabled 항목은 없어질 예정이다. ## 옵션 소개 ### epg2xml.py, epg2xml.php 옵션 -실행시 사용가능한 인수는 --help 명령어로 확인이 가능하다 -epg2xml.json의 설정을 옵션의 인수를 이용하여 변경할 수 있다. +실행시 사용가능한 인수는 --help 명령어로 확인이 가능하다. +epg2xml.json의 설정을 옵션의 인수를 이용하여 변경할 수 있다.
 -h --help : 도움말 출력
 --version : 버전을 보여준다.
@@ -58,15 +60,16 @@ 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에 있는 것으로 가정했다. +이 경우 epg2xml.json의 output을 d로 해야 한다. #### PYTHON의 경우
 /usr/bin/python /home/hts/epg2xml.py 또는
@@ -81,8 +84,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,8 +103,11 @@ http://domain/epg2xml.php?i=ALL&l=2 /home/hts/epg2xml.php
+#### PHP WEB의 경우 +php web 버전은 xmltv.sock을 지원하지 않는다. + ## 라이센스 -BSD +BSD 3-clause "New" or "Revised" License ## WIKI https://github.com/wonipapa/epg2xml/wiki @@ -110,7 +116,12 @@ https://github.com/wonipapa/epg2xml/wiki https://github.com/wonipapa/epg2xml/wiki/FAQ ## 변경사항 - ### Version 1.2.1 +### Version 1.2.2 + - My Channel 추가 + - 소스 추가 + - 에피소드 넘버 xmltv_ns 추가 + - PHP 공용함수 분리 +### Version 1.2.1 - SKB 함수 추가 - 가져오는 날짜 최대 2일로 변경 - 타이틀이 1부, 2부 등 을 포함할 때 1부, 2부를 서브타이틀로 이동 @@ -119,26 +130,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 +157,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 +211,9 @@ 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 - - first release - - KBS 함수 추가 - - Channel.json 소스 변경 - - 스카이라이프 url 변경 - - EPG 누락 데이터 수정 - +### Version 1.0.0 + - first release \ No newline at end of file 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)); +} +?> diff --git a/epg2xml-web.php b/epg2xml-web.php index 7e4e514..aaef3bf 100644 --- a/epg2xml-web.php +++ b/epg2xml-web.php @@ -1,10 +1,13 @@ 2 ? 2 : $period; - else : + else : printError("default_fetch_limit는 1, 2, 3, 4, 5, 6, 7만 가능합니다."); exit; endif; @@ -276,1141 +280,4 @@ elseif($output == "socket") : exit; endif; endif; - -function getEPG() { - $fp = $GLOBALS['fp']; - $MyISP = $GLOBALS['MyISP']; - $Channelfile = __DIR__."/Channel.json"; - $IconUrl = ""; - $ChannelInfos = array(); - - try { - $f = @file_get_contents($Channelfile); - if($f === False) : - printError("Channel.".JSON_FILE_ERROR); - exit; - else : - try { - $Channeldatas = 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; - } - 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) : - $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 == 'TBROAD') : - GetEPGFromTbroad($ChannelInfo); - elseif($ChannelSource == 'ISCS') : - GetEPGFromIscs($ChannelInfo); - elseif($ChannelSource == 'MBC') : - GetEPGFromMbc($ChannelInfo); - elseif($ChannelSource == 'MIL'): - GetEPGFromMil($ChannelInfo); - elseif($ChannelSource == 'IFM'): - GetEPGFromIfm($ChannelInfo); - elseif($ChannelSource == 'KBS'): - GetEPGFromKbs($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://www.epg.co.kr/epg-cgi/extern/cnm_guide_type_v070530.cgi"; - $day = date("Ymd", strtotime("+".($k - 1)." days")); - $params = array( - 'beforegroup' => '100', - 'checkchannel' => $ServiceId, - 'select_group' => '100', - 'start_date' => $day - ); - $params = http_build_query($params); - $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); - $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) : - $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]; - endif; - endif; - //programName, startTime, rating, subprogramName, rebroadcast, episode - $epginfo[] = array($programName, $startTime, $rating, $subprogramName, $rebroadcast, $episode ); - endforeach; - endfor; - 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; -} - -// 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); - $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; - 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; -} - -// 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; - $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; - 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; -} - -// 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) : - $programName = ""; - $subprogramName = ""; - $episode = ""; - $rebroadcast = False; - preg_match('/^(.*?)(?:\s*[\(<]([\d,회]+)[\)>])?(?:\s*<([^<]*?)>)?(\((재)\))?$/', 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); - 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://www.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' - ); - $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); - $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; - 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 -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) : - $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($summary) : - $desc = $desc."\n".$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); - 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) : - //programName, startTime, episode, rebroadcast, rating - $startTime = date("YmdHis", strtotime($data['displayDates'][$i]['date']." ".$program['startTime'])); - $epginfo[] = array($program['title'], $startTime, str_replace("회","", $program['episode']), $program['isRerun'], $program['grade']); - 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()); - } - endif; - } 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'; -} - -// Get EPG data from Iscs -function GetEPGFromIscs($ChannelInfo) { - $url='http://service.iscs.co.kr/sub/channel_view.asp'; - $params = array( - 'chan_idx'=>'242', - 'source_id'=>'203', - 'Chan_Date'=>'2017-04-18' - ); -} - -// 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))]) : - $programName = ""; - $rebroadcast = False; - preg_match('/^(.*?)(\(재\))?$/', htmlspecialchars_decode($program['ProgramTitle']), $matches); - if ($matches != NULL) : - $programName = $matches[1]; - $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, - '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()); - } - 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) : - $programName = ""; - $rebroadcast = False; - preg_match('/^(.*?)(\(재\))?$/', htmlspecialchars_decode($program['program_title']), $matches); - if ($matches != NULL) : - $programName = $matches[1]; - $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, - '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()); - } - 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) : - $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, - '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()); - } - 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) : - $cells = $row->getElementsByTagName('span'); - $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); - endforeach; - endif; - } catch(Exception $e) { - if($GLOBALS['debug']) printError($e->getMessage()); - } - 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 = ""; - $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; - $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']; - $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 = htmlspecialchars($programdata['programName'], ENT_XML1); - if($subprogramName) $desc = $desc."\n부제 : ".$subprogramName; - if($episode) $desc = $desc."\n회차 : ".$episode."회"; - if($category) $desc = $desc."\n장르 : ".$category; - if($actors) $desc = $desc."\n출연 : ".$actors; - if($producers) $desc = $desc."\n제작 : ".$producers; - $desc = $desc."\n등급 : ".$rating; - else: - $desc = ""; - endif; - if($programdata['desc']) $desc = $desc."\n".htmlspecialchars($programdata['desc'], ENT_XML1); - $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); - 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, 3); - 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"); -} ?> diff --git a/epg2xml.json b/epg2xml.json index 0f94945..e7e7460 100644 --- a/epg2xml.json +++ b/epg2xml.json @@ -2,24 +2,27 @@ "###_COMMENT_###" : "", "###_COMMENT_###" : "epg 정보를 가져오는 설정 파일", "###_COMMENT_###" : "사용하는 ISP 선택 (ALL, KT, LG, SK)", - "MyISP": "KT", + "MyISP": "ALL", + "###_COMMENT_###" : "### # My Channel EPG 정보 가져오는 채널 ID ###", + "###_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) ###", "default_icon_url": "", "###_COMMENT_###" : "### 제목에 재방송 정보 출력 ###", "default_rebroadcast": "y", - "###_COMMENT_###" : "#### 제목에 회차정보 출력 ###", - "default_episode" : "n", + "###_COMMENT_###" : "#### 제목에 회차정보 출력 ###", + "default_episode" : "y", "###_COMMENT_###" : "### EPG 정보 추가 출력 ###", - "default_verbose" : "n", + "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_###" : "" diff --git a/epg2xml.php b/epg2xml.php index 1c29e44..e6edadb 100644 --- a/epg2xml.php +++ b/epg2xml.php @@ -1,11 +1,13 @@ #!/usr/bin/env php 2 ? 2 : $period; - else : printError("default_fetch_limit는 1, 2, 3, 4, 5, 6, 7만 가능합니다."); exit; @@ -297,1147 +298,4 @@ elseif($output == "socket") : exit; endif; endif; - -function getEPG() { - $fp = $GLOBALS['fp']; - $MyISP = $GLOBALS['MyISP']; - $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 { - $Channeldatas = 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; - } - fprintf($fp, "\n"); - fprintf($fp, "\n\n"); - fprintf($fp, "\n", VERSION); - - foreach ($Channeldatas as $Channeldata) : #Get Channel & Print Channel info - if($Channeldata['Enabled'] == 1) : - $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 == 'TBROAD') : - GetEPGFromTbroad($ChannelInfo); - elseif($ChannelSource == 'ISCS') : - GetEPGFromIscs($ChannelInfo); - elseif($ChannelSource == 'MBC') : - GetEPGFromMbc($ChannelInfo); - elseif($ChannelSource == 'MIL'): - GetEPGFromMil($ChannelInfo); - elseif($ChannelSource == 'IFM'): - GetEPGFromIfm($ChannelInfo); - elseif($ChannelSource == 'KBS'): - GetEPGFromKbs($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://www.epg.co.kr/epg-cgi/extern/cnm_guide_type_v070530.cgi"; - $day = date("Ymd", strtotime("+".($k - 1)." days")); - $params = array( - 'beforegroup' => '100', - 'checkchannel' => $ServiceId, - 'select_group' => '100', - 'start_date' => $day - ); - $params = http_build_query($params); - $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); - $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) : - $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]; - endif; - endif; - //programName, startTime, rating, subprogramName, rebroadcast, episode - $epginfo[] = array($programName, $startTime, $rating, $subprogramName, $rebroadcast, $episode ); - endforeach; - endfor; - 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; -} - -// 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); - $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; - 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; -} - -// 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; - $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; - 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; -} - -// 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) : - $programName = ""; - $subprogramName = ""; - $episode = ""; - $rebroadcast = False; - $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); - 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://www.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' - ); - $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); - $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; - 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 -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) : - $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($summary) : - $desc = $desc."\n".$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); - 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) : - //programName, startTime, episode, rebroadcast, rating - $startTime = date("YmdHis", strtotime($data['displayDates'][$i]['date']." ".$program['startTime'])); - $epginfo[] = array($program['title'], $startTime, str_replace("회","", $program['episode']), $program['isRerun'], $program['grade']); - 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()); - } - endif; - } 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'; -} - -// Get EPG data from Iscs -function GetEPGFromIscs($ChannelInfo) { - $url='http://service.iscs.co.kr/sub/channel_view.asp'; - $params = array( - 'chan_idx'=>'242', - 'source_id'=>'203', - 'Chan_Date'=>'2017-04-18' - ); -} - -// 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))]) : - $programName = ""; - $rebroadcast = False; - $pattern = '/^(.*?)(\(재\))?$/'; - preg_match($pattern, htmlspecialchars_decode($program['ProgramTitle']), $matches); - if ($matches != NULL) : - $programName = $matches[1]; - $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, - '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()); - } - 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) : - $programName = ""; - $rebroadcast = False; - $pattern = '/^(.*?)(\(재\))?$/'; - preg_match($pattern, htmlspecialchars_decode($program['program_title']), $matches); - if ($matches != NULL) : - $programName = $matches[1]; - $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, - '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()); - } - 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) : - $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, - '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()); - } - 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) : - $cells = $row->getElementsByTagName('span'); - $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); - endforeach; - endif; - } catch(Exception $e) { - if($GLOBALS['debug']) printError($e->getMessage()); - } - 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 = ""; - $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; - $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']; - $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 = htmlspecialchars($programdata['programName'], ENT_XML1); - if($subprogramName) $desc = $desc."\n부제 : ".$subprogramName; - if($episode) $desc = $desc."\n회차 : ".$episode."회"; - if($category) $desc = $desc."\n장르 : ".$category; - if($actors) $desc = $desc."\n출연 : ".$actors; - if($producers) $desc = $desc."\n제작 : ".$producers; - $desc = $desc."\n등급 : ".$rating; - else: - $desc = ""; - endif; - if($programdata['desc']) $desc = $desc."\n".htmlspecialchars($programdata['desc'], ENT_XML1); - $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); - 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, 3); - 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"); -} ?> - diff --git a/epg2xml.py b/epg2xml.py index a64f377..ba0f109 100644 --- a/epg2xml.py +++ b/epg2xml.py @@ -1,9 +1,7 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- - from __future__ import print_function import imp - import os import sys import json @@ -15,6 +13,9 @@ import re from xml.sax.saxutils import escape, unescape import argparse import pprint +from functools import partial +import time + try: imp.find_module('bs4') from bs4 import BeautifulSoup, SoupStrainer @@ -23,6 +24,7 @@ except ImportError: sys.exit() try: imp.find_module('lxml') + from lxml import html except ImportError: print("Error : ", "lxml 모듈이 설치되지 않았습니다.", file=sys.stderr) sys.exit() @@ -32,10 +34,11 @@ try: except ImportError: print("Error : ", "requests 모듈이 설치되지 않았습니다.", file=sys.stderr) sys.exit() + 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) @@ -45,7 +48,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 +62,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 +72,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 +108,7 @@ def getEpg(): else : print(' ' % (ChannelIconUrl)) print(' ') + # Print Program Information for ChannelInfo in ChannelInfos: ChannelId = ChannelInfo[0] @@ -121,10 +130,12 @@ def getEpg(): GetEPGFromSKY(ChannelInfo) elif ChannelSource == 'NAVER': GetEPGFromNaver(ChannelInfo) - elif ChannelSource == 'TBROAD': - GetEPGFromTbroad(ChannelInfo) elif ChannelSource == 'ISCS': GetEPGFromIscs(ChannelInfo) + elif ChannelSource == 'HCN': + GetEPGFromHcn(ChannelInfo) + elif ChannelSource == 'POOQ': + GetEPGFromPooq(ChannelInfo) elif ChannelSource == 'MBC': GetEPGFromMbc(ChannelInfo) elif ChannelSource == 'MIL': @@ -133,6 +144,8 @@ def getEpg(): GetEPGFromIfm(ChannelInfo) elif ChannelSource == 'KBS': GetEPGFromKbs(ChannelInfo) + elif ChannelSource == 'ARIRANG': + GetEPGFromArirang(ChannelInfo) print('') # Get EPG data from epg.co.kr @@ -140,71 +153,72 @@ 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' 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')} + 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') + pattern = '(.*)<\/td>' + 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') - 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'): - 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 = 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)]) + 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'): + 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 + 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 '' + 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]) + 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 - 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): ChannelId = ChannelInfo[0] ChannelName = ChannelInfo[1] ServiceId = ChannelInfo[3] - url = 'http://tv.olleh.com/renewal_sub/liveTv/pop_schedule_week.asp' epginfo = [] + 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,44 +233,38 @@ 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 = 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') + 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]) + 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 - 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) + epgzip(epginfo) # Get EPG data from LG def GetEPGFromLG(ChannelInfo): ChannelId = ChannelInfo[0] ChannelName = ChannelInfo[1] ServiceId = ChannelInfo[3] - url = 'http://www.uplus.co.kr/css/chgi/chgi/RetrieveTvSchedule.hpi' epginfo = [] + 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,45 +273,39 @@ 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 '' 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') 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?(?:\[.*?\])?(.*?)(?:\[(.*)\])?\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(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]) + 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 - 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) + epgzip(epginfo) # Get EPG data from SK def GetEPGFromSK(ChannelInfo): @@ -325,12 +327,12 @@ def GetEPGFromSK(ChannelInfo): else : programs = data['channel']['programs'] for program in programs: - programName = '' - subprogramName = '' - episode = '' + 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 '' @@ -346,11 +348,10 @@ 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) + time.sleep(0.001) except ValueError: if(debug): printError(ChannelName + CONTENT_ERROR) else: pass @@ -363,59 +364,59 @@ 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' 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')}) + 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('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 - #programName, startTime, rating, subprogramName, rebroadcast, episode - epginfo.append([programName, startTime, rating, subprogramName, rebroadcast, episode]) + startTime = endTime = programName = subprogramName = desc = actors = producers = category = episode = '' + 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') + cell = row.find('span', {'class':'title'}).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()) + #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) 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) + else: pass + epgzip(epginfo) # Get EPG data from SKY def GetEPGFromSKY(ChannelInfo): @@ -438,6 +439,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'] @@ -447,7 +451,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) @@ -455,6 +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.001) except ValueError: if(debug): printError(ChannelName + CONTENT_ERROR) else: pass @@ -483,41 +491,166 @@ def GetEPGFromNaver(ChannelInfo): for i, date in enumerate(data['displayDates']): 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 = '' - 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) + 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') + 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]) + 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 + epgzip(epginfo) -# Get EPG data from Tbroad -def GetEPGFromTbroad(ChannelInfo): - url='https://www.tbroad.com/chplan/selectRealTimeListForNormal.tb' - 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='http://m.iscs.co.kr/sub/02/data.asp' + for k in range(period): + day = today + datetime.timedelta(days=k) + 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') + 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) + ' ' + program['Time'] + startTime = datetime.datetime.strptime(startTime, '%Y-%m-%d %H:%M') + startTime = startTime.strftime('%Y%m%d%H%M%S') + 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.001) + 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): + ChannelId = ChannelInfo[0] + ChannelName = ChannelInfo[1] + ServiceId = ChannelInfo[3] + epginfo = [] + 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 = html_data + strainer = SoupStrainer('li') + soup = BeautifulSoup(data, 'lxml', parse_only=strainer, from_encoding='utf-8') + 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 + epgzip(epginfo) + +# Get EPG data from POOQ +def GetEPGFromPooq(ChannelInfo): + ChannelId = ChannelInfo[0] + ChannelName = ChannelInfo[1] + ServiceId = ChannelInfo[3] + 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: + 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: + 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') + 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') + programName = program['programTitle'].replace("\r\n", "").encode('utf-8'); + pattern = '^(.*?)(?:([\d,]+)회)?(?:\((재)\))?$' + matches = re.match(pattern, programName) + if not(matches is None) : + 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 '' + 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.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 # Get EPG data from MBC def GetEPGFromMbc(ChannelInfo): @@ -530,34 +663,30 @@ 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: 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()]: - 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) + time.sleep(0.001) except ValueError: if(debug): printError(ChannelName + CONTENT_ERROR) else: pass @@ -581,8 +710,9 @@ def GetEPGFromMil(ChannelInfo): try: data = json.loads(json_data, encoding='utf-8') for program in data['resultList']: - programName = '' + 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): @@ -601,14 +731,11 @@ 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) + time.sleep(0.001) except ValueError: if(debug): printError(ChannelName + CONTENT_ERROR) else: pass @@ -633,8 +760,10 @@ 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']) - 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') @@ -647,15 +776,11 @@ 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) + time.sleep(0.001) except ValueError: if(debug): printError(ChannelName + CONTENT_ERROR) else: pass @@ -668,9 +793,9 @@ def GetEPGFromKbs(ChannelInfo): ChannelId = ChannelInfo[0] ChannelName = ChannelInfo[1] ServiceId = ChannelInfo[3] + epginfo = [] 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: @@ -681,37 +806,101 @@ 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 = '' + 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): 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]) + 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 + epgzip(epginfo) + +# 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 + 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) + 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 + +# 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 + programdata = {} + 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) @@ -722,19 +911,25 @@ 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)); + programName = escape(matches.group(1)).strip(); subprogramName = escape(matches.group(2)) + ' ' + subprogramName subprogramName = subprogramName.strip() if programName is None: programName = subprogramName - actors = escape(programdata['actors']) producers = escape(programdata['producers']) category = escape(programdata['category']) episode = programdata['episode'] + 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) + '회)' if rebroadcast == True and addrebroadcast == 'y' : programName = programName + ' (재)' @@ -743,20 +938,22 @@ 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) + '회' 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 ='' if programdata['desc'] : desc = desc + '\n' + escape(programdata['desc']) + desc = re.sub(' +',' ', 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)) @@ -773,12 +970,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)) @@ -791,12 +987,29 @@ def printLog(*args): def printError(*args): print("Error : ", *args, file=sys.stderr) +def replacement(match, tag): + if not(match is None): + tag = tag.strip() + programName = unescape(match.group(1)).replace('<','<').replace('>','>').strip() + programName = '<'+ tag + ' class="title">' + programName + '' + return programName + 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: 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' @@ -805,7 +1018,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() @@ -929,5 +1141,4 @@ elif output == "socket" : else : printError("epg2xml.json 파일의 default_xml_socket항목이 없습니다."); sys.exit() -getEpg() - +getEpg() \ No newline at end of file diff --git a/채널정보.xlsx b/채널정보.xlsx index dc68b49..d1169d6 100644 Binary files a/채널정보.xlsx and b/채널정보.xlsx differ