nightl
parent
5e017a8373
commit
eaee3b34da
@ -1,29 +1,43 @@
|
|||||||
from ffx.track_type import TrackType
|
from ffx.track_type import TrackType
|
||||||
|
from ffx.track_descriptor import TrackDescriptor
|
||||||
|
|
||||||
|
|
||||||
class MediaDescriptor():
|
class MediaDescriptor():
|
||||||
|
"""This class represents the structural content of a media file including streams and metadata"""
|
||||||
|
|
||||||
def __init__(self, tags = {}, clear_tags = False, tracks = []):
|
def __init__(self, **kwargs):
|
||||||
|
|
||||||
# self.__metaTags = mediaDescriptor['tags'] if 'tags' in mediaDescriptor.keys() else {}
|
self.__mediaTags = kwargs['tags'] if 'tags' in kwargs.keys() else {}
|
||||||
self.__tags = tags
|
self.__trackDescriptors = kwargs['trackDescriptors'] if 'trackDescriptors' in kwargs.keys() else {}
|
||||||
|
self.__clearTags = kwargs['clearTags'] if 'clearTags' in kwargs.keys() else False
|
||||||
|
|
||||||
self.__tracks = {}
|
|
||||||
|
|
||||||
# self.__videoTracks = mediaDescriptor[TrackType.VIDEO.label()] if TrackType.VIDEO.label() in mediaDescriptor.keys() else []
|
@classmethod
|
||||||
# self.__audioTracks = mediaDescriptor[TrackType.AUDIO.label()] if TrackType.AUDIO.label() in mediaDescriptor.keys() else []
|
def fromFfprobe(cls, formatData, streamData):
|
||||||
# self.__subtitleTracks = mediaDescriptor[TrackType.SUBTITLE.label()] if TrackType.SUBTITLE.label() in mediaDescriptor.keys() else []
|
|
||||||
|
|
||||||
self.__clearTags = clear_tags
|
descriptors = {}
|
||||||
|
|
||||||
for t in tracks:
|
for streamObj in streamData:
|
||||||
self.appendTrack(t)
|
|
||||||
|
|
||||||
|
trackType = TrackType.fromLabel(streamObj['codec_type'])
|
||||||
|
|
||||||
def appendTrack(self, trackDescriptor):
|
if trackType != TrackType.UNKNOWN:
|
||||||
|
|
||||||
ttype = trackDescriptor['type'].label()
|
if trackType.label() not in descriptors.keys():
|
||||||
|
descriptors[trackType.label()] = []
|
||||||
if ttype not in self.__tracks.keys():
|
|
||||||
self.__tracks[ttype] = []
|
descriptors[trackType.label()].append(TrackDescriptor.fromFfprobe(streamObj))
|
||||||
|
|
||||||
|
return cls(tags=formatData['tags'] if 'tags' in formatData.keys() else {},
|
||||||
|
trackDescriptors = descriptors)
|
||||||
|
|
||||||
|
|
||||||
|
def getTags(self):
|
||||||
|
return self.__mediaTags
|
||||||
|
|
||||||
|
|
||||||
|
def getAudioTracks(self):
|
||||||
|
return self.__trackDescriptors[TrackType.AUDIO.label()] if TrackType.AUDIO.label() in self.__trackDescriptors.keys() else []
|
||||||
|
|
||||||
self.__tracks[ttype] = trackDescriptor
|
def getSubtitleTracks(self):
|
||||||
|
return self.__trackDescriptors[TrackType.SUBTITLE.label()] if TrackType.SUBTITLE.label() in self.__trackDescriptors.keys() else []
|
||||||
|
@ -1,11 +1,98 @@
|
|||||||
from .iso_language import IsoLanguage
|
from .iso_language import IsoLanguage
|
||||||
from .track_type import TrackType
|
from .track_type import TrackType
|
||||||
from .audio_layout import AudioLayout
|
from .audio_layout import AudioLayout
|
||||||
|
from .track_disposition import TrackDisposition
|
||||||
|
|
||||||
class StreamDescriptor():
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
class TrackDescriptor():
|
||||||
|
|
||||||
|
FFPROBE_DISPOSITION_KEY = 'disposition'
|
||||||
|
FFPROBE_TAGS_KEY = 'tags'
|
||||||
|
|
||||||
|
def __init__(self, **kwargs):
|
||||||
|
|
||||||
def getTrack(self):
|
# self.__index = int(kwargs['index']) if 'index' in kwargs.keys() else -1
|
||||||
pass
|
# self.__subIndex = int(kwargs['sub_index']) if 'sub_index' in kwargs.keys() else -1
|
||||||
|
|
||||||
|
self.__trackType = kwargs['trackType'] if 'trackType' in kwargs.keys() else TrackType.UNKNOWN
|
||||||
|
|
||||||
|
self.__trackTags = kwargs['tags'] if 'tags' in kwargs.keys() else {}
|
||||||
|
self.__dispositionSet = kwargs['dispositionSet'] if 'dispositionSet' in kwargs.keys() else set()
|
||||||
|
|
||||||
|
self.__audioLayout = kwargs['audioLayout'] if self.__trackType == TrackType.AUDIO and 'audioLayout' in kwargs.keys() else AudioLayout.LAYOUT_UNDEFINED
|
||||||
|
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def fromFfprobe(cls, streamObj):
|
||||||
|
"""Processes ffprobe stream data as array with elements according to the following example
|
||||||
|
{
|
||||||
|
"index": 4,
|
||||||
|
"codec_name": "hdmv_pgs_subtitle",
|
||||||
|
"codec_long_name": "HDMV Presentation Graphic Stream subtitles",
|
||||||
|
"codec_type": "subtitle",
|
||||||
|
"codec_tag_string": "[0][0][0][0]",
|
||||||
|
"codec_tag": "0x0000",
|
||||||
|
"r_frame_rate": "0/0",
|
||||||
|
"avg_frame_rate": "0/0",
|
||||||
|
"time_base": "1/1000",
|
||||||
|
"start_pts": 0,
|
||||||
|
"start_time": "0.000000",
|
||||||
|
"duration_ts": 1421035,
|
||||||
|
"duration": "1421.035000",
|
||||||
|
"disposition": {
|
||||||
|
"default": 1,
|
||||||
|
"dub": 0,
|
||||||
|
"original": 0,
|
||||||
|
"comment": 0,
|
||||||
|
"lyrics": 0,
|
||||||
|
"karaoke": 0,
|
||||||
|
"forced": 0,
|
||||||
|
"hearing_impaired": 0,
|
||||||
|
"visual_impaired": 0,
|
||||||
|
"clean_effects": 0,
|
||||||
|
"attached_pic": 0,
|
||||||
|
"timed_thumbnails": 0,
|
||||||
|
"non_diegetic": 0,
|
||||||
|
"captions": 0,
|
||||||
|
"descriptions": 0,
|
||||||
|
"metadata": 0,
|
||||||
|
"dependent": 0,
|
||||||
|
"still_image": 0
|
||||||
|
},
|
||||||
|
"tags": {
|
||||||
|
"language": "ger",
|
||||||
|
"title": "German Full"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
"""
|
||||||
|
|
||||||
|
trackType = TrackType.fromLabel(streamObj['codec_type']) if 'codec_type' in streamObj.keys() else TrackType.UNKNOWN
|
||||||
|
|
||||||
|
if trackType != TrackType.UNKNOWN:
|
||||||
|
|
||||||
|
return cls(trackType = trackType,
|
||||||
|
dispositionSet = {t for d in (k for (k,v) in streamObj[TrackDescriptor.FFPROBE_DISPOSITION_KEY].items() if v) if (t := TrackDisposition.find(d)) if t is not None} if TrackDescriptor.FFPROBE_DISPOSITION_KEY in streamObj.keys() else set(),
|
||||||
|
tags = streamObj[TrackDescriptor.FFPROBE_TAGS_KEY] if TrackDescriptor.FFPROBE_TAGS_KEY in streamObj.keys() else {},
|
||||||
|
audioLayout = AudioLayout.identify(streamObj) if trackType == TrackType.AUDIO.label() else AudioLayout.LAYOUT_UNDEFINED)
|
||||||
|
else:
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
def getLanguage(self):
|
||||||
|
if 'language' in self.__trackTags.keys():
|
||||||
|
return IsoLanguage.findThreeLetter(self.__trackTags['language'])
|
||||||
|
else:
|
||||||
|
return IsoLanguage.UNKNOWN
|
||||||
|
|
||||||
|
def getTitle(self):
|
||||||
|
if 'title' in self.__trackTags.keys():
|
||||||
|
return str(self.__trackTags['title'])
|
||||||
|
else:
|
||||||
|
return ''
|
||||||
|
|
||||||
|
def getAudioLayout(self):
|
||||||
|
return self.__audioLayout
|
||||||
|
|
||||||
|
|
||||||
|
def getTags(self):
|
||||||
|
return self.__trackTags
|
Loading…
Reference in New Issue