diff options
-rw-r--r-- | lvc/basicconverters.py | 30 | ||||
-rw-r--r-- | lvc/conversion.py | 35 |
2 files changed, 45 insertions, 20 deletions
diff --git a/lvc/basicconverters.py b/lvc/basicconverters.py index ddf99ec..6d544e8 100644 --- a/lvc/basicconverters.py +++ b/lvc/basicconverters.py @@ -3,22 +3,27 @@ import re from lvc import converter + class WebM_UHD(converter.FFmpegConverterInfo1080p): media_type = 'format' extension = 'webm' parameters = ('-f webm -vcodec libvpx -g 120 -lag-in-frames 23 ' '-deadline good -cpu-used 0 -vprofile 0 -qmax 51 -qmin 11 ' - '-slices 4 -b:v 4M -acodec libvorbis -ab 128k -map_metadata -1 ' + '-slices 4 -b:v 4M -acodec libvorbis -ab 128k \ + -map_metadata -1 ' '-ar 44100') + class WebM_HD(converter.FFmpegConverterInfo720p): media_type = 'format' extension = 'webm' parameters = ('-f webm -vcodec libvpx -g 120 -lag-in-frames 16 ' '-deadline good -cpu-used 0 -vprofile 0 -qmax 51 -qmin 11 ' - '-slices 4 -b:v 2M -acodec libvorbis -ab 112k -map_metadata -1 ' + '-slices 4 -b:v 2M -acodec libvorbis -ab 112k \ + -map_metadata -1 ' '-ar 44100') + class WebM_SD(converter.FFmpegConverterInfo480p): media_type = 'format' extension = 'webm' @@ -27,6 +32,7 @@ class WebM_SD(converter.FFmpegConverterInfo480p): '-b:v 768k -acodec libvorbis -ab 112k -map_metadata -1 ' '-ar 44100') + class WebM_VP9(converter.FFmpegConverterInfo): media_type = 'format' extension = 'webm' @@ -34,28 +40,35 @@ class WebM_VP9(converter.FFmpegConverterInfo): '-quality good -crf 32 ' '-b:v 0 -acodec libopus -map_metadata -1') + class MP4(converter.FFmpegConverterInfo): media_type = 'format' extension = 'mp4' - parameters = ('-acodec aac -ab 96k -vcodec libx264 -preset slow -map_metadata -1' + parameters = ('-acodec aac -ab 96k -vcodec libx264 -preset slow \ + -map_metadata -1' '-f mp4 -crf 22') + class MP3(converter.FFmpegConverterInfo): media_type = 'format' extension = 'mp3' parameters = '-f mp3 -ac 2' audio_only = True + class OggVorbis(converter.FFmpegConverterInfo): media_type = 'format' extension = 'ogg' parameters = '-f ogg -vn -acodec libvorbis -aq 60' audio_only = True + class OggTheora(converter.FFmpegConverterInfo): media_type = 'format' extension = 'ogv' - parameters = '-f ogg -codec:v libtheora -qscale:v 7 -codec:a libvorbis -qscale:a 5 -map_metadata -1' + parameters = '-f ogg -codec:v libtheora -qscale:v 7 -codec:a libvorbis \ + -qscale:a 5 -map_metadata -1' + class DNxHD_1080(converter.FFmpegConverterInfo1080p): media_type = 'format' @@ -63,36 +76,42 @@ class DNxHD_1080(converter.FFmpegConverterInfo1080p): parameters = ('-r 23.976 -f mov -vcodec dnxhd -b:v ' '175M -acodec pcm_s16be -ar 48000') + class DNxHD_720(converter.FFmpegConverterInfo720p): media_type = 'format' extension = 'mov' parameters = ('-r 23.976 -f mov -vcodec dnxhd -b:v ' '175M -acodec pcm_s16be -ar 48000') + class PRORES_720(converter.FFmpegConverterInfo720p): media_type = 'format' extension = 'mov' parameters = ('-f mov -vcodec prores -profile 2 ' '-acodec pcm_s16be -ar 48000') + class PRORES_1080(converter.FFmpegConverterInfo1080p): media_type = 'format' extension = 'mov' parameters = ('-f mov -vcodec prores -profile 2 ' '-acodec pcm_s16be -ar 48000') + class AVC_INTRA_1080(converter.FFmpegConverterInfo1080p): media_type = 'format' extension = 'mov' parameters = ('-f mov -vcodec libx264 -pix_fmt yuv422p ' '-crf 0 -intra -b:v 100M -acodec pcm_s16be -ar 48000') + class AVC_INTRA_720(converter.FFmpegConverterInfo720p): media_type = 'format' extension = 'mov' parameters = ('-f mov -vcodec libx264 -pix_fmt yuv422p ' '-crf 0 -intra -b:v 100M -acodec pcm_s16be -ar 48000') + class NullConverter(converter.FFmpegConverterInfo): media_type = 'format' extension = None @@ -143,7 +162,8 @@ avc_intra_1080 = PRORES_1080('AVC Intra 1080p') avc_intra_720 = PRORES_720('AVC Intra 720p') ingest_formats = ('Ingest Formats', [dnxhd_1080, dnxhd_720, prores_1080, - prores_720, avc_intra_1080, avc_intra_720]) + prores_720, avc_intra_1080, + avc_intra_720]) null_converter = NullConverter('Same Format') converters = [video_formats, audio_formats, ingest_formats, null_converter] diff --git a/lvc/conversion.py b/lvc/conversion.py index 6d6f693..d634fe5 100644 --- a/lvc/conversion.py +++ b/lvc/conversion.py @@ -14,6 +14,7 @@ from lvc.widgets import get_conversion_directory logger = logging.getLogger(__name__) + class Conversion(object): def __init__(self, video, converter, manager, output_dir=None): self.video = video @@ -68,7 +69,7 @@ class Conversion(object): try: self.temp_output = tempfile.mktemp( dir=os.path.dirname(self.output)) - except EnvironmentError,e : + except EnvironmentError as e: logger.exception('while creating temp file for %r', self.output) self.error = str(e) @@ -101,7 +102,7 @@ class Conversion(object): # then we will transition the next state to 'failed' in # finalize() self.status = 'canceled' - except EnvironmentError, e: + except EnvironmentError as e: logger.exception('while stopping %s' % (self,)) self.error = str(e) self.popen = None @@ -116,14 +117,14 @@ class Conversion(object): # if we stop the thread, we can get here after `.stop()` # finishes. self.popen.wait() - except OSError, e: + except OSError as e: if e.errno == errno.ENOENT: self.error = '%r does not exist' % ( self.converter.get_executable(),) else: logger.exception('OSError in %s' % (self.thread.name,)) self.error = str(e) - except Exception, e: + except Exception as e: logger.exception('in %s' % (self.thread.name,)) self.error = str(e) @@ -140,22 +141,22 @@ class Conversion(object): def _write_thumbnail_file(self): if self.video.audio_only: logging.warning("write_thumbnail_file: audio_only=True " - "not writing thumbnail %s", self.video.filename) + "not writing thumbnail %s", self.video.filename) return output_basename = os.path.splitext(os.path.basename(self.output))[0] logging.info("td: %s ob: %s", self._get_thumbnail_dir(), - output_basename) + output_basename) thumbnail_path = os.path.join(self._get_thumbnail_dir(), - output_basename + '.png') + output_basename + '.png') logging.info("creating thumbnail: %s", thumbnail_path) width, height = self.converter.get_target_size(self.video) get_thumbnail_synchronous(self.video.filename, width, height, - thumbnail_path) + thumbnail_path) if os.path.exists(thumbnail_path): logging.info("thumbnail successful: %s", thumbnail_path) else: logging.warning("get_thumbnail_synchronous() succeeded, but the " - "thumbnail file is missing!") + "thumbnail file is missing!") def _get_thumbnail_dir(self): """Get the directory to store thumbnails in it. @@ -186,7 +187,7 @@ class Conversion(object): # because iterating over the file object gives us all the lines when # the process ends, and we're looking for real-time updates. for line in line_reader(self.popen.stdout): - self.lines.append(line) # for debugging, if needed + self.lines.append(line) # for debugging, if needed try: status = self.converter.process_status_line(self.video, line) except StandardError: @@ -234,9 +235,9 @@ class Conversion(object): self.notify_listeners() try: self.converter.finalize(self.temp_output, self.output) - except EnvironmentError, e: + except EnvironmentError as e: logger.exception('while trying to move %r to %r after %s', - self.temp_output, self.output, self) + self.temp_output, self.output, self) self.error = str(e) self.status = 'failed' else: @@ -246,8 +247,11 @@ class Conversion(object): try: os.unlink(self.temp_output) except EnvironmentError: - pass # ignore errors removing temp files; they may not have - # been created + pass + ''' + ignore errors removing temp files; + they may not have been created + ''' if self.status != 'canceled': self.status = 'failed' if self.status != 'canceled': @@ -258,6 +262,7 @@ class Conversion(object): return ([self.converter.get_executable()] + list(self.converter.get_arguments(self.video, output))) + class ConversionManager(object): def __init__(self, simultaneous=None): self.notify_queue = set() @@ -278,7 +283,7 @@ class ConversionManager(object): def run_conversion(self, conversion): if (self.simultaneous is not None and - len(self.in_progress) >= self.simultaneous): + len(self.in_progress) >= self.simultaneous): self.waiting.append(conversion) else: self._start_conversion(conversion) |