#!/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 os import config import download import progressbar import sorter def raw_input_with_default(default, prompt): inp = raw_input("%s (default=%s): " % (prompt, default)) if inp == "": return default return inp config._optioncreator = raw_input_with_default base_url = "http://boards.4chan.org/" parser = optparse.OptionParser() downloader = download.Downloader(progressbar.Progress) def walk_with_wizard(baseurl): conf = config.Configuration() 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? ") conf.set_categories([inp]) baseurl = "%s%s/" % (baseurl, conf.get_categories()[0]) 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 def parse_commands(): conf = config.Configuration() 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") parser.add_option("-s", "--sort", action="store_true", dest="sort", help="Sort downloaded images, most handy if you've used " "older versions which didn't sort yet") (options, args) = parser.parse_args() if options.confval and (options.tempcat or options.thread or options.wizard or options.sort): print "Can't configure something and do something else too." exit(1) if options.wizard and (options.tempcat or options.thread or options.confval or options.sort): print "Can't take a walk with the wizard and do something else too." exit(1) if options.sort: sort = sorter.Sorter() for item in os.listdir(conf.get_download_location()): sort.act(item) exit(0) if options.confval: if not conf.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] conf.set_option(options.confval[0], options.confval[1]) conf.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: conf.set_categories([options.tempcat]) #base_url = "%s%s/" % (base_url, conf.get_categories()) if __name__ == "__main__": conf = config.Configuration() sort = sorter.Sorter() parse_commands() downloader.set_on_downloaded(sort.act) for category in conf.get_categories(): base_url = "%s%s/" % (base_url, 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."