Reputation: 1529
I'm trying to compile a python program using jython and it's throwing below error
C:\jython2.2.1>jython test.py
Traceback (innermost last):
(no code object) at line 0
File "test.py", line 30
html = html if html else download(url, user_agent).read()
^
SyntaxError: invalid syntax
Below is my python program. Please let me know how to resolve this.
import sys
import re
import urllib2
import urlparse
from optparse import OptionParser
# regular expression data for each website
VIDEO_DATA = [
('youtube.com', '%7C(.*?videoplayback.*?)%2C'),
('metacafe.com', '&mediaURL=(.*?)&'),
]
# default user agent to use when downloading
USER_AGENT = 'pytube'
# size of file to download
CHUNK_SIZE = 1024 * 1024
def scrape(url, html=None, user_agent=None, output=None):
"""Scrape video location from given url.
Use html instead of downloading if passed.
Download file to output if passed.
Return url of video if found, else None
"""
netloc = urlparse.urlsplit(url).netloc
for domain, video_re in VIDEO_DATA:
if domain in netloc:
html = html if html else download(url, user_agent).read()
search = re.search(video_re, html)
if search:
flash_url = urllib2.unquote(search.group(1))
if output:
print "Downloading flash to `%s'" % output,
#open(output, 'wb').write(download(flash_url, user_agent).read())
req = download(flash_url, user_agent)
# testing with keyword in python
with open(output, 'wb') as fp:
chunk = True
while chunk:
chunk = req.read(CHUNK_SIZE)
if chunk:
fp.write(chunk)
#fp.flush()
print '.',
sys.stdout.flush()
print
return flash_url
else:
raise PyTubeException('Failed to locate video regular expression in downloaded HTML')
raise PyTubeException('URL did not match available domains')
def download(url, user_agent=None):
"""Download url and return data
"""
headers = {'User-Agent' : user_agent}
req = urllib2.Request(url, None, headers)
return urllib2.urlopen(req)
class PyTubeException(Exception):
pass
if __name__ == '__main__':
# parse command line options
parser = OptionParser(usage='usage: %prog, [-o <file.flv> -a <user_agent> -s -h] url')
parser.add_option('-o', '--output', dest='output', help='Output file to download flash file to. If this is not specified file will not be downloaded.')
parser.add_option('-s', '--sites', action='store_true', default=False, dest='sites', help='Display sites that pytube supports, then quit.')
parser.add_option('-a', '--agent', dest='user_agent', default=USER_AGENT, help='Set user-agent for downloads.')
options, args = parser.parse_args()
if options.sites:
print '\n'.join(domain for (domain, reg) in VIDEO_DATA)
else:
if args:
flash_url = scrape(args[0], user_agent=options.user_agent, output=options.output)
if flash_url:
print flash_url
else:
print 'Need to pass the url of the video you want to download'
parser.print_help()
Upvotes: 2
Views: 7883
Reputation: 70984
Jython 2.2.1 is (AFAIK) equivalent to Cpython 2.2.1 as far as syntax is concerned. The line that causes the problem uses the ternary operator which was introduced later. the solution is to replace it with an if statement.
if not html:
html = download(url, user_agent).read()
That should take care of that syntax error. There is also a with
clause that you will need to replace.
with open(output, 'wb') as fp:
chunk = True
while chunk:
chunk = req.read(CHUNK_SIZE)
if chunk:
fp.write(chunk)
#fp.flush()
print '.',
sys.stdout.flush()
You can replace this with
try:
fp = open(output, 'w')
chunk = True
while chunk:
chunk = req.read(CHUNK_SIZE)
if chunk:
fp.write(chunk)
#fp.flush()
print '.',
sys.stdout.flush()
finally:
fp.close()
Upvotes: 1