[카테고리:] IT
우분투에서 두시탈출 컬투쇼 예약 녹음하기
장거리 운전할 때 두시탈출 컬투쇼 들으면 졸음예방도 되고 지루하지 않아서 좋습니다. 라디오가 항상 잘 나온다는 보장도 없고 오후 2시~4시에만 컬투쇼를 들을 수 있기에 저는 우분투 기반의 홈서버를 활용하여 매일 컬투쇼를 예약 녹음하고 있습니다.
우선 다음과 같이 필요한 패키지를 설치합니다.
$ sudo apt-get install mplayer
$ sudo apt-get install lame
SBS 라디오를 녹음하기 위한 스크립트를 생성합니다. 다음 내용을 rec_knn_radio.sh로 저장해 주세요.
RADIO_ADDR=”mms://211.220.195.199/viewradio”
RADIO_NAME=”knn_radio”
PROGRAM_NAME=$1
RECORD_MINS=$2
DEST_DIR=$3
NO=$4
REC_DATE=`date +%Y%m%d`
TEMP_ASX=`mktemp -u`
TEMP_WAV=`mktemp -u`
MP3_FILE_NAME=$PROGRAM_NAME”_”$REC_DATE”_”$NO.mp3
ID3_TITLE=$PROGRAM_NAME”_”$REC_DATE”_”$NO
ID3_ARTIST=$RADIO_NAME
ID3_ALBUM=$PROGRAM_NAME
ID3_YEAR=`date +%Y`
mimms -t $RECORD_MINS $RADIO_ADDR $TEMP_ASX
mplayer -ao pcm:file=$TEMP_WAV $TEMP_ASX
lame –preset voice –tt $ID3_TITLE –ta $ID3_ARTIST –tl $ID3_ALBUM –ty $ID3_YEAR $TEMP_WAV $MP3 _FILE_NAME
rm $TEMP_WAV
rm $TEMP_ASX
mkdir -p $DEST_DIR
chgrp user $MP3_FILE_NAME
mv $MP3_FILE_NAME $DEST_DIR
스크립트 파일에 실행 권한을 부여합니다.
crontab에 다음과 같이 등록합니다.
00 14 * * * /home/reshout/bin/rec_knn_radio.sh sbs_cultwo_show 60 /data/media/라디오 1 > /dev/null 2>&1
00 15 * * * /home/reshout/bin/rec_knn_radio.sh sbs_cultwo_show 60 /data/media/라디오 2 > /dev/null 2>&1
다음과 같은 형식의 이름으로 저장됩니다.
/data/media/라디오/sbs_cultwo_show_20121107_1.mp3
/data/media/라디오/sbs_cultwo_show_20121107_2.mp3
원인은 잘 모르겠지만 2시간 분량을 한번에 녹음할 수 없어서, 1시간씩 2번에 걸쳐 녹음하도록 설정했습니다.
조금 더 자세한 설명이 필요하시면 제가 예전에 작성한 글을 참조하세요.
Ubuntu 12.04 LTS에서 ffmpeg으로 아이폰용 동영상 인코딩하기
- ffmpeg이 포함된 패키지 설치
node.js로 토렌트에서 받은 파일 자동 정리
토렌트에서 받은 파일을 다운로드 디렉토리에서 원하는 곳으로 일일이 옮기는 것은 정말 귀찮은 작업입니다.
다음 파일의 다운로드가 완료되었을 때,
Mnet 슈퍼스타K4.6회.120921.720p.HDTV.H264-구제역돼지.mkv
다음 디렉토리로 이동하는 작업을,
/data/media/TV/슈퍼스타K4
자동화 하기 위해 간단한 node.js 모듈을 만들어 보았습니다.
이 모듈은 현재 홈서버에서 forever로 항시 동작하고 있습니다.
var path = require(‘path’);
var torrentDir = ‘/data/torrent/’;
var completeDir = path.join(torrentDir, ‘complete’);
var mediaDir = ‘/data/media/’;
var tvDir = path.join(mediaDir, ‘TV’);
var workingFilename = {};
var dirMap = {};
dirMap[path.join(tvDir, ‘개그콘서트’)] = /개그.*콘서트|개콘/;
dirMap[path.join(tvDir, ‘무한도전’)] = /무한.*도전/;
dirMap[path.join(tvDir, ‘힐링캠프’)] = /힐링.*캠프/;
dirMap[path.join(tvDir, ‘슈퍼스타K4’)] = /슈퍼.*스타.*[kK].*4/;
dirMap[path.join(tvDir, ‘대왕의꿈’)] = /대왕의.*꿈/;
dirMap[path.join(tvDir, ‘대풍수’)] = /대풍수/;
fs.watch(completeDir, function(action, filename) {
for (dir in dirMap) {
var regExp = dirMap[dir];
var targetDir = dir;
if (regExp.test(filename)) {
if (!workingFilename[filename]) {
var fromPath = path.join(completeDir, filename);
var toPath = path.join(targetDir, filename);
workingFilename[filename] = toPath;
setTimeout(function() {
fs.rename(fromPath, toPath, function(err) {
if (!err)
console.log(filename + ‘: success’);
else
console.log(filename + ‘: fail, ‘ + err);
setTimeout(function() {
delete workingFilename[filename];
}, 5000);
});
}, 5000);
}
break;
}
}
});
이 모듈을 활용하시려면 Transmission이든 Deluge든 파일을 다운로드 중에 저장하는 디렉토리와 다운로드 완료 후 저장하는 디렉토리를 다르게 설정하셔야 합니다.
코드에 대해서 간단히 설명드리자면, 동일한 파일에 대하여 중복으로 fs.watch()가 callback을 불러주는 문제를 피하기 위하여 workingFilename이라는 map을 활용하고 있고, 파일이 생성되고 저장되고 옮겨지는 등의 시간차를 감안하여 setTimeout()을 적절히 활용하였습니다.
Ubuntu 12.04 LTS에 Deluge 설치하기 (troubleshooting)
리눅스 서버를 위한 토렌트 클라이언트의 양대 산맥은 Transmission과 Deluge라고 할 수 있습니다.
Transmission이 가볍고 단순해서 좋긴 한데, 다운받은 파일의 user와 group이 debian-transmission이라 파일을 자동으로 관리하기가 영 불편해서, 최종적으로 Deluge를 선택하게 되었습니다. (Deluge는 deluged 프로세스의 user와 group을 지정할 수 있고, 자연스럽게 deluged가 다운받은 파일의 user와 group도 그대로 따라갑니다.)
Deluge는 비교적 화려한 기능과 인터페이스를 제공하지만, Python으로 구현되어 있어 Transmission보다 비교적 메모리를 많이 사용하고 느립니다.
설치는 잘 정리되어 있는 다음 문서를 그대로 따라하시면 됩니다.
http://linuxplained.com/install-deluge-web-interface-on-ubuntu-1204/
add-apt-repository가 없으신 분은 python-software-properties 패키지를 설치해 주시면 되겠습니다.
설치 및 실행이 완료되면 다음 주소로 webui에 접근할 수 있습니다.
http://localhost:8112/
토렌트 등록, 시작, 멈춤, 삭제, 설정 등 모든 작업이 webui에서 가능합니다.
기본적인 동작에는 아무런 문제가 없지만 특정 디렉토리에 토렌트 파일을 복사해 넣으면 자동으로 다운로드가 시작되는 기능이 한글 토렌트 파일명에 대하여 동작하지 않는 문제가 있습니다.
Preferences > Downloads > Folder > Autoadd .torrent files from > /data/torrent
이 문제를 해결하기 위해 /data/torrent에 한글 이름의 토렌트 파일이 추가되면 임의의 영문 이름으로 바꾸는 node.js 모듈을 작성하여 forever로 돌리고 있습니다.
var path = require(‘path’);
var torrentDir = ‘/data/torrent/’;
var workingFilename = {};
function randomString(len, charSet) {
charSet = charSet || ‘ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789’;
var randomString = ”;
for (var i = 0; i < len; i++) {
var randomPoz = Math.floor(Math.random() * charSet.length);
randomString += charSet.substring(randomPoz,randomPoz+1);
}
return randomString;
}
fs.watch(torrentDir, function(action, filename){
var hangulRegexp = /[ㄱ-ㅎ|ㅏ-ㅣ|가-힣]/;
var ext = path.extname(filename);
if (!workingFilename[filename] && ext == ‘.torrent’ && hangulRegexp.test(filename)) {
var fromPath = torrentDir + filename;
var toPath = torrentDir + randomString(8) + ‘.torrent’;
workingFilename[filename] = toPath;
setTimeout(function() {
fs.rename(fromPath, toPath, function(err) {
if (!err) console.log(filename + ‘: success’); else console.log(filename + ‘: fail’);
setTimeout(function() {
delete workingFilename[filename];
}, 2500);
});
}, 2500);
}
});
Samba를 통해 해당 디렉토리에 토렌트 파일을 복사한 경우, 같은 파일에 대하여 callback이 여러번 호출되기 때문에 map을 사용하여 중복을 피했고, 파일이 생성되고 내용이 저장되기 이전에 이름을 바꾸어 버리는 문제를 피하기 위해 시간차를 두었습니다.
Deluge가 기본으로 제공하는 플러그인 중에 토렌트 파일이 추가되거나 다운로드가 완료되었을 때, 특정 스크립트를 자동으로 실행하는 기능을 제공하는 Execute라는 플러그인이 있습니다.
자세한 내용은 다음 문서를 참조하세요.
http://dev.deluge-torrent.org/wiki/Plugins/Execute
참고로 플러그인을 사용하도록 설정한 후 webui에서 스크립트를 추가하려고 하면 javascript 에러가 발생하는데, deluged를 다시 시작하면 잘 됩니다.
이 역시 한글 이름의 토렌트 파일의 경우 제대로 동작하지 않습니다.
이 문제를 해결하기 위해 다음 문서를 참조하여,
http://forum.deluge-torrent.org/viewtopic.php?f=9&t=40517
Execute 플러그인의 소스코드를 수정하였습니다.
빨간색 부분의 코드를 추가하시면 됩니다.
123 for command in self.config[“commands”]:
124 if command[EXECUTE_EVENT] == event:
125 command = os.path.expandvars(command[EXECUTE_COMMAND])
126 command = os.path.expanduser(command)
127 log.debug(“[execute] running %s”, command)
128 if isinstance(torrent_name, unicode):
129 torrent_name = torrent_name.encode(‘utf-8’)
130 d = getProcessOutputAndValue(command, (torrent_id, torrent_name, save_path), env=os.environ)
131 d.addCallback(log_error, command)
deluged를 다시 시작하면 의도한대로 added, complete 이벤트에 등록해 둔 script가 실행 됩니다.
다운로드가 완료된 후에 해당 토렌트를 삭제하고 싶다면 다음과 같은 스크립트를 사용하시면 됩니다.
date=`date +%Y%m%d`
time=`date +%H:%M:%S`
echo \($date $time\) $1 $2 $3 >> /data/torrent/log/complete.log
deluge-console rm $1
deluge-console 패키지도 설치해 주셔야 합니다.
deluge-console를 사용하면 console에서 다운로드 상태를 보거나 토렌트를 추가하고 삭제하는 작업이 console에서 가능합니다. 자세한 내용은 다음 문서를 참조하세요.