Move FileDownloader to its own module and create a new class for each download process
[youtube-dl] / youtube_dl / downloader / mplayer.py
1 import os
2 import subprocess
3
4 from .common import FileDownloader
5 from ..utils import (
6     encodeFilename,
7 )
8
9
10 class MplayerFD(FileDownloader):
11     def real_download(self, filename, info_dict):
12         self.report_destination(filename)
13         tmpfilename = self.temp_name(filename)
14
15         args = ['mplayer', '-really-quiet', '-vo', 'null', '-vc', 'dummy', '-dumpstream', '-dumpfile', tmpfilename, url]
16         # Check for mplayer first
17         try:
18             subprocess.call(['mplayer', '-h'], stdout=(open(os.path.devnull, 'w')), stderr=subprocess.STDOUT)
19         except (OSError, IOError):
20             self.report_error(u'MMS or RTSP download detected but "%s" could not be run' % args[0] )
21             return False
22
23         # Download using mplayer. 
24         retval = subprocess.call(args)
25         if retval == 0:
26             fsize = os.path.getsize(encodeFilename(tmpfilename))
27             self.to_screen(u'\r[%s] %s bytes' % (args[0], fsize))
28             self.try_rename(tmpfilename, filename)
29             self._hook_progress({
30                 'downloaded_bytes': fsize,
31                 'total_bytes': fsize,
32                 'filename': filename,
33                 'status': 'finished',
34             })
35             return True
36         else:
37             self.to_stderr(u"\n")
38             self.report_error(u'mplayer exited with code %d' % retval)
39             return False