Implemented --exec option.
authormcd1992 <theanonbutinf@gmail.com>
Fri, 22 Aug 2014 21:40:43 +0000 (16:40 -0500)
committermcd1992 <theanonbutinf@gmail.com>
Sun, 24 Aug 2014 19:38:43 +0000 (14:38 -0500)
README.md
youtube_dl/.__init__.py.swp [new file with mode: 0644]
youtube_dl/__init__.py
youtube_dl/postprocessor/__init__.py
youtube_dl/postprocessor/execafterdownload.py [new file with mode: 0644]

index ba9fec8a7bd3bbc26b0dda1dead97498516f1435..30bdac1899374e8cb906bafc8b4397e0cf41de4a 100644 (file)
--- a/README.md
+++ b/README.md
@@ -288,6 +288,8 @@ which means you can modify it, redistribute it or use it however you like.
                                      postprocessors (default)
     --prefer-ffmpeg                  Prefer ffmpeg over avconv for running the
                                      postprocessors
+    --exec                           Execute a command after the file is finished downloading, similar to find's -exec format
+                                     Example: --exec 'adb push {} /sdcard/Music/ && rm {}'
 
 # CONFIGURATION
 
diff --git a/youtube_dl/.__init__.py.swp b/youtube_dl/.__init__.py.swp
new file mode 100644 (file)
index 0000000..0586277
Binary files /dev/null and b/youtube_dl/.__init__.py.swp differ
index a96bf9b5cd978cdc09e8cec4596cad473adc809a..189a8ff35897b5b01c38f92c2bb4e681eca8ca44 100644 (file)
@@ -71,8 +71,12 @@ __authors__  = (
     'Sebastian Haas',
     'Alexander Kirk',
     'Erik Johnson',
+<<<<<<< HEAD
     'Keith Beckman',
     'Ole Ernst',
+=======
+    'Aaron McDaniel (mcd1992)',
+>>>>>>> Implemented --exec option.
 )
 
 __license__ = 'Public Domain'
@@ -119,6 +123,7 @@ from .postprocessor import (
     FFmpegExtractAudioPP,
     FFmpegEmbedSubtitlePP,
     XAttrMetadataPP,
+    ExecAfterDownload,
 )
 
 
@@ -550,7 +555,8 @@ def parseOpts(overrideArguments=None):
         help='Prefer avconv over ffmpeg for running the postprocessors (default)')
     postproc.add_option('--prefer-ffmpeg', action='store_true', dest='prefer_ffmpeg',
         help='Prefer ffmpeg over avconv for running the postprocessors')
-
+    postproc.add_option('--exec', metavar='', action='store', dest='execstring',
+        help='Execute a command on the file after downloading, similar to find\'s -exec syntax. Must be enclosed in quotes. Example: --exec \'adb push {} /sdcard/Music/ && rm {}\'' )
 
     parser.add_option_group(general)
     parser.add_option_group(selection)
@@ -831,6 +837,7 @@ def _real_main(argv=None):
         'default_search': opts.default_search,
         'youtube_include_dash_manifest': opts.youtube_include_dash_manifest,
         'encoding': opts.encoding,
+        'execstring': opts.execstring,
     }
 
     with YoutubeDL(ydl_opts) as ydl:
@@ -854,6 +861,12 @@ def _real_main(argv=None):
                 ydl.add_post_processor(FFmpegAudioFixPP())
             ydl.add_post_processor(AtomicParsleyPP())
 
+
+        # Please keep ExecAfterDownload towards the bottom as it allows the user to modify the final file in any way.
+        # So if the user is able to remove the file before your postprocessor runs it might cause a few problems.
+        if opts.execstring:
+            ydl.add_post_processor(ExecAfterDownload(commandString=opts.execstring))
+
         # Update version
         if opts.update_self:
             update_self(ydl.to_screen, opts.verbose)
index 08e6ddd00cbfe5691fb14943d6b2217748e96398..59ab49e6d6d7d0acd4c26a5cfe4966f1b7bc3ad1 100644 (file)
@@ -9,6 +9,7 @@ from .ffmpeg import (
     FFmpegEmbedSubtitlePP,
 )
 from .xattrpp import XAttrMetadataPP
+from .execafterdownload import ExecAfterDownload
 
 __all__ = [
     'AtomicParsleyPP',
@@ -19,4 +20,5 @@ __all__ = [
     'FFmpegExtractAudioPP',
     'FFmpegEmbedSubtitlePP',
     'XAttrMetadataPP',
+    'ExecAfterDownload',
 ]
diff --git a/youtube_dl/postprocessor/execafterdownload.py b/youtube_dl/postprocessor/execafterdownload.py
new file mode 100644 (file)
index 0000000..431ab7f
--- /dev/null
@@ -0,0 +1,36 @@
+# ExecAfterDownload written by AaronM / mcd1992.
+# If there are any issues with this postprocessor please contact me via github or admin@fgthou.se
+
+import os, re, shlex
+from ..utils import PostProcessingError
+
+class ExecAfterDownload( object ):
+    _downloader = None
+
+    def __init__( self, downloader = None, commandString = None ):
+        self._downloader = downloader
+        self.commandString = commandString
+
+    def set_downloader( self, downloader ):
+        """Sets the downloader for this PP."""
+        self._downloader = downloader
+
+    def run( self, information ):
+        self.targetFile = information["filepath"]
+        self.finalCommand = None;
+
+        if( re.search( '{}', self.commandString ) ): # Find and replace all occurrences of {} with the file name.
+            self.finalCommand = re.sub( "{}", '\'' + self.targetFile + '\'', self.commandString )
+        else:
+            self.finalCommand = self.commandString + ' \'' + self.targetFile + '\''
+
+        if( self.finalCommand ):
+            print( "[exec] Executing command: " + self.finalCommand )
+            os.system( self.finalCommand )
+        else:
+            raise PostProcessingExecError( "Invalid syntax for --exec post processor" )
+
+        return None, information  # by default, keep file and do nothing
+
+class PostProcessingExecError( PostProcessingError ):
+    pass