Refactor main script. Add logging.

This commit is contained in:
2024-10-04 21:44:45 -04:00
parent cd912319e9
commit 4522ca50d8
2 changed files with 155 additions and 43 deletions

40
dm_logs.py Normal file
View File

@@ -0,0 +1,40 @@
"""
Logging module for the Download Manager
Written by Jadon Yack
"""
import logging
class dm_logger_t:
def dm_logs_init(self):
"""Initialize logger."""
self.dm_logger = logging.getLogger('dm_logger')
self.dm_logger.setLevel(logging.INFO)
dm_console = logging.StreamHandler()
dm_logfile = logging.FileHandler('dm.log')
dm_format = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
dm_console.setFormatter(dm_format)
dm_logfile.setFormatter(dm_format)
self.dm_logger.addHandler(dm_console)
self.dm_logger.addHandler(dm_logfile)
self.dm_logger.info('Logger initialized.')
def dm_log_info(self, string: str):
"""Print info log."""
self.dm_logger.info(string)
def dm_log_err(self, string: str):
"""Print error log."""
self.dm_logger.error(string)
def dm_log_debug(self, string: str):
"""Print debug log."""
self.dm_logger.debug(string)
def __init__(self):
self.dm_logs_init()

View File

@@ -1,28 +1,76 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
# This is a Python script that automates the management of the Downloads folder """
# for an organized experience. It will sort images, videos, documents, and ISO This is a Python script that automates the management of the Downloads folder
# files on download. for an organized experience. It will sort images, videos, documents, and ISO
# files on download.
# Written by Jadon Yack (jyack)
from os import scandir, getlogin, rename Written by Jadon Yack (jyack)
from os.path import splitext, exists, join, isfile """
from os import scandir, getlogin
from os.path import split, splitext, exists, isfile
from shutil import move as mv from shutil import move as mv
from time import sleep from time import sleep
import threading
import logging
from watchdog.observers import Observer from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler from watchdog.events import FileSystemEventHandler
user = getlogin() from dm_logs import dm_logger_t
src_dir = f"/home/{user}/Downloads"
img_dst = f"/home/{user}/Pictures/DownloadedImages"
vid_dst = f"/home/{user}/Videos"
doc_dst = f"/home/{user}/Documents"
iso_dst = f"/home/{user}/ISOs"
def makeUniq(file, dst, name): user = getlogin()
src_dir = f"/home/{user}/Downloads/"
img_dst = f"/home/{user}/Pictures/DownloadedImages/"
vid_dst = f"/home/{user}/Videos/"
doc_dst = f"/home/{user}/Documents/"
iso_dst = f"/home/{user}/ISOs/"
dm_logger = dm_logger_t()
file_types = {
'image': [
'.jpg',
'.jpeg',
'.png',
'.gif',
'.bmp',
'.tiff',
'.svg',
'.webp',
'.ico',
'.heic',
'.psd'
],
'video': [
'.mp4',
'.mkv',
'.avi',
'.mov',
'.wmv',
'.flv',
'.webm',
'.mpeg',
'.mpg',
'.m4v',
'.3gp'
],
'doc': [
'.pdf',
'.doc',
'.docx',
'.txt',
'.rtf',
'.odt',
'.ppt',
'.pptx',
'.xls',
'.xlsx',
'.csv',
'.epub'
]
}
def makeUniq(dst, name):
filename, extension = splitext(name) filename, extension = splitext(name)
counter = 1 counter = 1
uniq_name = name uniq_name = name
@@ -31,44 +79,68 @@ def makeUniq(file, dst, name):
uniq_name = f"{filename}({counter}){extension}" uniq_name = f"{filename}({counter}){extension}"
counter += 1 counter += 1
dm_logger.dm_log_info(f'Generated unique file name {uniq_name}')
return uniq_name return uniq_name
def move(entry, name, dst_dir): def move(event, name, dst_dir):
# Generate a unique file name and move the file to the destination # Generate a unique file name and move the file to the destination
# directory # directory
uniq_name = makeUniq(entry, dst_dir, name) uniq_name = makeUniq(dst_dir, name)
# Check that entry is a file before moving it # Check that event is a file before moving it
if (isfile(entry.path)): if isfile(event.src_path):
mv(entry.path, f"{dst_dir}/{uniq_name}") mv(event.src_path, f"{dst_dir}/{uniq_name}")
dm_logger.dm_log_info(f"Moved file {uniq_name} to {dst_dir}")
else:
dm_logger.dm_log_err(f"ERROR: {name} not a file")
class FileHandler(FileSystemEventHandler): class FileHandler(FileSystemEventHandler):
def on_modified(self, event): def __init__(self, buffer_time=5):
with scandir(src_dir) as entries: self.events = []
for entry in entries: self.buffer_time = buffer_time
name = entry.name self.lock = threading.Lock()
dst = src_dir self.timer = None
# If entry is an image
if name.endswith('.jpg') or name.endswith('.jpeg') or name.endswith('.png'): def on_created(self, event):
with self.lock:
dm_logger.dm_log_debug(f"Found new file {event.src_path}")
self.events.append(event)
if not self.timer:
self.timer = threading.Timer(self.buffer_time,
self.process_event)
self.timer.start()
def process_event(self):
with self.lock:
dm_logger.dm_log_info(f'Processing {len(self.events)} files...')
for event in self.events:
file_name = split(event.src_path)[1]
file_extension = splitext(file_name)[1]
dst = src_dir
dm_logger.dm_log_debug(f"Sorting {file_name}...")
# If event is an image
if file_extension in file_types['image']:
dst = img_dst dst = img_dst
move(entry, name, dst) move(event, file_name, dst)
# If entry is a video # If event is a video
elif name.endswith('.mp4') or name.endswith('.mov'): elif file_extension in file_types['video']:
dst = vid_dst dst = vid_dst
move(entry, name, dst) move(event, file_name, dst)
# If entry is a document # If event is a document
elif name.endswith('.docx') or name.endswith('.pdf'): elif file_extension in file_types['doc']:
dst = doc_dst dst = doc_dst
move(entry, name, dst) move(event, file_name, dst)
# If entry is an ISO file # If event is an ISO file
elif name.endswith('.iso'): elif file_extension == 'iso':
dst = iso_dst dst = iso_dst
move(entry, name, dst) move(event, file_name, dst)
self.events = []
self.timer = None
if __name__ == "__main__": if __name__ == "__main__":
logging.basicConfig(level=logging.INFO, dm_logger.dm_log_info('Starting watchdog module...')
format='%(asctime)s - %(message)s',
datefmt='%Y-%m-%d %H:%M:%S')
path = src_dir path = src_dir
event_handler = FileHandler() event_handler = FileHandler()
observer = Observer() observer = Observer()
@@ -76,7 +148,7 @@ if __name__ == "__main__":
observer.start() observer.start()
try: try:
while True: while True:
sleep(10) sleep(3)
except KeyboardInterrupt: except KeyboardInterrupt:
observer.stop() observer.stop()
observer.join() observer.join()