partnercenter/azext_partnercenter/clients/listing_media_client.py (193 lines of code) (raw):

# -------------------------------------------------------------------------------------------- # Copyright (c) Microsoft Corporation. All rights reserved. # Licensed under the MIT License. See License.txt in the project root for license information. # -------------------------------------------------------------------------------------------- # pylint: disable=line-too-long # pylint: disable=protected-access # pylint: disable=too-many-positional-arguments from azext_partnercenter.models.listing_image import ListingImage from azext_partnercenter.models.listing_video import ListingVideo from azext_partnercenter.clients.offer_listing_client import OfferListingClient from azext_partnercenter.clients.offer_client import OfferClient from azext_partnercenter.vendored_sdks.v1.partnercenter.apis import ( ProductClient, VariantClient, ListingImageClient, ListingVideoClient) from azext_partnercenter.vendored_sdks.v1.partnercenter.model.microsoft_ingestion_api_models_listings_listing_image import ( MicrosoftIngestionApiModelsListingsListingImage) from azext_partnercenter.vendored_sdks.v1.partnercenter.model.microsoft_ingestion_api_models_listings_listing_video import ( MicrosoftIngestionApiModelsListingsListingVideo) from azext_partnercenter.vendored_sdks.v1.partnercenter.model.microsoft_ingestion_api_models_listings_listing_video_thumbnail import ( MicrosoftIngestionApiModelsListingsListingVideoThumbnail) from ._client_factory import get_api_client class ListingMediaClient: def __init__(self, cli_ctx, *_): self._api_client = get_api_client(cli_ctx, *_) self._plan_listing_client = OfferListingClient(cli_ctx, *_) self._offer_client = OfferClient(cli_ctx, *_) self._product_client = ProductClient(self._api_client) self._variant_client = VariantClient(self._api_client) self._listing_image_client = ListingImageClient(self._api_client) self._listing_video_client = ListingVideoClient(self._api_client) def get_listing_videos(self, offer_external_id): offer = self._offer_client.get(offer_external_id) if offer is None: return None offer_resource_id = offer.resource.durable_id listing = self._offer_client.get_listing(offer_external_id) if listing is None: return None listing_resource_id = listing._resource.durable_id videos = self._listing_video_client.products_product_id_listings_listing_id_videos_get( offer_resource_id, listing_resource_id, self._get_authorication_token(), expand="$expand=FileSasUri") return self._map_videos(videos) def get_listing_images(self, offer_external_id): offer = self._offer_client.get(offer_external_id) if offer is None: return None offer_resource_id = offer.resource.durable_id listing = self._offer_client.get_listing(offer_external_id) if listing is None: return None listing_resource_id = listing._resource.durable_id images = self._listing_image_client.products_product_id_listings_listing_id_images_get( offer_resource_id, listing_resource_id, self._get_authorication_token(), expand="$expand=FileSasUri") return self._map_images(images) def delete_listing_image(self, offer_external_id, image_type): offer = self._offer_client.get(offer_external_id) if offer is None: return None offer_resource_id = offer.resource.durable_id listing = self._offer_client.get_listing(offer_external_id) if listing is None: return None listing_resource_id = listing._resource.durable_id images = self._listing_image_client.products_product_id_listings_listing_id_images_get( offer_resource_id, listing_resource_id, self._get_authorication_token(), expand="$expand=FileSasUri") deleted_ids = [] for _, x in enumerate(images.value): cur_listing_image = self._map_image(x) if cur_listing_image.type == image_type: image_id = cur_listing_image.id self._listing_image_client.products_product_id_listings_listing_id_images_image_id_delete( offer_resource_id, listing_resource_id, image_id, self._get_authorication_token()) deleted_ids.append(image_id) return deleted_ids def add_listing_video(self, offer_external_id, file_path, streaming_uri): import ntpath file = ntpath.basename(file_path) offer = self._offer_client.get(offer_external_id) if offer is None: return None offer_resource_id = offer.resource.durable_id listing = self._offer_client.get_listing(offer_external_id) if listing is None: return None listing_resource_id = listing._resource.durable_id file_name = self._get_file_name(file) # offer_resource_id, listing_resource_id, streaming_uri, video_type, file_name, title title = file_name posted_video = self._post_video(offer_resource_id, listing_resource_id, streaming_uri, file_name, title) file_sas_uri = posted_video.thumbnail_file_sas_uri self._upload_media(file_path, file_sas_uri) return self._put_video(offer_resource_id, listing_resource_id, posted_video) def add_listing_image(self, offer_external_id, image_type, file_path): import ntpath file = ntpath.basename(file_path) offer = self._offer_client.get(offer_external_id) if offer is None: return None offer_resource_id = offer.resource.durable_id listing = self._offer_client.get_listing(offer_external_id) if listing is None: return None listing_resource_id = listing._resource.durable_id file_name = self._get_file_name(file) listing_image = self._post_image(offer_resource_id, listing_resource_id, image_type, file_name) file_sas_uri = listing_image.file_sas_uri self._upload_media(file_path, file_sas_uri) return self._put_image(offer_resource_id, listing_resource_id, listing_image) def _put_image(self, offer_resource_id, listing_resource_id, image: ListingImage): state = "Uploaded" resource_type = "ListingImage" order = 0 listing_image = MicrosoftIngestionApiModelsListingsListingImage( resource_type=resource_type, file_name=image.file_name, type=image.type, state=state, order=order, file_sas_uri=image.file_sas_uri, id=image.id, odata_etag=image.odata_etag) result = self._listing_image_client.products_product_id_listings_listing_id_images_image_id_put( offer_resource_id, listing_resource_id, image.id, self._get_authorication_token(), microsoft_ingestion_api_models_listings_listing_image=listing_image) return self._map_image(result) def _put_video(self, offer_resource_id, listing_resource_id, video: ListingVideo): state = "Uploaded" resource_type = "ListingVideo" listing_video_thumbnail = MicrosoftIngestionApiModelsListingsListingVideoThumbnail( file_name=video.thumbnail_file_name, title=video.thumbnail_title, state=state, file_sas_uri=video.thumbnail_file_sas_uri, odata_etag=video.odata_etag) listed_video = MicrosoftIngestionApiModelsListingsListingVideo( id=video.id, resource_type=resource_type, streaming_uri=video.streaming_uri, state=state, thumbnail=listing_video_thumbnail) result = self._listing_video_client.products_product_id_listings_listing_id_videos_video_id_put( offer_resource_id, listing_resource_id, video.id, self._get_authorication_token(), microsoft_ingestion_api_models_listings_listing_video=listed_video) return self._map_video(result) def _post_video(self, offer_resource_id, listing_resource_id, streaming_uri, file_name, title): state = "PendingUpload" resource_type = "ListingVideo" listing_video_thumbnail = MicrosoftIngestionApiModelsListingsListingVideoThumbnail(file_name=file_name, title=title, state=state) listed_video = MicrosoftIngestionApiModelsListingsListingVideo(resource_type=resource_type, streaming_uri=streaming_uri, state=state, thumbnail=listing_video_thumbnail) result = self._listing_video_client.products_product_id_listings_listing_id_videos_post(offer_resource_id, listing_resource_id, self._get_authorication_token(), microsoft_ingestion_api_models_listings_listing_video=listed_video) return self._map_video(result) def _post_image(self, offer_resource_id, listing_resource_id, image_type, file_name): state = "PendingUpload" resource_type = "ListingImage" order = 0 listing_image = MicrosoftIngestionApiModelsListingsListingImage(resource_type=resource_type, file_name=file_name, type=image_type, state=state, order=order) result = self._listing_image_client.products_product_id_listings_listing_id_images_post(offer_resource_id, listing_resource_id, self._get_authorication_token(), microsoft_ingestion_api_models_listings_listing_image=listing_image) return self._map_image(result) def _upload_media(self, upload_file_path, file_sas_uri): from azure.storage.blob import BlobClient blob_client = BlobClient.from_blob_url(file_sas_uri) with open(upload_file_path, 'rb') as data: result = blob_client.upload_blob(data) return result def _get_file_name(self, file): return file def _map_images(self, images): return list(map(self._map_image, images.value)) def _map_image(self, image): listing_image = ListingImage(fileName=image.file_name, type=image.type, fileSasUri=image.file_sas_uri if hasattr(image, 'file_sas_uri') else '', state=image.state, order=image.order, odata_etag=image.odata_etag, id=image.id) return listing_image def _map_videos(self, videos): return list(map(self._map_video, videos.value)) def _map_video(self, video): listed_video = ListingVideo(type=video.resource_type, thumbnailFileName=video.thumbnail.file_name, thumbnailFileSasUri=video.thumbnail.file_sas_uri, thumbnailState=video.thumbnail.state, thumbnailTitle=video.thumbnail.title, streamingUri=video.streaming_uri, odata_etag=video.odata_etag, id=video.id) return listed_video def _get_authorication_token(self): return self._api_client.configuration.access_token