import
requests_html
from
slimit.parser
import
Parser
from
slimit.visitors.nodevisitor
import
ASTVisitor
from
slimit
import
ast
flashvars
=
[]
class
VarStatement_Visitor(ASTVisitor):
def
visit_VarStatement(
self
, node):
Identifier,
Object
=
node.children()[
0
].children()
if
'flashvars'
in
Identifier.value:
for
each
in
Object
.properties:
left, right
=
each.children()
if
left.value
=
=
'"mediaDefinitions"'
:
for
item
in
right.items:
data
=
{}
for
key
in
item.properties:
keyleft, keyright
=
key.children()
if
isinstance
(keyright, ast.Array):
datalist
=
[i.value
for
i
in
keyright.items]
data[keyleft.value[
1
:
-
1
]]
=
datalist
else
:
if
keyright.value
=
=
'"defaultQuality"'
:
data[keyleft.value[
1
:
-
1
]]
=
keyright.value
else
:
data[keyleft.value[
1
:
-
1
]]
=
keyright.value[
1
:
-
1
]
flashvars.append(data)
class
media_Visitor(ASTVisitor):
def
__init__(
self
, i,
*
args,
*
*
kwargs):
self
.i
=
i
self
.identifier
=
{}
self
.identifiers
=
[]
super
(
*
args,
*
*
kwargs)
def
get_Identifier(
self
, node, identifierlist):
left, right
=
node.children()
identifierlist.append(
self
.identifier[right.value])
if
isinstance
(left, ast.BinOp):
self
.get_Identifier(left, identifierlist)
else
:
identifierlist.append(
self
.identifier[left.value])
def
visit_VarStatement(
self
, node):
Identifier, BinOp
=
node.children()[
0
].children()
if
'media_'
+
str
(
self
.i)
=
=
Identifier.value:
self
.get_Identifier(BinOp,
self
.identifiers)
flashvars[
self
.i][
'videoUrl'
]
=
''.join(
self
.identifiers[::
-
1
])
elif
isinstance
(BinOp, ast.String)
or
(
len
(BinOp.children())
=
=
2
and
isinstance
(BinOp.children()[
0
], ast.String)
and
isinstance
(BinOp.children()[
1
], ast.String)):
if
isinstance
(BinOp, ast.String):
self
.identifier[Identifier.value]
=
BinOp.value[
1
:
-
1
]
else
:
self
.identifier[Identifier.value]
=
''.join([i.value[
1
:
-
1
]
for
i
in
BinOp.children()])
def
geturl(shareurl, headers):
requests
=
requests_html.HTMLSession()
response
=
requests.get(shareurl, headers
=
headers)
for
script
in
response.html.xpath(
'//script[@type="text/javascript"]'
):
script
=
script.xpath(
'//text()'
)[
0
]
if
'flashvars'
in
script:
tree
=
Parser().parse(script)
VarStatement_Visitor().visit(tree)
for
i
in
range
(
len
(flashvars)):
media_Visitor(i).visit(tree)
break
print
(flashvars)