X-Git-Url: http://git.cielonegro.org/gitweb.cgi?a=blobdiff_plain;f=youtube_dl%2Fswfinterp.py;h=85efde5924cddb12988260510da68a296f4241b0;hb=e983cf52775e493b7deedbe48d2f50f598c9da4e;hp=1cd2921386f3a86cc12a95545478311e571a268a;hpb=5425626790a46f9b5bdecf4e33bb254c4c2423ea;p=youtube-dl.git diff --git a/youtube_dl/swfinterp.py b/youtube_dl/swfinterp.py index 1cd292138..85efde592 100644 --- a/youtube_dl/swfinterp.py +++ b/youtube_dl/swfinterp.py @@ -2,23 +2,42 @@ from __future__ import unicode_literals import collections import io -import struct import zlib -from .utils import ExtractorError - - -def _extract_tags(content): - pos = 0 +from .utils import ( + compat_str, + ExtractorError, + struct_unpack, +) + + +def _extract_tags(file_contents): + if file_contents[1:3] != b'WS': + raise ExtractorError( + 'Not an SWF file; header is %r' % file_contents[:3]) + if file_contents[:1] == b'C': + content = zlib.decompress(file_contents[8:]) + else: + raise NotImplementedError( + 'Unsupported compression format %r' % + file_contents[:1]) + + # Determine number of bits in framesize rectangle + framesize_nbits = struct_unpack('!B', content[:1])[0] >> 3 + framesize_len = (5 + 4 * framesize_nbits + 7) // 8 + + pos = framesize_len + 2 + 2 while pos < len(content): - header16 = struct.unpack('> 6 tag_len = header16 & 0x3f if tag_len == 0x3f: - tag_len = struct.unpack('= 0x80) else b'\x00' - return struct.unpack('!i', first_byte + bs) + last_byte = b'\xff' if (ord(bs[2:3]) >= 0x80) else b'\x00' + return struct_unpack('= 0 resb = reader.read(count) assert len(resb) == count return resb @@ -97,24 +144,15 @@ def _read_bytes(count, reader): def _read_byte(reader): resb = _read_bytes(1, reader=reader) - res = struct.unpack('