Skip to content

Instantly share code, notes, and snippets.

@pcardune
Created September 5, 2011 22:07
Show Gist options
  • Save pcardune/1196033 to your computer and use it in GitHub Desktop.
Save pcardune/1196033 to your computer and use it in GitHub Desktop.
Script to upload a bunch of photos to facebook
#!/usr/bin/env python
import os
import os.path
import json
import re
from mimetypes import guess_type
from optparse import OptionParser
SUPPORTED_TYPES = ('image/gif','image/jpeg','image/png','image/bmp','image/tiff')
METADATA_FILE = '.fb_photos'
parser = OptionParser()
parser.add_option('--dir', dest='dir',
default=".",
metavar="DIR", help="Directory in which to search for photos")
parser.add_option('-v', dest='verbose',
action="store_true", default=False,
help="verbose output")
parser.add_option('--dry-run', dest='dryrun',
action="store_true", default=False,
help="Don't actually do anything")
(options, args) = parser.parse_args()
print "Starting up, please wait"
from urllib import urlretrieve
import imp
urlretrieve('https://raw.github.com/facebook/fbconsole/master/src/fbconsole.py',
'.fbconsole.py')
fb = imp.load_source('fb', '.fbconsole.py')
print "logging you in to facebook"
fb.AUTH_SCOPE = ['publish_stream']
fb.authenticate()
for dirpath, dirnames, filenames in os.walk(options.dir):
image_files = [os.path.join(dirpath,fn) for fn in filenames
if guess_type(fn)[0] in SUPPORTED_TYPES]
metadata_file = os.path.join(dirpath, METADATA_FILE)
if os.path.exists(metadata_file):
metadata = json.load(open(metadata_file))
else:
metadata = {'uploaded':{}}
if image_files:
dirname = os.path.split(dirpath)[-1]
album = metadata.get('album')
if album:
if options.verbose:
print "Found album", dirname
else:
print "Creating album", dirname
if not options.dryrun:
album = fb.post('/me/albums', {'name':dirname})
metadata['album'] = album
json.dump(metadata, open(metadata_file, 'w'))
if options.verbose:
print "Found", len(image_files), "image files in", dirname
for filename in image_files:
name = os.path.split(filename)[-1].split('.')[-2]
if filename in metadata['uploaded']:
if options.verbose:
print "Skipping", name, "because it was already uploaded"
else:
print "Uploading", name, "to", dirname
data = {'source': open(filename)}
if re.match(r'.*[0-9]{4}$', name):
if options.verbose:
print "Not using", name, "for the caption"
else:
data['name'] = name
if not options.dryrun:
try:
photo = fb.post('/'+album['id']+'/photos', data)
except:
print "Error. Skipping to the next album."
break
metadata['uploaded'][filename] = photo
json.dump(metadata, open(metadata_file, 'w'))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment