105 lines
3.6 KiB
Python
105 lines
3.6 KiB
Python
|
import isodate
|
||
|
|
||
|
def get_mpd_list(mpd):
|
||
|
def get_height(width, height):
|
||
|
if width == '1920':
|
||
|
return '1080'
|
||
|
elif width in ('1280', '1248'):
|
||
|
return '720'
|
||
|
else:
|
||
|
return height
|
||
|
|
||
|
length = isodate.parse_duration(mpd['MPD']['@mediaPresentationDuration']).total_seconds()
|
||
|
period = mpd['MPD']['Period']
|
||
|
base_url = period['BaseURL']
|
||
|
tracks = period['AdaptationSet']
|
||
|
|
||
|
video_list = []
|
||
|
for video_tracks in tracks:
|
||
|
if video_tracks['@mimeType'] == 'video/mp4':
|
||
|
for x in video_tracks['Representation']:
|
||
|
try:
|
||
|
codecs = x['@codecs']
|
||
|
except KeyError:
|
||
|
codecs = video_tracks['@codecs']
|
||
|
|
||
|
videoDict = {
|
||
|
'Height':get_height(x['@width'], x['@height']),
|
||
|
'Width':x['@width'],
|
||
|
'Bandwidth':x['@bandwidth'],
|
||
|
'ID':x['@id'],
|
||
|
'Codec':codecs}
|
||
|
video_list.append(videoDict)
|
||
|
|
||
|
def list_representation(x):
|
||
|
if isinstance(x['Representation'], list):
|
||
|
X = x['Representation']
|
||
|
else:
|
||
|
X = [x['Representation']]
|
||
|
return X
|
||
|
|
||
|
def replace_code_lang(x):
|
||
|
X = x.replace('es', 'es-la').replace('en', 'es-la')
|
||
|
return X
|
||
|
|
||
|
audio_list = []
|
||
|
for audio_tracks in tracks:
|
||
|
if audio_tracks['@mimeType'] == 'audio/mp4':
|
||
|
for x in list_representation(audio_tracks):
|
||
|
try:
|
||
|
codecs = x['@codecs']
|
||
|
except KeyError:
|
||
|
codecs = audio_tracks['@codecs']
|
||
|
audio_dict = {
|
||
|
'Bandwidth':x['@bandwidth'],
|
||
|
'ID':x['@id'],
|
||
|
'Language':audio_tracks["@lang"],
|
||
|
'Codec':codecs}
|
||
|
audio_list.append(audio_dict)
|
||
|
|
||
|
subs_list = []
|
||
|
for subs_tracks in tracks:
|
||
|
if subs_tracks['@mimeType'] == 'text/vtt':
|
||
|
for x in list_representation(subs_tracks):
|
||
|
subs_dict = {
|
||
|
'ID':x['@id'],
|
||
|
'Language':replace_code_lang(subs_tracks["@lang"]),
|
||
|
'Codec':subs_tracks['@mimeType'],
|
||
|
'File_URL':base_url + x['BaseURL'].replace('../', '')}
|
||
|
subs_list.append(subs_dict)
|
||
|
|
||
|
return length, video_list, audio_list, subs_list
|
||
|
|
||
|
def get_ism_list(ism):
|
||
|
length = float(ism['SmoothStreamingMedia']['@Duration'][:-7])
|
||
|
tracks = ism['SmoothStreamingMedia']["StreamIndex"]
|
||
|
|
||
|
video_list = []
|
||
|
for video_tracks in tracks:
|
||
|
if video_tracks['@Type'] == 'video':
|
||
|
for x in video_tracks['QualityLevel']:
|
||
|
videoDict = {
|
||
|
'Height':x['@MaxHeight'],
|
||
|
'Width':x['@MaxWidth'],
|
||
|
'ID':'0',
|
||
|
'Bandwidth':x['@Bitrate'],
|
||
|
'Codec':x["@FourCC"]}
|
||
|
video_list.append(videoDict)
|
||
|
|
||
|
def replace_code_lang(x):
|
||
|
X = x.replace('255', 'es-la')
|
||
|
return X
|
||
|
|
||
|
audio_list = []
|
||
|
for audio_tracks in tracks:
|
||
|
if audio_tracks['@Type'] == 'audio':
|
||
|
for x in audio_tracks["QualityLevel"]:
|
||
|
audio_dict = {
|
||
|
'Bandwidth':x['@Bitrate'],
|
||
|
'ID':'0',
|
||
|
'Language':replace_code_lang(x["@AudioTag"]),
|
||
|
'Codec':x["@FourCC"]}
|
||
|
audio_list.append(audio_dict)
|
||
|
|
||
|
return length, video_list, audio_list, []
|