aiogram/docs/utils/media_group.rst
Виталий 24fdd285fd Apply suggestions from code review
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2026-03-05 21:14:31 +03:00

103 lines
3.6 KiB
ReStructuredText

===================
Media group
===================
This module provides tools for media groups.
Building media groups
=====================
Media group builder can be used to build media groups
for :class:`aiogram.types.input_media_photo.InputMediaPhoto`, :class:`aiogram.types.input_media_video.InputMediaVideo`,
:class:`aiogram.types.input_media_document.InputMediaDocument` and :class:`aiogram.types.input_media_audio.InputMediaAudio`.
.. warning::
:class:`aiogram.types.input_media_animation.InputMediaAnimation`
is not supported yet in the Bot API to send as media group.
Usage
=====
.. code-block:: python
media_group = MediaGroupBuilder(caption="Media group caption")
# Add photo
media_group.add_photo(media="https://picsum.photos/200/300")
# Dynamically add photo with known type without using separate method
media_group.add(type="photo", media="https://picsum.photos/200/300")
# ... or video
media_group.add(type="video", media=FSInputFile("media/video.mp4"))
To send media group use :meth:`aiogram.methods.send_media_group.SendMediaGroup` method,
but when you use :class:`aiogram.utils.media_group.MediaGroupBuilder`
you should pass ``media`` argument as ``media_group.build()``.
If you specify ``caption`` in :class:`aiogram.utils.media_group.MediaGroupBuilder`
it will be used as ``caption`` for first media in group.
.. code-block:: python
await bot.send_media_group(chat_id=chat_id, media=media_group.build())
Handling media groups
======================
By default each media in the group is processed separately.
You can use :class:`aiogram.dispatcher.middlewares.media_group.MediaGroupAggregatorMiddleware`
to process media groups as one. If you do, only one message from the group will be processed, and updates for
other messages with the same media group ID will be suppressed. There are two options to store media groups:
- :class:`aiogram.dispatcher.middlewares.media_group.MemoryMediaGroupAggregator` - simple in-memory storage, used by default
- :class:`aiogram.dispatcher.middlewares.media_group.RedisMediaGroupAggregator` - support distributed environment
You also can use :class:`aiogram.filters.media_group.MediaGroupFilter`
to filter media groups.
Usage
-----
.. code-block:: python
from aiogram import F
from aiogram.types import Message
# register middleware
from aiogram.dispatcher.middlewares.media_group import MediaGroupAggregatorMiddleware
from aiogram.filters import MediaGroupFilter
router.message.outer_middleware(MediaGroupAggregatorMiddleware())
# use middleware
@router.message(
MediaGroupFilter(max_media_count=5),
F.caption == "album_caption" # other filters will be applied to the first message in the group
)
async def start(message: Message, album: list[Message]):
# message is the first media in this group
# album is list of all messages with the same mediaGroupId, including current message
await message.answer(
f"You sent {len(album)} media in the group. "
f"Media group ID: {message.media_group_id}. "
f"Album messages: {', '.join(str(m.message_id) for m in album)}"
)
References
==========
.. autoclass:: aiogram.utils.media_group.MediaGroupBuilder
:members:
.. autoclass:: aiogram.dispatcher.middlewares.media_group.MediaGroupAggregatorMiddleware
:members:
.. autoclass:: aiogram.filters.media_group.MediaGroupFilter
:members:
.. autoclass:: aiogram.dispatcher.middlewares.media_group.MemoryMediaGroupAggregator
:members:
.. autoclass:: aiogram.dispatcher.middlewares.media_group.RedisMediaGroupAggregator
:members:
:special-members: __init__