Example #1
0
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
Example #2
0
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'
Example #3
0
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]
Example #4
0
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'
Example #5
0
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]
Example #6
0
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)
Example #7
0
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)
Example #8
0
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)
Example #9
0
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)
Example #10
0
def match_sha256(checksum):
    """Get image match the checksum."""
    init_db()
    entry = ImageModel.get(ImageModel.checksum == checksum)
    return render_template('match.html', entry=entry)