[php,그누보드] 동영상 업로드시 썸네일 자동생성
아무리 찾아도 내용을 찾기 어려워서 이리저리 찾아보며 작동이 되게 하는것을 목표로 만들었습니다.
개발자가 아니라서 코드가 맞는지 아닌지도 모르겠습니다 ㅋㅋ
일단 전 됩니다 -_-;
[중요] 자동으로 파일을 지워주진 않습니다(…)
대부분의 갤러리형 게시판에 적용 가능합니다.(아마도)
서버에 ffmpeg가 설치되어잇어야만 합니다. 호스팅 방식으로 이용하시는 분들은 이용이 어려울 수 있습니다.
docker를 이용하신다면, docker의 php-fpm에 ffmpeg를 포함해 빌드해서 사용하면 됩니다.
글 작성하는 시점의 그누보드 최신버전인 5.5.8.2.3 기준입니다.
가능한 원본의 손상이 없게 하려고 아둥바둥 해 봤습니다.
파일이 업로드 되면 프레임 하나를 png로 저장하고, 목록에서 첫번째 첨부파일이 동영상이라면 동영상 썸네일을 찾아서 넣어줍니다. 파일이 없으면 에러가 날 것 같네요. 파일 존재여부 체크를 하는 조건문을 파일 찾는 function에 넣어주면 될 것 같습니다.
원시적인 코드라서 편하게 수정해서 쓰시면 될것같아요.
Contents
적용
사용자 정의 함수(function) 만들기
그누보드 설치 폴더 아래 extend 폴더에 적당한 파일을 생성하고(ex. getthumb.php) 아래 내용을 넣습니다.
<?php // 썸네일 만들기 function get_ffmpeg_thumb($dest_file,$w=740,$h=410) { $path_parts = pathinfo($dest_file); $filename = $path_parts['filename'].'.png'; $size = $w.'x'.$h; $run = "ffmpeg -i ".$dest_file." -vcodec png -vframes 1 -vf thumbnail=100 -s ".$size." ".$path_parts['dirname']."/".$filename; @exec($run); } // 썸네일 가져오기 function get_ffmpeg_thumb_url($fileinfo) { if(!isset($fileinfo['file'])) return false; $path_parts=pathinfo($fileinfo['file']); $filename=$path_parts['filename'].'.png'; $result=$fileinfo['path'].'/'.$filename; return $result; }
write_update.skin.php 수정/생성
저는 테마를 쓰고 있어서, 테마의 갤러리 스킨의 `write_update.skin.php` 파일을 수정합니다. 없으면 만들어주세요.
<?php if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가 if (preg_match("/.(".$config['cf_movie_extension'].")$/i", $dest_file)) { get_ffmpeg_thumb($dest_file); }
list.skin.php 수정
관리자페이지의 게시판 관리 > 게시판 수정에서 ‘목록에서 파일 사용’ 부분이 체크되어있어야 합니다.
테마의 list skin을 수정합니다. `if($thumb[‘src’]) {` 윗줄에
// 첫번째 첨부파일이 동영상이라면 동영상 썸네일을 찾는다. if (preg_match("/.(".$config['cf_movie_extension'].")$/i", $list[$i]['file'][0]['file'])) { $img_content = '<img src="'.get_ffmpeg_thumb_url($list[$i]['file'][0]).'" alt="" />'; } else
를 넣어줍니다.
// 첫번째 첨부파일이 동영상이라면 동영상 썸네일을 찾는다. if (preg_match("/.(".$config['cf_movie_extension'].")$/i", $list[$i]['file'][0]['file'])) { $img_content = '<img src="'.get_ffmpeg_thumb_url($list[$i]['file'][0]).'" alt="" />'; } else if($thumb['src']) { $img_content = '<img src="'.$thumb['src'].'" alt="'.$thumb['alt'].'" >'; } else { $img_content = '<img src="'.$board_skin_url.'/img/s_image.png" alt="" />'; } echo $img_content;
이런 모습이 되면 됩니다. } else if ~~ { 이렇게 되는게 보기 좋은데, 일단 수정을 최소화 하기 위함이라(..)
제가 사용하는 게시판은 웹진형 게시판이고, 가로 740, 세로 420픽셀의 썸네일을 사용하기 때문에 해당 크기의 파일을 만듭니다. 다른 비율이 필요하시다면 getthumb.php 파일의 $w, $h 부분을 수정해주시면 됩니다.
파일 등록시 동영상이 저장되는 위치에 동일한 파일명의 png를 생성합니다. 불러올때도 해당 파일 위치의 png파일을 가지고 옵니다.
파일을 볼 때 동영상 띄우기
동영상 파일은 기본으로 embed 시켜주지 않기 때문에, 게시글 클릭시 동영상을 바로 볼 수 있도록 수정해줍니다.
`view.skin.php` 파일을 수정합니다.
아래 코드를 찾습니다. 스킨이니까 다를수도 있어요.
// 파일 출력 $v_img_count = count($view['file']); if($v_img_count) { echo "<div id="bo_v_img">n"; for ($i=0; $i<=count($view['file']); $i++) { if ($view['file'][$i]['view']) { //echo $view['file'][$i]['view']; echo get_view_thumbnail($view['file'][$i]['view']); } } echo "</div>n"; }
아래와 같이 변경합니다.
// 파일 출력 $v_img_count = count($view['file']); if($v_img_count) { echo "<div id="bo_v_img">n"; for ($i=0; $i<=$v_img_count; $i++) { if (!isset($view['file'][$i])) break; // 동영상이면 if (preg_match("/.($config[cf_movie_extension])$/i", $view['file'][$i]['source'])) { echo "<div>n"; echo '<video width="100%" height="100%" controls autoplay loop>'; echo '<source src="'.G5_URL."/data/file/".$bo_table."/".$view['file'][$i]['file'].'" type="video/mp4">'; echo '</video>'; echo '<br>'; echo '<br>'; echo "</div>n"; } else { echo get_file_thumbnail($view['file'][$i]); } } echo "</div>n";