Exemplo n.º 1
0
#!/usr/bin/env python

#test comment
import sys
from flickrapi import FlickrAPI

# Autenticazione
flickrAPIKey = "ea9b8730af07cd76f6dc4fde27744b74"  # API key
flickrSecret = "45dfeeb5abec1ff9"                  # shared "secret"
gruppo='91264405@N00'

# crea una istanza di FlickrAPI 
fapi = FlickrAPI(flickrAPIKey, flickrSecret)

# ottieni un token valido
token = fapi.getToken(browser="firefox", perms="write")
rsp = fapi.auth_checkToken(api_key=flickrAPIKey, auth_token=token)
fapi.testFailure(rsp)

#grabba tutte le foto con il group id specificato
rsp = fapi.groups_pools_getPhotos(auth_token=token,api_key=flickrAPIKey,group_id=gruppo)
fapi.testFailure(rsp)

for a in rsp.photos[0].photo:
	rsp = fapi.groups_pools_remove(api_key=flickrAPIKey,photo_id=a['id'],auth_token=token,group_id=gruppo)
	fapi.testFailure(rsp,exit=0)


Exemplo n.º 2
0
class Shell(cmdln.Cmdln):
    r"""ci2 -- the new Code Intel, a tool for working with source code

    usage:
        ${name} SUBCOMMAND [ARGS...]
        ${name} help SUBCOMMAND

    ${option_list}
    ${command_list}
    ${help_list}
    """
    name = "batchr"
    #XXX There is a bug in cmdln.py alignment when using this. Leave it off
    #    until that is fixed.
    #helpindent = ' '*4

    def _setup(self, opts):
        # flickr auth information:
        self.flickrAPIKey = os.environ['FLICKR_BATCHR_KEY']
        self.flickrSecret = os.environ['FLICKR_BATCHR_SECRET']
        try:
            gui = opts.gui
        except AttributeError: # really wish I could just test "gui" in opts
            gui = False
        self.progress = progressBar("Flickr Shell", indeterminate=True, gui=gui)

        self.progress.update("Logging In...")
        # make a new FlickrAPI instance
        self.fapi = FlickrAPI(self.flickrAPIKey, self.flickrSecret)

        # do the whole whatever-it-takes to get a valid token:
        self.token = self.fapi.getToken(browser="Firefox")


    def do_listsets(self, subcmd, opts, *args):
        """List set ids and set titles (with substring title matches)"""
        self._setup(opts)
        kw = dict(api_key=self.flickrAPIKey,
                  auth_token=self.token)
        rsp = self.fapi.photosets_getList(**kw)
        self.fapi.testFailure(rsp)
        sets = rsp.photosets[0].photoset
        for set in sets:
            title = set.title[0].elementText
            match = True
            if args:
                match = False
                for word in args:
                    if word.lower() in title.lower():
                        match = True
                        break
            if match:
                print set['id']+':', title, '('+set['photos']+ " photos)"
        self.progress.finish()

    @cmdln.option("-b", "--base", dest="base",
                  default="./photos",
                  help="the directory we want to download to")
    @cmdln.option("-F", "--format", dest="format",
                  help="the file layout format to use within the base directory (default is %(year)s/%(month_name)s/%(size)s/%(id)s.jpg",
                  default="%(year)s/%(month_name)s/%(size)s/%(id)s.jpg")
    @cmdln.option("-f", "--force", action="store_true",
                  help="force downloads even if files with same name already exist")
    @cmdln.option("-y", "--year", dest="year", type='int',
                  help="the year we want backed up")
    @cmdln.option("-m", "--month", dest="month", type='int',
                  help="the month we want backed up")
    @cmdln.option("-s", "--size", dest="size", default='-',
                  nargs=1,
                  help="the size we want downloaded: one of: s t m b - o")
    @cmdln.option("-t", "--test", action="store_true",
                  help="Just get the URLs (don't download images) -- implies -l")
    @cmdln.option("--tags",
                  help="Tags (separatead by commas)")
    @cmdln.option("-S", "--set",
                  help="Set id (use listsets command to get them)")
    @cmdln.option("-l", "--list", action="store_true",
                  help="List URLs being downloaded instead of using progress bar")
    @cmdln.option("--gui", action="store_true",
                  help="use Cocoa progress bar on OS X")
    def do_download(self, subcmd, opts):
        """Download images based on search criteria (dates, tags, sets)

        ${cmd_usage}
        ${cmd_option_list}
        Any errors will be printed. Returns the number of errors (i.e.
        exit value is 0 if there are no consistency problems).
        """
        urls = self._search(opts)
        self.progress.reset("Getting Photo Info")
        count = 0
        downloadeds = 0
        bad_ones =  []
        try:
            try:
                for (id, url, original_url, date_taken) in urls:
                    year, month, day = parse_date_taken(date_taken)
                    month_name = calendar.month_name[month]
                    size = pretty_size[opts.size]
                    filename = opts.format % locals()
                    filename = join(opts.base, filename)

                    extra_info = " (%s %s %s)          " % (day, month_name, year)
                    self.progress.update("Phase 2: Downloading: %d/%d " % (count+1, len(urls)),
                                         (count+1)/float(len(urls)),
                                         after_args=(extra_info,))
                    if opts.test:
                        print "Would download (test):", url, "to", filename
                        continue
                    if not os.path.exists(filename):
                        if opts.list:
                            print "Downloading:", url
                        tmpfile = os.path.join(opts.base, 'tempfile.jpg')
                        try:
                            os.makedirs(os.path.dirname(filename))
                        except OSError:
                            pass
                        f, headers = urllib.urlretrieve(url, tmpfile)
                        if (headers['Content-Length'] == 2900 and
                            headers['Content-Type'] == 'image/gif'):
                            # first try the original size
                            url = original_url
                            print "GETTING ORIGINAL", url
                            f, headers = urllib.urlretrieve(url, tmpfile)
                        if (headers['Content-Length'] == 2900 and
                            headers['Content-Type'] == 'image/gif'):
                            # something's wrong
                            print "SOMETHING's BAD", url
                            os.unlink(tmpfile)
                            bad_ones.append(url)
                        else:  # it's a good one.
                            os.rename(tmpfile, filename)
                            # set the ctime/mtime, just for fun!
                            datetakentime = time.mktime(strptime(date_taken, "%Y-%m-%d  %H:%M:%S"))
                            os.utime(filename, (datetakentime, datetakentime))

                        downloadeds += 1
                    elif opts.list:
                        print "Skipping (cached):", url
                    count += 1
            except KeyboardInterrupt:
                raise
        finally:
            if not opts.list:
                self.progress.update()
            print "Processed %d images" % count
            print "Downloaded %d images" % downloadeds
            if bad_ones:
                print "Some images could not be downloaded:"
                print '\n\t'.join(bad_ones)

    def _search(self, opts):
        base = opts.base
        if not os.path.exists(opts.base):
            print "Make sure the base directory: %s exists first" % opts.base
            sys.exit(2)
        if opts.test:
            opts.list = True
        global rsp # for debugging runs invoked with -i

        self._setup(opts)

        kw = dict(api_key=self.flickrAPIKey,
                  auth_token=self.token,
                  extras="date_taken",
                  sort="date-taken-asc",
                  per_page="500")

        if opts.set:
            kw.update(photoset_id=opts.set)
            search = "Getting photos in set (%s)" % opts.set
            self.progress.update(search)
            print search + ': ',
            sys.stdout.flush()
            photo_accessor = self.fapi.photosets_getPhotos
            rsp = photo_accessor(**kw)
            self.fapi.testFailure(rsp)
            payload = rsp.photoset[0]

        else: # time and/or tag-based searches
            if opts.month:
                year = opts.year or time.localtime(time.time())[0]
                monthStart = datetime.date(year, opts.month, 1)
                monthEnd = monthStart + datetime.timedelta(days=35)
                min_date = monthStart.isoformat()
                max_date = monthEnd.isoformat()
            else:
                startyear = opts.year or 1900
                endyear = opts.year or time.localtime(time.time())[0]+1
                monthStart = datetime.date(startyear, 1, 1)
                monthEnd = datetime.date(endyear+1, 1, 1)
                min_date = monthStart.isoformat()
                max_date = monthEnd.isoformat()
                print min_date, max_date
            if opts.year:
                if opts.month:
                    search = "Searching for photos taken in %s %s" % (calendar.month_name[opts.month], opts.year)
                else:
                    search = "Searching for photos taken in %s" % opts.year
            else:
                search = "Searching for photos (all dates)"
            if opts.tags:
                search += " tagged: " + opts.tags
            kw.update(user_id="me",
                      min_taken_date=min_date,
                      max_taken_date=max_date)
            if opts.tags:
                kw['tags'] = opts.tags

            self.progress.update(search)
            print search + ': ',
            sys.stdout.flush()

            photo_accessor = self.fapi.photos_search
            rsp = photo_accessor(**kw)
            self.fapi.testFailure(rsp)
            payload = rsp.photos[0]

        self.progress.finish()

        pages = payload['pages']
        if pages == '0':
            print "no photos found"
            return []
        num_photos = int(payload['total'])
        print "found %d photos (getting data)" % num_photos
        urls = extract_urls(payload.photo, opts.size)

        self.progress.reset('Flickr Download')
        for page in range(2, int(pages)+1):
                kw['page'] = str(page)
                rsp = photo_accessor(**kw)
                self.fapi.testFailure(rsp)
                if opts.set:
                    payload = rsp.photoset[0]
                else:
                    payload = rsp.photos[0]
                urls.extend(extract_urls(payload.photo, opts.size))
                self.progress.update("Phase 1: Getting info about batch %d of %d " % (page, int(pages)),
                                page/float(pages))
        print
        return urls
