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 | |
---|