def setup_project(): if DBProcessState.is_thread_alive(): flash(f'{flash_err} Stop the current action before making a new ' f'project') return redirect(url_for('records.index')) path = get_project_dir_path_from_cookie() return render_template('new_project.html', path=path)
def update_history_chart(value): db_path = join(get_project_dir_path_from_cookie(), DB_NAME) decl_types = sqlite3.PARSE_DECLTYPES decl_colnames = sqlite3.PARSE_COLNAMES conn = sqlite_connection(db_path, detect_types=decl_types | decl_colnames) data = history_chart.retrieve_watch_data(conn, date_periods_vals[value]) conn.close() return construct_history_chart(data), 'Videos opened/watched'
def db_has_records(): db_path = join(get_project_dir_path_from_cookie(), DB_NAME) if os.path.exists(db_path): conn = sqlite_connection(db_path) cur = conn.cursor() try: cur.execute("SELECT 'id' FROM videos") total_records = len(cur.fetchall()) if total_records: return True cur.close() except sqlite3.OperationalError: return finally: conn.close()
def index(): project_path = get_project_dir_path_from_cookie() if not project_path: return redirect(url_for('project.setup_project')) elif not os.path.exists(project_path): flash(f'{flash_err} could not find directory {strong(project_path)}') return redirect(url_for('project.setup_project')) if not ProjectState.logger: ProjectState.logger = logging_config(join(project_path, 'events.log')) # projects (directories) were changed, changing the log file accordingly if project_path != ProjectState.cur_dir: for i in ProjectState.logger.handlers: if isinstance(i, handlers.RotatingFileHandler): i.stream.close() # closing currently open file i.stream = open(join(project_path, 'events.log'), 'a') ProjectState.cur_dir = project_path if DBProcessState.active_event_stream is None: DBProcessState.active_event_stream = True else: # event_stream() will set this back to True after disengaging DBProcessState.active_event_stream = False # default values for forms, set when the user first submits a form logging_verbosity = request.cookies.get(logging_verbosity_cookie) takeout_dir = request.cookies.get(takeout_dir_cookie) cutoff_time = request.cookies.get(cutoff_value_cookie) cutoff_denomination = request.cookies.get(cutoff_denomination_cookie) db = db_has_records() if not request.cookies.get('description-seen'): resp = make_response( render_template('index.html', path=project_path, description=True, db=db)) resp.set_cookie('description-seen', 'True', max_age=31_536_000) return resp return render_template('index.html', path=project_path, db=db, logging_verbosity=logging_verbosity, takeout_dir=takeout_dir, cutoff_time=cutoff_time, cutoff_denomination=cutoff_denomination)
def open_current_project_dir(): run_args = [get_project_dir_path_from_cookie()] try: if sys.platform == 'win32': os.startfile(run_args[0]) return '' elif sys.platform == 'linux': run_args.insert(0, 'xdg-open') elif sys.platform == 'darwin': run_args.insert(0, 'open') else: return '' subprocess.run(run_args) except OSError: pass return ''
def update_v_scatter(x_axis_type: str, y_axis_type: str, views: list, num_of_records: int): if not x_axis_type or not y_axis_type: return None num_of_records = v_scatter_slider_recs_nums[num_of_records] min_views = v_scatter_view_range_nums[views[0]] max_views = v_scatter_view_range_nums[views[1]] db_path = join(get_project_dir_path_from_cookie(), DB_NAME) conn = sqlite_connection(db_path) data = videos_scatter_graph.get_data(conn, x_axis_type, y_axis_type, min_views=min_views, max_views=max_views, number_of_records=num_of_records) conn.close() if x_axis_type in ['LikeRatioAsc', 'LikeRatioDesc']: x_axis_type = 'Ratio' return construct_v_scatter(data, x_axis_type, y_axis_type)
def history_chart_date_summary(data, date_period): if data: date = data['points'][0]['x'] if data['points'][0]['y'] == 0: return f'No videos for the period of {date}' if date_period == 0: date = date[:4] elif date_period == 1: date = date[:7] elif date_period == 2: date = date[:10] else: date = date[:13] db_path = join(get_project_dir_path_from_cookie(), DB_NAME) conn = sqlite_connection(db_path) summary_tables = history_chart.make_summary_tables_for_time_period( conn, date) conn.close() return [*summary_tables] else: return history_date_period_summary_msg
def start_db_process(): resp = make_response('') if DBProcessState.is_thread_alive(): return DBProcessState.live_thread_warning logging_verbosity = request.form.get('logging-verbosity-level') resp.set_cookie(logging_verbosity_cookie, logging_verbosity, max_age=31_536_000) logging_verbosity = int(logging_verbosity) takeout_path = request.form.get('takeout-dir') project_path = get_project_dir_path_from_cookie() if takeout_path: takeout_dir = os.path.expanduser(takeout_path.strip()) if os.path.exists(takeout_dir): resp.set_cookie(takeout_dir_cookie, takeout_dir, max_age=31_536_000) args = (takeout_dir, project_path, logging_verbosity) target = populate_db else: cutoff_time = request.form.get('update-cutoff') cutoff_denomination = request.form.get('update-cutoff-denomination') resp.set_cookie(cutoff_value_cookie, cutoff_time, max_age=31_536_000) resp.set_cookie(cutoff_denomination_cookie, cutoff_denomination, max_age=31_536_000) cutoff = int(cutoff_time) * int(cutoff_denomination) args = (project_path, cutoff, logging_verbosity) target = update_db DBProcessState.thread = Thread(target=target, args=args) DBProcessState.thread.start() return resp