Exemplo n.º 3
0
import sys
from flickrapi import FlickrAPI

import wx

# Autenticazione
flickrAPIKey = "ea9b8730af07cd76f6dc4fde27744b74"  # API key
flickrSecret = "45dfeeb5abec1ff9"                  # shared "secret"

# crea una istanza di FlickrAPI 
fapi = FlickrAPI(flickrAPIKey, flickrSecret)

# ottieni un token valido
if sys.platform == 'win32':
    token = fapi.getToken(browser="C:\\Progra~1\\Intern~1\\iexplore.exe", perms="write")
else:
    token = fapi.getToken(browser="firefox", perms="write")
rsp = fapi.auth_checkToken(api_key=flickrAPIKey, auth_token=token)
fapi.noExitTestFailure(rsp)
user_id = rsp.auth[0].user[0]['nsid']

#################sux

def create(parent):
    return Frame1(parent)

[wxID_FRAME1, wxID_FRAME1CHOICE1, wxID_FRAME1CHOICE2, wxID_FRAME1INTESTAZIONE, 
 wxID_FRAME1OKBUTTON, wxID_FRAME1STATUSBAR1, 
] = [wx.NewId() for _init_ctrls in range(6)]
Exemplo n.º 4
0
class Shell(cmdln.Cmdln):
    r"""ci2 -- the new Code Intel, a tool for working with source code

    usage:
        ${name} SUBCOMMAND [ARGS...]
        ${name} help SUBCOMMAND

    ${option_list}
    ${command_list}
    ${help_list}
    """
    name = "batchr"

    #XXX There is a bug in cmdln.py alignment when using this. Leave it off
    #    until that is fixed.
    #helpindent = ' '*4

    def _setup(self, opts):
        # flickr auth information:
        self.flickrAPIKey = os.environ['FLICKR_BATCHR_KEY']
        self.flickrSecret = os.environ['FLICKR_BATCHR_SECRET']
        try:
            gui = opts.gui
        except AttributeError:  # really wish I could just test "gui" in opts
            gui = False
        self.progress = progressBar("Flickr Shell",
                                    indeterminate=True,
                                    gui=gui)

        self.progress.update("Logging In...")
        # make a new FlickrAPI instance
        self.fapi = FlickrAPI(self.flickrAPIKey, self.flickrSecret)

        # do the whole whatever-it-takes to get a valid token:
        self.token = self.fapi.getToken(browser="Firefox")

    def do_listsets(self, subcmd, opts, *args):
        """List set ids and set titles (with substring title matches)"""
        self._setup(opts)
        kw = dict(api_key=self.flickrAPIKey, auth_token=self.token)
        rsp = self.fapi.photosets_getList(**kw)
        self.fapi.testFailure(rsp)
        sets = rsp.photosets[0].photoset
        for set in sets:
            title = set.title[0].elementText
            match = True
            if args:
                match = False
                for word in args:
                    if word.lower() in title.lower():
                        match = True
                        break
            if match:
                print set['id'] + ':', title, '(' + set['photos'] + " photos)"
        self.progress.finish()

    @cmdln.option("-b",
                  "--base",
                  dest="base",
                  default="./photos",
                  help="the directory we want to download to")
    @cmdln.option(
        "-F",
        "--format",
        dest="format",
        help=
        "the file layout format to use within the base directory (default is %(year)s/%(month_name)s/%(size)s/%(id)s.jpg",
        default="%(year)s/%(month_name)s/%(size)s/%(id)s.jpg")
    @cmdln.option(
        "-f",
        "--force",
        action="store_true",
        help="force downloads even if files with same name already exist")
    @cmdln.option("-y",
                  "--year",
                  dest="year",
                  type='int',
                  help="the year we want backed up")
    @cmdln.option("-m",
                  "--month",
                  dest="month",
                  type='int',
                  help="the month we want backed up")
    @cmdln.option("-s",
                  "--size",
                  dest="size",
                  default='-',
                  nargs=1,
                  help="the size we want downloaded: one of: s t m b - o")
    @cmdln.option(
        "-t",
        "--test",
        action="store_true",
        help="Just get the URLs (don't download images) -- implies -l")
    @cmdln.option("--tags", help="Tags (separatead by commas)")
    @cmdln.option("-S",
                  "--set",
                  help="Set id (use listsets command to get them)")
    @cmdln.option(
        "-l",
        "--list",
        action="store_true",
        help="List URLs being downloaded instead of using progress bar")
    @cmdln.option("--gui",
                  action="store_true",
                  help="use Cocoa progress bar on OS X")
    def do_download(self, subcmd, opts):
        """Download images based on search criteria (dates, tags, sets)

        ${cmd_usage}
        ${cmd_option_list}
        Any errors will be printed. Returns the number of errors (i.e.
        exit value is 0 if there are no consistency problems).
        """
        urls = self._search(opts)
        self.progress.reset("Getting Photo Info")
        count = 0
        downloadeds = 0
        bad_ones = []
        try:
            try:
                for (id, url, original_url, date_taken) in urls:
                    year, month, day = parse_date_taken(date_taken)
                    month_name = calendar.month_name[month]
                    size = pretty_size[opts.size]
                    filename = opts.format % locals()
                    filename = join(opts.base, filename)

                    extra_info = " (%s %s %s)          " % (day, month_name,
                                                            year)
                    self.progress.update("Phase 2: Downloading: %d/%d " %
                                         (count + 1, len(urls)),
                                         (count + 1) / float(len(urls)),
                                         after_args=(extra_info, ))
                    if opts.test:
                        print "Would download (test):", url, "to", filename
                        continue
                    if not os.path.exists(filename):
                        if opts.list:
                            print "Downloading:", url
                        tmpfile = os.path.join(opts.base, 'tempfile.jpg')
                        try:
                            os.makedirs(os.path.dirname(filename))
                        except OSError:
                            pass
                        f, headers = urllib.urlretrieve(url, tmpfile)
                        if (headers['Content-Length'] == 2900
                                and headers['Content-Type'] == 'image/gif'):
                            # first try the original size
                            url = original_url
                            print "GETTING ORIGINAL", url
                            f, headers = urllib.urlretrieve(url, tmpfile)
                        if (headers['Content-Length'] == 2900
                                and headers['Content-Type'] == 'image/gif'):
                            # something's wrong
                            print "SOMETHING's BAD", url
                            os.unlink(tmpfile)
                            bad_ones.append(url)
                        else:  # it's a good one.
                            os.rename(tmpfile, filename)
                            # set the ctime/mtime, just for fun!
                            datetakentime = time.mktime(
                                strptime(date_taken, "%Y-%m-%d  %H:%M:%S"))
                            os.utime(filename, (datetakentime, datetakentime))

                        downloadeds += 1
                    elif opts.list:
                        print "Skipping (cached):", url
                    count += 1
            except KeyboardInterrupt:
                raise
        finally:
            if not opts.list:
                self.progress.update()
            print "Processed %d images" % count
            print "Downloaded %d images" % downloadeds
            if bad_ones:
                print "Some images could not be downloaded:"
                print '\n\t'.join(bad_ones)

    def _search(self, opts):
        base = opts.base
        if not os.path.exists(opts.base):
            print "Make sure the base directory: %s exists first" % opts.base
            sys.exit(2)
        if opts.test:
            opts.list = True
        global rsp  # for debugging runs invoked with -i

        self._setup(opts)

        kw = dict(api_key=self.flickrAPIKey,
                  auth_token=self.token,
                  extras="date_taken",
                  sort="date-taken-asc",
                  per_page="500")

        if opts.set:
            kw.update(photoset_id=opts.set)
            search = "Getting photos in set (%s)" % opts.set
            self.progress.update(search)
            print search + ': ',
            sys.stdout.flush()
            photo_accessor = self.fapi.photosets_getPhotos
            rsp = photo_accessor(**kw)
            self.fapi.testFailure(rsp)
            payload = rsp.photoset[0]

        else:  # time and/or tag-based searches
            if opts.month:
                year = opts.year or time.localtime(time.time())[0]
                monthStart = datetime.date(year, opts.month, 1)
                monthEnd = monthStart + datetime.timedelta(days=35)
                min_date = monthStart.isoformat()
                max_date = monthEnd.isoformat()
            else:
                startyear = opts.year or 1900
                endyear = opts.year or time.localtime(time.time())[0] + 1
                monthStart = datetime.date(startyear, 1, 1)
                monthEnd = datetime.date(endyear + 1, 1, 1)
                min_date = monthStart.isoformat()
                max_date = monthEnd.isoformat()
                print min_date, max_date
            if opts.year:
                if opts.month:
                    search = "Searching for photos taken in %s %s" % (
                        calendar.month_name[opts.month], opts.year)
                else:
                    search = "Searching for photos taken in %s" % opts.year
            else:
                search = "Searching for photos (all dates)"
            if opts.tags:
                search += " tagged: " + opts.tags
            kw.update(user_id="me",
                      min_taken_date=min_date,
                      max_taken_date=max_date)
            if opts.tags:
                kw['tags'] = opts.tags

            self.progress.update(search)
            print search + ': ',
            sys.stdout.flush()

            photo_accessor = self.fapi.photos_search
            rsp = photo_accessor(**kw)
            self.fapi.testFailure(rsp)
            payload = rsp.photos[0]

        self.progress.finish()

        pages = payload['pages']
        if pages == '0':
            print "no photos found"
            return []
        num_photos = int(payload['total'])
        print "found %d photos (getting data)" % num_photos
        urls = extract_urls(payload.photo, opts.size)

        self.progress.reset('Flickr Download')
        for page in range(2, int(pages) + 1):
            kw['page'] = str(page)
            rsp = photo_accessor(**kw)
            self.fapi.testFailure(rsp)
            if opts.set:
                payload = rsp.photoset[0]
            else:
                payload = rsp.photos[0]
            urls.extend(extract_urls(payload.photo, opts.size))
            self.progress.update(
                "Phase 1: Getting info about batch %d of %d " %
                (page, int(pages)), page / float(pages))
        print
        return urls
Exemplo n.º 5
0
def remap(line):
    if flickr.match(line):
        global fapi, token
        if fapi is None:
            fapi = FlickrAPI(flickrAPIKey, flickrSecret)
            token = fapi.getToken(browser="lynx")

        id = flickr.match(line).group(1)
        print "  talking to Flickr about: ",id
        
        rsp = fapi.photos_getInfo(api_key=flickrAPIKey,auth_token=token,photo_id=id)
        fapi.testFailure(rsp)
        description = rsp.photo[0].description[0].elementText
        URL = rsp.photo[0].urls[0].url[0].elementText

        rsp = fapi.photos_getSizes(api_key=flickrAPIKey,auth_token=token,photo_id=id)
        fapi.testFailure(rsp)
        localbig = ''
        for x in rsp.sizes[0].size:
            if x.attrib['label'] == 'Large':
                localbig = x.attrib['source'].split('/')[-1]
                os.system('curl -o html/photos/%s "%s"' % (localbig, x.attrib['source']))
                
        for x in rsp.sizes[0].size:
            #if x.attrib['label'] == 'Square':
            if x.attrib['label'] == 'Small':
                localpath = x.attrib['source'].split('/')[-1]
                big = ''
                if localbig != '':
                    big = '[<a href="photos/%s">local</a>]' % localbig
                os.system('curl -o html/photos/%s "%s"' % (localpath, x.attrib['source']))
                return '<div class="photo"><a href="%(url)s"><img src="%(src)s" height="%(height)s" width="%(width)s" alt="%(alt)s" /></a><div class="caption">%(caption)s%(localbig)s</div></div>' % \
                       {'src':'photos/%s'%localpath,#x.attrib['source'],
                        'height':x.attrib['height'],
                        'width':x.attrib['width'],
                        'caption': description,
                        'url':URL,
                        'alt':description,
                        'localbig':big
                        }

    elif localphoto.match(line):
        m = localphoto.match(line)
        caption = m.group(1)
        id = m.group(2)
        thumb = id.split('.')[0] + '-thumb.jpeg'
        if not os.path.exists(thumb):
            cmd = 'convert -resize 240x240 ' + os.path.join(BASE,'photos/'+id) + ' ' + os.path.join(BASE,'photos/'+thumb)
            print cmd
            os.system(cmd)

        ## FIXME size probably wrong; figure out real size of
        ## thumbnail or at least whether its rotated or not
        return '<div class="photo"><a href="photos/%s"><img src="photos/%s" height="180" width="240" alt="%s" /></a><div class="caption">%s</div></div>' % (id, thumb, caption, caption)
    

    elif googledoc.match(line):
        url = googledoc.match(line).group(1)
        print "  talking to Google about:",url
        html = googledocToHtml(urlopen(url).readlines())
        return html
                
    elif resultdoc.match(line):
        name = resultdoc.match(line).group(1)
        url = resultdoc.match(line).group(2)
        print "  talking to Google about results:",url
        html = resultdocToHtml(urlopen(url).readlines(), url, name)
        return html

    elif rideschedule.match(line):
        year = rideschedule.match(line).group(1).strip()
        region = rideschedule.match(line).group(2).strip().lower()
        if not year in ridelist.keys():
            print "  talking to Google about schedule:",year,region
            if int(year) > 2010:
                ridelist[year] = rideScheduleCsvToRideList(urlopen(PRELIM_RIDE_SCHEDULES[year]).readlines(), year)
            else:
                ridelist[year] = pre2010rideScheduleCsvToRideList(urlopen(PRELIM_RIDE_SCHEDULES[year]).readlines(), year)
                print year,ridelist[year]

        officialkey = region.strip().lower() + ':' + year.strip()
        if OFFICIAL_RIDE_SCHEDULES.has_key(officialkey):
            print "  talking to Google about official schedule",year,region,OFFICIAL_RIDE_SCHEDULES[officialkey]
            if int(year.strip()) <= 2010:
                html = officialRideScheduleToHtml(urlopen(OFFICIAL_RIDE_SCHEDULES[officialkey]).readlines(), ridelist[year], year, region)
            else:
                html = officialRideListToHtml(ridelist[year], year, region)

        else:
            print "NO official ride schedule yet for",region,year,officialkey
            html = rideListToHtml(ridelist[year], region)
        return html
    
    elif membership.match(line):
        url = membership.match(line).group(1).strip()
        html = membershipToHtml(urlopen(url).readlines())
        return html

    return line
