#!/usr/bin/python
# PSN Public Trophy List Parser
# 2010-08-24 Thomas Perl <thp@thpinfo.com>

import socket
import sys
import re
from BeautifulSoup import BeautifulSoup

class Game(object):
    def __init__(self, image, name, progress, trophies, \
            bronze, silver, gold, platinum):
        self.image = image
        self.name = name
        self.progress = progress
        self.trophies = trophies
        self.bronze = bronze
        self.silver = silver
        self.gold = gold
        self.platinum = platinum

    def __unicode__(self):
        name = self.name.replace('\n', ' ').replace('\r', ' ')
        if len(name) > 40:
            name = name[:37] + '...'
        return u'%-40s %3d%% - %2d trophies (%2d, %2d, %2d, %2d)' % (name, self.progress, self.trophies, self.bronze, self.silver, self.gold, self.platinum)

class PsnTrophyParser(object):
    def __init__(self, username):
        self.username = username

    def get_session_id(self):
        c = socket.create_connection(('us.playstation.com', 80))
        c.send("""HEAD /playstation/psn/profiles/%s HTTP/1.1\r
TE: deflate,gzip;q=0.3\r
Connection: TE, close\r
Host: us.playstation.com\r
User-Agent: lwp-request/5.834 libwww-perl/5.834\r
\r
"""%self.username)
        response = c.recv(1024)
        c.close()
        for line in response.splitlines():
            m = re.match('Set-Cookie: ([^=]*)=([^;]*)', line)
            if m is not None:
                name, value = m.groups()
                if name == 'JSESSIONID':
                    return value

    def get_trophy_data(self):
        c = socket.create_connection(('us.playstation.com', 80))
        c.send("""GET /playstation/psn/profile/%s/get_ordered_trophies_data HTTP/1.0\r
Referer: http://us.playstation.com/playstation/psn/profiles/%s\r
User-Agent: Wget/1.12 (linux-gnu)\r
Accept: */*\r
Host: us.playstation.com\r
Connection: Keep-Alive\r
Cookie: JSESSIONID=%s\r
\r
""" % (self.username, self.username, self.get_session_id()))
        response = []
        d = c.recv(1024)
        while d:
            response.append(d)
            d = c.recv(1024)
        c.close()
        return ''.join(response)

    def get_games(self):
        s = BeautifulSoup(self.get_trophy_data())

        for div in s.findAll('div', {'class': 'slot'}):
            image = dict(div.find('img').attrs)['src']
            name = div.find('span', {'class': 'gameTitleSortField'}).string
            progress = int(div.find('span', {'class': \
                    'gameProgressSortField'}).string.strip())
            trophies = int(div.find('span', {'class': \
                    'gameTrophyCountSortField'}).string.strip())
            values = [int(d.string.strip()) for d in div.find('div', {'class': 'trophyholder trophycountholder'}).findAll('div', {'class': 'trophycontent'})]
            yield Game(image, name, progress, trophies, *values)


if __name__ == '__main__':
    if len(sys.argv) > 1:
        username = sys.argv[-1]
    else:
        username = 'thp44'
    parser = PsnTrophyParser(username)
    for game in parser.get_games():
        print unicode(game)



