Transmission is one of my favourite bittorrent client. However, it’s lack the feature of running command(s) before or after you have finished downloading. Luckily we can improvise this with the help of transmission-remote, a command based client for transmission, and along with some Linux bash scripting.
Below I have created a simple bash script. What it does is, converting all of the finished avi’s to wmv. The conversion is via ffmpeg. The script below is easily modified to suit your needs, such as:
i – Copying the finished torrent to another location.
ii – Doing any conversion to your media.
iii – Send you mail notifying the torrent have finished downloading.
iv – etc, etc.
So, let’s get started.
1. Install transmission-remote
sudo apt-get install transmission-remote
2. Copy the script below, and save as my_script_name.sh , (or whatever name you prefer, but note the .sh extension).
This is among my early attempts of shell script programming, so go easy on me and feel free to give feedbacks. 🙂
#!/bin/sh # The absolute path where your torrents are downloaded # For example: /tmp/download BASEDIR=/home/myuser/mytorrentpath LOGPATH=/home/myuser/mywmv.log # The absolute path to and including the transmission-remote binary # For example: /usr/bin/transmission-remote TRANSREMOTE=/usr/bin/transmission-remote TRANSOPTS=" 127.0.0.1:my_port_number -n my_username:my_password " DoConvert () { _AVINAME=$1 WMVNAME=${_AVINAME%.*}".wmv" if [ ! -f "$WMVNAME" ]; then #Do conversion here echo "converting $_AVINAME" >> $LOGPATH ffmpeg -sameq -i "$_AVINAME" -vcodec wmv2 -acodec wmav2 "$WMVNAME" \ < /dev/null 2> /dev/null fi } cd $BASEDIR echo "Starting at `date`" >> $LOGPATH # Find the first completed torrent $TRANSREMOTE $TRANSOPTS -l | grep "100%" | grep "Done " | cut -b71- | while read LINE do if [ -e "$LINE" ]; then if [ -h "$LINE" ]; then echo "$LINE is already moved" >> $LOGPATH else if [ -d "$LINE" ]; then cd "${LINE}" ls -1f *.avi 2>/dev/null | while read AVINAME do DoConvert "$AVINAME" done cd - else DoConvert "$LINE" fi fi else echo "torrent $LINE is removed" >> $LOGPATH fi done echo "-----------------" >> $LOGPATH
Save the script on any location you prefer.
3. Create a cron job to run the script. Open the entry to crontab:
crontab -e
4. Let say you want to run the script every hour, by the hour, the entry on your cron job should be as below:
0 * * * * sh /home/myuser/my_script_name.sh
You can also test the script you’ve created by executing the command:
sh /home/myuser/my_script_name.sh
Enjoy.
How would you adjust this script to make it zip files after it is finished?
How would you adjust this script to make it zip files and folders after it is finished?
I’ve never tried that before, but “zip” command should do it:
zip squash.zip file1 file2 file3