Fix f4m downloading on Python 2.6

This commit is contained in:
Philipp Hagemeister 2014-02-15 16:24:43 +01:00
parent 6a7a389679
commit b53466e168
3 changed files with 28 additions and 5 deletions

View file

@ -25,6 +25,7 @@ from youtube_dl.utils import (
shell_quote, shell_quote,
smuggle_url, smuggle_url,
str_to_int, str_to_int,
struct_unpack,
timeconvert, timeconvert,
unescapeHTML, unescapeHTML,
unified_strdate, unified_strdate,
@ -237,5 +238,8 @@ class TestUtil(unittest.TestCase):
testPL(5, 2, (2, 99), [2, 3, 4]) testPL(5, 2, (2, 99), [2, 3, 4])
testPL(5, 2, (20, 99), []) testPL(5, 2, (20, 99), [])
def test_struct_unpack(self):
self.assertEqual(struct_unpack(u'!B', b'\x00'), (0,))
if __name__ == '__main__': if __name__ == '__main__':
unittest.main() unittest.main()

View file

@ -4,13 +4,14 @@ import base64
import io import io
import itertools import itertools
import os import os
from struct import unpack, pack
import time import time
import xml.etree.ElementTree as etree import xml.etree.ElementTree as etree
from .common import FileDownloader from .common import FileDownloader
from .http import HttpFD from .http import HttpFD
from ..utils import ( from ..utils import (
struct_pack,
struct_unpack,
compat_urllib_request, compat_urllib_request,
compat_urlparse, compat_urlparse,
format_bytes, format_bytes,
@ -27,13 +28,13 @@ class FlvReader(io.BytesIO):
# Utility functions for reading numbers and strings # Utility functions for reading numbers and strings
def read_unsigned_long_long(self): def read_unsigned_long_long(self):
return unpack('!Q', self.read(8))[0] return struct_unpack('!Q', self.read(8))[0]
def read_unsigned_int(self): def read_unsigned_int(self):
return unpack('!I', self.read(4))[0] return struct_unpack('!I', self.read(4))[0]
def read_unsigned_char(self): def read_unsigned_char(self):
return unpack('!B', self.read(1))[0] return struct_unpack('!B', self.read(1))[0]
def read_string(self): def read_string(self):
res = b'' res = b''
@ -196,7 +197,7 @@ def write_flv_header(stream, metadata):
# Script data # Script data
stream.write(b'\x12') stream.write(b'\x12')
# Size of the metadata with 3 bytes # Size of the metadata with 3 bytes
stream.write(pack('!L', len(metadata))[1:]) stream.write(struct_pack('!L', len(metadata))[1:])
stream.write(b'\x00\x00\x00\x00\x00\x00\x00') stream.write(b'\x00\x00\x00\x00\x00\x00\x00')
stream.write(metadata) stream.write(metadata)
# Magic numbers extracted from the output files produced by AdobeHDS.php # Magic numbers extracted from the output files produced by AdobeHDS.php

View file

@ -17,6 +17,7 @@ import platform
import re import re
import ssl import ssl
import socket import socket
import struct
import subprocess import subprocess
import sys import sys
import traceback import traceback
@ -1220,3 +1221,20 @@ def uppercase_escape(s):
return re.sub( return re.sub(
r'\\U([0-9a-fA-F]{8})', r'\\U([0-9a-fA-F]{8})',
lambda m: compat_chr(int(m.group(1), base=16)), s) lambda m: compat_chr(int(m.group(1), base=16)), s)
try:
struct.pack(u'!I', 0)
except TypeError:
# In Python 2.6 (and some 2.7 versions), struct requires a bytes argument
def struct_pack(spec, *args):
if isinstance(spec, compat_str):
spec = spec.encode('ascii')
return struct.pack(spec, *args)
def struct_unpack(spec, *args):
if isinstance(spec, compat_str):
spec = spec.encode('ascii')
return struct.unpack(spec, *args)
else:
struct_pack = struct.pack
struct_unpack = struct.unpack