X-Git-Url: http://git.bitcoin.ninja/index.cgi?a=blobdiff_plain;f=youtube_dl%2Fswfinterp.py;fp=youtube_dl%2Fswfinterp.py;h=0ce8474ca7ce96d77d05b9c9c5243a6632b69591;hb=3cbcff8a2dacf6d4f10f00af36b9761ef833e6ea;hp=85efde5924cddb12988260510da68a296f4241b0;hpb=e983cf52775e493b7deedbe48d2f50f598c9da4e;p=youtube-dl diff --git a/youtube_dl/swfinterp.py b/youtube_dl/swfinterp.py index 85efde592..0ce8474ca 100644 --- a/youtube_dl/swfinterp.py +++ b/youtube_dl/swfinterp.py @@ -148,6 +148,9 @@ def _read_byte(reader): return res +StringClass = _AVMClass('(no name idx)', 'String') + + class SWFInterpreter(object): def __init__(self, file_contents): self._patched_functions = {} @@ -483,6 +486,17 @@ class SWFInterpreter(object): res = args[0].join(obj) stack.append(res) continue + elif obj == StringClass: + if mname == 'String': + assert len(args) == 1 + assert isinstance(args[0], (int, compat_str)) + res = compat_str(args[0]) + stack.append(res) + continue + else: + raise NotImplementedError( + 'Function String.%s is not yet implemented' + % mname) raise NotImplementedError( 'Unsupported property %r on %r' % (mname, obj)) @@ -532,7 +546,10 @@ class SWFInterpreter(object): break else: res = scopes[0] - stack.append(res[mname]) + if mname not in res and mname == 'String': + stack.append(StringClass) + else: + stack.append(res[mname]) elif opcode == 94: # findproperty index = u30() mname = self.multinames[index] @@ -576,7 +593,7 @@ class SWFInterpreter(object): pname = self.multinames[index] if pname == 'length': obj = stack.pop() - assert isinstance(obj, list) + assert isinstance(obj, (compat_str, list)) stack.append(len(obj)) elif isinstance(pname, compat_str): # Member access obj = stack.pop()