4

I have written a shutdown script for transmission. Transmission calls the script after a torrent download finishes. The script runs perfectly on my machine (Ubuntu 11.04 & 12.04).

#!/bin/bash
sleep 300s

# default display on current host
DISPLAY=:0.0

# find out if monitor is on. Default timeout can be configured from screensaver/Power configuration.

STATUS=`xset -display $DISPLAY -q | grep 'Monitor'`
echo $STATUS

if [ "$STATUS" == "  Monitor is On" ]

###  Then check if  its still downloading a torrent. Couldn't figure out how.(May be) by monitoring network downstream activity? 

then

    notify-send "Downloads Complete" "Exiting  transmisssion now"
    pkill transmission

else
    notify-send "Downloads Complete" "Shutting Down Computer"
    dbus-send --session --type=method_call --print-reply --dest=org.gnome.SessionManager /org/gnome/SessionManager org.gnome.SessionManager.RequestShutdown

fi

exit 0

The problem is that when I'm downloading more than one file, when the first one finishes, transmission executes the script. I would like to do that but after all downloads are completed.

I want to put a 2nd check ( right after monitor check) if it is still downloading another torrent.

Is there any way to do this?

3 Answers 3

5

This information isn't passed to the scripts via environment variables, so you'll need to query Transmission's RPC interface. This is sometimes done by client libraries -- for example, a Python script could use python transmissionrpc. There are other interfaces like this listed at http://www.transmissionbt.com/resources/ .

Here's a quick approach that will use transmission-remote to count the number of non-idle downloads:

transmission-remote yourhost:yourport -tall --info | grep "^  State:" | grep "Down" | wc --lines

If you want to include idle downloads too, you could try this:

transmission-remote yourhost:yourport -l | grep -v -e " 100% " -e "^Sum" -e "^ID" -e " Stopped " | wc --lines

Where "^ID" and "^Sum" strips the header and footer; " 100% " strips completed torrents; and " Stopped " strips out the incomplete-but-paused torrents. This approach isn't foolproof -- for example, a torrent named " 100% Stopped " would break it.

1
  • Thanks for the python transmission link.I will look into it. Oct 19, 2012 at 15:20
4

I created a better script(from user98677 advice) which takes advantage of transmission's RPC Interface.

Code:

Github Gist: https://gist.github.com/khurshid-alam/6474227

What it Does?

  1. Pause or remove completed torrents after they are completed.

  2. Send a pushover notification (with curl)[optional]

  3. Send a twitter notification (requires twidge)[optional]

  4. Suspend/Shutdown Computer OR leave it as it is.

Pushover Notification From Transmission

Screenshot


Setup

On Ubuntu

sudo apt-get install libnotify-bin
sudo apt-get install transmission-cli

On Ubuntu >= 13.04 (For twitter notification):

sudo add-apt-repository ppa:moorhen-core/moorhen-apps
sudo apt-get install twidge

For suspend action on non-Ubuntu distro (Ubuntu uses Upower) install powermanagement-interface package

sudo apt-get install powermanagement-interface

After installation:

  1. Get the code from github-gist & save the file as trsm anywhere on your hard-drive. Make the file executable chmod a+x trsm .

  2. Login to pushover & copy your user key. Paste it under user-key in the script.

  3. If you want notifications send with nice looking application (transmission) icon just create a fake app in pushover with transmission icon & then copy the application key (API/Token key) & paste it under app-key in the script.

  4. For twitter setup see twidge documentation.

  5. Open transmission. Go to preference->web. Enable web client (default port 9091) & enable user authentication . Choose a username & password. Put that username & password in the script as username & password respectively.

  6. Click open web-client to check if it is working properly.

  7. Finally save the script & go to downloading tab (in transmission preference) & click call script when torrent is complete. Select the respective script.


Script

#!/bin/bash


user-key=" "  #put your pushover user-key
app-key=" "  #put your pushover application-key
device=" "    #Your device name in pushover

username=" "  # Transmission remote username
password=" "   # Transmission remote password



sleep 100s

# default display on current host
DISPLAY=:0.0

