diff --git a/setup.py b/setup.py index fcef83a..bf318aa 100644 --- a/setup.py +++ b/setup.py @@ -1,5 +1,11 @@ #!/usr/bin/env python +import sys +win=(sys.platform == "win32") +if win: + import py2exe + sys.path.append("src/trimage") + from distutils.core import setup setup(name = "trimage", @@ -11,8 +17,7 @@ setup(name = "trimage", license = "MIT license", package_dir = {'trimage' : 'src/trimage'}, packages = ["trimage", - "trimage.hurry", - "trimage.hurry.filesize", + "trimage.filesize", "trimage.ThreadPool",], package_data = {"trimage" : ["pixmaps/*.*"] }, data_files=[('share/icons/hicolor/scalable/apps', ['desktop/trimage.svg']), @@ -20,4 +25,16 @@ setup(name = "trimage", scripts = ["trimage"], long_description = """Trimage is a cross-platform GUI and command-line interface to optimize image files via optipng, advpng and jpegoptim, depending on the filetype (currently, PNG and JPG files are supported). It was inspired by imageoptim. All image files are losslessy compressed on the highest available compression levels. Trimage gives you various input functions to fit your own workflow: A regular file dialog, dragging and dropping and various command line options.""", requires = ["PyQt4 (>=4.4)"], + + #for py2exe + windows=[r'src\trimage\trimage.py'], + zipfile=None, + options={"py2exe":{ + "optimize":2, + "compressed":1, + "bundle_files":1, + "includes":["sip",], + "excludes":['email'], + }, + }, ) diff --git a/src/trimage/filesize/README.txt b/src/trimage/filesize/README.txt new file mode 100644 index 0000000..f91201d --- /dev/null +++ b/src/trimage/filesize/README.txt @@ -0,0 +1 @@ +http://pypi.python.org/pypi/hurry.filesize \ No newline at end of file diff --git a/src/trimage/filesize/__init__.py b/src/trimage/filesize/__init__.py new file mode 100644 index 0000000..68d9fc2 --- /dev/null +++ b/src/trimage/filesize/__init__.py @@ -0,0 +1,2 @@ +from filesize import size +from filesize import traditional, alternative, verbose, iec, si diff --git a/src/trimage/filesize/filesize.py b/src/trimage/filesize/filesize.py new file mode 100644 index 0000000..32065fe --- /dev/null +++ b/src/trimage/filesize/filesize.py @@ -0,0 +1,110 @@ + +traditional = [ + (1024 ** 5, 'P'), + (1024 ** 4, 'T'), + (1024 ** 3, 'G'), + (1024 ** 2, 'M'), + (1024 ** 1, 'K'), + (1024 ** 0, 'B'), + ] + +alternative = [ + (1024 ** 5, ' PB'), + (1024 ** 4, ' TB'), + (1024 ** 3, ' GB'), + (1024 ** 2, ' MB'), + (1024 ** 1, ' KB'), + (1024 ** 0, (' byte', ' bytes')), + ] + +verbose = [ + (1024 ** 5, (' petabyte', ' petabytes')), + (1024 ** 4, (' terabyte', ' terabytes')), + (1024 ** 3, (' gigabyte', ' gigabytes')), + (1024 ** 2, (' megabyte', ' megabytes')), + (1024 ** 1, (' kilobyte', ' kilobytes')), + (1024 ** 0, (' byte', ' bytes')), + ] + +iec = [ + (1024 ** 5, 'Pi'), + (1024 ** 4, 'Ti'), + (1024 ** 3, 'Gi'), + (1024 ** 2, 'Mi'), + (1024 ** 1, 'Ki'), + (1024 ** 0, ''), + ] + +si = [ + (1000 ** 5, 'P'), + (1000 ** 4, 'T'), + (1000 ** 3, 'G'), + (1000 ** 2, 'M'), + (1000 ** 1, 'K'), + (1000 ** 0, 'B'), + ] + + + +def size(bytes, system=traditional): + """Human-readable file size. + + Using the traditional system, where a factor of 1024 is used:: + + >>> size(10) + '10B' + >>> size(100) + '100B' + >>> size(1000) + '1000B' + >>> size(2000) + '1K' + >>> size(10000) + '9K' + >>> size(20000) + '19K' + >>> size(100000) + '97K' + >>> size(200000) + '195K' + >>> size(1000000) + '976K' + >>> size(2000000) + '1M' + + Using the SI system, with a factor 1000:: + + >>> size(10, system=si) + '10B' + >>> size(100, system=si) + '100B' + >>> size(1000, system=si) + '1K' + >>> size(2000, system=si) + '2K' + >>> size(10000, system=si) + '10K' + >>> size(20000, system=si) + '20K' + >>> size(100000, system=si) + '100K' + >>> size(200000, system=si) + '200K' + >>> size(1000000, system=si) + '1M' + >>> size(2000000, system=si) + '2M' + + """ + for factor, suffix in system: + if bytes >= factor: + break + amount = int(bytes/factor) + if isinstance(suffix, tuple): + singular, multiple = suffix + if amount == 1: + suffix = singular + else: + suffix = multiple + return str(amount) + suffix + diff --git a/src/trimage/trimage.py b/src/trimage/trimage.py old mode 100755 new mode 100644 index 0a8b4cd..8ba1452 --- a/src/trimage/trimage.py +++ b/src/trimage/trimage.py @@ -9,7 +9,7 @@ from optparse import OptionParser from PyQt4.QtCore import * from PyQt4.QtGui import * -from hurry.filesize import * +from filesize import * from imghdr import what as determinetype from Queue import Queue @@ -209,18 +209,19 @@ class StartQT4(QMainWindow): def checkapps(self): """Check if the required command line apps exist.""" + exe=".exe" if (sys.platform=="win32") else "" status = False - retcode = self.safe_call("jpegoptim --version") + retcode = self.safe_call("jpegoptim"+exe+" --version") if retcode != 0: status = True sys.stderr.write("[error] please install jpegoptim") - retcode = self.safe_call("optipng -v") + retcode = self.safe_call("optipng"+exe+" -v") if retcode != 0: status = True sys.stderr.write("[error] please install optipng") - retcode = self.safe_call("advpng --version") + retcode = self.safe_call("advpng"+exe+" --version") if retcode != 0: status = True sys.stderr.write("[error] please install advancecomp") @@ -343,9 +344,10 @@ class Image: raise "Tried to compress invalid image (unsupported format or not file)" self.reset() self.compressing=True + exe=".exe" if (sys.platform=="win32") else "" runString = { - "jpeg": u"jpegoptim -f --strip-all '%(file)s'", - "png" : u"optipng -force -o7 '%(file)s'&&advpng -z4 '%(file)s'"} + "jpeg": u"jpegoptim"+exe+" -f --strip-all '%(file)s'", + "png" : u"optipng"+exe+" -force -o7 '%(file)s'&&advpng"+exe+" -z4 '%(file)s'"} try: retcode = call(runString[self.filetype] % {"file": self.fullpath}, shell = True, stdout=PIPE)