def test_add_new_fields(mocker): mock_config_load = mocker.patch('lib.config.Config.load') mock_config_load.side_effect = [{ 'allowed_ext': ['ppt', 'pdf'] }, { 'subjectName': { 'long_subject_name': 'short_name' } }] metadata_given = { 'ttid': '123', 'seqNo': 5, 'views': 234, 'actualDuration': 7260, 'sessionId': 987, 'startTime': '2021-01-31 09:00:05', 'endTime': '2021-01-31 11:05:05', 'subjectName': 'long_subject_name', } metadata_processed = { 'ttid': '123', 'seqNo': '05', # 2 digit fixed width string 'views': '0234', # 4 digit fixed width string 'actualDuration': '07260', # 5 digit fixed width string 'actualDurationReadable': '2:01h', # from actualDuration field 'sessionId': '0987', # 4 digit fixed width string. 'startTime': '2021-01-31 09:00:05', 'startDate': '2021-01-31', # computed from startTime 'endTime': '2021-01-31 11:05:05', 'endDate': '2021-01-31', # computed from endTime 'subjectName': 'long_subject_name', 'subjectNameShort': 'short_name', # from subjectName mapping 'ext': 'pdf' # since {'ttid': 123} has a associated attachment as: /foo/bar/baz.pdf } video_slide_mapping = { '123': '/foo/bar/baz.pdf', '456': '/foobaz/bar.pptx', '789': '/bazbar/foo.docx', # ... } from lib.utils import Utils assert Utils.add_new_fields(metadata_given, video_slide_mapping) == metadata_processed
def auto_organize(self): self.toolbar.auto_organize_button.config(state='disabled') self.menubar.actions_menu.entryconfig(Labels.AUTO_ORGANIZE, state='disabled') moved_files = dict() conf = Config.load(ConfigType.IMPARTUS) for subject_id, videos in self.videos.items(): for ttid, video_metadata in videos.items(): video_metadata = Utils.add_new_fields(video_metadata, self.video_slide_mapping) # for videos expected_video_path = self.impartus.get_mkv_path( video_metadata) real_video_path = self.offline_video_ttid_mapping.get( str(ttid)) if real_video_path and \ pathlib.PurePath(expected_video_path) != pathlib.PurePath(real_video_path) \ and os.path.exists(real_video_path): Utils.move_and_rename_file(real_video_path, expected_video_path) self.logger.info('moved {} -> {}'.format( real_video_path, expected_video_path)) moved_files[real_video_path] = expected_video_path # also update the offline_video_ttid_mapping self.offline_video_ttid_mapping[str( ttid)] = expected_video_path # also check any slides. for ext in conf.get('allowed_ext'): slides_path = '{}.{}'.format( real_video_path[:-len(".mkv")], ext) if os.path.exists(slides_path): expected_slides_path = '{}.{}'.format( expected_video_path[:-len(".mkv")], ext) Utils.move_and_rename_file(slides_path, expected_slides_path) self.logger.info('moved {} -> {}'.format( slides_path, expected_slides_path)) moved_files[slides_path] = expected_slides_path # is the folder empty, remove it.? [also any empty parent folders] old_video_dir = os.path.dirname(real_video_path) sys_name = platform.system() if conf.get('ignore_files').get(sys_name): ignore_files = conf.get('ignore_files')[sys_name] else: ignore_files = [] while True: dir_files = [ x for x in os.listdir(old_video_dir) if x not in ignore_files ] if len(dir_files) > 0: break for file in ignore_files: filepath = os.path.join(old_video_dir, file) if os.path.exists(filepath): os.unlink(filepath) os.rmdir(old_video_dir) self.logger.info('removed empty directory: {}'.format( old_video_dir)) # parent path. old_video_dir = Path(old_video_dir).parent.absolute() # captions expected_captions_path = self.impartus.get_captions_path( video_metadata) if not os.path.exists(expected_captions_path): if self.save_captions_if_needed(video_metadata, self.login.url_box.get(), expected_captions_path): self.logger.info('downloaded captions: {}'.format( expected_captions_path)) self.all_captions_found = True if len(moved_files) > 0: self.auto_organize_dialog(moved_files) self.expected_real_paths_differ = False
def fill_content(self): # A mapping dict containing previously downloaded, and possibly moved around / renamed videos. # extract their ttid and map those to the correct records, to avoid forcing the user to re-download. self.offline_video_ttid_mapping = self.impartus.get_mkv_ttid_map() row = 0 sheet_rows = list() for subject_id, videos in self.videos.items(): for ttid, video_metadata in videos.items(): video_metadata = Utils.add_new_fields(video_metadata, self.video_slide_mapping) video_path = self.impartus.get_mkv_path(video_metadata) if not os.path.exists(video_path): # or search from the downloaded videos, using video_ttid_map video_path_moved = self.offline_video_ttid_mapping.get( str(ttid)) if video_path_moved: # For now, use the offline path if a video found. Also set the flag to enable move/rename button video_path = video_path_moved self.expected_real_paths_differ = True captions_path = self.impartus.get_captions_path(video_metadata) if not os.path.exists(captions_path): self.all_captions_found = False slides_path = self.impartus.get_slides_path(video_metadata) video_exists_on_disk = video_path and os.path.exists( video_path) slides_exist_on_server = self.video_slide_mapping.get(ttid) slides_exist_on_disk, slides_path = self.impartus.slides_exist_on_disk( slides_path) metadata = { 'video_metadata': video_metadata, 'video_path': video_path, 'video_exists_on_disk': video_exists_on_disk, 'slides_exist_on_server': slides_exist_on_server, 'slides_exist_on_disk': slides_exist_on_disk, 'slides_url': self.video_slide_mapping.get(ttid), 'slides_path': slides_path, 'captions_path': captions_path, } row_items = list() button_states = list() # data items for col, (key, item) in enumerate(Columns.all_columns.items()): text = '' if item['type'] == 'data': text = video_metadata[key] # title case if item.get('title_case'): text = " ".join(text.splitlines()).strip().title() elif item['type'] == 'auto': text = row elif item['type'] == 'progressbar': if video_exists_on_disk: text = self.progress_bar_text(100, processed=True) else: text = self.progress_bar_text(0) elif item['type'] == 'button': button_states.append( self.get_button_state(key, video_exists_on_disk, slides_exist_on_server, slides_exist_on_disk)) text = item.get('text') elif item['type'] == 'button_state': text = button_states.pop(0) elif item['type'] == 'metadata': text = metadata elif item['type'] == 'original_value': text = video_metadata[key] row_items.append(text) row += 1 sheet_rows.append(row_items) self._init_content() self.sheet.insert_rows(sheet_rows, idx='end') self.reset_column_sizes() self.decorate() # update button status self.set_button_status(redraw=True) self.sheet.grid(row=0, column=0, sticky='nsew')