def CheckNetworkDownload( self, possible_mime, num_bytes, is_complete_file_size ): if is_complete_file_size: error_prefix = 'Download was apparently ' else: error_prefix = 'Download was at least ' if possible_mime is not None: if possible_mime == HC.IMAGE_GIF and self._max_gif_size is not None and num_bytes > self._max_gif_size: raise HydrusExceptions.FileSizeException( error_prefix + HydrusData.ToHumanBytes( num_bytes ) + ' but the upper limit for gifs is ' + HydrusData.ToHumanBytes( self._max_gif_size ) + '.' ) if self._max_size is not None and num_bytes > self._max_size: raise HydrusExceptions.FileSizeException( error_prefix + HydrusData.ToHumanBytes( num_bytes ) + ' but the upper limit is ' + HydrusData.ToHumanBytes( self._max_size ) + '.' ) if is_complete_file_size: if self._min_size is not None and num_bytes < self._min_size: raise HydrusExceptions.FileSizeException( error_prefix + HydrusData.ToHumanBytes( num_bytes ) + ' but the lower limit is ' + HydrusData.ToHumanBytes( self._min_size ) + '.' )
def CheckFileIsValid(self, size, mime, width, height): if self._min_size is not None and size < self._min_size: raise HydrusExceptions.FileSizeException( 'File was ' + HydrusData.ToHumanBytes(size) + ' but the lower limit is ' + HydrusData.ToHumanBytes(self._min_size) + '.') if self._max_size is not None and size > self._max_size: raise HydrusExceptions.FileSizeException( 'File was ' + HydrusData.ToHumanBytes(size) + ' but the upper limit is ' + HydrusData.ToHumanBytes(self._max_size) + '.') if mime == HC.IMAGE_GIF and self._max_gif_size is not None and size > self._max_gif_size: raise HydrusExceptions.FileSizeException( 'File was ' + HydrusData.ToHumanBytes(size) + ' but the upper limit for gifs is ' + HydrusData.ToHumanBytes(self._max_gif_size) + '.') if self._min_resolution is not None: (min_width, min_height) = self._min_resolution too_thin = width is not None and width < min_width too_short = height is not None and height < min_height if too_thin or too_short: raise HydrusExceptions.FileSizeException( 'File had resolution ' + HydrusData.ConvertResolutionToPrettyString((width, height)) + ' but the lower limit is ' + HydrusData.ConvertResolutionToPrettyString( self._min_resolution)) if self._max_resolution is not None: (max_width, max_height) = self._max_resolution too_wide = width is not None and width > max_width too_tall = height is not None and height > max_height if too_wide or too_tall: raise HydrusExceptions.FileSizeException( 'File had resolution ' + HydrusData.ConvertResolutionToPrettyString((width, height)) + ' but the upper limit is ' + HydrusData.ConvertResolutionToPrettyString( self._max_resolution))
def GetMime(path, ok_to_look_for_hydrus_updates=False): size = os.path.getsize(path) if size == 0: raise HydrusExceptions.FileSizeException('File is of zero length!') with open(path, 'rb') as f: bit_to_check = f.read(256) for (offset, header, mime) in header_and_mime: offset_bit_to_check = bit_to_check[offset:] if offset_bit_to_check.startswith(header): if mime == HC.UNDETERMINED_WM: if HydrusVideoHandling.HasVideoStream(path): return HC.VIDEO_WMV # we'll catch and verify wma later elif mime == HC.UNDETERMINED_PNG: if HydrusVideoHandling.HasVideoStream(path): return HC.IMAGE_APNG else: return HC.IMAGE_PNG else: return mime try: mime = HydrusVideoHandling.GetMime(path) if mime != HC.APPLICATION_UNKNOWN: return mime except HydrusExceptions.UnsupportedFileException: pass except Exception as e: HydrusData.Print('FFMPEG had trouble with: ' + path) HydrusData.PrintException(e, do_wait=False) if HydrusText.LooksLikeHTML(bit_to_check): return HC.TEXT_HTML if ok_to_look_for_hydrus_updates: with open(path, 'rb') as f: update_network_bytes = f.read() try: update = HydrusSerialisable.CreateFromNetworkBytes( update_network_bytes) if isinstance(update, HydrusNetwork.ContentUpdate): return HC.APPLICATION_HYDRUS_UPDATE_CONTENT elif isinstance(update, HydrusNetwork.DefinitionsUpdate): return HC.APPLICATION_HYDRUS_UPDATE_DEFINITIONS except: pass return HC.APPLICATION_UNKNOWN
def GetFileInfo(path, mime=None, ok_to_look_for_hydrus_updates=False): size = os.path.getsize(path) if size == 0: raise HydrusExceptions.FileSizeException('File is of zero length!') if mime is None: mime = GetMime( path, ok_to_look_for_hydrus_updates=ok_to_look_for_hydrus_updates) if mime not in HC.ALLOWED_MIMES: if mime == HC.TEXT_HTML: raise HydrusExceptions.UnsupportedFileException( 'Looks like HTML -- maybe the client needs to be taught how to parse this?' ) elif mime == HC.APPLICATION_UNKNOWN: raise HydrusExceptions.UnsupportedFileException( 'Unknown filetype!') else: raise HydrusExceptions.UnsupportedFileException( 'Filetype is not permitted!') width = None height = None duration = None num_frames = None num_words = None if mime in (HC.IMAGE_JPEG, HC.IMAGE_PNG, HC.IMAGE_GIF, HC.IMAGE_WEBP, HC.IMAGE_TIFF, HC.IMAGE_ICON): ((width, height), duration, num_frames) = HydrusImageHandling.GetImageProperties(path, mime) elif mime == HC.APPLICATION_ZIP: temp_dir_path = HydrusPaths.GetTempDir() try: subprocess.call(["unzip", path, '-d', temp_dir_path]) cover = sorted(list(Path(temp_dir_path).rglob("*.jpg")) + list(Path(temp_dir_path).rglob("*.png")), key=lambda p: p.name)[0].as_posix() ((width, height), duration, num_frames) = HydrusImageHandling.GetImageProperties( cover, HC.IMAGE_PNG) # TODO: delete dir except Exception as e: (width, height, duration, num_frames) = (300, 300, 0, 0) elif mime == HC.APPLICATION_RAR: temp_dir_path = HydrusPaths.GetTempDir() try: subprocess.call(["unrar", path, temp_dir_path]) cover = sorted(list(Path(temp_dir_path).rglob("*.jpg")) + list(Path(temp_dir_path).rglob("*.png")), key=lambda p: p.name)[0].as_posix() ((width, height), duration, num_frames) = HydrusImageHandling.GetImageProperties( cover, HC.IMAGE_PNG) except Exception as e: (width, height, duration, num_frames) = (300, 300, 0, 0) elif mime == HC.APPLICATION_FLASH: ((width, height), duration, num_frames) = HydrusFlashHandling.GetFlashProperties(path) elif mime in (HC.IMAGE_APNG, HC.VIDEO_AVI, HC.VIDEO_FLV, HC.VIDEO_WMV, HC.VIDEO_MOV, HC.VIDEO_MP4, HC.VIDEO_MKV, HC.VIDEO_REALMEDIA, HC.VIDEO_WEBM, HC.VIDEO_MPEG): ((width, height), duration, num_frames) = HydrusVideoHandling.GetFFMPEGVideoProperties(path) elif mime == HC.APPLICATION_PDF: num_words = HydrusDocumentHandling.GetPDFNumWords( path) # this now give None until a better solution can be found elif mime == HC.APPLICATION_PSD: (width, height) = HydrusImageHandling.GetPSDResolution(path) elif mime in HC.AUDIO: ffmpeg_lines = HydrusVideoHandling.GetFFMPEGInfoLines(path) (file_duration_in_s, stream_duration_in_s ) = HydrusVideoHandling.ParseFFMPEGDuration(ffmpeg_lines) duration = int(file_duration_in_s * 1000) if mime in HC.MIMES_THAT_DEFINITELY_HAVE_AUDIO: has_audio = True elif mime in HC.MIMES_THAT_MAY_HAVE_AUDIO: has_audio = HydrusAudioHandling.VideoHasAudio(path) else: has_audio = False if width is not None and width < 0: width *= -1 if height is not None and height < 0: width *= -1 if duration is not None and duration < 0: duration *= -1 if num_frames is not None and num_frames < 0: num_frames *= -1 if num_words is not None and num_words < 0: num_words *= -1 return (size, mime, width, height, duration, num_frames, has_audio, num_words)
def GetFileInfo(path, mime=None, ok_to_look_for_hydrus_updates=False): size = os.path.getsize(path) if size == 0: raise HydrusExceptions.FileSizeException('File is of zero length!') if mime is None: mime = GetMime( path, ok_to_look_for_hydrus_updates=ok_to_look_for_hydrus_updates) if mime not in HC.ALLOWED_MIMES: if mime == HC.TEXT_HTML: raise HydrusExceptions.UnsupportedFileException( 'Looks like HTML -- maybe the client needs to be taught how to parse this?' ) elif mime == HC.APPLICATION_UNKNOWN: raise HydrusExceptions.UnsupportedFileException( 'Unknown filetype!') else: raise HydrusExceptions.UnsupportedFileException( 'Filetype is not permitted!') width = None height = None duration = None num_frames = None num_words = None if mime in HC.MIMES_THAT_DEFINITELY_HAVE_AUDIO: has_audio = True else: has_audio = False if mime in (HC.IMAGE_JPEG, HC.IMAGE_PNG, HC.IMAGE_GIF, HC.IMAGE_WEBP, HC.IMAGE_TIFF, HC.IMAGE_ICON): ((width, height), duration, num_frames) = HydrusImageHandling.GetImageProperties(path, mime) elif mime == HC.APPLICATION_CLIP: ((width, height), duration, num_frames) = HydrusClipHandling.GetClipProperties(path) elif mime == HC.APPLICATION_FLASH: ((width, height), duration, num_frames) = HydrusFlashHandling.GetFlashProperties(path) elif mime == HC.IMAGE_APNG: ((width, height), duration, num_frames, has_audio) = HydrusVideoHandling.GetFFMPEGAPNGProperties(path) elif mime == HC.APPLICATION_PDF: num_words = HydrusDocumentHandling.GetPDFNumWords( path) # this now give None until a better solution can be found elif mime == HC.APPLICATION_PSD: (width, height) = HydrusImageHandling.GetPSDResolution(path) elif mime in HC.VIDEO: ((width, height), duration, num_frames, has_audio) = HydrusVideoHandling.GetFFMPEGVideoProperties(path) elif mime in HC.AUDIO: ffmpeg_lines = HydrusVideoHandling.GetFFMPEGInfoLines(path) (file_duration_in_s, stream_duration_in_s ) = HydrusVideoHandling.ParseFFMPEGDuration(ffmpeg_lines) duration = int(file_duration_in_s * 1000) if width is not None and width < 0: width *= -1 if height is not None and height < 0: width *= -1 if duration is not None and duration < 0: duration *= -1 if num_frames is not None and num_frames < 0: num_frames *= -1 if num_words is not None and num_words < 0: num_words *= -1 return (size, mime, width, height, duration, num_frames, has_audio, num_words)