예제 #1
0
 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())
예제 #4
0
    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()
예제 #5
0
 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_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_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)
예제 #9
0
 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()
예제 #11
0
 def test_missing_movie(self):
     vod_package = VodPackage(reference_xml)
     del vod_package.D_ams["movie"]
     with self.assertRaises(MissingElement):
         vod_package.write_xml()
예제 #12
0
 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 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)
예제 #14
0
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_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())
예제 #16
0
 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)
예제 #18
0
 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)
예제 #19
0
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