diff --git a/bin/ffx.py b/bin/ffx.py index 1ee131f..d146380 100755 --- a/bin/ffx.py +++ b/bin/ffx.py @@ -241,8 +241,13 @@ def convert(ctx, context = ctx.obj + context['jellyfin'] = jellyfin + context['tmdb'] = tmdb + # click.echo(f"\nVideo encoder: {video_encoder}") -# + + ffx = FfxController() + qualityTokens = quality.split(',') q_list = [q for q in qualityTokens if q.isnumeric()] @@ -326,12 +331,19 @@ def convert(ctx, currentPattern = mediaFileProperties.getPattern() targetMediaDescriptor = currentPattern.getMediaDescriptor() if currentPattern is not None else None + targetMediaDescriptor.setJellyfinOrder(context['jellyfin']) click.echo(f"Pattern matching: {'No' if currentPattern is None else 'Yes'}") if not currentPattern is None: + click.echo(f"Input mapping tokens: {targetMediaDescriptor.getInputMappingTokens()}") + mappingTokens = ffx.generateMappingTokensFromDescriptors(currentMediaDescriptor, targetMediaDescriptor) + + click.echo(f"Mapping Tokens: {mappingTokens}") + + # # Determine season and episode if present in current filename # season_digits = 2 # episode_digits = 2 diff --git a/bin/ffx/ffx_controller.py b/bin/ffx/ffx_controller.py index 85b6567..2a5cf77 100644 --- a/bin/ffx/ffx_controller.py +++ b/bin/ffx/ffx_controller.py @@ -174,6 +174,8 @@ class FfxController(): mediaDifferences = targetMediaDescriptor.compare(sourceMediaDescriptor) + click.echo(f"media diff {mediaDifferences}") + if MediaDescriptor.TAGS_KEY in mediaDifferences.keys(): sourceTags = sourceMediaDescriptor.getTags() diff --git a/bin/ffx/file_properties.py b/bin/ffx/file_properties.py index 7a60b8e..e1b0b12 100644 --- a/bin/ffx/file_properties.py +++ b/bin/ffx/file_properties.py @@ -18,6 +18,8 @@ class FileProperties(): def __init__(self, context, sourcePath): + self.context = context + # Separate basedir, basename and extension for current source file self.__sourcePath = sourcePath @@ -189,7 +191,7 @@ class FileProperties(): def getMediaDescriptor(self): - return MediaDescriptor.fromFfprobe(self.getFormatData(), self.getStreamData()) + return MediaDescriptor.fromFfprobe(self.getFormatData(), self.getStreamData(), context = self.context) def getShowId(self) -> int: diff --git a/bin/ffx/media_descriptor.py b/bin/ffx/media_descriptor.py index 746420a..febbcf0 100644 --- a/bin/ffx/media_descriptor.py +++ b/bin/ffx/media_descriptor.py @@ -13,6 +13,8 @@ from ffx.helper import dictDiff, DIFF_ADDED_KEY, DIFF_CHANGED_KEY, DIFF_REMOVED_ class MediaDescriptor(): """This class represents the structural content of a media file including streams and metadata""" + CONTEXT_KEY = 'context' + TAGS_KEY = 'tags' TRACKS_KEY = 'tracks' @@ -22,6 +24,7 @@ class MediaDescriptor(): FFPROBE_DISPOSITION_KEY = 'disposition' FFPROBE_TAGS_KEY = 'tags' FFPROBE_CODEC_TYPE_KEY = 'codec_type' + JELLYFIN_ORDER_FLAG_KEY = 'jellyfin_order' def __init__(self, **kwargs): @@ -34,9 +37,6 @@ class MediaDescriptor(): self.__mediaTags = {} if MediaDescriptor.TRACK_DESCRIPTOR_LIST_KEY in kwargs.keys(): - # if type(kwargs[MediaDescriptor.TRACK_DESCRIPTORS_KEY]) is not List[TrackDescriptor]: # Use List typehint for TrackDescriptor as well if it works - # raise TypeError(f"MediaDescriptor.__init__(): Argument {MediaDescriptor.TRACK_DESCRIPTORS_KEY} is required to be of type list containing only elements of type TrackDescriptor") - if type(kwargs[MediaDescriptor.TRACK_DESCRIPTOR_LIST_KEY]) is not list: # Use List typehint for TrackDescriptor as well if it works raise TypeError(f"MediaDescriptor.__init__(): Argument {MediaDescriptor.TRACK_DESCRIPTOR_LIST_KEY} is required to be of type list") for d in kwargs[MediaDescriptor.TRACK_DESCRIPTOR_LIST_KEY]: @@ -105,7 +105,7 @@ class MediaDescriptor(): @classmethod - def fromFfprobe(cls, formatData, streamData): + def fromFfprobe(cls, formatData, streamData, context : dict = None): kwargs = {} @@ -114,6 +114,7 @@ class MediaDescriptor(): kwargs[MediaDescriptor.TRACK_DESCRIPTOR_LIST_KEY] = [] + #TODO: Evtl obsolet subIndexCounters = {} for streamObj in streamData: @@ -165,6 +166,12 @@ class MediaDescriptor(): subIndex += 1 return subtitleTracks + def getJellyfin(self): + return self.__jellyfinOrder + + def setJellyfinOrder(self, state): + self.__jellyfinOrder = state + def getClearTags(self): return self.__clearTags @@ -226,25 +233,17 @@ class MediaDescriptor(): return compareResult - def getInputMappingTokens(self): + def getInputMappingTokens(self, use_sub_index : bool = True): + 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 + trackType = rtd.getType() + if use_sub_index: + inputMappingTokens += ['-map', f"0:{trackType.indicator()}:{rtd.getSubIndex()}"] + else: + inputMappingTokens += ['-map', f"0:{rtd.getIndex()}"] + 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