Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP

Loading…

[AtomicParsley] add post processor #2436

Closed
wants to merge 5 commits into from

2 participants

@pulpe
Collaborator
@pulpe
Collaborator

What do you think @phihag?

@jaimeMF jaimeMF commented on the diff
youtube_dl/postprocessor/atomicparsley.py
((10 lines not shown))
+from ..utils import (
+ check_executable,
+ compat_urlretrieve,
+ encodeFilename,
+ PostProcessingError,
+ prepend_extension,
+ shell_quote
+)
+
+
+class AtomicParsleyPPError(PostProcessingError):
+ pass
+
+
+class AtomicParsleyPP(PostProcessor):
+ def __init__(self, downloader=None):
@jaimeMF Collaborator
jaimeMF added a note

If you are not doing any custom initialization, you don't need to declare the method.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
@jaimeMF

The ext field should be already set, do you know of some url where it's missing?

@jaimeMF jaimeMF commented on the diff
youtube_dl/postprocessor/atomicparsley.py
((22 lines not shown))
+
+
+class AtomicParsleyPP(PostProcessor):
+ def __init__(self, downloader=None):
+ PostProcessor.__init__(self, downloader)
+
+ def run(self, info):
+ if not check_executable('AtomicParsley', ['-v']):
+ raise AtomicParsleyPPError('AtomicParsley was not found. Please install.')
+
+ filename = info['filepath']
+ temp_filename = prepend_extension(filename, 'temp')
+ temp_thumbnail = prepend_extension(filename, 'thumb')
+
+ if not info.get('thumbnail'):
+ raise AtomicParsleyPPError('Thumbnail was not found. Nothing to do.')
@jaimeMF Collaborator
jaimeMF added a note

That shouldn't be an error, it should just exit the postprocessor and log a message.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
@jaimeMF jaimeMF closed this in 77477fa
@jaimeMF
Collaborator

Merged, thanks for the contribution and sorry for taking so much to review.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Commits on Feb 22, 2014
  1. @pulpe
Commits on Feb 23, 2014
  1. @pulpe
  2. @pulpe

    fix ffmpeg metadatapp

    pulpe authored
  3. @pulpe
  4. @pulpe

    use .get to prevent error

    pulpe authored
