From 7d7e43c6f056ad3837de9009407dc13e389061aa Mon Sep 17 00:00:00 2001 From: Maveno Date: Sun, 6 Oct 2024 09:58:37 +0200 Subject: [PATCH] rework descriptors raw --- bin/ffx/model/track.py | 25 +----- bin/ffx/pattern_controller.py | 5 +- bin/ffx/pattern_details_screen.py | 122 ++++++++++++++++++------------ bin/ffx/track_controller.py | 32 ++------ bin/ffx/track_delete_screen.py | 32 ++++---- bin/ffx/track_descriptor.py | 2 +- bin/ffx/track_details_screen.py | 56 +++++--------- 7 files changed, 123 insertions(+), 151 deletions(-) diff --git a/bin/ffx/model/track.py b/bin/ffx/model/track.py index 7542f0e..4b25c47 100644 --- a/bin/ffx/model/track.py +++ b/bin/ffx/model/track.py @@ -11,6 +11,7 @@ from ffx.iso_language import IsoLanguage from ffx.track_disposition import TrackDisposition from ffx.track_descriptor import TrackDescriptor +import click class Track(Base): """ @@ -145,26 +146,6 @@ class Track(Base): return None -# def getDescriptor(self): -# -# descriptor = {} -# descriptor['id'] = int(self.id) -# descriptor['pattern_id'] = int(self.pattern_id) -# descriptor['type'] = TrackType(self.track_type) -# descriptor['sub_index'] = int(self.sub_index) -# -# descriptor['language'] = IsoLanguage.findThreeLetter(self.language) -# descriptor['title'] = str(self.title) -# -# descriptor['disposition_list'] = TrackDisposition.toList(self.disposition_flags) -# -# descriptor['tags'] = {} -# for t in self.track_tags: -# descriptor['tags'][str(t.key)] = str(t.value) -# -# return descriptor - - def getId(self): return int(self.id) @@ -172,7 +153,7 @@ class Track(Base): return int(self.pattern_id) def getType(self): - return TrackType(self.track_type) + return TrackType.fromIndex(self.track_type) def getSubIndex(self): return int(self.sub_index) @@ -189,4 +170,4 @@ class Track(Base): return TrackDisposition.toSet(self.disposition_flags) def getTags(self): - return {str(k.value):str(v.value) for (k,v) in self.track_tags} + return {str(t.key):str(t.value) for t in self.track_tags} diff --git a/bin/ffx/pattern_controller.py b/bin/ffx/pattern_controller.py index 77cbe0f..b668c82 100644 --- a/bin/ffx/pattern_controller.py +++ b/bin/ffx/pattern_controller.py @@ -79,7 +79,10 @@ class PatternController(): s.close() - def getPattern(self, patternId): + def getPattern(self, patternId : int): + + if type(patternId) is not int: + raise ValueError(f"PatternController.getPattern(): Argument patternId is required to be of type int") try: s = self.Session() diff --git a/bin/ffx/pattern_details_screen.py b/bin/ffx/pattern_details_screen.py index 018fc38..92f26fb 100644 --- a/bin/ffx/pattern_details_screen.py +++ b/bin/ffx/pattern_details_screen.py @@ -19,6 +19,7 @@ from .track_delete_screen import TrackDeleteScreen from ffx.track_type import TrackType from ffx.track_disposition import TrackDisposition +from ffx.track_descriptor import TrackDescriptor from textual.widgets._data_table import CellDoesNotExist @@ -79,7 +80,7 @@ class PatternDetailsScreen(Screen): self.__sc = ShowController(context = self.context) self.__tc = TrackController(context = self.context) - self.__pattern = self.__pc.getPattern(patternId) + self.__pattern = self.__pc.getPattern(patternId) if patternId is not None else None self.show_obj = self.__sc.getShowDesciptor(showId) if showId is not None else {} @@ -107,39 +108,43 @@ class PatternDetailsScreen(Screen): self.audioStreamsTable.clear() - audioTracks = self.__tc.findAudioTracks(self.__pattern.getId()) + if self.__pattern is not None: - for at in audioTracks: + audioTracks = self.__tc.findAudioTracks(self.__pattern.getId()) - dispoSet = at.getDispositionSet() + for at in audioTracks: - row = (at.getSubIndex(), - " ", - at.getLanguage().label(), - at.getTitle(), - 'Yes' if TrackDisposition.DEFAULT in dispoSet else 'No', - 'Yes' if TrackDisposition.FORCED in dispoSet else 'No') + dispoSet = at.getDispositionSet() - self.audioStreamsTable.add_row(*map(str, row)) + row = (at.getSubIndex(), + " ", + at.getLanguage().label(), + at.getTitle(), + 'Yes' if TrackDisposition.DEFAULT in dispoSet else 'No', + 'Yes' if TrackDisposition.FORCED in dispoSet else 'No') + + self.audioStreamsTable.add_row(*map(str, row)) def updateSubtitleTracks(self): self.subtitleStreamsTable.clear() - subtitleTracks = self.__tc.findSubtitleTracks(self.__pattern.getId()) + if self.__pattern is not None: - for st in subtitleTracks: + subtitleTracks = self.__tc.findSubtitleTracks(self.__pattern.getId()) - dispoSet = st.getDispositionSet() + for st in subtitleTracks: - row = (st.getSubIndex(), - " ", - st.getLanguage().label(), - st.getTitle(), - 'Yes' if TrackDisposition.DEFAULT in dispoSet else 'No', - 'Yes' if TrackDisposition.FORCED in dispoSet else 'No') + dispoSet = st.getDispositionSet() - self.subtitleStreamsTable.add_row(*map(str, row)) + row = (st.getSubIndex(), + " ", + st.getLanguage().label(), + st.getTitle(), + 'Yes' if TrackDisposition.DEFAULT in dispoSet else 'No', + 'Yes' if TrackDisposition.FORCED in dispoSet else 'No') + + self.subtitleStreamsTable.add_row(*map(str, row)) def on_mount(self): @@ -249,7 +254,7 @@ class PatternDetailsScreen(Screen): - def getSelectedAudioTrack(self): + def getSelectedAudioTrackDescriptor(self): if not self.__pattern: return None @@ -265,7 +270,18 @@ class PatternDetailsScreen(Screen): subIndex = int(selected_track_data[0]) - return self.__tc.findTrack(self.__pattern.getId(), TrackType.AUDIO, subIndex) + audioTrack = self.__tc.findTrack(self.__pattern.getId(), TrackType.AUDIO, subIndex) + + kwargs = {} + + kwargs[TrackDescriptor.PATTERN_ID_KEY] = self.__pattern.getId() + kwargs[TrackDescriptor.SUB_INDEX_KEY] = subIndex + + kwargs[TrackDescriptor.TRACK_TYPE_KEY] = TrackType.AUDIO + kwargs[TrackDescriptor.DISPOSITION_SET_KEY] = audioTrack.getDispositionSet() + kwargs[TrackDescriptor.TAGS_KEY] = audioTrack.getTags() + + return TrackDescriptor(**kwargs) else: return None @@ -274,7 +290,7 @@ class PatternDetailsScreen(Screen): return None - def getSelectedSubtitleTrack(self): + def getSelectedSubtitleTrackDescriptor(self): if not self.__pattern is None: return None @@ -290,7 +306,18 @@ class PatternDetailsScreen(Screen): subIndex = int(selected_track_data[0]) - return self.__tc.findTrack(self.__pattern.getId(), TrackType.SUBTITLE, subIndex) + subtitleTrack = self.__tc.findTrack(self.__pattern.getId(), TrackType.SUBTITLE, subIndex) + + kwargs = {} + + kwargs[TrackDescriptor.PATTERN_ID_KEY] = self.__pattern.getId() + kwargs[TrackDescriptor.SUB_INDEX_KEY] = subIndex + + kwargs[TrackDescriptor.TRACK_TYPE_KEY] = TrackType.SUBTITLE + kwargs[TrackDescriptor.DISPOSITION_SET_KEY] = subtitleTrack.getDispositionSet() + kwargs[TrackDescriptor.TAGS_KEY] = subtitleTrack.getTags() + + return TrackDescriptor(**kwargs) else: return None @@ -333,27 +360,26 @@ class PatternDetailsScreen(Screen): # Save pattern when just created before adding streams if self.__pattern is not None: - #self.pattern_obj - if event.button.id == "button_add_audio_stream": self.app.push_screen(TrackDetailsScreen(trackType = TrackType.AUDIO, patternId = self.__pattern.getId(), subIndex = len(self.audioStreamsTable.rows)), self.handle_add_track) - selectedAudioTrack = self.getSelectedAudioTrack() + selectedAudioTrack = self.getSelectedAudioTrackDescriptor() if selectedAudioTrack is not None: if event.button.id == "button_edit_audio_stream": - self.app.push_screen(TrackDetailsScreen(track = selectedAudioTrack), self.handle_edit_track) + + self.app.push_screen(TrackDetailsScreen(trackDescriptor = selectedAudioTrack), self.handle_edit_track) if event.button.id == "button_delete_audio_stream": - self.app.push_screen(TrackDeleteScreen(trackI= selectedAudioTrack), self.handle_delete_track) + self.app.push_screen(TrackDeleteScreen(trackDescriptor = selectedAudioTrack), self.handle_delete_track) if event.button.id == "button_add_subtitle_stream": self.app.push_screen(TrackDetailsScreen(trackType = TrackType.SUBTITLE, patternId = self.__pattern.getId(), subIndex = len(self.subtitleStreamsTable.rows)), self.handle_add_track) - selectedSubtitleTrack = self.getSelectedSubtitleTrack() + selectedSubtitleTrack = self.getSelectedSubtitleTrackDescriptor() if selectedSubtitleTrack is not None: if event.button.id == "button_edit_subtitle_stream": - self.app.push_screen(TrackDetailsScreen(track = selectedSubtitleTrack), self.handle_edit_track) + self.app.push_screen(TrackDetailsScreen(trackDescriptor = selectedSubtitleTrack), self.handle_edit_track) if event.button.id == "button_delete_subtitle_stream": - self.app.push_screen(TrackDeleteScreen(track = selectedSubtitleTrack), self.handle_delete_track) + self.app.push_screen(TrackDeleteScreen(trackDescriptor = selectedSubtitleTrack), self.handle_delete_track) if event.button.id == "patternbutton": @@ -398,38 +424,38 @@ class PatternDetailsScreen(Screen): self.subtitleStreamsTable.add_row(*map(str, row)) - def handle_edit_track(self, trackDescriptor): + def handle_edit_track(self, trackDescriptor : TrackDescriptor): - try: - if trackDescriptor['type'] == TrackType.AUDIO: + try: + if trackDescriptor.getType() == TrackType.AUDIO: row_key, col_key = self.audioStreamsTable.coordinate_to_cell_key(self.audioStreamsTable.cursor_coordinate) - self.audioStreamsTable.update_cell(row_key, self.column_key_audio_language, trackDescriptor['language'].label()) - self.audioStreamsTable.update_cell(row_key, self.column_key_audio_title, trackDescriptor['title']) - self.audioStreamsTable.update_cell(row_key, self.column_key_audio_default, 'Yes' if TrackDisposition.DEFAULT in trackDescriptor['disposition_list'] else 'No') - self.audioStreamsTable.update_cell(row_key, self.column_key_audio_forced, 'Yes' if TrackDisposition.FORCED in trackDescriptor['disposition_list'] else 'No') + self.audioStreamsTable.update_cell(row_key, self.column_key_audio_language, trackDescriptor.getLanguage().label()) + self.audioStreamsTable.update_cell(row_key, self.column_key_audio_title, trackDescriptor.getTitle()) + self.audioStreamsTable.update_cell(row_key, self.column_key_audio_default, 'Yes' if TrackDisposition.DEFAULT in trackDescriptor.getDispositionSet() else 'No') + self.audioStreamsTable.update_cell(row_key, self.column_key_audio_forced, 'Yes' if TrackDisposition.FORCED in trackDescriptor.getDispositionSet() else 'No') - if trackDescriptor['type'] == TrackType.SUBTITLE: + if trackDescriptor.getType() == TrackType.SUBTITLE: row_key, col_key = self.subtitleStreamsTable.coordinate_to_cell_key(self.subtitleStreamsTable.cursor_coordinate) - self.subtitleStreamsTable.update_cell(row_key, self.column_key_subtitle_language, trackDescriptor['language'].label()) - self.subtitleStreamsTable.update_cell(row_key, self.column_key_subtitle_title, trackDescriptor['title']) - self.subtitleStreamsTable.update_cell(row_key, self.column_key_subtitle_default, 'Yes' if TrackDisposition.DEFAULT in trackDescriptor['disposition_list'] else 'No') - self.subtitleStreamsTable.update_cell(row_key, self.column_key_subtitle_forced, 'Yes' if TrackDisposition.FORCED in trackDescriptor['disposition_list'] else 'No') + self.subtitleStreamsTable.update_cell(row_key, self.column_key_subtitle_language, trackDescriptor.getLanguage().label()) + self.subtitleStreamsTable.update_cell(row_key, self.column_key_subtitle_title, trackDescriptor.getTitle()) + self.subtitleStreamsTable.update_cell(row_key, self.column_key_subtitle_default, 'Yes' if TrackDisposition.DEFAULT in trackDescriptor.getDispositionSet() else 'No') + self.subtitleStreamsTable.update_cell(row_key, self.column_key_subtitle_forced, 'Yes' if TrackDisposition.FORCED in trackDescriptor.getDispositionSet() else 'No') except CellDoesNotExist: pass - def handle_delete_track(self, trackDescriptor): + def handle_delete_track(self, trackDescriptor : TrackDescriptor): try: - if trackDescriptor['type'] == TrackType.AUDIO: + if trackDescriptor.getType() == TrackType.AUDIO: self.updateAudioTracks() - if trackDescriptor['type'] == TrackType.SUBTITLE: + if trackDescriptor.getType() == TrackType.SUBTITLE: self.updateSubtitleTracks() except CellDoesNotExist: diff --git a/bin/ffx/track_controller.py b/bin/ffx/track_controller.py index 37e918f..eb59db9 100644 --- a/bin/ffx/track_controller.py +++ b/bin/ffx/track_controller.py @@ -126,11 +126,11 @@ class TrackController(): s.close() - def findTrack(self, patternId, trackType : TrackType, subIndex): + def findTrack(self, patternId : int, trackType : TrackType, subIndex : int): try: s = self.Session() - q = s.query(Track).filter(Track.pattern_id == int(patternId), Track.track_type == trackType.value, Track.sub_index == int(subIndex)) + q = s.query(Track).filter(Track.pattern_id == int(patternId), Track.track_type == trackType.index(), Track.sub_index == int(subIndex)) if q.count(): #track = q.first() @@ -144,26 +144,6 @@ class TrackController(): finally: s.close() - -# def getTrackDescriptor(self, trackId): -# -# try: -# s = self.Session() -# q = s.query(Track).filter(Track.id == int(trackId)) -# -# if q.count(): -# track = q.first() -# #return self.getTrackDict(track) -# return track.getDescriptor() -# else: -# return {} -# -# except Exception as ex: -# raise click.ClickException(f"TrackController.getTrackDescriptor(): {repr(ex)}") -# finally: -# s.close() - - def deleteTrack(self, trackId): try: s = self.Session() @@ -171,15 +151,15 @@ class TrackController(): if q.count(): - trackDescriptor = self.getTrackDict(q.first()) - + #trackDescriptor = self.getTrackDict(q.first()) + track = q.first() - q_siblings = s.query(Track).filter(Track.pattern_id == int(trackDescriptor['pattern_id']), Track.track_type == trackDescriptor['type'].value).order_by(Track.sub_index) + q_siblings = s.query(Track).filter(Track.pattern_id == track.getPatternId(), Track.track_type == track.getType().index()).order_by(Track.sub_index) subIndex = 0 for track in q_siblings.all(): - if track.sub_index == trackDescriptor['sub_index']: + if track.sub_index == track.getSubIndex(): s.delete(track) else: track.sub_index = subIndex diff --git a/bin/ffx/track_delete_screen.py b/bin/ffx/track_delete_screen.py index 988ebb7..da68e78 100644 --- a/bin/ffx/track_delete_screen.py +++ b/bin/ffx/track_delete_screen.py @@ -7,6 +7,7 @@ from textual.widgets import Header, Footer, Placeholder, Label, ListView, ListIt from textual.containers import Grid, Horizontal from ffx.model.pattern import Pattern +from ffx.track_descriptor import TrackDescriptor # from .show_controller import ShowController # from .pattern_controller import PatternController @@ -54,26 +55,26 @@ class TrackDeleteScreen(Screen): } """ - def __init__(self, trackId = None): + def __init__(self, trackDescriptor : TrackDescriptor): super().__init__() self.context = self.app.getContext() self.Session = self.context['database']['session'] # convenience - if trackId is None: - raise click.ClickException('TrackDeleteScreen.init(): trackId is required to be set') + if type(trackDescriptor) is not TrackDescriptor: + raise click.ClickException('TrackDeleteScreen.init(): trackDescriptor is required to be of type TrackDescriptor') self.__tc = TrackController(context = self.context) - self.track_obj = self.__tc.getTrackDescriptor(trackId) + self.__trackDescriptor = trackDescriptor def on_mount(self): - self.query_one("#subindexlabel", Static).update(str(self.track_obj['sub_index'])) - self.query_one("#patternlabel", Static).update(str(self.track_obj['pattern_id'])) - self.query_one("#languagelabel", Static).update(str(self.track_obj['language'].label())) - self.query_one("#titlelabel", Static).update(str(str(self.track_obj['title']))) + self.query_one("#subindexlabel", Static).update(str(self.__trackDescriptor.getSubIndex())) + self.query_one("#patternlabel", Static).update(str(self.__trackDescriptor.getPatternId())) + self.query_one("#languagelabel", Static).update(str(self.__trackDescriptor.getLanguage().label())) + self.query_one("#titlelabel", Static).update(str(str(self.__trackDescriptor.getTitle()))) def compose(self): @@ -83,7 +84,7 @@ class TrackDeleteScreen(Screen): with Grid(): #1 - yield Static(f"Are you sure to delete the following {self.track_obj['type'].label()} track?", id="toplabel", classes="four") + yield Static(f"Are you sure to delete the following {self.__trackDescriptor.getType().label()} track?", id="toplabel", classes="four") #2 yield Static("sub index") @@ -122,12 +123,15 @@ class TrackDeleteScreen(Screen): if event.button.id == "delete_button": - trackId = self.__tc.findTrack(self.track_obj['pattern_id'], self.track_obj['type'], self.track_obj['sub_index']) - - if trackId is not None: + track = self.__tc.findTrack(self.__trackDescriptor.getPatternId(), self.__trackDescriptor.getType(), self.__trackDescriptor.getSubIndex()) + + if track is None: + raise click.ClickException(f"Track is none: patternId={self.__trackDescriptor.getPatternId()} type={self.__trackDescriptor.getType()} subIndex={self.__trackDescriptor.getSubIndex()}") + + if track is not None: - if self.__tc.deleteTrack(trackId): - self.dismiss(self.track_obj) + if self.__tc.deleteTrack(track.getId()): + self.dismiss(self.__trackDescriptor) else: #TODO: Meldung diff --git a/bin/ffx/track_descriptor.py b/bin/ffx/track_descriptor.py index 14e0467..0962939 100644 --- a/bin/ffx/track_descriptor.py +++ b/bin/ffx/track_descriptor.py @@ -151,7 +151,7 @@ class TrackDescriptor(): if 'language' in self.__trackTags.keys(): return IsoLanguage.findThreeLetter(self.__trackTags['language']) else: - return IsoLanguage.UNKNOWN + return IsoLanguage.UNDEFINED def getTitle(self): if 'title' in self.__trackTags.keys(): diff --git a/bin/ffx/track_details_screen.py b/bin/ffx/track_details_screen.py index 8917a1f..06c0b7e 100644 --- a/bin/ffx/track_details_screen.py +++ b/bin/ffx/track_details_screen.py @@ -116,27 +116,6 @@ class TrackDetailsScreen(Screen): self.__trackDescriptor = trackDescriptor self.__pattern = self.__pc.getPattern(self.__trackDescriptor.getPatternId()) - # self.__trackDescriptor = trackDescriptor - # self.__trackType = 0 - # self.__subIndex = 0 - # self.__patternDescriptor = 0 - -# if self.track_obj: -# self.trackType = self.track_obj['type'] -# self.subIndex = self.track_obj['sub_index'] -# self.pattern_obj = self.__pc.getPatternDescriptor(self.track_obj['pattern_id']) -# self.track_obj['is_new'] = False -# else: -# self.trackType = trackType -# self.subIndex = subIndex -# self.pattern_obj = self.__pc.getPatternDescriptor(patternId) if patternId is not None else {} -# self.track_obj['is_new'] = True - -# if self.trackType is None: -# raise click.ClickException('Track type is required to be set') -# if self.subIndex is None: -# raise click.ClickException('Sub index for track is required to be set') - def on_mount(self): @@ -148,26 +127,20 @@ class TrackDetailsScreen(Screen): self.query_one("#subindexlabel", Static).update(str(self.__subIndex)) - if self.__trackDescriptor is not None: - for d in TrackDisposition: + for d in TrackDisposition: + + dispositionIsSet = (self.__trackDescriptor is not None + and d in self.__trackDescriptor.getDispositionSet()) - dispositionIsSet = (self.__trackDescriptor is not None - and d in self.__trackDescriptor.getDispositionSet()) + dispositionOption = (d.label(), d.index(), dispositionIsSet) + self.query_one("#dispositions_selection_list", SelectionList).add_option(dispositionOption) - dispositionOption = (d.label(), d.index(), dispositionIsSet) - self.query_one("#dispositions_selection_list", SelectionList).add_option(dispositionOption) + if self.__trackDescriptor is not None: self.query_one("#language_select", Select).value = self.__trackDescriptor.getLanguage().label() self.query_one("#title_input", Input).value = self.__trackDescriptor.getTitle() -# if 'language' in self.track_obj.keys(): -# self.query_one("#language_select", Select).value = self.track_obj['language'].label() -# -# if 'title' in self.track_obj.keys(): -# self.query_one("#title_input", Input).value = str(self.track_obj['title']) - - def compose(self): @@ -267,7 +240,16 @@ class TrackDetailsScreen(Screen): kwargs[TrackDescriptor.SUB_INDEX_KEY] = self.__subIndex kwargs[TrackDescriptor.TRACK_TYPE_KEY] = self.__trackType - kwargs[TrackDescriptor.TAGS_KEY] = {} + + trackTags = {} + language = self.query_one("#language_select", Select).value + # raise click.ClickException(f"language={language}") + if language: + trackTags['language'] = IsoLanguage.find(language).threeLetter() + title = self.query_one("#title_input", Input).value + if title: + trackTags['title'] = title + kwargs[TrackDescriptor.TAGS_KEY] = trackTags dispositionFlags = sum([2**f for f in self.query_one("#dispositions_selection_list", SelectionList).selected]) kwargs[TrackDescriptor.DISPOSITION_SET_KEY] = TrackDisposition.toSet(dispositionFlags) @@ -294,10 +276,6 @@ class TrackDetailsScreen(Screen): else: trackList = [] - # descriptorList = [d for d in (self.__tc.getTrackDescriptor(t) for t in trackList) - # if d['type'] == self.__trackType - # and d['sub_index'] != self.__subIndex] - siblingTrackList = [t for t in trackList if t.getType() == self.__trackType and t.getSubIndex() != self.__subIndex] numDefaultTracks = len([t for t in siblingTrackList if TrackDisposition.DEFAULT in t.getDispositionSet()])