Exemplo n.º 6
0
class TransFlickr: 

  extras = "original_format,date_upload,last_update"

  def __init__(self, browserName):
    self.fapi = FlickrAPI(flickrAPIKey, flickrSecret)
    self.user_id = ""
    # proceed with auth
    # TODO use auth.checkToken function if available, 
    # and wait after opening browser.
    print "Authorizing with flickr..."
    log.info("authorizing with flickr...")
    try:
      self.authtoken = self.fapi.getToken(browser=browserName)
    except:
      print ("Can't retrieve token from browser %s" % browserName)
      print ("\tIf you're behind a proxy server,"
             " first set http_proxy environment variable.")
      print "\tPlease close all your browser windows, and try again"
      log.error(format_exc())
      log.error("can't retrieve token from browser %s", browserName)
      sys.exit(-1)
    if self.authtoken == None:
      print "Unable to authorize (reason unknown)"
      log.error('not able to authorize; exiting')
      sys.exit(-1)
        #Add some authorization checks here(?)
    print "Authorization complete."
    log.info('authorization complete')
    
  def uploadfile(self, filepath, taglist, bufData, mode):
    #Set public 4(always), 1(public). Public overwrites f&f.
    public = mode&1
    #Set friends and family 4(always), 2(family), 1(friends).
    friends = mode>>3 & 1
    family = mode>>4 & 1
      #E.g. 745 - 4:No f&f, but 5:public
      #E.g. 754 - 5:friends, but not public
      #E.g. 774 - 7:f&f, but not public

    log.info("uploading file %s", filepath)
    log.info("  data length: %s", len(bufData))
    log.info("  taglist: %s", taglist)
    log.info("  permissions: family %s, friends %s, public %s",
             family, friends, public)
    filename = os.path.splitext(os.path.basename(filepath))[0]
    rsp = self.fapi.upload(filename=filepath, jpegData=bufData,
          title=filename,
          tags=taglist,
          is_public=public and "1" or "0",
          is_friend=friends and "1" or "0",
          is_family=family and "1" or "0")

    if rsp is None:
      log.error("response None from attempt to write file %s", filepath)
      log.error("will attempt recovery...")
      recent_rsp = None
      trytimes = 2
      while(trytimes):
        log.info("sleeping for 3 seconds...")
        time.sleep(3)
        trytimes -= 1
        # Keep on trying to retrieve the recently uploaded photo, till we
        # actually get the information, or the function throws an exception.
        while(recent_rsp is None or not recent_rsp):
          recent_rsp = self.fapi.photos_recentlyUpdated(
              auth_token=self.authtoken, min_date='1', per_page='1')
        
        pic = recent_rsp.photos[0].photo[0]
        log.info('we are looking for %s', filename)
        log.info('most recently updated pic is %s', pic['title'])
        if filename == pic['title']:
          id = pic['id']
          log.info("file %s uploaded with photoid %s", filepath, id)
          return id
      log.error("giving up; upload of %s appears to have failed", filepath)
      return None
    else:
      id = rsp.photoid[0].elementText
      log.info("file %s uploaded with photoid %s", filepath, id)
      return id

  def put2Set(self, set_id, photo_id):
    log.info("uploading photo %s to set id %s", photo_id, set_id)
    rsp = self.fapi.photosets_addPhoto(auth_token=self.authtoken, 
                                       photoset_id=set_id, photo_id=photo_id)
    if rsp:
      log.info("photo uploaded to set")
    else:
      log.error(rsp.errormsg)
  
  def createSet(self, path, photo_id):
    log.info("creating set %s with primary photo %s", path, photo_id)
    path, title = os.path.split(path)
    rsp = self.fapi.photosets_create(auth_token=self.authtoken, 
                                     title=title, primary_photo_id=photo_id)
    if rsp:
      log.info("created set %s", title)
      return rsp.photoset[0]['id']
    else:
      log.error(rsp.errormsg)
  
  def deleteSet(self, set_id):
    log.info("deleting set %s", set_id)
    if str(set_id)=="0":
      log.info("ignoring attempt to delete set wtih set_id 0 (a locally "
        "created set that has not yet acquired an id via uploading")
      return
    rsp = self.fapi.photosets_delete(auth_token=self.authtoken, 
                                     photoset_id=set_id)
    if rsp:
      log.info("deleted set %s", set_id)
    else:
      log.error(rsp.errormsg)
  
  def getPhotoInfo(self, photoId):
    log.debug("id: %s", photoId)
    rsp = self.fapi.photos_getInfo(auth_token=self.authtoken, photo_id=photoId)
    if not rsp:
      log.error("can't retrieve information about photo %s; got error %s",
                photoId, rsp.errormsg)
      return None
    #XXX: should see if there's some other 'format' option we can fall back to.
    try: format = rsp.photo[0]['originalformat']
    except KeyError: format = 'jpg'
    perm_public = rsp.photo[0].visibility[0]['ispublic']
    perm_family = rsp.photo[0].visibility[0]['isfamily']
    perm_friend = rsp.photo[0].visibility[0]['isfriend']
    if perm_public == '1':
      mode = 0755
    else:
      b_cnt = 4
      if perm_family == '1':
        b_cnt += 2
      if perm_friend == '1':
        b_cnt += 1
      mode = "07" + str(b_cnt) + "4"
      mode = int(mode)
      
    if hasattr(rsp.photo[0],'permissions'):
      permcomment = rsp.photo[0].permissions[0]['permcomment']
      permaddmeta = rsp.photo[0].permissions[0]['permaddmeta']
    else:
      permcomment = permaddmeta = [None]
      
    commMeta = '%s%s' % (permcomment,permaddmeta) # Required for chmod.
    desc = rsp.photo[0].description[0].elementText
    title = rsp.photo[0].title[0].elementText
    if hasattr(rsp.photo[0].tags[0], "tag"):
      taglist = [ a.elementText for a in rsp.photo[0].tags[0].tag ]
    else:
      taglist = []
    license = rsp.photo[0]['license']
    owner = rsp.photo[0].owner[0]['username']
    ownerNSID = rsp.photo[0].owner[0]['nsid']
    url = rsp.photo[0].urls[0].url[0].elementText
    posted = rsp.photo[0].dates[0]['posted']
    lastupdate = rsp.photo[0].dates[0]['lastupdate']
    return (format, mode, commMeta, desc, title, taglist, 
            license, owner, ownerNSID, url, int(posted), int(lastupdate))

  def setPerm(self, photoId, mode, comm_meta="33"):
    log.debug("id: %s, mode: %s, comm_meta=%s", photoId, mode, comm_meta)
    public = mode&1 #Set public 4(always), 1(public). Public overwrites f&f
    #Set friends and family 4(always), 2(family), 1(friends) 
    friends = mode>>3 & 1
    family = mode>>4 & 1
    if len(comm_meta)<2: 
      # This wd patch string index out of range bug, caused 
      # because some photos may not have comm_meta value set.
      comm_meta="33"
    rsp = self.fapi.photos_setPerms(auth_token=self.authtoken,
                                    is_public=str(public),
                                    is_friend=str(friends), 
                                    is_family=str(family), 
                                    perm_comment=comm_meta[0],
                                    perm_addmeta=comm_meta[1], 
                                    photo_id=photoId)
    if not rsp:
      log.error("couldn't set permission for photo %s; got error %s",
                photoId, rsp.errormsg)
      return False
    log.info("permissions have been set for photo %s", photoId)
    return True

  def setTags(self, photoId, tags):
    log.debug("id: %s, tags: %s", photoId, tags)
    templist = [ '"%s"'%(a,) for a in string.split(tags, ',')] + ['flickrfs']
    tagstring = ' '.join(templist)
    rsp = self.fapi.photos_setTags(auth_token=self.authtoken, 
                                   photo_id=photoId, tags=tagstring)
    if not rsp:
      log.error("couldn't set tags for %s; got error %s",
                photoId, rsp.errormsg)
      return False
    return True
  
  def setMeta(self, photoId, title, desc):
    log.debug("id: %s, title: %s, desc: %s", photoId, title, desc)
    rsp = self.fapi.photos_setMeta(auth_token=self.authtoken, 
                                   photo_id=photoId, title=title, 
                                   description=desc)
    if not rsp:
      log.error("couldn't set meta info for photo %s; got error",
                photoId, rsp.errormsg)
      return False
    return True

  def getLicenses(self):
    log.debug("started")
    rsp = self.fapi.photos_licenses_getInfo()
    if not rsp:
      log.error("couldn't retrieve licenses; got error %s", rsp.errormsg)
      return None
    licenseDict = {}
    for l in rsp.licenses[0].license:
      licenseDict[l['id']] = l['name']
    keys = licenseDict.keys()
    keys.sort()
    sortedLicenseList = []
    for k in keys:
      # Add tuple of license key, and license value.
      sortedLicenseList.append((k, licenseDict[k]))
    return sortedLicenseList
    
  def setLicense(self, photoId, license):
    log.debug("id: %s, license: %s", photoId, license)
    rsp = self.fapi.photos_licenses_setLicense(auth_token=self.authtoken, 
                                               photo_id=photoId, 
                                               license_id=license)
    if not rsp:
      log.error("couldn't set license info for photo %s; got error %s",
                photoId, rsp.errormsg)
      return False
    return True

  def getPhoto(self, photoId):
    log.debug("id: %s", photoId)
    rsp = self.fapi.photos_getSizes(auth_token=self.authtoken, 
                                    photo_id=photoId)
    if not rsp:
      log.error("error while trying to retrieve size information"
                " for photo %s", photoId)
      return None
    buf = ""
    for a in rsp.sizes[0].size:
      if a['label']=='Original':
        try:
          f = urllib2.urlopen(a['source'])
          buf = f.read()
        except:
          log.error("exception in getPhoto")
          log.error(format_exc())
          return ""
    if not buf:
      f = urllib2.urlopen(rsp.sizes[0].size[-1]['source'])
      buf = f.read()
    return buf

  def removePhotofromSet(self, photoId, photosetId):
    log.debug("id: %s, setid: %s", photoId, photosetId)
    rsp = self.fapi.photosets_removePhoto(auth_token=self.authtoken, 
                                          photo_id=photoId, 
                                          photoset_id=photosetId)
    if rsp:
      log.info("photo %s removed from set %s", photoId, photosetId)
    else:
      log.error(rsp.errormsg)
      
    
  def getBandwidthInfo(self):
    log.debug("retrieving bandwidth information")
    rsp = self.fapi.people_getUploadStatus(auth_token=self.authtoken)
    if not rsp:
      log.error("can't retrieve bandwidth information; got error %s",
        rsp.errormsg)
      return (None,None)
    bw = rsp.user[0].bandwidth[0]
    log.debug("max bandwidth: %s, bandwidth used: %s", bw['max'], bw['used'])
    return (bw['max'], bw['used'])

  def getUserId(self):
    log.debug("entered")
    rsp = self.fapi.auth_checkToken(api_key=flickrAPIKey, 
                                    auth_token=self.authtoken)
    if not rsp:
      log.error("unable to get userid; got error %s", rsp.errormsg)
      return None
    usr = rsp.auth[0].user[0]
    log.info("got NSID %s", usr['nsid'])
    #Set self.user_id to this value
    self.user_id = usr['nsid']
    return usr['nsid']

  def getPhotosetList(self):
    log.debug("entered")
    if self.user_id is "":
      self.getUserId() #This will set the value of self.user_id
    rsp = self.fapi.photosets_getList(auth_token=self.authtoken, 
                                      user_id=self.user_id)
    if not rsp:
      log.error("error getting photoset list; got error %s", rsp.errormsg)
      return []
    if not hasattr(rsp.photosets[0], "photoset"):
      log.info("no sets found for userid %s", self.user_id)
      return []
    else:
      log.info("%s sets found for userid %s",
          len(rsp.photosets[0].photoset), self.user_id)
    return rsp.photosets[0].photoset

  def parseInfoFromPhoto(self, photo, perms=None):
    info = {}
    info['id'] = photo['id']
    info['title'] = photo['title'].replace('/', '_')
    # Some pics don't contain originalformat attribute, so set it to jpg by default.
    try:
      info['format'] = photo['originalformat']
    except KeyError:
      info['format'] = 'jpg'

    try:
      info['dupload'] = photo['dateupload']
    except KeyError:
      info['dupload'] = '0'

    try:
      info['dupdate'] = photo['lastupdate']
    except KeyError:
      info['dupdate'] = '0'
    
    info['perms'] = perms
    return info

  def parseInfoFromFullInfo(self, id, fullInfo):
    info = {}
    info['id'] = id
    info['title'] = fullInfo[4]
    info['format'] = fullInfo[0]
    info['dupload'] = fullInfo[10]
    info['dupdate'] = fullInfo[11]
    info['mode'] = fullInfo[1]
    return info

  def getPhotosFromPhotoset(self, photoset_id):
    log.debug("set id: %s", photoset_id)
    photosPermsMap = {}
    # I'm not utilizing the value part of this dictionary. Its arbitrarily
    # set to i.
    for i in range(0,3):
      page = 1
      while True:
        rsp = self.fapi.photosets_getPhotos(auth_token=self.authtoken,
                                            photoset_id=photoset_id, 
                                            extras=self.extras, 
                                            page=str(page),
                                            privacy_filter=str(i))
        if not rsp:
          break
        if not hasattr(rsp.photoset[0], 'photo'):
          log.error("photoset %s doesn't have attribute photo", rsp.photoset[0]['id'])
          break
        for p in rsp.photoset[0].photo:
          photosPermsMap[p] = str(i)
        page += 1
        if page > int(rsp.photoset[0]['pages']): break
      if photosPermsMap: break
    return photosPermsMap
            
  def getPhotoStream(self, user_id):
    log.debug("userid: %s", user_id)
    retList = []
    pageNo = 1
    maxPage = 1
    while pageNo<=maxPage:
      log.info("retreiving page number %s of %s", pageNo, maxPage) 
      rsp = self.fapi.photos_search(auth_token=self.authtoken, 
                                    user_id=user_id, per_page="500", 
                                    page=str(pageNo), extras=self.extras)
      if not rsp:
        log.error("can't retrive photos from your stream; got error %s",
            rsp.errormsg)
        return retList
      if not hasattr(rsp.photos[0], 'photo'):
        log.error("photos.search response doesn't have attribute photos; "
            "returning list acquired so far")
        return retList
      for a in rsp.photos[0].photo:
        retList.append(a)
      maxPage = int(rsp.photos[0]['pages'])
      pageNo = pageNo + 1
    return retList
 
  def getTaggedPhotos(self, tags, user_id=None):
    log.debug("tags: %s user_id: %s", tags, user_id)
    kw = kwdict(auth_token=self.authtoken, tags=tags, tag_mode="all", 
                extras=self.extras, per_page="500")
    if user_id is not None: 
      kw = kwdict(user_id=user_id, **kw)
    rsp = self.fapi.photos_search(**kw)
    log.debug("search for photos with tags %s has been"
              " successfully finished" % tags)
    if not rsp:
      log.error("couldn't search for the photos; got error %s", rsp.errormsg)
      return
    if not hasattr(rsp.photos[0], 'photo'):
      return []
    return rsp.photos[0].photo
