예제 #1
0
 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 ) + '.' )
예제 #2
0
    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))
예제 #3
0
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
예제 #4
0
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)
예제 #5
0
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)