Skip to content

Commit

Permalink
KeyboardInterrupt + better logging + best server
Browse files Browse the repository at this point in the history
  • Loading branch information
NohamR committed Sep 21, 2024
1 parent efd6a88 commit 26dda55
Show file tree
Hide file tree
Showing 3 changed files with 108 additions and 24 deletions.
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ gofilecli -d https://gofile.io/d/XXXXX # to download a folder
```

# To do :
- KeyboardInterrupt + Lost connexion
- error-rateLimit
- env via CLI
- finish README.md
Expand Down
130 changes: 106 additions & 24 deletions gofilecli.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,36 @@
import subprocess
import sys
import simpleaudio as sa
import ping3


def reqst(url, method ,headers=None, data=None, files=None, params=None, json=None, logger=None):
try:
if method == "get":
response = requests.get(url, headers=headers, data=data, params=params, json=json)
elif method == "post":
response = requests.post(url, headers=headers, data=data, files=files, params=params, json=json)
elif method == "put":
response = requests.put(url, headers=headers, data=data, files=files, params=params, json=json)
elif method == "delete":
response = requests.delete(url, headers=headers, data=data, files=files, params=params, json=json)
json_response = response.json() # If response content is not JSON, this will raise a ValueError
return json_response
except requests.exceptions.HTTPError as http_err:
logger.error(f"HTTP error occurred: {http_err}") # Handles HTTP errors (e.g., 404, 500)
sys.exit()
except requests.exceptions.ConnectionError as conn_err:
logger.error(f"Connection error occurred: {conn_err}") # Handles network-related errors
sys.exit()
except requests.exceptions.Timeout as timeout_err:
logger.error(f"Timeout error occurred: {timeout_err}") # Handles request timeouts
sys.exit()
except requests.exceptions.RequestException as req_err:
logger.error(f"An error occurred: {req_err}") # Catches any other requests-related errors
sys.exit()
except ValueError as json_err:
logger.error(f"JSON decode error: {json_err}") # Handles issues with JSON decoding
sys.exit()


def play_sound():
Expand Down Expand Up @@ -99,7 +129,8 @@ def check_folderPath(path):

def getservers(logger):
servers = []
response = requests.get("https://api.gofile.io/servers").json()
# response = requests.get("https://api.gofile.io/servers").json()
response = reqst("https://api.gofile.io/servers", logger=logger, method="get")
if response["status"] == "ok":
for server in response["data"]["servers"]:
servers.append(server["name"])
Expand All @@ -110,22 +141,60 @@ def getservers(logger):
return None


def ping_server(url, count=4):
response_times = []
for _ in range(count):
response_time = ping3.ping(url)
if response_time:
response_times.append(response_time)
time.sleep(0.2)
if response_times:
avg_response = sum(response_times) / len(response_times)
return avg_response
else:
return float('inf')


def test_servers(servers, logger):
best_server = None
best_time = float('inf')
for server in servers:
logger.debug(f"Pinging {server}...")
url = f"{server}.gofile.io"
avg_time = ping_server(url)
logger.debug(f"Average response time for {server}: {avg_time:.2f} ms")
if avg_time < best_time:
best_time = avg_time
best_server = server
if best_server:
logger.debug(f"\nThe best server is {best_server} with an average response time of {best_time:.2f} ms.")
else:
logger.error("All pings failed.")
return best_server


def get_stats(logger):
headers = {'authorization': f'Bearer {TOKEN}',}
data = requests.get(f'https://api.gofile.io/accounts/{ACCOUNT_ID}', headers=headers).json()
stats = data["data"]["statsCurrent"]
logger.info("Account stats:")
logger.info(f"Total files: {stats['fileCount']}")
logger.info(f"Total folders: {stats['folderCount']}")
size = file_size(num_bytes=stats['storage'])
logger.info(f"Total size: {size}")
traffic = file_size(num_bytes=stats['trafficWebDownloaded'])
logger.info(f"Total traffic: {traffic}")
# data = requests.get(f'https://api.gofile.io/accounts/{ACCOUNT_ID}', headers=headers).json()
data = reqst(f'https://api.gofile.io/accounts/{ACCOUNT_ID}', headers=headers, logger=logger, method="get")
if data["status"] == "ok":
stats = data["data"]["statsCurrent"]
logger.info("Account stats:")
logger.info(f"Total files: {stats['fileCount']}")
logger.info(f"Total folders: {stats['folderCount']}")
size = file_size(num_bytes=stats['storage'])
logger.info(f"Total size: {size}")
traffic = file_size(num_bytes=stats['trafficWebDownloaded'])
logger.info(f"Total traffic: {traffic}")
else:
logger.error(f"{data}")
return None


def get_rootfolder(logger):
headers = {'authorization': f'Bearer {TOKEN}',}
data = requests.get(f'https://api.gofile.io/accounts/{ACCOUNT_ID}', headers=headers).json()
# data = requests.get(f'https://api.gofile.io/accounts/{ACCOUNT_ID}', headers=headers).json()
data = reqst(f'https://api.gofile.io/accounts/{ACCOUNT_ID}', headers=headers, logger=logger, method="get")
root_folder = data.get("data", {}).get("rootFolder", {})
if root_folder:
return root_folder
Expand All @@ -137,7 +206,8 @@ def get_rootfolder(logger):
def get_code(folderId, logger):
headers = {'authorization': f'Bearer {TOKEN}',}
params = (('wt', '4fd6sg89d7s6'),('cache', 'false'),)
data = requests.get(f'https://api.gofile.io/contents/{folderId}', headers=headers, params=params).json()
# data = requests.get(f'https://api.gofile.io/contents/{folderId}', headers=headers, params=params).json()
data = reqst(f'https://api.gofile.io/contents/{folderId}', headers=headers, params=params, logger=logger, method="get")
code = data.get("data", {}).get("code", {})
if code:
return code
Expand All @@ -149,7 +219,8 @@ def get_code(folderId, logger):
def get_children(id, logger):
headers = {'authorization': f'Bearer {TOKEN}',}
params = (('wt', '4fd6sg89d7s6'),('cache', 'false'),)
data = requests.get(f'https://api.gofile.io/contents/{id}', headers=headers, params=params).json()
# data = requests.get(f'https://api.gofile.io/contents/{id}', headers=headers, params=params).json()
data = reqst(f'https://api.gofile.io/contents/{id}', headers=headers, params=params, logger=logger, method="get")
children = data.get("data", {}).get("children", {})
if children:
return children
Expand All @@ -169,7 +240,8 @@ def createfolder(parentFolderId, folderName, logger):
data = {"parentFolderId": parentFolderId, "folderName": folderName}
else:
data = {"parentFolderId": parentFolderId}
response = requests.post("https://api.gofile.io/contents/createFolder", headers=headers, json=data).json()
# response = requests.post("https://api.gofile.io/contents/createFolder", headers=headers, json=data).json()
response = reqst("https://api.gofile.io/contents/createFolder", headers=headers, json=data, logger=logger, method="post")
if response["status"] == "ok":
name = response["data"]["name"]
code = response["data"]["code"]
Expand All @@ -188,7 +260,8 @@ def uploadfile(serverName, folderId, filePath, logger):
'folderId': (None, folderId),
}
start_time = time.time()
response = requests.post(f"https://{serverName}.gofile.io/contents/uploadfile", headers=headers, files=files).json()
# response = requests.post(f"https://{serverName}.gofile.io/contents/uploadfile", headers=headers, files=files).json()
response = reqst(f"https://{serverName}.gofile.io/contents/uploadfile", headers=headers, files=files, logger=logger, method="post")
speed, elapsed_time = calculate_upload_speed(filePath, start_time)
if response["status"] == "ok":
logger.debug(response)
Expand All @@ -202,10 +275,11 @@ def uploadfile(serverName, folderId, filePath, logger):
return None


def actionFolder(folderId, attributeValue):
def actionFolder(folderId, attributeValue, logger):
headers = {"Content-Type": "application/json", "Authorization": f"Bearer {TOKEN}"}
data = {"attribute": "public", "attributeValue": attributeValue}
response = requests.put(f"https://api.gofile.io/contents/{folderId}/update", headers=headers, json=data).json()
# response = requests.put(f"https://api.gofile.io/contents/{folderId}/update", headers=headers, json=data).json()
response = reqst(f"https://api.gofile.io/contents/{folderId}/update", headers=headers, json=data, logger=logger, method="put")
if response["status"] == "ok":
return True
else:
Expand All @@ -230,7 +304,10 @@ def upload(filePath, folderPath, folderName, parentFolderId, private, logger):

servers = getservers(logger)
if servers:
serverName = random.choice(servers)
if len(servers) > 1:
serverName = test_servers(servers, logger)
else:
serverName = servers[0]
logger.debug(f"Selected server: {serverName}")

if folderName and parentFolderId:
Expand All @@ -247,25 +324,25 @@ def upload(filePath, folderPath, folderName, parentFolderId, private, logger):
parentFolderId = parentFolderId
logger.debug(f"FolderId: {parentFolderId}")
else:
parentFolderId = None
parentFolderId = PRIVATE_PARENT_ID
logger.debug(f"FolderId: {parentFolderId}")

for file in files:
if parentFolderId:
logger.info(f"Uploading file: '{file}' ({file_size(file)}) to: '{parentFolderId}' on: '{serverName}'")
else:
logger.info(f"Uploading file: {file} ({file_size(file)}) on: {serverName}")
logger.info(f"Uploading file: '{file}' ({file_size(file)}) on: '{serverName}'")
downloadPage, parentFolderId, speed, elapsed_time = uploadfile(serverName, parentFolderId, file, logger)
logger.info(f"File uploaded to: {downloadPage} in {elapsed_time} at {speed}")

if not private:
action = actionFolder(parentFolderId, "true")
action = actionFolder(parentFolderId, "true", logger)
if action:
logger.info("Folder made public")
else:
logger.error(f"{action}")
else:
action = actionFolder(parentFolderId, "false")
action = actionFolder(parentFolderId, "false", logger)
if action:
logger.info("Folder made private")
else:
Expand All @@ -279,7 +356,8 @@ def upload(filePath, folderPath, folderName, parentFolderId, private, logger):
def downloadFile(downloadUrl, path, logger):
start_time = time.time()
headers = {"Authorization": f"Bearer {TOKEN}"}
response = requests.get(downloadUrl, headers=headers)
# response = requests.get(downloadUrl, headers=headers)
response = reqst(downloadUrl, headers=headers, logger=logger, method="get")
with open(path, "wb") as f:
f.write(response.content)
logger.debug(f"File downloaded: {path}")
Expand Down Expand Up @@ -424,4 +502,8 @@ def init():


if __name__ == "__main__":
init()
try:
init()
except KeyboardInterrupt:
print("\nExiting...")
sys.exit()
1 change: 1 addition & 0 deletions requirements.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
cryptography==39.0.1
ping3==4.0.8
python-dotenv==1.0.1
Requests==2.32.3
simpleaudio==1.0.4

0 comments on commit 26dda55

Please sign in to comment.