diff --git a/mediacurator/curator.py b/mediacurator/curator.py index 70f2a7a..c551585 100755 --- a/mediacurator/curator.py +++ b/mediacurator/curator.py @@ -11,11 +11,13 @@ import sys -from library.bcolors import BColors from library.video import Video from library.medialibrary import MediaLibrary from library.tools import detect_ffmpeg, user_confirm +import colorama +colorama.init() + def main(): ''' MediaCurator's main function @@ -23,14 +25,14 @@ def main(): # confirm that the command has enough parameters if len(sys.argv) < 2: - print(f"{BColors.FAIL}ERROR: Command not understood, please see documentation.{BColors.ENDC}") + print(f"{colorama.Fore.RED}ERROR: Command not understood, please see documentation.{colorama.Style.RESET_ALL}") # confirm that ffmpeg in indeed installed ffmpeg_version = detect_ffmpeg() if not ffmpeg_version: - print(f"{BColors.FAIL}No ffmpeg version detected{BColors.ENDC}") + print(f"{colorama.Fore.RED}No ffmpeg version detected{colorama.Style.RESET_ALL}") exit() - print(f"{BColors.OKBLUE}ffmpeg version detected: {ffmpeg_version}{BColors.ENDC}") + print(f"{colorama.Fore.BLUE}ffmpeg version detected: {ffmpeg_version}{colorama.Style.RESET_ALL}") # Get/load command parameters directories = [] @@ -43,9 +45,9 @@ def main(): for arg in sys.argv: # Confirm with the user that he selected to delete found files if "-del" in arg: - print(f"{BColors.WARNING}WARNING: Delete option selected!{BColors.ENDC}") - if not user_confirm(f"{BColors.WARNING}Are you sure you wish to delete all found results after selected operations are succesfull ? [Y/N] ?{BColors.ENDC}"): - print(f"{BColors.OKGREEN}Exiting!{BColors.ENDC}") + print(f"{colorama.Fore.YELLOW}WARNING: Delete option selected!{colorama.Style.RESET_ALL}") + if not user_confirm(f"Are you sure you wish to delete all found results after selected operations are succesfull ? [Y/N] ?", color="yellow"): + print(f"{colorama.Fore.GREEN}Exiting!{colorama.Style.RESET_ALL}") exit() elif "-in:" in arg: inputs += arg[4:].split(",") @@ -66,7 +68,7 @@ def main(): elif len(directories) > 0: medialibrary = MediaLibrary(directories = directories, inputs = inputs, filters = filters) else: - print(f"{BColors.FAIL}ERROR: No files or directories selected.{BColors.ENDC}") + print(f"{colorama.Fore.RED}ERROR: No files or directories selected.{colorama.Style.RESET_ALL}") # Actions @@ -80,12 +82,12 @@ def main(): if medialibrary.videos[filepath].useful: if "formated" in printop or "verbose" in printop: if medialibrary.videos[filepath].error: - print(f"{BColors.FAIL}{medialibrary.videos[filepath].fprint()}{BColors.ENDC}") + print(f"{colorama.Fore.RED}{medialibrary.videos[filepath].fprint()}{colorama.Style.RESET_ALL}") else: print(medialibrary.videos[filepath].fprint()) else: if medialibrary.videos[filepath].error: - print(f"{BColors.FAIL}{medialibrary.videos[filepath]}{BColors.ENDC}") + print(f"{colorama.Fore.RED}{medialibrary.videos[filepath]}{colorama.Style.RESET_ALL}") else: print(medialibrary.videos[filepath]) @@ -102,12 +104,12 @@ def main(): if medialibrary.videos[filepath].useful: if "formated" in printop or "verbose" in printop: if medialibrary.videos[filepath].error: - print(f"{BColors.FAIL}{medialibrary.videos[filepath].fprint()}{BColors.ENDC}") + print(f"{colorama.Fore.RED}{medialibrary.videos[filepath].fprint()}{colorama.Style.RESET_ALL}") else: print(medialibrary.videos[filepath].fprint()) else: if medialibrary.videos[filepath].error: - print(f"{BColors.FAIL}{medialibrary.videos[filepath]}{BColors.ENDC}") + print(f"{colorama.Fore.RED}{medialibrary.videos[filepath]}{colorama.Style.RESET_ALL}") else: print(medialibrary.videos[filepath]) @@ -131,14 +133,14 @@ def main(): vcodec = "x265" # Verbosing - print(f"{BColors.OKGREEN}****** Starting conversion {counter} of {len(keylist)}: '{BColors.OKCYAN}{medialibrary.videos[filepath].filename_origin}{BColors.OKGREEN}' from {BColors.OKCYAN}{medialibrary.videos[filepath].codec}{BColors.OKGREEN} to {BColors.OKCYAN}{vcodec}{BColors.OKGREEN}...{BColors.ENDC}") - print(f"{BColors.OKCYAN}Original file:{BColors.ENDC}") + print(f"{colorama.Fore.GREEN}****** Starting conversion {counter} of {len(keylist)}: '{colorama.Fore.CYAN}{medialibrary.videos[filepath].filename_origin}{colorama.Fore.GREEN}' from {colorama.Fore.CYAN}{medialibrary.videos[filepath].codec}{colorama.Fore.GREEN} to {colorama.Fore.CYAN}{vcodec}{colorama.Fore.GREEN}...{colorama.Style.RESET_ALL}") + print(f"{colorama.Fore.CYAN}Original file:{colorama.Style.RESET_ALL}") if "formated" in printop or "verbose" in printop: print(medialibrary.videos[filepath].fprint()) else: print(medialibrary.videos[filepath]) - print(f"{BColors.OKGREEN}Converting please wait...{BColors.ENDC}", end="\r") + print(f"{colorama.Fore.GREEN}Converting please wait...{colorama.Style.RESET_ALL}", end="\r") # Converting if medialibrary.videos[filepath].convert(verbose = "verbose" in printop): @@ -151,17 +153,17 @@ def main(): medialibrary.videos[newfpath] = Video(newfpath, verbose = "verbose" in printop) # Verbose - print(f"{BColors.OKGREEN}Successfully converted '{medialibrary.videos[filepath].filename_origin}'{BColors.OKCYAN}({medialibrary.videos[filepath].filesize}mb){BColors.OKGREEN} to '{medialibrary.videos[newfpath].filename_origin}'{BColors.OKCYAN}({medialibrary.videos[newfpath].filesize}mb){BColors.OKGREEN}, {BColors.OKCYAN}new file:{BColors.ENDC}") + print(f"{colorama.Fore.GREEN}Successfully converted '{medialibrary.videos[filepath].filename_origin}'{colorama.Fore.CYAN}({medialibrary.videos[filepath].filesize}mb){colorama.Fore.GREEN} to '{medialibrary.videos[newfpath].filename_origin}'{colorama.Fore.CYAN}({medialibrary.videos[newfpath].filesize}mb){colorama.Fore.GREEN}, {colorama.Fore.CYAN}new file:{colorama.Style.RESET_ALL}") if "formated" in printop or "verbose" in printop: if medialibrary.videos[newfpath].error: - print(f"{BColors.FAIL}{medialibrary.videos[newfpath].fprint()}{BColors.ENDC}") + print(f"{colorama.Fore.RED}{medialibrary.videos[newfpath].fprint()}{colorama.Style.RESET_ALL}") else: print(medialibrary.videos[newfpath].fprint()) else: if medialibrary.videos[newfpath].error: - print(f"{BColors.FAIL}{medialibrary.videos[newfpath]}{BColors.ENDC}") + print(f"{colorama.Fore.RED}{medialibrary.videos[newfpath]}{colorama.Style.RESET_ALL}") else: print(medialibrary.videos[newfpath]) diff --git a/mediacurator/library/bcolors.py b/mediacurator/library/bcolors.py deleted file mode 100644 index 126346d..0000000 --- a/mediacurator/library/bcolors.py +++ /dev/null @@ -1,15 +0,0 @@ -#!/usr/bin/env python3 -'''Fancy colors!''' - -class BColors: - ''' from https://stackoverflow.com/questions/287871/how-to-print-colored-text-in-python ''' - - HEADER = '\033[95m' - OKBLUE = '\033[94m' - OKCYAN = '\033[96m' - OKGREEN = '\033[92m' - WARNING = '\033[93m' - FAIL = '\033[91m' - ENDC = '\033[0m' - BOLD = '\033[1m' - UNDERLINE = '\033[4m' \ No newline at end of file diff --git a/mediacurator/library/medialibrary.py b/mediacurator/library/medialibrary.py index d871927..216c506 100644 --- a/mediacurator/library/medialibrary.py +++ b/mediacurator/library/medialibrary.py @@ -6,10 +6,12 @@ from pathlib import Path import sys -from .bcolors import BColors from .video import Video from .tools import deletefile +import colorama +colorama.init() + class MediaLibrary(): ''' Contains the information and methods of a video file. @@ -55,7 +57,7 @@ class MediaLibrary(): Save them to the videos dictionary ''' - print(f"{BColors.OKGREEN}Scanning files in {', '.join(map(str, self.directories))} for videos{BColors.ENDC}") + print(f"{colorama.Fore.GREEN}Scanning files in {', '.join(map(str, self.directories))} for videos{colorama.Fore.RESET}") videolist = [] for directory in self.directories: @@ -83,7 +85,7 @@ class MediaLibrary(): videolist = [video for video in videolist_tmp if video.is_file()] # Map it all to the videos dictionary as initiated Video objects - print(f"{BColors.OKGREEN}Analazing {len(videolist)} videos in {', '.join(map(str, self.directories))}{BColors.ENDC}") + print(f"{colorama.Fore.GREEN}Analazing {len(videolist)} videos in {', '.join(map(str, self.directories))}{colorama.Fore.RESET}") iteration = 0 for video in videolist: if verbose: @@ -95,7 +97,7 @@ class MediaLibrary(): def filter_videos(self, verbose = False): ''' Mark useless videos in the videos dictionary (default is useful) ''' - print(f"{BColors.OKGREEN}Filtering {len(self.videos)} videos for the requested parameters{BColors.ENDC}") + print(f"{colorama.Fore.GREEN}Filtering {len(self.videos)} videos for the requested parameters{colorama.Fore.RESET}") for filepath in self.videos: @@ -146,7 +148,7 @@ class MediaLibrary(): self.videos[filepath].useful = useful - print(f"{BColors.OKGREEN}Found {len([filepath for filepath in self.videos if self.videos[filepath].useful])} videos for the requested parameters{BColors.ENDC}") + print(f"{colorama.Fore.GREEN}Found {len([filepath for filepath in self.videos if self.videos[filepath].useful])} videos for the requested parameters{colorama.Fore.RESET}") def unwatch(self, filepath, delete = False): ''' remove a video from the index and delete it if requested''' diff --git a/mediacurator/library/tools.py b/mediacurator/library/tools.py index b3c05de..52fec2d 100644 --- a/mediacurator/library/tools.py +++ b/mediacurator/library/tools.py @@ -5,7 +5,9 @@ import subprocess import os -from .bcolors import BColors + +import colorama +colorama.init() def detect_ffmpeg(): @@ -19,9 +21,14 @@ def detect_ffmpeg(): pass return False -def user_confirm(question): +def user_confirm(question, color=False): '''Returns the user answer to a yes or no question''' - answer = input(question) + if color == "yellow": + print(colorama.Fore.YELLOW, end = '') + answer = input(question) + print(colorama.Fore.RESET) + else: + answer = input(question) if answer.lower() in ["y","yes"]: return True elif answer.lower() in ["n","no"]: @@ -34,8 +41,8 @@ def deletefile(filename): try: os.remove(filename) except OSError: - print(f"{BColors.FAIL}Error deleting {filename}{BColors.ENDC}") + print(f"{colorama.Fore.RED}Error deleting {filename}{colorama.Fore.RESET}") return False - print(f"{BColors.OKGREEN}Successfully deleted {filename}{BColors.ENDC}") + print(f"{colorama.Fore.GREEN}Successfully deleted {filename}{colorama.Fore.RESET}") return True \ No newline at end of file diff --git a/mediacurator/library/video.py b/mediacurator/library/video.py index de3a306..4b1ceac 100644 --- a/mediacurator/library/video.py +++ b/mediacurator/library/video.py @@ -1,12 +1,14 @@ #!/usr/bin/env python3 '''Its a video!''' -from .bcolors import BColors from .tools import deletefile import subprocess import os import sys +import colorama +colorama.init() + class Video(): '''Contains the information and methods of a video file.''' @@ -28,8 +30,12 @@ class Video(): ''' creates and analyse a video file ''' #Breaking down the full path in its components - self.path = str(filepath)[:str(filepath).rindex("/") + 1] - self.filename_origin = str(filepath)[str(filepath).rindex("/") + 1:] + if os.name == 'nt': + self.path = str(filepath)[:str(filepath).rindex("\\") + 1] + self.filename_origin = str(filepath)[str(filepath).rindex("\\") + 1:] + else: + self.path = str(filepath)[:str(filepath).rindex("/") + 1] + self.filename_origin = str(filepath)[str(filepath).rindex("/") + 1:] if not os.path.exists(filepath): self.error = f"FileNotFoundError: [Errno 2] No such file or directory: '{filepath}'" @@ -53,8 +59,8 @@ class Video(): self.definition = False if self.error and verbose: - print(f"{BColors.FAIL}There seams to be an error with \"{filepath}\"{BColors.ENDC}") - print(f"{BColors.FAIL} {self.error}{BColors.ENDC}") + print(f"{colorama.Fore.RED}There seams to be an error with \"{filepath}\"{colorama.Fore.RESET}") + print(f"{colorama.Fore.RED} {self.error}{colorama.Fore.RESET}") def __str__(self): '''Returns a short formated string about the video''' @@ -80,9 +86,9 @@ class Video(): if self.error: - text += f"{BColors.FAIL}\nErrors:{BColors.ENDC}" + text += f"{colorama.Fore.RED}\nErrors:{colorama.Fore.RESET}" for err in self.error.splitlines(): - text += f"{BColors.FAIL}\n {err}{BColors.ENDC}" + text += f"{colorama.Fore.RED}\n {err}{colorama.Fore.RESET}" return text @@ -115,9 +121,9 @@ class Video(): text += f" size: {self.filesize} mb" if self.error: - text += f"{BColors.FAIL}\n Errors:{BColors.ENDC}" + text += f"{colorama.Fore.RED}\n Errors:{colorama.Fore.RESET}" for err in self.error.splitlines(): - text += f"{BColors.FAIL}\n {err}{BColors.ENDC}" + text += f"{colorama.Fore.RED}\n {err}{colorama.Fore.RESET}" return text @@ -164,10 +170,10 @@ class Video(): except subprocess.CalledProcessError as e: deletefile(self.path + self.filename_tmp) self.filename_tmp = "" - print(f"{BColors.FAIL}Conversion failed {e}{BColors.ENDC}") + print(f"{colorama.Fore.RED}Conversion failed {e}{colorama.Fore.RESET}") return False except KeyboardInterrupt: - print(f"{BColors.WARNING}Conversion cancelled, cleaning up...{BColors.ENDC}") + print(f"{colorama.Style.YELLOW}Conversion cancelled, cleaning up...{colorama.Fore.RESET}") deletefile(self.path + self.filename_tmp) self.filename_tmp = "" exit() @@ -193,7 +199,7 @@ class Video(): if len(output) > 0: return output except (subprocess.CalledProcessError, IndexError): - return f'{BColors.FAIL}There seams to be a "subprocess.CalledProcessError" error with \"{filepath}\"{BColors.ENDC}' + return f'{colorama.Fore.RED}There seams to be a "subprocess.CalledProcessError" error with \"{filepath}\"{colorama.Fore.RESET}' return False diff --git a/requirements.txt b/requirements.txt index 530cda3..350f70a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,2 +1,3 @@ -hurry.filesize -pathlib \ No newline at end of file +pathlib +colorama +sphinx