Open3

python-pptx調査

to_obarato_obara

python-pptxというライブラリがある。これを利用して、スライドに音声を埋め込みたいが、現状動画のみが想定されている。
SlideShapes.add_movie
音声埋め込みができるのか、その方法とはどのようにすれば良いのだろうか、といった点に着目して調べてみる。

to_obarato_obara

まずは、add_movieのソースを確認する。

        movie_pic = _MoviePicElementCreator.new_movie_pic(
            self,
            self._next_shape_id,
            movie_file,
            left,
            top,
            width,
            height,
            poster_frame_image,
            mime_type,
        )
        self_spTree.append(movie_pic)
        self._add_video_timing(movie_pic)
        return self._shape_factory(movie_pic)

となっているので、内容を一つずつ確認してみる。

to_obarato_obara

_MoviePicElementCreatorについては、同じファイルに定義されている

class _MoviePicElementCreator(object):
    @classmethod
    def new_movie_pic(
        cls, shapes, shape_id, movie_file, x, y, cx, cy, poster_frame_image, mime_type
    ):
        return cls(
            shapes, shape_id, movie_file, x, y, cx, cy, poster_frame_image, mime_type
        )._pic
        return

コンストラクタでは単に初期化、メンバへ設定しているだけ

    def __init__(
        self, shapes, shape_id, movie_file, x, y, cx, cy, poster_frame_file, mime_type
    ):
        super(_MoviePicElementCreator, self).__init__()
        self._shapes = shapes
        self._shape_id = shape_id
        self._movie_file = movie_file
        self._x, self._y, self._cx, self._cy = x, y, cx, cy
        self._poster_frame_file = poster_frame_file
        self._mime_type = mime_type

_picについてはプロパティで設定されている

    @lazyproperty
    def _pic(self):
        """Return the new `p:pic` element referencing the video."""
        return CT_Picture.new_video_pic(
            self._shape_id,
            self._shape_name,
            self._video_rId,
            self._media_rId,
            self._poster_frame_rId,
            self._x,
            self._y,
            self._cx,
            self._cy,
        )

さらに

class CT_Picture(BaseShapeElement):
    @classmethod
    def new_video_pic(
        cls, shape_id, shape_name, video_rId, media_rId, poster_frame_rId, x, y, cx, cy
    ):
        """Return a new `p:pic` populated with the specified video."""
        return parse_xml(
            cls._pic_video_tmpl()
            % (
                shape_id,
                shape_name,
                video_rId,
                media_rId,
                poster_frame_rId,
                x,
                y,
                cx,
                cy,
            )
        )