gnm_deliverables/inmeta.py (98 lines of code) (raw):
from .models import DeliverableAsset
import xml.etree.cElementTree as ET
import os.path
import logging
import re
from datetime import datetime
logger = logging.getLogger(__name__)
def field(parent:ET.Element,name:str,value:str):
"""
private function to output a single meta line
:param parent:
:param name:
:param value:
:return:
"""
valueToOutput = value
if valueToOutput is None:
valueToOutput = ""
ET.SubElement(parent,"meta",{"name":name,"value":valueToOutput})
def find_free_filepath(output_dir:str, filebase:str)->str:
"""
finds the first non-existing filepath
:param output_dir:
:param filebase:
:return:
"""
i=0
while True:
if i==0:
prefix = ""
else:
prefix = "{0}-".format(i)
filepath = os.path.join(output_dir, "{0}{1}.inmeta".format(prefix,filebase))
if not os.path.exists(filepath):
return filepath
i+=1
def inmeta_to_string(asset:DeliverableAsset, platform:str)->str:
content = make_doc(asset, platform)
if content is None:
logger.error("Could not make content doc?")
raise RuntimeError("Could not make content doc")
if asset.online_item_id:
safe_filename = asset.online_item_id
elif asset.nearline_item_id:
safe_filename = asset.nearline_item_id
else:
safe_filename = re.sub(r'\s+',"_", asset.filename)
if safe_filename == "":
logger.error("Could not determine a filename for asset {0} - no online id, nearline id or filename available!".format(asset.id))
raise ValueError("Could not determine a filename")
xml_content = ET.tostring(content, "UTF-8")
if isinstance(xml_content, bytes):
return xml_content.decode("UTF-8")
else:
return xml_content
def make_doc(asset:DeliverableAsset, platform:str) -> ET.Element:
"""
create an ElementTree document that represents the given asset as inmeta
:param asset: DeliverableAsset instance
:return: populate ElementTree
"""
rootEl = ET.Element("meta-data")
moveInfoEl = ET.SubElement(rootEl, "meta-movie-info")
ET.SubElement(moveInfoEl, "meta-movie", {"tokens":"format duration bitrate size tracks"})
ET.SubElement(moveInfoEl, "meta-track", {"tokens": "type format start duration bitrate size"})
ET.SubElement(moveInfoEl, "meta-video-track", {"tokens": "width height framerate"})
ET.SubElement(moveInfoEl, "meta-audio-track", {"tokens": "channels bitspersample samplerate"})
ET.SubElement(moveInfoEl, "meta-hint-track", {"tokens": "payload fmtp"})
groupEl = ET.SubElement(rootEl, "meta-group", {"type":"movie meta"})
field(groupEl, "itemId", asset.online_item_id)
field(groupEl, "title", os.path.basename(asset.filename))
field(groupEl, 'size', str(asset.size))
if asset.changed_dt:
timeString = asset.changed_dt.isoformat('T')
else:
timeString = datetime.now().isoformat("T")
field(groupEl, "created", timeString)
if asset.duration_seconds is not None:
field(groupEl, "durationSeconds", str(asset.duration_seconds))
if asset.version is not None:
field(groupEl, "version", str(asset.version))
field(groupEl, "pluto_deliverables_asset_id", str(asset.id))
field(groupEl, "pluto_deliverables_project_id", str(asset.deliverable.pluto_core_project_id))
field(groupEl, "pluto_deliverables_platform", platform)
if asset.gnm_website_master:
field(groupEl, "gnm_website_headline", asset.gnm_website_master.website_title)
field(groupEl, "gnm_website_standfirst", asset.gnm_website_master.website_title)
field(groupEl, "gnm_website_trail", asset.gnm_website_master.website_description)
field(groupEl, "gnm_master_website_primary_tone", asset.gnm_website_master.primary_tone)
#field(groupEl, "", asset.gnm_website_master.tags)
field(groupEl, "gnm_master_generic_production_office", asset.gnm_website_master.production_office)
field(groupEl, "gnm_master_website_publication_status", asset.gnm_website_master.publication_status)
field(groupEl, "gnm_master_mediaatom_atomid", str(asset.gnm_website_master.media_atom_id))
if asset.DailyMotion_master:
if asset.DailyMotion_master.daily_motion_tags:
kw = ",".join(asset.DailyMotion_master.daily_motion_tags)
field(groupEl, "gnm_master_dailymotion_keywords", kw)
field(groupEl, "gnm_master_dailymotion_owner", "The Guardian")
field(groupEl, "gnm_master_dailymotion_status", asset.DailyMotion_master.upload_status)
field(groupEl, "gnm_master_dailymotion_dailymotionurl", asset.DailyMotion_master.daily_motion_url)
field(groupEl, "gnm_master_dailymotion_dailymotioncategory","{0}".format(asset.DailyMotion_master.daily_motion_category))
field(groupEl, "gnm_master_dailymotion_author","The Guardian")
field(groupEl, "gnm_master_dailymotion_description", asset.DailyMotion_master.daily_motion_description)
field(groupEl, "gnm_master_dailymotion_title", asset.DailyMotion_master.daily_motion_title)
field(groupEl, "gnm_master_dailymotion_uploadstatus", asset.DailyMotion_master.upload_status)
field(groupEl, "gnm_master_dailymotion_nomobile", "{0}".format(asset.DailyMotion_master.daily_motion_no_mobile_access))
field(groupEl, "gnm_master_dailymotion_adult_content", "{0}".format(asset.DailyMotion_master.daily_motion_contains_adult_content))
if asset.mainstream_master:
field(groupEl, "gnm_master_mainstreamsyndication_title", asset.mainstream_master.mainstream_title)
if asset.mainstream_master.mainstream_tags:
kw = ",".join(asset.mainstream_master.mainstream_tags)
field(groupEl, "gnm_master_mainstreamsyndication_keywords", kw)
field(groupEl, "gnm_master_mainstreamsyndication_description", asset.mainstream_master.mainstream_description)
field(groupEl, "gnm_master_mainstreamsyndication_author", "The Guardian")
field(groupEl, "gnm_master_mainstreamsyndication_publish", "")
field(groupEl, "gnm_master_mainstreamsyndication_remove", "")
return rootEl