[downloader/rtmp] Fix arguments encoding and simplify retry logic (Closes #5528)

This commit is contained in:
Sergey M․ 2015-04-26 04:32:54 +06:00
parent cd8a07a764
commit 9e105a858c
1 changed files with 9 additions and 12 deletions

View File

@ -3,7 +3,6 @@ from __future__ import unicode_literals
import os import os
import re import re
import subprocess import subprocess
import sys
import time import time
from .common import FileDownloader from .common import FileDownloader
@ -11,6 +10,7 @@ from ..compat import compat_str
from ..utils import ( from ..utils import (
check_executable, check_executable,
encodeFilename, encodeFilename,
encodeArgument,
get_exe_version, get_exe_version,
) )
@ -121,7 +121,7 @@ class RtmpFD(FileDownloader):
# possible. This is part of rtmpdump's normal usage, AFAIK. # possible. This is part of rtmpdump's normal usage, AFAIK.
basic_args = [ basic_args = [
'rtmpdump', '--verbose', '-r', url, 'rtmpdump', '--verbose', '-r', url,
'-o', encodeFilename(tmpfilename, True)] '-o', tmpfilename]
if player_url is not None: if player_url is not None:
basic_args += ['--swfVfy', player_url] basic_args += ['--swfVfy', player_url]
if page_url is not None: if page_url is not None:
@ -154,16 +154,9 @@ class RtmpFD(FileDownloader):
if not live and continue_dl: if not live and continue_dl:
args += ['--skip', '1'] args += ['--skip', '1']
if sys.platform == 'win32' and sys.version_info < (3, 0): args = [encodeArgument(a) for a in args]
# Windows subprocess module does not actually support Unicode
# on Python 2.x
# See http://stackoverflow.com/a/9951851/35070
subprocess_encoding = sys.getfilesystemencoding()
args = [a.encode(subprocess_encoding, 'ignore') for a in args]
else:
subprocess_encoding = None
self._debug_cmd(args, subprocess_encoding, exe='rtmpdump') self._debug_cmd(args, exe='rtmpdump')
RD_SUCCESS = 0 RD_SUCCESS = 0
RD_FAILED = 1 RD_FAILED = 1
@ -180,7 +173,11 @@ class RtmpFD(FileDownloader):
prevsize = os.path.getsize(encodeFilename(tmpfilename)) prevsize = os.path.getsize(encodeFilename(tmpfilename))
self.to_screen('[rtmpdump] %s bytes' % prevsize) self.to_screen('[rtmpdump] %s bytes' % prevsize)
time.sleep(5.0) # This seems to be needed time.sleep(5.0) # This seems to be needed
retval = run_rtmpdump(basic_args + ['-e'] + [[], ['-k', '1']][retval == RD_FAILED]) args = basic_args + ['--resume']
if retval == RD_FAILED:
args += ['--skip', '1']
args = [encodeArgument(a) for a in args]
retval = run_rtmpdump(args)
cursize = os.path.getsize(encodeFilename(tmpfilename)) cursize = os.path.getsize(encodeFilename(tmpfilename))
if prevsize == cursize and retval == RD_FAILED: if prevsize == cursize and retval == RD_FAILED:
break break