This repository has been archived on 2024-07-30. You can view files and clone it, but cannot push or open issues or pull requests.
python-aternos/python_aternos/atfm.py

154 lines
3.6 KiB
Python
Raw Normal View History

import lxml.html
from typing import Union, Optional, List
2021-10-15 19:31:47 +04:00
from typing import TYPE_CHECKING
2022-03-18 18:38:36 +04:00
from .atfile import AternosFile, FileType
2021-10-15 19:31:47 +04:00
if TYPE_CHECKING:
2022-03-18 18:38:36 +04:00
from .atserver import AternosServer
2021-10-15 19:31:47 +04:00
2022-03-18 18:38:36 +04:00
class FileManager:
"""Aternos file manager class for viewing files structure
:param atserv: :class:`python_aternos.atserver.AternosServer` instance
:type atserv: python_aternos.atserver.AternosServer
"""
2021-10-15 19:31:47 +04:00
def __init__(self, atserv:'AternosServer') -> None:
self.atserv = atserv
2022-03-18 18:38:36 +04:00
def listdir(self, path:str='') -> List[AternosFile]:
"""Requests a list of files
in the specified directory
:param path: Directory
(an empty string means root), defaults to ''
:type path: str, optional
:return: List of :class:`python_aternos.atfile.AternosFile`
:rtype: List[AternosFile]
"""
path = path.lstrip('/')
filesreq = self.atserv.atserver_request(
2022-03-18 18:38:36 +04:00
f'https://aternos.org/files/{path}', 'GET'
)
filestree = lxml.html.fromstring(filesreq.content)
fileslist = filestree.xpath('//div[contains(concat(" ",normalize-space(@class)," ")," file ")]')
files = []
for f in fileslist:
2022-03-25 16:45:38 +04:00
ftype_raw = f.xpath('@data-type')[0]
2022-03-18 18:38:36 +04:00
ftype = FileType.file \
if ftype_raw == 'file' \
2022-03-18 18:38:36 +04:00
else FileType.directory
2022-03-25 16:45:38 +04:00
fsize_raw = f.xpath('./div[@class="filesize"]')
fsize = 0
if len(fsize_raw) > 0:
fsize_text = fsize_raw[0].text.strip()
fsize_num = fsize_text[:fsize_text.rfind(' ')]
fsize_msr = fsize_text[fsize_text.rfind(' ')+1:]
2021-10-14 18:41:57 +04:00
try:
2022-03-18 18:38:36 +04:00
fsize = self.convert_size(float(fsize_num), fsize_msr)
2021-10-14 18:41:57 +04:00
except ValueError:
fsize = -1
2022-03-25 16:45:38 +04:00
fullpath = f.xpath('@data-path')[0]
filepath = fullpath[:fullpath.rfind('/')]
filename = fullpath[fullpath.rfind('/'):]
files.append(
2022-03-18 18:38:36 +04:00
AternosFile(
self.atserv,
filepath, filename,
2022-03-25 16:45:38 +04:00
ftype, fsize
)
)
return files
def convert_size(self, num:Union[int,float], measure:str) -> float:
"""Converts "human" file size to size in bytes
:param num: Size
:type num: Union[int,float]
:param measure: Units (B, kB, MB, GB)
:type measure: str
:return: Size in bytes
:rtype: float
"""
measure_match = {
'B': 1,
'kB': 1000,
'MB': 1000000,
'GB': 1000000000
}
try:
return num * measure_match[measure]
except KeyError:
return -1
def get_file(self, path:str) -> Optional[AternosFile]:
"""Returns :class:`python_aternos.atfile.AternosFile`
instance by its path
:param path: Path to file including its filename
:type path: str
:return: _description_
:rtype: Optional[AternosFile]
"""
filepath = path[:path.rfind('/')]
filename = path[path.rfind('/'):]
2022-03-18 18:38:36 +04:00
filedir = self.listdir(filepath)
for file in filedir:
if file.name == filename:
return file
return None
def dl_file(self, path:str) -> bytes:
"""Returns the file content in bytes (downloads it)
:param path: Path to file including its filename
:type path: str
:return: File content
:rtype: bytes
"""
file = self.atserv.atserver_request(
f'https://aternos.org/panel/ajax/files/download.php?' + \
f'file={path.replace("/","%2F")}',
2022-03-18 18:38:36 +04:00
'GET'
)
return file.content
def dl_world(self, world:str='world') -> bytes:
"""Returns the world zip file content
by its name (downloads it)
:param world: Name of world, defaults to 'world'
:type world: str, optional
:return: Zip file content
:rtype: bytes
"""
world = self.atserv.atserver_request(
f'https://aternos.org/panel/ajax/worlds/download.php?' + \
f'world={world.replace("/","%2F")}',
2022-03-18 18:38:36 +04:00
'GET'
)
return world.content