subindex into track order
This commit is contained in:
1022
bin/ffx.py
1022
bin/ffx.py
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'])
|
||||
|
||||
Reference in New Issue
Block a user