def create_app(script_info=None): """Create app.""" app = Flask(__name__) # logging if not os.path.exists(user_data_dir): os.makedirs(user_data_dir) log_dir = os.path.join(user_data_dir, 'log') if not os.path.exists(log_dir): os.makedirs(log_dir) peewee_logger = logging.getLogger('peewee') peewee_logger.setLevel(logging.INFO) chardet_logger = logging.getLogger('chardet') chardet_logger.setLevel(logging.INFO) default_log_file = os.path.join(log_dir, 'iqdb_tagger_server.log') file_handler = TimedRotatingFileHandler(default_log_file, 'midnight') file_handler.setLevel(logging.WARNING) file_handler.setFormatter(logging.Formatter('<%(asctime)s> <%(levelname)s> %(message)s')) app.logger.addHandler(file_handler) app.logger.addHandler(peewee_logger) app.logger.addHandler(chardet_logger) # reloader reloader = app.config['TEMPLATES_AUTO_RELOAD'] = \ bool(os.getenv('IQDB_TAGGER_RELOADER')) or app.config['TEMPLATES_AUTO_RELOAD'] # NOQA if reloader: app.jinja_env.auto_reload = True app.config['SECRET_KEY'] = os.getenv('IQDB_TAGGER_SECRET_KEY') or os.urandom(24) app.config['WTF_CSRF_ENABLED'] = False # debug debug = app.config['DEBUG'] = bool(os.getenv('IQDB_TAGGER_DEBUG')) or app.config['DEBUG'] if debug: app.config['DEBUG'] = True app.config['LOGGER_HANDLER_POLICY'] = 'debug' logging.basicConfig(level=logging.DEBUG) pprint.pprint(app.config) print('Log file: {}'.format(default_log_file)) print('script info:{}'.format(script_info)) db_path = os.getenv('IQDB_TAGGER_DB_PATH') or default_db_path init_program() init_db(db_path) # app and db app.app_context().push() @app.shell_context_processor def shell_context(): # pylint: disable=unused-variable return {'app': app} # flask-admin app_admin = Admin( app, name='IQDB Tagger', template_mode='bootstrap3', index_view=views.HomeView(name='Home', template='iqdb_tagger/index.html', url='/')) app_admin.add_view(views.MatchView()) # app_admin.add_view(ModelView(ImageMatch, category='DB')) # app_admin.add_view(ModelView(ImageMatchRelationship, category='DB')) # app_admin.add_view(ModelView(ImageModel, category='DB')) # app_admin.add_view(ModelView(MatchTagRelationship, category='DB')) # routing app.add_url_rule('/thumb/<path:basename>', view_func=thumb) return app
def test_get_or_create_from_path(tmpdir): """Test method.""" size = (128, 128) img_path = get_image(folder=tmpdir, size=size) models.init_db(tmpdir.mkdir('db').join('iqdb.db').strpath, db_version) img, created = models.ImageModel.get_or_create_from_path(img_path) assert created assert img.width, img.height == size assert img.path == img_path assert img.checksum == \ '2a951983fcb673f586c698e4ff8c15d930dcc997f897e42aef77a09099673025'
def test_thumbnail_rel_get_or_create_existing_thumbnail(tmpdir): """Test method.""" img_path = get_image(folder=tmpdir, size=(300, 300)) models.init_db(tmpdir.mkdir('db').join('iqdb.db').strpath, db_version) img, _ = models.ImageModel.get_or_create_from_path(img_path) res1 = models.ThumbnailRelationship.get_or_create_from_image( img, size=(150, 150)) assert res1[1] res2 = models.ThumbnailRelationship.get_or_create_from_image( img, size=(150, 150)) assert not res2[1]
def test_thumbnail_rel_get_or_create_existing_thumbnail(tmpdir): """Test method.""" img_path = get_image(folder=tmpdir, size=(300, 300)) models.init_db(tmpdir.mkdir('db').join('iqdb.db').strpath, db_version) img, _ = models.ImageModel.get_or_create_from_path(img_path) res1 = models.ThumbnailRelationship.get_or_create_from_image(img, size=(150, 150)) assert res1[1] res2 = models.ThumbnailRelationship.get_or_create_from_image(img, size=(150, 150)) assert not res2[1]
def init_program(db_path=None): """Init program.""" # create user data dir if not os.path.isdir(user_data_dir): os.makedirs(user_data_dir, exist_ok=True) log.debug('User data dir created.') # create thumbnail folder if not os.path.isdir(thumb_folder): os.makedirs(thumb_folder, exist_ok=True) log.debug('Thumbnail folder created.') # database if db_path is None: db_path = default_db_path models.init_db(db_path, db_version)
def single_match_detail(pair_id): """Show single match pair.""" init_db() nocache = False entry = ImageMatchRelationship.get(ImageMatchRelationship.id == pair_id) match_result = entry.match_result mt_rel = MatchTagRelationship.select().where( MatchTagRelationship.match == match_result) tags = [x.tag.full_name for x in mt_rel] filtered_hosts = ['anime-pictures.net', 'www.theanimegallery.com'] if urlparse(match_result.link).netloc in filtered_hosts: log.debug( 'URL in filtered hosts, no tag fetched', url=match_result.link) elif not tags or nocache: try: tags = list(get_tags_from_match_result(match_result)) if not tags: log.debug('Tags not founds', id=pair_id) except requests.exceptions.ConnectionError as e: log.error(str(e), url=match_result.link) return render_template('single_match.html', entry=entry)
def index(page): """Get index page.""" if not os.path.isdir(user_data_dir): os.makedirs(user_data_dir, exist_ok=True) if request.method == 'POST': # check if the post request has the file part if 'file' not in request.files: flash('No file part') return redirect(request.url) file = request.files['file'] # if user does not select file, browser also # submit a empty part without filename if file.filename == '': flash('No selected file') return redirect(request.url) if file: upload_folder = gettempdir() filename = os.path.join( upload_folder, secure_filename(file.filename)) log.debug('file saved', p=filename) file.save(filename) else: flash('Error uploading file.') return redirect(request.url) size = None if 'resize' in request.args: resize = True resize_value = request.args.get('resize') if resize_value and 'x' in resize_value: resize_value_parts = resize_value.split('x') size = int(resize_value_parts[0]), (resize_value_parts[1]) else: resize = False init_db(default_db_path) posted_img = get_posted_image( img_path=filename, resize=resize, size=size) place = request.args.get('place', DEFAULT_PLACE) url, im_place = iqdb_url_dict[place] query = posted_img.imagematchrelationship_set \ .select().join(ImageMatch) \ .where(ImageMatch.search_place == im_place) if not query.exists(): try: result_page = get_page_result(image=posted_img.path, url=url) except requests.exceptions.ConnectionError as e: log.error(str(e)) flash('Connection error.') return redirect(request.url) list(ImageMatch.get_or_create_from_page( page=result_page, image=posted_img, place=im_place)) return redirect(url_for('match_sha256', checksum=posted_img.checksum)) init_db(default_db_path) item_per_page = 10 entries = ( ImageModel.select() .distinct() .join(ImageMatchRelationship) .where(ImageMatchRelationship.image) .order_by(ImageModel.id.desc()) ) paginated_entries = entries.paginate(page, item_per_page) if not entries.exists() and page != 1: abort(404) pagination = Pagination(page, item_per_page, entries.count()) return render_template( 'index.html', entries=paginated_entries, pagination=pagination)
def match_sha256(checksum): """Get image match the checksum.""" init_db() entry = ImageModel.get(ImageModel.checksum == checksum) return render_template('match.html', entry=entry)