# authorize transmission
trsm="transmission-remote --auth $username:$password"

# find out number of torrent

TORRENTLIST=`$trsm --list | sed -e '1d;$d;s/^ *//' | cut --only-delimited --delimiter=' ' --fields=1`

for TORRENTID in $TORRENTLIST
do
 echo "* * * * * Operations on torrent ID $TORRENTID starting. * * * * *"

 #echo $TORRENTID

 DL_COMPLETED=`$trsm --torrent $TORRENTID --info | grep "Percent Done: 100%"`

 #echo $DL_COMPLETED

# pause completed torrents & get those torrent names.

 if [ "$DL_COMPLETED" != "" ]; then
  $trsm --torrent $TORRENTID --stop
  trname=`$trsm --torrent $TORRENTID --info | grep "Name:" | awk -F: '{print $NF}'`

  # post an update to twitter

  echo "$trname download was completed" | twidge update  # Put "#" if you don't need this.

  # push update for pushover

  curl -s \
    -F "token=$user-key" \
    -F "user=$app-key" \
  # -F "device=$device" \  # uncomment, if you want to send notification to a particular device.
    -F "title=Download Finished" \
    -F "message=$trname download has completed." \
    http://api.pushover.net/1/messages > /dev/null

  # The following codes works assuming One take advantage of gnome-power-manager by setting "black screen after 2/5/10/.. minitues ". 
  # if monitor(Including laptop screen but EXCLUDING external monitor) is on, it will  just force blank the screen, if not, it will shutdown/suspend or leave it as it is.
  # Modify it as per your requirement.

  STATUS=`xset -display $DISPLAY -q | grep 'Monitor'`
  #echo $STATUS

  if [ "$STATUS" == "  Monitor is On" ]
  then
      notify-send "Downloads Complete" "turning off the screen now"
          xset dpms force off

  else
      notify-send "Downloads Complete" "$trname"

        # uncomment to shutdown the computer
        #dbus-send --session --type=method_call --print-reply --dest=org.gnome.SessionManager /org/gnome/SessionManager org.gnome.SessionManager.RequestShutdown

        # uncomment to suspend (on ubuntu)
        #dbus-send --system --print-reply --dest="org.freedesktop.UPower" /org/freedesktop/UPower org.freedesktop.UPower.Suspend

        # uncomment to suspend (on Linux) (requires powermanagement-interface package)
        #pmi action suspend

 else
  echo "Torrent #$TORRENTID is not completed. Ignoring."
 fi

done
1

A simple script.

Thanx to Khurshid Alam and user98677 I have written this script which is working fine. If display is on (you are working) it makes the Transmission to exit and sends a notification, if not computer is shutdown.

  1. install

    sudo apt-get install transmission-cli libnotify-bin
    

    in Ubuntu 16.04

    sudo apt install transmission-cli libnotify-bin
    
  2. Transmission>Preferences>Remote>Check Allow remote Access make sure that HTTP Port is 9091 and only allow these IP Addresses is 127.0.0.1 (default).
  3. Copy paste the given script, save as say 'shutdown.sh' and make it executable.
  4. Transmission>Preferences>Downloading>Check 'Call script when download is completed', browse to the script.
  5. System Settings>Power>screen brightness>Turn screen off when inactive for>select reasonable time.

    #!/bin/bash
    sleep 300s
    DISPLAY=:0.0
    STATUS=$(xset -display $DISPLAY -q | grep 'Monitor')
    STATE=$(transmission-remote 127.0.0.1:9091 -tall --info | grep "^  State:" | grep "Down" | wc --lines)
    if
        [ "$STATUS" == "  Monitor is On" ] && [ "$STATE" == "0" ]
    then
        notify-send "Downloads Complete" "Exiting  transmisssion now"
        pkill transmission
    elif
         [ "$STATE" == "0" ]
    then
        #in Ubuntu 16,04
        shutdown -h now
        #in older versions use the following
        #dbus-send --session --type=method_call --print-reply --dest=org.gnome.SessionManager /org/gnome/SessionManager org.gnome.SessionManager.RequestShutdown
    fi
    exit 0
    

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .