Example #1
0
def main():
    # parse arguments
    parser = argparse.ArgumentParser(
        description="Download photos from Facebook.")
    parser.add_argument('--cmd', action='store_true', help=helps['cmd'])
    parser.add_argument('--token', help=helps['token'])
    parser.add_argument('--list-targets',
                        choices=('me', 'friends', 'likes', 'following', 'all'),
                        help=helps['list-targets'])
    parser.add_argument('--list-albums', nargs='+', help=helps['list-albums'])
    parser.add_argument('--target', nargs='+', help=helps['target'])
    parser.add_argument('-u', action='store_true', help=helps['u'])
    parser.add_argument('-t', action='store_true', help=helps['t'])
    parser.add_argument('-c', action='store_true', help=helps['c'])
    parser.add_argument('-a', action='store_true', help=helps['a'])
    parser.add_argument('--album', nargs='+', help=helps['album'])
    parser.add_argument('--dir', help=helps['dir'])
    parser.add_argument('--debug',
                        choices=('info', 'debug'),
                        help=helps['debug'])

    args = parser.parse_args()

    # setup logging
    format = "%(asctime)s:%(levelname)s:%(name)s:%(lineno)d:%(message)s"

    logging.basicConfig(filename='pg.log',
                        filemode='w',
                        format=format,
                        level=logging.ERROR)

    if args.debug == 'info':
        logging.getLogger("pg").setLevel(logging.INFO)
    elif args.debug == 'debug':
        logging.getLogger("pg").setLevel(logging.DEBUG)

    log.info('Arguments parsed, log configured.')

    log.error('basedir: %s' % res.getpath())

    # GUI
    if not args.cmd:
        log.info('Starting GUI.')
        import pgui
        pgui.start()
        log.info('GUI completed, exiting.')
        exit()

    # Login
    if args.token is None:
        log.info('No token provided.')
        browser = raw_input("Open Browser [y/n]: ")
        if not browser.isalnum():
            raise ValueError('Input must be alphanumeric.')
        if browser == 'y':
            log.info('Opening default browser.')
            facebook.request_token()
            time.sleep(1)
        args.token = raw_input("Enter Token: ")
    if not args.token.isalnum():
        raise ValueError('Input must be alphanumeric.')

    # setup facebook API objects
    graph = facebook.GraphAPI(args.token)
    graph.start()
    peoplegrab = helpers.PeopleGrabber(graph)
    albumgrab = helpers.AlbumGrabber(graph)

    # ensure token is removed from logs...
    log.info('Provided token: %s' % args.token)

    # check if token works
    my_info = peoplegrab.get_info('me')
    if not my_info:
        log.error('Provided Token Failed: %s' % args.token)
        print 'Provided Token Failed: OAuthException'
        exit()

    # --list-targets {'me','friends','likes','following','all'}
    target_list = []
    if args.list_targets == 'me':
        target_list.append(my_info)
    elif args.list_targets == 'friends':
        target_list.extend(peoplegrab.get_friends('me'))
    elif args.list_targets == 'likes':
        target_list.extend(peoplegrab.get_likes('me'))
    elif args.list_targets == 'following':
        target_list.extend(peoplegrab.get_subscriptions('me'))
    elif args.list_targets == 'all':
        target_list.append(my_info)
        target_list.extend(peoplegrab.get_friends('me'))
        target_list.extend(peoplegrab.get_likes('me'))
        target_list.extend(peoplegrab.get_subscriptions('me'))

    if args.list_targets is not None:
        log.info('Listing available targets.')
        for target in target_list:
            print('%(id)s:"%(name)s"' % target).encode('utf-8')
        return

    # --list_albums <object_id 1> ... <object_id n>
    if args.list_albums is not None:
        log.info('Listing available albums.')
        for target in args.list_albums:
            album_list = albumgrab.list_albums(target)
            for album in album_list:
                print('%(id)s:"%(name)s"' % album).encode('utf-8')
        return

    # --dir <full path to download location>
    if args.dir is None:
        current_dir = unicode(os.getcwd())
        args.dir = unicode(raw_input("Download Location [%s]: " % current_dir))
        if args.dir == '':
            args.dir = current_dir
    else:
        args.dir = unicode(args.dir)
    if not os.path.exists(args.dir):
        raise ValueError('Download Location must exist.')

    log.info('Download Location: %s' % args.dir)

    # --album <object_id 1> ... <object_id n>
    if args.album is not None:
        log.info('Downloading albums.')
        albums = []
        for album in args.album:
            # note, doesnt manually ask for caut options for album
            if not album.isdigit(): raise ValueError('Input must be numeric.')
            print 'Retrieving album data: %s...' % album
            albums.append({'id': album})

        data = albumgrab.get_albums_by_id(albums, comments=args.c)

        # todo: filter photos_ids from albums before downloading...

        print 'Downloading photos'
        pool = helpers.DownloadPool()
        for a in range(5):
            pool.add_thread()

        # set path to include the name of who uploaded the album
        data = [album for album in data if len(album['photos']) > 0]
        for album in data:
            album['folder_name'] = album['name']
            path = os.path.join(args.dir, unicode(album['from']['name']))
            pool.save_album(album, path)

        pool.get_queue().join()
        return

    # --target <object_id 1> ... <object_id n>
    if args.target is None:
        args.target = []
        args.target.append(raw_input("Target: "))

    for target in args.target:
        if not target.isalnum(): raise ValueError('Input must be alphanumeric')

    # get options
    if not args.c and not args.a:
        if not args.u and not args.t:
            print ''
            print 'Options'
            print '-------'
            print 'u: %s' % helps['u']
            print 't: %s' % helps['t']
            print 'c: %s' % helps['c']
            print 'a: %s' % helps['a']
            opt_str = raw_input("Input Options (e.g. 'cau' or 'caut'):")
            if not opt_str.isalnum():
                raise ValueError('Input must be alphanumeric')
            if 'u' in opt_str:
                args.u = True
            if 't' in opt_str:
                args.t = True
            if 'c' in opt_str:
                args.c = True
            if 'a' in opt_str:
                args.a = True

    config = {}
    config['dir'] = args.dir
    config['targets'] = args.target
    config['u'] = args.u
    config['t'] = args.t
    config['c'] = args.c
    config['a'] = args.a

    # download pool
    pool = helpers.DownloadPool()
    for a in range(5):
        pool.add_thread()

    # process thread
    thread = helpers.ProcessThread(albumgrab, config, pool)
    thread.start()

    print 'Please wait while I download your photos...'

    thread.join()
