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