Beispiel #1
0
def main(arg):
    # Initialize curses
    steps = 0
    curses.initscr()
    curses.echo()
    curses.start_color()
    curses.init_pair(1, curses.COLOR_GREEN, curses.COLOR_BLACK)
    # Create the window
    rows, columns = get_winsize()
    win = curses.newwin(rows, columns, 0, 0)
    win.bkgdset(curses.color_pair(1))
    if USE_COLORS:
        curses.init_pair(COLOR_CHAR_NORMAL, curses.COLOR_GREEN, curses.COLOR_BLACK)
        curses.init_pair(COLOR_CHAR_HIGHLIGHT, curses.COLOR_WHITE, curses.COLOR_GREEN)
    win.refresh()

    usr = curses_raw_input(win, 0, 0, "username: "******"password: "******"Loading simulation..."
    win.addstr(rows/2, columns/2 - len(loading_string)/2, loading_string)
    win.refresh()
    bot = Oracle(login=usr, password=pw)
    win.erase()
    urls = bot.get_images()
    max_images = len(urls)
    highest_loaded = 3
    bot.save_images(urls[:highest_loaded], 0)
    files = os.listdir('oracle/cache')
    lines = []
    for i in range(DROPPING_CHARS):
        l = FallingChar(columns, MIN_SPEED, MAX_SPEED)
        l.y = randint(0, rows-2)
        lines.append(l)
    win.refresh()

    # Get the initial compression_factor
    img = numpy.array(Image.open('oracle/cache/' + files[0]))
    compression_factor = max(len(img)/rows, len(img[0])/columns)
    compression_factor_x = compression_factor
    row_compressed = compression_factor == len(img)/rows
    if row_compressed:
        compression_factor_x = 2 * compression_factor_x / 3
        if len(img[0]) / compression_factor_x > columns:
            compression_factor_x = len(img[0]) / columns

    # Function for drawing the image as characters
    def draw(img):
        for col in range(output_cols):
            for row in range(output_rows):
                if curses.is_term_resized(rows, columns):
                    return
                try:
                    pixel = img[row * compression_factor][col * compression_factor_x]
                    char = pixel_to_char(pixel)
                    win.addch(row + padding_rows, col + padding_cols, char)
                    win.refresh()
                except:
                    # win.addch() causes an exception if we try to draw beyond
                    # the boundaries of the window. We can just ignore it.
                    pass

    # Loop forever, handling terminal resizes
    i = 0
    while True:
        if(i == max_images - 1):
            msg = "Signal terminated."
            win.addstr(rows/2, columns/2 - len(msg)/2, msg)
            padding_rows = rows/2
            padding_cols = columns/2 - len(msg)/2
            output_rows = 1
            output_cols = len(msg)
            win.refresh()
        else:
            img = Image.open('oracle/cache/' + files[i])
            img = numpy.array(img)
            if curses.is_term_resized(rows, columns):
                rows, columns = get_winsize()
                win = curses.newwin(rows, columns, 0, 0)
                win.bkgdset(curses.color_pair(1))
            compression_factor = max(len(img)/rows, len(img[0])/columns)
            compression_factor_x = compression_factor
            row_compressed = compression_factor == len(img)/rows
            if row_compressed:
                compression_factor_x = 2 * compression_factor_x / 3
                if len(img[0]) / compression_factor_x > columns:
                    compression_factor_x = len(img[0]) / columns
            output_rows = len(img)/compression_factor
            output_cols = len(img[0])/compression_factor_x
            padding_rows = (rows - output_rows) / 2
            padding_cols = (columns - output_cols) / 2
            draw(cv2.cvtColor(img, cv2.COLOR_BGR2GRAY))
        if(highest_loaded < max_images):
            bot.save_images(urls[highest_loaded:highest_loaded+1], highest_loaded)
            highest_loaded += 1
            files = os.listdir('oracle/cache')
        inp = ''
        repeat = True
        while(repeat):
            time.sleep(SLEEP_MILLIS)
            inp = win.getch()
            if inp == ord('j'):
                if i < highest_loaded - 1:
                    i += 1
                    repeat = False
            elif inp == ord('k'):
                if i > 0:
                    i -= 1
                    repeat = False
            for line in lines:
                line.tick(win, steps, padding_rows, padding_cols, output_rows, output_cols)
            for _ in range(RANDOM_CLEANUP):
                x = randint(0, columns-1)
                y = randint(0, rows-1)
                if not (y > padding_rows and y < padding_rows + output_rows
                        and x > padding_cols and x < padding_cols + output_cols):
                    win.addstr(y, x, ' ')
            steps += 1
            if(i == max_images - 1):
                msg = "Signal terminated."
                win.addstr(rows/2, columns/2 - len(msg)/2, msg)
            win.refresh()