#!/usr/bin/env python
# coding: utf-8

from SConsTwin import MakeGenAction, IsSConsVersionGE
import os, sys

# поменьше служебных файлов на виду
tmp_dir = 'temp'
if os.path.isdir(tmp_dir) == 0:
    os.makedirs(tmp_dir)
SConsignFile(tmp_dir + os.sep + '.sconsign')

if not IsSConsVersionGE((1, 1, 0)):
    # до 1.1.0 md5 считалось чтением в строку (память) содержимого всего файла,
    # что для гигабайтных файлов фатально
    # Замечание: реально не вылетает если отключить вычисление csig, а не установкой
    # SourceSignatures('timestamp'); потому что csig вычисляется всегда, "на всякий случай" для <= 1.1.0
    from SCons.Node.FS import FileNodeInfo
    FileNodeInfo.field_list.remove('csig')

    SourceSignatures('timestamp')

# нужен правильный $PATH и т.д.
# просто Replace() не дают сделать
def_env = DefaultEnvironment()
def_env.Replace(ENV = os.environ)

if IsSConsVersionGE((2, 0, 0)):
    # :KLUDGE: надо разобраться, где ошибка (=> добавить ошибку в базу SCons)
    # проблемы имен директорий с не латинскими буквами (русскими)
    def print_cmd_line(s, target, source, env):
        # без u""!
        sys.stdout.write(s + "\n")
    def_env.Replace(PRINT_CMD_LINE_FUNC = print_cmd_line)

# звук тишины для неподвижных меню
def GetkHzArgForToolame(kHz):
    return kHz * 1000

argHz = GetkHzArgForToolame(48)
Command('Silent.mp2', [], "dd if=/dev/zero bs=4 count=1920 | twolame -b 128 -s %d -r - $TARGET" % argHz)

# основная функция создания меню
#import ADVD
#MakeADVDMenu = ADVD.MakeMenu 
#Export('MakeADVDMenu')

import ASettings
#SConscript([menu + '/SConscript' for menu in ASettings.List])

#
# Получение опций
#
user_options = Options(None, ARGUMENTS)
user_options.AddOptions(
        ('DVDLabel', 'DVD Label', ASettings.DVDLabel),
        ('DVDDrive', 'DVD drive to burn', ASettings.DVDDrive),
        ('DVDSpeed', 'Writing speed', ASettings.DVDSpeed)
    )
user_options_env = Environment(ENV = os.environ, options = user_options)
Help(user_options.GenerateHelpText(user_options_env))
user_options_dict = user_options_env.Dictionary()

DVDLabel = user_options_env['DVDLabel']
DVDDrive = user_options_env['DVDDrive']
DVDSpeed = float(user_options_env['DVDSpeed'])

#
# Основная цель
#
dvd_dir = 'dvd'
# так как директория не может быть целью для команд, то выберем главный файл
dvd_scons_target = dvd_dir + '/VIDEO_TS/VIDEO_TS.IFO'
main_target = Command(dvd_scons_target, ['DVDAuthor.xml'],
                      [
                        Delete(dvd_dir),
                        "dvdauthor -o " + dvd_dir + " -x $SOURCE",
                      ])
Clean(main_target, dvd_dir)
Default(dvd_dir)

#
# Дополнительные цели
#
def ParentDir(fname):
    import os
    return os.path.dirname(fname)

def GetDVDDir(video_ts_source, is_abs):
    dvd_dir = video_ts_source.path
    if is_abs:
        dvd_dir = video_ts_source.abspath
    return ParentDir(ParentDir(dvd_dir))

# /totem - специально никогда недоступная цель, которую вызываем через нормальный alias
# по-другому не знаю как сделать всегда выполняющуюся цель
def MakeAbstractName(target_name):
    return "/__" + target_name

def MakeAbstractCommandForDVDDir(target_name, command_action):
    abs_name = MakeAbstractName(target_name)
    abs_target = Command(abs_name, [dvd_scons_target], MakeGenAction(command_action)) # command_gen(abs_name)
    Alias(target_name, abs_target)

def ArgForCmd(arg):
    return "\"" + arg + "\""
# 
# * воспроизвести результат в Totem
#
# всю директорию указывать нельзя - scons будет пытаться со всех файлов брать md5="тупить на 4Gb"
def GenPlayerAction(player_name):
    def GenAction(source, target, env, for_signature):
        url = "dvd://%s" % (GetDVDDir(source[0], 1))
        return player_name + " " + ArgForCmd(url)
    return GenAction

def MakePlayerCommand(player_name):
    MakeAbstractCommandForDVDDir(player_name, GenPlayerAction(player_name))

MakePlayerCommand("totem")
MakePlayerCommand("xine")


DVDLabelOption = ''
if DVDLabel:
    DVDLabelOption = ' -V "' + DVDLabel + '"'

def MkIsoArgs(source):
    return '%s -dvd-video %s' % (DVDLabelOption, GetDVDDir(source[0], 0))
#
# * записать iso-образ
#
def IsWin32():
    return sys.platform == 'win32'
if IsWin32():
    mk_iso_cmd = "mkisofs"
else:
    mk_iso_cmd = "genisoimage"
    
def GenIsoAction(source, target, env, for_signature):
    return "%s%s > %s" % (mk_iso_cmd, MkIsoArgs(source), target[0].path)

# Замечание: 'scons -c' не удаляет iso, надо 'scons -c dvd.iso'
Command(dvd_dir + '.iso', [dvd_scons_target], MakeGenAction(GenIsoAction)) # "mkisofs -dvd-video $SOURCE > $TARGET")

DVDDriveArg    = '/dev/null'
if DVDDrive:
    DVDDriveArg = DVDDrive

DVDSpeedOption = ''
if DVDSpeed:
    DVDSpeedOption = ' -speed=' + str(DVDSpeed)
#
# * прожечь на DVD = "growisofs -dry-run -dvd-compat -Z /dev/dvd -dvd-video dvd"
# -use-the-force-luke=tty - чтобы без сомнений переписывал сожержимое DVD-+RW
def GenBurnAction(source, target, env, for_signature):
    return "growisofs -dvd-compat -use-the-force-luke=tty%s -Z %s%s" % (DVDSpeedOption, DVDDriveArg, MkIsoArgs(source))

MakeAbstractCommandForDVDDir("burn", GenBurnAction)

