Run Xtream imports in background to avoid long-held HTTP connections dropping silently
This commit is contained in:
@@ -6,6 +6,7 @@
|
||||
from pymongo import MongoClient
|
||||
from aiohttp import web
|
||||
import socketio
|
||||
import asyncio
|
||||
import os, glob
|
||||
import time
|
||||
import json
|
||||
@@ -714,6 +715,19 @@ async def import_xtream_codes(request):
|
||||
)
|
||||
save_playlist_document(playlist_doc)
|
||||
|
||||
asyncio.create_task(run_xtream_import(
|
||||
id_playlist, import_key, collection_channels,
|
||||
xtream_server, xtream_username, xtream_password, sidClient
|
||||
))
|
||||
|
||||
return web.json_response({'status': 'started', 'id_playlist': id_playlist})
|
||||
|
||||
|
||||
async def run_xtream_import(id_playlist, import_key, collection_channels,
|
||||
xtream_server, xtream_username, xtream_password, sidClient):
|
||||
# Runs in the background: the HTTP request already returned, so imports that take
|
||||
# minutes no longer hold a live connection open (which browsers/networks can silently drop).
|
||||
# Completion is reported to the client over the existing progress_analysis socketio channel.
|
||||
try:
|
||||
await emit_analysis_progress({'percentage': 0.02}, sidClient)
|
||||
|
||||
@@ -781,15 +795,29 @@ async def import_xtream_codes(request):
|
||||
bulk_insert_channels(collection_channels, pending_channels, inserted_channels)
|
||||
number_channels = collection_channels.count_documents({"id_playlist": id_playlist})
|
||||
playlists.update_many({'id_playlist': id_playlist}, {"$set": {"num_channels": number_channels}})
|
||||
await emit_analysis_progress({'percentage': 1}, sidClient)
|
||||
return web.json_response({'num_channel': number_channels, 'id_playlist': id_playlist})
|
||||
await emit_analysis_progress({
|
||||
'percentage': 1,
|
||||
'completed': True,
|
||||
'num_channel': number_channels,
|
||||
'id_playlist': id_playlist,
|
||||
}, sidClient)
|
||||
|
||||
except requests.RequestException as exc:
|
||||
logger.exception("Xtream import failed")
|
||||
return web.json_response({'error': f'Xtream request failed: {exc}'}, status=502)
|
||||
await emit_analysis_progress({
|
||||
'percentage': 1,
|
||||
'completed': True,
|
||||
'error': f'Xtream request failed: {exc}',
|
||||
'id_playlist': id_playlist,
|
||||
}, sidClient)
|
||||
except Exception as exc:
|
||||
logger.exception("Xtream import failed")
|
||||
return web.json_response({'error': f'Xtream import failed: {exc}'}, status=500)
|
||||
await emit_analysis_progress({
|
||||
'percentage': 1,
|
||||
'completed': True,
|
||||
'error': f'Xtream import failed: {exc}',
|
||||
'id_playlist': id_playlist,
|
||||
}, sidClient)
|
||||
finally:
|
||||
active_xtream_imports.pop(import_key, None)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user