2015년 10월 29일 목요일

[KODI] Daum 티비쇼 애드온으로 최신 프로그램 정보 가져오기


2016.07.20
원작자께서 Daum 스크래퍼 업데이트 시켰습니다.
아래 내용 진행 할 필요 없이  링크에서 다운로드 받으시면 편리하게 이용할 수 있습니다.
-------------------------------------------------
Daum에서 제공 하는 한국 방송 정보의 포맷 변경 이후 애드온 제작자가 에피소드 정보는 정상화 시켰지만,
새로 시작하는 드라마나 예능의 경우 포스터 누락 및 아무 정보가 없는 경우가 많습니다.

이는, 다음에서 예전 처럼 JSON 형식으로 데이터가 올라오는 방송이 있는 반면 아무정보도 안 올라오는 방송이 있기 때문에 발생하는 문제로 보이네요.

간단히 DAUM의 HTML 페이지에서 필요한 정보만 골라 낸 후 이전에 사용하던 JSON 형식으로 만드는 방법을 사용 했습니다. 아래 PHP 코드를 작성 후 본인의 웹서버에 올려 둡니다.
<?
$t=$_GET['tvprogramid'];
$address=file_get_contents("http://movie.daum.net/tv/detail/main.do?tvProgramId=".$t);
preg_match_all('/<meta property="og:description" content="(.+?)">.+<strong class="title_kor" >(.+?)<\/strong> <em class="sub fs12">\((\d+)\).+?<p class="poster">
<a href="http:\/\/movie\.daum\.net\/tv\/detail\/photo\/list\.do\?tvProgramId=(\d+)".+?<img src="(.+?)" width="198".+<span class="baseinfo">.+?<strong>(.+?)<\/strong>.+?(\d\d\d\d)-(\d\d)-(\d\d).+<span class="fs11 fc3">\((\d+)? ??.+?<\/span><\/span><em>(\d\.\d)/is',$address,$data);
echo "
{
 \"data\":{
  \"tvProgramId\":".$data[4][0].",
  \"titleKo\":\"".$data[2][0]."\",
  \"titleEn\":null,
  \"titleOrigin\":null,
  \"aka\":null,
  \"prodYear\":".$data[3][0].",
  \"introduce\":\"".$data[1][0]."\",
  \"startDate\":".$data[7][0].$data[8][0].$data[9][0].",
  \"photo\":{
   \"filename\":null,\"fullname\":\"".$data[5][0]."\"
  },
  \"tvProgramPoint\":{
   \"pointAvg\":".$data[11][0].",
   \"pointCnt\":".$data[10][0].",
   \"channel\":{\"channelId\":null,\"titleKo\":\"".$data[6][0]."\"},
   \"countries\":[{\"countryCode\":null,\"countryKo\":\"한국\"}]
  }
}";
?>

KODI가 설치된 곳을 찾아 가면 addons 폴더 아래 metadata.tv.daum.net폴더의 daum_tv.xml을 열어 아래 주소를 모두 찾은 후 위에서 저장한 파일의 경로로 변경 해 줍니다.

http://m.movie.daum.net/data/movie/tv/detail.json?tvProgramId 

(운영체제별 KODI경로는 다음 링크를 참고 합니다. : http://kodi.wiki/view/Userdata)

아래 코드에서 해당 주소를 변경 하시면 되겠습니다. 총 4곳입니다.

 
<nfourl dest="3">
  <regexp input="$$1" output="<details><url cache="daum-tv-\1.json">http://m.movie.daum.net/data/movie/tv/detail.json?tvProgramId=\1</url><id>\1</id></details>" dest="3">
   <expression>movie\.daum\.net[^\?]*\?tvProgramId=(\d+)</expression>
  </RegExp>
 </NfoUrl>
<getsearchresults dest="1">
  <regexp input="$$4" output="<?xml version="1.0" encoding="UTF-8" standalone="yes"?><results>\1</results>" dest="1">
   <regexp input="$$1" output="<entity><title>\2</title><year>\3</year><id>\1</id><url cache="daum-tv-\1.json">http://m.movie.daum.net/data/movie/tv/detail.json?tvProgramId=\1</url></entity>" dest="4">
    <expression repeat="yes" trim="2,4">class="fl srch"><a href="http://movie.daum.net/tv/detail/main.do\?tvProgramId=(\d+)"[^>]*>([^"]*)</a>\s*\((\d*)\)</span>[^\(]*"fs13">([^"]*)</span</expression>
   </RegExp>
   <regexp input="$$1" output="<entity><title>\2</title><id>\1</id><url cache="daum-tv-\1.json">http://m.movie.daum.net/data/movie/tv/detail.json?tvProgramId=\1</url></entity>" dest="4+">
    <expression repeat="yes" trim="2,4">class="fl srch"><a href="http://movie.daum.net/tv/detail/main.do\?tvProgramId=(\d+)"[^>]*>([^"]*)</a>\s*</span>[^\(]*"fs13">([^"]*)</span</expression>
   </RegExp>
   <expression noclean="1"/>
  </RegExp>
 </GetSearchResults>

  <regexp input="$$5" output="<episodeguide>\1</episodeguide>" dest="4">
   <regexp input="$$1" output="<url function="GetEpisodeListById" cache="daum-tv-\1.json">http://m.movie.daum.net/data/movie/tv/detail.json?tvProgramId=\1</url>" dest="5">
    <expression />
   </RegExp>
   <expression noclean="1" />
  </RegExp>
 </GetEpisodeListByIdChain>


예를 들어 코드를 저장한 파일이 daum_tv_info.php라고 한다면

http://m.movie.daum.net/data/movie/tv/detail.json?tvProgramId=\1 주소들을

http://웹서버주소/daum_tv_info.php?tvprogramid=\1 으로 변경하시면 하시면 되겠습니다.

이후, KODI에서 기존 저장 된 방송을 새로고침 해 주시면 포스터와 방송 정보가 올바르게 나오게 됩니다.


댓글 2개:

  1. 아래와 같이 data의 배열이 null이네요.. 머가 문제인거죠?
    { "data":{ "tvProgramId":, "titleKo":"", "titleEn":null, "titleOrigin":null, "aka":null, "prodYear":, "introduce":"", "startDate":, "photo":{ "filename":null,"fullname":"" }, "tvProgramPoint":{ "pointAvg":, "pointCnt":, "channel":{"channelId":null,"titleKo":""}, "countries":[{"countryCode":null,"countryKo":"한국"}] } }

    답글삭제
    답글
    1. 데이터를 못 가져오네요.
      대부분 가져오는 링크의 대소문자 문제 가능성이 커요. 전체 링크의
      tvprogramid tvProgramId 등의 대소문자를 주의해서 다시 해 보세요.

      삭제