def processFile(i_file): if cgruutils.isMovieExt(i_file): return processMovie(i_file) return processExif(i_file)
break if to_skip: if Options.verbose: print('Skipping: "%s"' % root) continue if Options.verbose: print('Scanning folder "%s"...' % root) images = [] for afile in files: if afile[0] in '._': continue if cgruutils.isImageExt(afile): images.append(afile) elif cgruutils.isMovieExt(afile) and not Options.nomovie: new_movie = os.path.join(root, afile) new_mtime = int(os.path.getmtime(new_movie)) if new_mtime > cur_mtime: Movie = new_movie cur_mtime = new_mtime if len(images) == 0: continue new_mtime = int(os.path.getmtime(os.path.join(root, images[0]))) if new_mtime > cur_mtime: Images = [] Movie = None images.sort() for i in range(Options.number): num = int(len(images) * (i + 1.0) / (Options.number + 1.0))
def walkdir(i_path, i_subwalk, i_curdepth=0): global Progress global PrevFiles global CurFiles global ThumbFolderCount global ReportFolderCount global TotalSpace # Output current path: if Options.verbose > i_curdepth and i_subwalk: outInfo('cur_path', i_path) # Output report: if Options.report is not None: if i_path.find(os.path.dirname(Options.output)) == -1: if ReportFolderCount % Options.report == 0: print('REPORT: %s - %.1f GB' % (i_path, TotalSpace / 1024 / 1024 / 1024)) sys.stdout.flush() ReportFolderCount += 1 out = jsonLoad(os.path.join(i_path, Options.output)) if out is None: out = dict() checkDict(out, True) try: entries = os.listdir(i_path) except: outInfo('error_listdir', str(sys.exc_info()[1])) return None for entry in entries: path = os.path.join(i_path, entry) st = None try: st = os.lstat(path) except: outInfo('error_listdir', str(sys.exc_info()[1])) continue # We are not walking in links: if stat.S_ISLNK(st.st_mode): continue if stat.S_ISDIR(st.st_mode): out['num_folders'] += 1 out['num_folders_total'] += 1 size, space = getSizeSpace(st) out['space'] += space TotalSpace += space fout = None if i_subwalk: # Recursively walk in a subfolder: fout = walkdir(path, True, i_curdepth + 1) else: # Load previous walk data: fout = jsonLoad(os.path.join(path, Options.output)) if fout is not None: checkDict(fout) # We do not need info for each subfolder in a child folder: del fout['files'] del fout['folders'] # Create an empty folder entry if not preset: if not 'folders' in out: out['folders'] = dict() if not isinstance(out['folders'], dict): out['folders'] = dict() if not entry in out['folders']: out['folders'][entry] = dict() # Merge keys from subfolder: for key in fout.keys(): out['folders'][entry][key] = fout[key] out['num_folders_total'] += fout['num_folders_total'] out['num_files_total'] += fout['num_files_total'] out['size_total'] += fout['size_total'] out['space'] += fout['space'] if stat.S_ISREG(st.st_mode): CurFiles += 1 size, space = getSizeSpace(st) if entry[0] != '.': out['num_files'] += 1 if cgruutils.isImageExt(path): if Options.thumb is not None: if out['num_images'] == 0: if ThumbFolderCount % Options.thumb == 0 and size < 10000000: print('@IMAGE!@' + path) sys.stdout.flush() ThumbFolderCount += 1 out['num_images'] += 1 elif cgruutils.isMovieExt(path) and Options.mediainfo: obj = mediainfo.processMovie(path) if obj and 'mediainfo' in obj: out['files'][entry] = obj['mediainfo'] out['num_files_total'] += 1 out['size_total'] += size out['size'] += size out['space'] += space TotalSpace += space # Just output progress: if PrevFiles: cur_progress = int(100.0 * CurFiles / PrevFiles) if cur_progress != Progress: Progress = cur_progress outInfo('progress', 'PROGRESS: %d%%' % Progress) # Skip soting data in .rules folders, or we will create '.rules/.rules' folders if os.path.basename(i_path) == os.path.dirname(Options.output): return out # Store current walk data: filename = os.path.join(i_path, Options.output) if not os.path.isdir(os.path.dirname(filename)): try: os.makedirs(os.path.dirname(filename)) except: outInfo('error_make_dir', str(sys.exc_info()[1])) if os.path.isdir(os.path.dirname(filename)): try: with open(filename, 'w') as f: json.dump(out, f, indent=1) except: outInfo('error_file_write', str(sys.exc_info()[1])) return out
def walkdir(i_path, i_subwalk, i_curdepth=0): global Progress global PrevFiles global CurFiles global ThumbFolderCount global ReportFolderCount global TotalSpace # Output current path: if Options.verbose > i_curdepth and i_subwalk: outInfo('cur_path',i_path) # Output report: if Options.report is not None: if i_path.find( os.path.dirname( Options.output)) == -1: if ReportFolderCount % Options.report == 0: print('REPORT: %s - %.1f GB' % ( i_path, TotalSpace / 1024 / 1024 / 1024 )) sys.stdout.flush() ReportFolderCount += 1 out = jsonLoad( os.path.join( i_path, Options.output)) if out is None: out = dict() checkDict(out, True) try: entries = os.listdir(i_path) except: outInfo('error_listdir',str(sys.exc_info()[1])) return None for entry in entries: path = os.path.join(i_path, entry) st = None try: st = os.lstat( path) except: outInfo('error_listdir',str(sys.exc_info()[1])) continue # We are not walking in links: if stat.S_ISLNK( st.st_mode): continue if stat.S_ISDIR( st.st_mode): out['num_folders'] += 1 out['num_folders_total'] += 1 size, space = getSizeSpace( st) out['space'] += space TotalSpace += space fout = None if i_subwalk: # Recursively walk in a subfolder: fout = walkdir(path, True, i_curdepth + 1) else: # Load previous walk data: fout = jsonLoad(os.path.join(path, Options.output)) if fout is not None: checkDict(fout) # We do not need info for each subfolder in a child folder: del fout['files'] del fout['folders'] # Create an empty folder entry if not preset: if not 'folders' in out: out['folders'] = dict() if not isinstance(out['folders'], dict): out['folders'] = dict() if not entry in out['folders']: out['folders'][entry] = dict() # Merge keys from subfolder: for key in fout.keys(): out['folders'][entry][key] = fout[key] out['num_folders_total'] += fout['num_folders_total'] out['num_files_total'] += fout['num_files_total'] out['size_total'] += fout['size_total'] out['space'] += fout['space'] if stat.S_ISREG( st.st_mode): CurFiles += 1 size, space = getSizeSpace( st) if entry[0] != '.': out['num_files'] += 1 if cgruutils.isImageExt( path): if Options.thumb is not None: if out['num_images'] == 0: if ThumbFolderCount % Options.thumb == 0 and size < 10000000: print('@IMAGE!@'+path) sys.stdout.flush() ThumbFolderCount += 1 out['num_images'] += 1 elif cgruutils.isMovieExt( path) and Options.mediainfo: obj = mediainfo.processMovie( path) if obj and 'mediainfo' in obj: out['files'][entry] = obj['mediainfo'] out['num_files_total'] += 1 out['size_total'] += size out['size'] += size out['space'] += space TotalSpace += space # Just output progress: if PrevFiles: cur_progress = int(100.0 * CurFiles / PrevFiles) if cur_progress != Progress: Progress = cur_progress outInfo('progress','PROGRESS: %d%%' % Progress) # Skip soting data in .rules folders, or we will create '.rules/.rules' folders if os.path.basename(i_path) == os.path.dirname(Options.output): return out # Store current walk data: filename = os.path.join(i_path, Options.output) if not os.path.isdir(os.path.dirname(filename)): try: os.makedirs(os.path.dirname(filename)) except: outInfo('error_make_dir',str(sys.exc_info()[1])) if os.path.isdir(os.path.dirname(filename)): try: with open(filename, 'w') as f: json.dump(out, f, indent=1) except: outInfo('error_file_write',str(sys.exc_info()[1])) return out
print('Views = "%s"' % views_str) for view in views_str.split(' '): view = view.strip() if view != '': if not view in nuke.views(): print('Warning: Skipping invalid view: "%s"' % view) print(parser.str_warning) continue views_num += 1 views.append(view) octx = nuke.OutputContext() octx.setView(1 + nuke.views().index(view)) filename = fileknob.getEvaluatedValue(octx) imagesdirs.append(os.path.dirname(filename)) filenames.append(filename) if cgruutils.isMovieExt(filename): MovieMode = True except Exception as e: errorExit('Can`t process views on "%s" write node:\n%s' % (xnode, e), True) # Check for valid view found: if views_num < 1: errorExit('Can`t find valid views on "%s" write node.' % xnode, True) # Check for multiview file (stereo EXR) multiview_file = False if views_num > 1: name = None multiview_file = True for img in filenames: if name is None:
break if to_skip: if Options.verbose: print('Skipping: "%s"' % root) continue if Options.verbose: print('Scanning folder "%s"...' % root) images = [] for afile in files: if afile[0] in '._': continue if cgruutils.isImageExt(afile): images.append(afile) elif cgruutils.isMovieExt(afile) and not Options.nomovie: new_movie = os.path.join(root, afile) new_mtime = int(os.path.getmtime(new_movie)) if new_movie > cur_mtime: Movie = new_movie cur_mtime = new_mtime if len(images) == 0: continue new_mtime = int(os.path.getmtime(os.path.join(root, images[0]))) if new_mtime > cur_mtime: Images = [] Movie = None images.sort() for i in range(Options.number): num = int(len(images) * (i + 1.0) / (Options.number + 1.0))
def __init__(self, afnode, wnode, subblock, prefix, fparams): if VERBOSE == 2: print('Initializing block parameters for "%s"' % wnode.name()) self.wnode = wnode self.valid = True self.subblock = subblock self.prefix = prefix self.framefirst = nuke.root().firstFrame() self.framelast = nuke.root().lastFrame() self.frameinc = 1 self.framespertask = 1 self.framesequential = 1 self.skipexisting = 0 self.maxruntasks = -1 self.capacity = -1 self.maxperhost = -1 self.maxruntime = -1 self.need_memory = -1 self.need_gpu_mem = -1 self.hostsmask = None self.hostsmaskexclude = None self.fullrangedepend = 0 self.tmpimage = 1 self.pathsmap = 1 self.imgfiles = [] self.moviemode = False self.tickets_use = 0 self.tickets_data = None # Just to add to the final job name some info, for example timecode self.jobname_suffix = '' if afnode is not None: self.framefirst = int(afnode.knob('framefirst').value()) self.framelast = int(afnode.knob('framelast').value()) self.frameinc = int(afnode.knob('frameinc').value()) self.framespertask = int(afnode.knob('framespertask').value()) self.framesequential = int(afnode.knob('framesequential').value()) self.skipexisting = int(afnode.knob('skipexisting').value()) self.maxruntasks = int(afnode.knob('maxruntasks').value()) self.capacity = int(afnode.knob('capacity').value()) self.maxperhost = int(afnode.knob('maxperhost').value()) self.maxruntime = int(afnode.knob('maxruntime').value()) self.need_memory = int(afnode.knob('need_memory').value()) self.need_gpu_mem = float(afnode.knob('need_gpu_mem').value()) self.tmpimage = int(afnode.knob('tmpimage').value()) self.pathsmap = int(afnode.knob('pathsmap').value()) self.hostsmask = afnode.knob('hostsmask').value() self.hostsmaskexclude = afnode.knob('hostsmaskexcl').value() self.tickets_use = int(afnode.knob('tickets_use').value()) self.tickets_data = afnode.knob('tickets_data').value() if int(afnode.knob('timecode_use').value()): timecode = afnode.knob('timecode').value() if len(timecode): frange = cgruutils.timecodesToFrameRange( timecode, nuke.root().fps()) if frange is None or frange[0] is None or frange[1] is None: nuke.message('Invalid timecode: "%s"' % timecode) return None self.framefirst = frange[0] self.framelast = frange[1] afnode.knob('timecode').setValue( cgruutils.timecodesFromFrameRange( frange[0], frange[1])) # Add timecode to a final job name: self.jobname_suffix += '.' + timecode.replace(' ', '') if self.skipexisting: self.framespertask = 1 self.writename = str(wnode.fullName()) if wnode.Class() == RenderNodeClassName: afcommon = __import__('afcommon', globals(), locals(), []) # Get images files: if nuke.toNode('root').knob('proxy').value(): fileknob = wnode.knob('proxy') else: fileknob = wnode.knob('file') # Get views: views = wnode.knob('views') if views is not None: views = views.value() if views is None or views == '': views = nuke.views() else: views = views.split(' ') else: views = nuke.views() # Iterate views: for view in views: view = view.strip() if not len(view): continue # skip empty view, may be after split(' ') # Check view exists: if not view in nuke.views(): print('Error: Skipping invalid view: "%s"' % view) continue # if len( self.imgfiles): # self.imgfiles += ';' # Get show files for current view and first and last frames: octx = nuke.OutputContext() octx.setView(1 + nuke.views().index(view)) octx_framefirst = self.framefirst octx_framelast = self.framelast if octx_framefirst < 0: octx_framefirst = 0 if octx_framelast < 0: octx_framelast = 0 # If frame first and frame last are equal no sequence needed if octx_framefirst == octx_framelast: octx.setFrame(octx_framefirst) self.imgfiles.append(fileknob.getEvaluatedValue(octx)) else: # Get files from first and last frames # to calculate frames pattern: octx.setFrame(octx_framefirst) images1 = fileknob.getEvaluatedValue(octx) if images1 is None or images1 == '': nuke.message('Error:\n' '%s\n' 'Files are empty.\n' 'View "%s", frame %d.' % (self.writename, view, self.framefirst)) self.valid = False return if cgruutils.isMovieExt(images1): self.imgfiles.append(images1) self.moviemode = True continue octx.setFrame(octx_framelast) images2 = fileknob.getEvaluatedValue(octx) if images2 is None or images2 == '': nuke.message('Error:\n' '%s\n' 'Files are empty.\n' 'View "%s", frame %d.' % (self.writename, view, self.framelast)) self.valid = False return part1, padding, part2 = afcommon.splitPathsDifference( images1, images2) if padding < 1: nuke.message('Error:\n' '%s\n' 'Invalid files pattern.\n' 'View "%s".' % (self.writename, view)) self.valid = False return self.imgfiles.append('%s@%s@%s' % (part1, '#' * padding, part2)) # Check images folders: for imgfile in self.imgfiles: folder = os.path.dirname(imgfile) if folder != '': if not os.path.isdir(folder): result = nuke.ask('Write Node "%s" Directory\n' '%s\n' 'Does not exist.\n' 'Create it?' % (self.writename, folder)) if result: os.makedirs(folder) if not os.path.isdir(folder): nuke.message("Can't create folder:\n%s" % folder) self.valid = False else: self.valid = False elif wnode.Class() == DailiesNodeClassName: if VERBOSE: print('Generating dailies "%s"' % self.writename) else: nuke.message('Node type\n"%s"\nis unsendable.' % self.writename) self.valid = False for par in fparams: if fparams[par] is not None: if hasattr(self, par): setattr(self, par, fparams[par]) if self.moviemode: self.framespertask = self.framelast - self.framefirst + 1 self.name = self.writename if subblock: if self.prefix is not None: if self.prefix != '': self.name = self.prefix + self.name self.dependmask = '' self.tasksdependmask = ''