|
|
@ -12,6 +12,7 @@ from ffx.model.pattern import Pattern
|
|
|
|
from .pattern_controller import PatternController
|
|
|
|
from .pattern_controller import PatternController
|
|
|
|
from .show_controller import ShowController
|
|
|
|
from .show_controller import ShowController
|
|
|
|
from .track_controller import TrackController
|
|
|
|
from .track_controller import TrackController
|
|
|
|
|
|
|
|
from .tag_controller import TagController
|
|
|
|
|
|
|
|
|
|
|
|
from .track_details_screen import TrackDetailsScreen
|
|
|
|
from .track_details_screen import TrackDetailsScreen
|
|
|
|
from .track_delete_screen import TrackDeleteScreen
|
|
|
|
from .track_delete_screen import TrackDeleteScreen
|
|
|
@ -27,6 +28,8 @@ from textual.widgets._data_table import CellDoesNotExist
|
|
|
|
from ffx.media_descriptor import MediaDescriptor
|
|
|
|
from ffx.media_descriptor import MediaDescriptor
|
|
|
|
from ffx.file_properties import FileProperties
|
|
|
|
from ffx.file_properties import FileProperties
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
from ffx.helper import DIFF_ADDED_KEY, DIFF_CHANGED_KEY, DIFF_REMOVED_KEY
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Screen[dict[int, str, int]]
|
|
|
|
# Screen[dict[int, str, int]]
|
|
|
|
class MediaDetailsScreen(Screen):
|
|
|
|
class MediaDetailsScreen(Screen):
|
|
|
@ -108,6 +111,7 @@ class MediaDetailsScreen(Screen):
|
|
|
|
self.__pc = PatternController(context = self.context)
|
|
|
|
self.__pc = PatternController(context = self.context)
|
|
|
|
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.__tac = TagController(context = self.context)
|
|
|
|
|
|
|
|
|
|
|
|
if not 'command' in self.context.keys() or self.context['command'] != 'inspect':
|
|
|
|
if not 'command' in self.context.keys() or self.context['command'] != 'inspect':
|
|
|
|
raise click.ClickException(f"MediaDetailsScreen.__init__(): Can only perform command 'inspect'")
|
|
|
|
raise click.ClickException(f"MediaDetailsScreen.__init__(): Can only perform command 'inspect'")
|
|
|
@ -120,14 +124,8 @@ class MediaDetailsScreen(Screen):
|
|
|
|
if not os.path.isfile(self.__mediaFilename):
|
|
|
|
if not os.path.isfile(self.__mediaFilename):
|
|
|
|
raise click.ClickException(f"MediaDetailsScreen.__init__(): Media file {self.__mediaFilename} does not exist")
|
|
|
|
raise click.ClickException(f"MediaDetailsScreen.__init__(): Media file {self.__mediaFilename} does not exist")
|
|
|
|
|
|
|
|
|
|
|
|
self.__mediaFileProperties = FileProperties(self.context, self.__mediaFilename)
|
|
|
|
|
|
|
|
self.__mediaDescriptor = self.__mediaFileProperties.getMediaDescriptor()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
self.__mediaFilenamePattern = self.__mediaFileProperties.getPattern()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
self.__storedMediaFilenamePattern = self.__mediaFilenamePattern.getMediaDescriptor() if self.__mediaFilenamePattern is not None else None
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
self.loadProperties()
|
|
|
|
# def loadTracks(self, show_id):
|
|
|
|
# def loadTracks(self, show_id):
|
|
|
|
#
|
|
|
|
#
|
|
|
|
# try:
|
|
|
|
# try:
|
|
|
@ -206,88 +204,107 @@ class MediaDetailsScreen(Screen):
|
|
|
|
return None
|
|
|
|
return None
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def on_mount(self):
|
|
|
|
def loadProperties(self):
|
|
|
|
|
|
|
|
|
|
|
|
if self.__mediaFilenamePattern is None:
|
|
|
|
self.__mediaFileProperties = FileProperties(self.context, self.__mediaFilename)
|
|
|
|
row = (' ', '<New show>', ' ') # Convert each element to a string before adding
|
|
|
|
self.__currentMediaDescriptor = self.__mediaFileProperties.getMediaDescriptor()
|
|
|
|
self.showsTable.add_row(*map(str, row))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for show in self.__sc.getAllShows():
|
|
|
|
#HINT: This is None if the filename did not match anything in database
|
|
|
|
row = (int(show.id), show.name, show.year) # Convert each element to a string before adding
|
|
|
|
self.__currentPattern = self.__mediaFileProperties.getPattern()
|
|
|
|
self.showsTable.add_row(*map(str, row))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for mediaTagKey, mediaTagValue in self.__mediaDescriptor.getTags().items():
|
|
|
|
self.__targetMediaDescriptor = self.__currentPattern.getMediaDescriptor() if self.__currentPattern is not None else None
|
|
|
|
row = (mediaTagKey, mediaTagValue) # Convert each element to a string before adding
|
|
|
|
|
|
|
|
self.mediaTagsTable.add_row(*map(str, row))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#self.updateAudioTracks(self.__mediaDescriptor.getAudioTracks())
|
|
|
|
# Enumerating differences between media descriptors
|
|
|
|
#self.updateSubtitleTracks(self.__mediaDescriptor.getSubtitleTracks())
|
|
|
|
# from file (=current) vs from stored in database (=target)
|
|
|
|
self.updateTracks()
|
|
|
|
self.__mediaDifferences = self.__targetMediaDescriptor.compare(self.__currentMediaDescriptor) if self.__currentPattern is not None else {}
|
|
|
|
|
|
|
|
|
|
|
|
if self.__mediaFilenamePattern is not None:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
showIdentifier = self.__mediaFilenamePattern.getShowId()
|
|
|
|
def updateDifferences(self):
|
|
|
|
showRowIndex = self.getRowIndexFromShowId(showIdentifier)
|
|
|
|
|
|
|
|
if showRowIndex is not None:
|
|
|
|
self.loadProperties()
|
|
|
|
self.showsTable.move_cursor(row=showRowIndex)
|
|
|
|
|
|
|
|
|
|
|
|
self.differencesTable.clear()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if 'tags' in self.__mediaDifferences.keys():
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
currentTags = self.__currentMediaDescriptor.getTags()
|
|
|
|
|
|
|
|
targetTags = self.__targetMediaDescriptor.getTags()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if 'added' in self.__mediaDifferences['tags'].keys():
|
|
|
|
|
|
|
|
for addedTagKey in self.__mediaDifferences['tags']['added']:
|
|
|
|
|
|
|
|
row = (f"added media tag: key='{addedTagKey}' value='{targetTags[addedTagKey]}'",)
|
|
|
|
|
|
|
|
self.differencesTable.add_row(*map(str, row))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if 'removed' in self.__mediaDifferences['tags'].keys():
|
|
|
|
|
|
|
|
for removedTagKey in self.__mediaDifferences['tags']['removed']:
|
|
|
|
|
|
|
|
row = (f"removed media tag: key='{removedTagKey}' value='{currentTags[removedTagKey]}'",)
|
|
|
|
|
|
|
|
self.differencesTable.add_row(*map(str, row))
|
|
|
|
|
|
|
|
|
|
|
|
self.query_one("#pattern_input", Input).value = self.__mediaFilenamePattern.getPattern()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Enumerating differences between media descriptor from file vs from stored in database
|
|
|
|
if 'tracks' in self.__mediaDifferences.keys():
|
|
|
|
targetMediaDescriptor = self.__mediaFilenamePattern.getMediaDescriptor()
|
|
|
|
|
|
|
|
mediaDifferences = targetMediaDescriptor.compare(self.__mediaDescriptor)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if 'tags' in mediaDifferences.keys():
|
|
|
|
currentTracks = self.__currentMediaDescriptor.getAllTracks() # 0,1,2,3
|
|
|
|
|
|
|
|
targetTracks = self.__targetMediaDescriptor.getAllTracks() # 0 <- from DB
|
|
|
|
|
|
|
|
|
|
|
|
mediaTags = self.__mediaDescriptor.getTags()
|
|
|
|
if 'added' in self.__mediaDifferences['tracks'].keys():
|
|
|
|
|
|
|
|
for addedTrackIndex in self.__mediaDifferences['tracks']['added'].keys():
|
|
|
|
|
|
|
|
addedTrack : Track = currentTracks[addedTrackIndex]
|
|
|
|
|
|
|
|
row = (f"added {addedTrack.getType().label()} track: index={addedTrackIndex} lang={addedTrack.getLanguage().threeLetter()}",)
|
|
|
|
|
|
|
|
self.differencesTable.add_row(*map(str, row))
|
|
|
|
|
|
|
|
|
|
|
|
if 'added' in mediaDifferences['tags'].keys():
|
|
|
|
if 'removed' in self.__mediaDifferences['tracks'].keys():
|
|
|
|
for addedTagKey in mediaDifferences['tags']['added']:
|
|
|
|
for removedTrackIndex in self.__mediaDifferences['tracks']['removed']:
|
|
|
|
row = (f"added media tag: key='{addedTagKey}' value='{mediaTags[addedTagKey]}'",)
|
|
|
|
row = (f"removed track: index={removedTrackIndex}",)
|
|
|
|
self.differencesTable.add_row(*map(str, row))
|
|
|
|
self.differencesTable.add_row(*map(str, row))
|
|
|
|
|
|
|
|
|
|
|
|
if 'removed' in mediaDifferences['tags'].keys():
|
|
|
|
if 'changed' in self.__mediaDifferences['tracks'].keys():
|
|
|
|
for removedTagKey in mediaDifferences['tags']['removed']:
|
|
|
|
for changedTrackIndex in self.__mediaDifferences['tracks']['changed'].keys():
|
|
|
|
row = (f"removed media tag: key='{removedTagKey}' value='{mediaTags[removedTagKey]}'",)
|
|
|
|
|
|
|
|
self.differencesTable.add_row(*map(str, row))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
changedTrack : Track = targetTracks[changedTrackIndex]
|
|
|
|
|
|
|
|
changedTrackDiff : dict = self.__mediaDifferences['tracks']['changed'][changedTrackIndex]
|
|
|
|
|
|
|
|
|
|
|
|
if 'tracks' in mediaDifferences.keys():
|
|
|
|
if 'tags' in changedTrackDiff.keys():
|
|
|
|
|
|
|
|
|
|
|
|
currentTracks = self.__mediaDescriptor.getAllTracks() # 0,1,2,3
|
|
|
|
if 'added' in changedTrackDiff['tags']:
|
|
|
|
targetTracks = targetMediaDescriptor.getAllTracks() # 0 <- from DB
|
|
|
|
for addedTagKey in changedTrackDiff['tags']['added']:
|
|
|
|
|
|
|
|
|
|
|
|
if 'added' in mediaDifferences['tracks'].keys():
|
|
|
|
addedTagValue = changedTrack.getTags()[addedTagKey]
|
|
|
|
for addedTrackIndex in mediaDifferences['tracks']['added'].keys():
|
|
|
|
row = (f"changed {changedTrack.getType().label()} track index={changedTrackIndex} added key={addedTagKey} value={addedTagValue}",)
|
|
|
|
addedTrack : Track = currentTracks[addedTrackIndex]
|
|
|
|
self.differencesTable.add_row(*map(str, row))
|
|
|
|
row = (f"added {addedTrack.getType().label()} track: index={addedTrackIndex} subIndex={addedTrack.getSubIndex()} lang={addedTrack.getLanguage().threeLetter()}",)
|
|
|
|
|
|
|
|
self.differencesTable.add_row(*map(str, row))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if 'removed' in mediaDifferences['tracks'].keys():
|
|
|
|
if 'removed' in changedTrackDiff['tags']:
|
|
|
|
for removedTrackIndex in mediaDifferences['tracks']['removed']:
|
|
|
|
for removedTagKey in changedTrackDiff['tags']['removed']:
|
|
|
|
row = (f"removed track: index={removedTrackIndex}",)
|
|
|
|
row = (f"changed {changedTrack.getType().label()} track index={changedTrackIndex} removed key={removedTagKey}",)
|
|
|
|
self.differencesTable.add_row(*map(str, row))
|
|
|
|
self.differencesTable.add_row(*map(str, row))
|
|
|
|
|
|
|
|
|
|
|
|
if 'changed' in mediaDifferences['tracks'].keys():
|
|
|
|
|
|
|
|
for changedTrackIndex in mediaDifferences['tracks']['changed'].keys():
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
changedTrack : Track = targetTracks[changedTrackIndex]
|
|
|
|
def on_mount(self):
|
|
|
|
changedTrackDiff : dict = mediaDifferences['tracks']['changed'][changedTrackIndex]
|
|
|
|
|
|
|
|
|
|
|
|
if self.__currentPattern is None:
|
|
|
|
|
|
|
|
row = (' ', '<New show>', ' ') # Convert each element to a string before adding
|
|
|
|
|
|
|
|
self.showsTable.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.showsTable.add_row(*map(str, row))
|
|
|
|
|
|
|
|
|
|
|
|
if 'tags' in changedTrackDiff.keys():
|
|
|
|
for mediaTagKey, mediaTagValue in self.__currentMediaDescriptor.getTags().items():
|
|
|
|
|
|
|
|
row = (mediaTagKey, mediaTagValue) # Convert each element to a string before adding
|
|
|
|
|
|
|
|
self.mediaTagsTable.add_row(*map(str, row))
|
|
|
|
|
|
|
|
|
|
|
|
if 'added' in changedTrackDiff['tags']:
|
|
|
|
self.updateTracks()
|
|
|
|
for addedTagKey in changedTrackDiff['tags']['added']:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
addedTagValue = changedTrack.getTags()[addedTagKey]
|
|
|
|
|
|
|
|
row = (f"changed {changedTrack.getType().label()} track index={changedTrackIndex} added key={addedTagKey} value={addedTagValue}",)
|
|
|
|
|
|
|
|
self.differencesTable.add_row(*map(str, row))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if 'removed' in changedTrackDiff['tags']:
|
|
|
|
if self.__currentPattern is not None:
|
|
|
|
for removedTagKey in changedTrackDiff['tags']['removed']:
|
|
|
|
|
|
|
|
row = (f"changed {changedTrack.getType().label()} track index={changedTrackIndex} removed key={removedTagKey}",)
|
|
|
|
showIdentifier = self.__currentPattern.getShowId()
|
|
|
|
self.differencesTable.add_row(*map(str, row))
|
|
|
|
showRowIndex = self.getRowIndexFromShowId(showIdentifier)
|
|
|
|
|
|
|
|
if showRowIndex is not None:
|
|
|
|
|
|
|
|
self.showsTable.move_cursor(row=showRowIndex)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
self.query_one("#pattern_input", Input).value = self.__currentPattern.getPattern()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
self.updateDifferences()
|
|
|
|
|
|
|
|
|
|
|
|
else:
|
|
|
|
else:
|
|
|
|
|
|
|
|
|
|
|
@ -300,7 +317,7 @@ class MediaDetailsScreen(Screen):
|
|
|
|
|
|
|
|
|
|
|
|
self.tracksTable.clear()
|
|
|
|
self.tracksTable.clear()
|
|
|
|
|
|
|
|
|
|
|
|
trackDescriptorList = self.__mediaDescriptor.getAllTracks()
|
|
|
|
trackDescriptorList = self.__currentMediaDescriptor.getAllTracks()
|
|
|
|
|
|
|
|
|
|
|
|
typeCounter = {}
|
|
|
|
typeCounter = {}
|
|
|
|
|
|
|
|
|
|
|
@ -369,7 +386,7 @@ class MediaDetailsScreen(Screen):
|
|
|
|
self.differencesTable = DataTable(id='differences-table') # classes="triple"
|
|
|
|
self.differencesTable = DataTable(id='differences-table') # classes="triple"
|
|
|
|
|
|
|
|
|
|
|
|
# Define the columns with headers
|
|
|
|
# Define the columns with headers
|
|
|
|
self.column_key_differences = self.differencesTable.add_column("Differences", width=70)
|
|
|
|
self.column_key_differences = self.differencesTable.add_column("Differences (file->db)", width=70)
|
|
|
|
|
|
|
|
|
|
|
|
self.differencesTable.cursor_type = 'row'
|
|
|
|
self.differencesTable.cursor_type = 'row'
|
|
|
|
|
|
|
|
|
|
|
@ -667,3 +684,39 @@ class MediaDetailsScreen(Screen):
|
|
|
|
#
|
|
|
|
#
|
|
|
|
# except CellDoesNotExist:
|
|
|
|
# except CellDoesNotExist:
|
|
|
|
# pass
|
|
|
|
# pass
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def action_new_pattern(self):
|
|
|
|
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def action_update_pattern(self):
|
|
|
|
|
|
|
|
"""When updating the database the actions must reverse the difference (eq to diff db->file)"""
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if MediaDescriptor.TAGS_KEY in self.__mediaDifferences.keys():
|
|
|
|
|
|
|
|
if DIFF_ADDED_KEY in self.__mediaDifferences[MediaDescriptor.TAGS_KEY].keys():
|
|
|
|
|
|
|
|
for addedTagKey in self.__mediaDifferences[MediaDescriptor.TAGS_KEY][DIFF_ADDED_KEY]:
|
|
|
|
|
|
|
|
self.__tac.deleteMediaTagByKey(self.__currentPattern.getId(), addedTagKey)
|
|
|
|
|
|
|
|
if DIFF_REMOVED_KEY in self.__mediaDifferences[MediaDescriptor.TAGS_KEY].keys():
|
|
|
|
|
|
|
|
for removedTagKey in self.__mediaDifferences[MediaDescriptor.TAGS_KEY][DIFF_REMOVED_KEY]:
|
|
|
|
|
|
|
|
mediaTags = self.__currentMediaDescriptor.getTags()
|
|
|
|
|
|
|
|
self.__tac.updateMediaTag(self.__currentPattern.getId(), removedTagKey, mediaTags[removedTagKey])
|
|
|
|
|
|
|
|
if DIFF_CHANGED_KEY in self.__mediaDifferences[MediaDescriptor.TAGS_KEY].keys():
|
|
|
|
|
|
|
|
for changedTagKey in self.__mediaDifferences[MediaDescriptor.TAGS_KEY][DIFF_CHANGED_KEY]:
|
|
|
|
|
|
|
|
pass
|
|
|
|
|
|
|
|
if MediaDescriptor.TRACKS_KEY in self.__mediaDifferences.keys():
|
|
|
|
|
|
|
|
if DIFF_ADDED_KEY in self.__mediaDifferences[MediaDescriptor.TRACKS_KEY].keys():
|
|
|
|
|
|
|
|
for addedTrackKey in self.__mediaDifferences[MediaDescriptor.TRACKS_KEY][DIFF_ADDED_KEY]:
|
|
|
|
|
|
|
|
pass
|
|
|
|
|
|
|
|
if DIFF_REMOVED_KEY in self.__mediaDifferences[MediaDescriptor.TRACKS_KEY].keys():
|
|
|
|
|
|
|
|
for removedTrackKey in self.__mediaDifferences[MediaDescriptor.TRACKS_KEY][DIFF_REMOVED_KEY]:
|
|
|
|
|
|
|
|
pass
|
|
|
|
|
|
|
|
if DIFF_CHANGED_KEY in self.__mediaDifferences[MediaDescriptor.TRACKS_KEY].keys():
|
|
|
|
|
|
|
|
for changedTrackKey in self.__mediaDifferences[MediaDescriptor.TRACKS_KEY][DIFF_CHANGED_KEY]:
|
|
|
|
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
self.updateDifferences()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def action_edit_pattern(self):
|
|
|
|
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
|
|