aiogram/docs/utils/media_group.rst

104 lines
3.6 KiB
ReStructuredText
Raw Normal View History

===================
2026-02-28 17:58:59 +03:00
Media group
===================
2026-02-28 17:58:59 +03:00
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())
2026-02-28 17:58:59 +03:00
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
2026-03-01 11:21:44 +03:00
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
2026-02-28 17:58:59 +03:00
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.media_group import MediaGroupFilter
router.message.outer_middleware(MediaGroupAggregatorMiddleware())
# use middleware
@router.message(
2026-03-01 11:21:44 +03:00
MediaGroupFilter(max_media_count=5),
2026-02-28 17:58:59 +03:00
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:
2026-02-28 17:58:59 +03:00
.. autoclass:: aiogram.dispatcher.middlewares.media_group.MediaGroupAggregatorMiddleware
:members:
.. autoclass:: aiogram.filters.media_group.MediaGroupFilter
:members:
2026-03-01 11:21:44 +03:00
.. autoclass:: aiogram.dispatcher.middlewares.media_group.MemoryMediaGroupAggregator
:members:
.. autoclass:: aiogram.dispatcher.middlewares.media_group.RedisMediaGroupAggregator
:members:
:special-members: __init__