#!/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.
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
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment