|
|
@ -19,6 +19,7 @@ from .track_delete_screen import TrackDeleteScreen
|
|
|
|
from ffx.track_type import TrackType
|
|
|
|
from ffx.track_type import TrackType
|
|
|
|
|
|
|
|
|
|
|
|
from ffx.track_disposition import TrackDisposition
|
|
|
|
from ffx.track_disposition import TrackDisposition
|
|
|
|
|
|
|
|
from ffx.track_descriptor import TrackDescriptor
|
|
|
|
|
|
|
|
|
|
|
|
from textual.widgets._data_table import CellDoesNotExist
|
|
|
|
from textual.widgets._data_table import CellDoesNotExist
|
|
|
|
|
|
|
|
|
|
|
@ -79,7 +80,7 @@ class PatternDetailsScreen(Screen):
|
|
|
|
self.__sc = ShowController(context = self.context)
|
|
|
|
self.__sc = ShowController(context = self.context)
|
|
|
|
self.__tc = TrackController(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 {}
|
|
|
|
self.show_obj = self.__sc.getShowDesciptor(showId) if showId is not None else {}
|
|
|
|
|
|
|
|
|
|
|
@ -107,39 +108,43 @@ class PatternDetailsScreen(Screen):
|
|
|
|
|
|
|
|
|
|
|
|
self.audioStreamsTable.clear()
|
|
|
|
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(),
|
|
|
|
dispoSet = at.getDispositionSet()
|
|
|
|
" ",
|
|
|
|
|
|
|
|
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))
|
|
|
|
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):
|
|
|
|
def updateSubtitleTracks(self):
|
|
|
|
|
|
|
|
|
|
|
|
self.subtitleStreamsTable.clear()
|
|
|
|
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(),
|
|
|
|
dispoSet = st.getDispositionSet()
|
|
|
|
" ",
|
|
|
|
|
|
|
|
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))
|
|
|
|
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):
|
|
|
|
def on_mount(self):
|
|
|
@ -249,7 +254,7 @@ class PatternDetailsScreen(Screen):
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def getSelectedAudioTrack(self):
|
|
|
|
def getSelectedAudioTrackDescriptor(self):
|
|
|
|
|
|
|
|
|
|
|
|
if not self.__pattern:
|
|
|
|
if not self.__pattern:
|
|
|
|
return None
|
|
|
|
return None
|
|
|
@ -265,7 +270,18 @@ class PatternDetailsScreen(Screen):
|
|
|
|
|
|
|
|
|
|
|
|
subIndex = int(selected_track_data[0])
|
|
|
|
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:
|
|
|
|
else:
|
|
|
|
return None
|
|
|
|
return None
|
|
|
@ -274,7 +290,7 @@ class PatternDetailsScreen(Screen):
|
|
|
|
return None
|
|
|
|
return None
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def getSelectedSubtitleTrack(self):
|
|
|
|
def getSelectedSubtitleTrackDescriptor(self):
|
|
|
|
|
|
|
|
|
|
|
|
if not self.__pattern is None:
|
|
|
|
if not self.__pattern is None:
|
|
|
|
return None
|
|
|
|
return None
|
|
|
@ -290,7 +306,18 @@ class PatternDetailsScreen(Screen):
|
|
|
|
|
|
|
|
|
|
|
|
subIndex = int(selected_track_data[0])
|
|
|
|
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:
|
|
|
|
else:
|
|
|
|
return None
|
|
|
|
return None
|
|
|
@ -333,27 +360,26 @@ class PatternDetailsScreen(Screen):
|
|
|
|
# Save pattern when just created before adding streams
|
|
|
|
# Save pattern when just created before adding streams
|
|
|
|
if self.__pattern is not None:
|
|
|
|
if self.__pattern is not None:
|
|
|
|
|
|
|
|
|
|
|
|
#self.pattern_obj
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if event.button.id == "button_add_audio_stream":
|
|
|
|
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)
|
|
|
|
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 selectedAudioTrack is not None:
|
|
|
|
if event.button.id == "button_edit_audio_stream":
|
|
|
|
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":
|
|
|
|
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":
|
|
|
|
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)
|
|
|
|
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 selectedSubtitleTrack is not None:
|
|
|
|
if event.button.id == "button_edit_subtitle_stream":
|
|
|
|
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":
|
|
|
|
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":
|
|
|
|
if event.button.id == "patternbutton":
|
|
|
|
|
|
|
|
|
|
|
@ -398,38 +424,38 @@ class PatternDetailsScreen(Screen):
|
|
|
|
self.subtitleStreamsTable.add_row(*map(str, row))
|
|
|
|
self.subtitleStreamsTable.add_row(*map(str, row))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def handle_edit_track(self, trackDescriptor):
|
|
|
|
def handle_edit_track(self, trackDescriptor : TrackDescriptor):
|
|
|
|
|
|
|
|
|
|
|
|
try:
|
|
|
|
try:
|
|
|
|
if trackDescriptor['type'] == TrackType.AUDIO:
|
|
|
|
if trackDescriptor.getType() == TrackType.AUDIO:
|
|
|
|
|
|
|
|
|
|
|
|
row_key, col_key = self.audioStreamsTable.coordinate_to_cell_key(self.audioStreamsTable.cursor_coordinate)
|
|
|
|
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_language, trackDescriptor.getLanguage().label())
|
|
|
|
self.audioStreamsTable.update_cell(row_key, self.column_key_audio_title, trackDescriptor['title'])
|
|
|
|
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['disposition_list'] else 'No')
|
|
|
|
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['disposition_list'] 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)
|
|
|
|
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_language, trackDescriptor.getLanguage().label())
|
|
|
|
self.subtitleStreamsTable.update_cell(row_key, self.column_key_subtitle_title, trackDescriptor['title'])
|
|
|
|
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['disposition_list'] else 'No')
|
|
|
|
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['disposition_list'] else 'No')
|
|
|
|
self.subtitleStreamsTable.update_cell(row_key, self.column_key_subtitle_forced, 'Yes' if TrackDisposition.FORCED in trackDescriptor.getDispositionSet() else 'No')
|
|
|
|
|
|
|
|
|
|
|
|
except CellDoesNotExist:
|
|
|
|
except CellDoesNotExist:
|
|
|
|
pass
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def handle_delete_track(self, trackDescriptor):
|
|
|
|
def handle_delete_track(self, trackDescriptor : TrackDescriptor):
|
|
|
|
|
|
|
|
|
|
|
|
try:
|
|
|
|
try:
|
|
|
|
if trackDescriptor['type'] == TrackType.AUDIO:
|
|
|
|
if trackDescriptor.getType() == TrackType.AUDIO:
|
|
|
|
self.updateAudioTracks()
|
|
|
|
self.updateAudioTracks()
|
|
|
|
|
|
|
|
|
|
|
|
if trackDescriptor['type'] == TrackType.SUBTITLE:
|
|
|
|
if trackDescriptor.getType() == TrackType.SUBTITLE:
|
|
|
|
self.updateSubtitleTracks()
|
|
|
|
self.updateSubtitleTracks()
|
|
|
|
|
|
|
|
|
|
|
|
except CellDoesNotExist:
|
|
|
|
except CellDoesNotExist:
|
|
|
|