Mint Serena 64 bit using the Mate desktop environment. Most of the following scripts will run on this machine, although some have only been tested with the Gnome desktop. Extra software requirements can be met by the Ubuntu and safe PPA repositories. Scripts may be re-written or added to from time to time, the date serves as the version number. Syntax highlighting on these pages is provided by GVim's "Convert to HTML" option.

New PVR


#!/bin/bash
# Filename: new-pvr.sh
# Version.: 03042018
# Author..: robz
# WARNING! this works on my system it may break yours, read, check, tweak #####
# A torrent box script for a headless Raspberry Pi model B, it auto downloads
# media files for show episodes followed, then renames and transfers to NAS.
# Required software: xmllint, transmission-daemon and transmission-cli.
# Enable the "Watch" and "Incomplete" directories in transmission-daemon's
# settings.json, this can also be done using the web interface.
# http://<your-pi's-net-address-192.168.0.etc>:9091/transmission/web/#all
# No login required no gui, just power up pi whenever or leave on all the time.
# Downloads will occur at random times 01:00-05:00 ie. during off peak hours.
# List show names in the "followed-shows.txt" file one entry per line.
# Manually added links are copy/pasted to the "add-magnet.txt", one per line.
# Make script executable and run it first in /home/<user> i.e. ./new-pvr.sh
#
# Add to "sudoers" with sudo visudo, this, "pi ALL=(ALL) NOPASSWD: ALL". ######
# Backup your "/etc/fstab" then add these lines, leave out "#" on second line
# Allow mount of network drive using the samba protocol, but without sudo.
#//192.168.<etc>/Media  /home/pi/Media  cifs  guest,uid=pi,noauto,user  0  0
# Alter the NAS address (first one) to suit your network.

# Create a "Downloads" directory in home before running the script.
cd "$HOME/Downloads" || exit                        # Go to working directory.
# If script fails kill processes allowing cron to do a reboot.
trap "killall -q transmission-daemon; exit" SIGINT SIGTERM SIGHUP EXIT

# Setup variables.
smb="$HOME/Media/Cloud TV"                          # Samba mount point to NAS.
trk="$HOME/.config/transmission-daemon"             # The daemon's config file.
add='scripts/add-magnet.txt'                        # Any extra magnet links.
don='scripts/done-shows.txt'                        # Done downloads list.
rss='scripts/rss.txt'                               # Feed file rss listing.
rlg='log/run.log'                                   # This session, statistics.
dlg='log/debug.log'                                 # Debug log.
rec='log/rec.txt'                                   # Recently downloaded list.
mod='log/motd.txt'                                  # Message for ssh login.
ret='3'                                             # File retention in days.
cdn='0'                                             # Count/countdown variable.
export trk                                          # Give access for subshell.
###############################################################################
# On first run, this part of the script creates the directory/file structure 
# in /pi/Downloads, it also installs the random time run-script crontab.
if [ ! -e scripts/"$(basename $0)" ]; then
    set -o noclobber
    mkdir "/home/pi/Media"
    mkdir -p {Complete,Incomplete,scripts,log,ted}
    &> /dev/null > scripts/followed-shows.txt
    &> /dev/null > scripts/clipboard.txt
    &> /dev/null > scripts/recent.txt
    &> /dev/null > "$add"
    &> /dev/null > "$don"
    &> /dev/null > "$rss"
    t0='# Randomly between 01:00 and 05:00 new-pvr.sh run it.'
    t1='00 00 * * * /bin/sleep $(((RANDOM\%10800)+3600)); '
    t2="/home/pi/Downloads/scripts/$(basename $0); sudo shutdown -r +1"
    (crontab -u "$USER" -l; echo -e "\n$t0\n$t1$t2\n" ) | crontab -u "$USER" -
    cp "$0" scripts; mv "$0" "$0".backup
    echo 'Now add some shows to the followed-shows.txt'
    exit
else
    echo '### Files exist, no action taken ###'
