#!/usr/bin/python2 ###################################################################### # 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 from util import raw_input_with_default import util import download import progressbar import sorter import backend config._optioncreator = raw_input_with_default base_url = "http://boards.4chan.org/" parser = optparse.OptionParser() downloader = download.Downloader(progressbar.Progress) 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("-s", "--sort", action="store_true", dest="sort", help="Sort downloaded images, most handy if you've used " "older versions which didn't sort yet") parser.add_option("-l", "--loglevel", nargs=1, dest="loglevel", metavar="LEVEL", help="Changes the default log level to LEVEL") (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.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.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]) elif options.loglevel is not None: util.loglevel = util.LogType.from_int(options.loglevel) 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: be = backend.Backend() be.save(True) # Make sure that the downloaded images are saved anyway print print "So you don't want these images? Fine! I'll stop then." util.log(util.LogType.Err, "Quit on user request")