Skip to content

Commit 70ad1a6

Browse files
committed
Fix: moved PDF operations to async mode
1 parent deff907 commit 70ad1a6

2 files changed

Lines changed: 25 additions & 7 deletions

File tree

youtubevideotranscriptbot/telegram_bot.py

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
from summarize import handle_summarization_request
1313
from duration import format_duration
1414
from analytics import track_event
15-
from utils import sanitize_filename, get_original_language, normalize_language_code, create_emoji_friendly_pdf_with_weasyprint
15+
from utils import sanitize_filename, get_original_language, normalize_language_code, create_emoji_friendly_pdf_with_weasyprint, create_emoji_friendly_pdf_with_weasyprint_async
1616
from languages import languages
1717
import openai
1818
import aiofiles
@@ -403,11 +403,24 @@ async def handle_youtube_link(update: Update, context: CallbackContext):
403403
filename = f"{base_filename}_{transcript.get('normalized_language_code')}.txt"
404404

405405
logger.info(f"Sending transcript for language: {language_code}")
406-
# Use BytesIO for binary mode (recommended for Telegram)
407-
file_obj = io.BytesIO(formatted_transcript.encode('utf-8'))
408-
file_obj.name = filename # Telegram uses this as the filename
409-
logger.info(f"Sending transcript file: {filename} to user {user_id}.")
410-
msg = await update.message.reply_document(document=InputFile(file_obj), caption=f"{filename}")
406+
407+
try:
408+
pdf_file = await create_emoji_friendly_pdf_with_weasyprint_async(f"{video_info}\n\n{formatted_transcript}")
409+
pdf_filename = filename[:-3] + "pdf" # Set the filename for the PDF
410+
logger.info(f"Sending PDF transcript file: {pdf_filename} to user {user_id}.")
411+
412+
msg = await context.bot.send_document(
413+
chat_id=update.message.chat_id,
414+
document=InputFile(pdf_file, filename=pdf_filename),
415+
caption=f"{pdf_filename}"
416+
)
417+
except Exception as e:
418+
# Use BytesIO for binary mode (recommended for Telegram)
419+
file_obj = io.BytesIO(formatted_transcript.encode('utf-8'))
420+
file_obj.name = filename # Telegram uses this as the filename
421+
logger.error(f"Failed to send PDF transcript file {pdf_filename}: {e}")
422+
logger.info(f"Sending TXT transcript file: {filename} to user {user_id}.")
423+
msg = await update.message.reply_document(document=InputFile(file_obj), caption=f"{filename}")
411424

412425
track_event(
413426
user_id=user.id,
@@ -1009,7 +1022,7 @@ async def handle_show_full_video_description_button(update: Update, context: Cal
10091022
video_info_short = video_info_full_description.split("<b>📝 Description</b>:")[0]
10101023

10111024
try:
1012-
pdf_file = create_emoji_friendly_pdf_with_weasyprint(video_info_full_description)
1025+
pdf_file = await create_emoji_friendly_pdf_with_weasyprint_async(video_info_full_description)
10131026
# pdf_file = convert_to_pdf_xhtml2pdf("Example text for testing")
10141027
if video_details:
10151028
logger.info(f"Video details for video {video_id} and PDF file name: {str(video_details)[:300]}.")

youtubevideotranscriptbot/utils.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,3 +162,8 @@ def create_emoji_friendly_pdf_with_weasyprint(html_content, output_filename=None
162162
f.write(pdf_bytes)
163163

164164
return pdf_bytes
165+
166+
167+
async def create_emoji_friendly_pdf_with_weasyprint_async(html_content, output_filename=None):
168+
loop = asyncio.get_event_loop()
169+
return await loop.run_in_executor(None, create_emoji_friendly_pdf_with_weasyprint, html_content, output_filename)

0 commit comments

Comments
 (0)