fix: telegram bot uses temp dir for -o, always runs nextcloud scan, counts clips from folder

This commit is contained in:
Renato
2026-07-02 18:14:33 +02:00
parent 3e76a1a18e
commit 40e2b27074
+43 -6
View File
@@ -231,15 +231,19 @@ async def process_video(bot, url: str):
log.info(f"[process] Sent initial Telegram message (id={msg.message_id})") log.info(f"[process] Sent initial Telegram message (id={msg.message_id})")
# 3. Set up environment for main.py # 3. Set up environment for main.py
# Use a temp dir for intermediate files — main.py will copy finished clips
# to NEXTCLOUD_TARGET and run docker files:scan automatically.
temp_output = tempfile.mkdtemp(prefix="viral_bot_")
env = os.environ.copy() env = os.environ.copy()
env["NEXTCLOUD_TARGET"] = target env["NEXTCLOUD_TARGET"] = target
env["PYTHONUNBUFFERED"] = "1" env["PYTHONUNBUFFERED"] = "1"
log.info(f"[process] Temp output dir: {temp_output}")
# 4. Build command — main.py MUST run with the viral venv Python # 4. Build command — main.py MUST run with the viral venv Python
cmd = [ cmd = [
VENV_PYTHON, "-u", MAIN_PY, VENV_PYTHON, "-u", MAIN_PY,
"-u", url, "-u", url,
"-o", target, "-o", temp_output,
] ]
log.info(f"[process] Spawning command: {' '.join(cmd)}") log.info(f"[process] Spawning command: {' '.join(cmd)}")
@@ -347,10 +351,37 @@ async def process_video(bot, url: str):
) )
raise raise
# 5. Final completion message # 5. Cleanup temp dir
if rc == 0: try:
shutil.rmtree(temp_output, ignore_errors=True)
log.info(f"[process] Cleaned up temp dir: {temp_output}")
except Exception as e:
log.warning(f"[process] Failed to clean temp dir: {e}")
# 6. Always force a Nextcloud scan so files appear regardless of what main.py did
log.info("[process] Forcing Nextcloud files:scan...")
try:
scan_result = await asyncio.to_thread(
subprocess.run,
["docker", "exec", "-u", "www-data", "nextcloud", "php", "occ", "files:scan", "renato97"],
capture_output=True, text=True, timeout=120,
)
log.info(f"[process] Nextcloud scan done (rc={scan_result.returncode})")
log.debug(f"[process] scan stdout: {scan_result.stdout[-300:]}")
except Exception as e:
log.warning(f"[process] Nextcloud scan failed: {e}")
# 7. Count final clips in target folder
try:
final_clips = [f for f in os.listdir(target) if f.endswith(".mp4") and not f.startswith("temp_")]
total_done = len(final_clips)
log.info(f"[process] Final clip count in Nextcloud folder: {total_done}")
except Exception:
total_done = len(completed_clips) total_done = len(completed_clips)
log.info(f"[process] SUCCESS — {total_done} clips uploaded to Nextcloud")
# 8. Final completion message
if rc == 0 and total_done > 0:
log.info(f"[process] SUCCESS — {total_done} clips in Nextcloud")
try: try:
await msg.delete() await msg.delete()
except Exception: except Exception:
@@ -358,18 +389,24 @@ async def process_video(bot, url: str):
await bot.send_message( await bot.send_message(
CHAT_ID, CHAT_ID,
f"✅ *¡Listo!* `{title[:60] or url[:60]}`\n\n" f"✅ *¡Listo!* `{title[:60] or url[:60]}`\n\n"
f"📱 *{total_done} clip{'s' if total_done != 1 else ''}* subidos a Nextcloud:\n" f"📱 *{total_done} clip{'s' if total_done != 1 else ''}* en Nextcloud:\n"
f"`{folder}/`\n\n" f"`{folder}/`\n\n"
f"Abrilos en tu Nextcloud 🎉", f"Abrilos en tu Nextcloud 🎉",
parse_mode="Markdown", parse_mode="Markdown",
) )
else: elif rc != 0:
log.error(f"[process] FAILED — main.py returned code {rc}") log.error(f"[process] FAILED — main.py returned code {rc}")
await edit_msg( await edit_msg(
f"❌ *Falló el procesamiento* (código {rc})\n" f"❌ *Falló el procesamiento* (código {rc})\n"
f"`{url[:80]}`\n\n" f"`{url[:80]}`\n\n"
f"Revisá los logs: `sudo journalctl -u viral-telegram.service -n 100`" f"Revisá los logs: `sudo journalctl -u viral-telegram.service -n 100`"
) )
else:
log.warning("[process] rc=0 but no final clips found in Nextcloud folder")
await edit_msg(
f"⚠️ *Pipeline completado pero no se encontraron clips*\n"
f"Revisá la carpeta `{folder}/` en Nextcloud manualmente."
)
# ─── App lifecycle ───────────────────────────────────────────────────────────── # ─── App lifecycle ─────────────────────────────────────────────────────────────