subindex into track order

click-textual
Maveno 12 months ago
parent ec3fb25c7b
commit 5bb7dcc795

File diff suppressed because it is too large Load Diff

@ -35,6 +35,7 @@ class FfxController():
'_STATISTICS_WRITING_DATE_UTC',
'_STATISTICS_TAGS']
INPUT_FILE_EXTENSIONS = ['mkv', 'mp4', 'avi', 'flv', 'webm']
# def getReorderedSubstreams(subDescriptor, last):

@ -63,9 +63,9 @@ class MediaDescriptor():
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]
subtitleTracks = [s for s in self.__trackDescriptors.copy() if s.getType() == TrackType.SUBTITLE]
videoTracks = self.getVideoTracks()
audioTracks = self.getAudioTracks()
subtitleTracks = self.getSubtitleTracks()
videoDefaultTracks = [v for v in videoTracks if TrackDisposition.DEFAULT in v.getDispositionSet()]
videoForcedTracks = [v for v in videoTracks if TrackDisposition.FORCED in v.getDispositionSet()]
@ -139,16 +139,31 @@ class MediaDescriptor():
def getAllTracks(self) -> List[TrackDescriptor]:
return self.__trackDescriptors
return self.getVideoTracks() + self.getAudioTracks() + self.getSubtitleTracks()
def getVideoTracks(self) -> List[TrackDescriptor]:
return [d for d in self.__trackDescriptors if d.getType() == TrackType.VIDEO]
videoTracks = [v for v in self.__trackDescriptors.copy() if v.getType() == TrackType.VIDEO]
subIndex = 0
for v in videoTracks:
v.setSubIndex(subIndex)
subIndex += 1
return videoTracks
def getAudioTracks(self) -> List[TrackDescriptor]:
return [d for d in self.__trackDescriptors if d.getType() == TrackType.AUDIO]
audioTracks = [a for a in self.__trackDescriptors.copy() if a.getType() == TrackType.AUDIO]
subIndex = 0
for a in audioTracks:
a.setSubIndex(subIndex)
subIndex += 1
return audioTracks
def getSubtitleTracks(self) -> List[TrackDescriptor]:
return [d for d in self.__trackDescriptors if d.getType() == TrackType.SUBTITLE]
subtitleTracks = [s for s in self.__trackDescriptors.copy() if s.getType() == TrackType.SUBTITLE]
subIndex = 0
for s in subtitleTracks:
s.setSubIndex(subIndex)
subIndex += 1
return subtitleTracks
def getClearTags(self):
return self.__clearTags
@ -209,3 +224,27 @@ class MediaDescriptor():
compareResult[MediaDescriptor.TRACKS_KEY] = trackCompareResult
return compareResult
def getInputMappingTokens(self):
reorderedTrackDescriptors = self.getReorderedTrackDescriptors()
inputMappingTokens = []
#subIndexCounter = {}
for rtd in reorderedTrackDescriptors:
trackType = rtd.getType()
#if not trackType in subIndexCounter.keys():
# subIndexCounter[trackType] = 0
#inputMappingTokens += ['-map', f"0:{trackType.indicator()}:{subIndexCounter[trackType]}"]
inputMappingTokens += ['-map', f"0:{trackType.indicator()}:{rtd.getSubIndex()}"]
#subIndexCounter[trackType] += 1
return inputMappingTokens
# for rtd in reorderedTrackDescriptors:
# trackType = rtd.getType()
# #if not trackType in subIndexCounter.keys():
# # subIndexCounter[trackType] = 0
# #inputMappingTokens += ['-map', f"0:{trackType.indicator()}:{subIndexCounter[trackType]}"]
# inputMappingTokens += ['-map', f"0:{rtd.getIndex()}"]
# #subIndexCounter[trackType] += 1
# return inputMappingTokens

