a2tm/a2tm.py

377 lines
12 KiB
Python
Raw Normal View History

2022-07-02 17:53:18 +02:00
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# -----------------------------------------------------------------
# a2tm - aria2 python script for manage url and torrent downloads |
# https://aria2.github.io/ |
# Created by q3aql (q3aql@duck.com) |
# Licensed by GPL v2.0 |
# Last update: 30-03-2021 |
# Builds: |
# * https://github.com/q3aql/aria2-static-builds/releases |
# * https://github.com/tatsuhiro-t/aria2/releases |
# Compatible with Python 3.x |
# -----------------------------------------------------------------
version="0.1"
#Import python-modules
import subprocess
import os
import sys
import shutil
#Check if your system use Python 3.x
if sys.version_info<(3,0):
print ("")
print ("# You need python 3.x to run this program.")
print ("")
exit()
#Function to clear screen
def ClearScreen():
if sys.platform == "cygwin":
2022-07-03 20:44:56 +02:00
os.system("clear")
2022-07-02 17:53:18 +02:00
elif os.name == "posix":
os.system("clear")
elif os.name == "nt":
os.system("cls")
else:
print ("# Error: Unable clear screen")
# Detect system & PATH of user folder
if os.name == "posix":
os.chdir(os.environ["HOME"])
ConfigFile=os.environ["HOME"]+"/.aria2/a2tm.conf"
FilesTorrent="/*.torrent"
TorrentFolderInput=os.environ["HOME"]+"/A2TM"
TorrentFilesInput=os.environ["HOME"]+"/A2TM/files"
print ("# POSIX detected")
elif os.name == "nt":
os.chdir(os.environ["USERPROFILE"])
ConfigFile=os.environ["USERPROFILE"]+"\\.aria2\\a2tm.conf"
FilesTorrent="\\*.torrent"
os.chdir("C:\\")
TorrentFolderInput="C:\\\\A2TM"
TorrentFilesInput="C:\\\\A2TM\\\\files"
print ("# Windows detected")
# Create default folder for downloads
if not os.path.exists("A2TM"):
os.makedirs("A2TM")
os.chdir("A2TM")
if os.path.exists("A2TM"):
os.chdir("A2TM")
if not os.path.exists("files"):
os.makedirs("files")
# Create aria2 folder if no exists
if os.name == "posix":
os.chdir(os.environ["HOME"])
elif os.name == "nt":
os.chdir(os.environ["USERPROFILE"])
if not os.path.exists(".aria2"):
os.makedirs(".aria2")
os.chdir(".aria2")
if os.path.exists(".aria2"):
os.chdir(".aria2")
#Check if exists 'aria2.conf'
if os.path.isfile("aria2.conf"):
print ("aria2.conf exists")
else:
print ("aria2.conf created")
acf=open('aria2.conf','w')
acf.close()
acf=open('aria2.conf','a')
acf.write('# Sample configuration file of aria2c\n')
acf.close()
#Check if exists 'a2tm.conf'
if os.path.isfile("a2tm.conf"):
print ("a2tm.conf exists")
else:
abcf=open('a2tm.conf','w')
abcf.close()
abcf=open('a2tm.conf','a')
abcf.write('# Sample configuration file of a2tm\n')
abcf.write('\n')
#abcf.write('DiscFiles="C:" # Only for Windows\n')
abcf.write('# Folder for save downloads\n')
abcf.write('TorrentFolder="'+TorrentFolderInput+'"\n')
abcf.write('\n')
abcf.write('# Folder from load torrent files\n')
abcf.write('TorrentFiles="'+TorrentFilesInput+'"\n')
abcf.write('\n')
abcf.write('# Set the maximum download speed\n')
abcf.write('MaxSpeedDownload="300K"\n')
abcf.write('\n')
abcf.write('# Set the maximum upload speed\n')
abcf.write('MaxSpeedUpload="5K"\n')
abcf.write('\n')
abcf.write('# Set the maximum peer connections\n')
abcf.write('BtMaxPeers="25"\n')
abcf.write('\n')
abcf.write('# Set the maximum active downloads\n')
abcf.write('MaxDownloads="25"\n')
abcf.write('\n')
abcf.write('# Enable or disable encryptation (values: yes, no)\n')
abcf.write('Encryptation="yes"\n')
abcf.write('\n')
abcf.write('# Enable or disable RPC (values: yes, no)\n')
abcf.write('Rpc="yes"\n')
abcf.write('\n')
abcf.write('# Set port for RPC (when Rpc=yes)\n')
abcf.write('RpcPort="6800"\n')
abcf.write('\n')
abcf.write('# Enable or disable seeding (values: yes, no)\n')
abcf.write('Seeding="yes"\n')
abcf.write('\n')
abcf.write('# Set seed ratio (0.0 is infinite)\n')
abcf.write('SeedRatio="0.0"\n')
abcf.write('\n')
abcf.write('# Enable or disable debug mode\n')
abcf.write('aria2Debug="no"\n')
abcf.write('\n')
abcf.write('# Set debug level (values: debug, info, notice, warn, error)\n')
abcf.write('DebugLevel="info"\n')
abcf.write('\n')
abcf.write('# Set file allocation (values: none, prealloc, trunc, falloc)\n')
abcf.write('FileAllocation="none"\n')
abcf.write('\n')
abcf.write('# Enable or disable CA-Certificates (values: yes, no)\n')
abcf.write('CaCertificate="no"\n')
abcf.write('\n')
abcf.write('# Path for CA-Certificates (values: yes, no)\n')
abcf.write('CaCertificateFile="/etc/ssl/certs/ca-certificates.crt"\n')
abcf.close()
#Import variables from a2tm.conf
exec(open("a2tm.conf").read())
#Check input files
try:
if os.path.isfile(sys.argv[1]):
ClearScreen()
print ("")
print ("# a2tm v"+version+" **")
print ("")
print ("# File detected: "+sys.argv[1])
print ("")
InputFile=input("# Do you want to copy file to "+TorrentFiles+" directory (y/n): ")
if InputFile == "n":
print ("")
print ("# Exiting...")
else:
try:
shutil.copy(sys.argv[1], TorrentFiles)
print ("")
print ("# File copied successfully")
print ("")
PauseReturn=input("# Press ENTER to continue ")
print ("# Loading...")
except:
print ("")
print ("# Failed to copy the file")
print ("")
PauseReturn=input("# Press ENTER to continue ")
print ("# Loading...")
except:
print ("# No input files")
#Define aria2c variables
SpeedOptions="--max-overall-download-limit="+MaxSpeedDownload+" --max-overall-upload-limit="+MaxSpeedUpload
PeerOptions="--bt-max-peers="+BtMaxPeers
if CaCertificate == "no":
OtherOptions="-V -j " +MaxDownloads+" --file-allocation="+FileAllocation+" --auto-file-renaming=false --allow-overwrite=false"
elif CaCertificate == "yes":
OtherOptions="-V -j "+MaxDownloads+" --file-allocation="+FileAllocation+" --auto-file-renaming=false --allow-overwrite=false --ca-certificate="+CaCertificateFile
if Encryptation == "no":
TorrentOptions="--bt-require-crypto=false"
elif Encryptation == "yes":
TorrentOptions="--bt-min-crypto-level=arc4 --bt-require-crypto=true"
if Rpc == "no":
RpcOptions="--rpc-listen-all=false"
elif Rpc == "yes":
RpcOptions="--enable-rpc --rpc-listen-all=true --rpc-allow-origin-all --rpc-listen-port="+RpcPort
if Seeding == "no":
SeedOptions="--seed-time=0"
elif Seeding == "yes":
SeedOptions="--seed-ratio="+SeedRatio
if aria2Debug == "no":
AllOptions=TorrentOptions+" "+SpeedOptions+" "+PeerOptions+" "+RpcOptions+" "+SeedOptions
elif aria2debug == "yes":
AllOptions=TorrentOptions+" "+SpeedOptions+" "+PeerOptions+" "+RpcOptions+" "+SeedOptions+" --console-log-level="+DebugLevel
#Check if aria2 is installed
from subprocess import PIPE, Popen
try:
aria2Check = Popen(['aria2c', '-v'], stdout=PIPE, stderr=PIPE)
aria2Check.stderr.close()
except:
ClearScreen()
print ("")
print ("# Error: 'aria2' is not installed!")
print ("")
print ("# Builds:")
print (" * https://github.com/q3aql/aria2-static-builds/releases")
print (" * https://github.com/tatsuhiro-t/aria2/releases")
print ("")
PauseExit=input("# Press ENTER to exit ")
exit()
# Parameter start for run as service
try:
if sys.argv[1] == "start":
ClearScreen()
print ("")
print ("# Running aria2c (Ctrl + C to stop)")
if os.name == "posix":
os.chdir(TorrentFiles)
os.system('ls | grep ".torrent" > aria2-list.txt')
os.system("aria2c "+OtherOptions+" -i aria2-list.txt "+AllOptions+" -d "+TorrentFolder)
print ("")
print ("# Exiting...")
os._exit(0)
exit()
elif os.name == "nt":
#os.chdir(DiscFiles)
os.chdir(TorrentFiles)
os.system('dir /B | find ".torrent" > aria2-list.txt')
os.system("aria2c "+OtherOptions+" -i aria2-list.txt "+AllOptions+" -d "+TorrentFolder)
print ("")
print ("# Exiting...")
os._exit(0)
exit()
except:
print ("# Loading a2tm...")
#Show main menu
MainMenu = 1
while MainMenu <= 2:
ClearScreen()
print ("")
print ("# a2tm v"+version+" ##")
print ("")
print (" # Configuration File: "+ConfigFile)
print ("")
print (" # Path Downloads: "+TorrentFolder)
print (" # Torrent Files: "+TorrentFiles+FilesTorrent)
if os.name == "posix":
print (" # URLs File: "+TorrentFiles+"/urls.txt")
elif os.name == "nt":
print (" # URLs File: "+TorrentFiles+"\\urls.txt")
print (" # Download/Upload Speed: "+MaxSpeedDownload+"/"+MaxSpeedUpload)
print (" # Encryption: "+Encryptation)
print (" # RPC/Port: "+Rpc+"/"+RpcPort)
print (" # Maximum Peers/Downloads: "+BtMaxPeers+"/"+MaxDownloads)
print (" # Seeding/Ratio: "+Seeding+"/"+SeedRatio)
print (" # Debugging/Level: "+aria2Debug+"/"+DebugLevel)
print (" # CA-Certificate: "+CaCertificate+" ("+CaCertificateFile+")")
print (" # File allocation: "+FileAllocation)
print ("")
print ("# Options:")
print ("")
print (" r --> Run Aria2 Service")
print (" l --> List Torrent Files")
print (" m --> Create Torrent File From Magnet Link")
print (" u --> Run Aria2 From URLs File")
print (" q --> Quit")
print ("")
InputMenu=input("# Select Option (r/l/m/u/q): ")
#Options from InputMenu variable
if InputMenu == "r" or InputMenu == "1":
ClearScreen()
print ("")
print ("# Running aria2c (Ctrl + C to stop)")
if os.name == "posix":
os.chdir(TorrentFiles)
os.system('ls | grep ".torrent" > aria2-list.txt')
os.system("aria2c "+OtherOptions+" -i aria2-list.txt "+AllOptions+" -d "+TorrentFolder)
print ("")
PauseExit=input("# Press ENTER to return ")
print ("# Exiting...")
elif os.name == "nt":
#os.chdir(DiscFiles)
os.chdir(TorrentFiles)
os.system('dir /B | find ".torrent" > aria2-list.txt')
os.system("aria2c "+OtherOptions+" -i aria2-list.txt "+AllOptions+" -d "+TorrentFolder)
print ("")
PauseReturn=input("# Press ENTER to return ")
print ("# Exiting...")
elif InputMenu == "l" or InputMenu == "2":
ClearScreen()
print ("")
print ("# List of torrents that will be loaded:")
print ("")
if os.name == "posix":
os.system("ls "+TorrentFiles+" | grep '.torrent'")
elif os.name == "nt":
os.system('dir /B '+TorrentFiles+' | find ".torrent"')
print ("")
print ("# List of incomplete downloads:")
print ("")
if os.name == "posix":
os.system("ls "+TorrentFolder+" | grep '.aria2'")
elif os.name == "nt":
os.system('dir /B '+TorrentFolder+' | find ".aria2"')
print ("")
PauseReturn=input("# Press ENTER to return ")
print ("# Exiting...")
elif InputMenu == "m" or InputMenu == "3":
ClearScreen()
os.chdir(TorrentFiles)
print ("")
print ("# Make torrent file from Magnet-link")
print ("")
MagnetLink=input("# Type the Magnet-link (in quotes): ")
print ("")
os.system("aria2c --bt-metadata-only=true --bt-save-metadata=true -d "+TorrentFiles+" "+MagnetLink)
print ("")
PauseReturn=input("# Press ENTER to return ")
print ("# Exiting...")
elif InputMenu == "u" or InputMenu == "4":
os.chdir(TorrentFiles)
if os.path.isfile("urls.txt"):
print (TorrentFiles+"/urls.txt exists")
else:
urlsfile=open('urls.txt','w')
urlsfile.close()
urlsfile=open('urls.txt','a')
urlsfile.write("")
urlsfile.close()
ClearScreen()
print ("")
if os.name == "posix":
print ("# List URLs ("+TorrentFiles+"/urls.txt):")
elif os.name == "nt":
print ("# List URLs ("+TorrentFiles+"\\urls.txt):")
print ("")
readfile=open('urls.txt', 'r')
print(readfile.read())
readfile.close()
print ("")
LoadUrls=input("# Load URLs? (y/n): ")
if LoadUrls == "y":
ClearScreen()
print ("")
print ("# Running aria2c (Ctrl + C to stop)")
os.system("aria2c "+OtherOptions+" -i urls.txt "+AllOptions+" -d "+TorrentFolder)
print ("")
PauseReturn=input("+ Press ENTER to return ")
elif LoadUrls == "n":
print ("")
print ("# Exiting...")
else:
print ("")
print ("# Exiting...")
elif InputMenu == "q" or InputMenu == "5":
print ("")
print ("# Exiting...")
MainMenu += 2
else:
print ("")
print ("# Invalid Option")
print ("")
PauseReturn=input("# Press ENTER to return ")