Telethon пересылка нескольких медиа
У меня есть код, который пересылает сообщения из одного телеграм канала, в другой канал и мне нужно сохранить альбом фотографий/видео чтобы отправить их все вместе, прямо как и в первом канале из которого идет пересылка(id у каждой фотографии в канале разные) и для этого нужно сохранить все полученные фотографии и после отправить их альбомом Проблема в том, что функция ассинхронная и загрузка следующего файла идет не дожидаясь окончания загрузки первого
@client.on(events.NewMessage(chats=CHAT_ID))
async def log_new_message(event):
# если сообщение из чата то игнор
if event.message.sender_id != CHANNEL_ID:
return
# если кружочек/голосовое то отправляется и сразу удаление файла
# ТУТ У МЕНЯ ВСЕ В ПОРЯДКЕ ТАК КАК ТАКИЕ ФАЙЛЫ ОТПРАВЛЯЮТСЯ ПО ОДНОМУ
if (event.message.video and "round_message=True" in str(event.message.media.document)) or (event.message.voice):
try:
file_path = await event.message.download_media()
await client.send_file(PUBLIC_CHANNEL, file=file_path, video_note=True)
print(f'new round/voice {datetime.datetime.now().time()}')
finally:
if file_path and os.path.exists(file_path):
os.remove(file_path)
# Для понимания, вот код который должен сохранять медиа(он может быть где то недоделанным, не обращайте внимания
# сейв файла в список если фотка/видео/документ/аудиофайл
elif (event.message.photo) or (event.message.video and "round_message=True" not in str(event.message.media.document)) or (event.message.document) or (event.message.audio):
try:
cursor.execute("""SELECT id from posts""")
lastid = cursor.fetchall()[-1][0]
print(lastid)
caption = ''
if event.message.document:
documentbool = True
else:
documentbool = False
if event.message.message:
caption = event.message.message
file_path = await event.message.download_media()
post_tuple = (lastid+1, file_path, caption, documentbool)
if file_path and os.path.exists(file_path):
cursor.execute(SQLITE_INSERT, post_tuple)
print(f'file saved {datetime.datetime.now().time()}')
connection.commit()
finally:
...
Я хотел бы узнать, есть ли вариант сделать так, чтобы медиа загружалось по порядку и его можно было бы например сохранить в базу данных или список (как я уже пробовал в коде выше) и после отправить все сохраненные файлы одним альбомом
У меня также есть код, который сохраняет каждый медиафайл и отправляет по одному
@client.on(events.NewMessage(chats=CHAT_ID))
async def log_new_message(event):
if event.message.sender_id != CHANNEL_ID:
return
if event.message.poll:
print("new poll message")
poll = event.message.poll.poll
question = TextWithEntities(text=poll.question.text, entities=poll.question.entities)
answers = [PollAnswer(text=TextWithEntities(text=answer.text.text, entities=answer.text.entities), option=answer.option) for answer in poll.answers]
await client.send_message(PUBLIC_CHANNEL, file=InputMediaPoll(
poll=Poll(
id=poll.id,
question=question,
answers=answers,
closed=poll.closed,
public_voters=poll.public_voters,
multiple_choice=poll.multiple_choice,
quiz=poll.quiz,
close_period=poll.close_period,
close_date=poll.close_date
)
))
if event.message.media:
file_path = await event.message.download_media()
try:
caption = event.message.message
if event.message.photo:
await client.send_file(PUBLIC_CHANNEL, file=file_path, caption=caption)
elif event.message.video:
if "round_message=False" in str(event.message.media.document): rounded_vidos = False
elif "round_message=True" in str(event.message.media.document): rounded_vidos = True
else: rounded_vidos = False
await client.send_file(PUBLIC_CHANNEL, file=file_path, video_note=rounded_vidos,caption=caption)
elif event.message.document:
await client.send_file(PUBLIC_CHANNEL, file=file_path, caption=caption)
elif event.message.voice:
await client.send_file(PUBLIC_CHANNEL, file=file_path, caption=caption)
elif event.message.audio:
await client.send_file(PUBLIC_CHANNEL, file=file_path, caption=caption)
finally:
if file_path and os.path.exists(file_path):
os.remove(file_path)