fi
# On subsequent runs it does nothing, you can delete it if you like.
# NB. I noticed after my OS ugrade this section throws an error message, but it
# still seems to do it's job, so check file structure is in place before use.
###############################################################################
# Set up log files. 
mv "$dlg" "log/$(date -d y +%a-%-d%b)-debug.log"    # Rename old debug log.
mv "$rlg" "log/$(date -d y +%a-%-d%b)-run.log"      # Rename old session log.
set -x                                              # Generate debug output.
exec > "$dlg" 2>&1                                  # Route debug to debug.log.
date > "$rlg"                                       # Start a new session log.
> "$mod"                                            # Blank motd.txt.
# Timer will wait for "Incomplete" to empty or for a file to appear dependant
# on whether the $swh variable is set or not, or it'll just time out.
run_timer () {
while [ "$cdn" -gt "1" ]; do
    [[ ! "$swh" && "$(ls Incomplete)" ]] && break
    [[ "$swh" && ! "$(ls Incomplete)" ]] && break
    (( cdn-=5 )); sleep 5
done 2> /dev/null
}
# Strip unwanted characters from filenames, magnet links and xml input.
# 's/s[0-9]*e[0-9]*/\U&/;'\
strip_title () {
sed -e \
's/\([S][0-9]*[E][0-9]*\).*\<.*/\1/;'\
's/.*>//;'\
's/[.+-]/ /g;'\
's/ \+/ /g;'\
's/.*dn=//;'\
's/New.*: //;'\
's/www Torrenting com //;'\
's/www scenetime com //'
}
# Remove links with no proper episode number or with episode number 00.
no_specials ()
{
strip_title <<< "$lnk" | grep 'E[0-9][0-9]' | grep -v 'E00'
}
# Housekeeping, clean up old downloads and logs.
[ "$(df --output=pcent / | sed '1d' | cut -d'%' -f1)" -gt 70 ] && ret="1"
find log -mtime +14 -type f -delete
find Complete -mindepth 1 -mtime +"$ret" -delete
find "$trk" -mtime +"$ret" -name *.torrent -type f -delete -execdir bash -c\
    'del="{}"; del="${del##*/}"; rm -f "$trk/resume/${del%.*}.resume"' \;
# Fire up dat daemon.
transmission-daemon -g "$trk"
echo "$(date +%T) - Transmission-daemon started." >> "$rlg"
sleep 60
# Download rss feeds, pretty print to seperate lines allowing parsing.
wget -q -O - 'https://showrss.info/other/all.rss' | \
xmllint --format - > "$rss" 2> /dev/null
cat scripts/clipboard.txt >> "$rss"                 # Append earlier download.
# Check followed-shows list against new rss.txt file, standard def. not HD. If
# you want HD versions you'll have to modify the "sed" statments, alternatively
# you could use the "add-magnet.txt" file for a one off.
## NB. GNU sed is being used in this script, BSD/POSIX versions won't do.  ####
if [ -s "$rss" ]; then
    while read -r shw; do
        if [[ "${shw:0:1}" != "#" && "$shw" != "" ]]; then
            epi=$(sed -n "/720p\|1080p/d;/descrip.*\b$shw/Ip" "$rss")
            [ -z "$epi" ] && continue
            while read -r lnk; do
                if ! grep -iq "$(strip_title <<< "$lnk")" "$don"; then
                    lnk="$(sed 's/.*href=\"//;s/\".*//' <<< "$lnk")"
                    if no_specials; then
                        echo "$lnk" >> "$add"
                        strip_title <<< "$lnk" >> "$don"
                    fi
                fi
            done <<< "$epi"                         # Add to add-magnet.txt
        fi
    done < 'scripts/followed-shows.txt'
    sed 's/.*E\([0-9][0-9]*\)/\1 &/' "$add" | sort -u -o "$add"
    sed -i 's/.* //' "$add"
    #sort -t "=" -k3 -u -o "$add" "$add"
    grep "raw.*title" "$rss" | sed "/720\|1080/d" | strip_title | sort -u \
    > log/rss-today.txt
else
    echo 1 > log/flashred.txt
    echo ' ## ERROR - rss feed failed to download. ##' | tee -a "$rlg" "$mod"
    > log/rss-today.txt
fi
# Load the bit torrent client with links from the "add-magnet.txt" file.
while read -r lnk; do
    [ "$cdn" -ge "3" ] && break
    (( cdn+=1 ))
    transmission-remote --add "$lnk"
    strip_title <<< "$lnk" >> "$don"
    sed -i '1,1d' "$add"
