2015년 7월 19일 일요일

[KODI] 시놀로지 나스 사용 시 썸네일 빠르게 띄우기

mysql이나 mariaDB를 사용해서  KODI의 라이브러리를 관리할 경우 썸네일 생성이 느려서 답답한 경우가 있습니다. 영화나 외국TV 영상의 경우 영상정보 스크래핑을 TVDB 같은 곳에서 하면 썸네일 까지 제공하기 때문에 빠르지만, 한국 TV 영상의 다음무비 스크래퍼가 TV영상의 썸네일을 제공하는 경우는 거의 없기 때문에 본인이 가지고 있는 영상에서 직접 썸네일을 만들어 내야 합니다.

영상이 MYSQL에 등록 된 상태에서 각 단말이 db에서 라이브러리 정보를 땡긴 후에.. 여러가지 작업들이 진행 된 후 썸네일 생성을 시작하는 것 같습니다. 이 과정이 길다 보니 썸네일 생성까지 시간이 오래 걸리더군요.

영상이 있는 폴더에 '영상파일-thumb.png'로 썸네일 파일을 넣어 두면... 라이브러리 정보를 가져오는 동시에 썸네일이 표현 됩니다.

자동으로 썸네일 파일을 만들어 영상파일이 있는 폴더에 넣어 두는 스크립트를 하나......
만들어 보려고 했는데.. 약간의 애로 사항으로 인터넷에서 찾은 코드를 살짝 수정했습니다.

이 코드는 다운로드스테이션에서 다운로드가 완료 되면 썸네일 만들고 다운로드 목록에서 삭제 합니다.

패키지센터에서 perl을 설치하시고, 아래 코드를 실행 시키시면 됩니다.


@arguments_info = ( 
  "show this help",
  "delete mkv files after remuxing (not yet implemented)");
@arguments = (
  "-help",
  "-delete");

for ($i=0;$i<=$#ARGV;$i++) {
 $p = 0;
 for ($j=0;$j<=$#arguments;$j++) {
  if ($ARGV[$i] eq $arguments[$j]) {
   $arguments_value[$j] = 1;
  }
  else {
   $arguments_value[$j] = 0;
   $p++;
  }
 }
 # check if the argument is valid, else print the help.
 if ($p > $#arguments) {
  $arguments_value[0] = 1;
 }
}

if ($arguments_value[0]) {
 print "\nArgument list info download.pl:\n\n";
 print "Usage: ./download.pl argument1 argument2 ...\n\n";
 for ($i=0;$i<=$#arguments;$i++) {
  print "$arguments[$i] --> $arguments_info[$i]\n";
 }
 exit 1;
}

#스크립트 파일 위치 지정 
$script_path =  "/volume1/Scripts/"; 
use lib qw(/volume1/Scripts/);

#썸네일 만들 파일이 위치한 볼륨 지정
$base_path = '/volume1/';

#사용 할 FFMPEG 지정
$ffmpeg = '/volume1/@appstore/AudioStation/bin/ffmpeg'; 
$psql_path = '/usr/bin/psql';
$DB_name = 'download';

### 다운로드 완료 상태인 파일만 썸네일 생성
@result_array = split(";", read_database(5));
#$log->entry("Status 5 result @result_array");
remux_files(5);