Example #2
0
 def loginPressed(self):
     facebook.request_token()
Example #3
0
 def loginPressed(self):
     facebook.request_token()
Example #4
0
def main():
    # parse arguments
    parser = argparse.ArgumentParser(description="Download photos from Facebook.")
    parser.add_argument('--cmd', action='store_true', help=helps['cmd'])
    parser.add_argument('--token', help=helps['token'])
    parser.add_argument('--list-targets', choices=('me','friends','likes','following','all'), help=helps['list-targets'])
    parser.add_argument('--list-albums', nargs='+', help=helps['list-albums'])
    parser.add_argument('--target', nargs='+', help=helps['target'])
    parser.add_argument('-u', action='store_true', help=helps['u'])
    parser.add_argument('-t', action='store_true', help=helps['t'])
    parser.add_argument('-c', action='store_true', help=helps['c'])
    parser.add_argument('-a', action='store_true', help=helps['a'])
    parser.add_argument('--album', nargs='+', help=helps['album'])
    parser.add_argument('--dir', help=helps['dir'])
    parser.add_argument('--debug', choices=('info','debug'), help=helps['debug'])

    args = parser.parse_args()
    
    # setup logging
    format = "%(asctime)s:%(levelname)s:%(name)s:%(lineno)d:%(message)s"

    logging.basicConfig(filename='pg.log',
                        filemode='w',
                        format=format,
                        level=logging.ERROR)

    if args.debug == 'info':
        logging.getLogger("pg").setLevel(logging.INFO)
    elif args.debug == 'debug':
        logging.getLogger("pg").setLevel(logging.DEBUG)

    log.info('Arguments parsed, log configured.')
    
    log.error('basedir: %s' % res.getpath() )
    
    # GUI
    if not args.cmd:
        log.info('Starting GUI.')
        import pgui
        pgui.start()
        log.info('GUI completed, exiting.')
        exit()

    # Login
    if args.token is None:
        log.info('No token provided.')
        browser = raw_input("Open Browser [y/n]: ")
        if not browser.isalnum(): raise ValueError('Input must be alphanumeric.')
        if browser == 'y':
            log.info('Opening default browser.')
            facebook.request_token()
            time.sleep(1)
        args.token = raw_input("Enter Token: ")
    if not args.token.isalnum(): raise ValueError('Input must be alphanumeric.')

    # setup facebook API objects
    graph = facebook.GraphAPI(args.token)
    graph.start()
    peoplegrab = helpers.PeopleGrabber(graph)
    albumgrab = helpers.AlbumGrabber(graph)
    
    # ensure token is removed from logs...
    log.info('Provided token: %s' % args.token)

    # check if token works
    my_info = peoplegrab.get_info('me')
    if not my_info:
        log.error('Provided Token Failed: %s' % args.token)
        print 'Provided Token Failed: OAuthException'
        exit()

    # --list-targets {'me','friends','likes','following','all'}
    target_list = []
    if args.list_targets == 'me':
        target_list.append(my_info)
    elif args.list_targets == 'friends':
        target_list.extend(peoplegrab.get_friends('me'))
    elif args.list_targets == 'likes':
        target_list.extend(peoplegrab.get_likes('me'))
    elif args.list_targets == 'following':
        target_list.extend(peoplegrab.get_subscriptions('me'))
    elif args.list_targets == 'all':
        target_list.append(my_info)
        target_list.extend(peoplegrab.get_friends('me'))
        target_list.extend(peoplegrab.get_likes('me'))
        target_list.extend(peoplegrab.get_subscriptions('me'))

    if args.list_targets is not None:
        log.info('Listing available targets.')
        for target in target_list:
            print ('%(id)s:"%(name)s"' % target).encode('utf-8')
        return

    # --list_albums <object_id 1> ... <object_id n>
    if args.list_albums is not None:
        log.info('Listing available albums.')
        for target in args.list_albums:
            album_list = albumgrab.list_albums(target)
            for album in album_list:
                print ('%(id)s:"%(name)s"' % album).encode('utf-8')
        return

    # --dir <full path to download location>
    if args.dir is None:
        current_dir = unicode(os.getcwd())
        args.dir = unicode(raw_input("Download Location [%s]: " % current_dir))
        if args.dir == '':
            args.dir = current_dir
    else:
        args.dir = unicode(args.dir)
    if not os.path.exists(args.dir): raise ValueError('Download Location must exist.')

    log.info('Download Location: %s' % args.dir)

    # --album <object_id 1> ... <object_id n>
    if args.album is not None:
        log.info('Downloading albums.')
        albums = []
        for album in args.album:
            # note, doesnt manually ask for caut options for album
            if not album.isdigit(): raise ValueError('Input must be numeric.')
            print 'Retrieving album data: %s...' % album
            albums.append({'id':album})

        data = albumgrab.get_albums_by_id(albums, comments=args.c)
        
        # todo: filter photos_ids from albums before downloading...
        
        print 'Downloading photos'
        pool = helpers.DownloadPool()
        for a in range(5): pool.add_thread()
        
        # set path to include the name of who uploaded the album
        data = [album for album in data if len(album['photos']) > 0]
        for album in data:
            album['folder_name'] = album['name']
            path = os.path.join(args.dir, unicode(album['from']['name']))
            pool.save_album(album, path)

        pool.get_queue().join()
        return

    # --target <object_id 1> ... <object_id n>
    if args.target is None:
        args.target = []
        args.target.append(raw_input("Target: "))
    
    for target in args.target:
        if not target.isalnum(): raise ValueError('Input must be alphanumeric')

    # get options
    if not args.c and not args.a:
        if not args.u and not args.t:
            print ''
            print 'Options'
            print '-------'
            print 'u: %s' % helps['u']
            print 't: %s' % helps['t']
            print 'c: %s' % helps['c']
            print 'a: %s' % helps['a']
            opt_str = raw_input("Input Options (e.g. 'cau' or 'caut'):")
            if not opt_str.isalnum(): raise ValueError('Input must be alphanumeric')
            if 'u' in opt_str:
                args.u = True
            if 't' in opt_str:
                args.t = True
            if 'c' in opt_str:
                args.c = True
            if 'a' in opt_str:
                args.a = True

    config = {}
    config['dir'] = args.dir
    config['targets'] = args.target
    config['u'] = args.u
    config['t'] = args.t
    config['c'] = args.c
    config['a'] = args.a

    # download pool
    pool = helpers.DownloadPool()
    for a in range(5): pool.add_thread()

    # process thread
    thread = helpers.ProcessThread(albumgrab, config, pool)
    thread.start()
    
    print 'Please wait while I download your photos...'

    thread.join()