"""
     Flickr Massr Downloadr
     by Zambr :P (http://zamber.net/)

     FlickrClient
     Copyright (c) 2004 Michele Campeotto

     ChangeLog:
         - 0.0.1 14.08.07 - Started ver numering and added orginal img size query
"""

import xmltramp
import sys
import getopt
from urllib import urlencode

HOST = 'http://flickr.com'
PATH = '/services/rest/'
API_KEY = '2ce99127987356ade6b9b05d14164e8d'

# remember!
version = '0.0.1'

class FlickrError(Exception):
    def __init__(self, code, message):
        self.code = code
        self.message = message

    def __str__(self):
        return 'Flickr Error %s: %s' % (self.code, self.message)


class FlickrClient:
    def __init__(self, api_key):
        self.api_key = api_key

    def __getattr__(self, method):
        def method(_self=self, _method=method, **params):
            _method = _method.replace("_", ".")
            url = HOST + PATH + "?method=%s&%s&api_key=%s" % \
                    (_method, urlencode(params), self.api_key)
            try:
                    rsp = xmltramp.load(url)
            except:
                    return None
            return _self._parseResponse(rsp)
        return method

    def _parseResponse(self, rsp):
        if rsp('stat') == 'fail':
            raise FlickrError(rsp.err('code'), rsp.err('msg'))

        try:
                return rsp[0]
        except:
                return None

######################### my code ^^ #########################

client = FlickrClient(API_KEY)

# TODO:

# gets the nsid for a group (using the group url)
def get_group_nsid(group_url):
    group_fetch = client.flickr_urls_lookupGroup(url = group_url)  
    group_nsid  = group_fetch('id')
    return group_nsid

# prints some basic group info
def get_group_info(group_nsid):
    per_page, page = 1, 1

    print 'Fetching Group info...'

    photos_cn  = client.flickr_groups_pools_getPhotos(group_id = group_nsid, per_page = per_page, page = page)  
    group_info = client.flickr_groups_getInfo(group_id = group_nsid)

    print 'name: \n', group_info.name, '\n'
    print 'description: \n', group_info.description, '\n' # stripping html tags is a pain in the ass :P
    print 'members: \n', group_info.members, '\n'
    print 'photos: \n', photos_cn('total'), '\n'

def to_file(input, file):
    if file != '':
        f = open(file, 'a') # a is for append, remember dat!
        f.write(input + '\n')
        f.close()        

# fetches our tasty img urls ;]
def get_group_urls(group_nsid, size, file):  
    per_page, page = 500, 1

    print 'Fetching Group info...'

    photos_cn = client.flickr_groups_pools_getPhotos(group_id = group_nsid, per_page = per_page, page = page)  
    count     = int(photos_cn('total'))
    pages     = int(photos_cn('pages'))

    print 'Processing...'

    while page <= pages:
        x = 0
        if size == 'o':
            extras = 'original_format,'
        else:
            extras = ''
        photos = client.flickr_groups_pools_getPhotos(group_id = group_nsid, per_page = per_page, page = page, extras = extras)

        while x < per_page:
            try:
                if size == 'o':
                    try:
                        output_url = 'http://farm' + photos[x]('farm') + '.static.flickr.com/' + photos[x]('server') + '/' + photos[x]('id') + '_' + photos[x]('originalsecret') + '_o.' + photos[x]('originalformat')
                    except KeyError:
                        output_url = 'http://farm' + photos[x]('farm') + '.static.flickr.com/' + photos[x]('server') + '/' + photos[x]('id') + '_' + photos[x]('secret') + '_d.jpg'
                elif size != 'o':
                    output_url = 'http://farm' + photos[x]('farm') + '.static.flickr.com/' + photos[x]('server') + '/' + photos[x]('id') + '_' + photos[x]('secret') + '_' + size + '.jpg'
                print output_url
                to_file(output_url, file)
                x = x + 1
            except IndexError:
                print "done!"
                sys.exit()
        page = page + 1

# have a guess :P (can be writed better)
def help():
    print "Flickr Massr Downloadr %s by Zamber" % version
    print " "
    print "Usage:"
    print "  fmd -u <url> [options]"
    print " "
    print "Options:"
    print "  -h --help          Displays this help."
    print "  -u --url <url>     Download direct img links from Flickr Group <url>."
    print "  -f --file <file>   Store downloaded links in <file> (default none)."
    print "  -i --info          Gives some basic info about a group."
    print "  -s --size <size>   Image size (yes, it's defined in the link)."
    print "                       <size> can be: s - 75x75"
    print "                                      t - 100 on longest side" 
    print "                                      m - 250 on longest side"
    print "                                      d - 500 on longest side (d)"
    print "                                      o - original size"

# fetches commads passed to the spript
def main():
    group_url = ''
    size = 'd'
    file = ''
    to_file = ''
    try:
        opts, args = getopt.getopt(sys.argv[1:], 'his:u:f:', ['help', 'info', 'size=', 'url=', 'file='])
    except getopt.GetoptError:
        help()
        sys.exit(2) 
    for opt, arg in opts:
        if opt in ('-h', '--help'):
            help()
            sys.exit()
        if opt in ('-u', '--url'):
            print "Flickr Massr Downloadr %s by Zamber" % version
            group_url = arg
            size = 'd'
            file = ''
            to_file = ''
        if opt in ('-s', '--size'):
            size = arg
        if opt in ('-f', '--file'):
            to_file = arg
        if opt in ('-i', '--info'):
            get_group_info(group_nsid = get_group_nsid(group_url = group_url))
            sys.exit()

    img_size = size
    file = to_file

    # errors
    if group_url == '' or size == '':
        help()
        sys.exit(2)
    
    get_group_urls(group_nsid = get_group_nsid(group_url = group_url), size = img_size, file = file)
  
if __name__ == '__main__':
    
    main()