Exemplo n.º 7
0
sys.path.insert(0, "/home/mike/python")

from flickrapi import FlickrAPI
from flickr import MikeFlickr

flickrAPIKey = open("/home/mike/flickr.key", "r").read()
flickrSecret = open("/home/mike/flickr.secret", "r").read()

fapi = None
fapi = FlickrAPI(flickrAPIKey, flickrSecret)

if len(sys.argv) < 2:
    print "usage: %s JPEG [JPEG]" % sys.argv[0]
    sys.exit(-1)

token = fapi.getToken(browser="lynx")  ##,perms="delete")
mikeapi = MikeFlickr(fapi, flickrAPIKey, token)

## methods


def userinput(prompt):
    rtn = ""
    while len(rtn) == 0:
        rtn = raw_input(prompt).strip()
    return rtn


##
## now, upload everything on the command line (unless we have already
## backed it up)
Exemplo n.º 8
0
sys.path.insert(0, "/home/mike/python")

from flickrapi import FlickrAPI
from flickr import MikeFlickr

flickrAPIKey = open("/home/mike/flickr.key", "r").read()
flickrSecret = open("/home/mike/flickr.secret", "r").read()

fapi = None
fapi = FlickrAPI(flickrAPIKey, flickrSecret)

if len(sys.argv) < 2:
    print "usage: %s JPEG [JPEG]" % sys.argv[0]
    sys.exit(-1)

