aboutsummaryrefslogtreecommitdiff
path: root/scripts
diff options
context:
space:
mode:
Diffstat (limited to 'scripts')
-rwxr-xr-xscripts/ask-tracker-for-more-peers.py21
-rw-r--r--scripts/cron.sh28
-rwxr-xr-xscripts/delete-based-on-tag.py40
-rw-r--r--scripts/entrypoint.sh28
-rw-r--r--scripts/requirements.txt8
-rwxr-xr-xscripts/tag-based-on-dir.py30
6 files changed, 155 insertions, 0 deletions
diff --git a/scripts/ask-tracker-for-more-peers.py b/scripts/ask-tracker-for-more-peers.py
new file mode 100755
index 0000000..8b874f0
--- /dev/null
+++ b/scripts/ask-tracker-for-more-peers.py
@@ -0,0 +1,21 @@
+#!/usr/bin/env python3
+import click
+from transmission_rpc import Client
+
+
+@click.command()
+@click.option('--port', default=9091)
+@click.option('--host', default="localhost")
+def main(host, port):
+ """ Reannounces all torrents that have not received any peers. """
+
+ c = Client(host=host, port=port)
+ torrents = c.get_torrents()
+ for torrent in torrents:
+ if torrent.progress == 0 and torrent.downloading:
+ print(f"Reannouncing {torrent.name}")
+ c.reannounce_torrent(torrent.id)
+
+
+if __name__ == '__main__':
+ main()
diff --git a/scripts/cron.sh b/scripts/cron.sh
new file mode 100644
index 0000000..3cde994
--- /dev/null
+++ b/scripts/cron.sh
@@ -0,0 +1,28 @@
+#!/bin/bash
+set -euo pipefail
+
+declare -A tag_age
+i=0
+while true; do
+ key="DELETE_TAG_${i}"
+ val="DELETE_AGE_${i}"
+ if [ -z "${!key:-}" ]; then
+ break
+ fi
+ tag_age["${!key}"]="${!val}"
+ i=$((i+1))
+done
+
+${PYTHON_PATH} "${SCRIPT_PREFIX}"/tag-based-on-dir.py \
+ --host "${TRANSMISSION_HOST}"
+
+${PYTHON_PATH} "${SCRIPT_PREFIX}"/ask-tracker-for-more-peers.py \
+ --host "${TRANSMISSION_HOST}"
+
+for key in "${!tag_age[@]}"
+do
+ ${PYTHON_PATH} "${SCRIPT_PREFIX}"/delete-based-on-tag.py \
+ --host "${TRANSMISSION_HOST}" \
+ --tag "${key}" \
+ --age "${tag_age[$key]}"
+done
diff --git a/scripts/delete-based-on-tag.py b/scripts/delete-based-on-tag.py
new file mode 100755
index 0000000..a5e2d0b
--- /dev/null
+++ b/scripts/delete-based-on-tag.py
@@ -0,0 +1,40 @@
+#!/usr/bin/env python3
+import click
+from transmission_rpc import Client
+from datetime import timedelta, datetime
+
+
+def convert_to_seconds(s):
+ units = {"s": "seconds", "m": "minutes",
+ "h": "hours", "d": "days", "w": "weeks"}
+ count = int(s[:-1])
+ unit = units[s[-1]]
+ td = timedelta(**{unit: count})
+ return td.seconds + 60 * 60 * 24 * td.days
+
+
+@click.command()
+@click.option('--port', default=9091)
+@click.option('--host', default="localhost")
+@click.option('--tag', required=True)
+@click.option('--age', default='1w')
+def main(host, port, tag, age):
+ """ Deletes torrents older than the specified age. """
+
+ c = Client(host=host, port=port)
+ torrents = c.get_torrents()
+ for torrent in torrents:
+ if tag not in torrent.labels:
+ continue
+
+ specified_age = convert_to_seconds(age)
+ age_in_seconds = int((datetime.today().timestamp() -
+ torrent.added_date.timestamp()))
+
+ if age_in_seconds > specified_age:
+ print(f"Deleting {torrent.name}")
+ c.remove_torrent(torrent.id, delete_data=True)
+
+
+if __name__ == '__main__':
+ main()
diff --git a/scripts/entrypoint.sh b/scripts/entrypoint.sh
new file mode 100644
index 0000000..4d89be5
--- /dev/null
+++ b/scripts/entrypoint.sh
@@ -0,0 +1,28 @@
+#!/bin/bash
+set -euo pipefail
+
+cat <<EOF >> /etc/cron.d/crontab
+PYTHON_PATH=/usr/local/bin/python3
+SCRIPT_PREFIX=/scripts
+TRANSMISSION_HOST=${TRANSMISSION_HOST:-localhost}
+TRANSMISSION_PORT=${TRANSMISSION_PORT:-9091}
+EOF
+
+i=0
+while true; do
+ key="DELETE_TAG_${i}_NAME"
+ val="DELETE_TAG_${i}_AGE"
+ if [ -z "${!key:-}" ]; then
+ break
+ fi
+ cat <<EOF >> /etc/cron.d/crontab
+DELETE_TAG_${i}=${!key}
+DELETE_AGE_${i}=${!val}
+EOF
+ i=$((i+1))
+done
+
+echo "${CRON_EXPRESSION:-* * * * *} /bin/bash /scripts/cron.sh >/proc/1/fd/1 2>/proc/1/fd/2" >> /etc/cron.d/crontab
+cat /etc/cron.d/crontab
+crontab /etc/cron.d/crontab
+cron -f -l "${CRON_LOG_LEVEL:-0}"
diff --git a/scripts/requirements.txt b/scripts/requirements.txt
new file mode 100644
index 0000000..66904d3
--- /dev/null
+++ b/scripts/requirements.txt
@@ -0,0 +1,8 @@
+certifi==2023.5.7
+charset-normalizer==3.1.0
+click==8.1.3
+idna==3.4
+requests==2.31.0
+transmission-rpc==4.3.0
+typing_extensions==4.6.3
+urllib3==2.0.3
diff --git a/scripts/tag-based-on-dir.py b/scripts/tag-based-on-dir.py
new file mode 100755
index 0000000..8cec41b
--- /dev/null
+++ b/scripts/tag-based-on-dir.py
@@ -0,0 +1,30 @@
+#!/usr/bin/env python3
+import click
+from transmission_rpc import Client
+
+
+@click.command()
+@click.option('--port', default=9091)
+@click.option('--root-dir', default="/downloads/complete")
+@click.option('--host', default="localhost")
+def main(host, port, root_dir):
+ """Adds tags to torrents based on their download directory."""
+
+ c = Client(host=host, port=port)
+ torrents = c.get_torrents()
+ for torrent in torrents:
+ dir = torrent.download_dir.replace(root_dir, '')
+ label = 'none'
+ if dir != '':
+ label = dir.split('/')[1]
+
+ labels = list([label])
+ labels.extend(x for x in torrent.labels if x not in labels)
+
+ if set(labels) != set(torrent.labels):
+ print(f"Tagging {torrent.name}")
+ c.change_torrent(torrent.id, labels=labels)
+
+
+if __name__ == '__main__':
+ main()