2015년 7월 19일 일요일

[KODI] 회차 번호 없는 영상 파일 자동으로 KODI에 등록하는 방법

[Notice] 2015-07-21 : 다음티비쇼정보 변경 사항 반영 코드 업데이트

영상파일에 따라 파일명에 회차정보가 없는 경우가 있습니다.
티비카드의 EPG정보로 영상을 녹화 하거나 기타의 방법으로 영상파일을 구했을 때 E00 이런게 있어야 하는데 없는 경우가 있습니다.
특히나 tvheadend 등의 녹화 프로그램을 써서 영상을 만들 때 에피소드번호가 안들어갑니다.

위와 같이 에피소드번호는 없고 방영일만 있을 경우 KODI에 등록 되지 않습니다.
파일명 바꿔서 E00 이런걸 넣어주면 되긴 합니다만.. 귀찮죠?..
자동으로 파일명에 E00 이런거 없으면 '다음 티비쇼 정보'에서 방영일 기준으로 회차번호 따와서 파일명 바꿔 주는 스크립트 하나 만들었습니다.

아래처럼 파일 하나 만들어서 쓰심 되겠습니다. 요거 하기전에..php가 실행 될 수 있는 환경을 만들어 줍니다.

/etc/php/conf.d/usersettings.ini 파일을 열어서 동영상 파일이 있는 곳을 추가 해 줍니다.
display_errors = On
open_basedir = /etc.defaults:/etc:/usr/syno/synoman:/var/services/tmp:/var/services/web:/var/services/homes:/volume3/video/
apc.enabled = 1
opcache.enable = 1
opcache.enable_cli = 1
세번째 줄에 해당 경로를 추가 하시면 됩니다. 이러면 영상 폴더들에 php 스크립트가 실행 될 수 있게 됩니다.

아래와 같은 php 파일을 작성 합니다.

<?
$programno="11111"; //Daum Movie의 프로그램 ID e.g: http://m.movie.daum.net/m/tv/episode?tvProgramId=11111
$dir="/volume1/video/재미있는티비 //변환 대상 폴더  
$extension="mp4"; // 파일 확장자 지정
$pagesize="50"; // 최근 기준 몇 개의 에피소드를 가져올 것인가?
$split="."; // "."으로 정보가 구분 된 파일을 대상으로 함. "-","_" 등으로 구분 될 경우 바꿔 줄 것. 
$epi="E"; //회차번호(에피소드번호)가 E00, E01 등으로 시작 할 경우. ep01, S01E01일 경우는 각각 "ep","S01E"등으로 넣어야 함.
$filelist=scandir($dir);

//Daum Movie에서 제공하는 Html에서 JSON 추출 및 가공
$t=$programno;
$address="http://m.movie.daum.net/m/tv/episode?tvProgramId=".$t;
$data=strstr(file_get_contents($address),"\"episodeId\"");
$data2=strstr($data,"}]",true);
$data3=str_replace("\"title\" : \"","\"episodeTitle\":\"",$data2);
$data3=str_replace("\"introduceDescription\" : \"","\"episodeIntroduce\":\"",$data3);
$data3=str_replace("\"broadcastDate\" : \"","\"telecastDate\":\"",$data3);
$data3=str_replace("\"episodeId\" : \"","\"episodeId\":",$data3);
$data3=str_replace("\",
  \"name\" : \"",",\"episodeSeq\":",$data3);
$data3=str_replace("\",
  \"sequence\" :",",\"name\":",$data3);
$data3=str_replace("[ ]","\"\"",$data3);  
$data3=str_replace("[ {","\"\",",$data3);
$data3=str_replace("} ],",",",$data3);
$data3=str_replace("}, {
  \"episodeId\"","},{\"episodeId\"",$data3);
$data3=str_replace("}, {",",",$data3);
$data3=str_replace("http:","http",$data3);
$array=explode("},{",$data3);
for($i=0;$i<count($array);$i++){
 $data4[$i]=explode(",",$array[$i]);
 for($j=0;$j<count($data4[$i]);$j++){
  $data4[$i][$j]=explode(":",$data4[$i][$j]);
  if($data4[$i][$j][0]=="
    \"telecastDate\""){$teleEpiData[$i][0]=substr($data4[$i][$j][1],1,-1);}
    if($data4[$i][$j][0]=="\"episodeSeq\""){$teleEpiData[$i][1]=$data4[$i][$j][1];}
 }
 //$data4[$i][20][0]="telecastDate";
 //$data4[$i][20][1]=substr($data4[$i][20][1],1,-1);
 //print $data[$i][20][1]."\n";
}
// 변환 대상 폴더에서 회차정보(에피소드정보)가 빠진 파일 찾기
for($i=0;$i<count($filelist);$i++){
 $strstr=strstr($filelist[$i],$split); 
 if($strstr[1] != $epi){
  if(substr($strstr,-3)==$extension){ //지정된 파일 확자장일 경우만 변환
   $airdate="20".substr($strstr,1,6); //방영일자 추출
   //print $airdate."\n";
   for($j=0;$j<count($teleEpiData);$j++){//Daum Movie JSON데이터와 비교해서 같은 방영일자의 회차번호를 추출
    if($teleEpiData[$j][0] == $airdate){
     $epino=$teleEpiData[$j][1];
    }
   }
   $fixtitle[$i]=strstr($filelist[$i],".",true).".".$epi.$epino.$strstr; //기존 파일명에 회차번호(에피소드번호) 삽입
   /////print $fixtitle[$i];
   $result=rename($dir.$filelist[$i], $dir.$fixtitle[$i]); // 파일명 변경
   /////log_e($filelist[$i],$fixtitle[$i],$result);
  }
 }
}

?>

3~8번 줄에 필요 정보를 입력합니다. 주석이랑 대충 보시면 뭔지 아실 듯 합니다. 그리고 이 파일을 시놀로지 스캐줄러나 우분투/데비안 등 리눅스 계열에서는 cron으로 스캐줄을 걸어 주시면 알아서 파일이름을 바꿔 줍니다. 바꿔야 할 파일이 있다면 1분 마다 돌려도 되고 10분,1시간,하루 등등 원하시는데로 돌리시면 됩니다. 간단한 스크립트라서 시스템에 부하는 없을 듯 합니다.







댓글 4개:

  1. 무한도전.2015.08.01 변환 하면
    무한도전.E.2015.08.01 로 변환이 됨니다 ㅠ 머가 잘못 된거지;;

    답글삭제
    답글
    1. 방영날짜가 20150801 같은 형식이어야 하는데 2015.08.01이라서 그렇습니다.

      50번 줄을 아래 코드로 바꿔서 해 보세요.

      $airdate=preg_replace('/(.*).(\d{4})\.(\d{2})\.(\d{2}).(.*)/i', '\2\3\4', $strstr);

      삭제
  2. 좋은 글 감사드립니다!
    한가지 질문 드리고 싶은데 160202 식으로 날짜가 된 파일은 어떤 부분을 고치면 되겠습니까?^^;;

    답글삭제