Link to home
Start Free TrialLog in
Avatar of Sukumar
Sukumar

asked on

unable to compile using jython

Hi,

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.

Avatar of Sukumar
Sukumar

ASKER


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()

Open in new window

I'm unaware of Python or Jython supporting an embeeded if statement such as that line contains.  I believe the intention of the code can be realized by the following:

if not html:
    html = download(url, user_agent).read()


   
To elaborate somewhat, I recognize that the construct you attempted to use is similar to a Java construct which would compile just fine in Java.  You seem to be operating on the assumption that Jython is somehow "like" Java.  This is actually pretty much untrue.  Jython is an implementation of Python and syntactically is pure Python. However, Jython is implemented in Java, which allows it to integrate seamlessly with Java libraries and classes, to run under the Java virtual machine, and to be used in any Java environment.  But don't go trying to use Java syntax, it won't like it!
Avatar of Sukumar

ASKER

@Richard

I did as you said but it's throwing error as below



C:\jython2.2.1>jython test.py
Traceback (innermost last):
  (no code object) at line 0
  File "test.py", line 30
        if not html:
        ^
SyntaxError: invalid syntax
ASKER CERTIFIED SOLUTION
Avatar of -Richard-
-Richard-
Flag of United States of America image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Avatar of Sukumar

ASKER

Perfect...and after copying my own code to notepad(Windows cista) and re-run again it worked. Also richard, i had a last question.

After running will Jython create some kind of class file like for ex: if we run test.py..will it generate test.class ?
It is possible to make Jython do that, but it is not straigtforwards.  Here is a tutorial:  http://wiki.python.org/jython/JythonMonthly/Articles/September2006/1