Use this file to discover all available pages before exploring further.
MadelineProto provides fully parallelized methods to upload and download files of any size, with support for Bot API file IDs, direct uploads by URL, progress tracking, and file streaming.
Files can be specified using multiple input types:
use danog\MadelineProto\LocalFile;use danog\MadelineProto\RemoteUrl;use danog\MadelineProto\BotApiFileId;use Amp\ByteStream\ReadableStream;// Local file path$file = new LocalFile('/path/to/file.pdf');// Remote URL (will be downloaded)$file = new RemoteUrl('https://example.com/image.jpg');// Bot API file ID$file = new BotApiFileId('AgACAgIAAxkBAAI...');// Readable stream$file = $stream; // Any ReadableStream implementation// Message (reuse media from another message)$file = $message; // Message object with media
public function sendVideo(Message $message): void{ $message->replyVideo( file: new LocalFile('video.mp4'), thumb: new LocalFile('thumb.jpg'), caption: "**Video** caption", parseMode: ParseMode::MARKDOWN, duration: 60, // Duration in seconds width: 1920, // Video width height: 1080, // Video height supportsStreaming: true, // Enable streaming spoiler: false, // Not a spoiler roundMessage: false, // Not a round video noSound: false // Has sound );}
public function sendAudio(Message $message): void{ $message->replyAudio( file: new LocalFile('song.mp3'), thumb: new LocalFile('album-art.jpg'), caption: "Great song!", duration: 180, // Duration in seconds title: "Song Title", // Track title performer: "Artist" // Artist name );}
public function sendGif(Message $message): void{ $message->replyGif( file: new LocalFile('animation.gif'), caption: "Funny animation", thumb: new LocalFile('thumb.jpg'), spoiler: false );}
public function sendSticker(Message $message): void{ $message->replySticker( file: new LocalFile('sticker.webp'), mimeType: 'image/webp', emoji: '😀' );}
use danog\MadelineProto\EventHandler\SimpleFilter\HasMedia;#[Handler]public function downloadToDir(Incoming&Message&HasMedia $message): void{ // Download to current directory $path = $message->media->downloadToDir(); $message->reply("Downloaded to: $path"); // Download to specific directory $path = $message->media->downloadToDir('/tmp/downloads'); // With progress callback $path = $message->media->downloadToDir( dir: '/tmp/downloads', cb: function($progress, $speed, $time) { $this->logger("Download: {$progress}% at {$speed}Mbps"); } );}
use danog\MadelineProto\EventHandler\Filter\FilterCommand;#[FilterCommand('dl')]public function getDownloadLink(Message $message): void{ $reply = $message->getReply(Message::class); if (!$reply?->media) { $message->reply("Reply to a media message!"); return; } // Get download link (works up to 4GB) $link = $reply->media->getDownloadLink(); $message->reply("Download link: $link");}
public function reuseMedia(Message $message): void{ // Send a photo $sent = $this->sendPhoto( peer: $message->chatId, file: new LocalFile('photo.jpg'), caption: "Original" ); // Reuse the same photo (no re-upload) $this->sendPhoto( peer: $message->chatId, file: $sent, // Use the sent message caption: "Reused photo" );}
use danog\MadelineProto\RemoteUrl;public function uploadFromUrl(Message $message): void{ // Download and send $message->replyPhoto( file: new RemoteUrl('https://example.com/image.jpg'), caption: "Downloaded from URL" ); // Works with any file type $message->replyDocument( file: new RemoteUrl('https://example.com/document.pdf'), caption: "PDF from URL" );}
use danog\MadelineProto\BotApiFileId;public function useBotApiFileId(Message $message): void{ // Use Bot API file ID $message->replyPhoto( file: new BotApiFileId('AgACAgIAAxkBAAI...'), caption: "Photo from file ID" ); // Get Bot API file ID from media if ($message->media) { $fileId = $message->media->botApiFileId; $uniqueId = $message->media->botApiFileUniqueId; $this->logger("File ID: $fileId"); }}
use danog\MadelineProto\EventHandler\Message\SecretMessage;#[Handler]public function handleSecretFile(Incoming&SecretMessage $message): void{ if ($message->media) { // Download encrypted file $path = $message->media->downloadToDir('/tmp'); $message->reply("Decrypted and saved to: $path"); // Media is automatically decrypted $isEncrypted = $message->media->encrypted; // true }}