develop #11
| @@ -57,12 +57,15 @@ class Icon(DesktopIconMixin, VideoIconMixin, MeshsIconMixin): | ||||
|  | ||||
|         return self.get_generic_icon() | ||||
|  | ||||
|     def create_blender_thumbnail(self, full_path): | ||||
|     def create_blender_thumbnail(self, full_path, returnHashInstead=False): | ||||
|         try: | ||||
|             path_exists, hash_img_path = self.generate_hash_and_path(full_path) | ||||
|             path_exists, img_hash, hash_img_path = self.generate_hash_and_path(full_path) | ||||
|             if not path_exists: | ||||
|                 self.generate_blender_thumbnail(full_path, hash_img_path) | ||||
|  | ||||
|             if returnHashInstead: | ||||
|                 return img_hash, hash_img_path | ||||
|  | ||||
|             return self.create_scaled_image(hash_img_path, self.video_icon_wh) | ||||
|         except IconException as e: | ||||
|             print("Blender thumbnail generation issue:") | ||||
| @@ -70,9 +73,9 @@ class Icon(DesktopIconMixin, VideoIconMixin, MeshsIconMixin): | ||||
|  | ||||
|         return None | ||||
|  | ||||
|     def create_video_thumbnail(self, full_path, scrub_percent = "65%", replace=False): | ||||
|     def create_video_thumbnail(self, full_path, scrub_percent = "65%", replace=False, returnHashInstead=False): | ||||
|         try: | ||||
|             path_exists, hash_img_path = self.generate_hash_and_path(full_path) | ||||
|             path_exists, img_hash, hash_img_path = self.generate_hash_and_path(full_path) | ||||
|             if path_exists and replace: | ||||
|                 os.remove(hash_img_path) | ||||
|                 path_exists = False | ||||
| @@ -80,6 +83,9 @@ class Icon(DesktopIconMixin, VideoIconMixin, MeshsIconMixin): | ||||
|             if not path_exists: | ||||
|                 self.generate_video_thumbnail(full_path, hash_img_path, scrub_percent) | ||||
|  | ||||
|             if returnHashInstead: | ||||
|                 return img_hash, hash_img_path | ||||
|  | ||||
|             return self.create_scaled_image(hash_img_path, self.video_icon_wh) | ||||
|         except IconException as e: | ||||
|             print("Image/Video thumbnail generation issue:") | ||||
| @@ -150,11 +156,11 @@ class Icon(DesktopIconMixin, VideoIconMixin, MeshsIconMixin): | ||||
|         return GdkPixbuf.Pixbuf.new_from_file(self.DEFAULT_ICON) | ||||
|  | ||||
|     def generate_hash_and_path(self, full_path): | ||||
|         file_hash     = self.fast_hash(full_path) | ||||
|         hash_img_path = f"{self.ABS_THUMBS_PTH}/{file_hash}.jpg" | ||||
|         img_hash      = self.fast_hash(full_path) | ||||
|         hash_img_path = f"{self.ABS_THUMBS_PTH}/{img_hash}.jpg" | ||||
|         path_exists   = True if isfile(hash_img_path) else False | ||||
|  | ||||
|         return path_exists, hash_img_path | ||||
|         return path_exists, img_hash, hash_img_path | ||||
|  | ||||
|  | ||||
|     def fast_hash(self, filename, hash_factory=hashlib.md5, chunk_num_blocks=128, i=1): | ||||
|   | ||||
| @@ -1,4 +1,5 @@ | ||||
| # Python imports | ||||
| import os | ||||
| import hashlib | ||||
| import re | ||||
| from os import listdir | ||||
| @@ -17,6 +18,23 @@ from .icons.icon import Icon | ||||
| from .path import Path | ||||
|  | ||||
|  | ||||
| try: | ||||
|     get_file_size("/") | ||||
| except Exception as e: | ||||
|     import os | ||||
|  | ||||
|     def sizeof_fmt_def(num, suffix="B"): | ||||
|         for unit in ["", "K", "M", "G", "T", "Pi", "Ei", "Zi"]: | ||||
|             if abs(num) < 1024.0: | ||||
|                 return f"{num:3.1f} {unit}{suffix}" | ||||
|             num /= 1024.0 | ||||
|         return f"{num:.1f} Yi{suffix}" | ||||
|  | ||||
|     def _get_file_size(file): | ||||
|         return "4K" if isdir(file) else sizeof_fmt_def(os.path.getsize(file)) | ||||
|  | ||||
|     get_file_size = _get_file_size | ||||
|  | ||||
|  | ||||
|  | ||||
| class Tab(Settings, FileHandler, Launcher, Icon, Path): | ||||
| @@ -26,6 +44,7 @@ class Tab(Settings, FileHandler, Launcher, Icon, Path): | ||||
|  | ||||
|         self._id: str           = "" | ||||
|         self._wid: str          = None | ||||
|         self.error_message: str = None | ||||
|         self._dir_watcher       = None | ||||
|         self._hide_hidden: bool = self.HIDE_HIDDEN_FILES | ||||
|         self._files: list       = [] | ||||
| @@ -50,6 +69,7 @@ class Tab(Settings, FileHandler, Launcher, Icon, Path): | ||||
|         self._files     = [] | ||||
|  | ||||
|         if not isdir(path): | ||||
|             self._set_error_message("Path can not be accessed.") | ||||
|             self.set_to_home() | ||||
|             return "" | ||||
|  | ||||
| @@ -145,6 +165,15 @@ class Tab(Settings, FileHandler, Launcher, Icon, Path): | ||||
|             } | ||||
|         } | ||||
|  | ||||
|     def get_video_icons(self) -> list: | ||||
|         data = [] | ||||
|         dir  = self.get_current_directory() | ||||
|         for file in self._vids: | ||||
|             img_hash, hash_img_path = self.create_video_thumbnail(full_path=f"{dir}/{file}", returnHashInstead=True) | ||||
|             data.append([img_hash, hash_img_path]) | ||||
|  | ||||
|         return data | ||||
|  | ||||
|     def get_pixbuf_icon_str_combo(self): | ||||
|         data = [] | ||||
|         dir  = self.get_current_directory() | ||||
| @@ -154,7 +183,6 @@ class Tab(Settings, FileHandler, Launcher, Icon, Path): | ||||
|  | ||||
|         return data | ||||
|  | ||||
|  | ||||
|     def get_gtk_icon_str_combo(self) -> list: | ||||
|         data = [] | ||||
|         dir  = self.get_current_directory() | ||||
| @@ -223,24 +251,31 @@ class Tab(Settings, FileHandler, Launcher, Icon, Path): | ||||
|     def get_dir_watcher(self): | ||||
|         return self._dir_watcher | ||||
|  | ||||
|     def _atoi(self, text): | ||||
|         return int(text) if text.isnumeric() else text | ||||
|     def get_error_message(self): | ||||
|         return self.error_message | ||||
|  | ||||
|     def _atof(self, text): | ||||
|         return float(text) if text.isnumeric() else text | ||||
|     def unset_error_message(self): | ||||
|         self.error_message = None | ||||
|  | ||||
|     def _atoi(self, text): | ||||
|         return int(text) if text.isdigit() else text | ||||
|  | ||||
|     def _natural_keys(self, text): | ||||
|         return [ self._atof(c) for c in re.split('(\d+)', text) ] | ||||
|         return [ self._atoi(c) for c in re.split('(\d+)',text) ] | ||||
|  | ||||
|     def _hash_text(self, text) -> str: | ||||
|         return hashlib.sha256(str.encode(text)).hexdigest()[:18] | ||||
|  | ||||
|     def _hash_set(self, arry: list) -> list: | ||||
|         path = self.get_current_directory() | ||||
|         data = [] | ||||
|         for arr in arry: | ||||
|             data.append([arr, self._hash_text(arr)]) | ||||
|             file = f"{path}/{arr}" | ||||
|             size = get_file_size(file) | ||||
|             data.append([arr, self._hash_text(arr), size]) | ||||
|         return data | ||||
|  | ||||
|  | ||||
|     def _random_with_N_digits(self, n: int) -> int: | ||||
|         range_start = 10**(n-1) | ||||
|         range_end = (10**n)-1 | ||||
| @@ -248,3 +283,6 @@ class Tab(Settings, FileHandler, Launcher, Icon, Path): | ||||
|  | ||||
|     def _generate_id(self) -> str: | ||||
|         self._id = str(self._random_with_N_digits(self._id_length)) | ||||
|  | ||||
|     def _set_error_message(self, text: str): | ||||
|         self.error_message = text | ||||
|   | ||||
| @@ -12,9 +12,9 @@ import shutil | ||||
| class FileHandler: | ||||
|     def create_file(self, nFile, type): | ||||
|         try: | ||||
|             if TYPE == "dir": | ||||
|             if type == "dir": | ||||
|                 os.mkdir(nFile) | ||||
|             elif TYPE == "file": | ||||
|             elif type == "file": | ||||
|                 open(nFile, 'a').close() | ||||
|         except Exception as e: | ||||
|             print("An error occured creating the file/dir:") | ||||
|   | ||||
| @@ -5,7 +5,6 @@ from os import path | ||||
|  | ||||
| # Lib imports | ||||
|  | ||||
|  | ||||
| # Apoplication imports | ||||
|  | ||||
|  | ||||
| @@ -13,7 +12,6 @@ from os import path | ||||
|  | ||||
| class Settings: | ||||
|     logger            = None | ||||
|  | ||||
|     USR_SOLARFM       = "/usr/share/solarfm" | ||||
|     USER_HOME         = path.expanduser('~') | ||||
|     CONFIG_PATH       = f"{USER_HOME}/.config/solarfm" | ||||
| @@ -24,7 +22,7 @@ class Settings: | ||||
|     DEFAULT_ICONS     = f"{CONFIG_PATH}/icons" | ||||
|     DEFAULT_ICON      = f"{DEFAULT_ICONS}/text.png" | ||||
|     FFMPG_THUMBNLR    = f"{CONFIG_PATH}/ffmpegthumbnailer"    # Thumbnail generator binary | ||||
|     BLENDER_THUMBNLR  =  f"{CONFIG_PATH}/blender-thumbnailer" # Blender thumbnail generator binary | ||||
|     BLENDER_THUMBNLR  = f"{CONFIG_PATH}/blender-thumbnailer"  # Blender thumbnail generator binary | ||||
|     REMUX_FOLDER      = f"{USER_HOME}/.remuxs"                # Remuxed files folder | ||||
|  | ||||
|     ICON_DIRS         = ["/usr/share/icons", f"{USER_HOME}/.icons" "/usr/share/pixmaps"] | ||||
| @@ -57,9 +55,9 @@ class Settings: | ||||
|         STEAM_CDN_URL     = config["steam_cdn_url"] | ||||
|         FFMPG_THUMBNLR    = FFMPG_THUMBNLR   if config["thumbnailer_path"] == "" else config["thumbnailer_path"] | ||||
|         BLENDER_THUMBNLR  = BLENDER_THUMBNLR if config["blender_thumbnailer_path"] == "" else config["blender_thumbnailer_path"] | ||||
|         HIDE_HIDDEN_FILES = True if config["hide_hidden_files"] == "true" else False | ||||
|         go_past_home      = True if config["go_past_home"] == "" else config["go_past_home"] | ||||
|         lock_folder       = True if config["lock_folder"] == "true" else False | ||||
|         HIDE_HIDDEN_FILES = True  if config["hide_hidden_files"] in ["true", ""] else False | ||||
|         go_past_home      = True  if config["go_past_home"] in ["true", ""] else False | ||||
|         lock_folder       = False if config["lock_folder"] in ["false", ""] else True | ||||
|         locked_folders    = config["locked_folders"].split("::::") | ||||
|         mplayer_options   = config["mplayer_options"].split() | ||||
|         music_app         = config["music_app"] | ||||
|   | ||||
		Reference in New Issue
	
	Block a user