done < "$add"
sort -u "$don" -o "$don"                            # Tidy up done-shows list.
# Wait for first link to load, skip if incomplete files exist.
[ "$cdn" -ne "0" ] && \
(echo "$(date +%T) - Wait for links or resume incompletes." >> "$rlg";
cdn="420"; swh=""; run_timer)                       # Set to wait for link load.
# If torrents are present start session timer.
if [ "$(ls Incomplete)" ]; then
    transmission-remote --torrent all --start
    cdn="3600"; swh="1"
    echo "$(date +%T) - Proceeding with download $((cdn/60))m max." >> "$rlg"
    run_timer
    echo "$(date +%T) - Seed for another 10 minutes." >> "$rlg"
    sleep 600
    transmission-remote --torrent all --stop
    transmission-remote --session-stats | sed '3,6!d' >> "$rlg"
    (
    echo "$(date +%T) - End of $(date +%A)'s downloads."
    [ "$(ls Incomplete)" ] && echo 'Incomplete download(s):' && ls Incomplete
    ) >> "$rlg"
    echo " PVR session...: $(awk '/Downloaded/{print $1,$2$3}' "$rlg")" >>"$mod"
    echo 'Rename & transfer to network storage.' >> "$rlg"
fi
transmission-remote --exit
# Just the main video files are selected ignoring previews and promos.
# Create directories if needed on NAS and copy files there, renaming on the way.
cdn=0; new="$(find Complete -size +50M -daystart -mtime -1)"
if [ "$new" ]; then                                 # Do we have episodes.
    mount '/home/pi/Media'
    sleep 45
        while read -r vid; do
        ext="${vid##*.}"
        epi="$(strip_title <<< $(dirname "$vid" | xargs basename -a))"
        dir="${epi% [Ss][0-9]*}/Season $(tail -c 6 <<< $epi |\
        head -c 2 | sed 's/^0//')"                  # Determine directory tree.
        echo "$epi" | sed 's/^/  /' | tee -a "$rlg" "$mod" |\
        sed "s/^/$(date +%a-%d)/;s/$/  \:$(du --si "$vid" | cut -f1)/" >> "$rec"
        mkdir -p "$smb/$dir"                        # Create directory on NAS.
        cp "$vid" "$smb/$dir/$epi.$ext"             # Copy to NAS renamed.
        (( cdn+=1 ))                                # Increment LED indicator.
    done <<< "$new"
fi
# This works in conjunction with the "ted-talks.sh" script if it exists.
# The mount commands will need tailoring to your network setup. ###############
new="$(find ted -type f)"
if [ "$new" ]; then
    echo " TED session...: Downloaded "$(du --si ted | cut -f2)"B" |\
    tee -a "$rlg" "$mod"
    while read -r vid; do
        [ -e "$vid" ] && mv "$vid"\
        ted/"$(grep "${vid##*/}" scripts/ted-donelist.txt | cut -d"|" -f1-2 |\
        tr -cd [:alnum:][:blank:]).mp4"             # Make a sane filename.
        (( cdn+=1 ))
    done <<< "$new"
    ls ted | sed 's/^/  /;s/.mp4//' | cut -c1-77 | tee -a "$rlg" "$mod"
    if ! mount -l | grep $(dirname "$smb"); then
        mount '/home/pi/Media'
        sleep 45
    fi
    mv ted/* "$smb"/TED-talks
fi
# Finish up.
echo "$cdn" > 'log/flashblue.txt'                   # Flash LED $cdn times.
echo "$(tail -25 "$rec")" | tac > 'scripts/recent.txt'
if [ "$cdn" -lt "1" ]; then
    echo " This session..: $(date +%A) nothing new." | tee -a "$rlg" "$mod"
else
    echo "$(date +%T) - File(s) transfer completed." >> "$rlg"
    (
    echo -n " Script runtime: $(date -d@"$SECONDS" -u +%H:%M:%S) - "
    echo "Load average: $(awk '{print $1,$2,$3}' /proc/loadavg)"
    ) | tee -a "$rlg" "$mod"
    umount '/home/pi/Media'
fi
# exit - see trap.


No comments: