예제 #1
0
def _HardLink(fs, src, dst):
    """Hard link function for hooking into SCons.Node.FS.

  Args:
    fs: Filesystem class to use.
    src: Source filename to link to.
    dst: Destination link name to create.

  Raises:
    OSError: The link could not be created.
  """
    # A hard link shares file permissions from the source.  On Windows, the write
    # access of the file itself determines whether the file can be deleted
    # (unlike Linux/Mac, where it's the write access of the containing
    # directory).  So if we made a link from a read-only file, the only way to
    # delete it would be to make the link writable, which would have the
    # unintended effect of making the source writable too.
    #
    # So if the source is read-only, we can't hard link from it.
    if not stat.S_IMODE(fs.stat(src)[stat.ST_MODE]) & stat.S_IWRITE:
        raise OSError('Unsafe to hard-link read-only file: %s' % src)

    # If the file is writable, only hard-link from it if it was build by SCons.
    # Those files shouldn't later become read-only.  We don't hard-link from
    # writable files which SCons didn't create, because those could become
    # read-only (for example, following a 'p4 submit'), which as indicated above
    # would make our link read-only too.
    if not fs.File(src).has_builder():
        raise OSError('Unsafe to hard-link file not built by SCons: %s' % src)

    try:
        win32file.CreateHardLink(dst, src)
    except win32file.error, msg:
        # Translate errors into standard OSError which SCons expects.
        raise OSError(msg)
예제 #2
0
def windows_hardlink(src, dest):
    import win32file, pywintypes
    try:
        win32file.CreateHardLink(dest, src)
    except pywintypes.error as e:
        msg = u'Creating hardlink from %s to %s failed: %%s' % (src, dest)
        raise Exception(msg % e)
    src_size = os.path.getsize(src)
    # We open and close dest, to ensure its directory entry is updated
    # see http://blogs.msdn.com/b/oldnewthing/archive/2011/12/26/10251026.aspx
    for i in range(10):
        # If we are on a network filesystem, we have to wait for some indeterminate time, since
        # network file systems are the best thing since sliced bread
        try:
            if windows_get_size(dest) == src_size:
                return
        except EnvironmentError:
            pass
        time.sleep(0.3)

    sz = windows_get_size(dest)
    if sz != src_size:
        msg = u'Creating hardlink from %s to %s failed: %%s' % (src, dest)
        raise Exception(msg %
                        ('hardlink size: %d not the same as source size' % sz))
예제 #3
0
def hardlink_file(src, dest):
    if iswindows:
        import win32file
        win32file.CreateHardLink(dest, src)
        if os.path.getsize(dest) != os.path.getsize(src):
            raise Exception('This apparently can happen on network shares. Sigh.')
        return
    os.link(src, dest)
예제 #4
0
def windows_fast_hardlink(src, dest):
    import win32file, pywintypes
    try:
        win32file.CreateHardLink(dest, src)
    except pywintypes.error as e:
        msg = 'Creating hardlink from %s to %s failed: %%s' % (src, dest)
        raise OSError(msg % e)
    ssz, dsz = windows_get_size(src), windows_get_size(dest)
    if ssz != dsz:
        msg = 'Creating hardlink from %s to %s failed: %%s' % (src, dest)
        raise OSError(msg % ('hardlink size: %d not the same as source size: %s' % (dsz, ssz)))
예제 #5
0
def link_local_settings(environment):
    """ link local_settings.py.environment as local_settings.py """

    # check that settings imports local_settings, as it always should,
    # and if we forget to add that to our project, it could cause mysterious
    # failures
    settings_file = os.path.join(env['django_dir'], 'settings.py')
    with open(settings_file) as settings_file:
        matching_lines = [
            line for line in settings_file if line.find('local_settings')
        ]
    if not matching_lines:
        print "Fatal error: settings.py doesn't seem to import " \
            "local_settings.*: %s" % settings_file
        sys.exit(1)

    # die if the correct local settings does not exist
    if not env['quiet']:
        print "### creating link to local_settings.py"
    local_settings_env_path = os.path.join(env['django_dir'],
                                           'local_settings.py.' + environment)
    if not os.path.exists(local_settings_env_path):
        print "Could not find file to link to: %s" % local_settings_env_path
        sys.exit(1)

    files_to_remove = ('local_settings.py', 'local_settings.pyc')
    for file in files_to_remove:
        full_path = os.path.join(env['django_dir'], file)
        if os.path.exists(full_path):
            os.remove(full_path)

    source = os.path.join(env['django_dir'],
                          'local_settings.py.%s' % environment)
    target = os.path.join(env['django_dir'], 'local_settings.py')

    if os.name == 'posix':
        os.symlink('local_settings.py.%s' % environment, target)
    elif os.name == 'nt':
        try:
            import win32file
        except ImportError:
            raise Exception("It looks like the PyWin32 extensions are not " +
                            "installed")
        if os.path.exists(target):
            os.unlink(target)
        try:
            win32file.CreateSymbolicLink(target, source)
        except NotImplementedError:
            win32file.CreateHardLink(target, source)
    else:
        import shutil
        shutil.copy2(source, target)
    env['environment'] = environment
예제 #6
0
파일: django.py 프로젝트: qris/mailer-dye
def link_local_settings(environment):
    """ link local_settings.py.environment as local_settings.py """
    if not env['quiet']:
        print "### creating link to local_settings.py"

    # check that settings imports local_settings, as it always should,
    # and if we forget to add that to our project, it could cause mysterious
    # failures
    settings_file_path = path.join(env['django_settings_dir'], 'settings.py')
    if not (path.isfile(settings_file_path)):
        raise InvalidProjectError(
            "Fatal error: settings.py doesn't seem to exist")
    with open(settings_file_path) as settings_file:
        matching_lines = [
            line for line in settings_file if 'local_settings' in line
        ]
    if not matching_lines:
        raise InvalidProjectError(
            "Fatal error: settings.py doesn't seem to import "
            "local_settings.*: %s" % settings_file_path)

    source = path.join(env['django_settings_dir'],
                       'local_settings.py.%s' % environment)
    target = path.join(env['django_settings_dir'], 'local_settings.py')

    # die if the correct local settings does not exist
    if not path.exists(source):
        raise InvalidProjectError("Could not find file to link to: %s" %
                                  source)

    # remove any old versions, plus the pyc copy
    for old_file in (target, target + 'c'):
        if path.exists(old_file):
            os.remove(old_file)

    if os.name == 'posix':
        os.symlink('local_settings.py.%s' % environment, target)
    elif os.name == 'nt':
        try:
            import win32file
        except ImportError:
            raise Exception(
                "It looks like the PyWin32 extensions are not installed")
        try:
            win32file.CreateSymbolicLink(target, source)
        except NotImplementedError:
            win32file.CreateHardLink(target, source)
    else:
        import shutil
        shutil.copy2(source, target)
    env['environment'] = environment
예제 #7
0
def os_link(src, dst):
    try:
        win32file.CreateHardLink(dst, src)
        # CreateHardLink sometimes succeeds on mapped drives but
        # following nlinks() returns 1. Check it now and bail out.
        if nlinks(src) < 2:
            try:
                win32file.DeleteFile(dst)
            except:
                pass
            # Fake hardlinking error
            raise OSError(errno.EINVAL, 'Hardlinking not supported')
    except pywintypes.error, details:
        raise OSError(errno.EINVAL, 'target implements hardlinks improperly')
예제 #8
0
def make_link(
    source_path, target_path
):  # links two paths. Files are hard linked, where as dirs are linked as junctions.
    if path.isfile(source_path):
        unlink(target_path)
        win32file.CreateHardLink(target_path, path.abspath(source_path))

    elif path.isdir(source_path):
        rmdir(target_path)

        win32file.CreateSymbolicLink(target_path, path.abspath(source_path), 1)

    else:
        return 1  # error
예제 #9
0
def os_link(src, dst):
    try:
        win32file.CreateHardLink(dst, src)
        # CreateHardLink sometimes succeeds on mapped drives but
        # following nlinks() returns 1. Check it now and bail out.
        if nlinks(src) < 2:
            try:
                win32file.DeleteFile(dst)
            except:
                pass
            # Fake hardlinking error
            raise WinOSError((18, 'CreateHardLink', 'The system cannot '
                              'move the file to a different disk drive'))
    except pywintypes.error, details:
        raise WinOSError(details)
예제 #10
0
def do_cli(manager, options):
    import win32file
    import win32serviceutil

    if hasattr(sys, 'real_prefix'):
        # We are in a virtualenv, there is some special setup
        if not os.path.exists(os.path.join(sys.prefix, 'python.exe')):
            console('Creating a hard link to virtualenv python.exe in root of virtualenv')
            win32file.CreateHardLink(os.path.join(sys.prefix, 'python.exe'),
                                     os.path.join(sys.prefix, 'Scripts', 'python.exe'))

    argv = options.args
    if options.help:
        argv = []

    # Hack sys.argv a bit so that we get a better usage message
    sys.argv[0] = 'flexget service'
    win32serviceutil.HandleCommandLine(AppServerSvc, argv=['flexget service'] + argv)
예제 #11
0
import atexit
import ConfigParser
import logging
import os
import smtplib
import stat
import threading
import time

from zope.sendmail.maildir import Maildir
from zope.sendmail.mailer import SMTPMailer

import sys
if sys.platform == 'win32':
    import win32file
    _os_link = lambda src, dst: win32file.CreateHardLink(dst, src, None)
else:
    _os_link = os.link

# The longest time sending a file is expected to take.  Longer than this and
# the send attempt will be assumed to have failed.  This means that sending
# very large files or using very slow mail servers could result in duplicate
# messages sent.
MAX_SEND_TIME = 60 * 60 * 3

# The below diagram depicts the operations performed while sending a message in
# the ``run`` method of ``QueueProcessorThread``.  This sequence of operations
# will be performed for each file in the maildir each time the thread "wakes
# up" to send messages.
#
# Any error conditions not depected on the diagram will provoke the catch-all
예제 #12
0
top_dir = os.path.dirname(os.path.abspath(__file__))
extensions = set(('.pdb', '.dll', '.exe', '.ocx'))
files_copied = 0

starttime = datetime.datetime.now()
print "Start " + starttime.isoformat()
destdir = tempfile.mkdtemp()
print "Destination " + destdir

for root, dirs, files in os.walk(top_dir):
    #print dirs
    for filename in (f for f in files if f[-4:] in extensions):
        #print os.path.join(root, filename)
        try:
            win32file.CreateHardLink(os.path.join(destdir, filename),
                                     os.path.join(root, filename))
            files_copied += 1
        except pywintypes.error as err:
            if err.winerror != 183:  #pywintypes.error (183, 'CreateHardLink', 'Cannot create a file when that file already exists.')
                raise
    for exclude in ('.git', '.svn', 'CVS', '.hg', '3rdParty', 'Python27',
                    'Python26'):
        if exclude in dirs:
            dirs.remove(exclude)

print "%d files copied" % files_copied

startup = win32process.STARTUPINFO()
startup.dwFlags += win32process.STARTF_USESTDHANDLES
startup.hStdInput = win32file.INVALID_HANDLE_VALUE
security_attributes = pywintypes.SECURITY_ATTRIBUTES()
예제 #13
0
    def __init__(self, global_vars, videofile, filename, filefolder,
                 progresbar, proglabel, disctype, title, chapter, threads,
                 seconds, encpass, fix_ac3):
        """ This class converts a video file to MPEG-1 or MPEG-2 format

		VIDEOFILE contains the parameters to convert the video
		FILENAME is the generic file name given by the user
		FILEFOLDER is the path where all the temporary and finall files will be created
		PROGRESBAR is the progress bar where the class will show the progress
		PROGLABEL is the label where the class will show what is it doing
		DISCTYPE can be dvd, vcd, svcd, cvd or divx
		TITLE and CHAPTER are the numbers used to identify the TITLE and CHAPTER number for this file
		THREADS is the number of threads to use
		SECONDS is the number of seconds we want to convert (for previews) 
		ENCPASS is the number of encoding pass"""

        devede_executor.executor.__init__(self, filename, filefolder,
                                          progresbar)
        self.printout = False

        self.percent2 = 120
        self.film_length = float(videofile["olength"])
        if seconds == 0:
            self.divide = float(videofile["olength"])
            if (videofile["cutting"]
                    == 1) or (videofile["cutting"]
                              == 2):  # if we want only one half of the file
                self.divide /= 2
        else:
            self.divide = float(seconds)

        if self.divide == 0:
            self.divide = 1

        self.error = ""
        progresbar.set_fraction(0)
        progresbar.set_text("")

        if videofile[
                "ismpeg"]:  # if the file hasn't to be converted, we simply copy or link it
            self.pulse = True
            self.print_error = _(
                "File copy failed\nMaybe you ran out of disk space?")
            if seconds == 0:
                texto = _("Copying the file") + "\n"
            else:
                texto = _("Creating preview") + "\n"
            proglabel.set_text(texto + videofile["filename"])
            currentfile = self.create_filename(filefolder + filename, title,
                                               chapter, disctype == "divx")

            print "\ncurrentfile is: ", currentfile, "\n"

            try:
                os.remove(currentfile)
            except:
                pass

            if (sys.platform == "win32") or (sys.platform == "win64"):
                # links do not work on windows, so just copy the file
                # self.launch_shell('copy "'+videofile["path"].replace('"','""')+'" "'+currentfile+'"',output=False)
                # Only hardlinks are available on 2000 and XP, reparse points are available from vista onwards.
                win32file.CreateHardLink(currentfile,
                                         videofile["path"].replace('"', '""'))
            else:
                if len(videofile["sub_list"]) == 0:
                    self.launch_shell('ln -s "' +
                                      videofile["path"].replace('"', '\\"') +
                                      '" "' + currentfile + '"',
                                      output=False)
                else:
                    self.launch_shell('cp "' +
                                      videofile["path"].replace('"', '\\"') +
                                      '" "' + currentfile + '"',
                                      output=False)
            return

        isvob = videofile["isvob"]

        self.pulse = False
        if seconds == 0:
            texto = (_(
                "Converting files from title %(title_number)s (pass %(pass_number)s)\n\n%(file_name)s"
            ) % {
                "title_number": str(title),
                "pass_number": str(encpass),
                "file_name": videofile["filename"]
            })
            proglabel.set_text(
                texto
            )  #+" "+str(title)+" Pass: "******"\n\n"+videofile["filename"] )
        else:
            texto = _("Creating preview")
            proglabel.set_text(texto + "\n" + videofile["filename"])

        addbars = False
        framerate = int(videofile["ofps"])
        videorate = int(videofile["vrate"])
        audiorate = self.adjust_audiorate(int(videofile["arate"]),
                                          disctype == "dvd")

        audio_final_rate = int(videofile["arateunc"])
        audiodelay = float(videofile["adelay"])
        final_framerate = float(videofile["fps"])
        aspect_ratio_original = videofile["oaspect"]
        aspect_ratio_final = videofile["aspect"]
        resx_final = videofile["width"]
        resy_final = videofile["height"]
        resx_original = videofile["owidth"]
        resy_original = videofile["oheight"]
        copy_audio = videofile["copy_audio"]
        sound51 = videofile["sound51"]
        gop12 = videofile["gop12"]
        audiostream = videofile["audio_stream"]
        swap_fields = videofile["swap_fields"]
        volume = videofile["volume"]
        audio_tracks = len(videofile["audio_list"])

        if (videofile["resolution"] == 0) and (disctype == "divx"):
            default_res = True
        else:
            default_res = False

        speed1, speed2 = devede_other.get_speedup(videofile)
        if speed1 == speed2:
            speedup = None
        else:
            speedup = str(speed1) + ":" + str(speed2)

        if aspect_ratio_original < 1.3:
            aspect_ratio_original = float(videofile["owidth"]) / (float(
                videofile["oheight"]))
        if aspect_ratio_original < 1.33333333:
            aspect_ratio_original = 1.33333333

        max_videorate = int(videorate * 2)
        min_videorate = int(videorate * 0.75)

        dsize, minvid, maxvid = devede_other.get_dvd_size(None, disctype)

        if max_videorate > maxvid:
            max_videorate = maxvid
        if min_videorate < minvid:
            min_videorate = minvid

        if videofile["blackbars"] == 0:  # check if has to add black bars
            addbars = True
            if (videofile["rotate"] == 90) or (videofile["rotate"] == 270):
                resx_original2 = resy_original
                resy_original2 = resx_original
                aratio = 1 / aspect_ratio_original
            else:
                resx_original2 = resx_original
                resy_original2 = resy_original
                aratio = aspect_ratio_original

            if (resx_original2 % 2) == 1:
                resx_original2 += 1
            if (resy_original2 % 2) == 1:
                resy_original2 += 1

            resy_tmp = int(resy_final * aspect_ratio_final / aratio)
            resx_tmp = int(resx_final * aratio / aspect_ratio_final)

            if (resx_tmp > resx_final):
                resx_inter = resx_final
                resy_inter = resy_tmp
            else:
                resx_inter = resx_tmp
                resy_inter = resy_final

            #resx_inter=resx_original2
            #resy_inter=int((resy_original2*aspect_ratio_original)/aspect_ratio_final)
            if (resx_inter % 2) == 1:
                resx_inter -= 1
            if (resy_inter % 2) == 1:
                resy_inter -= 1

            #if ((resy_inter<resy_original) or (resy_original+5>resy_inter)):
            #	addbars=False

        if addbars == False:
            resx_inter = resx_final
            resy_inter = resy_final
        else:
            if (resx_inter == resx_final):
                addx = 0
                addy = int((resy_final - resy_inter) / 2)
                if (addy % 2) == 1:
                    addy += 1
            else:
                addy = 0
                addx = int((resx_final - resx_inter) / 2)
                if (addx % 2) == 1:
                    addx += 1

        command_var = ["ffmpeg"]
        #command_var=["avconv"]

        command_var.append("-i")
        command_var.append(videofile["path"])

        if (volume != 100):
            command_var.append("-vol")
            command_var.append(str((256 * volume) / 100))

        if (audiodelay != 0.0) and (copy_audio == False) and (isvob == False):
            command_var.append("-itsoffset")
            command_var.append(str(audiodelay))
            command_var.append("-i")
            command_var.append(videofile["path"])
            command_var.append("-map")
            command_var.append("1:0")
            for l in range(audio_tracks):
                command_var.append("-map")
                command_var.append("0" + ":" + str(l + 1))

        if (isvob == False):
            cmd_line = ""

            extra_params = videofile["params_vf"]  # take the VF extra params
            while (extra_params != ""):
                extra_params, new_param = devede_other.get_new_param(
                    extra_params)
                if (new_param != "") and (new_param != ','):
                    while (len(new_param) > 1) and (new_param[0] == ','):
                        new_param = new_param[1:]
                    while (len(new_param) > 1) and (new_param[-1] == ','):
                        new_param = new_param[:-1]
                    if new_param == "fifo":
                        continue
                    if cmd_line != "":
                        cmd_line += ",fifo,"
                    cmd_line += new_param

            if videofile["deinterlace"] == "yadif":
                if (cmd_line != ""):
                    cmd_line += ",fifo,"
                cmd_line += "yadif"

            vflip = 0
            hflip = 0

            if (videofile["rotate"] == 90):
                if (cmd_line != ""):
                    cmd_line += ",fifo,"
                cmd_line += "transpose=1"
            elif (videofile["rotate"] == 270):
                if (cmd_line != ""):
                    cmd_line += ",fifo,"
                cmd_line += "transpose=2"
            elif (videofile["rotate"] == 180):
                vflip = 1
                hflip = 1

            if (videofile["vmirror"]):
                vflip = 1 - vflip
            if (videofile["hmirror"]):
                hflip = 1 - hflip

            if (vflip == 1):
                if (cmd_line != ""):
                    cmd_line += ",fifo,"
                cmd_line += "vflip"
            if (hflip == 1):
                if (cmd_line != ""):
                    cmd_line += ",fifo,"
                cmd_line += "hflip"

            if addbars and ((resx_inter != resx_original) or
                            (resy_inter != resy_original)) and (default_res
                                                                == False):
                if (cmd_line != ""):
                    cmd_line += ",fifo,"
                cmd_line += "scale=" + str(resx_inter) + ":" + str(
                    resy_inter) + ",fifo,pad=" + str(resx_final) + ":" + str(
                        resy_final) + ":" + str(addx) + ":" + str(
                            addy) + ":0x000000"

            if cmd_line != "":
                command_var.append("-vf")
                command_var.append(cmd_line)

        command_var.append("-y")

        vcd = False

        if (disctype != "divx"):
            command_var.append("-target")
            if (disctype == "dvd"):
                if final_framerate == 30:
                    command_var.append("ntsc-dvd")
                elif (framerate == 24):
                    command_var.append("film-dvd")
                else:
                    command_var.append("pal-dvd")
                if (copy_audio == False):
                    command_var.append("-acodec")
                    if fix_ac3:
                        command_var.append("ac3_fixed")
                    else:
                        command_var.append("ac3")
                #command_var.append("-maxrate")
                #command_var.append("7000k")
                #command_var.append("-minrate")
                #command_var.append("2200k")
            elif (disctype == "vcd"):
                vcd = True
                if final_framerate == 30:
                    command_var.append("ntsc-vcd")
                else:
                    command_var.append("pal-vcd")
            elif (disctype == "svcd"):
                if final_framerate == 30:
                    command_var.append("ntsc-svcd")
                else:
                    command_var.append("pal-svcd")
            elif (disctype == "cvd"):
                if final_framerate == 30:
                    command_var.append("ntsc-svcd")
                else:
                    command_var.append("pal-svcd")
        else:  # DivX
            command_var.append("-vcodec")
            command_var.append("mpeg4")
            command_var.append("-acodec")
            command_var.append("libmp3lame")
            command_var.append("-f")
            command_var.append("avi")

        if (not isvob):
            command_var.append("-sn")  # no subtitles

        if copy_audio or isvob:
            command_var.append("-acodec")
            command_var.append("copy")
        #else:
        #	if (disctype=="divx"):
        #		command_var.append("-acodec")
        #		command_var.append("mp3")

        #if (audiostream!=10000):
        #	command_var.append("-aid")
        #	command_var.append(str(audiostream))

        if isvob:
            command_var.append("-vcodec")
            command_var.append("copy")

        if (vcd == False):
            if final_framerate == 30:
                if (framerate == 24) and ((disctype == "dvd") or
                                          (disctype == "divx")):
                    str_final_framerate = "24000/1001"
                    keyintv = 15
                    telecine = True
                else:
                    str_final_framerate = "30000/1001"
                    keyintv = 18
            else:
                str_final_framerate = str(int(final_framerate))
                keyintv = 15

        if (disctype == "divx"):
            command_var.append("-g")
            command_var.append("300")
        elif gop12 and (isvob == False):
            command_var.append("-g")
            command_var.append("12")

        command_var.append("-bf")
        command_var.append("2")
        command_var.append("-strict")
        command_var.append("1")

        if seconds != 0:
            command_var.append("-t")
            command_var.append(str(seconds))
        else:
            if videofile["cutting"] == 1:  # first half only
                command_var.append("-t")
                command_var.append(str(videofile["olength"] / 2))
            elif videofile["cutting"] == 2:  # second half only
                command_var.append("-ss")
                command_var.append(str((videofile["olength"] / 2) -
                                       5))  # start 5 seconds before

        #if (audiodelay!=0.0) and (copy_audio==False) and (isvob==False):
        #	command_var.append("-delay")
        #	command_var.append(str(audiodelay))

        command_var.append("-ac")
        if (sound51) and ((disctype == "dvd") or (disctype == "divx")):
            command_var.append("6")
        else:
            command_var.append("2")

        #if (isvob==False) and (default_res==False):
        #	command_var.append("-ofps")
        #	command_var.append(str_final_framerate)

        if disctype == "divx":
            command_var.append("-vtag")
            command_var.append("DX50")

        lineatemp = ""
        acoma = False

        #if swap_fields:
        #	lineatemp+="phase=a"
        #	acoma=True

        passlog_var = None

        if (videofile["deinterlace"] != "none") and (
                videofile["deinterlace"] != "yadif") and (isvob == False):
            command_var.append("-deinterlace")

        print "Addbars " + str(addbars) + " resx_o " + str(
            resx_original) + " resy_o " + str(resy_original)
        print "resx_i " + str(resx_inter) + " resy_i " + str(resy_inter)

        if (isvob == False) and (vcd == False):
            command_var.append("-s")
            command_var.append(str(resx_final) + "x" + str(resy_final))

        # Currently Mencoder supports up to 8 threads
        if isvob == False:
            threads

            if threads > 1:
                command_var.append("-threads")
                command_var.append(str(threads))

            command_var.append("-trellis")
            if videofile["trellis"]:
                command_var.append("1")
            else:
                command_var.append("0")

            if videofile["mbd"] == 0:
                command_var.append("-mbd")
                command_var.append("0")
            elif videofile["mbd"] == 1:
                command_var.append("-mbd")
                command_var.append("1")
            elif videofile["mbd"] == 2:
                command_var.append("-mbd")
                command_var.append("2")

            if (vcd == False):
                command_var.append("-b")
                command_var.append(str(videorate) + "000")

            #if disctype!="divx":
            #	lavcopts+=":keyint="+str(keyintv)
            if (copy_audio == False) and (vcd == False):
                #					lavcopts+=":acodec="
                #					if disctype=="dvd":
                #						if fix_ac3:
                #							lavcopts+="ac3_fixed"
                #						else:
                #							lavcopts+="ac3"
                #					else:
                #						lavcopts+="mp2"
                #lavcopts+=":abitrate="+str(audiorate)
                command_var.append("-ab")
                command_var.append(str(audiorate) + "000")

            if (default_res == False):
                command_var.append("-aspect")
                if aspect_ratio_final > 1.4:
                    command_var.append("16:9")
                else:
                    command_var.append("4:3")

            passlog_var = None
            if (encpass > 0) and (isvob == False):
                command_var.append("-pass")
                command_var.append(str(encpass))
                passlog_var = os.path.join(filefolder, filename) + ".log"
                if encpass == 1:
                    try:
                        os.remove(passlog_var)
                    except:
                        pass

        at = audio_tracks
        while (at > 1):
            if (volume != 100):
                command_var.append("-vol")
                command_var.append(str((256 * volume) / 100))
            command_var.append("-newaudio")
            at -= 1

        extra_params = videofile["params"]  # take the extra params
        while (extra_params != ""):
            extra_params, new_param = devede_other.get_new_param(extra_params)
            if new_param != "":
                command_var.append(new_param)

        currentfile = self.create_filename(filefolder + filename, title,
                                           chapter, disctype == "divx")

        if (passlog_var != None) and (isvob == False):
            command_var.append("-passlogfile")
            command_var.append(passlog_var)

        if (encpass == 1) and (isvob == False):
            command_var.append("-y")
            command_var.append("/dev/null")
        else:
            command_var.append(currentfile)

        self.print_error = _("Conversion failed.\nIt seems a bug of Mencoder.")
        if (videofile["params"] != "") or (videofile["params_vf"] != "") or (
                videofile["params_lame"] != ""):
            self.print_error += "\n" + _(
                "Also check the extra params passed to Mencoder for syntax errors."
            )
        self.error_not_done = True
        self.launch_program(command_var, read_chars=300)
예제 #14
0
def create_hard_link(src, dest):
    if hasattr(os, "link"):
        os.link(src, dest)
    else:
        import win32file
        win32file.CreateHardLink(dest, src)
예제 #15
0
# Copyright (c) 2017 Vertex.AI
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

__version__ = '0.5.1'

import platform
if platform.system() == 'Windows':
    import os
    import os.path
    import win32file
    os.link = lambda (src, dest): win32file.CreateHardLink(
        os.path.abspath(dest), os.path.abspath(src))
    os.symlink = lambda (src, dest): win32file.CreateSymbolicLink(
        os.path.abspath(dest), os.path.abspath(src), 0x2)
예제 #16
0
def main(source, destination, job_name, version):
    extensions = set(('.pdb', '.dll', '.exe', '.ocx'))
    files_copied = 0

    starttime = datetime.datetime.now()
    log("Start " + starttime.isoformat())
    destdir = tempfile.mkdtemp()
    log("destination %s" % destdir)

    for root, dirs, files in os.walk(source):
        #print dirs
        for filename in (f for f in files if f[-4:] in extensions):
            pdb_dir = os.path.join(destdir, os.path.relpath(root, source))
            try:
                os.makedirs(pdb_dir)
            except WindowsError as err:
                if err.winerror != 183:
                    raise
            # print os.path.join(pdb_dir, filename)
            win32file.CreateHardLink(os.path.join(pdb_dir, filename),
                                     os.path.join(root, filename))
            files_copied += 1
            #except pywintypes.error as err:
            # if err.winerror != 183: #pywintypes.error (183, 'CreateHardLink', 'Cannot create a file when that file already exists.')
        for exclude in ('.git', '.svn', 'CVS', '.hg', '3rdParty', 'Python27',
                        'Python26'):
            if exclude in dirs:
                dirs.remove(exclude)

    log("%d files copied" % files_copied)

    startup = win32process.STARTUPINFO()
    startup.dwFlags += win32process.STARTF_USESTDHANDLES
    startup.hStdInput = win32file.INVALID_HANDLE_VALUE
    security_attributes = pywintypes.SECURITY_ATTRIBUTES()
    security_attributes.bInheritHandle = 1
    log_path = os.path.join(destdir, "log")
    startup.hStdOutput = startup.hStdError = win32file.CreateFile(
        log_path, win32file.GENERIC_WRITE, win32file.FILE_SHARE_READ,
        security_attributes, win32file.CREATE_ALWAYS, 0, None)
    win32file.WriteFile(startup.hStdOutput, 'log started\n')

    dtw_locations = (
        os.path.join(os.environ.get('ProgramFiles', r'C:\Program Files (x86)'),
                     'Debugging Tools for Windows (x86)'),
        os.path.join(os.environ.get('ProgramFiles', r'C:\Program Files'),
                     'Debugging Tools for Windows (x64)'),
        os.path.join(
            os.environ.get('ProgramFiles(x86)', r'C:\Program Files (x86)'),
            'Debugging Tools for Windows (x86)'),
        os.path.join(os.environ.get('ProgramW6432', r'C:\Program Files'),
                     'Debugging Tools for Windows (x64)'),
    )
    for dtw_location in dtw_locations:
        symstore = os.path.join(dtw_location, 'symstore.exe')
        if os.path.isfile(symstore):
            break
    else:
        raise Exception("Couldn't find symstore.exe in " +
                        ' '.join(dtw_locations) +
                        ". Is Debugging Tools for Windows installed?")

    (hProcess, hThread, processId, threadId) = win32process.CreateProcess(
        symstore,
        "symstore.exe add /r /f \"%s\" /s \"%s\" /t \"%s\" /v \"%s\"" %
        (destdir, destination, job_name, version), None, None, True,
        win32process.CREATE_BREAKAWAY_FROM_JOB, None, None, startup)
    win32api.CloseHandle(hThread)

    # Don't need to wait here, but it doesn't take long, and we can remove the temp dir
    import win32event
    win32event.WaitForSingleObject(hProcess, win32event.INFINITE)
    exit_code = win32process.GetExitCodeProcess(hProcess)
    log("symstore exited with code " + str(exit_code))
    win32api.CloseHandle(startup.hStdOutput)
    with file(log_path, "r") as log_file:
        for line in log_file:
            log("symstore: " + line.rstrip('\r\n'))
    import shutil
    shutil.rmtree(destdir)

    win32api.CloseHandle(hProcess)

    # print "\n".join(open(os.path.join(destdir, 'log'), 'r'))

    log("finish: %s" % datetime.datetime.now().isoformat())
    log("elapsed time: %d seconds" %
        (datetime.datetime.now() - starttime).seconds)
    return exit_code
