pluGET/src/plugin_downloader.py

204 lines
7.6 KiB
Python
Raw Normal View History

import urllib.request
import cgi
import re
import cloudscraper
from web_request import doAPIRequest
def calculateFileSize(downloadFileSize):
fileSizeDownload = int(downloadFileSize)
fileSizeKb = fileSizeDownload / 1024
roundedFileSize = round(fileSizeKb, 2)
return roundedFileSize
# 28140 for Luckperms (Testing only)
def downloadPackageManual():
ressourceId = input("SpigotMC Ressource ID: ")
url = "https://api.spiget.org/v2/resources/" + ressourceId + "/download"
#url2 = "https://api.spiget.org/v2/resources/" + ressourceId + "/versions/latest/download"
#print(url2)
#user_agent = 'Mozilla/5.0 (X11; U; Linux i686) Gecko/20071127 Firefox/2.0.0.11'
#header = { 'User-agent': 'Mozilla/5.0 (X11; U; Linux i686) Gecko/20071127 Firefox/2.0.0.11', 'Accept-Encoding': 'gzip, deflate, br' }
#req = urllib.request.Request(url2, headers=header)
#remotefile = urlopen(req)
remotefile = urllib.request.urlopen(url)
filecontent = remotefile.info()['Content-Disposition']
filesize = remotefile.info()['Content-Length']
# getting original filename
value, params = cgi.parse_header(filecontent)
filename = params["filename"]
# creating file path
path = r"C:\\Users\Jan-Luca\Desktop\\"
ppath = path + filename
# download file
urllib.request.urlretrieve(url, ppath)
filesizeData = calculateFileSize(filesize)
print(f"Downloadsize: {filesizeData} MB")
# 89273
def handleRegexPackageName(packageNameFull):
packageNameFull2 = packageNameFull
# trims the part of the package that has for example "[1.1 Off]" in it
unwantedpackageName = re.search(r'(^\[+[a-zA-Z0-9\s\W*\.*\-*\+*\%*\,]*\]+)', packageNameFull)
unwantedpackageNamematch = bool(unwantedpackageName)
if unwantedpackageNamematch:
unwantedpackageNameString = unwantedpackageName.group()
packageNameFull2 = packageNameFull.replace(unwantedpackageNameString, '')
print(packageNameFull2)
print("packageNameFull2")
# gets the real packagename "word1 & word2" is not supported only gets word 1
packageName = re.search(r'([a-zA-Z]\d*)+(\s?\-*\_*[a-zA-Z]\d*\+*\-*\'*)+', packageNameFull2)
packageNameFullString = packageName.group()
packageNameOnly = packageNameFullString.replace(' ', '')
print(packageNameOnly)
print("packageNameOnly")
return packageNameOnly
def getlatestVersion(packageId):
url = f"https://api.spiget.org/v2/resources/{packageId}/versions/latest"
response = doAPIRequest(url)
packageVersion = response["name"]
return packageVersion
def apiCallTest(ressourceId):
url = f"https://api.spiget.org/v2/resources/{ressourceId}"
response = doAPIRequest(url)
print(response)
packageName = response["name"]
packageTag = response["tag"]
print(packageName)
print(packageTag)
packageNameNew = handleRegexPackageName(packageName)
print(packageNameNew)
# check version
def compareVersions():
#https://api.spiget.org/v2/resources/28140/versions/latest
# compare latest package version with installed package version
print("compareVersions")
def getVersionID(packageId, packageVersion):
url = f"https://api.spiget.org/v2/resources/{packageId}/versions?size=100&sort=-name"
versionList = doAPIRequest(url)
for packages in versionList:
packageUpdate = packages["name"]
versionId = packages["id"]
if packageUpdate == packageVersion:
return versionId
return versionList[0]["id"]
def getVersionName(packageId, versionId):
url = f"https://api.spiget.org/v2/resources/{packageId}/versions/{versionId}"
response = doAPIRequest(url)
versionName = response["name"]
return versionName
def searchPackage(ressourceName):
url = f"https://api.spiget.org/v2/search/resources/{ressourceName}?field=name"
packageName = doAPIRequest(url)
print(url)
i = 1
print("Index / Name / Description / Downloads")
for ressource in packageName:
pName = ressource["name"]
pTag = ressource["tag"]
pDownloads = ressource["downloads"]
print(f" [{i}] {pName} / {pTag}/ {pDownloads}")
i = i + 1
ressourceSelected = int(input(" Select your wanted Ressource: "))
ressourceSelected = ressourceSelected - 1
fileInfo = packageName[ressourceSelected]["file"]
packageUrl = fileInfo["url"]
ressourceId = packageName[ressourceSelected]["id"]
print(packageUrl)
print(ressourceId)
def downloadLatestVersion(ressourceId, packageDownloadName, sourcePath):
url = f"https://api.spiget.org/v2/resources/{ressourceId}/download"
remotefile = urllib.request.urlopen(url)
filesize = remotefile.info()['Content-Length']
downloadPath = sourcePath + packageDownloadName
urllib.request.urlretrieve(url, downloadPath)
filesizeData = calculateFileSize(filesize)
print(filesizeData)
print(filesize)
print(f" Downloadsize: {filesizeData} KB")
def downloadSpecificVersion(ressourceId, packageDownloadName, versionId, sourcePath):
url = f"https://spigotmc.org/resources/{ressourceId}/download?version={versionId}"
#url = f"https://api.spiget.org/v2/resources/{ressourceId}/versions/{versionId}/download"
downloadPath = sourcePath + packageDownloadName
#local_filename = url.split('/')[-1]
# NOTE the stream=True parameter below
with CLOUDSCRAPER.get(url, stream=True) as r:
#r.raise_for_status()
with open(downloadPath, 'wb') as fd:
for chunk in r.iter_content(chunk_size=128):
fd.write(chunk)
#return downloadPath
#remotefile = urllib.request.urlopen(url)
#cloudscraper.requests.get()
#filesize = remotefile.info()['Content-Length']
#urllib.request.urlretrieve(url, downloadPath)
#filesizeData = calculateFileSize(filesize)
#print(filesizeData)
#print(filesize)
#print(f" Downloadsize: {filesizeData} KB")
def getPackageVersion(ressourceId, packageVersion, downloadPath):
#ressourceId = input(" SpigotMC Ressource ID: ")
CLOUDSCRAPER = createCloudScraperInstance()
url = f"https://api.spiget.org/v2/resources/{ressourceId}"
packageDetails = doAPIRequest(url)
packageName = packageDetails["name"]
#packageTag = packageDetails["tag"]
packageNameNew = handleRegexPackageName(packageName)
versionId = getVersionID(ressourceId, packageVersion)
packageVersion = getVersionName(ressourceId, versionId)
#packageVersion = getlatestVersion(ressourceId)
packageDownloadName = f"{packageNameNew}-{packageVersion}.jar"
downloadSpecificVersion(ressourceId, packageDownloadName, versionId, downloadPath)
def getLatestPackageVersionInteractive(downloadPath):
ressourceId = input(" SpigotMC Ressource ID: ")
url = f"https://api.spiget.org/v2/resources/{ressourceId}"
packageDetails = doAPIRequest(url)
packageName = packageDetails["name"]
#packageTag = packageDetails["tag"]
packageNameNew = handleRegexPackageName(packageName)
packageVersion = getlatestVersion(ressourceId)
packageDownloadName = f"{packageNameNew}-{packageVersion}.jar"
downloadLatestVersion(ressourceId, packageDownloadName, downloadPath)
def createCloudScraperInstance():
global CLOUDSCRAPER
CLOUDSCRAPER = cloudscraper.create_scraper(interpreter='nodejs',debug=True) # returns a CloudScraper instance
return CLOUDSCRAPER
# get latest update > https://api.spiget.org/v2/resources/28140/updates/latest
# this also > https://api.spiget.org/v2/resources/28140/versions/latest
# get latest download with correct name > https://api.spiget.org/v2/resources/28140/versions/latest/download cloudflare protected
# query for a plugin https://api.spiget.org/v2/search/resources/luckperms?field=name