示例#1
0
def processFile(i_file):
    if cgruutils.isMovieExt(i_file):
        return processMovie(i_file)
    return processExif(i_file)
示例#2
0
文件: thumbnail.py 项目: smfilm/cgru
                        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))
示例#3
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
示例#4
0
文件: walk.py 项目: eoyilmaz/cgru
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
示例#5
0
    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:
示例#6
0
文件: thumbnail.py 项目: RISEFX/cgru
                        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))
示例#7
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 = ''
示例#8
0
文件: mediainfo.py 项目: CGRU/cgru
def processFile(i_file):
    if cgruutils.isMovieExt(i_file):
        return processMovie(i_file)
    return processExif(i_file)