-
-
Save paul-chambers/71ef48e40449ec73eef95430b9e4e6c7 to your computer and use it in GitHub Desktop.
| #!/bin/bash | |
| # Helper script for deluge or qBittorrent bittorrent clients | |
| # Intended to be run when the torrent download completes | |
| # | |
| # for qBittorrent, enable 'Run external program on torrent completion' under 'Downloads' in the options dialog. | |
| # in the text field, enter: | |
| # | |
| # <path to>/torrent-complete.sh "%K" "%N" "%D" | |
| # | |
| # %K: Torrent ID | |
| # %N: Torrent name | |
| # %D: Save path | |
| # | |
| # This provides the same parameters to this script that deluge provides to 'torrent complete' scripts. | |
| # | |
| # The basic idea is to hardlink the files that the bittorrent client has just finished downloading to a second directory. | |
| # This allows you to configure qBittorrent to automatically pause or delete torrents when they reach a given seed ratio, | |
| # while also keeping a copy around for further processing. | |
| # | |
| # For example, SyncThing could be used to propagate new downloads to a remote machine to be processed further. When remote | |
| # processing has finished, and the file is deleted/moved out of the remote downloads folder, the remote Syncthing will | |
| # propagate a deletion back to the original Synchting (on the machine running this bittorrent client). | |
| # | |
| # This approach works equally well for rclone. | |
| # | |
| # The end result is that the lifetime of files involved both in the torrent client's seeding process and the 'transfer | |
| # to somewhere else' process (e.g. via reclone or Syncthing) are decoupled, and can safely execute in parallel without | |
| # needing to be aware of what the other is doing. And yet the net result is that the files will still be cleaned up | |
| # automagically when both have finished their respective tasks. | |
| # | |
| # Paul Chambers, Copyright (c) 2019-2023. | |
| # | |
| # Made available under the Creative Commons 'BY' license | |
| # https://creativecommons.org/licenses/by/4.0/ | |
| # | |
| set -x | |
| torrentID=$1 | |
| torrentName=$2 | |
| torrentPath=$3 | |
| baseDir="/home/video" | |
| srcDir="${baseDir}/downloads" | |
| destDir="${baseDir}/toUpload" | |
| # either empty, or has a leading slash | |
| label="${torrentPath#$srcDir}" | |
| # note that srcPath may be a file, not necessarily a | |
| # directory. In which case, the same is true for destPath. | |
| srcPath="${torrentPath}/${torrentName}" | |
| destPath="${destDir}${label}/${torrentName}" | |
| mkdir -p "~/logs/" | |
| echo "${torrentID} \"${torrentName}\" \"${torrentPath}\" ${label}" >> ~/logs/torrent-complete.log | |
| # Non-rar files are always hardlinked to the destination. | |
| mkdir -p "${destPath}${label}" | |
| cp -vrl -t "${destDir}${label}" "${srcPath}" | |
| # We may be given a file or a directory. If it's a directory, it may contain one or more rar files, in which case | |
| # we unpack each one directly into the destination hierarchy. | |
| if [ -d "${destPath}" ] | |
| then | |
| # multiple rar files may be found in subdirectories, so handle each one, preserving hierarchy | |
| find "${destPath}" -name '*.rar' -print0 | while read -d $'\0' rarFile | |
| do | |
| # unrar does not delete the rar file(s) after it's finished extracting. But it does tell us | |
| # on stdout which files it is parsing as it expands the archive. With a little sed magic, | |
| # we parse out those filenames from stdout and remember them. If unrar completes without | |
| # error, we then use that list to delete the file(s) that made up the rar archive. | |
| rarFileList=$(mktemp) | |
| path="$(dirname "${rarFile}")" | |
| unrar x -idp -o+ "${rarFile}" "${path}" | \ | |
| sed -n -e "s/^Extracting from \(.*\.r[a0-9][r0-9]\)$/\1/ w ${rarFileList}" \ | |
| && xargs --no-run-if-empty --arg-file="${rarFileList}" rm \ | |
| && rm "${rarFileList}" | |
| done | |
| fi | |
| # We could unpack other archives here too (e.g. .zip files), but it's preferable to transfer archives | |
| # to a remote machine in their compressed form, and decompress them there. | |
| # remove any files we don't need from {destPath}, to avoid wasting bandwidth transferring them. | |
| # this is a personal preference - adjust to taste | |
| find "${destPath}" -name 'BDMV' -printf "%h\0" | xargs -0 --no-run-if-empty rm -r | |
| torrent-upload "${destpath}" |
| # | |
| # torrent is ready to transfer to its final destination | |
| # | |
| # $1 = path to the torrent to transfer (a path to either a folder or file) | |
| # | |
| rclone move "$1" destination: |
Glad you found it useful :)
How can all this b integrated on sonarr radarr? I used to use copy completed and unrar plugin to do this but copy completed not working now. Also how can it workd with labels so it copy to /LABEL/*
Thats no what I mean. Deluge use label and copy movies tvshows to different folder base on label when they r done. I want to know how to move the different files base on label with your script
It already supports labels. I use labels myself. See lines 35 and 40.
I see, but the label in the script is a variable that you created it is not? label="${torrentPath#$srcDir}"
Or would that get the label assigned on the torrent using the label or label plus plugin?
Hi mate, complete beginner - Deluge -> Plugins -> Execute. Select Add, Event=Torrent Completed and what do I put in the command?
Do I need to transfer this .sh file over to my Deluge FTP and then type the file name into that?
OR do I copy and paste everything in the .sh file?
Cheers Paul
Haven't been able to get this running for some reason. Perms are correct etc etc.. But just isn't executing...
I was tired of the plugin solutions and was hoping to find an alternative. This is it. Unrar/Copy/Clean This works fantastic!
Thank you.