1# -*- coding: utf-8 -*-
2#
3# PhotoFilmStrip - Creates movies out of your pictures.
4#
5# Copyright (C) 2011 Jens Goepfert
6#
7
8import logging
9import os
10
11from photofilmstrip.action.IAction import IAction
12
13from photofilmstrip.lib.Settings import Settings
14from photofilmstrip.lib.util import CheckFile
15from photofilmstrip.core.Renderer import RENDERERS
16from photofilmstrip.core.RenderEngine import RenderEngineSlideshow, \
17    RenderEngineTimelapse
18from photofilmstrip.core.RenderJob import RenderJob
19from photofilmstrip.core.GPlayer import GPlayer
20
21
22class ActionRender(IAction):
23
24    def __init__(self, photoFilmStrip,
25                 profile,
26                 rendererClass, draftMode,
27                 outpath=None):
28        self.__photoFilmStrip = photoFilmStrip
29        self.__profile = profile
30        self.__rendererClass = rendererClass
31        self.__draftMode = draftMode
32        self.__outpath = outpath
33
34        self.__renderJob = None
35
36    def GetName(self):
37        return _(u'Start')
38
39    def _CheckAndGetOutFile(self):
40        if self.__outpath == "-":
41            return
42
43        projFile = self.__photoFilmStrip.GetFilename()
44        baseDir = os.path.dirname(projFile)
45        baseDir = os.path.join(baseDir, self.__profile.GetName())
46        if not os.path.isdir(baseDir):
47            os.makedirs(baseDir)
48
49        outFile = os.path.join(baseDir,
50                               os.path.basename(os.path.splitext(projFile)[0]))
51        return outFile
52
53    def _SaveSettings(self):
54        settings = Settings()
55        settings.SetLastProfile(self.__profile.GetName())
56
57        try:
58            idxRenderer = RENDERERS.index(self.__rendererClass)
59        except ValueError:
60            return
61
62        settings.SetUsedRenderer(idxRenderer)
63
64    def Execute(self):
65        audioFiles = []
66        audioLength = 0
67        for audioFile in self.__photoFilmStrip.GetAudioFiles():
68            if CheckFile(audioFile):
69                length = GPlayer(audioFile).GetLength()
70                audioFiles.append(audioFile)
71                logging.debug("Using audiofile '%s' with length: %s", audioFile, length)
72                audioLength += length
73            else:
74                logging.warning("Missing audiofile '%s'!", audioFile)
75
76        outFile = self._CheckAndGetOutFile()
77
78        self._SaveSettings()
79
80        savedProps = Settings().GetRenderProperties(self.__rendererClass.__name__)
81        for prop in self.__rendererClass.GetProperties():
82            value = savedProps.get(prop.lower(), self.__rendererClass.GetProperty(prop))
83            self.__rendererClass.SetProperty(prop, value)
84
85        totalLength = self.__photoFilmStrip.GetDuration(False)
86        if totalLength == -1:
87            totalLength = int(round((audioLength + 500) / 1000.0))
88
89        renderer = self.__rendererClass()
90        renderer.Init(self.__profile,
91                      self.__photoFilmStrip.GetAspect(),
92                      outFile)
93
94        renderer.SetAudioFiles(audioFiles)
95
96        if self.__photoFilmStrip.GetTimelapse():
97            uxEvent = "RenderTimeLapse"
98            renderEngine = RenderEngineTimelapse(self.__profile,
99                                                 self.__photoFilmStrip.GetPictures(),
100                                                 self.__draftMode)
101        else:
102            uxEvent = "RenderSlideshow"
103            renderEngine = RenderEngineSlideshow(self.__profile,
104                                                 self.__photoFilmStrip.GetPictures(),
105                                                 self.__draftMode,
106                                                 totalLength)
107
108        name = "%s (%s)" % (self.__photoFilmStrip.GetName(),
109                            self.__profile.GetName())
110
111        self.__renderJob = RenderJob(name, renderer,
112                                     renderEngine.GetTasks())
113        self.__renderJob.AddUxEvent(uxEvent)
114        self.__renderJob.AddUxEvent(self.__profile.GetName())
115
116    def GetRenderJob(self):
117        return self.__renderJob
118