aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lvc/basicconverters.py30
-rw-r--r--lvc/conversion.py35
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)