tidied up the exsting code, added data objects and special helper classes

This commit is contained in:
Tim Caldwell
2017-09-01 21:50:12 +12:00
parent 9bdb02a3e9
commit 053bde35f6
8 changed files with 2854 additions and 179 deletions

View File

@@ -1,37 +1,52 @@
import json
import logging
from collections import OrderedDict
import os
from random import randint
#TODO : standise the paths to things, use constants for file names, standise the naming convention of files
import time
import inspect
PATH_TO_BROWSER = 'C:/TestFolderStucture'
######## sets names for the persistant data objects ########
NEXT_BANK_JSON = 'next_bank_number.json'
SETTINGS_JSON = 'settings.json'
BANK_DATA_JSON = 'display_data.json'
PATH_TO_DATA_OBJECTS = 'C:/Users/Tim/PycharmProjects/videoLooper/'
######## define how to get path to current dir and set up logging ########
def get_the_current_dir_path():
#TODO: investigate weird path formatting differences
current_file_path = inspect.stack()[0][1]
return os.path.split(current_file_path)[0] + '/'
def setup_logging():
logger = logging.getLogger('logfile')
current_dir = get_the_current_dir_path()
hdlr = logging.FileHandler(current_dir + 'logfile.log')
formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s')
hdlr.setFormatter(formatter)
logger.addHandler(hdlr)
logger.setLevel(logging.INFO)
return logger
logger = setup_logging()
######## sets paths and constants ########
PATH_TO_BROWSER = 'C:\TestFolderStucture' #TODO replace this with pi path name when i know what makes sense
PATH_TO_DATA_OBJECTS = get_the_current_dir_path()
EMPTY_BANK = dict(name='',location='',length=-1,start=-1,end=-1)
logger = logging.getLogger('myapp')
hdlr = logging.FileHandler('C:/Users/Tim/PycharmProjects/videoLooper/myapp.log')
formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s')
hdlr.setFormatter(formatter)
logger.addHandler(hdlr)
logger.setLevel(logging.INFO)
####<<<< data methods for browser tab >>>>#####
class data(object):
######## a data class used mainly for managing the browser list ########
def __init__(self):
self._open_folders = []
self._browser_list = []
def rewrite_browser_list(self):
self._browser_list = generate_browser_list(PATH_TO_BROWSER, 0, self._open_folders)
def get_browser_data_for_display(self):
######## map the browser_list to format for displaying in asciimatics ########
if not self._browser_list:
self.rewrite_browser_list()
@@ -48,34 +63,13 @@ class data(object):
self._open_folders.remove(folder_name)
def get_all_looper_data_for_display():
memory_bank = read_json('DisplayData.json')
loop_data = []
for index, bank in enumerate(memory_bank):
length = convert_int_to_string_for_display(bank["length"])
start = convert_int_to_string_for_display(bank["start"])
end = convert_int_to_string_for_display(bank["end"])
loop_data.append(([str(index),bank["name"],length,start,end],index))
return loop_data
def is_file_in_memory_bank(file_name, memory_bank=[]):
if not memory_bank:
memory_bank = read_json('DisplayData.json')
for index, bank in enumerate(memory_bank):
if(file_name == bank['name']):
return True , index
return False, ''
def generate_browser_list(current_path, current_level, open_folder_list):
def generate_browser_list(initial_path, current_level, open_folder_list):
######## starts the recursive process of listing all folders and video files to display ########
global results
results = []
add_folder_to_browser_list(initial_path, current_level,open_folder_list)
add_folder_to_browser_list(current_path, current_level,open_folder_list)
memory_bank = read_json('DisplayData.json')
memory_bank = read_json(BANK_DATA_JSON)
for browser_line in results:
is_file, file_name = extract_file_type_and_name_from_browser_format(browser_line['name'])
@@ -87,6 +81,8 @@ def generate_browser_list(current_path, current_level, open_folder_list):
return results
def add_folder_to_browser_list(current_path, current_level,open_folder_list):
######## adds the folders and mp4 files at the current level to the results list. recursively recalls at deeper level if folder is open ########
#TODO make note of / investigate what happens with multiple folders of same name
root, dirs, files = next(os.walk(current_path))
indent = ' ' * 4 * (current_level)
@@ -105,24 +101,33 @@ def add_folder_to_browser_list(current_path, current_level,open_folder_list):
results.append(dict(name='{}{}'.format(indent, f), bank='-'))
def check_folder_state(folder_name,open_folder_list):
######## used for displaying folders as open or closed ########
if (folder_name in open_folder_list):
return True, '/'
else:
return False, '|'
def extract_file_type_and_name_from_browser_format(dir_name):
#logger.info('the name we got was {}'.format(dir_name))
######## removes whitespace and folder state from display item ########
if(dir_name.endswith('|') or dir_name.endswith('/')):
return False , dir_name.lstrip()[:-1]
else:
return True , dir_name.lstrip()
def get_length_for_file(location):
#TODO: will have omx.player get length of file probs..
pass
def is_file_in_memory_bank(file_name, memory_bank=[]):
######## used for displaying the mappings in browser view ########
if not memory_bank:
memory_bank = read_json(BANK_DATA_JSON)
for index, bank in enumerate(memory_bank):
if(file_name == bank['name']):
return True , index
return False, ''
####<<<< responding to user input in browser tab >>>>#####
def create_new_bank_mapping_in_first_open(file_name):
memory_bank = read_json('DisplayData.json')
######## used for mapping current video to next available bank ########
memory_bank = read_json(BANK_DATA_JSON)
for index , bank in enumerate(memory_bank):
if(not bank['name']):
create_new_bank_mapping(index,file_name,memory_bank)
@@ -130,12 +135,18 @@ def create_new_bank_mapping_in_first_open(file_name):
return False
def create_new_bank_mapping(bank_number,file_name,memory_bank=[]):
######## used for mapping current video to a specific bank ########
has_location , location = get_path_for_file(file_name)
length = get_length_for_file(location)
new_bank = dict(name=file_name, location=location, length=-1, start=-1, end=-1)
update_a_banks_data(bank_number, new_bank, memory_bank)
def get_length_for_file(location):
#TODO: will have omx.player get length of file probs..
pass
def get_path_for_file(file_name):
######## returns full path for a given file name ########
for root, dirs, files in os.walk(PATH_TO_BROWSER):
if file_name in files:
print root
@@ -144,50 +155,54 @@ def get_path_for_file(file_name):
return False, ''
def update_a_banks_data(bank_number, bank_info, memory_bank=[]):
######## overwrite a given banks info with new data ########
if not memory_bank:
memory_bank = read_json('DisplayData.json')
memory_bank = read_json(BANK_DATA_JSON)
memory_bank[bank_number] = bank_info
update_json('DisplayData.json', memory_bank)
update_json(BANK_DATA_JSON, memory_bank)
def clear_all_banks():
memory_bank = read_json('DisplayData.json')
for index , bank in enumerate(memory_bank):
memory_bank = read_json(BANK_DATA_JSON)
for index, bank in enumerate(memory_bank):
memory_bank[index] = EMPTY_BANK
update_json('DisplayData.json', memory_bank)
update_json(BANK_DATA_JSON, memory_bank)
def read_json(file_name):
####<<<< data methods for looper tab >>>>#####
with open(PATH_TO_DATA_OBJECTS + file_name) as data_file:
data = json.load(data_file)
def get_all_looper_data_for_display():
######## read bank mappings from data object and format for displaying in asciimatics ########
memory_bank = read_json(BANK_DATA_JSON)
loop_data = []
for index, bank in enumerate(memory_bank):
length = convert_int_to_string_for_display(bank["length"])
start = convert_int_to_string_for_display(bank["start"])
end = convert_int_to_string_for_display(bank["end"])
loop_data.append(([str(index),bank["name"],length,start,end],index))
return data
return loop_data
def update_json(file_name,data):
with open('{}{}'.format(PATH_TO_DATA_OBJECTS, file_name), 'w') as data_file:
json.dump(data, data_file)
####<<<< data methods for looper tab >>>>#####
def get_all_settings_data_for_display():
settings = read_json('Settings.json')
######## read settings from data object and format for displaying in asciimatics ########
settings = read_json(SETTINGS_JSON)
display_settings = []
for index, setting in enumerate(settings):
display_settings.append(([setting['name'],setting['value']],index))
return display_settings
def get_a_banks_data(bank_number):
memory_bank = read_json('DisplayData.json')
return memory_bank[bank_number]
def switch_settings(setting_name):
settings = read_json('Settings.json')
######## update the value of selected setting by cycling through valid options ########
settings = read_json(SETTINGS_JSON)
for index, setting in enumerate(settings):
if setting['name'] == setting_name:
setting = cycle_setting_value(setting)
update_json('Settings.json',settings)
update_json(SETTINGS_JSON,settings)
def cycle_setting_value(setting):
######## contains the valid setting values for each applicable option ########
if setting['name'] == 'PLAYBACK_MODE':
if setting['value'] == 'LOOPER':
setting['value'] = 'PLAYLIST'
@@ -213,17 +228,18 @@ def cycle_setting_value(setting):
return setting
####<<<< data methods for video_centre >>>>#####
def get_next_context():
next_bank_number = read_json('next_bank_number.json')
memory_bank = read_json('DisplayData.json')
######## loads the bank details, uses settings to modify them and then set next bank number ########
next_bank_number = read_json(NEXT_BANK_JSON)
memory_bank = read_json(BANK_DATA_JSON)
next_bank_details = memory_bank[next_bank_number]
start_value = next_bank_details['start']
end_value = next_bank_details['end']
length = next_bank_details['length']
use_rand_start, use_sync_length, sync_length, playback_mode = get_context_options_from_settings()
set_next_bank_number_from_playback_mode(playback_mode,next_bank_number)
if use_rand_start and use_sync_length:
start_value = randint(0, length - sync_length)
@@ -233,10 +249,14 @@ def get_next_context():
elif not use_rand_start and use_sync_length:
end_value = min(length, start_value + sync_length)
set_next_bank_number_from_playback_mode(playback_mode, next_bank_number)
context = dict(location=next_bank_details['location'],start=start_value,end=end_value, bank_number=next_bank_number)
return context
def get_context_options_from_settings():
settings = read_json('Settings.json')
######## looks up the settings data object and returns states of relevant options ########
settings = read_json(SETTINGS_JSON)
use_sync_length = False
sync_length = 0
use_rand_start = False
@@ -255,6 +275,7 @@ def get_context_options_from_settings():
return use_rand_start , use_sync_length , sync_length , playback_mode
def set_next_bank_number_from_playback_mode(playback_mode, current_bank_number):
######## sets next bank number by using playback mode logic ########
next_bank_number = 0
if playback_mode == 'LOOPER':
next_bank_number = current_bank_number
@@ -266,10 +287,21 @@ def set_next_bank_number_from_playback_mode(playback_mode, current_bank_number):
next_bank_number = current_bank_number
update_json('next_bank_number.json',next_bank_number)
####<<<< generic methods for all tabs >>>>#####
def read_json(file_name):
with open(PATH_TO_DATA_OBJECTS + file_name) as data_file:
data = json.load(data_file)
return data
def update_json(file_name,data):
with open('{}{}'.format(PATH_TO_DATA_OBJECTS, file_name), 'w') as data_file:
json.dump(data, data_file)
def convert_int_to_string_for_display(time_in_seconds):
if time_in_seconds < 0:
return ''
elif time_in_seconds >= 6000:
return '99:99'
else:
return time.strftime("%M:%S", time.gmtime(time_in_seconds))
return time.strftime("%M:%S", time.gmtime(time_in_seconds))