0d52ef724bd87267b7bd3946b85f31e9090bb8c0
[blender-addons-contrib.git] / sequencer_extra_actions / functions.py
1 # ##### BEGIN GPL LICENSE BLOCK #####
2 #
3 #  This program is free software; you can redistribute it and/or
4 #  modify it under the terms of the GNU General Public License
5 #  as published by the Free Software Foundation; either version 2
6 #  of the License, or (at your option) any later version.
7 #
8 #  This program is distributed in the hope that it will be useful,
9 #  but WITHOUT ANY WARRANTY; without even the implied warranty of
10 #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11 #  GNU General Public License for more details.
12 #
13 #  You should have received a copy of the GNU General Public License
14 #  along with this program; if not, write to the Free Software Foundation,
15 #  Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
16 #
17 # ##### END GPL LICENSE BLOCK #####
18
19 import bpy
20 import os.path
21 import operator
22
23 from bpy.props import IntProperty
24 from bpy.props import FloatProperty
25 from bpy.props import EnumProperty
26 from bpy.props import BoolProperty
27 from bpy.props import StringProperty
28
29
30 imb_ext_image = [
31     # IMG
32     ".png", ".tga", ".bmp", ".jpg", ".jpeg", ".sgi", ".rgb",
33     ".rgba", ".tif", ".tiff", ".tx", ".jp2", ".hdr", ".dds",
34     ".dpx", ".cin", ".exr", ".rw2",
35     # IMG QT
36     ".gif", ".psd", ".pct", ".pict", ".pntg", ".qtif"]
37
38
39 imb_ext_movie = [
40     ".avi", ".flc", ".mov", ".movie", ".mp4", ".m4v", ".m2v",
41     ".m2t", ".m2ts", ".mts", ".mv", ".avs", ".wmv", ".ogv",
42     ".dv", ".mpeg", ".mpg", ".mpg2", ".vob", ".mkv", ".flv",
43     ".divx", ".xvid", ".mxf"]
44     
45 movieextdict = [("1", ".avi", ""),
46             ("2", ".flc", ""),
47             ("3", ".mov", ""),
48             ("4", ".movie", ""),
49             ("5", ".mp4", ""),
50             ("6", ".m4v", ""),
51             ("7", ".m2v", ""),
52             ("8", ".m2t", ""),
53             ("9", ".m2ts", ""),
54             ("10", ".mts", ""),
55             ("11", ".mv", ""),
56             ("12", ".avs", ""),
57             ("13", ".wmv", ""),
58             ("14", ".ogv", ""),
59             ("15", ".dv", ""),
60             ("16", ".mpeg", ""),
61             ("17", ".mpg", ""),
62             ("18", ".mpg2", ""),
63             ("19", ".vob", ""),
64             ("20", ".mkv", ""),
65             ("21", ".flv", ""),
66             ("22", ".divx", ""),
67             ("23", ".xvid", ""),
68             ("24", ".mxf", "")]
69
70
71 # Functions
72
73 def add_marker(context, text):
74     scene = context.scene
75     markers = scene.timeline_markers
76     mark = markers.new(name=text)
77     mark.frame = scene.frame_current
78
79
80 def act_strip(context):
81     try:
82         return context.scene.sequence_editor.active_strip
83     except AttributeError:
84         return None
85
86
87 def detect_strip_type(filepath):
88     imb_ext_image = [
89     # IMG
90     ".png", ".tga", ".bmp", ".jpg", ".jpeg", ".sgi", ".rgb",
91     ".rgba", ".tif", ".tiff", ".tx", ".jp2", ".hdr", ".dds",
92     ".dpx", ".cin", ".exr",
93     # IMG QT
94     ".gif", ".psd", ".pct", ".pict", ".pntg", ".qtif"]
95
96     imb_ext_movie = [
97     ".avi", ".flc", ".mov", ".movie", ".mp4", ".m4v", ".m2v",
98     ".m2t", ".m2ts", ".mts", ".mv", ".avs", ".wmv", ".ogv", ".ogg",
99     ".dv", ".mpeg", ".mpg", ".mpg2", ".vob", ".mkv", ".flv",
100     ".divx", ".xvid", ".mxf"]
101
102     imb_ext_audio = [
103     ".wav", ".ogg", ".oga", ".mp3", ".mp2", ".ac3", ".aac",
104     ".flac", ".wma", ".eac3", ".aif", ".aiff", ".m4a"]
105
106     extension = os.path.splitext(filepath)[1]
107     extension = extension.lower()
108     if extension in imb_ext_image:
109         type = 'IMAGE'
110     elif extension in imb_ext_movie:
111         type = 'MOVIE'
112     elif extension in imb_ext_audio:
113         type = 'SOUND'
114     else:
115         type = None
116
117     return type
118
119
120 def getpathfrombrowser():
121     '''
122     returns path from filebrowser
123     '''
124     scn = bpy.context.scene
125     for a in bpy.context.window.screen.areas:
126         if a.type == 'FILE_BROWSER':
127             params = a.spaces[0].params
128             break
129     try:
130         params
131     except UnboundLocalError:
132         #print("no browser")
133         self.report({'ERROR_INVALID_INPUT'}, 'No visible File Browser')
134         return {'CANCELLED'}
135     path = params.directory
136     return path
137
138
139 def getfilepathfrombrowser():
140     '''
141     returns path and file from filebrowser
142     '''
143     scn = bpy.context.scene
144     for a in bpy.context.window.screen.areas:
145         if a.type == 'FILE_BROWSER':
146             params = a.spaces[0].params
147             break
148     try:
149         params
150     except UnboundLocalError:
151         #print("no browser")
152         self.report({'ERROR_INVALID_INPUT'}, 'No visible File Browser')
153         return {'CANCELLED'}
154
155     if params.filename == '':
156         #print("no file selected")
157         self.report({'ERROR_INVALID_INPUT'}, 'No file selected')
158         return {'CANCELLED'}
159     path = params.directory
160     filename = params.filename
161     return path, filename
162
163
164 def setpathinbrowser(path, file):
165     '''
166     set path and file in the filebrowser
167     '''
168     scn = bpy.context.scene
169     for a in bpy.context.window.screen.areas:
170         if a.type == 'FILE_BROWSER':
171             params = a.spaces[0].params
172             break
173     try:
174         params
175     except UnboundLocalError:
176         #print("no browser")
177         self.report({'ERROR_INVALID_INPUT'}, 'No visible File Browser')
178         return {'CANCELLED'}
179
180     params.directory = path
181     params.filename = file
182     return path, params
183
184
185 def sortlist(filelist):
186     '''
187     given a list of tuplas (path, filename) returns a list sorted by filename
188     '''
189     filelist_sorted = sorted(filelist, key=operator.itemgetter(1))
190     return filelist_sorted
191     
192 # recursive load functions 
193
194 def onefolder(context, default_recursive_ext):
195     '''
196     returns a list of MOVIE type files from folder selected in file browser
197     '''
198     filelist = []
199     path, filename = getfilepathfrombrowser()
200     extension = filename.rpartition(".")[2]
201     scn = context.scene
202
203     if detect_strip_type(path + filename) == 'MOVIE':
204         if default_recursive_ext == True:
205             for file in os.listdir(path):
206                 if file.rpartition(".")[2] == extension:
207                     filelist.append((path, file))
208         else:
209             for file in os.listdir(path):
210                 filelist.append((path, file))
211     return (filelist)
212
213 def recursive(context, default_recursive_ext):
214     '''
215     returns a list of MOVIE type files recursively from file browser
216     '''
217     filelist = []
218     path = getpathfrombrowser()
219     scn = context.scene
220     for i in movieextlist:
221         if i[0] == scn.default_ext:
222             extension = i[1].rpartition(".")[2]
223     #pythonic way to magic:
224     for root, dirs, files in os.walk(path):
225         for f in files:
226             if default_recursive_ext == True:
227                 if f.rpartition(".")[2] == extension:
228                     filelist.append((root, f))
229             else:
230                 filelist.append((root, f))
231     return filelist   
232
233
234
235 # jump to cut functions
236 def triminout(strip, sin, sout):
237     start = strip.frame_start + strip.frame_offset_start
238     end = start + strip.frame_final_duration
239     if end > sin:
240         if start < sin:
241             strip.select_right_handle = False
242             strip.select_left_handle = True
243             bpy.ops.sequencer.snap(frame=sin)
244             strip.select_left_handle = False
245     if start < sout:
246         if end > sout:
247             strip.select_left_handle = False
248             strip.select_right_handle = True
249             bpy.ops.sequencer.snap(frame=sout)
250             strip.select_right_handle = False
251     return {'FINISHED'}
252
253
254 #------------ random edit functions...
255
256 def randompartition(lst,n,rand):
257     division = len(lst) / float(n)
258     lista = []
259     for i in range(n):  lista.append(division)
260     var=0
261     for i in range(n-1):
262         lista[i]+= random.randint(-int(rand*division),int(rand*division))
263         var+=lista[i]
264     if lista[n-1] != len(lst)-var:
265         lista[n-1] = len(lst)-var
266     random.shuffle(lista)
267     division = len(lst) / float(n)
268     count = 0
269     newlist=[]
270     for i in range(n):
271         print(lst[count : int(lista[i]-1)+count])
272         newlist.append([lst[count : int(lista[i]-1)+count]])
273         count += int(lista[i]) 
274     return newlist