Browse Source

Fix f4m downloading on Python 2.6

totalwebcasting
Philipp Hagemeister 11 years ago
parent
commit
b53466e168
3 changed files with 28 additions and 5 deletions
  1. +4
    -0
      test/test_utils.py
  2. +6
    -5
      youtube_dl/downloader/f4m.py
  3. +18
    -0
      youtube_dl/utils.py

+ 4
- 0
test/test_utils.py View File

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

+ 6
- 5
youtube_dl/downloader/f4m.py View File

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


+ 18
- 0
youtube_dl/utils.py View File

@ -17,6 +17,7 @@ import platform
import re
import ssl
import socket
import struct
import subprocess
import sys
import traceback
@ -1220,3 +1221,20 @@ def uppercase_escape(s):
return re.sub(
r'\\U([0-9a-fA-F]{8})',
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

Loading…
Cancel
Save