만능 다운로더 – Jdownloader + VNC

This entry is part 41 of 48 in the series FreeNAS 서버 만들기

Jdownloader 는 java 기반의 다운로드 프로그램입니다. 다른 다운로드 프로그램과 비교해서 몇 가지 장점이 있습니다.

  • 매우 다양한 사이트 지원
    • 수천가지가 넘는 사이트의 다운로드를 지원합니다. 유튜브나 드롭박스, MEGA 와 같은 메이저 사이트부터, 거의 알려지지 않은 마이너 사이트까지 지원합니다.
      만약 지원하지 않는 사이트의 URL 을 추가 할 시, 해당 사이트를 분석해서 다운로드 받을 수 있는 것들의 리스트를 표시합니다.
      당연히, 단순 파일(예: https://example.com/asdf.mp4) 나 ftp (ftp://data.example.com/qwer.txt) 와 같은 것도 다운로드 할 수 있습니다.
  • 병렬 다운로드
    • 여러 개의 다운로드를 동시에 진행해 최대한 빠른 속도로 다운로드 할 수 있도록 합니다. 이는 느린 사이트나 회선으로 파일을 받을 때 유용하게 쓰입니다.
  • GUI와 Web컨트롤이 가능
    • GUI 기반의 프로그램이고, MyJdownloader 라는 웹사이트에서 제어가 가능합니다.
  • 편리한 사용
    • 사용 방법이 간단합니다. 다운로드 받고자 하는 URL을 입력하면 스스로 사이트를 분석합니다.
  • 다양한 OS 지원
    • JAVA 기반의 프로그램이다 보니 JAVA 가 설치되어 있다면 어떤 OS에도 설치할 수 있습니다. 당연히 FreeBSD 에도 설치가 가능합니다.
  • 활발한 개발
    • 매우 활발하게 개발되고 있는 프로그램이며, 자주 업데이트됩니다.

아주 많은 사이트를 지원하고, 사용하기 쉬우며, java 기반이라 설치가 쉽습니다. 그리고 헤드리스 시스템인 FreeNAS 에서도 설치하고 https://my.jdownloader.org/ 에서 원격 컨트롤이 가능합니다.

허나 웹사이트에서 원격 컨트롤을 하면 반응 속도가 늦다는 문제가 있습니다.

그래서 VNC 를 연결해 직접 GUI 를 통해 컨트롤 할 수 있도록 해 보겠습니다. 사용할 프로그램은 x11vncxvfb 입니다.

jail 만들기

jail의 이름은 downloader

자동 시작 설정 해 주세요.

마운트 포인트

iocage exec downloader mkdir -p /mnt/download

다운로드 한 파일이 저장될 디렉토리를 만들고

iocage stop downloader

감옥을 정지시켜 준 다음

/mnt/Data/Downloade/ ↔ /mnt/download

마운트 해 주세요.

jdownloadre 설치

iocage console downloader

감옥으로 로그인 해 주세요.

최신 레포로 바꾸기

port  와 pkg – 레포 바꾸기‘ 를 참고하여 레포를 최신으로 바꿔 주세요.

필요한 패키지 설치

pkg install openjdk8 x11vnc xorg-vfbserver ffmpeg

그룹과 유저 만들기

pw group add -n downloader -g 3000

GID 3000 의 downloader 유저를 만들었습니다.

pw user add jdownloader -m -d /home/jdownloader -s /bin/csh -u 3001 -g downloader -c "user for jdownloader"

UID 3001 의 홈 디렉토리 /home/jdownloader 이고 csh 쉘을 사용하는 jdownloader 유저를 만들었습니다.

유저 프로파일 수정

vi /home/jdownloader/.cshrc

setenv  DISPLAY :1
setenv  LC_CTYPE en_US.UTF-8
setenv  LANG en_US.UTF-8
setenv  LC_COLLATE C

제일 밑에 위의 설정을 추가해 주세요.

jdownloader가 설치될 디렉토리 만들기

mkdir /usr/local/jdownloader

jdownloader 가 설치될 디렉토리를 만들고

chown -R jdownloader:downloader /usr/local/jdownloader

권한을 줍니다.

Jdownloader 다운로드

그 후 jdownloader 를 받아야 합니다. 아래 사이트에서 other 를 선택하고 다운로드 해 주세요. mega.nz 에서 받아 오는 것이라서 쉘 에서 받는 것 보다 데스크탑에서 받고 서버로 집어 넣는 것이 더 편합니다.

http://jdownloader.org/download/index

다운로드 받은 JDownloader.jar 파일을 /usr/local/jdownloader 에 넣어 주세요. 파일 이름은 반드시 JDownloader.jar 이여야만 합니다. 파일 이름이 JDownloader.jar 가 아닐 시 에러가 납니다.

chown jdownloader:downloader /usr/local/jdownloader/JDownloader.jar

권한 설정까지 해 주세요.

초기 실행

cd /usr/local/jdownloader

jdownloader 가 설치된 디렉토리로 이동한 다음

su jdownloader -c 'java -Djava.awt.headless=true -jar /usr/local/jdownloader/JDownloader.jar -norestart'

jdownloader 권한으로 JDownloader.jar 을 실행해 줍니다.

초기 설치와 업데이트를 진행하는 것입니다. 시간이 좀 걸립니다. 아래와 같은 문구가 나타날때까지 기다려 줍니다.

|---------------------------Headless Information-------------------------------
|       Restart Required
|       JDownloader Updated Itself and will exit now.
|       Please restart JDownloader after a few seconds.
|       Make sure that there is no running JDownloader process before restarting.
|------------------------------------------------------------------------------

초기 실행이 끝나면 쉘로 돌아옵니다.

시작 스크립트 만들기

20191209 수정
jdownloader 가 daemon 프로세스가 종료되었음에도 불구하고 종료되지 않고 남아 있는 경우가 가끔 있음을 확인하였습니다. rc 스크립트를 수정해 종료되지 않았을 경우, kill -9 으로 강제 종료 하도록 수정했습니다.

또한, rc 스크립트에 몇 가지 오타가 있음을 확인해 수정하였습니다.

vi /usr/local/etc/rc.d/jdownloader

#!/bin/sh
#
# PROVIDE: jdownloader
# KEYWORD: shutdown
#
# Author : Admion!
#
# https://admion.net
#
# Add the following lines to /etc/rc.conf to enable the jdownloader:
#
# jdownloader_enable:      NO is default. Set it to YES to enable jdownloader.
#
# jdownloader_screen_size:	vnc screen size. 1024x700x8 is default.
#
# jdownloader_vnc_port:  vnc listening port. 4817 is default.
#
# jdownloader_max_memory:	  Maximum memory to be used by jdownloader. 1024m is default.
#				  It is recommended to set this value to more than 1536m
#
# jdownloader_vnc_password:      If you want to set a password for vnc, set this value to "YES". NO is default.
#
# jdownloader_vnc_pwfile:	  The location of the file where the vnc password is stored. /home/jdownloader/.vnc/passwd is default.
#

. /etc/rc.subr

name=jdownloader
rcvar="${name}_enable"
start_cmd="${name}_start"
stop_precmd="${name}_stop_precmd"
stop_postcmd="${name}_stop_postcmd"
stop_cmd="${name}_stop"

load_rc_config $name

: ${jdownloader_enable="NO"}
: ${jdownloader_screen_size="1024x700x8"}
: ${jdownloader_vnc_port="4817"}
: ${jdownloader_max_memory="1024m"}
: ${jdownloader_vnc_password="NO"}
: ${jdownloader_vnc_pwfile="/home/jdownloader/.vnc/passwd"}

jdownloader_start()
{
    if [ "${jdownloader_vnc_password}" == "YES" ]; then
    if [ -f ${jdownloader_vnc_pwfile} ]; then
        export _jd_vnc_passwd="-rfbauth ${jdownloader_vnc_pwfile}"
    else
        echo "password file doesn't exist!"
        export _jd_vnc_passwd=""
    fi
    else
    export _jd_vnc_passwd=""
    fi

    export _jd_screen_size=$jdownloader_screen_size
    export _jd_vnc_port=$jdownloader_vnc_port
    export _jd_max_memory=$jdownloader_max_memory

    su jdownloader -c 'daemon -f -P /usr/local/jdownloader/xvfb_daemon.pid -p /usr/local/jdownloader/xvfb.pid /usr/local/bin/Xvfb :1 -screen 0 ${_jd_screen_size}'
    su jdownloader -c 'daemon -f -P /usr/local/jdownloader/x11vnc_daemon.pid -p /usr/local/jdownloader/x11vnc.pid /usr/local/bin/x11vnc ${_jd_vnc_passwd} -display :1 -forever -rfbport ${_jd_vnc_port} -loop'
    su jdownloader -c 'daemon -r -f -P /usr/local/jdownloader/jdownloader_daemon.pid -p /usr/local/jdownloader/jdownloader.pid /usr/local/bin/java -Dsun.jnu.encoding=UTF-8 -Dfile.encoding=UTF-8 -Xms512m -Xmx${_jd_max_memory} -jar /usr/local/jdownloader/JDownloader.jar
'

    echo jdownloader start
}

jdownloader_stop_precmd()
{
    if [ -r /usr/local/jdownloader/xvfb_daemon.pid ]; then
        _jd_xvfb_deamon_pid=$(check_pidfile /usr/local/jdownloader/xvfb_daemon.pid daemon)
        _jd_xvfb_pid=$(pgrep -F /usr/local/jdownloader/x11vnc.pid)
    fi

    if [ -r /usr/local/jdownloader/x11vnc_daemon.pid ]; then
        _jd_x11vnc_deamon_pid=$(check_pidfile /usr/local/jdownloader/x11vnc_daemon.pid daemon)
        _jd_x11vnc_pid=$(pgrep -F /usr/local/jdownloader/x11vnc.pid)
    fi

    if [ -r /usr/local/jdownloader/jdownloader_daemon.pid ]; then
        _jd_jdownloader_deamon_pid=$(check_pidfile /usr/local/jdownloader/jdownloader_daemon.pid daemon)
        _jd_jdownloader_pid=$(pgrep -F /usr/local/jdownloader/jdownloader.pid)
    fi
}

jdownloader_stop()
{
    if [ -n "${_jd_xvfb_deamon_pid}" ]; then
        kill ${_jd_xvfb_deamon_pid}
    fi

    if [ -n "${_jd_x11vnc_deamon_pid}" ]; then
        kill ${_jd_x11vnc_deamon_pid}
    fi

    if [ -n "${_jd_jdownloader_deamon_pid}" ]; then
        kill ${_jd_jdownloader_deamon_pid}
    fi

    wait_for_pids ${_jd_xvfb_pid} ${_jd_x11vnc_pid} ${_jd_jdownloader_pid}
}

jdownloader_stop_postcmd()
{

    echo "Cleaning up leftover child processes."

    if [ x$(ps ${_jd_xvfb_pid} | awk '{ if ($1=="${_jd_xvfb_pid}") print $1 }') = x$_jd_xvfb_pid ]; then
        echo "kill lefover Xvfb processes."
        kill -9 ${_jd_xvfb_pid}
    fi

    if [ x$(ps ${_jd_x11vnc_pid} | awk '{ if ($1=="${_jd_x11vnc_pid}") print $1 }') = x$_jd_x11vnc_pid ]; then
        echo "kill lefover x11vnc processes."
        kill -9 ${_jd_x11vnc_pid}
    fi

    if [ x$(ps ${_jd_jdownloader_pid} | awk '{ if ($1=="${_jd_jdownloader_pid}") print $1 }') = x$_jd_jdownloader_pid ]; then
        echo "kill lefover jdownloader processes."
        kill -9 ${_jd_jdownloader_pid}
    fi

    wait_for_pids ${_jd_xvfb_pid} ${_jd_x11vnc_pid} ${_jd_jdownloader_pid}

    echo jdownloader stop
}

run_rc_command "$1"

chmod 555 /usr/local/etc/rc.d/jdownloader

실행 가능하도록 만들어주었습니다.

(선택) vnc 비밀번호 설정하기

su jdownloader -c 'x11vnc -storepasswd'

Enter VNC password:
Verify password:
Write password to /home/jdownloader/.vnc/passwd?  [y]/n y

vnc 에 비밀번호를 설정할 경우 vnc 에 연결할 때 설정한 비밀번호를 입력해야 접속할 수 있습니다.

sysrc jdownloader_vnc_password="YES"

비밀번호를 사용하도록 설정해 줍니다.

rc.conf 수정

sysrc jdownloader_enable="YES"

Jdownloader 를 서비스에 등록합니다.

sysrc jdownloader_screen_size="스크린 사이즈"

VNC 화면 크기를 설정할 수 있습니다. 가로x세로x색비트 형식으로 입력하면 됩니다.

기본값은 1024x700x8 입니다.

sysrc jdownloader_vnc_port="vnc 포트 번호"

1024 이상의 포트를 vnc 포트로 설정할 수 있습니다.

기본값은 4817 입니다.

sysrc jdownloader_max_memory="메모리크기"

jdownloader 가 사용할 수 있는 최대 메모리를 설정합니다. 1536m 이상으로 설정하는 것을 추천합니다. 기본값은 1024m 입니다.

Jdownloader 시작

service jdownloader start

jdownloader 를 시작해 줍니다.

접속

VNC 클라이언트 (Real VNC 와 같은) 를 이용해 jdownloader.jail.IP:4817 으로 접속해 주면 jdownloader 의 GUI를 볼 수 있습니다.

ffmpeg 설정

유튜브 등의 영상을 다운로드 받을 시 ffmpeg 가 없다고 하는 경고가 나올 수 있습니다. jdownloader 의 GUI의 상단의 setting 에서 setting 을 누르면 설정 메뉴로 이동합니다.

Advanced Setting 에서

FFmpegSetup: Binary Patch/usr/local/bin/ffmpeg

FFmpegSetup: Binary Patch Probe/usr/local/bin/ffprobe

으로 설정해 ffmpeg 의 경로를 지정해 주면 경고가 사라지고 다운로드가 정상적으로 됩니다.

MyJdownloader 연결 (선택)

my.jdownloader 에서 jdownlaoder 를 컨트롤 하고 싶다면, my.jdownloader.org 에서 회원가입을 한 후, Jdownloader 의 GUI 에서 My.Jdownloadermy account 에 가입한 계정과 비밀번호를 입력해 주면 됩니다.

업데이트

service jdownloader stop

jdownloader 를 중지하고

pkg update && pkg upgrade

패키지를 업데이트 한 다음

service jdownloader start

jdownloader 를 시작해 줍니다.

문제점

GUI 에서 영어를 제외한 언어가 깨집니다. 파일 저장은 정상적으로 되는데 GUI에서만 이름이 깨지는 것으로 보아 폰트 문제인 것 같긴 한데, 어덯게 해결해야 할지 모르겠습니다. 아시는 분은 댓글로 피드백 남겨 주시면 감사하겠습니다.

마치면서

Jdownloader 를 Guacamole 에 연결하면 좀더 편리하게 사용할 수 있습니다.

다음 포스팅은 서버를 백업하는 방법에 대해서 다룹니다.

시리즈 네비게이션<< GuacamoleGNU Tar 을 이용해 백업하기 >>

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다