sub remux_files {
 my @files_list = ();
 my @mkv_list = ();
 
 foreach (@result_array){
  print "$_\n";
 }

 # For each file (torrent) in the array
 for ( $i=1 ;$i < $#result_array ; $i++ ) { 
  my @temp = split ('/', $result_array[$i]); 
  my $file_name = @temp[$#temp];  
  my $download_path = $base_path . @result_array[$i]; 

  # Check if it is a file or dir
  if (-f $download_path) {
   # If it is a file, then process as is
   remux_mkv($download_path);
  }
  else {
   # Else it is a directory, search for mp4 files inside
   my @folder_contents = `find "$download_path" -type f -name \\*.mp4`;
   chomp @folder_contents;
   

   # Process them one by one
   for ($j=0 ;$j < $#result_array ; $j++){
    print "Processing file: @folder_contents[$j]\n";
    remux_mkv($folder_contents[$j]);
   }
  }
  #delete from database if delete flag is set
  if ($arguments_value[1]){
   delete_database($file_name);
  }
 }
} # end sub remux_files


sub remux_mkv {

 my $in_file = $_[0];
 
 # Get the file extension
 my $file_ext = ( split /\./, $in_file )[-1];

 # Check if it is an mkv file
 if ($file_ext eq "mkv" || $file_ext eq "mp4") {

  # Create mp4 file path
  my $out_file = (substr $in_file, 0, -4) . "-thumb.png";

  # Only run the conversion if the mp4 file doesn't already exist
  unless (-e $out_file){    

   # Run ffmpeg to convert the file (leave it in the same directory)
   if (system("/volume1/\@appstore/AudioStation/bin/ffmpeg -i '$in_file' -ss 00:00:10 -r 1 -vframes 1 -y '$out_file'") != 0) {
    #$log->entry("Failed to remux $download_path");

   }
   #Index the new MP4 file
   #if (system("synoindex -a $out_file") != 0) {
    #$log->entry("Failed to remux $download_path");

   #}
   #Delete the old mkv file if delete flag is set
   #if ($arguments_value[1]){
   # system("rm $in_file");
   # system("synoindex -d $in_file");
   #}
  }
 }
} #end remux_mkv



# Read database returns a list with full path from the torrents downloading
# depending on which state is passed. For reference, states are listed below.
# States = { 1:'WAITING', 2:'ACTIVE', 3:'PAUSED', 4:'COMPLETING', 
#  5:'COMPLETE', 6:'CHECKING', 8:'SEEDING', 101:'ERROR', 
#  107:'TIMEOUT'}
sub read_database {
 my $result = `psql -U postgres -d $DB_name -c "SELECT destination,filename FROM download_queue WHERE status='@_[0]'" -P format=unaligned -R "\;"`;
 $result =~ s/\|/\//g;
 return $result; 
}



# Delete an entry from the database. Filename must be passed. Note that if 
# there are 2 or more entries with the same filename ie from different users 
# all will be deleted. For me this is not a problem, but if you don't want 
# this to happen you will need to also keep track of the user instead of only 
# the filenames.
sub delete_database {
 my $result  = `psql -U postgres -d $DB_name -c "DELETE FROM download_queue WHERE filename = '@_[0]'" -P format=unaligned -R "\;"`;
 return $result;
}

 
# $log->entry("#################### Stopping download_handle script ###########################");
# Close the log-file - remove/comment out if you disable logging
#$log->close;


35,36번 줄은 이 코드가 위치하는 폴더로 고칩니다.
39번 줄은 변환 될 영상이 있는 위치로 고칩니다.
42번 줄은 사용할 ffmpeg이 있는 위치를 지정해야 합니다.

많이 사용하는 ffmpeg with DTS는 쓸 수 없습니다. 패키지 자체가 썸네일 생성을 못하도록 되어 있습니다. 시놀로지 패키지 중 audiostation에 있는 ffmpeg이 썸네일 생성이 가능한 버전입니다. 별도로 쓰시는게 없다면 오디오 스테이션 설치 하신 후에 해당 패키지 위치로 지정하면 되겠습니다.
47번 줄은 다운로드 스테이션의 파일 상태인데요.. 5번은 완료 된 파일 8번은 시딩중인파일.. 등등 있는데.. 그냥 5번으로 하시면 가장 편리하실 거에요. 코드 아래 주석에 상태 번호가 있으니 참고하세요
코드 수정이 끝났으면 thumb_convert.pl 정도로 저장하시고 스캐줄러에 ./파일경로/thumb.convert.pl 로 등록해서 사용하시면 자동으로 지정된 시간에 맞춰서 썸네일을 생성하게 됩니다.

댓글 4개:

  1. 잘봤습니다. 이렇게 하면 혹시 다운로드가 아니라 영상을 관리하고 있는 폴더에 영상을 넣었을때도 바로 썸네일이 생성될까요??

    답글삭제
    답글
    1. 그렇진 않아요. 이건 다운로드 된 영상의 후처리 작업이에요. 만약 폴더에 영상 넣었을 때 하고 싶다면 일정 시간마다 영상 폴더의 썸네일 없는 영상을 찾아서 썸네일 만드는 방법을 써야 할 겁니다.

      삭제
    2. 그렇군요.. 여기 싸이트에서 팁을 많이 얻어가네요! 감사하게 생각하고있습니다. 답변 감사합니다! ^^

      삭제
    3. 작성자가 댓글을 삭제했습니다.

      삭제