@ -11,27 +11,10 @@ from ffx.model.show import Show
from ffx . model . pattern import Pattern
from ffx . model . track import Track
from . pattern_controller import Patter nController
from . shifted_season_controller import ShiftedSeaso nController
from . show_controller import ShowController
from . track_controller import TrackController
from . tag_controller import TagController
from . track_details_screen import TrackDetailsScreen
from . track_delete_screen import TrackDeleteScreen
from . tag_details_screen import TagDetailsScreen
from . tag_delete_screen import TagDeleteScreen
from ffx . track_type import TrackType
from ffx . track_disposition import TrackDisposition
from ffx . track_descriptor import TrackDescriptor
from textual . widgets . _data_table import CellDoesNotExist
from ffx . file_properties import FileProperties
from ffx . iso_language import IsoLanguage
from ffx . audio_layout import AudioLayout
from ffx . model . shifted_season import ShiftedSeason
# Screen[dict[int, str, int]]
@ -96,145 +79,37 @@ class ShiftedSeasonDetailsScreen(Screen):
}
"""
def __init__ ( self , patternId = None , show Id = None ) :
def __init__ ( self , showId = None , shiftedSeason Id = None ) :
super ( ) . __init__ ( )
self . context = self . app . getContext ( )
self . Session = self . context [ ' database ' ] [ ' session ' ] # convenience
self . __pc = PatternController ( context = self . context )
self . __sc = ShowController ( context = self . context )
self . __tc = TrackController ( context = self . context )
self . __tac = TagController ( context = self . context )
self . __pattern : Pattern = self . __pc . getPattern ( patternId ) if patternId is not None else None
self . __showDescriptor = self . __sc . getShowDescriptor ( showId ) if showId is not None else None
# #TODO: per controller
# def loadTracks(self, show_id):
#
# try:
#
# tracks = {}
# tracks['audio'] = {}
# tracks['subtitle'] = {}
#
# s = self.Session()
# q = s.query(Pattern).filter(Pattern.show_id == int(show_id))
#
# return [{'id': int(p.id), 'pattern': p.pattern} for p in q.all()]
#
# except Exception as ex:
# raise click.ClickException(f"loadTracks(): {repr(ex)}")
# finally:
# s.close()
# def updateTracks(self):
#
# self.tracksTable.clear()
#
# if self.__pattern is not None:
#
# tracks = self.__tc.findTracks(self.__pattern.getId())
#
# typeCounter = {}
#
# tr: Track
# for tr in tracks:
#
# td : TrackDescriptor = tr.getDescriptor(self.context)
#
# trackType = td.getType()
# if not trackType in typeCounter.keys():
# typeCounter[trackType] = 0
#
# dispoSet = td.getDispositionSet()
#
# trackLanguage = td.getLanguage()
# audioLayout = td.getAudioLayout()
# row = (td.getIndex(),
# trackType.label(),
# typeCounter[trackType],
# td.getCodec(),
# audioLayout.label() if trackType == TrackType.AUDIO
# and audioLayout != AudioLayout.LAYOUT_UNDEFINED else ' ',
# trackLanguage.label() if trackLanguage != IsoLanguage.UNDEFINED else ' ',
# td.getTitle(),
# 'Yes' if TrackDisposition.DEFAULT in dispoSet else 'No',
# 'Yes' if TrackDisposition.FORCED in dispoSet else 'No',
# td.getSourceIndex())
#
# self.tracksTable.add_row(*map(str, row))
#
# typeCounter[trackType] += 1
#
#
# def swapTracks(self, trackIndex1: int, trackIndex2: int):
#
# ti1 = int(trackIndex1)
# ti2 = int(trackIndex2)
#
# siblingDescriptors: List[TrackDescriptor] = self.__tc.findSiblingDescriptors(self.__pattern.getId())
#
# numSiblings = len(siblingDescriptors)
#
# if ti1 < 0 or ti1 >= numSiblings:
# raise ValueError(f"PatternDetailsScreen.swapTracks(): trackIndex1 ({ti1}) is out of range ({numSiblings})")
#
# if ti2 < 0 or ti2 >= numSiblings:
# raise ValueError(f"PatternDetailsScreen.swapTracks(): trackIndex2 ({ti2}) is out of range ({numSiblings})")
#
# sibling1 = siblingDescriptors[trackIndex1]
# sibling2 = siblingDescriptors[trackIndex2]
#
# # raise click.ClickException(f"siblings id1={sibling1.getId()} id2={sibling2.getId()}")
#
# subIndex2 = sibling2.getSubIndex()
#
# sibling2.setIndex(sibling1.getIndex())
# sibling2.setSubIndex(sibling1.getSubIndex())
#
# sibling1.setIndex(trackIndex2)
# sibling1.setSubIndex(subIndex2)
#
# if not self.__tc.updateTrack(sibling1.getId(), sibling1):
# raise click.ClickException('Update sibling1 failed')
# if not self.__tc.updateTrack(sibling2.getId(), sibling2):
# raise click.ClickException('Update sibling2 failed')
#
# self.updateTracks()
#
#
# def updateTags(self):
#
# self.tagsTable.clear()
#
# if self.__pattern is not None:
#
# # raise click.ClickException(f"patternid={self.__pattern.getId()}") # 1
#
# tags = self.__tac.findAllMediaTags(self.__pattern.getId())
#
# #raise click.ClickException(f"tags={tags}") # encoder:blah
#
# for tagKey, tagValue in tags.items():
# row = (tagKey, tagValue)
# self.tagsTable.add_row(*map(str, row))
# def on_mount(self):
#
# if not self.__showDescriptor is None:
# self.query_one("#showlabel", Static).update(f"{self.__showDescriptor.getId()} - {self.__showDescriptor.getName()} ({self.__showDescriptor.getYear()})")
#
# if self.__pattern is not None:
#
# self.query_one("#pattern_input", Input).value = str(self.__pattern.getPattern())
#
# self.updateTags()
# self.updateTracks()
self . __ssc = ShiftedSeasonController ( context = self . context )
self . __showId = showId
self . __shiftedSeasonId = shiftedSeasonId
def on_mount ( self ) :
if self . __shiftedSeasonId is not None :
shiftedSeason : ShiftedSeason = self . __ssc . getShiftedSeason ( self . __shiftedSeasonId )
originalSeason = shiftedSeason . getOriginalSeason ( )
self . query_one ( " #input_original_season " , Input ) . value = str ( originalSeason )
firstEpisode = shiftedSeason . getFirstEpisode ( )
self . query_one ( " #input_first_episode " , Input ) . value = str ( firstEpisode ) if firstEpisode != - 1 else ' '
lastEpisode = shiftedSeason . getLastEpisode ( )
self . query_one ( " #input_last_episode " , Input ) . value = str ( lastEpisode ) if lastEpisode != - 1 else ' '
seasonOffset = shiftedSeason . getSeasonOffset ( )
self . query_one ( " #input_season_offset " , Input ) . value = str ( seasonOffset ) if seasonOffset else ' '
episodeOffset = shiftedSeason . getEpisodeOffset ( )
self . query_one ( " #input_episode_offset " , Input ) . value = str ( episodeOffset ) if episodeOffset else ' '
def compose ( self ) :
@ -243,7 +118,7 @@ class ShiftedSeasonDetailsScreen(Screen):
with Grid ( ) :
# 1
yield Static ( " Edit shifted season " if self . __ pattern is not None else " New shifted season " , id = " toplabel " , classes = " three " )
yield Static ( " Edit shifted season " if self . __ shiftedSeasonId is not None else " New shifted season " , id = " toplabel " , classes = " three " )
# 2
yield Static ( " " , classes = " three " )
@ -258,7 +133,7 @@ class ShiftedSeasonDetailsScreen(Screen):
# 5
yield Static ( " Last Episode " )
yield Input ( id = " i m put_last_episode" , classes = " two " )
yield Input ( id = " i n put_last_episode" , classes = " two " )
# 6
yield Static ( " Season offset " )
@ -282,209 +157,66 @@ class ShiftedSeasonDetailsScreen(Screen):
yield Footer ( )
# def getPatternFromInput(self):
# return str(self.query_one("#pattern_input", Input).value)
# def getSelectedTrackDescriptor(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)
#
# trackIndex = int(selected_track_data[0])
# trackSubIndex = int(selected_track_data[2])
#
# return self.__tc.getTrack(self.__pattern.getId(), trackIndex).getDescriptor(self.context, subIndex=trackSubIndex)
#
# else:
# return None
#
# except CellDoesNotExist:
# return None
# def getSelectedTag(self):
#
# try:
#
# # Fetch the currently selected row when 'Enter' is pressed
# #selected_row_index = self.table.cursor_row
# row_key, col_key = self.tagsTable.coordinate_to_cell_key(self.tagsTable.cursor_coordinate)
#
# if row_key is not None:
# selected_tag_data = self.tagsTable.get_row(row_key)
#
# tagKey = str(selected_tag_data[0])
# tagValue = str(selected_tag_data[1])
#
# return tagKey, tagValue
#
# else:
# return None
#
# except CellDoesNotExist:
# return None
def getShiftedSeasonObjFromInput ( self ) :
shiftedSeasonObj = { }
originalSeason = self . query_one ( " #input_original_season " , Input ) . value
if not originalSeason :
return None
shiftedSeasonObj [ ' original_season ' ] = int ( originalSeason )
try :
shiftedSeasonObj [ ' first_episode ' ] = int ( self . query_one ( " #input_first_episode " , Input ) . value )
except ValueError :
shiftedSeasonObj [ ' first_episode ' ] = - 1
try :
shiftedSeasonObj [ ' last_episode ' ] = int ( self . query_one ( " #input_last_episode " , Input ) . value )
except ValueError :
shiftedSeasonObj [ ' last_episode ' ] = - 1
try :
shiftedSeasonObj [ ' season_offset ' ] = int ( self . query_one ( " #input_season_offset " , Input ) . value )
except ValueError :
shiftedSeasonObj [ ' season_offset ' ] = 0
try :
shiftedSeasonObj [ ' episode_offset ' ] = int ( self . query_one ( " #input_episode_offset " , Input ) . value )
except ValueError :
shiftedSeasonObj [ ' episode_offset ' ] = 0
return shiftedSeasonObj
# 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":
#
# patternDescriptor = {}
# patternDescriptor['show_id'] = self.__showDescriptor.getId()
# 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:
# patternId = self.__pc.addPattern(patternDescriptor)
# if patternId:
# 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:
#
# numTracks = len(self.tracksTable.rows)
#
# if event.button.id == "button_add_track":
# self.app.push_screen(TrackDetailsScreen(patternId = self.__pattern.getId(), index = numTracks), self.handle_add_track)
#
# selectedTrack = self.getSelectedTrackDescriptor()
# if selectedTrack is not None:
# if event.button.id == "button_edit_track":
# self.app.push_screen(TrackDetailsScreen(trackDescriptor = selectedTrack), self.handle_edit_track)
# if event.button.id == "button_delete_track":
# self.app.push_screen(TrackDeleteScreen(trackDescriptor = selectedTrack), self.handle_delete_track)
# if event.button.id == "button_add_tag":
# if self.__pattern is not None:
# self.app.push_screen(TagDetailsScreen(), self.handle_update_tag)
#
# if event.button.id == "button_edit_tag":
# tagKey, tagValue = self.getSelectedTag()
# self.app.push_screen(TagDetailsScreen(key=tagKey, value=tagValue), self.handle_update_tag)
#
# if event.button.id == "button_delete_tag":
# tagKey, tagValue = self.getSelectedTag()
# self.app.push_screen(TagDeleteScreen(key=tagKey, value=tagValue), self.handle_delete_tag)
#
# if event.button.id == "pattern_button":
#
# pattern = self.query_one("#pattern_input", Input).value
#
# patternMatch = re.search(FileProperties.SE_INDICATOR_PATTERN, pattern)
#
# if patternMatch:
# self.query_one("#pattern_input", Input).value = pattern.replace(patternMatch.group(1),
# FileProperties.SE_INDICATOR_PATTERN)
#
#
# if event.button.id == "button_track_up":
#
# selectedTrackDescriptor = self.getSelectedTrackDescriptor()
# selectedTrackIndex = selectedTrackDescriptor.getIndex()
#
# if selectedTrackIndex > 0 and selectedTrackIndex < self.tracksTable.row_count:
# correspondingTrackIndex = selectedTrackIndex - 1
# self.swapTracks(selectedTrackIndex, correspondingTrackIndex)
#
#
# if event.button.id == "button_track_down":
#
# selectedTrackDescriptor = self.getSelectedTrackDescriptor()
# selectedTrackIndex = selectedTrackDescriptor.getIndex()
#
# if selectedTrackIndex >= 0 and selectedTrackIndex < (self.tracksTable.row_count - 1):
# correspondingTrackIndex = selectedTrackIndex + 1
# self.swapTracks(selectedTrackIndex, correspondingTrackIndex)
#
#
# def handle_add_track(self, trackDescriptor : TrackDescriptor):
#
# dispoSet = trackDescriptor.getDispositionSet()
# trackType = trackDescriptor.getType()
# index = trackDescriptor.getIndex()
# subIndex = trackDescriptor.getSubIndex()
# language = trackDescriptor.getLanguage()
# title = trackDescriptor.getTitle()
#
# row = (index,
# trackType.label(),
# 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))
#
#
# def handle_edit_track(self, trackDescriptor : TrackDescriptor):
#
# try:
#
# row_key, col_key = self.tracksTable.coordinate_to_cell_key(self.tracksTable.cursor_coordinate)
#
# self.tracksTable.update_cell(row_key, self.column_key_track_audio_layout, trackDescriptor.getAudioLayout().label())
# 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')
#
# except CellDoesNotExist:
# pass
#
#
# def handle_delete_track(self, trackDescriptor : TrackDescriptor):
# self.updateTracks()
#
#
#
# def handle_update_tag(self, tag):
#
# if self.__pattern is None:
# raise click.ClickException(f"PatternDetailsScreen.handle_update_tag: pattern not set")
#
# if self.__tac.updateMediaTag(self.__pattern.getId(), tag[0], tag[1]) is not None:
# self.updateTags()
#
# def handle_delete_tag(self, tag):
#
# if self.__pattern is None:
# raise click.ClickException(f"PatternDetailsScreen.handle_delete_tag: pattern not set")
#
# if self.__tac.deleteMediaTagByKey(self.__pattern.getId(), tag[0]):
# self.updateTags()
#
if event . button . id == " save_button " :
shiftedSeasonObj = self . getShiftedSeasonObjFromInput ( )
if shiftedSeasonObj is not None :
if self . __shiftedSeasonId is not None :
if self . __ssc . checkShiftedSeason ( self . __showId , shiftedSeasonObj ,
shiftedSeasonId = self . __shiftedSeasonId ) :
if self . __ssc . updateShiftedSeason ( self . __shiftedSeasonId , shiftedSeasonObj ) :
self . dismiss ( ( self . __shiftedSeasonId , shiftedSeasonObj ) )
else :
#TODO: Meldung
self . app . pop_screen ( )
else :
if self . __ssc . checkShiftedSeason ( self . __showId , shiftedSeasonObj ) :
self . __shiftedSeasonId = self . __ssc . addShiftedSeason ( self . __showId , shiftedSeasonObj )
self . dismiss ( ( self . __shiftedSeasonId , shiftedSeasonObj ) )
if event . button . id == " cancel_button " :
self . app . pop_screen ( )