57 lines
2.1 KiB
Python
57 lines
2.1 KiB
Python
from MoodleClasses.MoodleActivity import MoodleActivity
|
|
from urllib.parse import unquote
|
|
import pathvalidate
|
|
import requests
|
|
import os
|
|
|
|
|
|
class MoodleFile:
|
|
def __init__(self, parent_activity: MoodleActivity, url: str):
|
|
self.parent_activity = parent_activity
|
|
self.url = url
|
|
self.directory = self._get_directory()
|
|
self.filepath = self._get_filepath()
|
|
self.extension = str(self.filepath).split(".")[-1]
|
|
|
|
def _get_directory(self) -> os.path:
|
|
directory = os.path.join(self.parent_activity.parent_dir, self.parent_activity.name)
|
|
return pathvalidate.sanitize_filepath(directory)
|
|
|
|
def _get_filepath(self, filename: str=None) -> os.path:
|
|
if filename is None:
|
|
file = os.path.join(self.directory, unquote(self.url.split('/')[-1]))
|
|
else:
|
|
file = os.path.join(self.directory, filename)
|
|
return pathvalidate.sanitize_filepath(file)
|
|
|
|
def _decide_download(self, ignore_extension: list[str]) -> bool:
|
|
if ignore_extension is not None and self.extension in ignore_extension:
|
|
return False
|
|
if os.path.exists(self.filepath):
|
|
return False
|
|
return True
|
|
|
|
def _download(self, s: requests.Session) -> bool:
|
|
if not os.path.exists(self.directory):
|
|
os.makedirs(self.directory)
|
|
try:
|
|
with s.get(self.url, stream=True) as r:
|
|
with open(self.filepath+".part", 'wb') as f:
|
|
for chunk in r.iter_content(chunk_size=8192):
|
|
f.write(chunk)
|
|
os.rename(self.filepath+".part", self.filepath)
|
|
if os.path.exists(self.filepath + ".part"):
|
|
os.remove(self.filepath + ".part")
|
|
except Exception as e:
|
|
if os.path.exists(self.filepath+".part"):
|
|
os.remove(self.filepath+".part")
|
|
return False
|
|
finally:
|
|
return True
|
|
|
|
def download(self, s: requests.Session, ignore_extension: list[str]) -> bool:
|
|
if self._decide_download(ignore_extension):
|
|
return self._download(s)
|
|
else:
|
|
return True
|