def test_roundtrip(self): ref_package = VodPackage(reference_xml) file_out = BytesIO() file_out.write(ref_package.write_xml()) file_out.seek(0) new_package = VodPackage(file_out) self.assertEqual(file_out.getvalue(), new_package.write_xml())
def test_failed_remove(self): vod_package = VodPackage(reference_xml) vod_package.remove_preview() with self.assertRaises(MissingElement): vod_package.remove_preview() vod_package.remove_poster() with self.assertRaises(MissingElement): vod_package.remove_poster()
def test_files_present(self): vod_package = VodPackage(reference_xml) self.assertFalse(vod_package.files_present()) vod_package.remove_poster() vod_package.remove_preview() vod_package.D_content["movie"] = reference_mp4 self.assertTrue(vod_package.files_present())
def test_dictionaries(self): vod_package = VodPackage(reference_xml) # Package self.assertEqual(vod_package.D_ams["package"], ams_package) self.assertEqual(vod_package.D_app["package"], app_package) # Title self.assertEqual(vod_package.D_ams["title"], ams_title) self.assertEqual(vod_package.D_app["title"], app_title) # Movie self.assertEqual(vod_package.D_ams["movie"], ams_movie) self.assertEqual(vod_package.D_app["movie"], app_movie) # Preview self.assertEqual(vod_package.D_ams["preview"], ams_preview) self.assertEqual(vod_package.D_app["preview"], app_preview) # Poster self.assertEqual(vod_package.D_ams["poster"], ams_poster) self.assertEqual(vod_package.D_app["poster"], app_poster)
def test_make_delete(self): vod_package = VodPackage(reference_xml) vod_package.make_delete() for ae_type in vod_package.D_ams: self.assertEqual(vod_package.D_ams[ae_type]["Verb"], "DELETE") self.assertTrue(vod_package.is_delete)
def test_overwrite_xml(self, mock_open): mock_open.return_value = MagicMock() file_handle = mock_open.return_value.__enter__.return_value vod_package = VodPackage(reference_xml) vod_package.overwrite_xml() file_handle.write.assert_called_once_with(vod_package.write_xml())
def test_missing_movie(self): vod_package = VodPackage(reference_xml) del vod_package.D_ams["movie"] with self.assertRaises(MissingElement): vod_package.write_xml()
def test_rewrite(self, mock_check_file): vod_package = VodPackage(reference_xml) vod_package.write_xml(rewrite=True) mock_check_file.assert_called_once_with(vod_package)
def generate_metadata( file_path, vod_config, template_path=default_template_path ): # Time-sensitive values timestamp = datetime.datetime.today() creation_date = timestamp.strftime("%Y-%m-%d") end_date = (timestamp + datetime.timedelta(days=999)).strftime("%Y-%m-%d") asset_id = timestamp.strftime("%Y%m%d%H%M") # Randomly-generated values suffix = format(random.randint(0, 9999), "04") title_billing_id = "{}B".format(suffix) # Start with a minimal metadata template vod_package = VodPackage(template_path, vod_config=vod_config) file_name = os.path.splitext(os.path.split(file_path)[1])[0] short_name = file_name[:20] outfile_path = "{}_{}.xml".format(file_name, suffix) vod_package.xml_path = os.path.join(os.getcwd(), outfile_path) # File-specific values: looks for a preview of the same type as the movie, # and a poster / box cover with a suitable extension. movie_name, movie_ext = os.path.splitext(file_path) vod_package.D_content["movie"] = file_path has_preview = _set_ae(vod_package, movie_name, "preview", [movie_ext]) has_poster = _set_ae(vod_package, movie_name, "poster", IMAGE_EXTENSIONS) has_box_cover = _set_ae( vod_package, movie_name, "box cover", IMAGE_EXTENSIONS ) vod_package.check_files() # Package section package_asset_name = "{} {} (package)".format(short_name, suffix) package_description = "{} {} (package asset)".format(short_name, suffix) package_asset_id = "{}P{}{}".format(vod_config.prefix, asset_id, suffix) vod_package.D_ams["package"].update( { "Provider": vod_config.provider, "Product": vod_config.product, "Asset_Name": package_asset_name, "Version_Major": '1', "Version_Minor": '0', "Description": package_description, "Creation_Date": creation_date, "Provider_ID": vod_config.provider_id, "Asset_ID": package_asset_id, "Asset_Class": "package" } ) vod_package.D_app["package"].update( {"Metadata_Spec_Version": "CableLabsVOD1.1"} ) # Title section title_asset_name = "{} {} (title)".format(short_name, suffix) title_description = "{} {} (title asset)".format(short_name, suffix) title_asset_id = "{}T{}{}".format(vod_config.prefix, asset_id, suffix) title_title_brief = "{} {}".format(file_name[:14], suffix) title_title = "{} {}".format(file_name[:124], suffix) vod_package.D_ams["title"].update( { "Provider": vod_config.provider, "Product": vod_config.product, "Asset_Name": title_asset_name, "Version_Major": '1', "Version_Minor": '0', "Description": title_description, "Creation_Date": creation_date, "Provider_ID": vod_config.provider_id, "Asset_ID": title_asset_id, "Asset_Class": "title" } ) vod_package.D_app["title"].update( { "Type": "title", "Title_Brief": title_title_brief, "Title": title_title, "Summary_Short": title_title, "Rating": ["NR"], "Closed_Captioning": 'N', "Year": timestamp.strftime("%Y"), "Category": [vod_config.title_category], "Genre": ["Other"], "Show_Type": "Other", "Billing_ID": title_billing_id, "Licensing_Window_Start": creation_date, "Licensing_Window_End": end_date, "Preview_Period": "300", "Provider_QA_Contact": "N/A" } ) # Movie section movie_asset_name = "{} {} (movie)".format(short_name, suffix) movie_description = "{} {} (movie asset)".format(short_name, suffix) movie_asset_id = "{}M{}{}".format(vod_config.prefix, asset_id, suffix) vod_package.D_ams["movie"].update( { "Provider": vod_config.provider, "Product": vod_config.product, "Asset_Name": movie_asset_name, "Version_Major": '1', "Version_Minor": '0', "Description": movie_description, "Creation_Date": creation_date, "Provider_ID": vod_config.provider_id, "Asset_ID": movie_asset_id, "Asset_Class": "movie" } ) vod_package.D_app["movie"].update({"Type": "movie"}) # Preview section if has_preview: preview_asset_name = "{} {} (preview)".format(short_name, suffix) preview_description = "{} {} (preview asset)".format( short_name, suffix ) preview_asset_id = "{}R{}{}".format( vod_config.prefix, asset_id, suffix ) vod_package.D_ams["preview"].update( { "Provider": vod_config.provider, "Product": vod_config.product, "Asset_Name": preview_asset_name, "Version_Major": '1', "Version_Minor": '0', "Description": preview_description, "Creation_Date": creation_date, "Provider_ID": vod_config.provider_id, "Asset_ID": preview_asset_id, "Asset_Class": "preview" } ) vod_package.D_app["preview"].update( {"Type": "preview", "Rating": ["NR"]} ) if has_poster: poster_asset_name = "{} {} (poster)".format(short_name, suffix) poster_description = "{} {} (poster asset)".format(short_name, suffix) poster_asset_id = "{}I{}{}".format(vod_config.prefix, asset_id, suffix) vod_package.D_ams["poster"].update( { "Provider": vod_config.provider, "Product": vod_config.product, "Asset_Name": poster_asset_name, "Version_Major": '1', "Version_Minor": '0', "Description": poster_description, "Creation_Date": creation_date, "Provider_ID": vod_config.provider_id, "Asset_ID": poster_asset_id, "Asset_Class": "poster" } ) vod_package.D_app["poster"].update({"Type": "poster"}) if has_box_cover: box_cover_asset_name = "{} {} (box cover)".format(short_name, suffix) box_cover_description = "{} {} (box cover asset)".format( short_name, suffix ) box_cover_asset_id = "{}B{}{}".format( vod_config.prefix, asset_id, suffix ) vod_package.D_ams["box cover"].update( { "Provider": vod_config.provider, "Product": vod_config.product, "Asset_Name": box_cover_asset_name, "Version_Major": '1', "Version_Minor": '0', "Description": box_cover_description, "Creation_Date": creation_date, "Provider_ID": vod_config.provider_id, "Asset_ID": box_cover_asset_id, "Asset_Class": "box cover" } ) vod_package.D_app["box cover"].update({"Type": "box cover"}) return vod_package
def test_make_update(self): vod_package = VodPackage(reference_xml) vod_package.make_update() for ae_type in vod_package.D_ams: self.assertEqual(vod_package.D_ams[ae_type]["Version_Major"], "2") self.assertTrue(vod_package.is_update)
def test_make_update(self): vod_package = VodPackage(reference_xml) vod_package.make_update() for ae_type in vod_package.D_ams: self.assertEqual(vod_package.D_ams[ae_type]["Version_Major"], '2') self.assertTrue(vod_package.is_update)
def generate_metadata(file_path, vod_config, template_path=default_template_path, timestamp=None): # Time-sensitive values timestamp = datetime.datetime.today() if timestamp is None else timestamp creation_date = timestamp.strftime("%Y-%m-%d") end_date = (timestamp + datetime.timedelta(days=999)).strftime("%Y-%m-%d") asset_id = timestamp.strftime("%Y%m%d%H%M") # Randomly-generated values suffix = format(random.randint(0, 9999), "04") title_billing_id = "{}B".format(suffix) # Start with a minimal metadata template vod_package = VodPackage(template_path, vod_config=vod_config) file_name = os.path.splitext(os.path.split(file_path)[1])[0] short_name = file_name[:20] outfile_path = "{}_{}.xml".format(file_name, suffix) vod_package.xml_path = os.path.join(os.getcwd(), outfile_path) # File-specific values: looks for a preview of the same type as the movie, # and a poster / box cover with a suitable extension. movie_name, movie_ext = os.path.splitext(file_path) vod_package.D_content["movie"] = file_path has_preview = _set_ae(vod_package, movie_name, "preview", [movie_ext]) has_poster = _set_ae(vod_package, movie_name, "poster", IMAGE_EXTENSIONS) has_box_cover = _set_ae(vod_package, movie_name, "box cover", IMAGE_EXTENSIONS) vod_package.check_files() # Package section package_asset_name = "{} {} (package)".format(short_name, suffix) package_description = "{} {} (package asset)".format(short_name, suffix) package_asset_id = "{}P{}{}".format(vod_config.prefix, asset_id, suffix) vod_package.D_ams["package"].update({ "Provider": vod_config.provider, "Product": vod_config.product, "Asset_Name": package_asset_name, "Version_Major": '1', "Version_Minor": '0', "Description": package_description, "Creation_Date": creation_date, "Provider_ID": vod_config.provider_id, "Asset_ID": package_asset_id, "Asset_Class": "package" }) vod_package.D_app["package"].update( {"Metadata_Spec_Version": "CableLabsVOD1.1"}) # Title section title_asset_name = "{} {} (title)".format(short_name, suffix) title_description = "{} {} (title asset)".format(short_name, suffix) title_asset_id = "{}T{}{}".format(vod_config.prefix, asset_id, suffix) title_title_brief = "{} {}".format(file_name[:14], suffix) title_title = "{} {}".format(file_name[:124], suffix) vod_package.D_ams["title"].update({ "Provider": vod_config.provider, "Product": vod_config.product, "Asset_Name": title_asset_name, "Version_Major": '1', "Version_Minor": '0', "Description": title_description, "Creation_Date": creation_date, "Provider_ID": vod_config.provider_id, "Asset_ID": title_asset_id, "Asset_Class": "title" }) vod_package.D_app["title"].update({ "Type": "title", "Title_Brief": title_title_brief, "Title": title_title, "Summary_Short": title_title, "Rating": ["NR"], "Closed_Captioning": 'N', "Year": timestamp.strftime("%Y"), "Category": [vod_config.title_category], "Genre": ["Other"], "Show_Type": "Other", "Billing_ID": title_billing_id, "Licensing_Window_Start": creation_date, "Licensing_Window_End": end_date, "Preview_Period": "300", "Provider_QA_Contact": "N/A" }) # Movie section movie_asset_name = "{} {} (movie)".format(short_name, suffix) movie_description = "{} {} (movie asset)".format(short_name, suffix) movie_asset_id = "{}M{}{}".format(vod_config.prefix, asset_id, suffix) vod_package.D_ams["movie"].update({ "Provider": vod_config.provider, "Product": vod_config.product, "Asset_Name": movie_asset_name, "Version_Major": '1', "Version_Minor": '0', "Description": movie_description, "Creation_Date": creation_date, "Provider_ID": vod_config.provider_id, "Asset_ID": movie_asset_id, "Asset_Class": "movie" }) vod_package.D_app["movie"].update({"Type": "movie"}) # Preview section if has_preview: preview_asset_name = "{} {} (preview)".format(short_name, suffix) preview_description = "{} {} (preview asset)".format( short_name, suffix) preview_asset_id = "{}R{}{}".format(vod_config.prefix, asset_id, suffix) vod_package.D_ams["preview"].update({ "Provider": vod_config.provider, "Product": vod_config.product, "Asset_Name": preview_asset_name, "Version_Major": '1', "Version_Minor": '0', "Description": preview_description, "Creation_Date": creation_date, "Provider_ID": vod_config.provider_id, "Asset_ID": preview_asset_id, "Asset_Class": "preview" }) vod_package.D_app["preview"].update({ "Type": "preview", "Rating": ["NR"] }) if has_poster: poster_asset_name = "{} {} (poster)".format(short_name, suffix) poster_description = "{} {} (poster asset)".format(short_name, suffix) poster_asset_id = "{}I{}{}".format(vod_config.prefix, asset_id, suffix) vod_package.D_ams["poster"].update({ "Provider": vod_config.provider, "Product": vod_config.product, "Asset_Name": poster_asset_name, "Version_Major": '1', "Version_Minor": '0', "Description": poster_description, "Creation_Date": creation_date, "Provider_ID": vod_config.provider_id, "Asset_ID": poster_asset_id, "Asset_Class": "poster" }) vod_package.D_app["poster"].update({"Type": "poster"}) if has_box_cover: box_cover_asset_name = "{} {} (box cover)".format(short_name, suffix) box_cover_description = "{} {} (box cover asset)".format( short_name, suffix) box_cover_asset_id = "{}B{}{}".format(vod_config.prefix, asset_id, suffix) vod_package.D_ams["box cover"].update({ "Provider": vod_config.provider, "Product": vod_config.product, "Asset_Name": box_cover_asset_name, "Version_Major": '1', "Version_Minor": '0', "Description": box_cover_description, "Creation_Date": creation_date, "Provider_ID": vod_config.provider_id, "Asset_ID": box_cover_asset_id, "Asset_Class": "box cover" }) vod_package.D_app["box cover"].update({"Type": "box cover"}) return vod_package