#!/usr/bin/python ###################################################################### # Copyright 2009, 2010 ryuslash # # This file is part of 4grab. # # 4grab is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # 4grab is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with 4grab. If not, see . ###################################################################### import optparse import sys import config import download import progressbar base_url = "http://boards.4chan.org/" parser = optparse.OptionParser() downloader = download.Downloader(progressbar.Progress) def walk_with_wizard(baseurl): wzrd_msg = "Pilates! *SHAZAM* Here they come!" print "Alright, let me put on my robe and wizard hat." # Single or all inp = None prompt = "Would you like to download a single thread, or all? " inp = raw_input(prompt) while (inp != "single" and inp != "all"): print "Please type single or all" inp = raw_input(prompt) if inp == "single": inp = raw_input("Which thread would you like to download? ") if inp[:7] == "http://": t = downloader.get_image_links("", [inp]) else: thread = inp inp = raw_input("Which category is this thread in? ") print wzrd_msg t = downloader.get_image_links("%s%s/res/" % (baseurl, inp), [thread]) else: inp = raw_input("Which category would you like to download? ") config.Configuration().set_category(inp) baseurl = "%s%s/" % (baseurl, config.Configuration().get_category()) print wzrd_msg t = downloader.get_thread_links(baseurl) t = downloader.get_image_links(baseurl, t) (skipped, failed, downloaded, total) = downloader.get_images(t) print "Downloaded: ", downloaded print "Skipped: ", skipped print "Failed: ", failed print "Total: ", total parser.set_usage( """%prog [options] 4grab Copyright (C) 2009-2010 ryuslash This program comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to redistribute it under certain conditions.""") parser.add_option("-e", nargs=2, dest="confval", metavar="CONF VALUE", help="Set configuration option CONF to be VALUE") parser.add_option("-c", "--category", dest="tempcat", metavar="CATEGORY", help="Set the category to CATEGORY only for this run") parser.add_option("-t", "--thread", dest="thread", metavar="THREAD", help="Download only THREAD. If THREAD is only an ID, " "CATEGORY must also be set. Otherwise, no problem :-)") parser.add_option("-w", "--wizard", action="store_true", dest="wizard", help="I'll put on my robe and wizard hat and help you " "get some of those pictures you like") (options, args) = parser.parse_args() if options.confval and (options.tempcat or options.thread or options.wizard): print "Can't configure something and do something else too." exit(1) if options.wizard and (options.tempcat or options.thread or options.confval): print "Can't take a walk with the wizard and do something else too." exit(1) if options.confval: if not config.Configuration().option_exists(options.confval[0]): print ("%s: error: %s is not a " "valid configuration option") % (sys.argv[0], options.confval[0]) exit(1) print "Setting", options.confval[0], "to", options.confval[1] config.Configuration().set_option(options.confval[0], options.confval[1]) config.Configuration().save() exit(0) elif options.wizard: try: walk_with_wizard(base_url) except KeyboardInterrupt: print print "Alright, no more wizard hat and robe then. Goodbye" exit(0) elif options.thread: try: if options.thread[:7] == "http://": t = downloader.get_image_links("", [options.thread]) elif options.tempcat: url = "%s%s/res/" % (base_url, options.tempcat) t = downloader.get_image_links(url, [options.thread]) else: print ("if THREAD is not an absolute URL, " "CATEGORY must also be specified") exit(1) (skipped, failed, downloaded, total) = downloader.get_images(t) print "Downloaded: ", downloaded print "Skipped: ", skipped print "Failed: ", failed print "Total: ", total except KeyboardInterrupt: print print "Goodbye" exit(0) elif options.tempcat: config.Configuration().set_category(options.tempcat) base_url = "%s%s/" % (base_url, config.Configuration().get_category()) try: t = downloader.get_thread_links(base_url) t = downloader.get_image_links(base_url, t) (skipped, failed, downloaded, total) = downloader.get_images(t) print "Downloaded: ", downloaded print "Skipped: ", skipped print "Failed: ", failed print "Total: ", total except KeyboardInterrupt: print print "So you don't want these images? Fine! I'll stop then."