def GetMime(path, ok_to_look_for_hydrus_updates=False): size = os.path.getsize(path) if size == 0: raise HydrusExceptions.ZeroSizeFileException('File is of zero length!') if ok_to_look_for_hydrus_updates and size < 64 * 1024 * 1024: 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 with open(path, 'rb') as f: bit_to_check = f.read(256) for (offsets_and_headers, mime) in headers_and_mime: it_passes = False not in (bit_to_check[offset:].startswith(header) for (offset, header) in offsets_and_headers) if it_passes: if mime in (HC.UNDETERMINED_WM, HC.UNDETERMINED_MP4): return HydrusVideoHandling.GetMime(path) elif mime == HC.UNDETERMINED_PNG: if IsPNGAnimated(bit_to_check): return HC.IMAGE_APNG else: return HC.IMAGE_PNG else: return mime if HydrusText.LooksLikeHTML(bit_to_check): return HC.TEXT_HTML # it is important this goes at the end, because ffmpeg has a billion false positives! # for instance, it once thought some hydrus update files were mpegs 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) return HC.APPLICATION_UNKNOWN
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