token = fapi.getToken(browser="lynx")
mikeapi = MikeFlickr(fapi, flickrAPIKey, token)

##
## first get info from Flickr on what I've already backed up, by the
## "mikebackup" tag
##

existing = mikeapi.imagesByTag("mikebackup", privateOnly=True)
print "got", len(existing), "existing photos."

names = map(lambda x: x[1].lower(), existing)
# print names[:10]

##
## now, upload everything on the command line (unless we have already
Exemplo n.º 9
0
#!/usr/bin/python

import sys
from flickrapi import FlickrAPI

# flickr auth information:
flickrSecret = "3fbf7144be7eca28"                  # shared "secret"

flickrAPIKey = "f8aa9917a9ae5e44a87cae657924f42d"  # API key
# make a new FlickrAPI instance
fapi = FlickrAPI(flickrAPIKey, flickrSecret)

# do the whole whatever-it-takes to get a valid token:
token = fapi.getToken(browser="/usr/bin/firefox")

# get my favorites
rsp = fapi.favorites_getList(api_key=flickrAPIKey,auth_token=token)
fapi.testFailure(rsp)

#print 'Photosets: '
print fapi.photosets_getList(api_key=flickrAPIKey, auth_token=token)
rsp = fapi.photosets_getList(api_key=flickrAPIKey, auth_token=token)
fapi.testFailure(rsp)
#print photoSets
#print ', '.join([str(set.title) for set in photoSets])

