diff --git a/downloads/scan-downloads.sh b/downloads/scan-downloads.sh new file mode 100755 index 0000000..f98ecc3 --- /dev/null +++ b/downloads/scan-downloads.sh @@ -0,0 +1,3 @@ +#!/bin/bash +mkdir -p $HOME/.clamscan/ +clamscan -r --remove --log=$HOME/.clamscan/$(date +"%Y%m%d-%H%M%S").log /mnt/data/downloads diff --git a/downloads/sort-downloads.py b/downloads/sort-downloads.py new file mode 100755 index 0000000..50a461a --- /dev/null +++ b/downloads/sort-downloads.py @@ -0,0 +1,95 @@ +#!/usr/bin/env python +# - generated, gpt3.5 + +import os +import shutil +import sys +import datetime +from pathlib import Path + +# Configurable variables +MOVIES_EXTENSION = {".mkv", ".mp4", ".avi"} +MUSIC_EXTENSION = {".mp3", ".ogg", ".flac", ".wma", ".wav"} +EPISODIC_THRESHOLD = 1 # Maximum number of video files to consider as episodic (inclusive) +MOVIES_PATH = "Movies" +MUSIC_PATH = "Music" +SHOWS_PATH = "Shows" + +def organize_folders(directory, root_path): + log_file = create_log_file(directory, root_path) + write_log(log_file, f"Organizing folders in {directory}") + + actions = preview_actions(directory, root_path) + if confirm_actions(actions): + execute_actions(actions, log_file) + else: + log_file.close() + os.remove(log_file.name) + print("Log file deleted.") + + log_file_path = os.path.abspath(log_file.name) + print(f"Log file saved at: {log_file_path}") + +def preview_actions(directory, root_path): + actions = [] + + for folder_name in os.listdir(directory): + folder_path = os.path.join(directory, folder_name) + + if os.path.isdir(folder_path): + file_types = set() + + for file in os.listdir(folder_path): + file_extension = Path(file).suffix.lower() + file_types.add(file_extension) + + if MOVIES_EXTENSION.intersection(file_types) and len(file_types) <= EPISODIC_THRESHOLD: + actions.append((folder_path, os.path.join(root_path, MOVIES_PATH, folder_name))) + elif len(file_types.intersection(MUSIC_EXTENSION)) == len(file_types): + actions.append((folder_path, os.path.join(root_path, MUSIC_PATH, folder_name))) + elif len(file_types) > EPISODIC_THRESHOLD: + actions.append((folder_path, os.path.join(root_path, SHOWS_PATH, folder_name))) + + return actions + +def confirm_actions(actions): + print("Preview of actions:") + for source, destination in actions: + print(f"Move: {source} -> {destination}") + + user_input = input("Do you want to proceed with the above actions? (y/n): ").lower() + return user_input == "y" + +def execute_actions(actions, log_file): + for source, destination in actions: + message = f"Moving {os.path.basename(source)} to {destination}" + write_log(log_file, message) + print(message) + shutil.move(source, destination) + +def move_folder(folder_path, destination): + if not os.path.exists(destination): + os.makedirs(destination) + shutil.move(folder_path, os.path.join(destination, os.path.basename(folder_path))) + +def create_log_file(directory, root_path): + current_time = datetime.datetime.now().strftime("%y%m%d_%H%M%S") + log_file_name = f"{current_time}.log" + log_file_path = os.path.join(root_path, directory, log_file_name) + return open(log_file_path, "w") + +def write_log(log_file, message): + timestamp = datetime.datetime.now().strftime("[%Y-%m-%d %H:%M:%S]") + log_message = f"{timestamp} {message}\n" + log_file.write(log_message) + print(log_message, end="") + +if __name__ == "__main__": + if len(sys.argv) != 3: + print("Usage: ./organize_folders.py ") + sys.exit(1) + + directory = sys.argv[1] + root_path = sys.argv[2] + organize_folders(directory, root_path) + diff --git a/ytdl-music.sh b/downloads/ytdl-music.sh similarity index 100% rename from ytdl-music.sh rename to downloads/ytdl-music.sh