This page is out of date. Refresh to see the latest.
View
8 youtube_dl/__init__.py
@@ -83,6 +83,8 @@
from .version import __version__
from .YoutubeDL import YoutubeDL
from .postprocessor import (
+ AtomicParsleyPP,
+ FFmpegAudioFixPP,
FFmpegMetadataPP,
FFmpegVideoConvertor,
FFmpegExtractAudioPP,
@@ -479,6 +481,8 @@ def _hide_login_info(opts):
help='do not overwrite post-processed files; the post-processed files are overwritten by default')
postproc.add_option('--embed-subs', action='store_true', dest='embedsubtitles', default=False,
help='embed subtitles in the video (only for mp4 videos)')
+ postproc.add_option('--embed-thumbnail', action='store_true', dest='embedthumbnail', default=False,
+ help='embed thumbnail in the audio as cover art')
postproc.add_option('--add-metadata', action='store_true', dest='addmetadata', default=False,
help='write metadata to the video file')
postproc.add_option('--xattrs', action='store_true', dest='xattrs', default=False,
@@ -775,6 +779,10 @@ def _real_main(argv=None):
ydl.add_post_processor(FFmpegEmbedSubtitlePP(subtitlesformat=opts.subtitlesformat))
if opts.xattrs:
ydl.add_post_processor(XAttrMetadataPP())
+ if opts.embedthumbnail:
+ if not opts.addmetadata:
+ ydl.add_post_processor(FFmpegAudioFixPP())
+ ydl.add_post_processor(AtomicParsleyPP())
# Update version
if opts.update_self:
View
4 youtube_dl/postprocessor/__init__.py
@@ -1,5 +1,7 @@
+from .atomicparsley import AtomicParsleyPP
from .ffmpeg import (
+ FFmpegAudioFixPP,
FFmpegMergerPP,
FFmpegMetadataPP,
FFmpegVideoConvertor,
@@ -9,6 +11,8 @@
from .xattrpp import XAttrMetadataPP
__all__ = [
+ 'AtomicParsleyPP',
+ 'FFmpegAudioFixPP',
'FFmpegMergerPP',
'FFmpegMetadataPP',
'FFmpegVideoConvertor',
View
59 youtube_dl/postprocessor/atomicparsley.py
@@ -0,0 +1,59 @@
+# -*- coding: utf-8 -*-
+from __future__ import unicode_literals
+
+
+import os
+import subprocess
+
+from .common import PostProcessor
+
+from ..utils import (
+ check_executable,
+ compat_urlretrieve,
+ encodeFilename,
+ PostProcessingError,
+ prepend_extension,
+ shell_quote
+)
+
+
+class AtomicParsleyPPError(PostProcessingError):
+ pass
+
+
+class AtomicParsleyPP(PostProcessor):
+ def __init__(self, downloader=None):
@jaimeMF Collaborator
jaimeMF added a note

If you are not doing any custom initialization, you don't need to declare the method.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
+ PostProcessor.__init__(self, downloader)
+
+ def run(self, info):
+ if not check_executable('AtomicParsley', ['-v']):
+ raise AtomicParsleyPPError('AtomicParsley was not found. Please install.')
+
+ filename = info['filepath']
+ temp_filename = prepend_extension(filename, 'temp')
+ temp_thumbnail = prepend_extension(filename, 'thumb')
+
+ if not info.get('thumbnail'):
+ raise AtomicParsleyPPError('Thumbnail was not found. Nothing to do.')
@jaimeMF Collaborator
jaimeMF added a note

That shouldn't be an error, it should just exit the postprocessor and log a message.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
+
+ compat_urlretrieve(info['thumbnail'], temp_thumbnail)
+
+ cmd = ['AtomicParsley', filename, '--artwork', temp_thumbnail, '-o', temp_filename]
+
+ self._downloader.to_screen('[atomicparsley] Adding thumbnail to "%s"' % filename)
+
+ if self._downloader.params.get('verbose', False):
+ self._downloader.to_screen('[debug] AtomicParsley command line: %s' % shell_quote(cmd))
+
+ p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+ stdout, stderr = p.communicate()
+
+ if p.returncode != 0:
+ msg = stderr.decode('utf-8', 'replace').strip()
+ raise AtomicParsleyPPError(msg)
+
+ os.remove(encodeFilename(filename))
+ os.remove(encodeFilename(temp_thumbnail))
+ os.rename(encodeFilename(temp_filename), encodeFilename(filename))
+
+ return True, info
View
20 youtube_dl/postprocessor/ffmpeg.py
@@ -464,7 +464,11 @@ def run(self, info):
filename = info['filepath']
temp_filename = prepend_extension(filename, 'temp')
- options = ['-c', 'copy']
+ if info.get('ext') == u'm4a':
+ options = ['-vn', '-acodec', 'copy']
+ else:
+ options = ['-c', 'copy']
+
for (name, value) in metadata.items():
options.extend(['-metadata', '%s=%s' % (name, value)])
@@ -483,3 +487,17 @@ def run(self, info):
self.run_ffmpeg_multiple_files(info['__files_to_merge'], filename, args)
return True, info
+
+class FFmpegAudioFixPP(FFmpegPostProcessor):
+ def run(self, info):
+ filename = info['filepath']
+ temp_filename = prepend_extension(filename, 'temp')
+
+ options = ['-vn', '-acodec', 'copy']
+ self._downloader.to_screen(u'[ffmpeg] Fixing audio file "%s"' % filename)
+ self.run_ffmpeg(filename, temp_filename, options)
+
+ os.remove(encodeFilename(filename))
+ os.rename(encodeFilename(temp_filename), encodeFilename(filename))
+
+ return True, info
Something went wrong with that request. Please try again.