コード例 #1
0
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
コード例 #2
0
    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
コード例 #3
0
    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')