From 9fee9d1ae4f6f6f89f2f6e7a56d6c9a13a211cc5 Mon Sep 17 00:00:00 2001 From: Javanaut Date: Wed, 16 Oct 2024 11:53:17 +0200 Subject: [PATCH] Inspect from Scratch -> RC --- bin/ffx/media_descriptor.py | 4 +- bin/ffx/media_details_screen.py | 105 ++++++++++++++++++++++++++------ bin/ffx/pattern_controller.py | 2 +- bin/ffx/show_controller.py | 2 +- bin/ffx/shows_screen.py | 8 +-- 5 files changed, 93 insertions(+), 28 deletions(-) diff --git a/bin/ffx/media_descriptor.py b/bin/ffx/media_descriptor.py index 8bbefb0..21d442e 100644 --- a/bin/ffx/media_descriptor.py +++ b/bin/ffx/media_descriptor.py @@ -61,7 +61,7 @@ class MediaDescriptor(): self.__jellyfinOrder = False - def __getReorderedTrackDescriptors(self): + def getReorderedTrackDescriptors(self): videoTracks = [v for v in self.__trackDescriptors.copy() if v.getType() == TrackType.VIDEO] audioTracks = [a for a in self.__trackDescriptors.copy() if a.getType() == TrackType.AUDIO] @@ -168,7 +168,7 @@ class MediaDescriptor(): # Target track configuration (from DB) #tracks = self.getAllTracks() - tracks = self.__getReorderedTrackDescriptors() + tracks = self.getReorderedTrackDescriptors() numTracks = len(tracks) # Current track configuration (of file) diff --git a/bin/ffx/media_details_screen.py b/bin/ffx/media_details_screen.py index 72fa1e0..53438bd 100644 --- a/bin/ffx/media_details_screen.py +++ b/bin/ffx/media_details_screen.py @@ -16,6 +16,7 @@ from .tag_controller import TagController from .track_details_screen import TrackDetailsScreen from .track_delete_screen import TrackDeleteScreen +from .show_details_screen import ShowDetailsScreen from ffx.track_type import TrackType from ffx.model.track import Track @@ -244,7 +245,6 @@ class MediaDetailsScreen(Screen): row = (' ', '', ' ') # Convert each element to a string before adding self.showsTable.add_row(*map(str, row)) - #TODO: Stürzt ab wenn keine Shows vorhanden sind. Onthefly Show add impl for show in self.__sc.getAllShows(): row = (int(show.id), show.name, show.year) # Convert each element to a string before adding self.showsTable.add_row(*map(str, row)) @@ -270,9 +270,13 @@ class MediaDetailsScreen(Screen): else: self.query_one("#pattern_input", Input).value = self.__mediaFilename - self.query_one("#pattern_input", Input).styles.background = 'red' - + self.highlightPattern(True) + def highlightPattern(self, state : bool): + if state: + self.query_one("#pattern_input", Input).styles.background = 'red' + else: + self.query_one("#pattern_input", Input).styles.background = None def updateTracks(self): @@ -363,7 +367,7 @@ class MediaDetailsScreen(Screen): # 2 yield Static(" ") - yield Button("Substitute") + yield Button("Substitute", id="pattern_button") yield Static(" ") # 3 @@ -454,8 +458,8 @@ class MediaDetailsScreen(Screen): yield Footer() -# def getPatternFromInput(self): -# return str(self.query_one("#pattern_input", Input).value) + def getPatternFromInput(self): + return str(self.query_one("#pattern_input", Input).value) @@ -512,7 +516,6 @@ class MediaDetailsScreen(Screen): # Event handler for button press def on_button_pressed(self, event: Button.Pressed) -> None: - pass # # Check if the button pressed is the one we are interested in # if event.button.id == "save_button": @@ -565,17 +568,17 @@ class MediaDetailsScreen(Screen): # self.app.push_screen(TrackDetailsScreen(trackDescriptor = selectedSubtitleTrack), self.handle_edit_track) # if event.button.id == "button_delete_subtitle_stream": # self.app.push_screen(TrackDeleteScreen(trackDescriptor = selectedSubtitleTrack), self.handle_delete_track) -# -# if event.button.id == "patternbutton": -# -# INDICATOR_PATTERN = '([sS][0-9]+[eE][0-9]+)' -# -# pattern = self.query_one("#pattern_input", Input).value -# -# patternMatch = re.search(INDICATOR_PATTERN, pattern) -# -# if patternMatch: -# self.query_one("#pattern_input", Input).value = pattern.replace(patternMatch.group(1), INDICATOR_PATTERN) + + if event.button.id == "pattern_button": + + INDICATOR_PATTERN = '([sS][0-9]+[eE][0-9]+)' + + pattern = self.query_one("#pattern_input", Input).value + + patternMatch = re.search(INDICATOR_PATTERN, pattern) + + if patternMatch: + self.query_one("#pattern_input", Input).value = pattern.replace(patternMatch.group(1), INDICATOR_PATTERN) # def handle_add_track(self, trackDescriptor): @@ -647,12 +650,76 @@ class MediaDetailsScreen(Screen): # pass + def getSelectedShow(self): + + try: + # Fetch the currently selected row when 'Enter' is pressed + #selected_row_index = self.table.cursor_row + row_key, col_key = self.showsTable.coordinate_to_cell_key(self.showsTable.cursor_coordinate) + + if row_key is not None: + selected_row_data = self.showsTable.get_row(row_key) + + try: + #TODO: Put in a ShowDescriptor and harmonize with PatternController.addPattern() + # and ShowDetailsScreen.getShowDescriptorFromInput() + selectedShow = {} + selectedShow['id'] = int(selected_row_data[0]) + selectedShow['name'] = str(selected_row_data[1]) + selectedShow['year'] = int(selected_row_data[2]) + return selectedShow + except ValueError: + return {} + + except CellDoesNotExist: + return None + + + def handle_new_pattern(self, screenResult): + + show = (screenResult['id'], screenResult['name'], screenResult['year']) + self.showsTable.add_row(*map(str, show)) + + showRowIndex = self.getRowIndexFromShowId(screenResult['id']) + if showRowIndex is not None: + self.showsTable.move_cursor(row=showRowIndex) + + patternDescriptor = {} + patternDescriptor['show_id'] = screenResult['id'] + patternDescriptor['pattern'] = self.getPatternFromInput() + self.__pc.addPattern(patternDescriptor) + + self.highlightPattern(False) + + self.action_update_pattern() + + def action_new_pattern(self): - pass + + selectedShow = self.getSelectedShow() + + #HINT: Callback is invoked after this method has exited. As a workaround the callback is executed directly + # from here with a mock-up screen result containing the necessary part of keys to perform correctly. + if not selectedShow: + self.app.push_screen(ShowDetailsScreen(), self.handle_new_pattern) + else: + self.handle_new_pattern(selectedShow) + def action_update_pattern(self): """When updating the database the actions must reverse the difference (eq to diff db->file)""" + if self.__currentPattern is not None: + inputPattern = self.getPatternFromInput() + if self.__currentPattern.getPattern() != inputPattern: + patternDescriptor = {} + patternDescriptor['show_id'] = self.getSelectedShow()['id'] + patternDescriptor['pattern'] = inputPattern + self.__pc.updatePattern(self.__currentPattern.getId(), patternDescriptor) + + + self.loadProperties() + if MediaDescriptor.TAGS_KEY in self.__mediaDifferences.keys(): if DIFF_ADDED_KEY in self.__mediaDifferences[MediaDescriptor.TAGS_KEY].keys(): diff --git a/bin/ffx/pattern_controller.py b/bin/ffx/pattern_controller.py index 210a3aa..f6f567d 100644 --- a/bin/ffx/pattern_controller.py +++ b/bin/ffx/pattern_controller.py @@ -23,7 +23,7 @@ class PatternController(): pattern = str(patternDescriptor['pattern'])) s.add(pattern) s.commit() - return pattern.getId() + return int(pattern.getId()) else: return None diff --git a/bin/ffx/show_controller.py b/bin/ffx/show_controller.py index c0a5df5..9cdcedb 100644 --- a/bin/ffx/show_controller.py +++ b/bin/ffx/show_controller.py @@ -36,7 +36,7 @@ class ShowController(): if q.count(): return q.all() else: - return None + return [] except Exception as ex: raise click.ClickException(f"ShowController.getAllShows(): {repr(ex)}") diff --git a/bin/ffx/shows_screen.py b/bin/ffx/shows_screen.py index b28f3b7..e8a8028 100644 --- a/bin/ffx/shows_screen.py +++ b/bin/ffx/shows_screen.py @@ -132,11 +132,9 @@ class ShowsScreen(Screen): def on_mount(self) -> None: - allShows = self.__sc.getAllShows() - if allShows is not None: - for show in self.__sc.getAllShows(): - row = (int(show.id), show.name, show.year) # Convert each element to a string before adding - self.table.add_row(*map(str, row)) + for show in self.__sc.getAllShows(): + row = (int(show.id), show.name, show.year) # Convert each element to a string before adding + self.table.add_row(*map(str, row)) def compose(self):