@ -126,7 +126,6 @@ class MediaDetailsScreen(Screen):
if not os.path.isfile(self.__mediaFilename):
raise click.ClickException(f"MediaDetailsScreen.__init__(): Media file {self.__mediaFilename} does not exist")
self.loadProperties()
@ -160,8 +159,6 @@ class MediaDetailsScreen(Screen):
# from file (=current) vs from stored in database (=target)
self.__mediaDifferences = self.__targetMediaDescriptor.compare(self.__currentMediaDescriptor) if self.__currentPattern is not None else {}
#rtd = self.__targetMediaDescriptor.getReorderedTrackDescriptors()
#raise click.ClickException(f"getReorderedTrackDescriptors={[r.getIndex() for r in rtd]}")
def updateDifferences(self):
@ -239,7 +236,6 @@ class MediaDetailsScreen(Screen):
self.differencesTable.add_row(*map(str, row))
def on_mount(self):
if self.__currentPattern is None:
@ -273,12 +269,14 @@ class MediaDetailsScreen(Screen):
self.query_one("#pattern_input", Input).value = self.__mediaFilename
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):
self.tracksTable.clear()
@ -311,7 +309,6 @@ class MediaDetailsScreen(Screen):
def compose(self):
# Create the DataTable widget
self.showsTable = DataTable()
@ -323,7 +320,6 @@ class MediaDetailsScreen(Screen):
self.showsTable.cursor_type = 'row'
self.mediaTagsTable = DataTable()
# Define the columns with headers
@ -393,69 +389,6 @@ class MediaDetailsScreen(Screen):
yield self.tracksTable
yield Static(" ")
# # 8
# yield Static(" ", classes="three")
#
# # 9
# yield Static("Subtitle Streams")
# yield self.subtitleStreamsTable
# yield Static(" ")
# 1
# yield Static("Edit filename pattern" if self.__pattern is not None else "New filename pattern", id="toplabel")
# yield Input(type="text", id="pattern_input", classes="four")
#
# # 2
# yield Static("from show")
# yield Static("", id="showlabel", classes="three")
# yield Button("Substitute pattern", id="patternbutton")
#
# # 3
# yield Static(" ", classes="five")
# # 4
# yield Static(" ", classes="five")
#
# # 5
# yield Static("Audio streams")
# yield Static(" ")
#
# if self.__pattern is not None:
# yield Button("Add", id="button_add_audio_stream")
# yield Button("Edit", id="button_edit_audio_stream")
# yield Button("Delete", id="button_delete_audio_stream")
# else:
# yield Static("")
# yield Static("")
# yield Static("")
# # 6
# yield self.tracksTable
#
# # 7
# yield Static(" ", classes="five")
#
# # 8
# yield Static("Subtitle streams")
# yield Static(" ")
#
# if self.__pattern is not None:
# yield Button("Add", id="button_add_subtitle_stream")
# yield Button("Edit", id="button_edit_subtitle_stream")
# yield Button("Delete", id="button_delete_subtitle_stream")
# else:
# yield Static("")
# yield Static("")
# yield Static("")
# # 9
# yield self.subtitleStreamsTable
#
# # 10
# yield Static(" ", classes="five")
#
# # 11
# yield Button("Save", id="save_button")
# yield Button("Cancel", id="cancel_button")
yield Footer()
@ -463,113 +396,8 @@ class MediaDetailsScreen(Screen):
return str(self.query_one("#pattern_input", Input).value)
# def getSelectedAudioTrackDescriptor(self):
#
# if not self.__pattern:
# return None
#
# try:
#
# # Fetch the currently selected row when 'Enter' is pressed
# #selected_row_index = self.table.cursor_row
# row_key, col_key = self.tracksTable.coordinate_to_cell_key(self.tracksTable.cursor_coordinate)
#
# if row_key is not None:
# selected_track_data = self.tracksTable.get_row(row_key)
#
# subIndex = int(selected_track_data[0])
#
# return self.__tc.findTrack(self.__pattern.getId(), TrackType.AUDIO, subIndex).getDescriptor()
#
# else:
# return None
#
# except CellDoesNotExist:
# return None
#
# def getSelectedSubtitleTrackDescriptor(self) -> TrackDescriptor:
#
# if not self.__pattern is None:
# return None
#
# try:
#
# # Fetch the currently selected row when 'Enter' is pressed
# #selected_row_index = self.table.cursor_row
# row_key, col_key = self.subtitleStreamsTable.coordinate_to_cell_key(self.subtitleStreamsTable.cursor_coordinate)
#
# if row_key is not None:
#
# selected_track_data = self.subtitleStreamsTable.get_row(row_key)
# subIndex = int(selected_track_data[0])
#
# return self.__tc.findTrack(self.__pattern.getId(), TrackType.SUBTITLE, subIndex).getDescriptor()
#
# else:
# return None
#
# except CellDoesNotExist:
# return None
# Event handler for button press
def on_button_pressed(self, event: Button.Pressed) -> None:
# # Check if the button pressed is the one we are interested in
# if event.button.id == "save_button":
#
# patternDescriptor = {}
# patternDescriptor['show_id'] = self.show_obj['id']
# patternDescriptor['pattern'] = self.getPatternFromInput()
#
# if self.__pattern is not None:
#
# if self.__pc.updatePattern(self.__pattern.getId(), patternDescriptor):
# self.dismiss(patternDescriptor)
# else:
# #TODO: Meldung
# self.app.pop_screen()
#
# else:
# if self.__pc.addPattern(patternDescriptor):
# self.dismiss(patternDescriptor)
# else:
# #TODO: Meldung
# self.app.pop_screen()
#
#
#
# if event.button.id == "cancel_button":
# self.app.pop_screen()
#
#
# # Save pattern when just created before adding streams
# if self.__pattern is not None:
#
# if event.button.id == "button_add_audio_stream":
# self.app.push_screen(TrackDetailsScreen(trackType = TrackType.AUDIO, patternId = self.__pattern.getId(), subIndex = len(self.tracksTable.rows)), self.handle_add_track)
#
# selectedAudioTrack = self.getSelectedAudioTrackDescriptor()
# if selectedAudioTrack is not None:
# if event.button.id == "button_edit_audio_stream":
#
# self.app.push_screen(TrackDetailsScreen(trackDescriptor = selectedAudioTrack), self.handle_edit_track)
# if event.button.id == "button_delete_audio_stream":
# 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.getSelectedSubtitleTrackDescriptor()
# if selectedSubtitleTrack is not None:
# if event.button.id == "button_edit_subtitle_stream":
# 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 == "pattern_button":
INDICATOR_PATTERN = '([sS][0-9]+[eE][0-9]+)'
@ -582,75 +410,6 @@ class MediaDetailsScreen(Screen):
self.query_one("#pattern_input", Input).value = pattern.replace(patternMatch.group(1), INDICATOR_PATTERN)
# def handle_add_track(self, trackDescriptor):
#
# dispoSet = trackDescriptor.getDispositionSet()
# trackType = trackDescriptor.getType()
# subIndex = trackDescriptor.getSubIndex()
# language = trackDescriptor.getLanguage()
# title = trackDescriptor.getTitle()
#
# if trackType == TrackType.AUDIO:
#
# row = (subIndex,
# " ",
# language.label(),
# title,
# 'Yes' if TrackDisposition.DEFAULT in dispoSet else 'No',
# 'Yes' if TrackDisposition.FORCED in dispoSet else 'No')
#
# self.tracksTable.add_row(*map(str, row))
#
# if trackType == TrackType.SUBTITLE:
#
# row = (subIndex,
# " ",
# language.label(),
# title,
# 'Yes' if TrackDisposition.DEFAULT in dispoSet else 'No',
# 'Yes' if TrackDisposition.FORCED in dispoSet else 'No')
#
# self.subtitleStreamsTable.add_row(*map(str, row))
# def handle_edit_track(self, trackDescriptor : TrackDescriptor):
#
# try:
# if trackDescriptor.getType() == TrackType.AUDIO:
#
# row_key, col_key = self.tracksTable.coordinate_to_cell_key(self.tracksTable.cursor_coordinate)
#
# self.tracksTable.update_cell(row_key, self.column_key_track_language, trackDescriptor.getLanguage().label())
# self.tracksTable.update_cell(row_key, self.column_key_track_title, trackDescriptor.getTitle())
# self.tracksTable.update_cell(row_key, self.column_key_track_default, 'Yes' if TrackDisposition.DEFAULT in trackDescriptor.getDispositionSet() else 'No')
# self.tracksTable.update_cell(row_key, self.column_key_track_forced, 'Yes' if TrackDisposition.FORCED in trackDescriptor.getDispositionSet() else 'No')
#
# 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.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 : TrackDescriptor):
#
# try:
# if trackDescriptor.getType() == TrackType.AUDIO:
# self.updateAudioTracks()
#
# if trackDescriptor.getType() == TrackType.SUBTITLE:
# self.updateSubtitleTracks()
#
# except CellDoesNotExist:
# pass
def getSelectedShow(self):
try:

@ -172,6 +172,8 @@ class TrackDescriptor():
def getSubIndex(self):
return self.__subIndex
def setSubIndex(self, subIndex):
self.__subIndex = subIndex
def getType(self):
return self.__trackType

@ -13,6 +13,10 @@ class TrackType(Enum):
"""Returns the stream type as string"""
return str(self.value['label'])
def indicator(self):
"""Returns the stream type as single letter"""
return self.label()[0]
def index(self):
"""Returns the stream type index"""
return int(self.value['index'])

Loading…
Cancel
Save