예제 #17
0
	def __init__(self,global_vars,videofile,filename,filefolder,progresbar,proglabel,disctype,title,chapter,threads,seconds,encpass):

		""" This class converts a video file to MPEG-1 or MPEG-2 format

		VIDEOFILE contains the parameters to convert the video
		FILENAME is the generic file name given by the user
		FILEFOLDER is the path where all the temporary and finall files will be created
		PROGRESBAR is the progress bar where the class will show the progress
		PROGLABEL is the label where the class will show what is it doing
		DISCTYPE can be dvd, vcd, svcd, cvd or divx
		TITLE and CHAPTER are the numbers used to identify the TITLE and CHAPTER number for this file
		THREADS is the number of threads to use
		SECONDS is the number of seconds we want to convert (for previews) 
		ENCPASS is the number of encoding pass"""
		
		devede_executor.executor.__init__(self,filename,filefolder,progresbar)
		self.printout=False

		self.percent2=120
		if seconds==0:
			self.divide=float(videofile["olength"])
			if (videofile["cutting"]==1) or (videofile["cutting"]==2): # if we want only one half of the file
				self.divide/=2
		else:
			self.divide=float(seconds)

		if self.divide==0:
			self.divide=1

		self.error=""
		progresbar.set_fraction(0)
		progresbar.set_text("")
		
		if videofile["ismpeg"]: # if the file hasn't to be converted, we simply copy or link it
			self.pulse=True
			self.print_error=_("File copy failed\nMaybe you ran out of disk space?")
			if seconds==0:
				texto=_("Copying the file")+"\n"
			else:
				texto=_("Creating preview")+"\n"
			proglabel.set_text(texto+videofile["filename"])
			currentfile=self.create_filename(filefolder+filename,title,chapter,disctype=="divx")
		
			print "\ncurrentfile is: ", currentfile , "\n" 

			try:
				os.remove(currentfile)
			except:
				pass

			if (sys.platform=="win32") or (sys.platform=="win64"):
				# links do not work on windows, so just copy the file
				# self.launch_shell('copy "'+videofile["path"].replace('"','""')+'" "'+currentfile+'"',output=False)
				# Only hardlinks are available on 2000 and XP, reparse points are available from vista onwards.
				win32file.CreateHardLink(currentfile, videofile["path"].replace('"','""'))
			else:
				if len(videofile["sub_list"])==0:
					self.launch_shell('ln -s "'+videofile["path"].replace('"','\\"')+'" "'+currentfile+'"',output=False)
				else:
					self.launch_shell('cp "'+videofile["path"].replace('"','\\"')+'" "'+currentfile+'"',output=False)
			return

		isvob=videofile["isvob"]

		self.pulse=False
		if seconds==0:
			texto=(_("Converting files from title %(title_number)s (pass %(pass_number)s)\n\n%(file_name)s") % {"title_number":str(title),"pass_number":str(encpass),"file_name":videofile["filename"]} )
			proglabel.set_text(texto) #+" "+str(title)+" Pass: "******"\n\n"+videofile["filename"] )
		else:
			texto=_("Creating preview")
			proglabel.set_text(texto+"\n"+videofile["filename"])

		addbars=False
		framerate=int(videofile["ofps"])
		videorate=int(videofile["vrate"])
		audiorate=self.adjust_audiorate(int(videofile["arate"]),disctype=="dvd")
		
		audio_final_rate=int(videofile["arateunc"])
		audiodelay=float(videofile["adelay"])
		final_framerate=float(videofile["fps"])
		aspect_ratio_original=videofile["oaspect"]
		aspect_ratio_final=videofile["aspect"]
		resx_final=videofile["width"]
		resy_final=videofile["height"]
		resx_original=videofile["owidth"]
		resy_original=videofile["oheight"]
		copy_audio=videofile["copy_audio"]
		sound51=videofile["sound51"]
		gop12=videofile["gop12"]
		audiostream=videofile["audio_stream"]
		swap_fields=videofile["swap_fields"]
		volume=videofile["volume"]
		if (videofile["resolution"]==0) and (disctype=="divx"):
			default_res=True
		else:
			default_res=False
		
		speed1,speed2=devede_other.get_speedup(videofile)
		if speed1==speed2:
			speedup=None
		else:
			speedup=str(speed1)+":"+str(speed2)
	
		if aspect_ratio_original<1.3:
			aspect_ratio_original=float(videofile["owidth"])/(float(videofile["oheight"]))
		if aspect_ratio_original<1.33333333:
			aspect_ratio_original=1.33333333
	
		max_videorate=int(videorate*2)
		min_videorate=int(videorate*0.75)
		
		dsize,minvid,maxvid=devede_other.get_dvd_size(None,disctype)
		
		if max_videorate>maxvid:
			max_videorate=maxvid
		if min_videorate<minvid:
			min_videorate=minvid
			
		if videofile["blackbars"]==0: # check if has to add black bars
			addbars=True
			if (videofile["rotate"]==90) or (videofile["rotate"]==270):
				resx_original2=resy_original
				resy_original2=resx_original
			else:
				resx_original2=resx_original
				resy_original2=resy_original

			if (resx_original2%2)==1:
				resx_original2+=1
			if (resy_original2%2)==1:
				resy_original2+=1
			resx_inter=resx_original2
			resy_inter=int((resy_original2*aspect_ratio_original)/aspect_ratio_final)
			if (resy_inter%2)==1:
				resy_inter+=1
			
			# due to a bug in MENCODER, we put bars only up and down, never left and right,
			# and we don't scale it if we have to add only 4 or less lines, because it is
			# too much work for so little profit
			
			if ((resy_inter<resy_original) or (resy_original+5>resy_inter)):
				addbars=False

		if addbars==False:
			resx_inter=resx_original
			resy_inter=resy_original
		else:
			addx=0
			addy=int((resy_inter-resy_original)/2)
			if(addy%2)==1:
				addy+=1

		command_var=[]
		if (sys.platform!="win32") and (sys.platform!="win64"):
			command_var=["mencoder"]
		else:
			command_var=["mencoder.exe"]

		if (disctype=="dvd") or (disctype=="divx"):
			audio_desired_final_rate=48000
		else:
			audio_desired_final_rate=44100

		afvalues=""

		if isvob==False:
			if ((audio_final_rate!=audio_desired_final_rate) and (copy_audio==False)) or (speedup!=None):
				command_var.append("-srate")
				command_var.append(str(audio_desired_final_rate))
				afvalues+="lavcresample="+str(audio_desired_final_rate)
			
			if (copy_audio==False) and volume!=100:
				if afvalues!="":
					afvalues+=":"
				afvalues+="volume="+str(10*math.log(volume/10,10))

			# Add the speedup code

			if speedup!=None:
				command_var.append("-speed")
				command_var.append(speedup)

		if afvalues!="":
			command_var.append("-af")
			command_var.append(afvalues)
			
		command_var.append("-noautosub")

		command_var.append("-oac")
		if copy_audio or isvob:
			command_var.append("copy")
		else:
			if (disctype=="divx"):
				command_var.append("mp3lame")
			else:
				command_var.append("lavc")

		if (audiostream!=10000):
			command_var.append("-aid")
			command_var.append(str(audiostream))


		
		telecine=False
		if final_framerate==30:
			if (framerate==24) and ((disctype=="dvd") or (disctype=="divx")):
				str_final_framerate="24000/1001"
				keyintv=15
				telecine=True
			else:
				str_final_framerate="30000/1001"
				keyintv=18
		else:
			str_final_framerate=str(int(final_framerate))
			keyintv=15
		
		if gop12:
			keyintv=12
		
		command_var.append("-ovc")
		if isvob:
			command_var.append("copy")
		else:
			command_var.append("lavc")
		
		if (disctype!="divx"):
			command_var.append("-of")
			command_var.append("mpeg")
			command_var.append("-mpegopts")
			if disctype=="dvd":
				if telecine and isvob==False:
					command_var.append("format=dvd:tsaf:telecine")
				else:
					command_var.append("format=dvd:tsaf")
			elif disctype=="vcd":
				command_var.append("format=xvcd")
			elif (disctype=="svcd") or (disctype=="cvd"):
				command_var.append("format=xsvcd")
			else:
				print "Error, disc format incorrect. Talk with the creator."
				sys.exit(1)

		if seconds!=0:
			command_var.append("-endpos")
			command_var.append(str(seconds))
		else:
			if videofile["cutting"]==1: # first half only
				command_var.append("-endpos")
				command_var.append(str(videofile["olength"]/2))
			elif videofile["cutting"]==2: # second half only
				command_var.append("-ss")
				command_var.append(str((videofile["olength"]/2)-5)) # start 5 seconds before

		if (audiodelay!=0.0) and (copy_audio==False) and (isvob==False):
			command_var.append("-delay")
			command_var.append(str(audiodelay))

		if sound51:
			command_var.append("-channels")
			command_var.append("6")

		if (isvob==False) and (default_res==False):
			command_var.append("-ofps")
			command_var.append(str_final_framerate)

		if disctype=="divx":
			command_var.append("-ffourcc")
			command_var.append("DX50")

		lineatemp=""
		acoma=False;
		
		if swap_fields:
			lineatemp+="phase=a"
			acoma=True
		
		extra_params=videofile["params_vf"] # take the VF extra params
		while (extra_params!=""):
			extra_params,new_param=devede_other.get_new_param(extra_params)
			if (new_param!="") and (new_param!=','):
				while (len(new_param)>1) and (new_param[0]==','):
					new_param=new_param[1:]
				while (len(new_param)>1) and (new_param[-1]==','):
					new_param=new_param[:-1]
				if acoma:
					lineatemp+=","
				lineatemp+=new_param
				acoma=True
		
		vmirror=0
		hmirror=0
		passlog_var = None
		
		if videofile["deinterlace"]!="none":
			if acoma:
				lineatemp+=","
			if videofile["deinterlace"]!="yadif":
				lineatemp+="pp="+videofile["deinterlace"]
			else:
				lineatemp+="yadif=0"
			acoma=True
			
		if videofile["rotate"]==180:
			vmirror=1-vmirror
			hmirror=1-hmirror
		
		if videofile["vmirror"]:
			vmirror=1-vmirror
		
		if videofile["hmirror"]:
			hmirror=1-hmirror
		
		if vmirror==1:
			if acoma:
				lineatemp+=","
			lineatemp+="flip"
			acoma=True
		
		if hmirror==1:
			if acoma:
				lineatemp+=","
			lineatemp+="mirror"
			acoma=True
		
		print "Addbars "+str(addbars)+" resx_o "+str(resx_original)+" resy_o "+str(resy_original)
		print "resx_i "+str(resx_inter)+" resy_i "+str(resy_inter)
		if addbars and ((resx_inter!=resx_original) or (resy_inter!=resy_original)) and (default_res==False):
			if acoma:
				lineatemp+=","
			lineatemp+="expand="+str(resx_inter)+":"+str(resy_inter)+":"+str(addx)+":"+str(addy)
			acoma=True

		if videofile["rotate"]==90:
			if acoma:
				lineatemp+=","
			lineatemp+="rotate=1"
			acoma=True
		
		if videofile["rotate"]==270:
			if acoma:
				lineatemp+=","
			lineatemp+="rotate=2"
			acoma=True

		if ((resx_inter!=resx_final) or (resy_inter!=resy_final)) and (default_res==False):
			if acoma:
				lineatemp+=","
			lineatemp+="scale="+str(resx_final)+":"+str(resy_final)
			acoma=True
		
		if disctype!="divx":
			if acoma:
				lineatemp+=","
			lineatemp+="harddup"
			acoma=True

		if (lineatemp!="") and (isvob==False):
			command_var.append("-vf")		
			command_var.append(lineatemp)

		if isvob==False:
			command_var.append("-lavcopts")
			
			lavcopts=""
			
			# Currently Mencoder supports up to 8 threads
			if threads>8:
				nthreads=8
			else:
				nthreads=threads
			
			if nthreads>1:
				lavcopts="threads="+str(nthreads)+":"
			lavcopts+="vcodec="
			if disctype=="vcd":
				lavcopts+="mpeg1video"
			elif disctype=="divx":
				lavcopts+="mpeg4"
			else:
				lavcopts+="mpeg2video"
		
			if videofile["trellis"]:
				lavcopts+=":trell"
		
			if videofile["mbd"]==0:
				lavcopts+=":mbd=0"	
			elif videofile["mbd"]==1:
				lavcopts+=":mbd=1"
			elif videofile["mbd"]==2:
				lavcopts+=":mbd=2"
	
			lavcopts+=":sc_threshold=1000000000:cgop"

			if disctype!="divx":
				lavcopts+=":vstrict=0:vrc_maxrate="+str(max_videorate)
				lavcopts+=":vrc_buf_size="
				if (disctype=="vcd"):
					lavcopts+="327"
				elif (disctype=="svcd") or (disctype=="cvd"):
					lavcopts+="917"
				elif (disctype=="dvd"):
					lavcopts+="1835"
			if disctype=="vcd":
				lavcopts+=":vrc_minrate="+str(min_videorate)
	
			lavcopts+=":vbitrate="+str(videorate)
		
			if disctype!="divx":
				lavcopts+=":keyint="+str(keyintv)
				if(copy_audio==False):
					lavcopts+=":acodec="
					if disctype=="dvd":
						lavcopts+="ac3"
					else:
						lavcopts+="mp2"
					lavcopts+=":abitrate="+str(audiorate)

			if (default_res==False):
				if aspect_ratio_final>1.4:
					lavcopts+=":aspect=16/9"
				else:
					lavcopts+=":aspect=4/3"
			
			if encpass > 0:
				lavcopts+=":vpass="******".log"
				if encpass==1:
					try:
						os.remove(passlog_var)
					except:
						 pass
					if videofile["turbo1stpass"]:
						lavcopts+=":turbo"
				
	
			extra_params=videofile["params_lavc"] # take the LAVC extra params
			while (extra_params!=""):
				extra_params,new_param=devede_other.get_new_param(extra_params)
				if (new_param!="") and (new_param!=':'):
					while (len(new_param)>1) and (new_param[0]==':'):
						new_param=new_param[1:]
					while (len(new_param)>1) and (new_param[-1]==':'):
						new_param=new_param[:-1]
					lavcopts+=":"+new_param
			command_var.append(lavcopts)
	
		if (disctype=="divx") and (copy_audio==False) and (isvob==False):
			lameopts="abr:br="+str(audiorate)
			command_var.append("-lameopts")
			extra_params=videofile["params_lame"] # take the LAME extra params
			while (extra_params!=""):
				extra_params,new_param=devede_other.get_new_param(extra_params)
				if (new_param!="") and (new_param!=':'):
					while (len(new_param)>1) and (new_param[0]==':'):
						new_param=new_param[1:]
					while (len(new_param)>1) and (new_param[-1]==':'):
						new_param=new_param[:-1]
					lameopts+=":"+new_param
			command_var.append(lameopts)
	
		currentfile=self.create_filename(filefolder+filename,title,chapter,disctype=="divx")

		if (passlog_var != None):
			command_var.append("-passlogfile")
			command_var.append(passlog_var)

		command_var.append("-o")
		command_var.append(currentfile)
		command_var.append(videofile["path"])

		extra_params=videofile["params"] # take the extra params
		while (extra_params!=""):
			extra_params,new_param=devede_other.get_new_param(extra_params)
			if new_param!="":
				command_var.append(new_param)

		self.print_error=_("Conversion failed.\nIt seems a bug of Mencoder.")
		if (videofile["params"]!="") or (videofile["params_vf"]!="") or (videofile["params_lavc"]!="") or (videofile["params_lame"]!=""):
			self.print_error+="\n"+_("Also check the extra params passed to Mencoder for syntax errors.")
		self.error_not_done=True
		self.launch_program(command_var,read_chars=300)
예제 #18
0
def make_hardlink(dest_path, link_path):
    win32file.CreateHardLink(dest_path, link_path)