[4] | 1 | import os, os.path, sys, wx, stat, shutil |
---|
| 2 | import subprocess as sp |
---|
| 3 | import traceback as tb |
---|
| 4 | |
---|
| 5 | opj = os.path.join |
---|
| 6 | |
---|
| 7 | global FILES_DIR, THUMB_DIR |
---|
| 8 | |
---|
| 9 | MPLAYER_DIR = "mplayer" # change if needed |
---|
| 10 | CONVERT_DIR = "convert" # imagemagick's convert |
---|
| 11 | |
---|
| 12 | wx.InitAllImageHandlers() |
---|
| 13 | |
---|
| 14 | |
---|
| 15 | |
---|
| 16 | def __GetThumbName(fullPath, fileType): |
---|
| 17 | fileSize = os.stat(fullPath).st_size |
---|
| 18 | (root, ext) = os.path.splitext( os.path.basename(fullPath) ) |
---|
| 19 | thumbName = root+str(fileSize)+ext #construct the thumb name |
---|
| 20 | |
---|
| 21 | # video files have .jpg tacked onto the end |
---|
| 22 | thumbName += ".jpg" |
---|
| 23 | |
---|
| 24 | return opj( THUMB_DIR, thumbName ) |
---|
| 25 | |
---|
| 26 | |
---|
| 27 | |
---|
| 28 | ### change the permission of the settings file to allow everyone to write to it |
---|
| 29 | def __SetWritePermissions(*files): |
---|
| 30 | for filePath in files: |
---|
| 31 | try: |
---|
| 32 | flags = stat.S_IWUSR | stat.S_IRUSR | stat.S_IWGRP | stat.S_IRGRP | stat.S_IROTH |
---|
| 33 | os.chmod(filePath, flags) |
---|
| 34 | except: |
---|
| 35 | print str(sys.exc_info()[0])+" "+str(sys.exc_info()[1])+" "+str(sys.exc_info()[2]) |
---|
| 36 | |
---|
| 37 | |
---|
| 38 | |
---|
| 39 | def makeVideoThumb(fullPath, thumbPath): |
---|
| 40 | print "\n", 80*"-", "\ncreating video thumbnail with command: " |
---|
| 41 | # must create two frames because of mplayer bug |
---|
| 42 | createCmd = MPLAYER_DIR+" -vo jpeg -quiet -frames 2 -ss 5 "+ fullPath |
---|
| 43 | print createCmd |
---|
| 44 | try: |
---|
| 45 | sp.check_call(createCmd.split()) |
---|
| 46 | except: |
---|
| 47 | print "".join(tb.format_exception(sys.exc_info()[0], sys.exc_info()[1], sys.exc_info()[2])) |
---|
| 48 | |
---|
| 49 | # delete one of them |
---|
| 50 | try: |
---|
| 51 | os.remove("00000001.jpg") |
---|
| 52 | except: |
---|
| 53 | print "".join(tb.format_exception(sys.exc_info()[0], sys.exc_info()[1], sys.exc_info()[2])) |
---|
| 54 | |
---|
| 55 | # resize it to 300x300 |
---|
| 56 | try: |
---|
| 57 | im = wx.Image("00000002.jpg") # read the original image |
---|
| 58 | if im.Ok(): #the image may be corrupted... |
---|
| 59 | im.Rescale(300, 300) # resize it |
---|
| 60 | im.SaveFile("00000002.jpg", wx.BITMAP_TYPE_JPEG) # save it back to a file |
---|
| 61 | except: |
---|
| 62 | print "".join(tb.format_exception(sys.exc_info()[0], sys.exc_info()[1], sys.exc_info()[2])) |
---|
| 63 | |
---|
| 64 | # rename the right one |
---|
| 65 | try: |
---|
| 66 | shutil.move("00000002.jpg", thumbPath) |
---|
| 67 | except: |
---|
| 68 | print "".join(tb.format_exception(sys.exc_info()[0], sys.exc_info()[1], sys.exc_info()[2])) |
---|
| 69 | |
---|
| 70 | |
---|
| 71 | |
---|
| 72 | def makePDFThumb(fullPath, thumbPath): |
---|
| 73 | print "\n", 80*"-", "\ncreating PDF thumbnail with command: " |
---|
| 74 | createCmd = CONVERT_DIR+" -thumbnail 300x300 "+fullPath+"[0] "+thumbPath |
---|
| 75 | print createCmd |
---|
| 76 | try: |
---|
| 77 | sp.check_call(createCmd.split()) |
---|
| 78 | except: |
---|
| 79 | print "".join(tb.format_exception(sys.exc_info()[0], sys.exc_info()[1], sys.exc_info()[2])) |
---|
| 80 | |
---|
| 81 | |
---|
| 82 | |
---|
| 83 | def makeImageThumb(fullPath, thumbPath): |
---|
| 84 | def __GetWxBitmapType(name): |
---|
| 85 | ext = os.path.splitext(name)[1] |
---|
| 86 | ext = ext.lower() |
---|
| 87 | if ext==".jpg": return wx.BITMAP_TYPE_JPEG |
---|
| 88 | elif ext==".png": return wx.BITMAP_TYPE_PNG |
---|
| 89 | elif ext==".bmp": return wx.BITMAP_TYPE_BMP |
---|
| 90 | elif ext==".gif": return wx.BITMAP_TYPE_GIF |
---|
| 91 | elif ext==".pcx": return wx.BITMAP_TYPE_PCX |
---|
| 92 | elif ext==".pnm": return wx.BITMAP_TYPE_PNM |
---|
| 93 | elif ext==".tif": return wx.BITMAP_TYPE_TIF |
---|
| 94 | elif ext==".tiff": return wx.BITMAP_TYPE_TIF |
---|
| 95 | elif ext==".xpm": return wx.BITMAP_TYPE_XPM |
---|
| 96 | elif ext==".ico": return wx.BITMAP_TYPE_ICO |
---|
| 97 | elif ext==".cur": return wx.BITMAP_TYPE_CUR |
---|
| 98 | else: |
---|
| 99 | return False |
---|
| 100 | |
---|
| 101 | try: |
---|
| 102 | wxImageType = __GetWxBitmapType(os.path.basename(fullPath)) |
---|
| 103 | if wxImageType: # some types just cant be saved by wxPython |
---|
| 104 | # write the thumb but name it with a filename and filesize so that they are unique |
---|
| 105 | #thumbPath = __GetThumbName(fullPath, "image") |
---|
| 106 | im = wx.Image(fullPath) # read the original image |
---|
| 107 | |
---|
| 108 | if im.Ok(): #the image may be corrupted... |
---|
| 109 | im.Rescale(300, 300) # resize it |
---|
| 110 | im.SaveFile(thumbPath, wx.BITMAP_TYPE_JPEG) # save it back to a file |
---|
| 111 | except: |
---|
| 112 | print "".join(tb.format_exception(sys.exc_info()[0], sys.exc_info()[1], sys.exc_info()[2])) |
---|
| 113 | |
---|
| 114 | |
---|
| 115 | |
---|
| 116 | def makeThumbnail(fullPath, fileType, thumbPath): |
---|
| 117 | if not os.path.exists(thumbPath): |
---|
| 118 | if fileType == "image": |
---|
| 119 | makeImageThumb(fullPath, thumbPath) |
---|
| 120 | elif fileType == "video": |
---|
| 121 | makeVideoThumb(fullPath, thumbPath) |
---|
| 122 | elif fileType == "pdf": |
---|
| 123 | makePDFThumb(fullPath, thumbPath) |
---|
| 124 | else: |
---|
| 125 | print "\nERROR:Don't know how to make thumbnail for:", fileType |
---|
| 126 | |
---|
| 127 | if os.path.exists(thumbPath): |
---|
| 128 | __SetWritePermissions(thumbPath) |
---|
| 129 | |
---|
| 130 | |
---|
| 131 | def main(): |
---|
| 132 | for d in os.listdir(FILES_DIR): |
---|
| 133 | if d=="image" or d=="video" or d=="pdf": |
---|
| 134 | for root, dirs, files in os.walk(opj(FILES_DIR, d)): |
---|
| 135 | for f in files: |
---|
| 136 | fullPath = opj(root, f) |
---|
| 137 | thumbPath = __GetThumbName(fullPath, d) |
---|
| 138 | if not os.path.exists(thumbPath): |
---|
| 139 | makeThumbnail(fullPath, d, thumbPath) |
---|
| 140 | |
---|
| 141 | |
---|
| 142 | if __name__ == '__main__': |
---|
| 143 | import sys, os |
---|
| 144 | global FILES_DIR, THUMB_DIR |
---|
| 145 | |
---|
| 146 | if len(sys.argv) < 2: |
---|
| 147 | print "USAGE: python makeThumbs.py path_to_file_library" |
---|
| 148 | else: |
---|
| 149 | FILES_DIR = sys.argv[1] |
---|
| 150 | if os.path.exists(FILES_DIR): |
---|
| 151 | THUMB_DIR = opj(FILES_DIR, "thumbnails") |
---|
| 152 | main() |
---|
| 153 | else: |
---|
| 154 | print "Given directory doesn't exist... exiting" |
---|
| 155 | |
---|