Files
MoodleScraper/MoodleClasses/MoodleFile.py

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