#person = fapi.flickr_people_getInfo(user_id="tuxmann")
#print person.username

# and print them
if hasattr(rsp.photosets[0], "photoset"):
Exemplo n.º 10
0
class Offlickr:
    def __init__(self,
                 key,
                 secret,
                 uid,
                 httplib=None,
                 browser="lynx",
                 verbose=False):
        """Instantiates an Offlickr object
        An API key is needed, as well as an API secret and a user id.
        A browser can be specified to be used for authorizing the program
        to access the user account."""
        self.__flickrAPIKey = key
        self.__flickrSecret = secret
        self.__httplib = httplib
        # Get authentication token
        self.fapi = FlickrAPI(self.__flickrAPIKey, self.__flickrSecret)
        self.token = self.fapi.getToken(browser=browser)
        self.flickrUserId = uid
        self.verbose = verbose

    def __testFailure(self, rsp):
        """Returns whether the previous call was successful"""
        if rsp['stat'] == "fail":
            print "Error!"
            return True
        else:
            return False

    def getPhotoList(self, dateLo, dateHi):
        """Returns a list of photo given a time frame"""
        n = 0
        flickr_max = 500
        photos = []

        print "Retrieving list of photos"
        while True:
            if self.verbose:
                print "Requesting a page..."
            n = n + 1
            rsp = self.fapi.photos_search(
                api_key=self.__flickrAPIKey,
                auth_token=self.token,
                user_id=self.flickrUserId,
                per_page=str(flickr_max),  # Max allowed by Flickr
                page=str(n),
                min_upload_date=dateLo,
                max_upload_date=dateHi)
            if self.__testFailure(rsp):
                return None
            if rsp.photos[0]['total'] == '0':
                return None
            photos += rsp.photos[0].photo
            if self.verbose:
                print " %d photos so far" % len(photos)
            if len(photos) >= int(rsp.photos[0]['total']):
                break

        return photos

    def getPhotosetList(self):
        """Returns a list of photosets for a user"""

        rsp = self.fapi.photosets_getList(api_key=self.__flickrAPIKey,
                                          auth_token=self.token,
                                          user_id=self.flickrUserId)
        if self.__testFailure(rsp):
            return None
        return rsp.photosets[0].photoset

    def getPhotosetInfo(self, pid, method):
        """Returns a string containing information about a photoset (in XML)"""
        rsp = method(api_key=self.__flickrAPIKey,
                     auth_token=self.token,
                     photoset_id=pid)
        if self.__testFailure(rsp):
            return None
        doc = libxml2.parseDoc(rsp.xml)
        info = str(doc.xpathEval("/rsp/photoset")[0])
        doc.freeDoc()
        return info

    def getPhotoMetadata(self, pid):
        """Returns an array containing containing the photo metadata (as a string), and the format of the photo"""
        if self.verbose:
            print "Requesting metadata for photo %s" % pid
        rsp = self.fapi.photos_getInfo(api_key=self.__flickrAPIKey,
                                       auth_token=self.token,
                                       photo_id=pid)
        if self.__testFailure(rsp):
            return None
        doc = libxml2.parseDoc(rsp.xml)
        metadata = doc.xpathEval("/rsp/photo")[0].serialize()
        doc.freeDoc()
        return [metadata, rsp.photo[0]['originalformat']]

    def getPhotoComments(self, pid):
        """Returns an XML string containing the photo comments"""
        if self.verbose:
            print "Requesting comments for photo %s" % pid
        rsp = self.fapi.photos_comments_getList(api_key=self.__flickrAPIKey,
                                                auth_token=self.token,
                                                photo_id=pid)
        if self.__testFailure(rsp):
            return None
        doc = libxml2.parseDoc(rsp.xml)
        comments = doc.xpathEval("/rsp/comments")[0].serialize()
        doc.freeDoc()
        return comments

    def getPhotoSizes(self, pid):
        """Returns a string with is a list of available sizes for a photo"""
        rsp = self.fapi.photos_getSizes(api_key=self.__flickrAPIKey,
                                        auth_token=self.token,
                                        photo_id=pid)
        if self.__testFailure(rsp):
            return None
        return rsp

    def getOriginalPhoto(self, pid):
        """Returns a URL which is the original photo, if it exists"""
        source = None
        rsp = self.getPhotoSizes(pid)
        if rsp == None:
            return None
        for s in rsp.sizes[0].size:
            if s['label'] == 'Original':
                source = s['source']
        return source

    def __downloadReportHook(self, count, blockSize, totalSize):
        if self.__verbose == False:
            return
        p = 100 * count * blockSize / totalSize
        if (p > 100):
            p = 100
        print "\r %3d %%" % p,
        sys.stdout.flush()

    def downloadURL(self, url, target, filename, verbose=False):
        """Saves a photo in a file"""
        self.__verbose = verbose
        tmpfile = "%s/%s.TMP" % (target, filename)
        if self.__httplib == 'wget':
            cmd = 'wget -q -t 0 -T 120 -w 10 -c -O %s %s' % (tmpfile, url)
            os.system(cmd)
        else:
            urllib.urlretrieve(url,
                               tmpfile,
                               reporthook=self.__downloadReportHook)
        os.rename(tmpfile, "%s/%s" % (target, filename))
Exemplo n.º 11
0
Arquivo: test.py Projeto: swimat4/pics
#!/usr/bin/python

import sys
from flickrapi import FlickrAPI

# flickr auth information:
flickrAPIKey = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"  # API key
flickrSecret = "yyyyyyyyyyyyyyyy"                  # shared "secret"

# make a new FlickrAPI instance
fapi = FlickrAPI(flickrAPIKey, flickrSecret)

# do the whole whatever-it-takes to get a valid token:
token = fapi.getToken(browser="firefox")

# get my favorites
rsp = fapi.favorites_getList(api_key=flickrAPIKey,auth_token=token)
fapi.testFailure(rsp)

# and print them
for a in rsp.photos[0].photo:
	print "%10s: %s" % (a['id'], a['title'].encode("ascii", "replace"))

# upload the file foo.jpg
#fp = file("foo.jpg", "rb")
#data = fp.read()
#fp.close()
#rsp = fapi.upload(jpegData=data, api_key=flickrAPIKey, auth_token=token, \
#rsp = fapi.upload(filename="foo.jpg", api_key=flickrAPIKey, auth_token=token, \
#	title="This is the title", description="This is the description", \
#	tags="tag1 tag2 tag3",\